diff --git a/README.MD b/README.MD index 1010396..aa141f3 100644 --- a/README.MD +++ b/README.MD @@ -23,6 +23,7 @@ This mod also contains patches for the following mods: - Atum - Biomes O' Plenty - Biome Wand +- ChromatiCraft - CoFH Lib - Dark World - DragonAPI diff --git a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java index 2b3c379..0e372a0 100644 --- a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java +++ b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java @@ -17,7 +17,8 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; acceptedMinecraftVersions = "[1.7.10]", dependencies = "required-after:falsepatternlib@[0.9.2,);after:antiidconflict") public class EndlessIDs { - public static final byte[] BIOME_ARRAY_PLACEHOLDER = new byte[0]; + public static final byte[] ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER = new byte[0]; + public static final byte[] FAKE_BIOME_ARRAY_PLACEHOLDER = new byte[256]; public static final Logger LOG = LogManager.getLogger(Tags.MODNAME); @SidedProxy(clientSide = Tags.GROUPNAME + ".patching.ClientManager", diff --git a/src/main/java/com/falsepattern/endlessids/mixin/helpers/BiomePatchHelper.java b/src/main/java/com/falsepattern/endlessids/mixin/helpers/BiomePatchHelper.java index 3bd88a2..f7cb70a 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/helpers/BiomePatchHelper.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/helpers/BiomePatchHelper.java @@ -7,7 +7,7 @@ import net.minecraft.world.chunk.Chunk; import java.util.function.IntFunction; -import static com.falsepattern.endlessids.EndlessIDs.BIOME_ARRAY_PLACEHOLDER; +import static com.falsepattern.endlessids.EndlessIDs.ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER; public class BiomePatchHelper { public static byte[] getBiomeArrayTweaked(Chunk chunk, IntFunction biomesForGeneration) { @@ -16,7 +16,7 @@ public class BiomePatchHelper { for (int i = 0; i < chunkBiomes.length; ++i) { chunkBiomes[i] = (short) biomesForGeneration.apply(i).biomeID; } - return BIOME_ARRAY_PLACEHOLDER; + return ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER; } public static byte[] getBiomeArrayTweaked(Chunk chunk, BiomeGenBase[] biomesForGeneration) { @@ -25,6 +25,6 @@ public class BiomePatchHelper { for (int i = 0; i < chunkBiomes.length; ++i) { chunkBiomes[i] = (short) biomesForGeneration[i].biomeID; } - return BIOME_ARRAY_PLACEHOLDER; + return ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER; } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaChunkHelperMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaChunkHelperMixin.java new file mode 100644 index 0000000..3212afd --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaChunkHelperMixin.java @@ -0,0 +1,35 @@ +package com.falsepattern.endlessids.mixin.mixins.common.dragonapi; + +import Reika.DragonAPI.Libraries.World.ReikaChunkHelper; +import com.falsepattern.endlessids.EndlessIDs; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.world.chunk.Chunk; + +@Mixin(value = ReikaChunkHelper.class, + remap = false) +public abstract class ReikaChunkHelperMixin { + private static short[] biomeArray; + @Redirect(method = "copyChunk", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;setBiomeArray([B)V", + remap = true), + require = 1) + private static void customSet(Chunk chunk, byte[] p_76616_1_) { + ((IChunkMixin)chunk).setBiomeShortArray(biomeArray); + biomeArray = null; + } + + @Redirect(method = "copyChunk", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;getBiomeArray()[B", + remap = true), + require = 1) + private static byte[] customGet(Chunk chunk) { + biomeArray = ((IChunkMixin)chunk).getBiomeShortArray(); + return EndlessIDs.ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaWorldHelperMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaWorldHelperMixin.java new file mode 100644 index 0000000..5a9ef64 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/dragonapi/ReikaWorldHelperMixin.java @@ -0,0 +1,77 @@ +package com.falsepattern.endlessids.mixin.mixins.common.dragonapi; + +import Reika.DragonAPI.Libraries.World.ReikaWorldHelper; +import com.falsepattern.endlessids.EndlessIDs; +import com.falsepattern.endlessids.mixin.helpers.IChunkMixin; +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.ModifyVariable; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import net.minecraft.world.World; +import net.minecraft.world.biome.BiomeGenBase; +import net.minecraft.world.chunk.Chunk; + +@Mixin(value = ReikaWorldHelper.class, + remap = false) +public abstract class ReikaWorldHelperMixin { + @Redirect(method = {"setBiomeForXZ", "setBiomeAndBlocksForXZ"}, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;getBiomeArray()[B", + remap = true), + require = 2) + private static byte[] getFake(Chunk instance) { + return EndlessIDs.FAKE_BIOME_ARRAY_PLACEHOLDER; + } + + @Redirect(method = {"setBiomeForXZ", "setBiomeAndBlocksForXZ"}, + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;setBiomeArray([B)V", + remap = true), + require = 2) + private static void noSet(Chunk instance, byte[] arr) { + + } + + @Inject(method = "setBiomeForXZ", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;setChunkModified()V", + remap = true), + locals = LocalCapture.CAPTURE_FAILHARD, + require = 1) + private static void customLogicSetBiome(World world, int x, int z, BiomeGenBase biome, CallbackInfo ci, Chunk ch, int ax, int az, byte[] biomes, int index) { + ((IChunkMixin)ch).getBiomeShortArray()[index] = (short) biome.biomeID; + } + + private static int fromBiomeID; + + @Inject(method = "setBiomeAndBlocksForXZ", + at = @At(value = "FIELD", + target = "Lnet/minecraft/world/biome/BiomeGenBase;biomeList:[Lnet/minecraft/world/biome/BiomeGenBase;", + remap = true), + locals = LocalCapture.CAPTURE_FAILEXCEPTION, + require = 1) + private static void captureIndexSetBiomeAndBlocks(World world, int x, int z, BiomeGenBase biome, CallbackInfo ci, Chunk ch, int ax, int az, byte[] biomes, int index) { + fromBiomeID = ((IChunkMixin)ch).getBiomeShortArray()[index]; + } + + @ModifyVariable(method = "setBiomeAndBlocksForXZ", + at = @At("STORE"), + ordinal = 1) + private static BiomeGenBase changeBiomeFrom(BiomeGenBase value) { + return BiomeGenBase.getBiome(fromBiomeID); + } + + @Inject(method = "setBiomeAndBlocksForXZ", + at = @At(value = "INVOKE", + target = "Lnet/minecraft/world/chunk/Chunk;setBiomeArray([B)V", + remap = true), + locals = LocalCapture.CAPTURE_FAILEXCEPTION, + require = 1) + private static void customLogicSetBiomeAndBlocks(World world, int x, int z, BiomeGenBase biome, CallbackInfo ci, Chunk ch, int ax, int az, byte[] biomes, int index, BiomeGenBase from) { + ((IChunkMixin)ch).getBiomeShortArray()[index] = (short) biome.biomeID; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/extrautilities/ChunkProviderEndOfTimeMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/extrautilities/ChunkProviderEndOfTimeMixin.java index 77e059b..a635826 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/extrautilities/ChunkProviderEndOfTimeMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/extrautilities/ChunkProviderEndOfTimeMixin.java @@ -26,7 +26,7 @@ public abstract class ChunkProviderEndOfTimeMixin { require = 1) private byte[] setBiomesTweaked1(Chunk instance) { chunk = instance; - return EndlessIDs.BIOME_ARRAY_PLACEHOLDER; + return EndlessIDs.ZERO_LENGTH_BIOME_ARRAY_PLACEHOLDER; } @Redirect(method = "provideChunk", 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 71f8f0f..66c538d 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -107,6 +107,8 @@ public enum Mixin implements IMixin { DragonAPIGenLayerRiverEventMixin(Side.COMMON, require(TargetedMod.DRAGONAPI), "dragonapi.GenLayerRiverEventMixin"), DragonAPIBlockPropertiesMixin(Side.COMMON, require(TargetedMod.DRAGONAPI), "dragonapi.BlockPropertiesMixin"), DragonAPIIDTypeMixin(Side.COMMON, require(TargetedMod.DRAGONAPI), "dragonapi.IDTypeMixin"), + ReikaChunkHelperMixin(Side.COMMON, require(TargetedMod.DRAGONAPI), "dragonapi.ReikaChunkHelperMixin"), + ReikaWorldHelperMixin(Side.COMMON, require(TargetedMod.DRAGONAPI), "dragonapi.ReikaWorldHelperMixin"), //endregion DragonAPI->common //region EnhancedBiomes EBBiomeIDsMixin(Side.COMMON, require(TargetedMod.EB), "eb.BiomeIDsMixin"),