Advancement.java

net.minecraft.advancements.Advancement

信息

  • 全限定名:net.minecraft.advancements.Advancement
  • 类型:public record
  • 包:net.minecraft.advancements
  • 源码路径:src/main/java/net/minecraft/advancements/Advancement.java
  • 起始行号:L28
  • 职责:

    TODO

字段/常量

  • CRITERIA_CODEC

    • 类型: Codec<Map<String,Criterion<?>>>
    • 修饰符: private static final
    • 源码定位: L37
    • 说明:

      TODO

  • CODEC

    • 类型: Codec<Advancement>
    • 修饰符: public static final
    • 源码定位: L39
    • 说明:

      TODO

  • STREAM_CODEC

    • 类型: StreamCodec<RegistryFriendlyByteBuf,Advancement>
    • 修饰符: public static final
    • 源码定位: L54
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.advancements.Advancement.Builder
    • 类型: class
    • 修饰符: public static
    • 源码定位: L112
    • 说明:

      TODO

构造器

public Advancement(Optional<Identifier> parent, Optional<DisplayInfo> display, AdvancementRewards rewards, Map<String,Criterion<?>> criteria, AdvancementRequirements requirements, boolean sendsTelemetryEvent) @ L56

  • 构造器名:Advancement
  • 源码定位:L56
  • 修饰符:public

参数:

  • parent: Optional
  • display: Optional
  • rewards: AdvancementRewards
  • criteria: Map<String,Criterion<?>>
  • requirements: AdvancementRequirements
  • sendsTelemetryEvent: boolean

说明:

TODO

方法

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

private static DataResult<Advancement> validate(Advancement advancement) @ L67

  • 方法名:validate
  • 源码定位:L67
  • 返回类型:DataResult
  • 修饰符:private static

参数:

  • advancement: Advancement

说明:

TODO

private static Component decorateName(DisplayInfo display) @ L71

  • 方法名:decorateName
  • 源码定位:L71
  • 返回类型:Component
  • 修饰符:private static

参数:

  • display: DisplayInfo

说明:

TODO

public static Component name(AdvancementHolder holder) @ L79

  • 方法名:name
  • 源码定位:L79
  • 返回类型:Component
  • 修饰符:public static

参数:

  • holder: AdvancementHolder

说明:

TODO

private void write(RegistryFriendlyByteBuf output) @ L83

  • 方法名:write
  • 源码定位:L83
  • 返回类型:void
  • 修饰符:private

参数:

  • output: RegistryFriendlyByteBuf

说明:

TODO

private static Advancement read(RegistryFriendlyByteBuf input) @ L90

  • 方法名:read
  • 源码定位:L90
  • 返回类型:Advancement
  • 修饰符:private static

参数:

  • input: RegistryFriendlyByteBuf

说明:

TODO

public boolean isRoot() @ L101

  • 方法名:isRoot
  • 源码定位:L101
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public void validate(ProblemReporter reporter, HolderGetter.Provider lootData) @ L105

  • 方法名:validate
  • 源码定位:L105
  • 返回类型:void
  • 修饰符:public

参数:

  • reporter: ProblemReporter
  • lootData: HolderGetter.Provider

说明:

TODO

代码

