From 11a2ac41b1792a71e38fa89c033f8c2b76819353 Mon Sep 17 00:00:00 2001 From: DarkGuardsman Date: Tue, 24 Sep 2013 11:22:12 -0400 Subject: [PATCH] Toyed with a new way to register TileEntitySpecialRenderers The idea is to let the object being registered control all aspects of how its registered. This started with the blocks adding config files, disabling themselves, and loading their own tile entities. Now i'm working on having the tile entities register their own renderers, and have configs as well. Give that the registration is actually handled by the ModObjectRegistry and the object just provided the data instead of the mod class. --- .../common/machines/TileEntitySolarPanel.java | 11 +++ .../core/common/transmit/TileEntityWire.java | 29 +++++- src/dark/core/prefab/IExtraInfo.java | 12 ++- .../prefab/machine/TileEntityMachine.java | 27 +++++- .../core/registration/ModObjectRegistry.java | 94 +++---------------- src/dark/core/registration/RegistryProxy.java | 22 +++++ .../registration/RegistryProxyClient.java | 45 +++++++++ 7 files changed, 155 insertions(+), 85 deletions(-) create mode 100644 src/dark/core/registration/RegistryProxy.java create mode 100644 src/dark/core/registration/RegistryProxyClient.java diff --git a/src/dark/core/common/machines/TileEntitySolarPanel.java b/src/dark/core/common/machines/TileEntitySolarPanel.java index df6dd768..39b6a59b 100644 --- a/src/dark/core/common/machines/TileEntitySolarPanel.java +++ b/src/dark/core/common/machines/TileEntitySolarPanel.java @@ -3,9 +3,13 @@ package dark.core.common.machines; import java.util.EnumSet; import micdoodle8.mods.galacticraft.API.ISolarLevel; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.item.ItemStack; import net.minecraftforge.common.ForgeDirection; import universalelectricity.core.electricity.ElectricityPack; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dark.core.client.renders.RenderBlockSolarPanel; import dark.core.prefab.machine.TileEntityEnergyMachine; public class TileEntitySolarPanel extends TileEntityEnergyMachine @@ -84,4 +88,11 @@ public class TileEntitySolarPanel extends TileEntityEnergyMachine { return 0; } + + @Override + @SideOnly(Side.CLIENT) + public TileEntitySpecialRenderer getClientTileEntityRenderer() + { + return new RenderBlockSolarPanel(); + } } diff --git a/src/dark/core/common/transmit/TileEntityWire.java b/src/dark/core/common/transmit/TileEntityWire.java index 3de21de5..4f796582 100644 --- a/src/dark/core/common/transmit/TileEntityWire.java +++ b/src/dark/core/common/transmit/TileEntityWire.java @@ -1,8 +1,15 @@ package dark.core.common.transmit; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraftforge.common.Configuration; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dark.core.client.renders.RenderBlockSolarPanel; +import dark.core.client.renders.RenderBlockWire; +import dark.core.prefab.IExtraInfo.IExtraTileEntityInfo; import universalelectricity.compatibility.TileEntityUniversalConductor; -public class TileEntityWire extends TileEntityUniversalConductor +public class TileEntityWire extends TileEntityUniversalConductor implements IExtraTileEntityInfo { int updateTick = 0; @@ -35,4 +42,24 @@ public class TileEntityWire extends TileEntityUniversalConductor return true; } + @Override + @SideOnly(Side.CLIENT) + public TileEntitySpecialRenderer getClientTileEntityRenderer() + { + return new RenderBlockWire(); + } + + @Override + public boolean hasExtraConfigs() + { + return false; + } + + @Override + public void loadExtraConfigs(Configuration config) + { + + + } + } diff --git a/src/dark/core/prefab/IExtraInfo.java b/src/dark/core/prefab/IExtraInfo.java index a0f178d2..d2158883 100644 --- a/src/dark/core/prefab/IExtraInfo.java +++ b/src/dark/core/prefab/IExtraInfo.java @@ -2,15 +2,19 @@ package dark.core.prefab; import java.util.Set; -import com.builtbroken.common.Pair; - import net.minecraft.block.ITileEntityProvider; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.Configuration; +import com.builtbroken.common.Pair; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; + /** Used to handle info about the block that would normally be handled by the mod main class. Use the * BlockRegistry in order for these methods to be called on load of the mod. - * + * * @author DarkGuardsman */ public interface IExtraInfo { @@ -36,6 +40,8 @@ public interface IExtraInfo public static interface IExtraTileEntityInfo extends IExtraInfo { + @SideOnly(Side.CLIENT) + public TileEntitySpecialRenderer getClientTileEntityRenderer(); } } diff --git a/src/dark/core/prefab/machine/TileEntityMachine.java b/src/dark/core/prefab/machine/TileEntityMachine.java index e5f2c6d2..9e5c769d 100644 --- a/src/dark/core/prefab/machine/TileEntityMachine.java +++ b/src/dark/core/prefab/machine/TileEntityMachine.java @@ -4,6 +4,7 @@ import java.io.ByteArrayInputStream; import java.io.DataInputStream; import java.io.IOException; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.ISidedInventory; import net.minecraft.nbt.NBTTagCompound; @@ -11,6 +12,7 @@ import net.minecraft.network.INetworkManager; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.util.AxisAlignedBB; +import net.minecraftforge.common.Configuration; import net.minecraftforge.common.ForgeDirection; import universalelectricity.core.vector.Vector3; import universalelectricity.prefab.network.IPacketReceiver; @@ -23,8 +25,9 @@ import dark.core.common.DarkMain; import dark.core.interfaces.IExternalInv; import dark.core.interfaces.IInvBox; import dark.core.network.PacketHandler; +import dark.core.prefab.IExtraInfo.IExtraTileEntityInfo; -public class TileEntityMachine extends TileEntityInv implements ISidedInventory, IExternalInv, IDisableable, IPacketReceiver, IRotatable +public abstract class TileEntityMachine extends TileEntityInv implements ISidedInventory, IExternalInv, IDisableable, IPacketReceiver, IRotatable, IExtraTileEntityInfo { protected int disabledTicks = 0, playersUsingMachine = 0; protected boolean functioning = false, prevFunctioning = false, hasGUI = false, rotateByMetaGroup = false, canBeDisabled = false; @@ -206,7 +209,7 @@ public class TileEntityMachine extends TileEntityInv implements ISidedInventory, } /** Handles reduced data from the main packet method - * + * * @param id - packet ID * @param dis - data * @param player - player @@ -289,4 +292,24 @@ public class TileEntityMachine extends TileEntityInv implements ISidedInventory, { return !this.canBeDisabled && this.disabledTicks > 0; } + + @Override + public boolean hasExtraConfigs() + { + // TODO Auto-generated method stub + return false; + } + + @Override + public void loadExtraConfigs(Configuration config) + { + // TODO Auto-generated method stub + + } + + @Override + public TileEntitySpecialRenderer getClientTileEntityRenderer() + { + return null; + } } diff --git a/src/dark/core/registration/ModObjectRegistry.java b/src/dark/core/registration/ModObjectRegistry.java index 87d65410..c6d4e72f 100644 --- a/src/dark/core/registration/ModObjectRegistry.java +++ b/src/dark/core/registration/ModObjectRegistry.java @@ -1,16 +1,10 @@ package dark.core.registration; import java.io.File; -import java.lang.annotation.Annotation; import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Type; import java.util.HashSet; import java.util.Set; -import com.builtbroken.common.Pair; - import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; @@ -19,8 +13,11 @@ import net.minecraft.tileentity.TileEntity; import net.minecraftforge.common.Configuration; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidRegistry; + +import com.builtbroken.common.Pair; + import cpw.mods.fml.common.Loader; -import cpw.mods.fml.common.registry.GameRegistry; +import cpw.mods.fml.common.SidedProxy; import dark.core.common.DarkMain; import dark.core.prefab.IExtraInfo; import dark.core.prefab.IExtraInfo.IExtraBlockInfo; @@ -28,10 +25,14 @@ import dark.core.prefab.ModPrefab; import dark.core.prefab.machine.BlockMachine; /** Handler to make registering all parts of a mod's objects that are loaded into the game by forge - * + * * @author DarkGuardsman */ public class ModObjectRegistry { + + @SidedProxy(clientSide = "dark.core.registration.RegistryProxyClient", serverSide = "dark.core.registration.RegistryProxy") + public static RegistryProxy proxy; + public static Configuration masterBlockConfig = new Configuration(new File(Loader.instance().getConfigDir(), "Dark/EnabledBlocks.cfg")); public static Block createNewBlock(String name, String modID, Class blockClass) @@ -64,7 +65,7 @@ public class ModObjectRegistry } if (block != null) { - ModObjectRegistry.registerBlock(block, itemClass, name, modID); + proxy.registerBlock(block, itemClass, name, modID); ModObjectRegistry.finishCreation(block, null); } } @@ -111,7 +112,7 @@ public class ModObjectRegistry } } - ModObjectRegistry.registerBlock(block, buildData.itemBlock, buildData.blockName, modID); + proxy.registerBlock(block, buildData.itemBlock, buildData.blockName, modID); ModObjectRegistry.finishCreation(block, buildData); } } @@ -128,69 +129,12 @@ public class ModObjectRegistry { if (block != null) { - BlockTileEntityInfo blockTileEntityInfo = block.getClass().getAnnotation(BlockTileEntityInfo.class); - if (blockTileEntityInfo != null) - { - System.out.println("\n\n\n\n[ModObjectRegistry] Reading tile entities for " + block.getUnlocalizedName()); - Class[] tileEntities = blockTileEntityInfo.tileEntities(); - String[] tileEntitiesNames = blockTileEntityInfo.tileEntitiesNames(); - - if (tileEntities != null && tileEntities.length > 0 && tileEntitiesNames != null && tileEntitiesNames.length > 0) - { - for (int i = 0; i < tileEntities.length && i < tileEntitiesNames.length; i++) - { - GameRegistry.registerTileEntityWithAlternatives(tileEntities[i], tileEntitiesNames[i], "DM" + tileEntitiesNames[i]); - } - } - } - - // Read threw the block class looking for annotions on fields - for (Method method : block.getClass().getMethods()) - { - System.out.println("[ModObjectRegistry] Reading class methods " + method.toGenericString()); - for (Annotation annotian : method.getDeclaredAnnotations()) - { - System.out.println("[ModObjectRegistry] Reading annotion " + annotian.toString()); - if (annotian instanceof BlockConfigFile) - { - - System.out.println("[ModObjectRegistry] Loading config file for " + block.getUnlocalizedName()); - Type[] types = method.getParameterTypes(); - if (types.length == 1 && types[0] instanceof Configuration) - { - Configuration extraBlockConfig = new Configuration(new File(Loader.instance().getConfigDir(), "Dark/blocks/" + block.getUnlocalizedName() + ".cfg")); - extraBlockConfig.load(); - try - { - method.setAccessible(true); - method.invoke(extraBlockConfig); - } - catch (IllegalAccessException e) - { - e.printStackTrace(); - } - catch (IllegalArgumentException e) - { - e.printStackTrace(); - } - catch (InvocationTargetException e) - { - e.printStackTrace(); - } - extraBlockConfig.save(); - - } - break; - } - } - } - // Load data from BlockBuildData if (data.tiles != null) { for (Pair> par : data.tiles) { - GameRegistry.registerTileEntityWithAlternatives(par.right(), par.left(), "DM" + par.left()); + proxy.regiserTileEntity(par.left(), par.right()); } } if (data.creativeTab != null) @@ -215,7 +159,7 @@ public class ModObjectRegistry ((IExtraBlockInfo) block).getTileEntities(block.blockID, tileListNew); for (Pair> par : tileListNew) { - GameRegistry.registerTileEntityWithAlternatives(par.right(), par.left(), "DM" + par.left()); + proxy.regiserTileEntity(par.left(), par.right()); } } } @@ -238,7 +182,7 @@ public class ModObjectRegistry if (fluidActual.getBlockID() == -1 && masterBlockConfig.get("Enabled_List", "Enabled_" + fluid.getName() + "Block", true).getBoolean(true)) { fluidBlock = new BlockFluid(modDomainPrefix, fluidActual, config).setUnlocalizedName("tile.Fluid." + fluid.getName()); - GameRegistry.registerBlock(fluidBlock, "DMBlockFluid" + fluid.getName()); + proxy.registerBlock(fluidBlock, null, "DMBlockFluid" + fluid.getName(), modDomainPrefix); } else { @@ -249,14 +193,6 @@ public class ModObjectRegistry return fluidBlock; } - public static void registerBlock(Block block, Class itemClass, String name, String modID) - { - if (block != null && name != null) - { - GameRegistry.registerBlock(block, itemClass == null ? ItemBlock.class : itemClass, name, modID); - } - } - public static class BlockBuildData { public Class blockClass; @@ -308,7 +244,7 @@ public class ModObjectRegistry } /** Adds a tileEntity to be registered when this block is registered - * + * * @param name - mod name for the tileEntity, should be unique * @param class1 - new instance of the TileEntity to register */ public BlockBuildData addTileEntity(String name, Class class1) diff --git a/src/dark/core/registration/RegistryProxy.java b/src/dark/core/registration/RegistryProxy.java new file mode 100644 index 00000000..1896ccad --- /dev/null +++ b/src/dark/core/registration/RegistryProxy.java @@ -0,0 +1,22 @@ +package dark.core.registration; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemBlock; +import net.minecraft.tileentity.TileEntity; +import cpw.mods.fml.common.registry.GameRegistry; + +public class RegistryProxy +{ + public void registerBlock(Block block, Class itemClass, String name, String modID) + { + if (block != null && name != null) + { + GameRegistry.registerBlock(block, itemClass == null ? ItemBlock.class : itemClass, name, modID); + } + } + + public void regiserTileEntity(String name, Class clazz) + { + GameRegistry.registerTileEntityWithAlternatives(clazz, name, "DM" + name); + } +} diff --git a/src/dark/core/registration/RegistryProxyClient.java b/src/dark/core/registration/RegistryProxyClient.java new file mode 100644 index 00000000..5c4c90e2 --- /dev/null +++ b/src/dark/core/registration/RegistryProxyClient.java @@ -0,0 +1,45 @@ +package dark.core.registration; + +import cpw.mods.fml.client.registry.ClientRegistry; +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import dark.core.prefab.IExtraInfo.IExtraTileEntityInfo; +import net.minecraft.block.Block; +import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; +import net.minecraft.item.ItemBlock; +import net.minecraft.tileentity.TileEntity; + +@SideOnly(Side.CLIENT) +public class RegistryProxyClient extends RegistryProxy +{ + @Override + public void registerBlock(Block block, Class itemClass, String name, String modID) + { + super.registerBlock(block, itemClass, name, modID); + } + + @Override + public void regiserTileEntity(String name, Class clazz) + { + super.regiserTileEntity(name, clazz); + try + { + TileEntity entity = clazz.newInstance(); + if (entity instanceof IExtraTileEntityInfo) + { + TileEntitySpecialRenderer render = ((IExtraTileEntityInfo) entity).getClientTileEntityRenderer(); + if (render != null) + { + ClientRegistry.bindTileEntitySpecialRenderer(clazz, render); + } + } + } + catch (InstantiationException e) + { + } + catch (IllegalAccessException e) + { + e.printStackTrace(); + } + } +}