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()
- 引用位置:
-
- 引用位置:
参数/方法调用/构造调用 - 关联成员:
AdvancementRequirements(), AdvancementRequirements.allOf()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
参数/构造调用 - 关联成员:
DisplayInfo()
- 引用位置:
-
- 引用位置:
参数
- 引用位置:
-
- 引用位置:
参数/字段
- 引用位置:
-
- 引用位置:
方法调用/返回值 - 关联成员:
Component.literal()
- 引用位置:
-
- 引用位置:
方法调用 - 关联成员:
ComponentUtils.mergeStyles(), ComponentUtils.wrapInSquareBrackets()
- 引用位置:
-
- 引用位置:
方法调用/构造调用 - 关联成员:
HoverEvent.ShowText(), ShowText()
- 引用位置:
-
- 引用位置:
字段/方法调用 - 关联成员:
StreamCodec.ofMember()
- 引用位置:
-
- 引用位置:
参数/方法调用 - 关联成员:
Identifier.parse()
- 引用位置:
-
- 引用位置:
参数/方法调用/构造调用 - 关联成员:
ProblemReporter.RootFieldPathElement(), RootFieldPathElement()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ItemStackTemplate()
- 引用位置:
-
- 引用位置:
构造调用 - 关联成员:
ValidationContextSource()
- 引用位置: