From 5f4a4ad15b997edfaf4f1fd7059213bbba7fd059 Mon Sep 17 00:00:00 2001 From: Patbox Date: Fri, 19 Apr 2024 23:00:28 +0200 Subject: [PATCH] Finish up 1.20.5 update --- .../server/translations/api/Localization.java | 2 +- .../translations/impl/LocalizableText.java | 14 ++++----- .../translations/impl/ServerTranslations.java | 4 +++ .../mixin/codec/CodecCacheMixin.java | 31 +++++++++++++++++++ .../TranslatableTextContentMixin.java | 19 ++++++++++-- .../server_translations_api.mixin.json | 5 +-- build.gradle | 12 +++---- gradle/wrapper/gradle-wrapper.properties | 2 +- 8 files changed, 70 insertions(+), 19 deletions(-) create mode 100644 api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/CodecCacheMixin.java rename api/src/main/java/xyz/nucleoid/server/translations/mixin/{packet => codec}/TranslatableTextContentMixin.java (66%) diff --git a/api/src/main/java/xyz/nucleoid/server/translations/api/Localization.java b/api/src/main/java/xyz/nucleoid/server/translations/api/Localization.java index 997c015..7f5e33f 100644 --- a/api/src/main/java/xyz/nucleoid/server/translations/api/Localization.java +++ b/api/src/main/java/xyz/nucleoid/server/translations/api/Localization.java @@ -33,6 +33,6 @@ public static String raw(String key, LocalizationTarget target) { @Nullable public static String raw(String key, ServerLanguage language) { - return language.serverTranslations().get(key); + return language.serverTranslations().getOrNull(key); } } diff --git a/api/src/main/java/xyz/nucleoid/server/translations/impl/LocalizableText.java b/api/src/main/java/xyz/nucleoid/server/translations/impl/LocalizableText.java index c929191..f08d04b 100644 --- a/api/src/main/java/xyz/nucleoid/server/translations/impl/LocalizableText.java +++ b/api/src/main/java/xyz/nucleoid/server/translations/impl/LocalizableText.java @@ -1,6 +1,6 @@ package xyz.nucleoid.server.translations.impl; -import net.minecraft.nbt.NbtElement; +import com.mojang.serialization.JavaOps; import net.minecraft.nbt.NbtOps; import net.minecraft.text.*; import xyz.nucleoid.server.translations.api.language.ServerLanguage; @@ -11,18 +11,18 @@ public interface LocalizableText { static Text asLocalizedFor(final Text text, final ServerLanguage language) { - // TODO 1.20.5 Not tested // Encode to *any* intermediary format to apply the translation steps from TranslatableTextContentMixin to all translation text codecs var dynamicOps = NbtOps.INSTANCE; - Optional optionalNbt = TextCodecs.CODEC.encodeStart(dynamicOps, text).result(); - if (optionalNbt.isEmpty()) { + ServerTranslations.TRANSLATION_CONTEXT.set(language); + var optional = TextCodecs.CODEC.encodeStart(dynamicOps, text).result(); + ServerTranslations.TRANSLATION_CONTEXT.remove(); + if (optional.isEmpty()) { // Failed to encode text, shouldn't happen return text; } + // Decode back - ServerTranslations.TRANSLATION_CONTEXT.set(language); - Optional optionalText = TextCodecs.CODEC.parse(dynamicOps, optionalNbt.get()).result(); - ServerTranslations.TRANSLATION_CONTEXT.remove(); + var optionalText = TextCodecs.CODEC.parse(dynamicOps, optional.get()).result(); // Failed to decode text, shouldn't happen return optionalText.orElse(text); } diff --git a/api/src/main/java/xyz/nucleoid/server/translations/impl/ServerTranslations.java b/api/src/main/java/xyz/nucleoid/server/translations/impl/ServerTranslations.java index 3e16196..8bc6c52 100644 --- a/api/src/main/java/xyz/nucleoid/server/translations/impl/ServerTranslations.java +++ b/api/src/main/java/xyz/nucleoid/server/translations/impl/ServerTranslations.java @@ -4,6 +4,7 @@ import com.mojang.logging.LogUtils; import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.minecraft.server.MinecraftServer; +import net.minecraft.text.TranslatableTextContent; import xyz.nucleoid.server.translations.api.LocalizationTarget; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectRBTreeMap; @@ -169,6 +170,9 @@ public CompletableFuture reload(Synchronizer synchronizer, ResourceManager int keyCount = ServerTranslations.INSTANCE.getTranslationKeyCount(); LOGGER.info(Text.translatable("text.translated_server.loaded.translation_key", String.valueOf(keyCount)).getString()); + + //System.out.println(LocalizableText.asLocalizedFor( + // Text.translatable("text.translated_server.loaded.translation_key"), ServerLanguage.getLanguage("en_us")).getContent() instanceof TranslatableTextContent t ? t.getFallback() : "[FAIL]"); }); } diff --git a/api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/CodecCacheMixin.java b/api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/CodecCacheMixin.java new file mode 100644 index 0000000..a8f4c67 --- /dev/null +++ b/api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/CodecCacheMixin.java @@ -0,0 +1,31 @@ +package xyz.nucleoid.server.translations.mixin.codec; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.DynamicOps; +import net.minecraft.component.type.LoreComponent; +import net.minecraft.component.type.WrittenBookContentComponent; +import net.minecraft.text.Text; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import xyz.nucleoid.server.translations.api.LocalizationTarget; +import xyz.nucleoid.server.translations.impl.ServerTranslations; + +@Mixin(targets = "net/minecraft/util/dynamic/CodecCache$2") +public class CodecCacheMixin { + @Shadow + @Final + private Codec field_51505; + @Inject(method = "encode", at = @At("HEAD"), cancellable = true) + private void dontCacheOnNetworking(Object value, DynamicOps ops, Object prefix, CallbackInfoReturnable cir) { + if ( + (value instanceof Text || value instanceof WrittenBookContentComponent || value instanceof LoreComponent) + && (LocalizationTarget.forPacket() != null || ServerTranslations.TRANSLATION_CONTEXT.get() != null) + ) { + cir.setReturnValue(this.field_51505.encode(value, ops, prefix)); + } + } +} diff --git a/api/src/main/java/xyz/nucleoid/server/translations/mixin/packet/TranslatableTextContentMixin.java b/api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/TranslatableTextContentMixin.java similarity index 66% rename from api/src/main/java/xyz/nucleoid/server/translations/mixin/packet/TranslatableTextContentMixin.java rename to api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/TranslatableTextContentMixin.java index 45b35f9..2ded451 100644 --- a/api/src/main/java/xyz/nucleoid/server/translations/mixin/packet/TranslatableTextContentMixin.java +++ b/api/src/main/java/xyz/nucleoid/server/translations/mixin/codec/TranslatableTextContentMixin.java @@ -1,4 +1,4 @@ -package xyz.nucleoid.server.translations.mixin.packet; +package xyz.nucleoid.server.translations.mixin.codec; import com.llamalad7.mixinextras.injector.ModifyExpressionValue; import com.mojang.serialization.MapCodec; @@ -21,7 +21,22 @@ public abstract class TranslatableTextContentMixin { ) ) private static MapCodec stapi$addTranslationFallback(MapCodec original) { - return original.xmap(Function.identity(), (content) -> { + return original.xmap((content) -> { + if (content.getFallback() != null) { + ServerLanguage language = ServerTranslations.TRANSLATION_CONTEXT.get(); + if (language == null) { + var target = LocalizationTarget.forPacket(); + if (target != null) { + language = target.getLanguage(); + } + } + + if (language != null && content.getFallback().equals(language.serverTranslations().getOrNull(content.getKey()))) { + return new TranslatableTextContent(content.getKey(), null, content.getArgs()); + } + } + return content; + }, (content) -> { if (content.getFallback() == null) { ServerLanguage language = ServerTranslations.TRANSLATION_CONTEXT.get(); if (language == null) { diff --git a/api/src/main/resources/server_translations_api.mixin.json b/api/src/main/resources/server_translations_api.mixin.json index a4b9ce6..168e407 100644 --- a/api/src/main/resources/server_translations_api.mixin.json +++ b/api/src/main/resources/server_translations_api.mixin.json @@ -6,9 +6,10 @@ "mixins": [ "LanguageMixin", "ServerPlayerEntityMixin", + "codec.CodecCacheMixin", + "codec.TranslatableTextContentMixin", "packet.BlockEntityDataMixin", - "packet.BlockEntityUpdateS2CPacketMixin", - "packet.TranslatableTextContentMixin" + "packet.BlockEntityUpdateS2CPacketMixin" ], "client": [ "client.LanguageMixin" diff --git a/build.gradle b/build.gradle index 1946572..0d62c61 100644 --- a/build.gradle +++ b/build.gradle @@ -3,14 +3,14 @@ plugins { id 'eclipse' id 'idea' id 'maven-publish' - id 'fabric-loom' version '1.5.+' apply false + id 'fabric-loom' version '1.6.+' apply false id 'com.matthewprenger.cursegradle' version "1.4.0" } class Globals { - static def baseVersion = "2.2.0" - static def mcVersion = "24w09a" - static def yarnVersion = "+build.6" + static def baseVersion = "2.3.0" + static def mcVersion = "1.20.5-rc2" + static def yarnVersion = "+build.1" } archivesBaseName = "Server-Translations" @@ -51,9 +51,9 @@ allprojects { mappings "net.fabricmc:yarn:${Globals.mcVersion}${Globals.yarnVersion}:v2" modImplementation "net.fabricmc:fabric-loader:0.15.7" - modImplementation include("xyz.nucleoid:packet-tweaker:0.5.0+1.20.2-rc1") + modImplementation include("xyz.nucleoid:packet-tweaker:0.5.1+24w03b") - modImplementation "net.fabricmc.fabric-api:fabric-api:0.96.5+1.20.5" + modImplementation "net.fabricmc.fabric-api:fabric-api:0.97.3+1.20.5" } processResources { diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e411586..48c0a02 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists