package advancedsystemsmanager.registry; import advancedsystemsmanager.api.tileentities.ITileElement; import advancedsystemsmanager.api.tileentities.ITileFactory; import advancedsystemsmanager.blocks.TileFactory; import advancedsystemsmanager.client.gui.TextColour; import advancedsystemsmanager.helpers.LocalizationHelper; import advancedsystemsmanager.reference.Names; import advancedsystemsmanager.tileentities.*; import advancedsystemsmanager.tileentities.manager.TileEntityManager; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; 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.nbt.NBTTagList; import net.minecraft.util.IIcon; import net.minecraft.world.World; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.TreeMap; import static advancedsystemsmanager.reference.Names.*; import static advancedsystemsmanager.reference.Names.CABLE_VOID; public class ClusterRegistry { private static final Map<String, ITileFactory> registry = new TreeMap<String, ITileFactory>(); public static TileFactory CABLE = registerFactory(new TileFactory(TileEntityCable.class, new String[]{CABLE_BLOCK}) { @Override public boolean isCable(ITileElement element) { return true; } @Override public float getBlockHardness() { return 0.4f; } }); public static TileFactory MANAGER = registerFactory(new TileFactory(TileEntityManager.class, new String[]{Names.MANAGER}, TOP_SUFFIX, BOTTOM_SUFFIX) { @Override public float getBlockHardness() { return 2f; } @Override @SideOnly(Side.CLIENT) public IIcon getIcon(int side, int subtype) { return super.icons[0][side == 0 ? 2 : side == 1 ? 1 : 0]; } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List<String> information, boolean advanced) { int amount = 0; if (stack.hasTagCompound()) { NBTTagList components = stack.getTagCompound().getTagList(TileEntityManager.NBT_COMPONENTS, 10); amount = components.tagCount(); } if (amount > 0) information.add(LocalizationHelper.translateFormatted(Names.COMMANDS, amount)); } }); public static TileFactory BLOCK_GATE = registerDirectionElement(TileEntityBlockGate.class, new String[]{CABLE_BLOCK_GATE}, SIDE_SUFFIX, FACE_SUFFIX, DIRECTION_SUFFIX); public static TileFactory BUD = registerClusterElement(TileEntityBUD.class, new String[]{CABLE_BUD}); public static TileFactory CAMO = registerClusterElement(TileEntityCamouflage.class, new String[]{CABLE_CAMO, CABLE_CAMO_INSIDE, CABLE_CAMO_TRANSFORM}); public static TileFactory CLUSTER = registerFactory(new TileFactory(TileEntityCluster.class, new String[]{CABLE_CLUSTER, CABLE_CLUSTER + ADVANCED_SUFFIX}, SIDE_SUFFIX) { @Override public boolean canPlaceBlock(World world, int x, int y, int z, ItemStack stack) { return TileEntityCluster.hasSubBlocks(stack); } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List<String> information, boolean advanced) { if (TileEntityCluster.hasSubBlocks(stack)) { for (ItemStack itemStack : TileEntityCluster.getSubblocks(stack)) { information.add(itemStack.getDisplayName()); } } else { information.add(LocalizationHelper.translate(Names.EMPTY_CLUSTER)); } } @Override public boolean isCable(ITileElement element) { return element.getSubtype() == 1; } }); // public static TileFactory CREATIVE = registerClusterElement(TileEntityCreative.class, new String[]{CABLE_CREATIVE}); public static TileFactory EMITTER = registerClusterElement(TileEntityEmitter.class, new String[]{CABLE_OUTPUT}, WEAK_SUFFIX, IDLE_SUFFIX); public static TileFactory FLUID_GATE = registerDirectionElement(TileEntityFluidGate.class, new String[]{CABLE_FLUID_GATE}, SIDE_SUFFIX); public static TileFactory RECEIVER = registerClusterElement(TileEntityReceiver.class, new String[]{CABLE_INPUT}); public static TileFactory RELAY = registerInterfaceElement(TileEntityRelay.class, new String[]{CABLE_RELAY, CABLE_RELAY + ADVANCED_SUFFIX}, SIDE_SUFFIX); public static TileFactory SIGN = registerDirectionElement(TileEntitySignUpdater.class, new String[]{CABLE_SIGN}, SIDE_SUFFIX); public static TileFactory VALVE = registerDirectionElement(TileEntityValve.class, new String[]{CABLE_VALVE, CABLE_VALVE + ADVANCED_SUFFIX}, SIDE_SUFFIX); public static TileFactory VOID = registerInterfaceElement(TileEntityVoid.class, new String[]{CABLE_VOID}); public static TileFactory QUANTUM = registerFactory(new TileFactory(TileEntityQuantumCable.class, new String[]{CABLE_QUANTUM}) { @Override public void onCreated(ItemStack stack, World world, EntityPlayer player) { if (!world.isRemote && stack.hasTagCompound() && stack.getTagCompound().hasKey(TileEntityQuantumCable.NBT_QUANTUM_KEY)) { TileEntityQuantumCable.getNextQuantumKey(); } } @Override public void getSubBlocks(Item item, CreativeTabs tab, List<ItemStack> list) { for (int i : new int[]{1, 8, 9}) { ItemStack stack = getItemStack(); NBTTagCompound tagCompound = new NBTTagCompound(); tagCompound.setInteger(TileEntityQuantumCable.NBT_QUANTUM_RANGE, i); stack.setTagCompound(tagCompound); list.add(stack); } } @Override @SideOnly(Side.CLIENT) public void addInformation(ItemStack stack, EntityPlayer player, List<String> information, boolean advanced) { if (!stack.hasTagCompound()) { stack.setTagCompound(new NBTTagCompound()); } NBTTagCompound tag = stack.getTagCompound(); if (tag.hasKey(TileEntityQuantumCable.NBT_QUANTUM_KEY)) { information.add(LocalizationHelper.translateFormatted(Names.QUANTUM_PAIRING, TileEntityQuantumCable.getSpinString(tag.getInteger(TileEntityQuantumCable.NBT_QUANTUM_KEY)))); } else { information.add(TextColour.RED.toString() + LocalizationHelper.translate(Names.QUANTUM_UNPAIRED)); } int range = tag.getInteger(TileEntityQuantumCable.NBT_QUANTUM_RANGE); if (range < 9) { information.add(LocalizationHelper.translateFormatted(Names.QUANTUM_RANGE, TileEntityQuantumCable.getRange(range))); } else { information.add(LocalizationHelper.translate(Names.QUANTUM_INTERDIMENSIONAL)); } } @Override public boolean canPlaceBlock(World world, int x, int y, int z, ItemStack stack) { return stack.hasTagCompound() && stack.getTagCompound().hasKey(TileEntityQuantumCable.NBT_QUANTUM_KEY); } }); private static TileFactory registerClusterElement(Class<? extends TileEntityElementBase> clazz, String[] subtypes, String... iconNames) { return registerFactory(new TileFactory.Cluster(clazz, subtypes, iconNames)); } private static TileFactory registerDirectionElement(Class<? extends TileEntityElementBase> clazz, String[] subtypes, String... iconNames) { return registerFactory(new TileFactory.Directional(clazz, subtypes, iconNames)); } private static TileFactory registerInterfaceElement(Class<? extends TileEntityElementBase> clazz, String[] subtype, String... iconNames) { return registerFactory(new TileFactory.Interface(clazz, subtype, iconNames)); } private static TileFactory registerFactory(TileFactory factory) { register(factory); return factory; } public static void register(ITileFactory tileFactory) { if (registry.containsKey(tileFactory.getKey())) throw new IllegalArgumentException("ID: " + tileFactory.getKey() + " is already registered by " + registry.get(tileFactory.getKey()).getClass()); registry.put(tileFactory.getKey(), tileFactory); } public static ITileFactory get(String id) { return registry.get(id); } public static int getId(ITileFactory factory) { return FactoryMappingRegistry.INSTANCE.getId(factory.getKey()); } public static Collection<String> getKeys() { return registry.keySet(); } public static Collection<ITileFactory> getFactories() { return registry.values(); } @SideOnly(Side.CLIENT) public static void registerIcons(IIconRegister register) { for (ITileFactory factory : getFactories()) factory.registerIcons(register); } }