diff --git a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java index 310c424..b1aea30 100644 --- a/src/main/java/com/falsepattern/endlessids/EndlessIDs.java +++ b/src/main/java/com/falsepattern/endlessids/EndlessIDs.java @@ -4,25 +4,37 @@ import code.elix_x.coremods.antiidconflict.managers.BiomesManager; import com.falsepattern.endlessids.constants.ExtendedConstants; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.Mod; +import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import net.minecraft.world.biome.BiomeGenBase; + @Mod(modid = Tags.MODID, version = Tags.VERSION, name = Tags.MODNAME, acceptedMinecraftVersions = "[1.7.10]", - dependencies = "required-after:falsepatternlib@[0.8.2,);") + dependencies = "required-after:falsepatternlib@[0.8.2,);\n" + + "after:antiidconflict") public class EndlessIDs { public static final Logger LOG = LogManager.getLogger(Tags.MODNAME); + public static BiomeGenBase[] fakeBiomeArray; + public static boolean postInitFinished = false; @Mod.EventHandler - public static void preInit(FMLPreInitializationEvent e) { + public void preInit(FMLPreInitializationEvent e) { if (Loader.isModLoaded("antiidconflict")) { antiIdConflictLatePatch(); } } + @Mod.EventHandler + public void postInit(FMLPostInitializationEvent e) { + postInitFinished = true; + fakeBiomeArray = null; + } + private static void antiIdConflictLatePatch() { BiomesManager.conflicts = new BiomesManager.ConflictingBiomes[ExtendedConstants.biomeIDCount]; } diff --git a/src/main/java/com/falsepattern/endlessids/PlaceholderBiome.java b/src/main/java/com/falsepattern/endlessids/PlaceholderBiome.java new file mode 100644 index 0000000..9bacfd9 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/PlaceholderBiome.java @@ -0,0 +1,13 @@ +package com.falsepattern.endlessids; + +import net.minecraft.world.biome.BiomeGenBase; + +public class PlaceholderBiome extends BiomeGenBase { + public PlaceholderBiome(int id, BiomeGenBase parent) { + super(id); + biomeName = "EndlessIDs ID conflict avoidance placeholder for ID " + parent.biomeID + + " [" + parent.getClass().getName() + "]"; + } + + +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBaseMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBaseMixin.java new file mode 100644 index 0000000..ee2d507 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBaseMixin.java @@ -0,0 +1,35 @@ +package com.falsepattern.endlessids.mixin.mixins.common.antiidconflict; + +import com.falsepattern.endlessids.EndlessIDs; +import lombok.val; +import org.spongepowered.asm.lib.Opcodes; +import org.spongepowered.asm.mixin.Final; +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.Redirect; +import sun.reflect.CallerSensitive; + +import net.minecraft.world.biome.BiomeGenBase; + +@Mixin(BiomeGenBase.class) +public abstract class BiomeGenBaseMixin { + @Shadow @Final private static BiomeGenBase[] biomeList; + + @CallerSensitive + @Redirect(method = "getBiomeGenArray", + at = @At(value = "FIELD", + target = "Lnet/minecraft/world/biome/BiomeGenBase;biomeList:[Lnet/minecraft/world/biome/BiomeGenBase;", + opcode = Opcodes.GETSTATIC), + require = 1) + private static BiomeGenBase[] returnFakeArray() { + if (!EndlessIDs.postInitFinished) { + val trace = Thread.currentThread().getStackTrace()[3]; + if (trace.getMethodName().equals("updateBiomesFolder") && + trace.getClassName().equals("code.elix_x.coremods.antiidconflict.managers.BiomesManager")) { + return EndlessIDs.fakeBiomeArray; + } + } + return biomeList; + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBasePlaceholderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBasePlaceholderMixin.java new file mode 100644 index 0000000..a78c4ac --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/antiidconflict/BiomeGenBasePlaceholderMixin.java @@ -0,0 +1,31 @@ +package com.falsepattern.endlessids.mixin.mixins.common.antiidconflict; + +import code.elix_x.coremods.antiidconflict.core.AsmHooks; +import com.falsepattern.endlessids.PlaceholderBiome; +import org.spongepowered.asm.lib.Opcodes; +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.Redirect; + +import net.minecraft.world.biome.BiomeGenBase; + +@Mixin(BiomeGenBase.class) +public abstract class BiomeGenBasePlaceholderMixin { + @Shadow @Final private static BiomeGenBase[] biomeList; + + @SuppressWarnings({"InvalidInjectorMethodSignature", "UnresolvedMixinReference", "MixinAnnotationTarget"}) + @Redirect(method = "(IZ)V", + at = @At(value = "INVOKE", + target = "Lcode/elix_x/coremods/antiidconflict/core/AsmHooks;getBiomeID(IZ)I", + remap = false), + require = 1) + private int removePlaceholders(int id, boolean register) { + if (biomeList[id] instanceof PlaceholderBiome) { + biomeList[id] = null; + } + return AsmHooks.getBiomeID(id, register); + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeDictionaryMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeDictionaryMixin.java new file mode 100644 index 0000000..dce8678 --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeDictionaryMixin.java @@ -0,0 +1,31 @@ +package com.falsepattern.endlessids.mixin.mixins.common.vanilla.biome; + +import com.falsepattern.endlessids.EndlessIDs; +import com.falsepattern.endlessids.PlaceholderBiome; +import lombok.val; +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 net.minecraft.world.biome.BiomeGenBase; +import net.minecraftforge.common.BiomeDictionary; + +import java.util.Arrays; + +@Mixin(value = BiomeDictionary.class, + remap = false) +public abstract class BiomeDictionaryMixin { + @Inject(method = "registerAllBiomesAndGenerateEvents", + at = @At("HEAD"), + require = 1) + private static void cleanupBiomeArray(CallbackInfo ci) { + val biomes = BiomeGenBase.getBiomeGenArray(); + EndlessIDs.fakeBiomeArray = Arrays.copyOf(biomes, biomes.length); + for (int i = 0; i < biomes.length; i++) { + if (biomes[i] instanceof PlaceholderBiome) { + biomes[i] = null; + } + } + } +} diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBaseMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBaseMixin.java index 2860152..4099141 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBaseMixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBaseMixin.java @@ -1,18 +1,42 @@ package com.falsepattern.endlessids.mixin.mixins.common.vanilla.biome; +import com.falsepattern.endlessids.PlaceholderBiome; import com.falsepattern.endlessids.constants.ExtendedConstants; import com.falsepattern.endlessids.constants.VanillaConstants; import net.minecraft.world.biome.BiomeGenBase; + +import org.spongepowered.asm.mixin.Final; 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.Constant; +import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyConstant; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @Mixin(BiomeGenBase.class) public abstract class BiomeGenBaseMixin { + @Shadow @Final private static BiomeGenBase[] biomeList; + + @Shadow @Final public int biomeID; + @ModifyConstant(method = "", constant = @Constant(intValue = VanillaConstants.biomeIDCount), require = 1) private static int extendBiomeList(int constant) { return ExtendedConstants.biomeIDCount; } + + @Inject(method = "(IZ)V", + at = @At(value = "RETURN"), + require = 1) + private void generatePlaceholders(int p_i1971_1_, boolean register, CallbackInfo ci) { + if (((Object)this) instanceof PlaceholderBiome) return; + if (biomeID >= 128 && biomeList[biomeID - 128] == null) { + new PlaceholderBiome(biomeID - 128, (BiomeGenBase) (Object) this); + } + if (biomeID <= ExtendedConstants.biomeIDCount - 129 && biomeList[biomeID + 128] == null) { + new PlaceholderBiome(biomeID + 128, (BiomeGenBase) (Object) this); + } + } } diff --git a/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBasePlaceholderMixin.java b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBasePlaceholderMixin.java new file mode 100644 index 0000000..17cee7c --- /dev/null +++ b/src/main/java/com/falsepattern/endlessids/mixin/mixins/common/vanilla/biome/BiomeGenBasePlaceholderMixin.java @@ -0,0 +1,32 @@ +package com.falsepattern.endlessids.mixin.mixins.common.vanilla.biome; + +import com.falsepattern.endlessids.PlaceholderBiome; +import org.spongepowered.asm.lib.Opcodes; +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.Redirect; + +import net.minecraft.world.biome.BiomeGenBase; + +@Mixin(BiomeGenBase.class) +public abstract class BiomeGenBasePlaceholderMixin { + @Shadow @Final private static BiomeGenBase[] biomeList; + + @Mutable + @Shadow @Final public int biomeID; + + @Redirect(method = "(IZ)V", + at = @At(value = "FIELD", + opcode = Opcodes.PUTFIELD, + target = "Lnet/minecraft/world/biome/BiomeGenBase;biomeID:I"), + require = 1) + private void removePlaceholders(BiomeGenBase instance, int id) { + if (biomeList[id] instanceof PlaceholderBiome) { + biomeList[id] = null; + } + biomeID = id; + } +} 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 d70b989..e22f802 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/Mixin.java @@ -29,7 +29,9 @@ public enum Mixin implements IMixin { S26PacketMapChunkBulkMixin(Side.COMMON, always(), "vanilla.networking.S26PacketMapChunkBulkMixin"), //endregion Minecraft->common->networking //region Minecraft->common->biome + BiomeDictionaryMixin(Side.COMMON, always(), "vanilla.biome.BiomeDictionaryMixin"), BiomeGenBaseMixin(Side.COMMON, always(), "vanilla.biome.BiomeGenBaseMixin"), + BiomesGenBasePlaceholderMixin(Side.COMMON, avoid(TargetedMod.ANTIIDCONFLICT), "vanilla.biome.BiomeGenBasePlaceholderMixin"), //endregion Minecraft->common->biome //region Minecraft->common->misc BlockFireMixin(Side.COMMON, always(), "vanilla.misc.BlockFireMixin"), @@ -54,6 +56,10 @@ public enum Mixin implements IMixin { RenderGlobalMixin(Side.CLIENT, always(), "vanilla.RenderGlobalMixin"), //endregion Minecraft->client //endregion Minecraft + //region AntiIDConflict->common + AIDCBiomesGenBaseMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.BiomeGenBaseMixin"), + AIDCBiomesGenBasePlaceholderMixin(Side.COMMON, require(TargetedMod.ANTIIDCONFLICT), "antiidconflict.BiomeGenBasePlaceholderMixin"), + //endregion AntiIDConflict->common //region CoFHLib->common CoFHLibCofhBlockHelperMixin(Side.COMMON, require(TargetedMod.COFHLIB), "cofhlib.BlockHelperMixin"), //endregion CoFHLib->common diff --git a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java index 5d5649d..51d9b93 100644 --- a/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java +++ b/src/main/java/com/falsepattern/endlessids/mixin/plugin/TargetedMod.java @@ -11,6 +11,7 @@ import static com.falsepattern.lib.mixin.ITargetedMod.PredicateHelpers.*; @RequiredArgsConstructor public enum TargetedMod implements ITargetedMod { + ANTIIDCONFLICT("Anti ID Conflict", false, startsWith("antiidconflict")), COFHLIB("CoFH Lib", false, startsWith("cofhlib-")), DRAGONAPI("DragonAPI", false, startsWith("dragonapi")), GALACTICRAFTCORE("GalactiCraftCore", false, startsWith("galacticraftcore")),