From c8de7349dc90dfab3462c60f372486c6e806d95c Mon Sep 17 00:00:00 2001 From: FalsePattern Date: Fri, 7 Jun 2024 15:45:17 +0200 Subject: [PATCH] Attempt to fix LOTR mod compat again --- README.MD | 1 + .../endlessids/asm/ClassEdit.java | 4 ++ .../asm/transformer/LOTRFieldExposer.java | 20 ++++++++ .../common/biome/lotr/LOTRDimensionMixin.java | 19 +++++++ ...PacketBiomeVariantsWatchHandlerMixin.java} | 2 +- .../biome/lotr/LOTRWorldProviderMixin.java | 49 +++++++++++++++++++ .../endlessids/mixin/plugin/Mixin.java | 2 + 7 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/falsepattern/endlessids/asm/transformer/LOTRFieldExposer.java create mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRDimensionMixin.java rename src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/{LOTRPacketBiomeVariantsWatchHandler.java => LOTRPacketBiomeVariantsWatchHandlerMixin.java} (96%) create mode 100644 src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRWorldProviderMixin.java diff --git a/README.MD b/README.MD index 34dc45a..5a720bd 100644 --- a/README.MD +++ b/README.MD @@ -61,6 +61,7 @@ This mod also contains patches for the following mods: - Realistic Terrain Generation - Realistic World Generation - Thaumcraft +- The Lord of the Rings Mod: Legacy - Tropicraft - Twilight Forest - Underground Biomes Constructs diff --git a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java index 2533805..5188ae2 100644 --- a/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java +++ b/src/main/java/com/falsepattern/endlessids/asm/ClassEdit.java @@ -3,6 +3,7 @@ package com.falsepattern.endlessids.asm; import com.falsepattern.endlessids.asm.transformer.ChunkProviderSuperPatcher; import com.falsepattern.endlessids.asm.transformer.FmlRegistry; import com.falsepattern.endlessids.asm.transformer.GameDataAccelerator; +import com.falsepattern.endlessids.asm.transformer.LOTRFieldExposer; import com.falsepattern.endlessids.asm.transformer.SpaceCoreModInfoGenerator; import com.falsepattern.endlessids.config.GeneralConfig; import lombok.val; @@ -21,6 +22,9 @@ public enum ClassEdit { () -> GeneralConfig.extendBlockItem, "cpw.mods.fml.common.registry.GameData", "cpw.mods.fml.common.registry.FMLControlledNamespacedRegistry"), + LOTRFieldExposer(new LOTRFieldExposer(), + () -> GeneralConfig.extendBiome, + "lotr.common.network.LOTRPacketBiomeVariantsWatch"), SpaceCoreModInfoGenerator(new SpaceCoreModInfoGenerator(), () -> true, "com.spacechase0.minecraft.spacecore.mcp.ModInfoGenerator"), GameDataAccelerator(new GameDataAccelerator(), () -> GeneralConfig.enableRegistryPerformanceTweak, "cpw.mods.fml.common.registry.GameData"), diff --git a/src/main/java/com/falsepattern/endlessids/asm/transformer/LOTRFieldExposer.java b/src/main/java/com/falsepattern/endlessids/asm/transformer/LOTRFieldExposer.java new file mode 100644 index 0000000..60f87df --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/asm/transformer/LOTRFieldExposer.java @@ -0,0 +1,20 @@ +package com.falsepattern.endlessids.asm.transformer; + +import com.falsepattern.endlessids.asm.IClassNodeTransformer; +import lombok.val; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.tree.ClassNode; + +public class LOTRFieldExposer implements IClassNodeTransformer { + @Override + public void transform(ClassNode classNode, boolean obfuscated) { + for (val field: classNode.fields) { + if ("chunkX".equals(field.name) || + "chunkZ".equals(field.name) || + "variants".equals(field.name)) { + field.access &= ~Opcodes.ACC_PRIVATE; + field.access |= Opcodes.ACC_PUBLIC; + } + } + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRDimensionMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRDimensionMixin.java new file mode 100644 index 0000000..6f2bb8b --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRDimensionMixin.java @@ -0,0 +1,19 @@ +package com.falsepattern.endlessids.mixin.mixins.common.biome.lotr; + +import com.falsepattern.endlessids.constants.ExtendedConstants; +import com.falsepattern.endlessids.constants.VanillaConstants; +import lotr.common.LOTRDimension; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.Constant; +import org.spongepowered.asm.mixin.injection.ModifyConstant; + +@Mixin(value = LOTRDimension.class, + remap = false) +public abstract class LOTRDimensionMixin { + @ModifyConstant(method = "", + constant = @Constant(intValue = VanillaConstants.biomeIDCount), + require = 1) + private int extendBiomes(int constant) { + return ExtendedConstants.biomeIDCount; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandler.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandlerMixin.java similarity index 96% rename from src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandler.java rename to src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandlerMixin.java index a6c343d..d8eda96 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandler.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRPacketBiomeVariantsWatchHandlerMixin.java @@ -16,7 +16,7 @@ import cpw.mods.fml.common.network.simpleimpl.MessageContext; @Mixin(value = LOTRPacketBiomeVariantsWatch.Handler.class, remap = false) -public abstract class LOTRPacketBiomeVariantsWatchHandler { +public abstract class LOTRPacketBiomeVariantsWatchHandlerMixin { /** * @author FalsePattern diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRWorldProviderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRWorldProviderMixin.java new file mode 100644 index 0000000..0b36cfc --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/biome/lotr/LOTRWorldProviderMixin.java @@ -0,0 +1,49 @@ +package com.falsepattern.endlessids.mixin.mixins.common.biome.lotr; + +import com.falsepattern.endlessids.constants.ExtendedConstants; +import com.falsepattern.endlessids.mixin.helpers.ChunkBiomeHook; +import lombok.val; +import lotr.common.LOTRDimension; +import lotr.common.world.LOTRWorldProvider; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.WorldProvider; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; + +import static com.falsepattern.endlessids.constants.ExtendedConstants.biomeIDMask; + +@Mixin(LOTRWorldProvider.class) +public abstract class LOTRWorldProviderMixin extends WorldProvider { + @Shadow public abstract LOTRDimension getLOTRDimension(); + + /** + * @author FalsePattern + * @reason ID extension + */ + @Overwrite(remap = false) + public BiomeGenBase getBiomeGenForCoords(int x, int z) { + if (worldObj.blockExists(x, 0, z)) { + val chunk = worldObj.getChunkFromBlockCoords(x, z); + if (chunk != null) { + val extendedChunk = (ChunkBiomeHook)chunk; + val biomeArray = extendedChunk.getBiomeShortArray(); + int chunkX = x & 15; + int chunkZ = z & 15; + int biomeID = biomeArray[chunkZ << 4 | chunkX] & biomeIDMask; + if (biomeID == 255) { + val biome = worldChunkMgr.getBiomeGenAt((chunk.xPosition << 4) + chunkX, (chunk.zPosition << 4) + chunkZ); + biomeID = biome.biomeID; + biomeArray[chunkZ << 4 | chunkX] = (short)(biomeID & biomeIDMask); + } + + val dim = this.getLOTRDimension(); + return dim.biomeList[biomeID] == null ? dim.biomeList[0] : dim.biomeList[biomeID]; + } + } + + return this.worldChunkMgr.getBiomeGenAt(x, z); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java index 868fa96..2819bf4 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -123,8 +123,10 @@ public enum Mixin implements IMixin { LOTRBiomeVariantStorageMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRBiomeVariantStorageMixin"), LOTRChunkProviderMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRChunkProviderMixin"), LOTRChunkProviderUtumnoMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRChunkProviderUtumnoMixin"), + LOTRDimensionMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRDimensionMixin"), LOTRPacketBiomeVariantsWatchHandlerMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRPacketBiomeVariantsWatchHandlerMixin"), LOTRWorldChunkManagerMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRWorldChunkManagerMixin"), + LOTRWorldProviderMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.LOTR)), "biome.lotr.LOTRWorldProviderMixin"), //endregion LOTR //region NaturesCompass NaturesCompassBiomeUtilsMixin(Side.COMMON, condition(() -> GeneralConfig.extendBiome).and(require(TargetedMod.NATURESCOMPASS)), "biome.naturescompass.BiomeUtilsMixin"),