Bläddra i källkod

Add basic detection for missing Mixin support on Forge

malte0811 3 år sedan
förälder
incheckning
0a4e8f8478

+ 12 - 1
forge/build.gradle

@@ -1,5 +1,5 @@
 plugins {
-    id "com.github.johnrengelman.shadow" version "5.0.0"
+    id "com.github.johnrengelman.shadow" version "7.0.0"
 }
 
 configurations {
@@ -11,8 +11,15 @@ architectury {
     forge()
 }
 
+repositories {
+    maven { // Mixins for early 1.17
+        url 'https://repo.spongepowered.org/repository/maven-public/'
+    }
+}
+
 dependencies {
     forge("net.minecraftforge:forge:${rootProject.minecraft_version}-${rootProject.forge_version}")
+    compileOnly 'org.spongepowered:mixin:0.8.4-SNAPSHOT'
 
     implementation(project(path: ":common")) {
         transitive = false
@@ -45,3 +52,7 @@ remapJar {
     input.set(shadowJar.archiveFile)
     classifier "forge"
 }
+
+loom {
+    mixinConfigs += "ferritecore.forge.mixin.json"
+}

+ 16 - 0
forge/src/main/java/malte0811/ferritecore/ModMainForge.java

@@ -3,7 +3,10 @@ package malte0811.ferritecore;
 import cpw.mods.modlauncher.api.INameMappingService;
 import malte0811.ferritecore.util.Constants;
 import net.minecraftforge.fml.IExtensionPoint.DisplayTest;
+import net.minecraftforge.fml.ModLoader;
 import net.minecraftforge.fml.ModLoadingContext;
+import net.minecraftforge.fml.ModLoadingStage;
+import net.minecraftforge.fml.ModLoadingWarning;
 import net.minecraftforge.fml.common.Mod;
 import net.minecraftforge.fml.util.ObfuscationReflectionHelper;
 import net.minecraftforge.fmllegacy.network.FMLNetworkConstants;
@@ -12,6 +15,14 @@ import net.minecraftforge.fmllegacy.network.FMLNetworkConstants;
 public class ModMainForge {
 
     public ModMainForge() {
+        if (!hasMixins()) {
+            ModLoader.get().addWarning(new ModLoadingWarning(
+                    ModLoadingContext.get().getActiveContainer().getModInfo(),
+                    ModLoadingStage.CONSTRUCT,
+                    "FerriteCore: Mixins are not available! Please install MixinBootstrap!"
+            ));
+            throw new RuntimeException("Mixins are not available! Please install MixinBootstrap!");
+        }
         Constants.blockstateCacheFieldName = ObfuscationReflectionHelper.remapName(
                 INameMappingService.Domain.FIELD, "f_60593_"
         );
@@ -19,4 +30,9 @@ public class ModMainForge {
                 DisplayTest.class, () -> new DisplayTest(() -> FMLNetworkConstants.IGNORESERVERONLY, (s, b) -> true)
         );
     }
+
+    private static boolean hasMixins() {
+        // Replaced by SelfMixin if Mixins are provided by Forge itself, MixinBootstrap or something else
+        return false;
+    }
 }

+ 17 - 0
forge/src/main/java/malte0811/ferritecore/mixin/forge/SelfMixin.java

@@ -0,0 +1,17 @@
+package malte0811.ferritecore.mixin.forge;
+
+import malte0811.ferritecore.ModMainForge;
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Overwrite;
+
+@Mixin(ModMainForge.class)
+public class SelfMixin {
+    /**
+     * @reason Detect Mixins when loaded
+     * @author malte0811
+     */
+    @Overwrite(remap = false)
+    private static boolean hasMixins() {
+        return true;
+    }
+}

+ 12 - 0
forge/src/main/resources/ferritecore.forge.mixin.json

@@ -0,0 +1,12 @@
+{
+  "required": true,
+  "package": "malte0811.ferritecore.mixin.forge",
+  "compatibilityLevel": "JAVA_16",
+  "client": [
+    "SelfMixin"
+  ],
+  "injectors": {
+    "defaultRequire": 1
+  },
+  "minVersion": "0.8"
+}