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;
}
}