ArgumentUtils.java

net.minecraft.commands.synchronization.ArgumentUtils

信息

  • 全限定名:net.minecraft.commands.synchronization.ArgumentUtils
  • 类型:public class
  • 包:net.minecraft.commands.synchronization
  • 源码路径:src/main/java/net/minecraft/commands/synchronization/ArgumentUtils.java
  • 起始行号:L23
  • 职责:

    TODO

字段/常量

  • LOGGER

    • 类型: Logger
    • 修饰符: private static final
    • 源码定位: L24
    • 说明:

      TODO

  • NUMBER_FLAG_MIN

    • 类型: byte
    • 修饰符: private static final
    • 源码定位: L25
    • 说明:

      TODO

  • NUMBER_FLAG_MAX

    • 类型: byte
    • 修饰符: private static final
    • 源码定位: L26
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public static int createNumberFlags(boolean hasMin, boolean hasMax) @ L28

  • 方法名:createNumberFlags
  • 源码定位:L28
  • 返回类型:int
  • 修饰符:public static

参数:

  • hasMin: boolean
  • hasMax: boolean

说明:

TODO

public static boolean numberHasMin(byte flags) @ L41

  • 方法名:numberHasMin
  • 源码定位:L41
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • flags: byte

说明:

TODO

public static boolean numberHasMax(byte flags) @ L45

  • 方法名:numberHasMax
  • 源码定位:L45
  • 返回类型:boolean
  • 修饰符:public static

参数:

  • flags: byte

说明:

TODO

private static <A extends ArgumentType<?>,T extends ArgumentTypeInfo.Template<A>> void serializeArgumentCap(JsonObject result, ArgumentTypeInfo<A,T> info, ArgumentTypeInfo.Template<A> argumentType) @ L49

参数:

说明:

TODO

private static <T extends ArgumentType<?>> void serializeArgumentToJson(JsonObject result, T argument) @ L55

  • 方法名:serializeArgumentToJson
  • 源码定位:L55
  • 返回类型:<T extends ArgumentType<?>> void
  • 修饰符:private static

参数:

  • result: JsonObject
  • argument: T

说明:

TODO

public static <S> JsonObject serializeNodeToJson(CommandDispatcher<S> dispatcher, CommandNode<S> node) @ L66

  • 方法名:serializeNodeToJson
  • 源码定位:L66
  • 返回类型: JsonObject
  • 修饰符:public static

参数:

  • dispatcher: CommandDispatcher
  • node: CommandNode

说明:

TODO

public static <T> Set<ArgumentType<?>> findUsedArgumentTypes(CommandNode<T> node) @ L121

  • 方法名:findUsedArgumentTypes
  • 源码定位:L121
  • 返回类型: Set<ArgumentType<?>>
  • 修饰符:public static

参数:

  • node: CommandNode

说明:

TODO

private static <T> void findUsedArgumentTypes(CommandNode<T> node, Set<ArgumentType<?>> output, Set<CommandNode<T>> visitedNodes) @ L128

  • 方法名:findUsedArgumentTypes
  • 源码定位:L128
  • 返回类型: void
  • 修饰符:private static

参数:

  • node: CommandNode
  • output: Set<ArgumentType<?>>
  • visitedNodes: Set<CommandNode>

说明:

TODO

代码

public class ArgumentUtils {
    private static final Logger LOGGER = LogUtils.getLogger();
    private static final byte NUMBER_FLAG_MIN = 1;
    private static final byte NUMBER_FLAG_MAX = 2;
 
    public static int createNumberFlags(boolean hasMin, boolean hasMax) {
        int result = 0;
        if (hasMin) {
            result |= 1;
        }
 
        if (hasMax) {
            result |= 2;
        }
 
        return result;
    }
 
    public static boolean numberHasMin(byte flags) {
        return (flags & 1) != 0;
    }
 
    public static boolean numberHasMax(byte flags) {
        return (flags & 2) != 0;
    }
 
    private static <A extends ArgumentType<?>, T extends ArgumentTypeInfo.Template<A>> void serializeArgumentCap(
        JsonObject result, ArgumentTypeInfo<A, T> info, ArgumentTypeInfo.Template<A> argumentType
    ) {
        info.serializeToJson((T)argumentType, result);
    }
 
    private static <T extends ArgumentType<?>> void serializeArgumentToJson(JsonObject result, T argument) {
        ArgumentTypeInfo.Template<T> template = ArgumentTypeInfos.unpack(argument);
        result.addProperty("type", "argument");
        result.addProperty("parser", String.valueOf(BuiltInRegistries.COMMAND_ARGUMENT_TYPE.getKey(template.type())));
        JsonObject type = new JsonObject();
        serializeArgumentCap(type, template.type(), template);
        if (!type.isEmpty()) {
            result.add("properties", type);
        }
    }
 
    public static <S> JsonObject serializeNodeToJson(CommandDispatcher<S> dispatcher, CommandNode<S> node) {
        JsonObject result = new JsonObject();
        switch (node) {
            case RootCommandNode<S> rootNode:
                result.addProperty("type", "root");
                break;
            case LiteralCommandNode<S> literalNode:
                result.addProperty("type", "literal");
                break;
            case ArgumentCommandNode<S, ?> argumentNode:
                serializeArgumentToJson(result, argumentNode.getType());
                break;
            default:
                LOGGER.error("Could not serialize node {} ({})!", node, node.getClass());
                result.addProperty("type", "unknown");
        }
 
        Collection<CommandNode<S>> children = node.getChildren();
        if (!children.isEmpty()) {
            JsonObject childrenObject = new JsonObject();
 
            for (CommandNode<S> child : children) {
                childrenObject.add(child.getName(), serializeNodeToJson(dispatcher, child));
            }
 
            result.add("children", childrenObject);
        }
 
        if (node.getCommand() != null) {
            result.addProperty("executable", true);
        }
 
        if (node.getRequirement() instanceof PermissionProviderCheck<?> permissionCheck) {
            JsonElement permissions = PermissionCheck.CODEC
                .encodeStart(JsonOps.INSTANCE, permissionCheck.test())
                .getOrThrow(error -> new IllegalStateException("Failed to serialize requirement: " + error));
            result.add("permissions", permissions);
        }
 
        if (node.getRedirect() != null) {
            Collection<String> path = dispatcher.getPath(node.getRedirect());
            if (!path.isEmpty()) {
                JsonArray target = new JsonArray();
 
                for (String piece : path) {
                    target.add(piece);
                }
 
                result.add("redirect", target);
            }
        }
 
        return result;
    }
 
    public static <T> Set<ArgumentType<?>> findUsedArgumentTypes(CommandNode<T> node) {
        Set<CommandNode<T>> visitedNodes = new ReferenceOpenHashSet<>();
        Set<ArgumentType<?>> result = new HashSet<>();
        findUsedArgumentTypes(node, result, visitedNodes);
        return result;
    }
 
    private static <T> void findUsedArgumentTypes(CommandNode<T> node, Set<ArgumentType<?>> output, Set<CommandNode<T>> visitedNodes) {
        if (visitedNodes.add(node)) {
            if (node instanceof ArgumentCommandNode<T, ?> arg) {
                output.add(arg.getType());
            }
 
            node.getChildren().forEach(child -> findUsedArgumentTypes((CommandNode<T>)child, output, visitedNodes));
            CommandNode<T> redirect = node.getRedirect();
            if (redirect != null) {
                findUsedArgumentTypes(redirect, output, visitedNodes);
            }
        }
    }
}

引用的其他类