public record Advancement(
    Optional<Identifier> parent,
    Optional<DisplayInfo> display,
    AdvancementRewards rewards,
    Map<String, Criterion<?>> criteria,
    AdvancementRequirements requirements,
    boolean sendsTelemetryEvent,
    Optional<Component> name
) {
    private static final Codec<Map<String, Criterion<?>>> CRITERIA_CODEC = Codec.unboundedMap(Codec.STRING, Criterion.CODEC)
        .validate(criteria -> criteria.isEmpty() ? DataResult.error(() -> "Advancement criteria cannot be empty") : DataResult.success(criteria));
    public static final Codec<Advancement> CODEC = RecordCodecBuilder.<Advancement>create(
            i -> i.group(
                    Identifier.CODEC.optionalFieldOf("parent").forGetter(Advancement::parent),
                    DisplayInfo.CODEC.optionalFieldOf("display").forGetter(Advancement::display),
                    AdvancementRewards.CODEC.optionalFieldOf("rewards", AdvancementRewards.EMPTY).forGetter(Advancement::rewards),
                    CRITERIA_CODEC.fieldOf("criteria").forGetter(Advancement::criteria),
                    AdvancementRequirements.CODEC.optionalFieldOf("requirements").forGetter(a -> Optional.of(a.requirements())),
                    Codec.BOOL.optionalFieldOf("sends_telemetry_event", false).forGetter(Advancement::sendsTelemetryEvent)
                )
                .apply(i, (parent, display, rewards, criteria, requirementsOpt, sendsTelemetryEvent) -> {
                    AdvancementRequirements requirements = requirementsOpt.orElseGet(() -> AdvancementRequirements.allOf(criteria.keySet()));
                    return new Advancement(parent, display, rewards, criteria, requirements, sendsTelemetryEvent);
                })
        )
        .validate(Advancement::validate);
    public static final StreamCodec<RegistryFriendlyByteBuf, Advancement> STREAM_CODEC = StreamCodec.ofMember(Advancement::write, Advancement::read);
 
    public Advancement(
        Optional<Identifier> parent,
        Optional<DisplayInfo> display,
        AdvancementRewards rewards,
        Map<String, Criterion<?>> criteria,
        AdvancementRequirements requirements,
        boolean sendsTelemetryEvent
    ) {
        this(parent, display, rewards, Map.copyOf(criteria), requirements, sendsTelemetryEvent, display.map(Advancement::decorateName));
    }
 
    private static DataResult<Advancement> validate(Advancement advancement) {
        return advancement.requirements().validate(advancement.criteria().keySet()).map(r -> advancement);
    }
 
    private static Component decorateName(DisplayInfo display) {
        Component displayTitle = display.getTitle();
        ChatFormatting color = display.getType().getChatColor();
        Component tooltip = ComponentUtils.mergeStyles(displayTitle.copy(), Style.EMPTY.withColor(color)).append("\n").append(display.getDescription());
        Component title = displayTitle.copy().withStyle(s -> s.withHoverEvent(new HoverEvent.ShowText(tooltip)));
        return ComponentUtils.wrapInSquareBrackets(title).withStyle(color);
    }
 
    public static Component name(AdvancementHolder holder) {
        return holder.value().name().orElseGet(() -> Component.literal(holder.id().toString()));
    }
 
    private void write(RegistryFriendlyByteBuf output) {
        output.writeOptional(this.parent, FriendlyByteBuf::writeIdentifier);
        DisplayInfo.STREAM_CODEC.apply(ByteBufCodecs::optional).encode(output, this.display);
        this.requirements.write(output);
        output.writeBoolean(this.sendsTelemetryEvent);
    }
 
    private static Advancement read(RegistryFriendlyByteBuf input) {
        return new Advancement(
            input.readOptional(FriendlyByteBuf::readIdentifier),
            (Optional<DisplayInfo>)DisplayInfo.STREAM_CODEC.apply(ByteBufCodecs::optional).decode(input),
            AdvancementRewards.EMPTY,
            Map.of(),
            new AdvancementRequirements(input),
            input.readBoolean()
        );
    }
 
    public boolean isRoot() {
        return this.parent.isEmpty();
    }
 
    public void validate(ProblemReporter reporter, HolderGetter.Provider lootData) {
        this.criteria.forEach((name, criterion) -> {
            ValidationContextSource validator = new ValidationContextSource(reporter.forChild(new ProblemReporter.RootFieldPathElement(name)), lootData);
            criterion.triggerInstance().validate(validator);
        });
    }
 
    public static class Builder {
        private Optional<Identifier> parent = Optional.empty();
        private Optional<DisplayInfo> display = Optional.empty();
        private AdvancementRewards rewards = AdvancementRewards.EMPTY;
        private final ImmutableMap.Builder<String, Criterion<?>> criteria = ImmutableMap.builder();
        private Optional<AdvancementRequirements> requirements = Optional.empty();
        private AdvancementRequirements.Strategy requirementsStrategy = AdvancementRequirements.Strategy.AND;
        private boolean sendsTelemetryEvent;
 
        public static Advancement.Builder advancement() {
            return new Advancement.Builder().sendsTelemetryEvent();
        }
 
        public static Advancement.Builder recipeAdvancement() {
            return new Advancement.Builder();
        }
 
        public Advancement.Builder parent(AdvancementHolder parent) {
            this.parent = Optional.of(parent.id());
            return this;
        }
 
        @Deprecated(forRemoval = true)
        public Advancement.Builder parent(Identifier parent) {
            this.parent = Optional.of(parent);
            return this;
        }
 
        public Advancement.Builder display(
            ItemStackTemplate icon,
            Component title,
            Component description,
            @Nullable Identifier background,
            AdvancementType frame,
            boolean showToast,
            boolean announceChat,
            boolean hidden
        ) {
            return this.display(
                new DisplayInfo(
                    icon, title, description, Optional.ofNullable(background).map(ClientAsset.ResourceTexture::new), frame, showToast, announceChat, hidden
                )
            );
        }
 
        public Advancement.Builder display(
            ItemLike icon,
            Component title,
            Component description,
            @Nullable Identifier background,
            AdvancementType frame,
            boolean showToast,
            boolean announceChat,
            boolean hidden
        ) {
            return this.display(
                new DisplayInfo(
                    new ItemStackTemplate(icon.asItem()),
                    title,
                    description,
                    Optional.ofNullable(background).map(ClientAsset.ResourceTexture::new),
                    frame,
                    showToast,
                    announceChat,
                    hidden
                )
            );
        }
 
        public Advancement.Builder display(DisplayInfo display) {
            this.display = Optional.of(display);
            return this;
        }
 
        public Advancement.Builder rewards(AdvancementRewards.Builder rewards) {
            return this.rewards(rewards.build());
        }
 
        public Advancement.Builder rewards(AdvancementRewards rewards) {
            this.rewards = rewards;
            return this;
        }
 
        public Advancement.Builder addCriterion(String name, Criterion<?> criterion) {
            this.criteria.put(name, criterion);
            return this;
        }
 
        public Advancement.Builder requirements(AdvancementRequirements.Strategy strategy) {
            this.requirementsStrategy = strategy;
            return this;
        }
 
        public Advancement.Builder requirements(AdvancementRequirements requirements) {
            this.requirements = Optional.of(requirements);
            return this;
        }
 
        public Advancement.Builder sendsTelemetryEvent() {
            this.sendsTelemetryEvent = true;
            return this;
        }
 
        public AdvancementHolder build(Identifier id) {
            Map<String, Criterion<?>> criteria = this.criteria.buildOrThrow();
            AdvancementRequirements requirements = this.requirements.orElseGet(() -> this.requirementsStrategy.create(criteria.keySet()));
            return new AdvancementHolder(id, new Advancement(this.parent, this.display, this.rewards, criteria, requirements, this.sendsTelemetryEvent));
        }
 
        public AdvancementHolder save(Consumer<AdvancementHolder> output, String name) {
            AdvancementHolder advancement = this.build(Identifier.parse(name));
            output.accept(advancement);
            return advancement;
        }
    }
}

