minecraft-src/net/minecraft/world/scores/Objective.java
2025-07-04 03:45:38 +03:00

134 lines
4.2 KiB
Java

package net.minecraft.world.scores;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.Objects;
import java.util.Optional;
import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.ComponentSerialization;
import net.minecraft.network.chat.ComponentUtils;
import net.minecraft.network.chat.HoverEvent;
import net.minecraft.network.chat.numbers.NumberFormat;
import net.minecraft.network.chat.numbers.NumberFormatTypes;
import net.minecraft.world.scores.criteria.ObjectiveCriteria;
import org.jetbrains.annotations.Nullable;
public class Objective {
private final Scoreboard scoreboard;
private final String name;
private final ObjectiveCriteria criteria;
private Component displayName;
private Component formattedDisplayName;
private ObjectiveCriteria.RenderType renderType;
private boolean displayAutoUpdate;
@Nullable
private NumberFormat numberFormat;
public Objective(
Scoreboard scoreboard,
String name,
ObjectiveCriteria criteria,
Component displayName,
ObjectiveCriteria.RenderType renderType,
boolean displayAutoUpdate,
@Nullable NumberFormat numberFormat
) {
this.scoreboard = scoreboard;
this.name = name;
this.criteria = criteria;
this.displayName = displayName;
this.formattedDisplayName = this.createFormattedDisplayName();
this.renderType = renderType;
this.displayAutoUpdate = displayAutoUpdate;
this.numberFormat = numberFormat;
}
public Objective.Packed pack() {
return new Objective.Packed(this.name, this.criteria, this.displayName, this.renderType, this.displayAutoUpdate, Optional.ofNullable(this.numberFormat));
}
public Scoreboard getScoreboard() {
return this.scoreboard;
}
public String getName() {
return this.name;
}
public ObjectiveCriteria getCriteria() {
return this.criteria;
}
public Component getDisplayName() {
return this.displayName;
}
public boolean displayAutoUpdate() {
return this.displayAutoUpdate;
}
@Nullable
public NumberFormat numberFormat() {
return this.numberFormat;
}
public NumberFormat numberFormatOrDefault(NumberFormat defaultValue) {
return (NumberFormat)Objects.requireNonNullElse(this.numberFormat, defaultValue);
}
private Component createFormattedDisplayName() {
return ComponentUtils.wrapInSquareBrackets(
this.displayName.copy().withStyle(style -> style.withHoverEvent(new HoverEvent.ShowText(Component.literal(this.name))))
);
}
public Component getFormattedDisplayName() {
return this.formattedDisplayName;
}
public void setDisplayName(Component displayName) {
this.displayName = displayName;
this.formattedDisplayName = this.createFormattedDisplayName();
this.scoreboard.onObjectiveChanged(this);
}
public ObjectiveCriteria.RenderType getRenderType() {
return this.renderType;
}
public void setRenderType(ObjectiveCriteria.RenderType renderType) {
this.renderType = renderType;
this.scoreboard.onObjectiveChanged(this);
}
public void setDisplayAutoUpdate(boolean displayAutoUpdate) {
this.displayAutoUpdate = displayAutoUpdate;
this.scoreboard.onObjectiveChanged(this);
}
public void setNumberFormat(@Nullable NumberFormat numberFormat) {
this.numberFormat = numberFormat;
this.scoreboard.onObjectiveChanged(this);
}
public record Packed(
String name,
ObjectiveCriteria criteria,
Component displayName,
ObjectiveCriteria.RenderType renderType,
boolean displayAutoUpdate,
Optional<NumberFormat> numberFormat
) {
public static final Codec<Objective.Packed> CODEC = RecordCodecBuilder.create(
instance -> instance.group(
Codec.STRING.fieldOf("Name").forGetter(Objective.Packed::name),
ObjectiveCriteria.CODEC.optionalFieldOf("CriteriaName", ObjectiveCriteria.DUMMY).forGetter(Objective.Packed::criteria),
ComponentSerialization.CODEC.fieldOf("DisplayName").forGetter(Objective.Packed::displayName),
ObjectiveCriteria.RenderType.CODEC.optionalFieldOf("RenderType", ObjectiveCriteria.RenderType.INTEGER).forGetter(Objective.Packed::renderType),
Codec.BOOL.optionalFieldOf("display_auto_update", false).forGetter(Objective.Packed::displayAutoUpdate),
NumberFormatTypes.CODEC.optionalFieldOf("format").forGetter(Objective.Packed::numberFormat)
)
.apply(instance, Objective.Packed::new)
);
}
}