diff --git a/README.md b/README.md index 2f6efe8..6c1c7d5 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,8 @@ https://github.com/CleanroomMC/Fugue/releases/latest * XNet * ZeroCore (ExtremeReactor) * Smooth Font +* Water Power +* Survival Inc. ## Note Add + to start of the file if it's not there. \ No newline at end of file diff --git a/build.gradle b/build.gradle index dee8b7e..fc3b800 100644 --- a/build.gradle +++ b/build.gradle @@ -178,6 +178,11 @@ dependencies { //customNPCs compileOnly(fg.deobf("curse.maven:customnpc-221826:2996912")) + //Water Power + compileOnly(fg.deobf("curse.maven:waterpower-224579:2464789")) + implementation 'org.jetbrains.kotlin:kotlin-stdlib:1.9.23' + + // Mixin and it's common libraries annotationProcessor 'org.ow2.asm:asm:9.6' annotationProcessor 'com.google.guava:guava:33.0.0-jre' diff --git a/gradle.properties b/gradle.properties index b361360..ea0d51e 100644 --- a/gradle.properties +++ b/gradle.properties @@ -16,7 +16,7 @@ mappings_version=39-1.12 mod_id=fugue mod_name=Fugue mod_main_class=Fugue -mod_version=0.13.0-beta +mod_version=0.14.0-beta mod_base_package=com.cleanroommc.fugue mod_authors=kappa_maintainer mod_description=A mod that patch dead mods for Cleanroom diff --git a/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java b/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java index 13d291c..daa68de 100644 --- a/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java +++ b/src/main/java/com/cleanroommc/fugue/common/FugueLoadingPlugin.java @@ -85,6 +85,9 @@ public class FugueLoadingPlugin implements IFMLLoadingPlugin { if (FugueConfig.modPatchConfig.enableCCL) { TransformerDelegate.registerExplicitTransformerByInstance(new ClassHierarchyManagerTransformer(), "codechicken.asm.ClassHierarchyManager"); } + if (FugueConfig.modPatchConfig.enableSurvivialInc) { + TransformerDelegate.registerExplicitTransformerByInstance(new ForgeASMInjectorTransformer(), "enginecrafter77.survivalinc.util.ForgeASMInjector"); + } if (FugueConfig.getCodeSourcePatchTargets.length > 0) { TransformerDelegate.registerExplicitTransformerByInstance(new ITweakerTransformer(), FugueConfig.getCodeSourcePatchTargets); } diff --git a/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java b/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java index 26724f9..05d42c8 100644 --- a/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java +++ b/src/main/java/com/cleanroommc/fugue/common/FugueMixinConfigPlugin.java @@ -44,6 +44,7 @@ public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { case "theasm" -> Launch.classLoader.isClassExist("zone.rong.loliasm.common.crashes.ModIdentifier") && FugueConfig.modPatchConfig.enableTheASM; case "howlingmoon" -> Loader.isModLoaded("howlingmoon") && FugueConfig.modPatchConfig.enableHowlingMoon; case "customnpcs" -> Loader.isModLoaded("customnpcs") && FugueConfig.modPatchConfig.enableCustomNPC; + case "waterpower" -> Loader.isModLoaded("waterpower") && FugueConfig.modPatchConfig.enableWaterPower; default -> true; }; } diff --git a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java index a641988..58fc331 100644 --- a/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java +++ b/src/main/java/com/cleanroommc/fugue/config/ModPatchConfig.java @@ -59,8 +59,12 @@ public class ModPatchConfig { @Config.Name("Enable XNet Patch") public boolean enableXNet = true; - @Config.Name("Enable Howling Moon") + @Config.Name("Enable Howling Moon Patch") public boolean enableHowlingMoon = true; - @Config.Name("Enable Custom NPCs") + @Config.Name("Enable Custom NPCs Patch") public boolean enableCustomNPC = true; + @Config.Name("Enabel Survivial Inc. Patch") + public boolean enableSurvivialInc = true; + @Config.Name("Enable Water Power Patch") + public boolean enableWaterPower = true; } diff --git a/src/main/java/com/cleanroommc/fugue/mixin/waterpower/ClassEngineMixin.java b/src/main/java/com/cleanroommc/fugue/mixin/waterpower/ClassEngineMixin.java new file mode 100644 index 0000000..12eb8bd --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/mixin/waterpower/ClassEngineMixin.java @@ -0,0 +1,28 @@ +package com.cleanroommc.fugue.mixin.waterpower; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Coerce; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import waterpower.annotations.ClassEngine; + +import java.lang.invoke.MethodHandles; + +@Mixin(value = ClassEngine.class, remap = false) +public class ClassEngineMixin { + @Shadow @Final @Mutable + public static ClassEngine INSTANCE; + + @Shadow @Final @Mutable + private static kotlin.Lazy lookup$delegate; + + @Inject(method = "getLookup", at = @At("HEAD"), cancellable = true) + private void hackLookup(CallbackInfoReturnable cir) { + cir.setReturnValue(MethodHandles.lookup()); + } + +} diff --git a/src/main/java/com/cleanroommc/fugue/transformer/ForgeASMInjectorTransformer.java b/src/main/java/com/cleanroommc/fugue/transformer/ForgeASMInjectorTransformer.java new file mode 100644 index 0000000..bcf4d73 --- /dev/null +++ b/src/main/java/com/cleanroommc/fugue/transformer/ForgeASMInjectorTransformer.java @@ -0,0 +1,26 @@ +package com.cleanroommc.fugue.transformer; + +import com.cleanroommc.fugue.common.Fugue; +import javassist.ClassPool; +import javassist.CtClass; +import top.outlands.foundation.IExplicitTransformer; + +import java.io.ByteArrayInputStream; + +public class ForgeASMInjectorTransformer implements IExplicitTransformer { + @Override + public byte[] transform(byte[] bytes) { + try { + CtClass cc = ClassPool.getDefault().makeClass(new ByteArrayInputStream(bytes)); + cc.getConstructors()[0].setBody("{}"); + cc.getDeclaredMethod("injectClass").setBody( + """ + {return net.minecraft.launchwrapper.Launch#classLoader.defineClass($1, $2);} + """); + bytes = cc.toBytecode(); + } catch (Throwable t) { + Fugue.LOGGER.error(t); + } + return bytes; + } +} diff --git a/src/main/resources/fugue.mixin.mod.json b/src/main/resources/fugue.mixin.mod.json index c9b0852..d969539 100644 --- a/src/main/resources/fugue.mixin.mod.json +++ b/src/main/resources/fugue.mixin.mod.json @@ -18,7 +18,8 @@ "solarflux.INetworkSFMixin", "solarflux.SolarFluxMixin", "xaeroplus.ChunkHighlightSavingCacheMixin", - "xaeroplus.XaeroPlusSettingsReflectionHaxMixin" + "xaeroplus.XaeroPlusSettingsReflectionHaxMixin", + "waterpower.ClassEngineMixin" ], "client": [ "custommainmenu.SlideshowMixin",