diff --git a/paper-server/patches/sources/net/minecraft/world/scores/PlayerTeam.java.patch b/paper-server/patches/sources/net/minecraft/world/scores/PlayerTeam.java.patch new file mode 100644 index 0000000000..e2ba03babf --- /dev/null +++ b/paper-server/patches/sources/net/minecraft/world/scores/PlayerTeam.java.patch @@ -0,0 +1,11 @@ +--- a/net/minecraft/world/scores/PlayerTeam.java ++++ b/net/minecraft/world/scores/PlayerTeam.java +@@ -222,7 +_,7 @@ + instance -> instance.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), ++ io.papermc.paper.util.PaperCodecs.lenientCodec("TeamColor", ChatFormatting.COLOR_CODEC).forGetter(PlayerTeam.Packed::color), // Paper - better fail on decode + 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), diff --git a/paper-server/src/main/java/io/papermc/paper/util/PaperCodecs.java b/paper-server/src/main/java/io/papermc/paper/util/PaperCodecs.java index 22f24d35ef..10317465eb 100644 --- a/paper-server/src/main/java/io/papermc/paper/util/PaperCodecs.java +++ b/paper-server/src/main/java/io/papermc/paper/util/PaperCodecs.java @@ -1,13 +1,18 @@ package io.papermc.paper.util; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; import com.mojang.serialization.DataResult; import com.mojang.serialization.Decoder; import com.mojang.serialization.DynamicOps; +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.RecordBuilder; +import com.mojang.serialization.codecs.OptionalFieldCodec; import io.papermc.paper.adventure.AdventureCodecs; import io.papermc.paper.registry.RegistryAccess; import io.papermc.paper.registry.RegistryKey; import io.papermc.paper.registry.TypedKey; +import java.util.Optional; import java.util.function.Function; import net.kyori.adventure.key.Key; import net.minecraft.core.Holder; @@ -19,6 +24,25 @@ import org.jspecify.annotations.NullMarked; @NullMarked public final class PaperCodecs { + /** + * This codec is lenient on decoding and encoding compared to native OptionalFieldCodec + * which only has options to be lenient on decoding. + */ + public static MapCodec> lenientCodec(final String name, final Codec codec) { + return new OptionalFieldCodec<>(name, codec, true) { + @Override + public RecordBuilder encode(final Optional input, final DynamicOps ops, final RecordBuilder prefix) { + if (input.isPresent()) { + final DataResult result = codec.encodeStart(ops, input.get()); + if (!result.isError()) { + return prefix.add(name, result); + } + } + return prefix; + } + }; + } + public static Decoder registryFileDecoderFor(final Decoder directNmsDecoder, final Function, A> directHolderConverter, final RegistryKey registryKey, final boolean allowInline) { // TODO remove Keyed final Decoder.Terminal terminalDecoder = directNmsDecoder.map(nms -> directHolderConverter.apply(Holder.direct(nms))).terminal(); return Decoder.ofTerminal(new Decoder.Terminal<>() { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java b/paper-server/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java index 0a29779c6c..553778b3a4 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/scoreboard/CraftTeam.java @@ -149,6 +149,7 @@ final class CraftTeam extends CraftScoreboardComponent implements Team { @Override public void setColor(ChatColor color) { Preconditions.checkArgument(color != null, "Color cannot be null"); + Preconditions.checkArgument(!color.isFormat(), "Color must be a color not a format"); this.checkState(); this.team.setColor(CraftChatMessage.getColor(color));