mirror of
https://github.com/PaperMC/Paper.git
synced 2025-01-06 18:50:51 +01:00
66779f5c86
== AT == public net.minecraft.network.chat.HoverEvent$ItemStackInfo item public net.minecraft.network.chat.HoverEvent$ItemStackInfo count public net.minecraft.network.chat.HoverEvent$ItemStackInfo components public net.minecraft.network.chat.contents.TranslatableContents filterAllowedArguments(Ljava/lang/Object;)Lcom/mojang/serialization/DataResult; Co-authored-by: zml <zml@stellardrift.ca> Co-authored-by: Jake Potrebic <jake.m.potrebic@gmail.com>
99 lines
6.4 KiB
Diff
99 lines
6.4 KiB
Diff
--- a/net/minecraft/network/chat/ComponentSerialization.java
|
|
+++ b/net/minecraft/network/chat/ComponentSerialization.java
|
|
@@ -37,9 +37,31 @@
|
|
|
|
public class ComponentSerialization {
|
|
public static final Codec<Component> CODEC = Codec.recursive("Component", ComponentSerialization::createCodec);
|
|
- public static final StreamCodec<RegistryFriendlyByteBuf, Component> STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistries(CODEC);
|
|
+ public static final StreamCodec<RegistryFriendlyByteBuf, Component> STREAM_CODEC = createTranslationAware(() -> net.minecraft.nbt.NbtAccounter.create(net.minecraft.network.FriendlyByteBuf.DEFAULT_NBT_QUOTA)); // Paper - adventure
|
|
public static final StreamCodec<RegistryFriendlyByteBuf, Optional<Component>> OPTIONAL_STREAM_CODEC = STREAM_CODEC.apply(ByteBufCodecs::optional);
|
|
- public static final StreamCodec<RegistryFriendlyByteBuf, Component> TRUSTED_STREAM_CODEC = ByteBufCodecs.fromCodecWithRegistriesTrusted(CODEC);
|
|
+ // Paper start - adventure; use locale from bytebuf for translation
|
|
+ public static final ThreadLocal<Boolean> DONT_RENDER_TRANSLATABLES = ThreadLocal.withInitial(() -> false);
|
|
+ public static final StreamCodec<RegistryFriendlyByteBuf, Component> TRUSTED_STREAM_CODEC = createTranslationAware(net.minecraft.nbt.NbtAccounter::unlimitedHeap);
|
|
+ private static StreamCodec<RegistryFriendlyByteBuf, Component> createTranslationAware(final Supplier<net.minecraft.nbt.NbtAccounter> sizeTracker) {
|
|
+ return new StreamCodec<>() {
|
|
+ final StreamCodec<ByteBuf, net.minecraft.nbt.Tag> streamCodec = ByteBufCodecs.tagCodec(sizeTracker);
|
|
+ @Override
|
|
+ public Component decode(RegistryFriendlyByteBuf registryFriendlyByteBuf) {
|
|
+ net.minecraft.nbt.Tag tag = this.streamCodec.decode(registryFriendlyByteBuf);
|
|
+ RegistryOps<net.minecraft.nbt.Tag> registryOps = registryFriendlyByteBuf.registryAccess().createSerializationContext(net.minecraft.nbt.NbtOps.INSTANCE);
|
|
+ return CODEC.parse(registryOps, tag).getOrThrow(error -> new io.netty.handler.codec.DecoderException("Failed to decode: " + error + " " + tag));
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public void encode(RegistryFriendlyByteBuf registryFriendlyByteBuf, Component object) {
|
|
+ RegistryOps<net.minecraft.nbt.Tag> registryOps = registryFriendlyByteBuf.registryAccess().createSerializationContext(net.minecraft.nbt.NbtOps.INSTANCE);
|
|
+ net.minecraft.nbt.Tag tag = (DONT_RENDER_TRANSLATABLES.get() ? CODEC : ComponentSerialization.localizedCodec(registryFriendlyByteBuf.adventure$locale))
|
|
+ .encodeStart(registryOps, object).getOrThrow(error -> new io.netty.handler.codec.EncoderException("Failed to encode: " + error + " " + object));
|
|
+ this.streamCodec.encode(registryFriendlyByteBuf, tag);
|
|
+ }
|
|
+ };
|
|
+ }
|
|
+ // Paper end - adventure; use locale from bytebuf for translation
|
|
public static final StreamCodec<RegistryFriendlyByteBuf, Optional<Component>> TRUSTED_OPTIONAL_STREAM_CODEC = TRUSTED_STREAM_CODEC.apply(
|
|
ByteBufCodecs::optional
|
|
);
|
|
@@ -100,7 +122,27 @@
|
|
return ExtraCodecs.orCompressed(mapCodec3, mapCodec2);
|
|
}
|
|
|
|
+ // Paper start - adventure; create separate codec for each locale
|
|
+ private static final java.util.Map<java.util.Locale, Codec<Component>> LOCALIZED_CODECS = new java.util.concurrent.ConcurrentHashMap<>();
|
|
+
|
|
+ public static Codec<Component> localizedCodec(final java.util.@org.checkerframework.checker.nullness.qual.Nullable Locale locale) {
|
|
+ if (locale == null) {
|
|
+ return CODEC;
|
|
+ }
|
|
+ return LOCALIZED_CODECS.computeIfAbsent(locale,
|
|
+ loc -> Codec.recursive("Component", selfCodec -> createCodec(selfCodec, loc)));
|
|
+ }
|
|
+
|
|
+
|
|
+ // Paper end - adventure; create separate codec for each locale
|
|
+
|
|
private static Codec<Component> createCodec(Codec<Component> selfCodec) {
|
|
+ // Paper start - adventure; create separate codec for each locale
|
|
+ return createCodec(selfCodec, null);
|
|
+ }
|
|
+
|
|
+ private static Codec<Component> createCodec(Codec<Component> selfCodec, @javax.annotation.Nullable java.util.Locale locale) {
|
|
+ // Paper end - adventure; create separate codec for each locale
|
|
ComponentContents.Type<?>[] types = new ComponentContents.Type[]{
|
|
PlainTextContents.TYPE, TranslatableContents.TYPE, KeybindContents.TYPE, ScoreContents.TYPE, SelectorContents.TYPE, NbtContents.TYPE
|
|
};
|
|
@@ -113,6 +155,34 @@
|
|
)
|
|
.apply(instance, MutableComponent::new)
|
|
);
|
|
+ // Paper start - adventure; create separate codec for each locale
|
|
+ final Codec<Component> origCodec = codec;
|
|
+ codec = new Codec<>() {
|
|
+ @Override
|
|
+ public <T> DataResult<com.mojang.datafixers.util.Pair<Component, T>> decode(final DynamicOps<T> ops, final T input) {
|
|
+ return origCodec.decode(ops, input);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public <T> DataResult<T> encode(final Component input, final DynamicOps<T> ops, final T prefix) {
|
|
+ final net.kyori.adventure.text.Component adventureComponent;
|
|
+ if (input instanceof io.papermc.paper.adventure.AdventureComponent adv) {
|
|
+ adventureComponent = adv.adventure$component();
|
|
+ } else if (locale != null && input.getContents() instanceof TranslatableContents && io.papermc.paper.adventure.PaperAdventure.hasAnyTranslations()) {
|
|
+ adventureComponent = io.papermc.paper.adventure.PaperAdventure.asAdventure(input);
|
|
+ } else {
|
|
+ return origCodec.encode(input, ops, prefix);
|
|
+ }
|
|
+ return io.papermc.paper.adventure.PaperAdventure.localizedCodec(locale)
|
|
+ .encode(adventureComponent, ops, prefix);
|
|
+ }
|
|
+
|
|
+ @Override
|
|
+ public String toString() {
|
|
+ return origCodec.toString() + "[AdventureComponentAware]";
|
|
+ }
|
|
+ };
|
|
+ // Paper end - adventure; create separate codec for each locale
|
|
return Codec.either(Codec.either(Codec.STRING, ExtraCodecs.nonEmptyList(selfCodec.listOf())), codec)
|
|
.xmap(either -> either.map(either2 -> either2.map(Component::literal, ComponentSerialization::createFromList), text -> (Component)text), text -> {
|
|
String string = text.tryCollapseToString();
|