diff --git a/src/main/resources/assets/gregtech/lang/GregTech.lang b/assets/gregtech/lang/GregTech.lang similarity index 100% rename from src/main/resources/assets/gregtech/lang/GregTech.lang rename to assets/gregtech/lang/GregTech.lang diff --git a/src/main/resources/assets/gregtech/lang/en_US.lang b/assets/gregtech/lang/en_US.lang similarity index 100% rename from src/main/resources/assets/gregtech/lang/en_US.lang rename to assets/gregtech/lang/en_US.lang diff --git a/dependencies.gradle b/dependencies.gradle index efd94de..b3602c5 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -35,5 +35,6 @@ */ dependencies { //runtimeOnlyNonPublishable("com.github.GTNewHorizons:NotEnoughItems:2.7.69-GTNH:dev") - compile files("libs/gregtech-5.09.51.419.jar") + compileOnly('com.github.GTNewHorizons:GT5-Unofficial:5.09.51.443:dev') {transitive = false} + compileOnly('com.github.GTNewHorizons:waila:1.8.1:dev') {transitive = false} } diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/CommandGTIP.java b/src/main/java/com/teroblaze/gtitemuntranslator/CommandGTIP.java deleted file mode 100644 index 3e00518..0000000 --- a/src/main/java/com/teroblaze/gtitemuntranslator/CommandGTIP.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.teroblaze.gtitemuntranslator; - -import net.minecraft.command.CommandBase; -import net.minecraft.command.ICommandSender; -import net.minecraft.util.ChatComponentText; - -public class CommandGTIP extends CommandBase { - - @Override - public String getCommandName() { - return "gtip"; - } - - @Override - public String getCommandUsage(ICommandSender sender) { - return "/gtip "; - } - - @Override - public void processCommand(ICommandSender sender, String[] args) { - if (args.length == 1) { - if ("on".equalsIgnoreCase(args[0])) { - TooltipEventHandler.TOOLTIPS_ENABLED = true; - sender.addChatMessage(new ChatComponentText("GT English tooltips activated.")); - return; - } - if ("off".equalsIgnoreCase(args[0])) { - TooltipEventHandler.TOOLTIPS_ENABLED = false; - sender.addChatMessage(new ChatComponentText("GT English tooltips deactivated.")); - return; - } - } - sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender))); - } - - @Override - public int getRequiredPermissionLevel() { - return 0; // доступна всем игрокам - } -} diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/CommandTIPP.java b/src/main/java/com/teroblaze/gtitemuntranslator/CommandTIPP.java new file mode 100644 index 0000000..aa36c68 --- /dev/null +++ b/src/main/java/com/teroblaze/gtitemuntranslator/CommandTIPP.java @@ -0,0 +1,46 @@ +package com.teroblaze.gtitemuntranslator; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; + +public class CommandTIPP extends CommandBase { + + @Override + public String getCommandName() { + return "tipp"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/tipp "; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if (args.length != 1) { + sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender))); + return; + } + if ("on".equalsIgnoreCase(args[0])) { + GTItemUntranslator.tooltipsEnabled = true; + GTItemUntranslator.config.get("general", "tooltipsEnabled", true) + .set(GTItemUntranslator.tooltipsEnabled); + GTItemUntranslator.config.save(); + sender.addChatMessage(new ChatComponentText("GT Original tooltip names: ON")); + } else if ("off".equalsIgnoreCase(args[0])) { + GTItemUntranslator.tooltipsEnabled = false; + GTItemUntranslator.config.get("general", "tooltipsEnabled", true) + .set(GTItemUntranslator.tooltipsEnabled); + GTItemUntranslator.config.save(); + sender.addChatMessage(new ChatComponentText("GT Original tooltip names: OFF")); + } else { + sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender))); + } + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } +} diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/CommandWTIPP.java b/src/main/java/com/teroblaze/gtitemuntranslator/CommandWTIPP.java new file mode 100644 index 0000000..420c064 --- /dev/null +++ b/src/main/java/com/teroblaze/gtitemuntranslator/CommandWTIPP.java @@ -0,0 +1,46 @@ +package com.teroblaze.gtitemuntranslator; + +import net.minecraft.command.CommandBase; +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; + +public class CommandWTIPP extends CommandBase { + + @Override + public String getCommandName() { + return "wtipp"; + } + + @Override + public String getCommandUsage(ICommandSender sender) { + return "/wtipp "; + } + + @Override + public void processCommand(ICommandSender sender, String[] args) { + if (args.length != 1) { + sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender))); + return; + } + if ("on".equalsIgnoreCase(args[0])) { + GTItemUntranslator.wailaEnabled = true; + GTItemUntranslator.config.get("general", "wailaEnabled", true) + .set(GTItemUntranslator.wailaEnabled); + GTItemUntranslator.config.save(); + sender.addChatMessage(new ChatComponentText("GT Waila original names: ON")); + } else if ("off".equalsIgnoreCase(args[0])) { + GTItemUntranslator.wailaEnabled = false; + GTItemUntranslator.config.get("general", "wailaEnabled", true) + .set(GTItemUntranslator.wailaEnabled); + GTItemUntranslator.config.save(); + sender.addChatMessage(new ChatComponentText("GT Waila original names: OFF")); + } else { + sender.addChatMessage(new ChatComponentText("Usage: " + getCommandUsage(sender))); + } + } + + @Override + public int getRequiredPermissionLevel() { + return 0; + } +} diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/GTItemUntranslator.java b/src/main/java/com/teroblaze/gtitemuntranslator/GTItemUntranslator.java index 5a9cc74..a49dfc0 100644 --- a/src/main/java/com/teroblaze/gtitemuntranslator/GTItemUntranslator.java +++ b/src/main/java/com/teroblaze/gtitemuntranslator/GTItemUntranslator.java @@ -1,12 +1,16 @@ package com.teroblaze.gtitemuntranslator; +import java.io.File; + import net.minecraft.command.ICommandManager; import net.minecraft.command.ServerCommandManager; import net.minecraft.server.MinecraftServer; import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.common.config.Configuration; import cpw.mods.fml.common.Mod; import cpw.mods.fml.common.event.FMLInitializationEvent; +import cpw.mods.fml.common.event.FMLInterModComms; import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerStartedEvent; @@ -16,7 +20,7 @@ modid = GTItemUntranslator.MODID, name = GTItemUntranslator.NAME, version = GTItemUntranslator.VERSION, - dependencies = "required-after:gregtech", + dependencies = "required-after:gregtech;after:Waila", acceptedMinecraftVersions = "[1.7.10]") public class GTItemUntranslator { @@ -24,12 +28,32 @@ public class GTItemUntranslator { public static final String NAME = "GT Item Untranslator"; public static final String VERSION = "1.0.0"; + /** Global flags for enabling/disabling features */ + public static boolean tooltipsEnabled = true; + public static boolean wailaEnabled = true; + + /** Forge configuration handler */ + public static Configuration config; + @Mod.Instance(MODID) public static GTItemUntranslator INSTANCE; @Mod.EventHandler public void preInit(FMLPreInitializationEvent event) { System.out.println("[" + NAME + "] PRE-INIT started."); + + // Load Forge config + File configFile = event.getSuggestedConfigurationFile(); + config = new Configuration(configFile); + config.load(); + + // Read feature toggles from config + tooltipsEnabled = config + .getBoolean("tooltipsEnabled", Configuration.CATEGORY_GENERAL, true, "Show English tooltips in inventory"); + wailaEnabled = config + .getBoolean("wailaEnabled", Configuration.CATEGORY_GENERAL, true, "Show English tooltips in Waila"); + + // Initialize language store OriginalLanguageStore.init(); System.out.println("[" + NAME + "] PRE-INIT completed."); } @@ -37,8 +61,19 @@ public void preInit(FMLPreInitializationEvent event) { @Mod.EventHandler public void init(FMLInitializationEvent event) { System.out.println("[" + NAME + "] INIT started. Registering event handlers."); + + // Register tooltip handler for inventory tooltips MinecraftForge.EVENT_BUS.register(new TooltipEventHandler()); System.out.println("[" + NAME + "] Event handlers registered."); + + // Register Waila integration if Waila is installed + try { + FMLInterModComms + .sendMessage("Waila", "register", "com.teroblaze.gtitemuntranslator.waila.WailaRegister.register"); + System.out.println("[" + NAME + "] Waila integration registered."); + } catch (Throwable t) { + System.err.println("[" + NAME + "] Waila not found or integration failed."); + } } @Mod.EventHandler @@ -48,14 +83,18 @@ public void postInit(FMLPostInitializationEvent event) { @Mod.EventHandler public void onServerStarted(FMLServerStartedEvent event) { - System.out.println("[" + NAME + "] Server started. Registering /gtip command."); + System.out.println("[" + NAME + "] Server started. Registering commands."); + + // Register commands for toggling features MinecraftServer server = MinecraftServer.getServer(); ICommandManager commandManager = server.getCommandManager(); if (commandManager instanceof ServerCommandManager) { - ((ServerCommandManager) commandManager).registerCommand(new CommandGTIP()); - System.out.println("[" + NAME + "] /gtip command registered."); + ((ServerCommandManager) commandManager).registerCommand(new CommandTIPP()); + ((ServerCommandManager) commandManager).registerCommand(new CommandWTIPP()); + System.out.println("[" + NAME + "] /tipp and /wtipp commands registered."); } + // Ensure language store is initialized if (!OriginalLanguageStore.isInitialized()) { System.err.println("[" + NAME + "] ERROR: Language store failed to initialize!"); OriginalLanguageStore.init(); @@ -64,7 +103,16 @@ public void onServerStarted(FMLServerStartedEvent event) { @Mod.EventHandler public void onServerStopped(FMLServerStoppedEvent event) { - System.out.println("[" + NAME + "] Server stopped. Unloading language store."); + System.out.println("[" + NAME + "] Server stopped. Saving config and unloading language store."); + + // Save current feature toggles to config + config.get(Configuration.CATEGORY_GENERAL, "tooltipsEnabled", tooltipsEnabled) + .set(tooltipsEnabled); + config.get(Configuration.CATEGORY_GENERAL, "wailaEnabled", wailaEnabled) + .set(wailaEnabled); + config.save(); + + // Cleanup language store OriginalLanguageStore.unload(); System.out.println("[" + NAME + "] Cleanup finished."); } diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/OriginalLanguageStore.java b/src/main/java/com/teroblaze/gtitemuntranslator/OriginalLanguageStore.java index f0b83f1..f880d5b 100644 --- a/src/main/java/com/teroblaze/gtitemuntranslator/OriginalLanguageStore.java +++ b/src/main/java/com/teroblaze/gtitemuntranslator/OriginalLanguageStore.java @@ -1,6 +1,8 @@ package com.teroblaze.gtitemuntranslator; import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; @@ -9,10 +11,7 @@ public class OriginalLanguageStore { - // --- КОНФИГУРАЦИЯ ОТЛАДКИ --- - private static final String DEBUG_KEY = null; // Установите сюда ключ для точечной отладки - // --- КОНЕЦ КОНФИГУРАЦИИ --- - + private static final String DEBUG_KEY = null; // Specify the key for debugging private static final Map ORIGINAL_ENGLISH = new HashMap<>(); private static boolean isLoaded = false; @@ -23,10 +22,11 @@ public static void init() { } System.out.println("[GT Item Untranslator] Initializing language store..."); - // Пути к оригинальным .lang файлам. - String[] langPaths = { "/assets/gregtech/lang/en_US.lang", "/assets/gregtech/lang/GregTech.lang", - "/assets/bartworks/lang/en_US.lang", "/assets/gtnhlanth/lang/en_US.lang", - "/assets/miscutils/lang/en_US.lang", "/assets/tectech/lang/en_US.lang" }; + + // === Lang-files from jar (en_US.lang and others) === + String[] langPaths = { "/assets/gregtech/lang/en_US.lang", "/assets/bartworks/lang/en_US.lang", + "/assets/gtnhlanth/lang/en_US.lang", "/assets/miscutils/lang/en_US.lang", + "/assets/tectech/lang/en_US.lang" }; int totalLoaded = 0; for (String langPath : langPaths) { @@ -38,43 +38,7 @@ public static void init() { continue; } - try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { - String line; - int lineNumber = 0; - while ((line = reader.readLine()) != null) { - lineNumber++; - line = line.trim(); - if (line.isEmpty() || line.startsWith("#")) continue; - - String processedLine = line; - if (line.startsWith("S:")) { - processedLine = line.substring(2); // убираем префикс "S:" - } - - int eqPos = processedLine.indexOf('='); - if (eqPos > 0) { - String key = processedLine.substring(0, eqPos) - .trim(); - String value = processedLine.substring(eqPos + 1); - - boolean isDebugKey = DEBUG_KEY != null && DEBUG_KEY.equals(key); - if (isDebugKey) { - System.out.println( - "[GT Item Untranslator] [LOAD DEBUG] " + langPath - + " line " - + lineNumber - + " -> key='" - + key - + "', value='" - + value - + "'"); - } - - ORIGINAL_ENGLISH.put(key, value); - loadedFromFile++; - } - } - } + loadedFromFile = loadFromStream(is, langPath); System.out.println("[GT Item Untranslator] Loaded " + loadedFromFile + " entries from " + langPath); totalLoaded += loadedFromFile; } catch (Exception e) { @@ -83,21 +47,84 @@ public static void init() { } } + // === Loading GregTech.lang from .minecraft folder === + try { + File mcDir = new File("."); + File gtLangFile = new File(mcDir, "GregTech.lang"); + + if (gtLangFile.exists() && gtLangFile.isFile()) { + System.out + .println("[GT Item Untranslator] Found external GregTech.lang at: " + gtLangFile.getAbsolutePath()); + try (InputStream is = new FileInputStream(gtLangFile)) { + int loaded = loadFromStream(is, gtLangFile.getAbsolutePath()); + totalLoaded += loaded; + System.out + .println("[GT Item Untranslator] Loaded " + loaded + " entries from external GregTech.lang"); + } + } else { + System.out.println( + "[GT Item Untranslator] External GregTech.lang not found in .minecraft folder (" + + gtLangFile.getAbsolutePath() + + ")"); + } + } catch (Exception e) { + System.err.println("[GT Item Untranslator] ERROR loading external GregTech.lang from .minecraft"); + e.printStackTrace(); + } + isLoaded = true; System.out.println( "[GT Item Untranslator] Initialization complete. Total unique entries: " + ORIGINAL_ENGLISH.size()); } + private static int loadFromStream(InputStream is, String source) { + int loadedFromFile = 0; + try (BufferedReader reader = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String line; + int lineNumber = 0; + while ((line = reader.readLine()) != null) { + lineNumber++; + line = line.trim(); + if (line.isEmpty() || line.startsWith("#")) continue; + + if (line.startsWith("S:")) { + line = line.substring(2); + } + + int eqPos = line.indexOf('='); + if (eqPos > 0) { + String key = line.substring(0, eqPos) + .trim(); + String value = line.substring(eqPos + 1); + + boolean isDebugKey = DEBUG_KEY != null && DEBUG_KEY.equals(key); + if (isDebugKey) { + System.out.println( + "[GT Item Untranslator] [LOAD DEBUG] " + source + + " line " + + lineNumber + + " -> key='" + + key + + "', value='" + + value + + "'"); + } + + ORIGINAL_ENGLISH.put(key, value); + loadedFromFile++; + } + } + } catch (Exception e) { + System.err.println("[GT Item Untranslator] ERROR parsing lang file: " + source); + e.printStackTrace(); + } + return loadedFromFile; + } + public static boolean isInitialized() { return isLoaded; } - /** - * Получает оригинальное английское значение по ключу. - * - * @param key Ключ локализации (например, "gt.metaitem.01.11305.name"). - * @return Оригинальное значение из .lang файла или сам ключ, если не найден. - */ public static String getOriginal(String key) { if (key == null || key.isEmpty()) return key; diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/TooltipEventHandler.java b/src/main/java/com/teroblaze/gtitemuntranslator/TooltipEventHandler.java index 1d47416..5a2f61d 100644 --- a/src/main/java/com/teroblaze/gtitemuntranslator/TooltipEventHandler.java +++ b/src/main/java/com/teroblaze/gtitemuntranslator/TooltipEventHandler.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; +import net.minecraft.client.Minecraft; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumChatFormatting; import net.minecraftforge.event.entity.player.ItemTooltipEvent; @@ -30,10 +31,7 @@ private static void error(String msg) { if (DEBUG) System.err.println(msg); } - // Флаг для /gtip on|off - public static boolean TOOLTIPS_ENABLED = true; - - // === Конфигурация префиксов === + // === Prefix configuration === private static class PrefixRule { String prefix; @@ -68,7 +66,7 @@ private PrefixRule matchPrefix(String key) { return null; } - // === Универсальная таблица шаблонов для OreDict === + // === Universal pattern table for OreDict (BartWorks) === private static final Map BW_OREDICT_TEMPLATES = new HashMap<>(); static { BW_OREDICT_TEMPLATES.put("dust", "%material Dust"); @@ -77,7 +75,6 @@ private PrefixRule matchPrefix(String key) { BW_OREDICT_TEMPLATES.put("crushed", "Crushed %material Ore"); BW_OREDICT_TEMPLATES.put("crushedPurified", "Purified Crushed %material Ore"); BW_OREDICT_TEMPLATES.put("crushedCentrifuged", "Centrifuged Crushed %material Ore"); - BW_OREDICT_TEMPLATES.put("ingot", "%material Ingot"); BW_OREDICT_TEMPLATES.put("nugget", "%material Nugget"); BW_OREDICT_TEMPLATES.put("plate", "%material Plate"); @@ -86,56 +83,45 @@ private PrefixRule matchPrefix(String key) { BW_OREDICT_TEMPLATES.put("block", "%material Block"); BW_OREDICT_TEMPLATES.put("casing", "%material Casing"); BW_OREDICT_TEMPLATES.put("ore", "%material Ore"); - BW_OREDICT_TEMPLATES.put("rawOre", "Raw %material Ore"); - BW_OREDICT_TEMPLATES.put("gem", "%material"); BW_OREDICT_TEMPLATES.put("gemExquisite", "Exquisite %material"); BW_OREDICT_TEMPLATES.put("gemFlawless", "Flawless %material"); BW_OREDICT_TEMPLATES.put("gemFlawed", "Flawed %material"); BW_OREDICT_TEMPLATES.put("gemChipped", "Chipped %material"); - BW_OREDICT_TEMPLATES.put("foil", "%material Foil"); BW_OREDICT_TEMPLATES.put("stick", "%material Stick"); BW_OREDICT_TEMPLATES.put("stickLong", "Long %material Stick"); - BW_OREDICT_TEMPLATES.put("toolHeadWrench", "%material Wrench Head"); BW_OREDICT_TEMPLATES.put("toolHeadHammer", "%material Hammer Head"); BW_OREDICT_TEMPLATES.put("toolHeadSaw", "%material Saw Head"); - BW_OREDICT_TEMPLATES.put("turbineBlade", "%material Turbine Blade"); - BW_OREDICT_TEMPLATES.put("gearGt", "%material Gear"); BW_OREDICT_TEMPLATES.put("gearGtSmall", "Small %material Gear"); - BW_OREDICT_TEMPLATES.put("bolt", "%material Bolt"); BW_OREDICT_TEMPLATES.put("screw", "%material Screw"); BW_OREDICT_TEMPLATES.put("ring", "%material Ring"); BW_OREDICT_TEMPLATES.put("spring", "%material Spring"); BW_OREDICT_TEMPLATES.put("springSmall", "Small %material Spring"); - BW_OREDICT_TEMPLATES.put("rotor", "%material Rotor"); - BW_OREDICT_TEMPLATES.put("cell", "%material Cell"); BW_OREDICT_TEMPLATES.put("cellMolten", "Molten %material Cell"); BW_OREDICT_TEMPLATES.put("capsule", "%material Capsule"); BW_OREDICT_TEMPLATES.put("capsuleMolten", "Molten %material Capsule"); } - private String prettifyMaterialName(String name) { + private static String prettifyMaterialName(String name) { if (name == null || name.isEmpty()) return name; return name.replaceAll("([a-z])([A-Z])", "$1 $2") .trim(); } - // === Получение оригинального английского имени === - private String getOriginalEnglishName(ItemStack itemStack, String localizationKey) { - if (itemStack == null) { - return null; - } + // === Resolving original English name === + public static String getOriginalEnglishName(ItemStack itemStack, String localizationKey) { + if (itemStack == null) return null; try { - // === fluids (ItemFluidDisplay) === + // === Fluids (ItemFluidDisplay) === if (itemStack.getItem() instanceof gregtech.common.items.ItemFluidDisplay) { int meta = itemStack.getItemDamage(); net.minecraftforge.fluids.Fluid fluid = FluidRegistry.getFluid(meta); @@ -150,16 +136,11 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe String raw1 = OriginalLanguageStore.getOriginal(key1); String raw2 = OriginalLanguageStore.getOriginal(key2); - if (raw1 != null && !raw1.equals(key1)) { - return raw1; - } - if (raw2 != null && !raw2.equals(key2)) { - return raw2; - } + if (raw1 != null && !raw1.equals(key1)) return raw1; + if (raw2 != null && !raw2.equals(key2)) return raw2; if (regName != null && !regName.isEmpty()) { - String pretty = prettifyMaterialName(regName.replace('.', ' ')); - return pretty; + return prettifyMaterialName(regName.replace('.', ' ')); } } else { error("[Fluid] No fluid found for meta=" + meta); @@ -167,7 +148,7 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe return null; } - // === 1. Lang === + // === 1. From lang files === if (localizationKey != null && !localizationKey.isEmpty()) { String rawTemplate = OriginalLanguageStore.getOriginal(localizationKey); if (rawTemplate != null && !rawTemplate.equals(localizationKey)) { @@ -197,7 +178,25 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe } } - // === 2. Werkstoff casing === + // === 2. BartWorks fallback via OreDict === + if (localizationKey.startsWith("bw.")) { + int[] ids = OreDictionary.getOreIDs(itemStack); + for (int id : ids) { + String oreName = OreDictionary.getOreName(id); + for (Map.Entry entry : BW_OREDICT_TEMPLATES.entrySet()) { + if (oreName.startsWith(entry.getKey())) { + String material = prettifyMaterialName( + oreName.substring( + entry.getKey() + .length())); + return entry.getValue() + .replace("%material", material); + } + } + } + } + + // === 3. Werkstoff casings === if (localizationKey != null && (localizationKey.startsWith("bw.werkstoffblockscasing.") || localizationKey.startsWith("bw.werkstoffblockscasingadvanced."))) { int meta = itemStack.getItemDamage(); @@ -211,7 +210,7 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe } } - // === 3. Werkstoff blocks === + // === 4. Werkstoff blocks === if (localizationKey != null && localizationKey.startsWith("bw.werkstoffblocks.")) { int[] ids = OreDictionary.getOreIDs(itemStack); for (int id : ids) { @@ -232,7 +231,7 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe if (w != null) return w.getDefaultName() + " Block"; } - // === 4. bwMetaGenerated === + // === 5. bwMetaGenerated === if (localizationKey != null && localizationKey.startsWith("gt.bwMetaGenerated")) { int[] ids = OreDictionary.getOreIDs(itemStack); for (int id : ids) { @@ -257,10 +256,18 @@ private String getOriginalEnglishName(ItemStack itemStack, String localizationKe return null; } - // === Основной обработчик тултипов === + // === Main Tooltip Handler === @SubscribeEvent public void onItemTooltip(ItemTooltipEvent event) { - if (!TOOLTIPS_ENABLED) return; + // Check global flag + if (!GTItemUntranslator.tooltipsEnabled) return; + + // Skip if client language is already English + String langCode = Minecraft.getMinecraft() + .getLanguageManager() + .getCurrentLanguage() + .getLanguageCode(); + if ("en_us".equalsIgnoreCase(langCode)) return; ItemStack itemStack = event.itemStack; if (itemStack == null || itemStack.getItem() == null) return; @@ -268,11 +275,6 @@ public void onItemTooltip(ItemTooltipEvent event) { try { // === Fluids === if (itemStack.getItem() instanceof gregtech.common.items.ItemFluidDisplay) { - int meta = itemStack.getItemDamage(); - debug( - "[Tooltip] Fluid item detected: class=" + itemStack.getItem() - .getClass() - .getName() + ", meta=" + meta); String originalEnglishName = getOriginalEnglishName(itemStack, null); if (originalEnglishName != null) { event.toolTip.add(EnumChatFormatting.GRAY + "[EN] " + originalEnglishName); @@ -280,7 +282,7 @@ public void onItemTooltip(ItemTooltipEvent event) { return; } - // === Обычные предметы === + // === Regular items === String unloc = itemStack.getUnlocalizedName(); PrefixRule rule = matchPrefix(unloc); if (rule != null) { @@ -297,4 +299,10 @@ public void onItemTooltip(ItemTooltipEvent event) { t.printStackTrace(); } } + + // === Public static access for Waila === + public static String getOriginalEnglishNameStatic(ItemStack stack, String localizationKey) { + TooltipEventHandler handler = new TooltipEventHandler(); + return handler.getOriginalEnglishName(stack, localizationKey); + } } diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/waila/DataProvider.java b/src/main/java/com/teroblaze/gtitemuntranslator/waila/DataProvider.java new file mode 100644 index 0000000..d185ccd --- /dev/null +++ b/src/main/java/com/teroblaze/gtitemuntranslator/waila/DataProvider.java @@ -0,0 +1,91 @@ +package com.teroblaze.gtitemuntranslator.waila; + +import java.util.List; + +import net.minecraft.block.Block; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.util.MovingObjectPosition; +import net.minecraft.world.World; + +import com.teroblaze.gtitemuntranslator.GTItemUntranslator; +import com.teroblaze.gtitemuntranslator.TooltipEventHandler; + +import mcp.mobius.waila.api.IWailaConfigHandler; +import mcp.mobius.waila.api.IWailaDataAccessor; +import mcp.mobius.waila.api.IWailaDataProvider; + +public class DataProvider implements IWailaDataProvider { + + @Override + public ItemStack getWailaStack(IWailaDataAccessor accessor, IWailaConfigHandler config) { + return null; + } + + @Override + public List getWailaHead(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + // Check global flag + if (!GTItemUntranslator.wailaEnabled) return currenttip; + + // Skip if client language is already English + String langCode = Minecraft.getMinecraft() + .getLanguageManager() + .getCurrentLanguage() + .getLanguageCode(); + if ("en_us".equalsIgnoreCase(langCode)) return currenttip; + + try { + TileEntity te = accessor.getTileEntity(); + if (te != null) { + Block block = accessor.getBlock(); + int x = accessor.getPosition().blockX; + int y = accessor.getPosition().blockY; + int z = accessor.getPosition().blockZ; + + // Simulate middle-click (pick block) to obtain an ItemStack representation of the block + ItemStack pick = block.getPickBlock( + new MovingObjectPosition(x, y, z, 1, accessor.getRenderingPosition(), false), + accessor.getWorld(), + x, + y, + z); + + if (pick != null) { + String unloc = pick.getUnlocalizedName(); + String englishName = TooltipEventHandler.getOriginalEnglishNameStatic(pick, unloc + ".name"); + + if (englishName != null && !englishName.equals(unloc)) { + currenttip.add("[EN] " + englishName); + } + } + } + } catch (Throwable t) { + System.err.println("[GT Item Untranslator][Waila] Exception while resolving English name:"); + t.printStackTrace(); + } + + return currenttip; + } + + @Override + public List getWailaBody(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + return currenttip; + } + + @Override + public List getWailaTail(ItemStack itemStack, List currenttip, IWailaDataAccessor accessor, + IWailaConfigHandler config) { + return currenttip; + } + + @Override + public NBTTagCompound getNBTData(EntityPlayerMP player, TileEntity te, NBTTagCompound tag, World world, int x, + int y, int z) { + return tag; + } +} diff --git a/src/main/java/com/teroblaze/gtitemuntranslator/waila/WailaRegister.java b/src/main/java/com/teroblaze/gtitemuntranslator/waila/WailaRegister.java new file mode 100644 index 0000000..5897fc0 --- /dev/null +++ b/src/main/java/com/teroblaze/gtitemuntranslator/waila/WailaRegister.java @@ -0,0 +1,13 @@ +package com.teroblaze.gtitemuntranslator.waila; + +import net.minecraft.block.Block; + +import mcp.mobius.waila.api.IWailaRegistrar; + +public class WailaRegister { + + public static void register(IWailaRegistrar registrar) { + // Register our DataProvider for the Waila head section (the top line in Waila tooltip) + registrar.registerHeadProvider(new DataProvider(), Block.class); + } +}