diff options
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity')
16 files changed, 378 insertions, 510 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java index 800e9af20a..1697eb03ce 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlock.java @@ -14,6 +14,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import net.minecraft.block.Block; +import net.minecraft.block.BlockContainer; import net.minecraft.block.ITileEntityProvider; import net.minecraft.block.material.Material; import net.minecraft.client.renderer.texture.IIconRegister; @@ -24,7 +25,6 @@ import net.minecraft.entity.EnumCreatureType; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.stats.StatList; import net.minecraft.tileentity.TileEntity; @@ -62,11 +62,14 @@ import gregtech.common.render.GT_MultiTile_Renderer; * MultiTileEntityBlock ported from GT6 */ @Optional.Interface(iface = "com.cricketcraft.chisel.api.IFacade", modid = "ChiselAPI") -public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITileEntityProvider, IFacade { +public class MultiTileEntityBlock extends BlockContainer implements IDebugableBlock, ITileEntityProvider, IFacade { + + private MultiTileEntityRegistry registry; private static boolean LOCK = false; - private boolean registered = false, normalCube; + private boolean registered = false; + private boolean normalCube; protected String internalName, toolName, materialName, modID; public String getName() { @@ -125,7 +128,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil internalName = getName(); lightOpacity = isOpaqueCube() ? 255 : 0; - GameRegistry.registerBlock(this, ItemBlock.class, internalName); + GameRegistry.registerBlock(this, MultiTileEntityItem.class, internalName); return this; } @@ -382,6 +385,18 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil return 0; } + public MultiTileEntityRegistry getRegistry() { + return registry; + } + + public void setRegistry(MultiTileEntityRegistry registry) { + this.registry = registry; + } + + public boolean isRegistered() { + return registered; + } + @Override protected boolean canSilkHarvest() { return false; @@ -389,11 +404,13 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil @Override public final String getLocalizedName() { + // return StatCollector.translateToLocal(registry.getInternalName() + ".name"); return StatCollector.translateToLocal(internalName + ".name"); } @Override public final String getUnlocalizedName() { + // return registry.getInternalName(); return internalName; } @@ -571,12 +588,7 @@ public class MultiTileEntityBlock extends Block implements IDebugableBlock, ITil } @Override - public final TileEntity createTileEntity(World world, int meta) { - return null; - } - - @Override - public TileEntity createNewTileEntity(World world, int i) { - return null; + public TileEntity createNewTileEntity(World world, int meta) { + return registry.getNewTileEntity(meta); } } diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java deleted file mode 100644 index 3d8da5d796..0000000000 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityBlockRegistryInternal.java +++ /dev/null @@ -1,47 +0,0 @@ -package gregtech.api.multitileentity; - -import net.minecraft.block.Block; -import net.minecraft.block.material.Material; -import net.minecraft.client.renderer.texture.IIconRegister; -import net.minecraft.util.StatCollector; - -import gregtech.common.render.GT_MultiTile_Renderer; - -/* - * The internal block used in the registry for lookup. - * - Not the same as the block spawned with the MuTE to allow for multiple different types of blocks/materials - * in each registry. - */ -public class MultiTileEntityBlockRegistryInternal extends Block { - - public MultiTileEntityRegistry registry; - - public MultiTileEntityBlockRegistryInternal() { - super(Material.anvil); - } - - @Override - public void registerBlockIcons(IIconRegister aIconRegister) { - /* Do Nothing */ - } - - @Override - public int getRenderType() { - return GT_MultiTile_Renderer.INSTANCE == null ? super.getRenderType() - : GT_MultiTile_Renderer.INSTANCE.getRenderId(); - } - - @Override - public final String getUnlocalizedName() { - return registry.getInternalName(); - } - - @Override - public final String getLocalizedName() { - return StatCollector.translateToLocal(registry.getInternalName() + ".name"); - } - - public MultiTileEntityRegistry getRegistry() { - return registry; - } -} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java index 6eba28bad9..325f583149 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityClassContainer.java @@ -21,15 +21,11 @@ public class MultiTileEntityClassContainer { private String localized; private String categoryName; - public final short muteID; - public Class<? extends MultiTileEntity> muteClass; - public MultiTileEntityBlock block; - public MultiTileEntity referenceTileEntity; - public NBTTagCompound parameters; - - // These have defaults - public byte blockMetaData = 1; - public byte maxStackSize = 64; + private final short muteID; + private final Class<? extends MultiTileEntity> muteClass; + private MultiTileEntity referenceTileEntity; + private NBTTagCompound parameters; + public boolean hidden = false; public MultiTileEntityClassContainer(MultiTileEntityRegistry aRegistry, int aID, @@ -72,26 +68,11 @@ public class MultiTileEntityClassContainer { return this; } - public MultiTileEntityClassContainer meta(int aMeta) { - blockMetaData = (byte) aMeta; - return this; - } - - public MultiTileEntityClassContainer stackSize(int aStackSize) { - maxStackSize = (byte) aStackSize; - return this; - } - public MultiTileEntityClassContainer hide() { hidden = true; return this; } - public MultiTileEntityClassContainer setBlock(MultiTileEntityBlock aBlock) { - block = aBlock; - return this; - } - /* These methods are builder methods for commonly used NBT tags */ // Need a base texture for the MTE machine, and then a separate texture set for the machine/active overlays @@ -177,6 +158,26 @@ public class MultiTileEntityClassContainer { return this; } + public WeakReference<MultiTileEntityRegistry> getRegistry() { + return registry; + } + + public Class<? extends MultiTileEntity> getMuteClass() { + return muteClass; + } + + public short getMuteID() { + return muteID; + } + + public MultiTileEntity getReferenceTileEntity() { + return referenceTileEntity; + } + + public NBTTagCompound getParameters() { + return parameters; + } + private void verifyDescendentOf(Class<?> cls) { // Check if cls is extended by mClass if (!cls.isAssignableFrom(muteClass)) { diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java deleted file mode 100644 index 3ca0ee46f4..0000000000 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityContainer.java +++ /dev/null @@ -1,24 +0,0 @@ -package gregtech.api.multitileentity; - -import net.minecraft.world.World; - -import gregtech.api.multitileentity.base.MultiTileEntity; -import gregtech.api.util.GT_Util; - -public class MultiTileEntityContainer { - - public final MultiTileEntity tileEntity; - public final MultiTileEntityBlock block; - public final byte blockMetaData; - - public MultiTileEntityContainer(MultiTileEntity tileEntity, MultiTileEntityBlock block, byte blockMetaData) { - this.blockMetaData = blockMetaData; - this.tileEntity = tileEntity; - this.block = block; - } - - public void setMultiTile(World aWorld, int aX, int aY, int aZ) { - GT_Util.setBlock(aWorld, aX, aY, aZ, block, blockMetaData, 0, false); - GT_Util.setTileEntity(aWorld, aX, aY, aZ, tileEntity, true); - } -} diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java index 8dc1d348ff..e67ab61e96 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityItem.java @@ -16,44 +16,43 @@ import net.minecraft.item.Item; import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.IFluidContainerItem; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.metatileentity.CoverableTileEntity; -import gregtech.api.multitileentity.interfaces.IItemUpdatable; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; -public class MultiTileEntityItem extends ItemBlock implements IFluidContainerItem, IItemUpdatable { +public class MultiTileEntityItem extends ItemBlock { - public final MultiTileEntityBlockRegistryInternal mBlock; + public final MultiTileEntityBlock block; - public MultiTileEntityItem(Block aBlock) { - super(aBlock); + public MultiTileEntityItem(Block block) { + super(block); setMaxDamage(0); setHasSubtypes(true); - mBlock = (MultiTileEntityBlockRegistryInternal) aBlock; + this.block = (MultiTileEntityBlock) block; } @Override @SuppressWarnings("unchecked") - public void addInformation(ItemStack aStack, EntityPlayer aPlayer, List<String> aList, boolean aF3_H) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer == null) { - aList.add("INVALID ITEM!"); + public void addInformation(ItemStack stack, EntityPlayer player, List<String> list, boolean F3_H) { + final IMultiTileEntity mute = block.getRegistry() + .getReferenceTileEntity(stack); + if (mute == null) { + list.add("INVALID ITEM!"); return; } try { - tTileEntityContainer.tileEntity.addToolTips(aList, aStack, aF3_H); + mute.addToolTips(list, stack, F3_H); } catch (Throwable e) { GT_FML_LOGGER.error("addInformation", e); } - final NBTTagCompound aNBT = aStack.getTagCompound(); - CoverableTileEntity.addInstalledCoversInformation(aNBT, aList); + final NBTTagCompound aNBT = stack.getTagCompound(); + CoverableTileEntity.addInstalledCoversInformation(aNBT, list); // TODO: Add anything else relevant } @@ -61,68 +60,68 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte @SideOnly(Side.CLIENT) @SuppressWarnings("unchecked") public void getSubItems(Item aItem, CreativeTabs aTab, List<ItemStack> aList) { - for (MultiTileEntityClassContainer tClass : mBlock.registry.registrations) { - if (!tClass.hidden && ((IMultiTileEntity) tClass.referenceTileEntity) - .getSubItems(mBlock, aItem, aTab, aList, tClass.muteID)) { - aList.add(mBlock.registry.getItem(tClass.muteID)); + for (MultiTileEntityClassContainer tClass : block.getRegistry().registrations) { + if (!tClass.hidden && ((IMultiTileEntity) tClass.getReferenceTileEntity()) + .getSubItems(block, aItem, aTab, aList, tClass.getMuteID())) { + aList.add( + block.getRegistry() + .getItem(tClass.getMuteID())); } } } @Override - public boolean onItemUse(ItemStack aStack, EntityPlayer aPlayer, World aWorld, int aX, int aY, int aZ, - int ordinalSide, float aHitX, float aHitY, float aHitZ) { + public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int ordinalSide, + float hitX, float hitY, float hitZ) { - if (aY < 0 || aY > aWorld.getHeight()) return false; + if (y < 0 || y > world.getHeight()) return false; - if (aPlayer == null) return false; + if (player == null) return false; try { ForgeDirection side = ForgeDirection.getOrientation(ordinalSide); - final Block tClickedBlock = aWorld.getBlock(aX, aY, aZ); + final Block clickedBlock = world.getBlock(x, y, z); - if (tClickedBlock instanceof BlockSnow && (aWorld.getBlockMetadata(aX, aY, aZ) & 7) < 1) { + if (clickedBlock instanceof BlockSnow && (world.getBlockMetadata(x, y, z) & 7) < 1) { ordinalSide = SIDE_TOP; side = ForgeDirection.UP; - } else if (tClickedBlock != Blocks.vine && tClickedBlock != Blocks.tallgrass - && tClickedBlock != Blocks.deadbush - && !tClickedBlock.isReplaceable(aWorld, aX, aY, aZ)) { - aX += side.offsetX; - aY += side.offsetY; - aZ += side.offsetZ; + } else if (clickedBlock != Blocks.vine && clickedBlock != Blocks.tallgrass + && clickedBlock != Blocks.deadbush + && !clickedBlock.isReplaceable(world, x, y, z)) { + x += side.offsetX; + y += side.offsetY; + z += side.offsetZ; } - final Block tReplacedBlock = aWorld.getBlock(aX, aY, aZ); + final Block tReplacedBlock = world.getBlock(x, y, z); - if (!tReplacedBlock.isReplaceable(aWorld, aX, aY, aZ) - || !mBlock.canReplace(aWorld, aX, aY, aZ, ordinalSide, aStack)) { + if (!tReplacedBlock.isReplaceable(world, x, y, z) + || !block.canReplace(world, x, y, z, ordinalSide, stack)) { return false; } - if (aStack.stackSize == 0 || (!aPlayer.canPlayerEdit(aX, aY, aZ, ordinalSide, aStack))) { + if (stack.stackSize == 0 || (!player.canPlayerEdit(x, y, z, ordinalSide, stack))) { return false; } + // final TileEntity tileEntity = block.getRegistry().getNewTileEntity(world, x, y, z, stack); - final MultiTileEntityContainer MuTEContainer = mBlock.registry - .getNewTileEntityContainer(aWorld, aX, aY, aZ, aStack); - - if (MuTEContainer == null) return false; - - if (!aWorld.setBlock(aX, aY, aZ, MuTEContainer.block, 15 - MuTEContainer.blockMetaData, 2)) { + if (!world.setBlock(x, y, z, block, Items.feather.getDamage(stack), 2)) { return false; } - - MuTEContainer.setMultiTile(aWorld, aX, aY, aZ); + final TileEntity te = world.getTileEntity(x, y, z); + if (!(te instanceof IMultiTileEntity mute)) { + throw new IllegalStateException("TileEntity is not an IMultiTileEntity"); + } + // MuTEContainer.setMultiTile(world, x, y, z); try { - if (((IMultiTileEntity) MuTEContainer.tileEntity) - .onPlaced(aStack, aPlayer, aWorld, aX, aY, aZ, side, aHitX, aHitY, aHitZ)) { - aWorld.playSoundEffect( - aX + 0.5, - aY + 0.5, - aZ + 0.5, - MuTEContainer.block.stepSound.func_150496_b(), - (MuTEContainer.block.stepSound.getVolume() + 1) / 2, - MuTEContainer.block.stepSound.getPitch() * 0.8F); + if (mute.onPlaced(stack, player, world, x, y, z, side, hitX, hitY, hitZ)) { + world.playSoundEffect( + x + 0.5, + y + 0.5, + z + 0.5, + block.stepSound.func_150496_b(), + (block.stepSound.getVolume() + 1) / 2, + block.stepSound.getPitch() * 0.8F); } } catch (Throwable e) { GT_FML_LOGGER.error("onPlaced", e); @@ -139,25 +138,25 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte // } // spotless:on try { - if (!aWorld.isRemote) { - aWorld.notifyBlockChange(aX, aY, aZ, tReplacedBlock); - aWorld.func_147453_f /* updateNeighborsAboutBlockChange */(aX, aY, aZ, MuTEContainer.block); + if (!world.isRemote) { + world.notifyBlockChange(x, y, z, tReplacedBlock); + world.func_147453_f /* updateNeighborsAboutBlockChange */(x, y, z, block); } } catch (Throwable e) { GT_FML_LOGGER.error("notifyBlockChange", e); } try { - ((IMultiTileEntity) MuTEContainer.tileEntity).onTileEntityPlaced(); + mute.onTileEntityPlaced(); } catch (Throwable e) { GT_FML_LOGGER.error("onTileEntityPlaced", e); } try { - aWorld.func_147451_t /* updateAllLightTypes */(aX, aY, aZ); + world.func_147451_t /* updateAllLightTypes */(x, y, z); } catch (Throwable e) { GT_FML_LOGGER.error("updateAllLightTypes", e); } - aStack.stackSize--; + stack.stackSize--; return true; } catch (Throwable e) { @@ -167,87 +166,6 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte } @Override - public void updateItemStack(ItemStack aStack) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null && tTileEntityContainer.tileEntity instanceof IItemUpdatable itemUpdatable) { - itemUpdatable.updateItemStack(aStack); - } - } - - @Override - public void updateItemStack(ItemStack aStack, World aWorld, int aX, int aY, int aZ) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null && tTileEntityContainer.tileEntity instanceof IItemUpdatable itemUpdatable) { - itemUpdatable.updateItemStack(aStack, aWorld, aX, aY, aZ); - } - } - - @Override - public int getItemStackLimit(ItemStack aStack) { - final MultiTileEntityClassContainer tContainer = mBlock.registry.getClassContainer(aStack); - if (tContainer == null) return 1; - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - return tContainer.maxStackSize; - } - - @Override - public void onCreated(ItemStack aStack, World aWorld, EntityPlayer aPlayer) { - updateItemStack(aStack); - } - - @Override - public FluidStack getFluid(ItemStack aStack) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final FluidStack rFluid = fluidContainerItem.getFluid(aStack); - updateItemStack(aStack); - return rFluid; - } - return null; - } - - @Override - public int getCapacity(ItemStack aStack) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final int rCapacity = fluidContainerItem.getCapacity(aStack); - updateItemStack(aStack); - return rCapacity; - } - return 0; - } - - @Override - public int fill(ItemStack aStack, FluidStack aFluid, boolean aDoFill) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final int tFilled = fluidContainerItem.fill(aStack, aFluid, aDoFill); - updateItemStack(aStack); - return tFilled; - } - return 0; - } - - @Override - public FluidStack drain(ItemStack aStack, int aMaxDrain, boolean aDoDrain) { - final MultiTileEntityContainer tTileEntityContainer = mBlock.registry.getCachedTileEntityContainer(aStack); - if (tTileEntityContainer != null - && tTileEntityContainer.tileEntity instanceof IFluidContainerItem fluidContainerItem) { - final FluidStack rFluid = fluidContainerItem.drain(aStack, aMaxDrain, aDoDrain); - updateItemStack(aStack); - return rFluid; - } - return null; - } - - @Override public boolean func_150936_a /* canPlaceAtSide */(World aWorld, int aX, int aY, int aZ, int ordinalSide, EntityPlayer aPlayer, ItemStack aStack) { return true; @@ -255,12 +173,15 @@ public class MultiTileEntityItem extends ItemBlock implements IFluidContainerIte @Override public final String getUnlocalizedName() { - return mBlock.registry.getInternalName(); + return block.getRegistry() + .getInternalName(); } @Override public final String getUnlocalizedName(ItemStack aStack) { - return mBlock.registry.getInternalName() + "." + getDamage(aStack); + return block.getRegistry() + .getInternalName() + "." + + getDamage(aStack); } @Override diff --git a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java index 7fe83075cd..0b5afbb043 100644 --- a/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java +++ b/src/main/java/gregtech/api/multitileentity/MultiTileEntityRegistry.java @@ -10,7 +10,6 @@ import java.util.List; import net.minecraft.block.Block; import net.minecraft.init.Items; import net.minecraft.item.Item; -import net.minecraft.item.ItemBlock; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; @@ -22,7 +21,6 @@ import com.gtnewhorizon.gtnhlib.util.map.ItemStackMap; import appeng.core.CreativeTab; import cpw.mods.fml.common.Loader; import cpw.mods.fml.common.LoaderState; -import cpw.mods.fml.common.registry.GameRegistry; import gregtech.api.enums.GT_Values; import gregtech.api.multitileentity.base.MultiTileEntity; import gregtech.api.multitileentity.interfaces.IMultiTileEntity; @@ -39,59 +37,50 @@ public class MultiTileEntityRegistry { // TODO: NBT sensitive or not? Starting with not for now private static final ItemStackMap<MultiTileEntityRegistry> REGISTRIES = new ItemStackMap<>(false); private static final HashSet<Class<?>> sRegisteredTileEntities = new HashSet<>(); - private final HashMap<Integer, MultiTileEntityContainer> cachedTileEntityContainers = new HashMap<>(); public HashMap<Short, CreativeTab> creativeTabs = new HashMap<>(); public final Short2ObjectMap<MultiTileEntityClassContainer> registry = new Short2ObjectOpenHashMap<>(); public List<MultiTileEntityClassContainer> registrations = new ArrayList<>(); private final String internalName; - private final MultiTileEntityBlockRegistryInternal block; - - private static MultiTileEntityBlockRegistryInternal regblock(String internalName, - MultiTileEntityBlockRegistryInternal block, Class<? extends ItemBlock> itemClass) { - GameRegistry.registerBlock(block, itemClass == null ? ItemBlock.class : itemClass, internalName); - return block; - } - - /** - * @param internalName the internal Name of the Item - */ - public MultiTileEntityRegistry(String internalName) { - this(internalName, new MultiTileEntityBlockRegistryInternal(), MultiTileEntityItem.class); - } + private final MultiTileEntityBlock block; /** * @param internalName the internal Name of the Item */ - public MultiTileEntityRegistry(String internalName, MultiTileEntityBlockRegistryInternal block, - Class<? extends ItemBlock> itemClass) { - this(internalName, regblock(internalName, block, itemClass)); - } - - /** - * @param internalName the internal Name of the Item - */ - public MultiTileEntityRegistry(String internalName, MultiTileEntityBlockRegistryInternal block) { + public MultiTileEntityRegistry(String internalName, MultiTileEntityBlock block) { if (!Loader.instance() .isInState(LoaderState.PREINITIALIZATION)) { throw new IllegalStateException( "The MultiTileEntity Registry must be initialized during Preload Phase and not before"); } + if (!block.isRegistered()) { + throw new IllegalStateException("Block not registered"); + } this.internalName = internalName; this.block = block; - GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + "This is the answer"); - this.block.registry = this; + GT_FML_LOGGER.info(internalName + " " + Block.getIdFromBlock(block) + " This is the answer"); + this.block.setRegistry(this); REGISTRIES.put(new ItemStack(Item.getItemById(Block.getIdFromBlock(block)), 1, GT_Values.W), this); NAMED_REGISTRIES.put(internalName, this); } - public static TileEntity getCanonicalTileEntity(int aRegistryID, int aMultiTileEntityID) { + public static TileEntity getReferenceTileEntity(int aRegistryID, int aMultiTileEntityID) { final MultiTileEntityRegistry tRegistry = getRegistry(aRegistryID); if (tRegistry == null) return null; final MultiTileEntityClassContainer tClassContainer = tRegistry.getClassContainer(aMultiTileEntityID); if (tClassContainer == null) return null; - return tClassContainer.referenceTileEntity; + return tClassContainer.getReferenceTileEntity(); + } + + public MultiTileEntity getReferenceTileEntity(ItemStack stack) { + return getReferenceTileEntity(Items.feather.getDamage(stack)); + } + + public MultiTileEntity getReferenceTileEntity(int metaId) { + final MultiTileEntityClassContainer muteClass = registry.get((short) metaId); + if (muteClass == null) return null; + return muteClass.getReferenceTileEntity(); } public static MultiTileEntityRegistry getRegistry(int aRegistryID) { @@ -120,27 +109,27 @@ public class MultiTileEntityRegistry { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container is null!"); tFailed = true; } else { - if (aClassContainer.muteClass == null) { + if (aClassContainer.getMuteClass() == null) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class inside Class Container is null!"); tFailed = true; } - if (aClassContainer.muteID == GT_Values.W) { + if (aClassContainer.getMuteID() == GT_Values.W) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses Wildcard MetaData!"); tFailed = true; } - if (aClassContainer.muteID < 0) { + if (aClassContainer.getMuteID() < 0) { GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: Class Container uses negative MetaData!"); tFailed = true; } - if (registry.containsKey(aClassContainer.muteID)) { + if (registry.containsKey(aClassContainer.getMuteID())) { GT_FML_LOGGER.error( - "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.muteID + "MULTI-TILE REGISTRY ERROR: Class Container uses occupied MetaData! (" + aClassContainer.getMuteID() + ")"); tFailed = true; } } if (tFailed) { - GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR: STACKTRACE START"); + GT_FML_LOGGER.error("MULTI-TILE REGISTRY ERROR " + aLocalised + " : STACKTRACE START"); int i = 0; for (StackTraceElement tElement : new Exception().getStackTrace()) if (i++ < 5 && !tElement.getClassName() .startsWith("sun")) GT_FML_LOGGER.error("\tat " + tElement); @@ -149,16 +138,20 @@ public class MultiTileEntityRegistry { return null; } - GT_LanguageManager.addStringLocalization(internalName + "." + aClassContainer.muteID + ".name", aLocalised); - registry.put(aClassContainer.muteID, aClassContainer); - mLastRegisteredID = aClassContainer.muteID; + GT_LanguageManager + .addStringLocalization(internalName + "." + aClassContainer.getMuteID() + ".name", aLocalised); + registry.put(aClassContainer.getMuteID(), aClassContainer); + mLastRegisteredID = aClassContainer.getMuteID(); registrations.add(aClassContainer); - if (sRegisteredTileEntities.add(aClassContainer.referenceTileEntity.getClass())) { - aClassContainer.referenceTileEntity.onRegistrationFirst(this, aClassContainer.muteID); + if (sRegisteredTileEntities.add( + aClassContainer.getReferenceTileEntity() + .getClass())) { + aClassContainer.getReferenceTileEntity() + .onRegistrationFirst(this, aClassContainer.getMuteID()); } - return getItem(aClassContainer.muteID); + return getItem(aClassContainer.getMuteID()); } public short mLastRegisteredID = GT_Values.W; @@ -179,15 +172,15 @@ public class MultiTileEntityRegistry { return getItem(aID, aAmount, null); } - public ItemStack getItem(int aID, long aAmount, NBTTagCompound nbt) { - final ItemStack rStack = new ItemStack(block, (int) aAmount, aID); + public ItemStack getItem(int metaID, long amount, NBTTagCompound nbt) { + final ItemStack stack = new ItemStack(block, (int) amount, metaID); if (nbt == null || nbt.hasNoTags()) { nbt = new NBTTagCompound(); - final MultiTileEntityContainer tTileEntityContainer = getNewTileEntityContainer(aID, nbt); - if (tTileEntityContainer != null) ((IMultiTileEntity) tTileEntityContainer.tileEntity).writeItemNBT(nbt); + final TileEntity tileEntity = getNewTileEntity(metaID, nbt); + ((IMultiTileEntity) tileEntity).writeItemNBT(nbt); } - rStack.setTagCompound(nbt); - return rStack; + stack.setTagCompound(nbt); + return stack; } public String getLocal(int aID) { @@ -203,84 +196,37 @@ public class MultiTileEntityRegistry { } public TileEntity getNewTileEntity(int aID) { - final MultiTileEntityContainer tContainer = getNewTileEntityContainer(null, 0, 0, 0, aID, null); - return tContainer == null ? null : tContainer.tileEntity; - } - - public MultiTileEntityContainer getNewTileEntityContainer(World world, int x, int y, int z, int aID, - NBTTagCompound nbt) { - final MultiTileEntityClassContainer tClass = registry.get((short) aID); - if (tClass == null || tClass.block == null) return null; - final MultiTileEntityContainer container = new MultiTileEntityContainer( - (MultiTileEntity) GT_Utility.callConstructor( |
