package advancedsystemsmanager.blocks; import advancedsystemsmanager.api.tileentities.ICluster; import advancedsystemsmanager.api.tileentities.ITileFactory; import advancedsystemsmanager.api.tileentities.ITileInterfaceProvider; import advancedsystemsmanager.api.tileentities.ITileElement; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.reference.Reference; import advancedsystemsmanager.tileentities.TileEntityElementBase; import advancedsystemsmanager.tileentities.TileEntityQuantumCable; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import net.minecraft.block.Block; import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; import java.util.Collection; import java.util.List; public class TileFactory implements ITileFactory { private Block block; private String[][] iconNames; private Class<? extends TileEntityElementBase> tileClass; @SideOnly(Side.CLIENT) protected IIcon[][] icons; private int metadata; public TileFactory(Class<? extends TileEntityElementBase> tileClass, String[] subtypes, String... iconNames) { this.tileClass = tileClass; this.iconNames = new String[subtypes.length][iconNames.length + 1]; for (int i = 0; i < subtypes.length; i++) { this.iconNames[i][0] = subtypes[i]; for (int j = 0; j < iconNames.length; j++) { this.iconNames[i][j+1] = this.iconNames[i][0] + iconNames[j]; } } GameRegistry.registerTileEntity(tileClass, subtypes[0]); } @Override public Block getBlock() { return block; } @Override public void setBlock(Block block) { this.block = block; } @Override public int getMetadata() { return metadata; } @Override public void setMetadata(int metadata) { this.metadata = metadata; } @Override public float getBlockHardness() { return 1.2f; } @Override public boolean canBeAddedToCluster(Collection<ITileFactory> existing) { return false; } @Override public String getUnlocalizedName(int subtype) { return iconNames[subtype][0]; } @Override public String getKey() { return iconNames[0][0]; } public ItemStack getItemStack() { return getItemStack(0); } @Override public ItemStack getItemStack(int subtype) { return new ItemStack(getBlock(), 1, getMetadata() + subtype * 16); } @Override public boolean hasTileEntity() { return tileClass != null; } @Override public TileEntity createTileEntity(World world, int metadata) { if (hasTileEntity()) { try { return tileClass.newInstance(); } catch (Exception ignored) { } } return null; } @Override @SuppressWarnings("unchecked") public <T extends TileEntity> T getTileEntity(IBlockAccess world, int x, int y, int z) { TileEntity tileEntity = world.getTileEntity(x, y, z); if (isInstance(tileEntity)) { return (T) tileEntity; } else if (tileEntity instanceof ICluster) { for (ITileElement tile : ((ICluster) tileEntity).getTiles()) { if (isInstance(tile)) { return (T) tile; } } } return null; } @Override public boolean isInstance(TileEntity tileEntity) { return tileClass.isInstance(tileEntity); } public boolean isInstance(ITileElement tileEntity) { return tileClass.isInstance(tileEntity); } @Override public boolean canPlaceBlock(World world, int x, int y, int z, ItemStack stack) { return true; } public void onCreated(ItemStack stack, World world, EntityPlayer player) { } @Override public boolean isCable(ITileElement element) { return false; } @Override public void saveToClusterTag(ItemStack stack, NBTTagCompound tag) { NBTTagCompound subtype = stack.getTagCompound(); if (subtype == null) subtype = new NBTTagCompound(); subtype.setByte(TileEntityElementBase.NBT_SUBTYPE, (byte) (stack.getItemDamage() / 16)); tag.setTag(getKey(), subtype); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister register) { icons = new IIcon[iconNames.length][iconNames[0].length]; for (int i = 0; i < icons.length; i++) for (int j = 0; j < icons[0].length; j++) icons[i][j] = register.registerIcon(getTextureName(iconNames[i][j])); } @SideOnly(Side.CLIENT) private static String getTextureName(String iconName) { return Reference.RESOURCE_LOCATION + ":" + iconName.replace(Names.PREFIX, ""); } @SideOnly(Side.CLIENT) @Override public IIcon getIcon(int side, int subtype) { return icons[subtype][0]; } @Override @SideOnly(Side.CLIENT) public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) { for (int i = 0; i < iconNames.length; i++) list.add(getItemStack(i)); } @Override @SideOnly(Side.CLIENT) public IIcon[] getIcons(int subtype) { return icons[subtype]; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List<String> information, boolean advanced) { } public boolean isBlock(Block block, int meta) { return block == getBlock() && meta == getMetadata(); } public static class Cluster extends TileFactory { public Cluster(Class<? extends TileEntityElementBase> tileClass, String[] subType, String... iconNames) { super(tileClass, subType, iconNames); } @Override public boolean canBeAddedToCluster(Collection<ITileFactory> existing) { for (ITileFactory factory : existing) { if (factory == this) return false; } return true; } } public static class Interface extends TileFactory { public Interface(Class<? extends TileEntityElementBase> tileClass, String[] subType, String... iconNames) { super(tileClass, subType, iconNames); } @Override public boolean canBeAddedToCluster(Collection<ITileFactory> existing) { for (ITileFactory factory : existing) { if (factory instanceof Interface) return false; } return true; } } public static class Directional extends Cluster { public Directional(Class<? extends TileEntityElementBase> tileClass, String[] subType, String... iconNames) { super(tileClass, subType, iconNames); } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int subtype) { return super.icons[subtype][side == 3 ? 0 : 1]; } } }