Add a proxy system for better cross-version compat (#831)
This commit is contained in:
parent
d314d84fbe
commit
ab73edf5d3
|
@ -6,22 +6,26 @@ import WayofTime.bloodmagic.api.util.helper.LogHelper;
|
||||||
import WayofTime.bloodmagic.client.gui.GuiHandler;
|
import WayofTime.bloodmagic.client.gui.GuiHandler;
|
||||||
import WayofTime.bloodmagic.command.CommandBloodMagic;
|
import WayofTime.bloodmagic.command.CommandBloodMagic;
|
||||||
import WayofTime.bloodmagic.compat.ICompatibility;
|
import WayofTime.bloodmagic.compat.ICompatibility;
|
||||||
|
import WayofTime.bloodmagic.compat.minecraft.ICrossVersionProxy;
|
||||||
import WayofTime.bloodmagic.network.BloodMagicPacketHandler;
|
import WayofTime.bloodmagic.network.BloodMagicPacketHandler;
|
||||||
import WayofTime.bloodmagic.proxy.CommonProxy;
|
import WayofTime.bloodmagic.proxy.CommonProxy;
|
||||||
import WayofTime.bloodmagic.registry.*;
|
import WayofTime.bloodmagic.registry.*;
|
||||||
import WayofTime.bloodmagic.util.Utils;
|
import WayofTime.bloodmagic.util.Utils;
|
||||||
import WayofTime.bloodmagic.util.handler.IMCHandler;
|
import WayofTime.bloodmagic.util.handler.IMCHandler;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import net.minecraft.creativetab.CreativeTabs;
|
import net.minecraft.creativetab.CreativeTabs;
|
||||||
import net.minecraft.item.Item;
|
import net.minecraft.item.Item;
|
||||||
import net.minecraft.launchwrapper.Launch;
|
import net.minecraft.launchwrapper.Launch;
|
||||||
import net.minecraftforge.fluids.FluidRegistry;
|
import net.minecraftforge.fluids.FluidRegistry;
|
||||||
|
import net.minecraftforge.fml.common.Loader;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
import net.minecraftforge.fml.common.SidedProxy;
|
import net.minecraftforge.fml.common.SidedProxy;
|
||||||
import net.minecraftforge.fml.common.event.*;
|
import net.minecraftforge.fml.common.event.*;
|
||||||
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
import net.minecraftforge.fml.common.network.NetworkRegistry;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
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")
|
@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
|
@Getter
|
||||||
private static boolean isDev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
|
private static boolean isDev = (Boolean) Launch.blackboard.get("fml.deobfuscatedEnvironment");
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private static ICrossVersionProxy crossVersionProxy;
|
||||||
|
private static final Map<String, String> 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 LogHelper logger = new LogHelper(Constants.Mod.MODID);
|
||||||
private File configDir;
|
private File configDir;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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 <a href="https://github.com/williewillus/Botania">Botania</a>.
|
||||||
|
*/
|
||||||
|
public interface ICrossVersionProxy
|
||||||
|
{
|
||||||
|
TileEntity createTileFromData(World world, NBTTagCompound tagCompound);
|
||||||
|
}
|
|
@ -819,7 +819,7 @@ public class Utils
|
||||||
|
|
||||||
if (initialTile != null)
|
if (initialTile != null)
|
||||||
{
|
{
|
||||||
TileEntity newTileInitial = TileEntity.create(initialTag);
|
TileEntity newTileInitial = BloodMagic.getCrossVersionProxy().createTileFromData(finalWorld, initialTag);
|
||||||
|
|
||||||
finalWorld.setTileEntity(finalPos, newTileInitial);
|
finalWorld.setTileEntity(finalPos, newTileInitial);
|
||||||
newTileInitial.setPos(finalPos);
|
newTileInitial.setPos(finalPos);
|
||||||
|
@ -830,7 +830,7 @@ public class Utils
|
||||||
|
|
||||||
if (finalTile != null)
|
if (finalTile != null)
|
||||||
{
|
{
|
||||||
TileEntity newTileFinal = TileEntity.create(finalTag);
|
TileEntity newTileFinal = BloodMagic.getCrossVersionProxy().createTileFromData(initialWorld, finalTag);
|
||||||
|
|
||||||
initialWorld.setTileEntity(initialPos, newTileFinal);
|
initialWorld.setTileEntity(initialPos, newTileFinal);
|
||||||
newTileFinal.setPos(initialPos);
|
newTileFinal.setPos(initialPos);
|
||||||
|
|
Loading…
Reference in a new issue