package io.gitlab.jfronny.translater.mixin; import io.gitlab.jfronny.translater.Translater; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.MappingResolver; import net.minecraft.client.resource.language.TranslationStorage; import net.minecraft.util.Language; import org.apache.commons.lang3.reflect.FieldUtils; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.lang.reflect.Field; import java.util.Map; //This is where the actual magic happens @Mixin(Language.class) public class MixinLanguage { private static final MappingResolver mr = FabricLoader.getInstance().getMappingResolver(); private static final Field FIELD = FieldUtils.getField(TranslationStorage.class, mr.mapFieldName("intermediary", "net.minecraft.class_1078", "field_5330", "Ljava/util/Map;"), true); @Inject(at = @At("HEAD"), method = "setInstance") private static void languageSetInstance(Language language, CallbackInfo ci) { if (FIELD == null) { Translater.Warn("Could not set language map, field not found"); return; } if (language instanceof TranslationStorage) { try { FIELD.set(language, Translater.getMap((Map) FIELD.get(language))); } catch (IllegalAccessException | ClassCastException e) { e.printStackTrace(); } } } }