NbtContents.java

net.minecraft.network.chat.contents.NbtContents

信息

  • 全限定名:net.minecraft.network.chat.contents.NbtContents
  • 类型:public record
  • 包:net.minecraft.network.chat.contents
  • 源码路径:src/main/java/net/minecraft/network/chat/contents/NbtContents.java
  • 起始行号:L30
  • 实现:ComponentContents
  • 职责:

    TODO

字段/常量

  • LOGGER

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

      TODO

  • NBT_PATH_CODEC

    • 类型: Codec<CompilableString<NbtPathArgument.NbtPath>>
    • 修饰符: public static final protected protected
    • 源码定位: L34
    • 说明:

      TODO

  • MAP_CODEC

    • 类型: MapCodec<NbtContents>
    • 修饰符: public static final
    • 源码定位: L46
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

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

public MutableComponent resolve(ResolutionContext context, int recursionDepth) @ L58

  • 方法名:resolve
  • 源码定位:L58
  • 返回类型:MutableComponent
  • 修饰符:public

参数:

  • context: ResolutionContext
  • recursionDepth: int

说明:

TODO

public MapCodec<NbtContents> codec() @ L100

  • 方法名:codec
  • 源码定位:L100
  • 返回类型:MapCodec
  • 修饰符:public

参数:

说明:

TODO

代码

public record NbtContents(
    CompilableString<NbtPathArgument.NbtPath> nbtPath, boolean interpreting, boolean plain, Optional<Component> separator, DataSource dataSource
) implements ComponentContents {
    private static final Logger LOGGER = LogUtils.getLogger();
    public static final Codec<CompilableString<NbtPathArgument.NbtPath>> NBT_PATH_CODEC = CompilableString.codec(
        new CompilableString.CommandParserHelper<NbtPathArgument.NbtPath>() {
            protected NbtPathArgument.NbtPath parse(StringReader reader) throws CommandSyntaxException {
                return new NbtPathArgument().parse(reader);
            }
 
            @Override
            protected String errorMessage(String original, CommandSyntaxException exception) {
                return "Invalid NBT path: " + original + ": " + exception.getMessage();
            }
        }
    );
    public static final MapCodec<NbtContents> MAP_CODEC = RecordCodecBuilder.<NbtContents>mapCodec(
            i -> i.group(
                    NBT_PATH_CODEC.fieldOf("nbt").forGetter(NbtContents::nbtPath),
                    Codec.BOOL.lenientOptionalFieldOf("interpret", false).forGetter(NbtContents::interpreting),
                    Codec.BOOL.lenientOptionalFieldOf("plain", false).forGetter(NbtContents::plain),
                    ComponentSerialization.CODEC.lenientOptionalFieldOf("separator").forGetter(NbtContents::separator),
                    DataSources.CODEC.forGetter(NbtContents::dataSource)
                )
                .apply(i, NbtContents::new)
        )
        .validate(v -> v.interpreting && v.plain ? DataResult.error(() -> "'interpret' and 'plain' flags can't be both on") : DataResult.success(v));
 
    @Override
    public MutableComponent resolve(ResolutionContext context, int recursionDepth) throws CommandSyntaxException {
        CommandSourceStack source = context.source();
        if (source == null) {
            return Component.empty();
        } else {
            Stream<Tag> elements = this.dataSource.getData(source).flatMap(t -> {
                try {
                    return this.nbtPath.compiled().get(t).stream();
                } catch (CommandSyntaxException var3x) {
                    return Stream.empty();
                }
            });
            Component resolvedSeparator = DataFixUtils.orElse(
                ComponentUtils.resolve(context, this.separator, recursionDepth), ComponentUtils.DEFAULT_NO_STYLE_SEPARATOR
            );
            if (this.interpreting) {
                RegistryOps<Tag> registryOps = source.registryAccess().createSerializationContext(NbtOps.INSTANCE);
                return elements.flatMap(tag -> {
                    try {
                        Component component = ComponentSerialization.CODEC.parse(registryOps, tag).getOrThrow();
                        return Stream.of(ComponentUtils.resolve(context, component, recursionDepth));
                    } catch (Exception var5x) {
                        LOGGER.warn("Failed to parse component: {}", tag, var5x);
                        return Stream.of();
                    }
                }).reduce((left, right) -> left.append(resolvedSeparator).append(right)).orElseGet(Component::empty);
            } else {
                return elements.map(
                        tag -> {
                            TextComponentTagVisitor visitor = new TextComponentTagVisitor(
                                "", this.plain ? TextComponentTagVisitor.PlainStyling.INSTANCE : TextComponentTagVisitor.RichStyling.INSTANCE
                            );
                            return (MutableComponent)visitor.visit(tag);
                        }
                    )
                    .reduce((left, right) -> left.append(resolvedSeparator).append(right))
                    .orElseGet(Component::empty);
            }
        }
    }
 
    @Override
    public MapCodec<NbtContents> codec() {
        return MAP_CODEC;
    }
}

引用的其他类