引用的其他类

  • AdvancementHolder

    • 引用位置: 参数/构造调用
    • 关联成员: AdvancementHolder()
  • AdvancementRequirements

    • 引用位置: 参数/方法调用/构造调用
    • 关联成员: AdvancementRequirements(), AdvancementRequirements.allOf()
  • AdvancementRewards

    • 引用位置: 参数
  • Criterion

    • 引用位置: 参数/字段
  • DisplayInfo

    • 引用位置: 参数/构造调用
    • 关联成员: DisplayInfo()
  • HolderGetter

    • 引用位置: 参数
  • RegistryFriendlyByteBuf

    • 引用位置: 参数/字段
  • Component

    • 引用位置: 方法调用/返回值
    • 关联成员: Component.literal()
  • ComponentUtils

    • 引用位置: 方法调用
    • 关联成员: ComponentUtils.mergeStyles(), ComponentUtils.wrapInSquareBrackets()
  • HoverEvent

    • 引用位置: 方法调用/构造调用
    • 关联成员: HoverEvent.ShowText(), ShowText()
  • StreamCodec

    • 引用位置: 字段/方法调用
    • 关联成员: StreamCodec.ofMember()
  • Identifier

    • 引用位置: 参数/方法调用
    • 关联成员: Identifier.parse()
  • ProblemReporter

    • 引用位置: 参数/方法调用/构造调用
    • 关联成员: ProblemReporter.RootFieldPathElement(), RootFieldPathElement()
  • ItemStackTemplate

    • 引用位置: 构造调用
    • 关联成员: ItemStackTemplate()
  • ValidationContextSource

    • 引用位置: 构造调用
    • 关联成员: ValidationContextSource()