From ef29245f80c9e400c0ea1f740078f21f18710b5a Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Mon, 9 Feb 2026 14:53:42 +0800 Subject: [PATCH 1/3] feat: add some loader utils --- src/main/java/cam72cam/mod/ModCore.java | 27 ++++++++++++++++++- .../java/cam72cam/mod/UMCMixinPlugin.java | 4 ++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/main/java/cam72cam/mod/ModCore.java b/src/main/java/cam72cam/mod/ModCore.java index ed924e90..aceb1529 100644 --- a/src/main/java/cam72cam/mod/ModCore.java +++ b/src/main/java/cam72cam/mod/ModCore.java @@ -20,7 +20,6 @@ import net.minecraft.client.resources.FolderResourcePack; import net.minecraft.client.resources.IResourcePack; import net.minecraft.client.resources.SimpleReloadableResourceManager; -import net.minecraft.world.World; import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod.EventHandler; import net.minecraftforge.fml.common.SidedProxy; @@ -28,6 +27,7 @@ import net.minecraftforge.fml.common.event.FMLPostInitializationEvent; import net.minecraftforge.fml.common.event.FMLPreInitializationEvent; import net.minecraftforge.fml.common.event.FMLServerStartedEvent; +import net.minecraftforge.fml.relauncher.CoreModManager; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.io.FileUtils; @@ -39,6 +39,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Field; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -371,4 +372,28 @@ public static synchronized File cacheFile(Identifier id) { usedCacheFiles.add(f); return f; } + + /* Loader Utils */ + public static String loaderBrand() { + return "forge"; + } + + public static int mcVersion() { + return 11202; + } + + private static Boolean isDev = null; + + public static boolean isDevelopmentEnvironment() { + if (isDev == null) { + try { + Field field = CoreModManager.class.getDeclaredField("deobfuscatedEnvironment"); + field.setAccessible(true); + isDev = field.getBoolean(null); + } catch (NoSuchFieldException | IllegalAccessException ignore) { + isDev = false; + } + } + return isDev; + } } diff --git a/src/main/java/cam72cam/mod/UMCMixinPlugin.java b/src/main/java/cam72cam/mod/UMCMixinPlugin.java index e5efbd11..78898473 100644 --- a/src/main/java/cam72cam/mod/UMCMixinPlugin.java +++ b/src/main/java/cam72cam/mod/UMCMixinPlugin.java @@ -28,7 +28,9 @@ public UMCMixinPlugin() { if (file.isFile() && !CoreModManager.getReparseableCoremods().contains(file.getName())) { //Due to FML's bad behaviour on processing FMLCorePluginContainsFMLMod we add here manually CoreModManager.getIgnoredMods().remove(file.getName()); - CoreModManager.getReparseableCoremods().add(file.getName()); + if (!ModCore.isDevelopmentEnvironment()) { + CoreModManager.getReparseableCoremods().add(file.getName()); + } } } catch (URISyntaxException e) { FMLLog.log.warn(e); From 934242b530849f4a6311e30d2b165cdd7f1ec226 Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Thu, 12 Feb 2026 23:35:34 +0800 Subject: [PATCH 2/3] feat: completely version agnostic API --- .../java/cam72cam/mod/UMCMixinPlugin.java | 6 ++ .../java/cam72cam/mod/UMCModContainer.java | 57 +++++++++++++++++++ .../java/cam72cam/mod/loading/UMCMod.java | 16 ++++++ src/main/resources/template/build.gradle | 12 ---- .../src/main/java/PACKAGEPATH/Mod.java | 16 ------ .../template/src/main/resources/mcmod.info | 16 ------ 6 files changed, 79 insertions(+), 44 deletions(-) create mode 100644 src/main/java/cam72cam/mod/UMCModContainer.java create mode 100644 src/main/java/cam72cam/mod/loading/UMCMod.java delete mode 100644 src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java delete mode 100644 src/main/resources/template/src/main/resources/mcmod.info diff --git a/src/main/java/cam72cam/mod/UMCMixinPlugin.java b/src/main/java/cam72cam/mod/UMCMixinPlugin.java index 78898473..530e914a 100644 --- a/src/main/java/cam72cam/mod/UMCMixinPlugin.java +++ b/src/main/java/cam72cam/mod/UMCMixinPlugin.java @@ -1,8 +1,11 @@ package cam72cam.mod; +import cam72cam.mod.loading.UMCMod; import net.minecraftforge.fml.common.FMLLog; +import net.minecraftforge.fml.common.ModContainerFactory; import net.minecraftforge.fml.relauncher.CoreModManager; import net.minecraftforge.fml.relauncher.IFMLLoadingPlugin; +import org.objectweb.asm.Type; import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.Mixins; @@ -36,6 +39,9 @@ public UMCMixinPlugin() { FMLLog.log.warn(e); } } + + //Add our marker + ModContainerFactory.instance().registerContainerType(Type.getType(UMCMod.class), UMCModContainer.class); } @Override diff --git a/src/main/java/cam72cam/mod/UMCModContainer.java b/src/main/java/cam72cam/mod/UMCModContainer.java new file mode 100644 index 00000000..116abc4c --- /dev/null +++ b/src/main/java/cam72cam/mod/UMCModContainer.java @@ -0,0 +1,57 @@ +package cam72cam.mod; + +import net.minecraftforge.fml.common.FMLContainer; +import net.minecraftforge.fml.common.FMLModContainer; +import net.minecraftforge.fml.common.MetadataCollection; +import net.minecraftforge.fml.common.ModMetadata; +import net.minecraftforge.fml.common.discovery.ModCandidate; +import net.minecraftforge.fml.common.event.FMLConstructionEvent; + +import java.io.InputStream; +import java.lang.reflect.Field; +import java.util.Map; +import java.util.zip.ZipInputStream; + +/** + * Wrapper to register UMC mods in ModCore + */ +public class UMCModContainer extends FMLModContainer { + ModCandidate candidate; + + public UMCModContainer(String className, ModCandidate candidate, Map modDescriptor) { + super(className, candidate, modDescriptor); + this.candidate = candidate; + } + + @Override + public void constructMod(FMLConstructionEvent event) { + super.constructMod(event); + ModCore.register((ModCore.Mod) getMod()); + } + + @Override + public void bindMetadata(MetadataCollection mc) { + super.bindMetadata(mc); + //Then we'll override some of those + //TODO +// InputStream umcJson = new ZipInputStream(candidate.getModContainer()) + try { + + Field field = FMLModContainer.class.getDeclaredField("descriptor"); + field.setAccessible(true); + Map descriptor = (Map) field.get(this); + ModMetadata modMetadata = mc.getMetadataForId(getModId(), descriptor); + + modMetadata.modId = (String) descriptor.get("modid"); + modMetadata.name = (String) descriptor.get("name"); + modMetadata.version = (String) descriptor.get("version"); + modMetadata.autogenerated = false; + + field = FMLModContainer.class.getDeclaredField("modMetadata"); + field.setAccessible(true); + field.set(this, modMetadata); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/cam72cam/mod/loading/UMCMod.java b/src/main/java/cam72cam/mod/loading/UMCMod.java new file mode 100644 index 00000000..39a32e4a --- /dev/null +++ b/src/main/java/cam72cam/mod/loading/UMCMod.java @@ -0,0 +1,16 @@ +package cam72cam.mod.loading; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +//TODO Move into umc.json +@Retention(RetentionPolicy.RUNTIME) +public @interface UMCMod { + String modid(); + + String name(); + + String version(); + + String dependencies(); +} diff --git a/src/main/resources/template/build.gradle b/src/main/resources/template/build.gradle index 4e3e99c0..b1eb71af 100644 --- a/src/main/resources/template/build.gradle +++ b/src/main/resources/template/build.gradle @@ -33,15 +33,3 @@ dependencies { //JAR// jar.finalizedBy('reobfJar') - -processResources { - inputs.property "version", project.version - inputs.property "mcversion", project.minecraft.version - from(sourceSets.main.resources.srcDirs) { - include 'mcmod.info' - expand 'version':project.version, 'mcversion':project.minecraft.version - } - from(sourceSets.main.resources.srcDirs) { - exclude 'mcmod.info' - } -} diff --git a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java b/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java deleted file mode 100644 index 5baa1670..00000000 --- a/src/main/resources/template/src/main/java/PACKAGEPATH/Mod.java +++ /dev/null @@ -1,16 +0,0 @@ -package #PACKAGE#; - -import cam72cam.mod.ModCore; - -@net.minecraftforge.fml.common.Mod(modid = Mod.MODID, name = "#NAME#", version = "#VERSION#", dependencies = "#FORGE_STRING_DEPENDENCIES#", acceptedMinecraftVersions = "[1.12,1.13)") -public class Mod { - public static final String MODID = "#ID#"; - - static { - try { - ModCore.register(new #PACKAGE#.#CLASS#()); - } catch (Exception e) { - throw new RuntimeException("Could not load mod " + MODID, e); - } - } -} diff --git a/src/main/resources/template/src/main/resources/mcmod.info b/src/main/resources/template/src/main/resources/mcmod.info deleted file mode 100644 index 67193698..00000000 --- a/src/main/resources/template/src/main/resources/mcmod.info +++ /dev/null @@ -1,16 +0,0 @@ -[ -{ - "modid": "#ID#", - "name": "#NAME#", - "description": "", - "version": "#VERSION#", - "mcversion": "1.12.2", - "url": "", - "updateUrl": "", - "authorList": [], - "credits": "", - "logoFile": "", - "screenshots": [], - "dependencies": [] -} -] From c2ddf49e00880dae5c2051e32426c544c529725f Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Fri, 13 Feb 2026 16:14:57 +0800 Subject: [PATCH 3/3] fix: use a not that hacky way to modify metadata --- .../java/cam72cam/mod/UMCModContainer.java | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/src/main/java/cam72cam/mod/UMCModContainer.java b/src/main/java/cam72cam/mod/UMCModContainer.java index 116abc4c..ba4e0038 100644 --- a/src/main/java/cam72cam/mod/UMCModContainer.java +++ b/src/main/java/cam72cam/mod/UMCModContainer.java @@ -1,26 +1,24 @@ package cam72cam.mod; -import net.minecraftforge.fml.common.FMLContainer; import net.minecraftforge.fml.common.FMLModContainer; import net.minecraftforge.fml.common.MetadataCollection; import net.minecraftforge.fml.common.ModMetadata; import net.minecraftforge.fml.common.discovery.ModCandidate; import net.minecraftforge.fml.common.event.FMLConstructionEvent; -import java.io.InputStream; -import java.lang.reflect.Field; import java.util.Map; -import java.util.zip.ZipInputStream; /** * Wrapper to register UMC mods in ModCore */ public class UMCModContainer extends FMLModContainer { ModCandidate candidate; + Map modDescriptor; public UMCModContainer(String className, ModCandidate candidate, Map modDescriptor) { super(className, candidate, modDescriptor); this.candidate = candidate; + this.modDescriptor = modDescriptor; } @Override @@ -35,23 +33,11 @@ public void bindMetadata(MetadataCollection mc) { //Then we'll override some of those //TODO // InputStream umcJson = new ZipInputStream(candidate.getModContainer()) - try { + ModMetadata modMetadata = this.getMetadata(); - Field field = FMLModContainer.class.getDeclaredField("descriptor"); - field.setAccessible(true); - Map descriptor = (Map) field.get(this); - ModMetadata modMetadata = mc.getMetadataForId(getModId(), descriptor); - - modMetadata.modId = (String) descriptor.get("modid"); - modMetadata.name = (String) descriptor.get("name"); - modMetadata.version = (String) descriptor.get("version"); - modMetadata.autogenerated = false; - - field = FMLModContainer.class.getDeclaredField("modMetadata"); - field.setAccessible(true); - field.set(this, modMetadata); - } catch (NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException(e); - } + modMetadata.modId = (String) modDescriptor.get("modid"); + modMetadata.name = (String) modDescriptor.get("name"); + modMetadata.version = (String) modDescriptor.get("version"); + modMetadata.autogenerated = false; } }