diff --git a/src/main/java/WayofTime/bloodmagic/BloodMagic.java b/src/main/java/WayofTime/bloodmagic/BloodMagic.java index 5d598f21..35aa9489 100644 --- a/src/main/java/WayofTime/bloodmagic/BloodMagic.java +++ b/src/main/java/WayofTime/bloodmagic/BloodMagic.java @@ -6,22 +6,26 @@ import WayofTime.bloodmagic.api.util.helper.LogHelper; import WayofTime.bloodmagic.client.gui.GuiHandler; import WayofTime.bloodmagic.command.CommandBloodMagic; import WayofTime.bloodmagic.compat.ICompatibility; +import WayofTime.bloodmagic.compat.minecraft.ICrossVersionProxy; import WayofTime.bloodmagic.network.BloodMagicPacketHandler; import WayofTime.bloodmagic.proxy.CommonProxy; import WayofTime.bloodmagic.registry.*; import WayofTime.bloodmagic.util.Utils; import WayofTime.bloodmagic.util.handler.IMCHandler; +import com.google.common.collect.ImmutableMap; import lombok.Getter; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.item.Item; import net.minecraft.launchwrapper.Launch; import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fml.common.Loader; import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.SidedProxy; import net.minecraftforge.fml.common.event.*; import net.minecraftforge.fml.common.network.NetworkRegistry; import java.io.File; +import java.util.Map; import java.util.Set; @Mod(modid = Constants.Mod.MODID, name = Constants.Mod.NAME, version = Constants.Mod.VERSION, dependencies = Constants.Mod.DEPEND, guiFactory = "WayofTime.bloodmagic.client.gui.config.ConfigGuiFactory") @@ -52,14 +56,36 @@ public class BloodMagic } }; - static - { - FluidRegistry.enableUniversalBucket(); - } - @Getter private static boolean isDev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment"); + @Getter + private static ICrossVersionProxy crossVersionProxy; + private static final Map PROXY_MAP = ImmutableMap.of( + "1.9.4", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy19", + "1.10", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy110", + "1.10.2", "WayofTime.bloodmagic.compat.minecraft.CrossVersionProxy110" + ); + + static + { + try + { + String mcVersion = (String) Loader.class.getDeclaredField("MC_VERSION").get(null); + + if(!PROXY_MAP.containsKey(mcVersion)) + throw new IllegalStateException("Blood Magic couldn't find a cross version proxy!"); + + Class proxyClass = Class.forName(PROXY_MAP.get(mcVersion)); + crossVersionProxy = (ICrossVersionProxy) proxyClass.newInstance(); + } catch (Exception e) + { + throw new IllegalArgumentException("Blood Magic could not find a cross version proxy!", e); + } + + FluidRegistry.enableUniversalBucket(); + } + private LogHelper logger = new LogHelper(Constants.Mod.MODID); private File configDir; diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java new file mode 100644 index 00000000..b9fb4782 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy110.java @@ -0,0 +1,24 @@ +package WayofTime.bloodmagic.compat.minecraft; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.ReflectionHelper; + +import java.lang.reflect.Method; + +public class CrossVersionProxy110 implements ICrossVersionProxy { + + @Override + public TileEntity createTileFromData(World world, NBTTagCompound tagCompound) + { + Method m = ReflectionHelper.findMethod(TileEntity.class, null, new String[] { "create", "func_190200_a", "a" }, World.class, NBTTagCompound.class); + try + { + return (TileEntity) m.invoke(null, world, tagCompound); + } catch (Exception e) + { + return null; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java new file mode 100644 index 00000000..a39b7f91 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/compat/minecraft/CrossVersionProxy19.java @@ -0,0 +1,24 @@ +package WayofTime.bloodmagic.compat.minecraft; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.fml.relauncher.ReflectionHelper; + +import java.lang.reflect.Method; + +public class CrossVersionProxy19 implements ICrossVersionProxy { + + @Override + public TileEntity createTileFromData(World world, NBTTagCompound tagCompound) + { + Method m = ReflectionHelper.findMethod(TileEntity.class, null, new String[] { "create", "func_189514_c", "c" }, NBTTagCompound.class); + try + { + return (TileEntity) m.invoke(null, tagCompound); + } catch (Exception e) + { + return null; + } + } +} diff --git a/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java b/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java new file mode 100644 index 00000000..9a77bf31 --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/compat/minecraft/ICrossVersionProxy.java @@ -0,0 +1,15 @@ +package WayofTime.bloodmagic.compat.minecraft; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; + +/** + * Allows for Blood Magic to support multiple MC versions that have only slight changes. + * + * Implementation copied from Botania. + */ +public interface ICrossVersionProxy +{ + TileEntity createTileFromData(World world, NBTTagCompound tagCompound); +} diff --git a/src/main/java/WayofTime/bloodmagic/util/Utils.java b/src/main/java/WayofTime/bloodmagic/util/Utils.java index 6ec84565..2d4be5a4 100644 --- a/src/main/java/WayofTime/bloodmagic/util/Utils.java +++ b/src/main/java/WayofTime/bloodmagic/util/Utils.java @@ -819,7 +819,7 @@ public class Utils if (initialTile != null) { - TileEntity newTileInitial = TileEntity.create(initialTag); + TileEntity newTileInitial = BloodMagic.getCrossVersionProxy().createTileFromData(finalWorld, initialTag); finalWorld.setTileEntity(finalPos, newTileInitial); newTileInitial.setPos(finalPos); @@ -830,7 +830,7 @@ public class Utils if (finalTile != null) { - TileEntity newTileFinal = TileEntity.create(finalTag); + TileEntity newTileFinal = BloodMagic.getCrossVersionProxy().createTileFromData(initialWorld, finalTag); initialWorld.setTileEntity(initialPos, newTileFinal); newTileFinal.setPos(initialPos);