From fe747833a7276f87757becc872ac59db026c9afc Mon Sep 17 00:00:00 2001 From: warjort Date: Thu, 27 May 2021 11:05:53 +0100 Subject: [PATCH 1/5] Add vanilla dusts to dustRegular --- .../gregtech/api/items/materialitem/MaterialMetaItem.java | 2 +- src/main/java/gregtech/api/unification/ore/OrePrefix.java | 2 ++ src/main/java/gregtech/loaders/OreDictionaryLoader.java | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) mode change 100644 => 100755 src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java mode change 100644 => 100755 src/main/java/gregtech/api/unification/ore/OrePrefix.java mode change 100644 => 100755 src/main/java/gregtech/loaders/OreDictionaryLoader.java diff --git a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java old mode 100644 new mode 100755 index ab4ce2fac5..43e5d2c214 --- a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java +++ b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java @@ -57,7 +57,7 @@ public void registerOreDict() { ItemStack item = new ItemStack(this, 1, metaItem); OreDictUnifier.registerOre(item, prefix, material); if(prefix.name().equals("dust")) - OreDictUnifier.registerOre(item, "dustRegular", material); + OreDictUnifier.registerOre(item, OrePrefix.DUST_REGULAR, material); items.add(item); } diff --git a/src/main/java/gregtech/api/unification/ore/OrePrefix.java b/src/main/java/gregtech/api/unification/ore/OrePrefix.java old mode 100644 new mode 100755 index 22ff51ae64..b330c01c6a --- a/src/main/java/gregtech/api/unification/ore/OrePrefix.java +++ b/src/main/java/gregtech/api/unification/ore/OrePrefix.java @@ -161,6 +161,8 @@ public enum OrePrefix { circuit("Circuits", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null), // Introduced by Calclavia chipset("Chipsets", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null); // Introduced by Buildcraft + public static final String DUST_REGULAR = "dustRegular"; + public static class Flags { public static final long ENABLE_UNIFICATION = GTUtility.createFlag(0); public static final long SELF_REFERENCING = GTUtility.createFlag(1); diff --git a/src/main/java/gregtech/loaders/OreDictionaryLoader.java b/src/main/java/gregtech/loaders/OreDictionaryLoader.java old mode 100644 new mode 100755 index e2e00bf306..02e46c8e5a --- a/src/main/java/gregtech/loaders/OreDictionaryLoader.java +++ b/src/main/java/gregtech/loaders/OreDictionaryLoader.java @@ -67,13 +67,19 @@ public static void init() { OreDictUnifier.registerOre(new ItemStack(Items.IRON_INGOT), OrePrefix.ingot, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Items.PAPER), OrePrefix.plate, Materials.Paper); OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.dust, Materials.Sugar); + OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.DUST_REGULAR, Materials.Sugar); OreDictUnifier.registerOre(new ItemStack(Items.STICK), OrePrefix.stick, Materials.Wood); OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.dust, Materials.Redstone); + OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.DUST_REGULAR, Materials.Redstone); OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.dust, Materials.Gunpowder); + OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.DUST_REGULAR, Materials.Gunpowder); OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.dust, Materials.Glowstone); + OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.DUST_REGULAR, Materials.Glowstone); OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.dust, Materials.Bone); + OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.DUST_REGULAR, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BONE), OrePrefix.stick, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.dust, Materials.Blaze); + OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.DUST_REGULAR, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_ROD), OrePrefix.stick, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Blocks.IRON_BLOCK), OrePrefix.block, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Blocks.GOLD_BLOCK), OrePrefix.block, Materials.Gold); From ad872d2229959dc229b57ffe4c0c5e4bccba8373 Mon Sep 17 00:00:00 2001 From: warjort Date: Thu, 27 May 2021 11:10:14 +0100 Subject: [PATCH 2/5] Revert "Add vanilla dusts to dustRegular" This reverts commit fe747833a7276f87757becc872ac59db026c9afc. --- .../gregtech/api/items/materialitem/MaterialMetaItem.java | 2 +- src/main/java/gregtech/api/unification/ore/OrePrefix.java | 2 -- src/main/java/gregtech/loaders/OreDictionaryLoader.java | 6 ------ 3 files changed, 1 insertion(+), 9 deletions(-) mode change 100755 => 100644 src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java mode change 100755 => 100644 src/main/java/gregtech/api/unification/ore/OrePrefix.java mode change 100755 => 100644 src/main/java/gregtech/loaders/OreDictionaryLoader.java diff --git a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java old mode 100755 new mode 100644 index 43e5d2c214..ab4ce2fac5 --- a/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java +++ b/src/main/java/gregtech/api/items/materialitem/MaterialMetaItem.java @@ -57,7 +57,7 @@ public void registerOreDict() { ItemStack item = new ItemStack(this, 1, metaItem); OreDictUnifier.registerOre(item, prefix, material); if(prefix.name().equals("dust")) - OreDictUnifier.registerOre(item, OrePrefix.DUST_REGULAR, material); + OreDictUnifier.registerOre(item, "dustRegular", material); items.add(item); } diff --git a/src/main/java/gregtech/api/unification/ore/OrePrefix.java b/src/main/java/gregtech/api/unification/ore/OrePrefix.java old mode 100755 new mode 100644 index b330c01c6a..22ff51ae64 --- a/src/main/java/gregtech/api/unification/ore/OrePrefix.java +++ b/src/main/java/gregtech/api/unification/ore/OrePrefix.java @@ -161,8 +161,6 @@ public enum OrePrefix { circuit("Circuits", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null), // Introduced by Calclavia chipset("Chipsets", -1, null, null, ENABLE_UNIFICATION | DISALLOW_RECYCLING, null); // Introduced by Buildcraft - public static final String DUST_REGULAR = "dustRegular"; - public static class Flags { public static final long ENABLE_UNIFICATION = GTUtility.createFlag(0); public static final long SELF_REFERENCING = GTUtility.createFlag(1); diff --git a/src/main/java/gregtech/loaders/OreDictionaryLoader.java b/src/main/java/gregtech/loaders/OreDictionaryLoader.java old mode 100755 new mode 100644 index 02e46c8e5a..e2e00bf306 --- a/src/main/java/gregtech/loaders/OreDictionaryLoader.java +++ b/src/main/java/gregtech/loaders/OreDictionaryLoader.java @@ -67,19 +67,13 @@ public static void init() { OreDictUnifier.registerOre(new ItemStack(Items.IRON_INGOT), OrePrefix.ingot, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Items.PAPER), OrePrefix.plate, Materials.Paper); OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.dust, Materials.Sugar); - OreDictUnifier.registerOre(new ItemStack(Items.SUGAR), OrePrefix.DUST_REGULAR, Materials.Sugar); OreDictUnifier.registerOre(new ItemStack(Items.STICK), OrePrefix.stick, Materials.Wood); OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.dust, Materials.Redstone); - OreDictUnifier.registerOre(new ItemStack(Items.REDSTONE), OrePrefix.DUST_REGULAR, Materials.Redstone); OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.dust, Materials.Gunpowder); - OreDictUnifier.registerOre(new ItemStack(Items.GUNPOWDER), OrePrefix.DUST_REGULAR, Materials.Gunpowder); OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.dust, Materials.Glowstone); - OreDictUnifier.registerOre(new ItemStack(Items.GLOWSTONE_DUST), OrePrefix.DUST_REGULAR, Materials.Glowstone); OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.dust, Materials.Bone); - OreDictUnifier.registerOre(new ItemStack(Items.DYE, 1, 15), OrePrefix.DUST_REGULAR, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BONE), OrePrefix.stick, Materials.Bone); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.dust, Materials.Blaze); - OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_POWDER), OrePrefix.DUST_REGULAR, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Items.BLAZE_ROD), OrePrefix.stick, Materials.Blaze); OreDictUnifier.registerOre(new ItemStack(Blocks.IRON_BLOCK), OrePrefix.block, Materials.Iron); OreDictUnifier.registerOre(new ItemStack(Blocks.GOLD_BLOCK), OrePrefix.block, Materials.Gold); From cfd33b209a77017d92bbbe58bfbf0cfd0aee10dd Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 13 Jun 2021 22:25:28 +0100 Subject: [PATCH 3/5] An enhanced TextComponentTranslation --- .../EnhancedTextComponentSerializer.java | 98 +++++++++++++++ .../EnhancedTextComponentTranslation.java | 118 ++++++++++++++++++ .../api/gui/widgets/AdvancedTextWidget.java | 6 +- .../resources/assets/gregtech/lang/en_us.lang | 2 +- 4 files changed, 221 insertions(+), 3 deletions(-) create mode 100755 src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java create mode 100755 src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java diff --git a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java new file mode 100755 index 0000000000..f87365b587 --- /dev/null +++ b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java @@ -0,0 +1,98 @@ +package gregtech.api.gui.translation; + +import java.lang.reflect.Type; + +import javax.annotation.Nullable; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonElement; +import com.google.gson.JsonParseException; + +import net.minecraft.util.EnumTypeAdapterFactory; +import net.minecraft.util.JsonUtils; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.Style; +import net.minecraft.util.text.TextComponentTranslation; + +public class EnhancedTextComponentSerializer extends ITextComponent.Serializer { + + private static final Gson GSON; + + @Override + public ITextComponent deserialize(final JsonElement element, final Type type, final JsonDeserializationContext context) throws JsonParseException { + final ITextComponent superResult = super.deserialize(element, type, context); + if (!(superResult instanceof TextComponentTranslation)) { + return superResult; + } + final TextComponentTranslation original = (TextComponentTranslation) superResult; + final EnhancedTextComponentTranslation result = new EnhancedTextComponentTranslation(original.getKey(), fixArgs(original.getFormatArgs())); + for (ITextComponent sibling : original.getSiblings()) { + result.appendSibling(sibling); + } + return result; + } + + // FIXME: This is hacky + private static Object[] fixArgs(Object[] original) { + final Object[] result = new Object[original.length]; + for (int i = 0; i < original.length; ++i) { + if (original[i] instanceof String) { + try { + result[i] = Long.valueOf((String) original[i]); + continue; + } catch (@SuppressWarnings("unused") NumberFormatException ignored) { + // Not an integer + } + try { + result[i] = Double.valueOf((String) original[i]); + continue; + } catch (@SuppressWarnings("unused") NumberFormatException ignored) { + // Not a double + } + } else { + result[i] = original[i]; + } + } + return result; + } + + /** + * Serializes a component into JSON. + */ + public static String componentToJson(final ITextComponent component) { + return GSON.toJson(component); + } + + /** + * Parses a JSON string into a {@link ITextComponent}, with strict parsing. + * + * @see #fromJsonLenient(String) + * @see {@link com.google.gson.stream.JsonReader#setLenient(boolean)} + */ + @Nullable + public static ITextComponent jsonToComponent(final String json) { + return JsonUtils.gsonDeserialize(GSON, json, ITextComponent.class, false); + } + + /** + * Parses a JSON string into a {@link ITextComponent}, being lenient upon parse + * errors. + * + * @see #jsonToComponent(String) + * @see {@link com.google.gson.stream.JsonReader#setLenient(boolean)} + */ + @Nullable + public static ITextComponent fromJsonLenient(final String json) { + return JsonUtils.gsonDeserialize(GSON, json, ITextComponent.class, true); + } + + static { + GsonBuilder gsonbuilder = new GsonBuilder(); + gsonbuilder.registerTypeHierarchyAdapter(ITextComponent.class, new EnhancedTextComponentSerializer()); + gsonbuilder.registerTypeHierarchyAdapter(Style.class, new Style.Serializer()); + gsonbuilder.registerTypeAdapterFactory(new EnumTypeAdapterFactory()); + GSON = gsonbuilder.create(); + } +} diff --git a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java new file mode 100755 index 0000000000..9ec42b304d --- /dev/null +++ b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java @@ -0,0 +1,118 @@ +package gregtech.api.gui.translation; + +import java.util.IllegalFormatException; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.util.text.TextComponentTranslation; +import net.minecraft.util.text.TextComponentTranslationFormatException; +import net.minecraftforge.fml.common.ObfuscationReflectionHelper; + +public class EnhancedTextComponentTranslation extends TextComponentTranslation { + + public static final Pattern ENHANCED_STRING_VARIABLE_PATTERN = Pattern.compile("%(\\\\d+\\\\$)?([-#+ 0,(\\\\<]*)?(\\\\d+)?(\\\\.\\\\d+)?([tT])?([a-zA-Z%])"); + + private final List copyChildren; + + public EnhancedTextComponentTranslation(final String translationKey, final Object... args) { + super(translationKey, args); + this.copyChildren = ObfuscationReflectionHelper.getPrivateValue(TextComponentTranslation.class, this, "children"); + } + + @Override + protected void initializeFromFormat(final String format) { + final Matcher matcher = ENHANCED_STRING_VARIABLE_PATTERN.matcher(format); + int argIndex = 0; + int start = 0; + Object[] formatArgs = getFormatArgs(); + + try { + int end; + + for (; matcher.find(start); start = end) { + final int found = matcher.start(); + end = matcher.end(); + + // Text before the first % + if (found > start) { + final TextComponentString text = new TextComponentString(String.format(format.substring(start, found))); + text.getStyle().setParentStyle(this.getStyle()); + this.copyChildren.add(text); + } + + final String formatOption = matcher.group(6); + final String string = format.substring(found, end); + + // Escape sequence %% + if ("%".equals(formatOption) && "%%".equals(string)) { + final TextComponentString text = new TextComponentString("%"); + text.getStyle().setParentStyle(this.getStyle()); + this.copyChildren.add(text); + } else { + // Argument number specifier + final String arg = matcher.group(1); + final int index = arg != null ? Integer.parseInt(arg) - 1 : argIndex++; + + if (index < formatArgs.length) { + final Object object = formatArgs[index]; + final ITextComponent text; + if (object == null) { + text = new TextComponentString("null"); + } + else if (object instanceof ITextComponent) { + text = (ITextComponent) object; + } else { + // Concatenate all the format options except the index specifier + final StringBuilder builder = new StringBuilder(); + builder.append('%'); + // groupCount doesn't include group 0 hence <= + for (int g = 2; g <= matcher.groupCount(); ++g) { + final String group = matcher.group(g); + if (group != null) { + builder.append(group); + } + } + text = new TextComponentString(String.format(builder.toString(), formatArgs[index])); + } + text.getStyle().setParentStyle(this.getStyle()); + this.copyChildren.add(text); + } + } + } + + // Trailing text + if (start < format.length()) { + final TextComponentString text = new TextComponentString(String.format(format.substring(start))); + text.getStyle().setParentStyle(this.getStyle()); + this.copyChildren.add(text); + } + } catch (IllegalFormatException e) { + throw new TextComponentTranslationFormatException(this, e); + } + } + + @Override + public EnhancedTextComponentTranslation createCopy() { + final Object[] formatArgs = getFormatArgs(); + final Object[] copyArgs = new Object[formatArgs.length]; + + for (int i = 0; i < formatArgs.length; ++i) { + if (formatArgs[i] instanceof ITextComponent) { + copyArgs[i] = ((ITextComponent) formatArgs[i]).createCopy(); + } else { + copyArgs[i] = formatArgs[i]; + } + } + + final EnhancedTextComponentTranslation copy = new EnhancedTextComponentTranslation(getKey(), copyArgs); + copy.setStyle(this.getStyle().createShallowCopy()); + + for (ITextComponent sibling : this.getSiblings()) { + copy.appendSibling(sibling.createCopy()); + } + return copy; + } +} diff --git a/src/main/java/gregtech/api/gui/widgets/AdvancedTextWidget.java b/src/main/java/gregtech/api/gui/widgets/AdvancedTextWidget.java index 5dbd6a25b9..c3a4f6697f 100644 --- a/src/main/java/gregtech/api/gui/widgets/AdvancedTextWidget.java +++ b/src/main/java/gregtech/api/gui/widgets/AdvancedTextWidget.java @@ -2,6 +2,8 @@ import gregtech.api.gui.IRenderContext; import gregtech.api.gui.Widget; +import gregtech.api.gui.translation.EnhancedTextComponentSerializer; +import gregtech.api.gui.translation.EnhancedTextComponentTranslation; import gregtech.api.util.Position; import gregtech.api.util.Size; import net.minecraft.client.Minecraft; @@ -113,7 +115,7 @@ public void detectAndSendChanges() { writeUpdateInfo(1, buffer -> { buffer.writeVarInt(displayText.size()); for (ITextComponent textComponent : displayText) { - buffer.writeString(ITextComponent.Serializer.componentToJson(textComponent)); + buffer.writeString(EnhancedTextComponentSerializer.componentToJson(textComponent)); } }); } @@ -169,7 +171,7 @@ public void readUpdateInfo(int id, PacketBuffer buffer) { int count = buffer.readVarInt(); for (int i = 0; i < count; i++) { String jsonText = buffer.readString(32767); - this.displayText.add(ITextComponent.Serializer.jsonToComponent(jsonText)); + this.displayText.add(EnhancedTextComponentSerializer.jsonToComponent(jsonText)); } formatDisplayText(); updateComponentTextSize(); diff --git a/src/main/resources/assets/gregtech/lang/en_us.lang b/src/main/resources/assets/gregtech/lang/en_us.lang index a76b1021e7..19de5ef8be 100755 --- a/src/main/resources/assets/gregtech/lang/en_us.lang +++ b/src/main/resources/assets/gregtech/lang/en_us.lang @@ -2945,7 +2945,7 @@ gregtech.multiblock.invalid_structure=Invalid structure. gregtech.multiblock.invalid_structure.tooltip=This block is a controller of the multiblock structure. For building help, see structure template in JEI gregtech.multiblock.validation_failed=Invalid amount of inputs/outputs. gregtech.multiblock.max_energy_per_tick=Max EU/t: %s (%s) -gregtech.multiblock.generation_eu=Outputting: %s EU/t +gregtech.multiblock.generation_eu=Outputting: %,d EU/t gregtech.multiblock.blast_furnace.max_temperature=Max Temperature: %sK gregtech.multiblock.multi_furnace.heating_coil_level=Heating Coil Level: %s From af696f801fcb9fe0c61a6271420809ef5d1d25fa Mon Sep 17 00:00:00 2001 From: warjort Date: Sun, 13 Jun 2021 23:09:21 +0100 Subject: [PATCH 4/5] Tidyup default behaviour to avoid logic holes --- .../api/gui/translation/EnhancedTextComponentSerializer.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java index f87365b587..076e38873c 100755 --- a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java +++ b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java @@ -38,6 +38,7 @@ public ITextComponent deserialize(final JsonElement element, final Type type, fi private static Object[] fixArgs(Object[] original) { final Object[] result = new Object[original.length]; for (int i = 0; i < original.length; ++i) { + result[i] = original[i]; if (original[i] instanceof String) { try { result[i] = Long.valueOf((String) original[i]); @@ -51,8 +52,6 @@ private static Object[] fixArgs(Object[] original) { } catch (@SuppressWarnings("unused") NumberFormatException ignored) { // Not a double } - } else { - result[i] = original[i]; } } return result; From 970c8cafa3a7a5154281c0bb185d9f833695abc1 Mon Sep 17 00:00:00 2001 From: warjort Date: Tue, 15 Jun 2021 08:07:43 +0100 Subject: [PATCH 5/5] Move the argument fixing to when we know the format option --- .../EnhancedTextComponentSerializer.java | 25 +------------------ .../EnhancedTextComponentTranslation.java | 21 ++++++++++++++-- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java index 076e38873c..539e71084c 100755 --- a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java +++ b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentSerializer.java @@ -27,36 +27,13 @@ public ITextComponent deserialize(final JsonElement element, final Type type, fi return superResult; } final TextComponentTranslation original = (TextComponentTranslation) superResult; - final EnhancedTextComponentTranslation result = new EnhancedTextComponentTranslation(original.getKey(), fixArgs(original.getFormatArgs())); + final EnhancedTextComponentTranslation result = new EnhancedTextComponentTranslation(original.getKey(), original.getFormatArgs()); for (ITextComponent sibling : original.getSiblings()) { result.appendSibling(sibling); } return result; } - // FIXME: This is hacky - private static Object[] fixArgs(Object[] original) { - final Object[] result = new Object[original.length]; - for (int i = 0; i < original.length; ++i) { - result[i] = original[i]; - if (original[i] instanceof String) { - try { - result[i] = Long.valueOf((String) original[i]); - continue; - } catch (@SuppressWarnings("unused") NumberFormatException ignored) { - // Not an integer - } - try { - result[i] = Double.valueOf((String) original[i]); - continue; - } catch (@SuppressWarnings("unused") NumberFormatException ignored) { - // Not a double - } - } - } - return result; - } - /** * Serializes a component into JSON. */ diff --git a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java index 9ec42b304d..3e9b3b3c99 100755 --- a/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java +++ b/src/main/java/gregtech/api/gui/translation/EnhancedTextComponentTranslation.java @@ -75,7 +75,7 @@ else if (object instanceof ITextComponent) { builder.append(group); } } - text = new TextComponentString(String.format(builder.toString(), formatArgs[index])); + text = new TextComponentString(String.format(builder.toString(), fixArg(formatOption, object))); } text.getStyle().setParentStyle(this.getStyle()); this.copyChildren.add(text); @@ -89,11 +89,28 @@ else if (object instanceof ITextComponent) { text.getStyle().setParentStyle(this.getStyle()); this.copyChildren.add(text); } - } catch (IllegalFormatException e) { + } catch (IllegalFormatException | NumberFormatException e) { throw new TextComponentTranslationFormatException(this, e); } } + private static Object fixArg(final String formatOption, final Object original) { + if (original instanceof String) { + final String string = (String) original; + // Short circuit common case + if ("s".equals(formatOption)) { + return string; + } + if ("d".equals(formatOption) || "o".equals(formatOption) || "x".equalsIgnoreCase(formatOption)) { + return Long.valueOf(string); + } + if ("e".equalsIgnoreCase(formatOption) || "f".equals(formatOption) || "g".equalsIgnoreCase(formatOption) || "a".equalsIgnoreCase(formatOption)) { + return Double.valueOf(string); + } + } + return original; + } + @Override public EnhancedTextComponentTranslation createCopy() { final Object[] formatArgs = getFormatArgs();