diff --git a/build.gradle b/build.gradle index 94ab2e7009..ef1db7c9fc 100644 --- a/build.gradle +++ b/build.gradle @@ -117,6 +117,7 @@ project(':forge') { into "$buildDir/classes/java/main" } } +// jvmArgs = ['-verbose:class'] classpath sourceSets.main.runtimeClasspath main 'net.minecraftforge.fml.LaunchTesting' systemProperties target:'fmldevclient' diff --git a/patches/minecraft/net/minecraft/client/resources/I18n.java.patch b/patches/minecraft/net/minecraft/client/resources/I18n.java.patch new file mode 100644 index 0000000000..981b15c659 --- /dev/null +++ b/patches/minecraft/net/minecraft/client/resources/I18n.java.patch @@ -0,0 +1,10 @@ +--- a/net/minecraft/client/resources/I18n.java ++++ b/net/minecraft/client/resources/I18n.java +@@ -9,6 +9,7 @@ + + static void setLocale(Locale i18nLocaleIn) { + i18nLocale = i18nLocaleIn; ++ net.minecraftforge.fml.ForgeI18n.loadLanguageData(i18nLocale.properties); + } + + public static String format(String translateKey, Object... parameters) { diff --git a/src/main/java/net/minecraftforge/common/ForgeMod.java b/src/main/java/net/minecraftforge/common/ForgeMod.java index 2f24f339eb..81f5044ec2 100644 --- a/src/main/java/net/minecraftforge/common/ForgeMod.java +++ b/src/main/java/net/minecraftforge/common/ForgeMod.java @@ -88,8 +88,6 @@ public class ForgeMod implements WorldPersistenceHooks.WorldPersistenceHook public static boolean fixVanillaCascading = false; // There are various places in vanilla that cause cascading worldgen. Enabling this WILL change where blocks are placed to prevent this. // DO NOT contact Forge about worldgen not 'matching' vanilla if this flag is set. - static final Logger log = LogManager.getLogger(ForgeVersion.MOD_ID); - private static Configuration config; private static ForgeMod INSTANCE; public static ForgeMod getInstance() diff --git a/src/main/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java b/src/main/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java index f6d4a74e90..df442bb570 100644 --- a/src/main/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java +++ b/src/main/java/net/minecraftforge/common/asm/RuntimeEnumExtender.java @@ -20,6 +20,7 @@ package net.minecraftforge.common.asm; import java.nio.file.Path; +import net.minecraftforge.fml.AdvancedLogMessageAdapter; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.objectweb.asm.Opcodes; @@ -65,7 +66,7 @@ public class RuntimeEnumExtender implements ILaunchPluginService { if ((classNode.access & Opcodes.ACC_ENUM) == 0) return classNode; - Type array = Type.getType("[" + classType.getInternalName()); + Type array = Type.getType("[" + classType.getDescriptor()); final int flags = Opcodes.ACC_PRIVATE | Opcodes.ACC_STATIC | Opcodes.ACC_FINAL | Opcodes.ACC_SYNTHETIC; FieldNode values = classNode.fields.stream().filter(f -> f.desc.contentEquals(array.getDescriptor()) && ((f.access & flags) == flags)).findFirst().orElse(null); @@ -87,16 +88,21 @@ public class RuntimeEnumExtender implements ILaunchPluginService { MethodNode ctr = classNode.methods.stream().filter(m -> m.name.equals("") && m.desc.equals(desc)).findFirst().orElse(null); if (ctr == null) { - LOGGER.error("Enum has create method with no matching constructor:"); - LOGGER.error(" Target: " + desc); - classNode.methods.stream().filter(m -> m.name.equals("")).forEach(m -> LOGGER.error(" :" + m.desc)); + LOGGER.error(()->new AdvancedLogMessageAdapter(sb-> { + sb.append("Enum has create method with no matching constructor:\n"); + sb.append(" Target: ").append(desc).append("\n"); + classNode.methods.stream().filter(m -> m.name.equals("")).forEach(m -> sb.append(" :").append(m.desc).append("\n")); + })); throw new IllegalStateException("Enum has create method with no matching constructor: " + desc); } if (values == null) { - LOGGER.error("Enum has create method but we could not find $VALUES:"); - classNode.fields.stream().filter(f -> (f.access & Opcodes.ACC_STATIC) != 0).forEach(m -> LOGGER.error(" " + m.name + " " + m.desc)); + LOGGER.error(()->new AdvancedLogMessageAdapter(sb-> { + sb.append("Enum has create method but we could not find $VALUES. Found:\n"); + classNode.fields.stream().filter(f -> (f.access & Opcodes.ACC_STATIC) != 0). + forEach(m -> sb.append(" ").append(m.name).append(" ").append(m.desc).append("\n")); + })); throw new IllegalStateException("Enum has create method but we could not find $VALUES"); } @@ -109,17 +115,18 @@ public class RuntimeEnumExtender implements ILaunchPluginService { ins.dup(); ins.load(0, STRING); ins.getstatic(classType.getInternalName(), values.name, values.desc); + ins.arraylength(); ins.iconst(1); ins.add(Type.INT_TYPE); for (int x = 1; x < args.length; x++) ins.load(x, args[x]); - ins.invokespecial(classType.getDescriptor(), "", desc, false); + ins.invokespecial(classType.getInternalName(), "", desc, false); ins.store(1, classType); // VALUES = ArrayUtils.add(VALUES, ret) ins.getstatic(classType.getInternalName(), values.name, values.desc); ins.load(1, classType); - ins.invokestatic(ARRAY_UTILS.getDescriptor(), "add", ADD_DESC, false); - ins.checkcast(array); + ins.invokestatic(ARRAY_UTILS.getInternalName(), "add", ADD_DESC, false); + ins.checkcast(Type.getType(values.desc)); ins.putstatic(classType.getInternalName(), values.name, values.desc); //EnumHelper.cleanEnumCache(ThisType.class) ins.visitLdcInsn(classType); diff --git a/src/main/java/net/minecraftforge/fml/AdvancedLogMessageAdapter.java b/src/main/java/net/minecraftforge/fml/AdvancedLogMessageAdapter.java new file mode 100644 index 0000000000..369b4dcca9 --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/AdvancedLogMessageAdapter.java @@ -0,0 +1,41 @@ +package net.minecraftforge.fml; + +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.util.StringBuilderFormattable; + +import java.util.function.Consumer; + +public class AdvancedLogMessageAdapter implements Message, StringBuilderFormattable { + private static final Object[] EMPTY = new Object[0]; + + private final Consumer logMessageBuilder; + + public AdvancedLogMessageAdapter(final Consumer logMessageBuilder) { + this.logMessageBuilder = logMessageBuilder; + } + + @Override + public String getFormattedMessage() { + return ""; + } + + @Override + public String getFormat() { + return ""; + } + + @Override + public Object[] getParameters() { + return EMPTY; + } + + @Override + public Throwable getThrowable() { + return null; + } + + @Override + public void formatTo(final StringBuilder buffer) { + logMessageBuilder.accept(buffer); + } +} diff --git a/src/main/java/net/minecraftforge/fml/BrandingControl.java b/src/main/java/net/minecraftforge/fml/BrandingControl.java index 80b6c901d4..a1019008ca 100644 --- a/src/main/java/net/minecraftforge/fml/BrandingControl.java +++ b/src/main/java/net/minecraftforge/fml/BrandingControl.java @@ -22,7 +22,6 @@ package net.minecraftforge.fml; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; import net.minecraftforge.common.ForgeVersion; -import net.minecraftforge.fml.ModList; import java.text.MessageFormat; import java.util.Arrays; @@ -47,7 +46,7 @@ public class BrandingControl brd.add("Forge " + ForgeVersion.getVersion()); int tModCount = ModList.get().size(); - brd.add(MessageFormat.format("{0,choice,0#No mods|1#1 mod|1<{0} mods} loaded", tModCount)); + brd.add(MessageFormat.format(ForgeI18n.getPattern("fml.menu.loadingmods"), tModCount)); brandings = brd.build(); brandingsNoMC = brandings.subList(1, brandings.size()); } diff --git a/src/main/java/net/minecraftforge/fml/ForgeI18n.java b/src/main/java/net/minecraftforge/fml/ForgeI18n.java new file mode 100644 index 0000000000..1faf950ddd --- /dev/null +++ b/src/main/java/net/minecraftforge/fml/ForgeI18n.java @@ -0,0 +1,15 @@ +package net.minecraftforge.fml; + +import java.util.Map; + +public class ForgeI18n { + private static Map i18n; + + static String getPattern(final String patternName) { + return i18n.get(patternName); + } + + public static void loadLanguageData(final Map properties) { + i18n = properties; + } +} diff --git a/src/main/java/net/minecraftforge/fml/client/ResourcePackLoader.java b/src/main/java/net/minecraftforge/fml/client/ResourcePackLoader.java index 1be4373f7a..d66d10789b 100644 --- a/src/main/java/net/minecraftforge/fml/client/ResourcePackLoader.java +++ b/src/main/java/net/minecraftforge/fml/client/ResourcePackLoader.java @@ -46,7 +46,8 @@ public class ResourcePackLoader public static IResourcePack getResourcePackFor(String modId) { - return modResourcePacks.get(ModList.get().getModFileById(modId).getFile()); + if (modId == "forge") return forgePack; + else return modResourcePacks.get(ModList.get().getModFileById(modId).getFile()); } @SuppressWarnings("unchecked") diff --git a/src/main/java/net/minecraftforge/fml/common/DuplicateModsFoundException.java b/src/main/java/net/minecraftforge/fml/common/DuplicateModsFoundException.java index c708ae10a8..23a67267e4 100644 --- a/src/main/java/net/minecraftforge/fml/common/DuplicateModsFoundException.java +++ b/src/main/java/net/minecraftforge/fml/common/DuplicateModsFoundException.java @@ -30,7 +30,7 @@ import net.minecraftforge.fml.ModContainer; import net.minecraftforge.fml.client.IDisplayableError; import net.minecraftforge.fml.client.gui.GuiDupesFound; -public class DuplicateModsFoundException extends LoaderException implements IDisplayableError +public class DuplicateModsFoundException extends LoaderException { private static final long serialVersionUID = 1L; public SetMultimap dupes; @@ -38,22 +38,4 @@ public class DuplicateModsFoundException extends LoaderException implements IDis public DuplicateModsFoundException(SetMultimap dupes) { this.dupes = dupes; } - - @Override - protected void printStackTrace(WrappedPrintStream stream) - { - stream.println("Duplicate Mods:"); - for (Entry e : dupes.entries()) - { - stream.println(String.format("\t%s : %s", e.getKey().getModId(), e.getValue().getAbsolutePath())); - } - stream.println(""); - } - - @Override - @OnlyIn(Dist.CLIENT) - public GuiScreen createGui() - { - return new GuiDupesFound(this); - } } diff --git a/src/main/resources/assets/forge/lang/en_us.json b/src/main/resources/assets/forge/lang/en_us.json new file mode 100644 index 0000000000..74fd7464c2 --- /dev/null +++ b/src/main/resources/assets/forge/lang/en_us.json @@ -0,0 +1,10 @@ +{ + "fml.menu.mods": "Mods", + "fml.menu.mods.normal": "Off", + "fml.menu.mods.search": "Search", + "fml.menu.mods.a_to_z": "A-Z", + "fml.menu.mods.z_to_a": "Z-A", + "fml.menu.mods.config": "Config", + "fml.menu.modoptions": "Mod Options...", + "fml.menu.loadingmods": "{0,choice,0#No mods|1#1 mod|1<{0} mods} loaded" +}