Code/net/minecraft/world/scores/PlayerTeam.java

239 lines
8.6 KiB
Java

package net.minecraft.world.scores;
import com.google.common.collect.Sets;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
import net.minecraft.ChatFormatting;
import net.minecraft.network.chat.CommonComponents;
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.MutableComponent;
import net.minecraft.network.chat.Style;
public class PlayerTeam extends Team {
private static final int BIT_FRIENDLY_FIRE = 0;
private static final int BIT_SEE_INVISIBLES = 1;
private final Scoreboard scoreboard;
private final String name;
private final Set<String> players = Sets.newHashSet();
private Component displayName;
private Component playerPrefix = CommonComponents.EMPTY;
private Component playerSuffix = CommonComponents.EMPTY;
private boolean allowFriendlyFire = true;
private boolean seeFriendlyInvisibles = true;
private Team.Visibility nameTagVisibility = Team.Visibility.ALWAYS;
private Team.Visibility deathMessageVisibility = Team.Visibility.ALWAYS;
private ChatFormatting color = ChatFormatting.RESET;
private Team.CollisionRule collisionRule = Team.CollisionRule.ALWAYS;
private final Style displayNameStyle;
public PlayerTeam(Scoreboard p_83340_, String p_83341_) {
this.scoreboard = p_83340_;
this.name = p_83341_;
this.displayName = Component.literal(p_83341_);
this.displayNameStyle = Style.EMPTY.withInsertion(p_83341_).withHoverEvent(new HoverEvent.ShowText(Component.literal(p_83341_)));
}
public PlayerTeam.Packed pack() {
return new PlayerTeam.Packed(
this.name,
Optional.of(this.displayName),
this.color != ChatFormatting.RESET ? Optional.of(this.color) : Optional.empty(),
this.allowFriendlyFire,
this.seeFriendlyInvisibles,
this.playerPrefix,
this.playerSuffix,
this.nameTagVisibility,
this.deathMessageVisibility,
this.collisionRule,
List.copyOf(this.players)
);
}
public Scoreboard getScoreboard() {
return this.scoreboard;
}
@Override
public String getName() {
return this.name;
}
public Component getDisplayName() {
return this.displayName;
}
public MutableComponent getFormattedDisplayName() {
MutableComponent mutablecomponent = ComponentUtils.wrapInSquareBrackets(this.displayName.copy().withStyle(this.displayNameStyle));
ChatFormatting chatformatting = this.getColor();
if (chatformatting != ChatFormatting.RESET) {
mutablecomponent.withStyle(chatformatting);
}
return mutablecomponent;
}
public void setDisplayName(Component p_83354_) {
if (p_83354_ == null) {
throw new IllegalArgumentException("Name cannot be null");
} else {
this.displayName = p_83354_;
this.scoreboard.onTeamChanged(this);
}
}
public void setPlayerPrefix(@Nullable Component p_83361_) {
this.playerPrefix = p_83361_ == null ? CommonComponents.EMPTY : p_83361_;
this.scoreboard.onTeamChanged(this);
}
public Component getPlayerPrefix() {
return this.playerPrefix;
}
public void setPlayerSuffix(@Nullable Component p_83366_) {
this.playerSuffix = p_83366_ == null ? CommonComponents.EMPTY : p_83366_;
this.scoreboard.onTeamChanged(this);
}
public Component getPlayerSuffix() {
return this.playerSuffix;
}
@Override
public Collection<String> getPlayers() {
return this.players;
}
@Override
public MutableComponent getFormattedName(Component p_83369_) {
MutableComponent mutablecomponent = Component.empty().append(this.playerPrefix).append(p_83369_).append(this.playerSuffix);
ChatFormatting chatformatting = this.getColor();
if (chatformatting != ChatFormatting.RESET) {
mutablecomponent.withStyle(chatformatting);
}
return mutablecomponent;
}
public static MutableComponent formatNameForTeam(@Nullable Team p_83349_, Component p_83350_) {
return p_83349_ == null ? p_83350_.copy() : p_83349_.getFormattedName(p_83350_);
}
@Override
public boolean isAllowFriendlyFire() {
return this.allowFriendlyFire;
}
public void setAllowFriendlyFire(boolean p_83356_) {
this.allowFriendlyFire = p_83356_;
this.scoreboard.onTeamChanged(this);
}
@Override
public boolean canSeeFriendlyInvisibles() {
return this.seeFriendlyInvisibles;
}
public void setSeeFriendlyInvisibles(boolean p_83363_) {
this.seeFriendlyInvisibles = p_83363_;
this.scoreboard.onTeamChanged(this);
}
@Override
public Team.Visibility getNameTagVisibility() {
return this.nameTagVisibility;
}
@Override
public Team.Visibility getDeathMessageVisibility() {
return this.deathMessageVisibility;
}
public void setNameTagVisibility(Team.Visibility p_83347_) {
this.nameTagVisibility = p_83347_;
this.scoreboard.onTeamChanged(this);
}
public void setDeathMessageVisibility(Team.Visibility p_83359_) {
this.deathMessageVisibility = p_83359_;
this.scoreboard.onTeamChanged(this);
}
@Override
public Team.CollisionRule getCollisionRule() {
return this.collisionRule;
}
public void setCollisionRule(Team.CollisionRule p_83345_) {
this.collisionRule = p_83345_;
this.scoreboard.onTeamChanged(this);
}
public int packOptions() {
int i = 0;
if (this.isAllowFriendlyFire()) {
i |= 1;
}
if (this.canSeeFriendlyInvisibles()) {
i |= 2;
}
return i;
}
public void unpackOptions(int p_83343_) {
this.setAllowFriendlyFire((p_83343_ & 1) > 0);
this.setSeeFriendlyInvisibles((p_83343_ & 2) > 0);
}
public void setColor(ChatFormatting p_83352_) {
this.color = p_83352_;
this.scoreboard.onTeamChanged(this);
}
@Override
public ChatFormatting getColor() {
return this.color;
}
public record Packed(
String name,
Optional<Component> displayName,
Optional<ChatFormatting> color,
boolean allowFriendlyFire,
boolean seeFriendlyInvisibles,
Component memberNamePrefix,
Component memberNameSuffix,
Team.Visibility nameTagVisibility,
Team.Visibility deathMessageVisibility,
Team.CollisionRule collisionRule,
List<String> players
) {
public static final Codec<PlayerTeam.Packed> CODEC = RecordCodecBuilder.create(
p_391724_ -> p_391724_.group(
Codec.STRING.fieldOf("Name").forGetter(PlayerTeam.Packed::name),
ComponentSerialization.CODEC.optionalFieldOf("DisplayName").forGetter(PlayerTeam.Packed::displayName),
ChatFormatting.COLOR_CODEC.optionalFieldOf("TeamColor").forGetter(PlayerTeam.Packed::color),
Codec.BOOL.optionalFieldOf("AllowFriendlyFire", true).forGetter(PlayerTeam.Packed::allowFriendlyFire),
Codec.BOOL.optionalFieldOf("SeeFriendlyInvisibles", true).forGetter(PlayerTeam.Packed::seeFriendlyInvisibles),
ComponentSerialization.CODEC.optionalFieldOf("MemberNamePrefix", CommonComponents.EMPTY).forGetter(PlayerTeam.Packed::memberNamePrefix),
ComponentSerialization.CODEC.optionalFieldOf("MemberNameSuffix", CommonComponents.EMPTY).forGetter(PlayerTeam.Packed::memberNameSuffix),
Team.Visibility.CODEC.optionalFieldOf("NameTagVisibility", Team.Visibility.ALWAYS).forGetter(PlayerTeam.Packed::nameTagVisibility),
Team.Visibility.CODEC.optionalFieldOf("DeathMessageVisibility", Team.Visibility.ALWAYS).forGetter(PlayerTeam.Packed::deathMessageVisibility),
Team.CollisionRule.CODEC.optionalFieldOf("CollisionRule", Team.CollisionRule.ALWAYS).forGetter(PlayerTeam.Packed::collisionRule),
Codec.STRING.listOf().optionalFieldOf("Players", List.of()).forGetter(PlayerTeam.Packed::players)
)
.apply(p_391724_, PlayerTeam.Packed::new)
);
}
}