From db38fed72fba33675a98e1b34417eac83489670a Mon Sep 17 00:00:00 2001 From: jchung01 Date: Tue, 21 May 2024 18:52:25 -0700 Subject: [PATCH 1/4] Followup to SRP support --- src/main/java/org/dimdev/jeid/JEID.java | 2 +- .../org/dimdev/jeid/core/JEIDMixinLoader.java | 6 +- .../MixinSpreadBiome.java | 68 +++++++++++++------ 3 files changed, 53 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/dimdev/jeid/JEID.java b/src/main/java/org/dimdev/jeid/JEID.java index 3fb2b16..f2a556a 100644 --- a/src/main/java/org/dimdev/jeid/JEID.java +++ b/src/main/java/org/dimdev/jeid/JEID.java @@ -20,7 +20,6 @@ public class JEID { public static final String NAME = Tags.MOD_NAME; public static final String VERSION = Tags.VERSION; public static final String DEPENDENCIES = "required:mixinbooter@[8.0,);" - + "after:srparasites;" + "after:abyssalcraft;" + "after:advancedrocketry;" + "after:atum;" @@ -38,6 +37,7 @@ public class JEID { + "after:journeymap;" + "after:moreplanets;" + "after:mystcraft;" + + "after:srparasites;" + "after:thaumcraft;" + "after:thebetweenlands;" + "after:tofucraft;" diff --git a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java index 1fb09a0..9e0eff1 100644 --- a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java +++ b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java @@ -16,9 +16,6 @@ public List getMixinConfigs() { configs.add("mixins.jeid.advancedrocketry.client.json"); } } - if (Loader.isModLoaded("srparasites")) { - configs.add("mixins.jeid.srparasites.json"); - } if (Loader.isModLoaded("abyssalcraft")) { configs.add("mixins.jeid.abyssalcraft.json"); } @@ -87,6 +84,9 @@ public List getMixinConfigs() { if (Loader.isModLoaded("rtg")) { configs.add("mixins.jeid.rtg.json"); } + if (Loader.isModLoaded("srparasites")) { + configs.add("mixins.jeid.srparasites.json"); + } if (Loader.isModLoaded("thaumcraft")) { configs.add("mixins.jeid.thaumcraft.json"); } diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java index b32f1e1..1b37d96 100644 --- a/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java @@ -6,37 +6,67 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraft.world.biome.Biome; -import org.dimdev.jeid.INewChunk; +import net.minecraft.world.chunk.Chunk; + +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; + +import com.llamalad7.mixinextras.sugar.Local; +import org.dimdev.jeid.ducks.INewChunk; +import org.dimdev.jeid.network.MessageManager; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(value = ParasiteEventWorld.class, remap = false) +public class MixinSpreadBiome { + /** + * @reason Use REID message to immediately re-render changes on client + */ + @Redirect(method = "SpreadBiome", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper;sendToDimension(Lnet/minecraftforge/fml/common/network/simpleimpl/IMessage;I)V")) + private static void reid$sendSpreadBiomeChange(SimpleNetworkWrapper instance, IMessage message, int dimensionId, World worldIn, BlockPos pos, + @Local(ordinal = 1) BlockPos convertPos) { + MessageManager.sendClientsBiomePosChange(worldIn, convertPos, Biome.getIdForBiome(SRPBiomes.biomeInfested)); + } -@Pseudo -@Mixin(ParasiteEventWorld.class) -public abstract class MixinSpreadBiome { + /** + * @reason Use REID message to immediately re-render changes on client + */ + @Redirect(method = "killBiome", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper;sendToDimension(Lnet/minecraftforge/fml/common/network/simpleimpl/IMessage;I)V")) + private static void reid$sendKillBiomeChange(SimpleNetworkWrapper instance, IMessage message, int dimensionId, World worldIn, BlockPos pos, + @Local(ordinal = 1) BlockPos convertPos) { + Biome original = worldIn.getBiomeProvider().getBiome(pos, Biomes.PLAINS); + MessageManager.sendClientsBiomePosChange(worldIn, convertPos, Biome.getIdForBiome(original)); + } - // Overwriting the biome chaning code for SRP. - // This is just a mixin to force it to refer to REID's biome array. /** - * @author roguetictac - * @reason Make Scape and Run: Parasites compatible with REID. Refer to new chunk duck interface for mixin reasons. + * @author roguetictac, jchung01 + * @reason Support int biome id for spreading infected biome. */ - @Overwrite(remap=false) - public static void positionToParasiteBiome(World worldIn, BlockPos pos) { + @Inject(method = "positionToParasiteBiome", at = @At(value = "HEAD"), cancellable = true) + private static void reid$parasiteToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci) { + Chunk chunk = worldIn.getChunk(pos); int inChunkX = pos.getX() & 15; int inChunkZ = pos.getZ() & 15; - ((INewChunk)worldIn.getChunk(pos)).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(SRPBiomes.biomeInfested); + chunk.markDirty(); + ((INewChunk) chunk).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(SRPBiomes.biomeInfested); + ci.cancel(); } /** - * @author roguetictac - * @reason Make Scape and Run: Parasites compatible with REID. Refer to new chunk duck interface for mixin reasons. + * @author roguetictac, jchung01 + * @reason Support int biome id for resetting infected biome. */ - @Overwrite(remap=false) - public static void positionToBiome(World worldIn, BlockPos pos) { + @Inject(method = "positionToBiome", at = @At(value = "HEAD"), cancellable = true) + private static void reid$plainsToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci) { + Biome original = worldIn.getBiomeProvider().getBiome(pos, Biomes.PLAINS); + Chunk chunk = worldIn.getChunk(pos); int inChunkX = pos.getX() & 15; int inChunkZ = pos.getZ() & 15; - ((INewChunk)worldIn.getChunk(pos)).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(Biomes.PLAINS); + chunk.markDirty(); + ((INewChunk) chunk).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(original); + ci.cancel(); } - } \ No newline at end of file From 82c251d67766f9a86e69d68aa6f83d046e4221d1 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Thu, 30 May 2024 13:03:33 -0700 Subject: [PATCH 2/4] Adjust injection targets --- .../scapeandrunparasites/MixinSpreadBiome.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java index 1b37d96..e659c6a 100644 --- a/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/scapeandrunparasites/MixinSpreadBiome.java @@ -45,11 +45,10 @@ public class MixinSpreadBiome { * @author roguetictac, jchung01 * @reason Support int biome id for spreading infected biome. */ - @Inject(method = "positionToParasiteBiome", at = @At(value = "HEAD"), cancellable = true) - private static void reid$parasiteToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci) { + @Inject(method = "positionToParasiteBiome", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getChunk(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/world/chunk/Chunk;", remap = true), cancellable = true) + private static void reid$parasiteToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci, + @Local(ordinal = 0) int inChunkX, @Local(ordinal = 1) int inChunkZ) { Chunk chunk = worldIn.getChunk(pos); - int inChunkX = pos.getX() & 15; - int inChunkZ = pos.getZ() & 15; chunk.markDirty(); ((INewChunk) chunk).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(SRPBiomes.biomeInfested); ci.cancel(); @@ -59,12 +58,12 @@ public class MixinSpreadBiome { * @author roguetictac, jchung01 * @reason Support int biome id for resetting infected biome. */ - @Inject(method = "positionToBiome", at = @At(value = "HEAD"), cancellable = true) - private static void reid$plainsToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci) { + @Inject(method = "positionToBiome", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getChunk(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/world/chunk/Chunk;", remap = true), cancellable = true) + private static void reid$plainsToIntBiomeArray(World worldIn, BlockPos pos, CallbackInfo ci, + @Local(ordinal = 0) int inChunkX, @Local(ordinal = 1) int inChunkZ) { + // Get the originally generated biome. Biome original = worldIn.getBiomeProvider().getBiome(pos, Biomes.PLAINS); Chunk chunk = worldIn.getChunk(pos); - int inChunkX = pos.getX() & 15; - int inChunkZ = pos.getZ() & 15; chunk.markDirty(); ((INewChunk) chunk).getIntBiomeArray()[inChunkZ << 4 | inChunkX] = Biome.getIdForBiome(original); ci.cancel(); From 15ea752502ff16ca790d176f886c72e856a923fb Mon Sep 17 00:00:00 2001 From: jchung01 Date: Thu, 30 May 2024 13:06:05 -0700 Subject: [PATCH 3/4] Simplify AR mixin - Using `@Group` to consolidate v1.7.0 and v2.0.0 into one mixin --- .../org/dimdev/jeid/core/JEIDMixinLoader.java | 14 +++----- .../{v1_7_0 => }/MixinBiomeHandler.java | 32 +++++++++++-------- .../v2_0_0/MixinBiomeHandler.java | 30 ----------------- ...json => mixins.jeid.advancedrocketry.json} | 2 +- .../mixins.jeid.advancedrocketry.v2_0_0.json | 11 ------- 5 files changed, 24 insertions(+), 65 deletions(-) rename src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/{v1_7_0 => }/MixinBiomeHandler.java (52%) delete mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v2_0_0/MixinBiomeHandler.java rename src/main/resources/{mixins.jeid.advancedrocketry.v1_7_0.json => mixins.jeid.advancedrocketry.json} (88%) delete mode 100644 src/main/resources/mixins.jeid.advancedrocketry.v2_0_0.json diff --git a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java index d8754eb..793bb86 100644 --- a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java +++ b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java @@ -1,12 +1,11 @@ package org.dimdev.jeid.core; -import net.minecraftforge.fml.common.Loader; -import net.minecraftforge.fml.common.ModContainer; -import zone.rong.mixinbooter.ILateMixinLoader; - import java.util.ArrayList; import java.util.List; +import net.minecraftforge.fml.common.Loader; + +import zone.rong.mixinbooter.ILateMixinLoader; public class JEIDMixinLoader implements ILateMixinLoader { public List getMixinConfigs() { @@ -21,12 +20,7 @@ public List getMixinConfigs() { configs.add("mixins.jeid.abyssalcraft.json"); } if (Loader.isModLoaded("advancedrocketry")) { - String version = Loader.instance().getIndexedModList().get("advancedrocketry").getVersion(); - if (version.split("-")[1].contains(".") && Integer.parseInt(version.split("-")[1].split("\\.")[0]) >= 2) { - configs.add("mixins.jeid.advancedrocketry.v2_0_0.json"); - } else { - configs.add("mixins.jeid.advancedrocketry.v1_7_0.json"); - } + configs.add("mixins.jeid.advancedrocketry.json"); } if (Loader.isModLoaded("atum")) { configs.add("mixins.jeid.atum.json"); diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v1_7_0/MixinBiomeHandler.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/MixinBiomeHandler.java similarity index 52% rename from src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v1_7_0/MixinBiomeHandler.java rename to src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/MixinBiomeHandler.java index 7db5449..40de28f 100644 --- a/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v1_7_0/MixinBiomeHandler.java +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/MixinBiomeHandler.java @@ -1,41 +1,47 @@ -package org.dimdev.jeid.mixin.modsupport.advancedrocketry.v1_7_0; +package org.dimdev.jeid.mixin.modsupport.advancedrocketry; -import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; import net.minecraft.world.chunk.Chunk; import org.dimdev.jeid.ducks.INewChunk; import org.spongepowered.asm.mixin.Dynamic; import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Group; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; import zmaster587.advancedRocketry.util.BiomeHandler; -/** - * Mixin for Advanced Rocketry 1.7.0 - */ @SuppressWarnings("target") @Mixin(value = BiomeHandler.class, remap = false) public class MixinBiomeHandler { - @Dynamic("Only present with AR 1.7.0") - @Shadow - public static void changeBiome(World world, int biomeId, BlockPos pos) { - } + // Do not use @Local sugar for these injectors, it doesn't handle invalid targets well! @Dynamic("Use int biome array for AR 1.7.0") - @Inject(method = "changeBiome(Lnet/minecraft/world/World;ILnet/minecraft/util/math/BlockPos;)V", at = @At(value = "INVOKE", target = "Lzmaster587/libVulpes/network/PacketHandler;sendToNearby(Lzmaster587/libVulpes/network/BasePacket;ILnet/minecraft/util/math/BlockPos;D)V"), require = 0) - private static void reid$toIntBiomeArray1_7_0(World world, int biomeId, BlockPos pos, CallbackInfo ci, @Local Chunk chunk) { + @Group(name = "versionAgnosticAR", min = 1, max = 2) + @Inject(method = "changeBiome(Lnet/minecraft/world/World;ILnet/minecraft/util/math/BlockPos;)V", at = @At(value = "INVOKE", target = "Lzmaster587/libVulpes/network/PacketHandler;sendToNearby(Lzmaster587/libVulpes/network/BasePacket;ILnet/minecraft/util/math/BlockPos;D)V"), locals = LocalCapture.CAPTURE_FAILHARD, require = 0) + private static void reid$toIntBiomeArray1_7_0(World world, int biomeId, BlockPos pos, CallbackInfo ci, Chunk chunk) { ((INewChunk) chunk).getIntBiomeArray()[(pos.getZ() & 0xF) << 4 | pos.getX() & 0xF] = biomeId; chunk.markDirty(); // Method sends packet } @Dynamic("Overload for AR 1.7.0") + @Group(name = "versionAgnosticAR", min = 1, max = 2) @Inject(method = "changeBiome(Lnet/minecraft/world/World;ILnet/minecraft/world/chunk/Chunk;Lnet/minecraft/util/math/BlockPos;)V", at = @At(value = "HEAD"), cancellable = true, require = 0) private static void reid$toIntBiomeArray1_7_0Chunk(World world, int biomeId, Chunk chunk, BlockPos pos, CallbackInfo ci) { - changeBiome(world, biomeId, pos); + BiomeHandler.changeBiome(world, biomeId, pos); ci.cancel(); } + + @Dynamic("Use int biome array for AR 2.0.0") + @Group(name = "versionAgnosticAR", min = 1, max = 2) + @Inject(method = "changeBiome(Lnet/minecraft/world/World;Lnet/minecraft/world/biome/Biome;Lnet/minecraft/util/math/BlockPos;)V", at = @At(value = "INVOKE", target = "Lzmaster587/libVulpes/network/PacketHandler;sendToNearby(Lzmaster587/libVulpes/network/BasePacket;ILnet/minecraft/util/math/BlockPos;D)V"), locals = LocalCapture.CAPTURE_FAILHARD, require = 0) + private static void reid$toIntBiomeArray2_0_0(World world, Biome biomeId, BlockPos pos, CallbackInfo ci, Chunk chunk) { + ((INewChunk) chunk).getIntBiomeArray()[(pos.getZ() & 0xF) << 4 | pos.getX() & 0xF] = Biome.getIdForBiome(biomeId); + chunk.markDirty(); + // Method sends packet + } } diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v2_0_0/MixinBiomeHandler.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v2_0_0/MixinBiomeHandler.java deleted file mode 100644 index 9e979f2..0000000 --- a/src/main/java/org/dimdev/jeid/mixin/modsupport/advancedrocketry/v2_0_0/MixinBiomeHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.dimdev.jeid.mixin.modsupport.advancedrocketry.v2_0_0; - -import com.llamalad7.mixinextras.sugar.Local; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import net.minecraft.world.chunk.Chunk; -import org.dimdev.jeid.ducks.INewChunk; -import org.spongepowered.asm.mixin.Dynamic; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import zmaster587.advancedRocketry.util.BiomeHandler; - -/** - * Mixin for Advanced Rocketry 2.0.0+ - * Biome changer remote is broken in this version, so this doesn't do much. - */ -@SuppressWarnings("target") -@Mixin(value = BiomeHandler.class, remap = false) -public class MixinBiomeHandler { - @Dynamic("Use int biome array for AR 2.0.0") - @Inject(method = "changeBiome(Lnet/minecraft/world/World;Lnet/minecraft/world/biome/Biome;Lnet/minecraft/util/math/BlockPos;)V", at = @At(value = "INVOKE", target = "Lzmaster587/libVulpes/network/PacketHandler;sendToNearby(Lzmaster587/libVulpes/network/BasePacket;ILnet/minecraft/util/math/BlockPos;D)V"), require = 0) - private static void reid$toIntBiomeArray2_0_0(World world, Biome biomeId, BlockPos pos, CallbackInfo ci, @Local Chunk chunk) { - ((INewChunk) chunk).getIntBiomeArray()[(pos.getZ() & 0xF) << 4 | pos.getX() & 0xF] = Biome.getIdForBiome(biomeId); - chunk.markDirty(); - // Method sends packet - } -} diff --git a/src/main/resources/mixins.jeid.advancedrocketry.v1_7_0.json b/src/main/resources/mixins.jeid.advancedrocketry.json similarity index 88% rename from src/main/resources/mixins.jeid.advancedrocketry.v1_7_0.json rename to src/main/resources/mixins.jeid.advancedrocketry.json index b247ede..fc2a393 100644 --- a/src/main/resources/mixins.jeid.advancedrocketry.v1_7_0.json +++ b/src/main/resources/mixins.jeid.advancedrocketry.json @@ -5,7 +5,7 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_8", "mixins": [ - "v1_7_0.MixinBiomeHandler", + "MixinBiomeHandler", "MixinPacketBiomeIDChange" ] } diff --git a/src/main/resources/mixins.jeid.advancedrocketry.v2_0_0.json b/src/main/resources/mixins.jeid.advancedrocketry.v2_0_0.json deleted file mode 100644 index 81a0213..0000000 --- a/src/main/resources/mixins.jeid.advancedrocketry.v2_0_0.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "package": "org.dimdev.jeid.mixin.modsupport.advancedrocketry", - "required": true, - "refmap": "mixins.jeid.refmap.json", - "minVersion": "0.8", - "compatibilityLevel": "JAVA_8", - "mixins": [ - "v2_0_0.MixinBiomeHandler", - "MixinPacketBiomeIDChange" - ] -} From 7471e95e0ab86965706c254e967b904dc1fd1b22 Mon Sep 17 00:00:00 2001 From: jchung01 Date: Thu, 30 May 2024 17:19:05 -0700 Subject: [PATCH 4/4] Followup to WoN support --- .../org/dimdev/jeid/core/JEIDMixinLoader.java | 10 +--- .../wyrmsofnyrus/MixinBiomeSpread.java | 50 ------------------ .../MixinHiveCreepSpreadFurther.java | 27 ++++++++++ .../wyrmsofnyrus/MixinSpreadingBiome.java | 52 +++++++++++++++++++ .../resources/mixins.jeid.wyrmsofnyrus.json | 3 +- 5 files changed, 83 insertions(+), 59 deletions(-) delete mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinBiomeSpread.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinHiveCreepSpreadFurther.java create mode 100644 src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinSpreadingBiome.java diff --git a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java index 793bb86..675e5e1 100644 --- a/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java +++ b/src/main/java/org/dimdev/jeid/core/JEIDMixinLoader.java @@ -100,15 +100,9 @@ public List getMixinConfigs() { if (Loader.isModLoaded("worldedit")) { configs.add("mixins.jeid.worldedit.json"); } - - // Checks if the mod is within the version that has the legacy Biome Spread code - if (Loader.isModLoaded("wyrmsofnyrus")) - //TODO: Doesn't work since this code runs before anything is actually loaded, so we'll need to find another way before v0.6 comes out. - // Loader.instance().getCustomModProperties("wyrmsofnyrus").get("version").matches("0.5.[1-9][0-9]{1,3}") ) - // this checks any version between v0.5.10 (introduced the system) and v0.5.9999 (Impossible number of versions for a LTS version, but let's futureproof it to be safe.) + if (Loader.isModLoaded("wyrmsofnyrus")) { configs.add("mixins.jeid.wyrmsofnyrus.json"); - - + } return configs; } } diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinBiomeSpread.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinBiomeSpread.java deleted file mode 100644 index 54f7700..0000000 --- a/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinBiomeSpread.java +++ /dev/null @@ -1,50 +0,0 @@ -package org.dimdev.jeid.mixin.modsupport.wyrmsofnyrus; - -import com.vetpetmon.wyrmsofnyrus.world.biome.BiomeRegistry; -import com.vetpetmon.wyrmsofnyrus.world.biome.SpreadingBiome; -import net.minecraft.util.math.BlockPos; -import net.minecraft.world.World; -import net.minecraft.world.biome.Biome; -import org.dimdev.jeid.INewChunk; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Overwrite; -import org.spongepowered.asm.mixin.Pseudo; - -@Pseudo -@Mixin(SpreadingBiome.class) -public class MixinBiomeSpread { - // I would natively implement this considering it doesn't even need anything fancy, - // but I must agree that making a one-off patch is much more performant than making the game - // check for REID, though I am concerned if people are using JEID and don't know about REID... - // - // In 0.6 or a later 0.5.x release I'll probably figure out a way to make a native patch. - // - // WoN's biome alteration code is similar to Thaumcraft's and SRP's biome alteration, - // so these patches are based on those mods' patches. - // I keep calling Mixins patches. I see no difference. - // Can you believe this is the first Mixin I made that actually works? -Modrome, official WoN dev - /** - * @author Modrome - * @reason Patches Wyrms of Nyrus's Biome Spread compatible for WoN 0.5.x; code will need to be updated when 0.6 releases - */ - @Overwrite(remap=false) - public static void setBiome(World w, BlockPos pos, Biome biome) { - if (biome != null) { - int convX = pos.getX() & 15; - int convZ = pos.getZ() & 15; - ((INewChunk)w.getChunk(pos)).getIntBiomeArray()[convZ << 4 | convX] = Biome.getIdForBiome(biome); - } - - } - - /** - * @author Modrome - * @reason The alternative function; code will need to be updated when 0.6 releases. This code in WoN is a default shortcut that has since been removed in 0.6 - */ - @Overwrite(remap=false) - public static void setBiome(World w, BlockPos pos) { - int convX = pos.getX() & 15; - int convZ = pos.getZ() & 15; - ((INewChunk)w.getChunk(pos)).getIntBiomeArray()[convZ << 4 | convX] = Biome.getIdForBiome(BiomeRegistry.CREEPLANDS); - } -} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinHiveCreepSpreadFurther.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinHiveCreepSpreadFurther.java new file mode 100644 index 0000000..9ba65e9 --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinHiveCreepSpreadFurther.java @@ -0,0 +1,27 @@ +package org.dimdev.jeid.mixin.modsupport.wyrmsofnyrus; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraftforge.fml.common.network.simpleimpl.IMessage; +import net.minecraftforge.fml.common.network.simpleimpl.SimpleNetworkWrapper; + +import com.llamalad7.mixinextras.sugar.Local; +import com.vetpetmon.wyrmsofnyrus.invasion.HiveCreepSpreadFurther; +import com.vetpetmon.wyrmsofnyrus.world.biome.BiomeRegistry; +import org.dimdev.jeid.network.MessageManager; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(value = HiveCreepSpreadFurther.class, remap = false) +public class MixinHiveCreepSpreadFurther { + /** + * @reason Use REID message to immediately re-render changes on client + */ + @Redirect(method = "decay", at = @At(value = "INVOKE", target = "Lnet/minecraftforge/fml/common/network/simpleimpl/SimpleNetworkWrapper;sendToDimension(Lnet/minecraftforge/fml/common/network/simpleimpl/IMessage;I)V")) + private static void reid$sendSpreadBiomeChange(SimpleNetworkWrapper instance, IMessage message, int dimensionId, BlockPos pos, World world, + @Local(ordinal = 2) BlockPos spreadPos) { + MessageManager.sendClientsBiomePosChange(world, spreadPos, Biome.getIdForBiome(BiomeRegistry.CREEPLANDS)); + } +} diff --git a/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinSpreadingBiome.java b/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinSpreadingBiome.java new file mode 100644 index 0000000..04afc5c --- /dev/null +++ b/src/main/java/org/dimdev/jeid/mixin/modsupport/wyrmsofnyrus/MixinSpreadingBiome.java @@ -0,0 +1,52 @@ +package org.dimdev.jeid.mixin.modsupport.wyrmsofnyrus; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.chunk.Chunk; + +import com.vetpetmon.wyrmsofnyrus.world.biome.BiomeRegistry; +import com.vetpetmon.wyrmsofnyrus.world.biome.SpreadingBiome; +import org.dimdev.jeid.ducks.INewChunk; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +@Mixin(value = SpreadingBiome.class, remap = false) +public class MixinSpreadingBiome { + // I would natively implement this considering it doesn't even need anything fancy, + // but I must agree that making a one-off patch is much more performant than making the game + // check for REID, though I am concerned if people are using JEID and don't know about REID... + // + // In 0.6 or a later 0.5.x release I'll probably figure out a way to make a native patch. + // + // WoN's biome alteration code is similar to Thaumcraft's and SRP's biome alteration, + // so these patches are based on those mods' patches. + // I keep calling Mixins patches. I see no difference. + // Can you believe this is the first Mixin I made that actually works? -Modrome, official WoN dev + /** + * @author Modrome, jchung01 + * @reason Patches Wyrms of Nyrus's Biome Spread compatible for 0.5.x + */ + @Inject(method = "setBiome(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/world/biome/Biome;)V", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;getChunk(Lnet/minecraft/util/math/BlockPos;)Lnet/minecraft/world/chunk/Chunk;", remap = true), locals = LocalCapture.CAPTURE_FAILHARD, cancellable = true) + private static void reid$toIntBiomeArray(World w, BlockPos pos, Biome biome, CallbackInfo ci, + int convX, int convZ) { + Chunk chunk = w.getChunk(pos); + chunk.markDirty(); + ((INewChunk) chunk).getIntBiomeArray()[convZ << 4 | convX] = Biome.getIdForBiome(biome); + ci.cancel(); + } + + /** + * @reason Overload for WoN 0.5.x + */ + @Inject(method = "setBiome(Lnet/minecraft/world/World;Lnet/minecraft/util/math/BlockPos;)V", at = @At(value = "HEAD"), cancellable = true) + private static void reid$creeplandsToIntBiomeArray(World w, BlockPos pos, CallbackInfo ci) { + SpreadingBiome.setBiome(w, pos, BiomeRegistry.CREEPLANDS); + ci.cancel(); + } + + // TODO: Add mixin for 0.6 if necessary (annotate with @Group and @Dynamic, see AR MixinBiomeHandler for example) +} diff --git a/src/main/resources/mixins.jeid.wyrmsofnyrus.json b/src/main/resources/mixins.jeid.wyrmsofnyrus.json index 8f90e78..14b3bee 100644 --- a/src/main/resources/mixins.jeid.wyrmsofnyrus.json +++ b/src/main/resources/mixins.jeid.wyrmsofnyrus.json @@ -5,6 +5,7 @@ "minVersion": "0.8", "compatibilityLevel": "JAVA_8", "mixins": [ - "MixinBiomeSpread" + "MixinSpreadingBiome", + "MixinHiveCreepSpreadFurther" ] }