package crazypants.enderio.conduit; import java.util.List; import mods.immibis.microblocks.api.IMicroblockCoverSystem; import mods.immibis.microblocks.api.IMicroblockSupporterTile; import mods.immibis.microblocks.api.MicroblockAPIUtils; import mods.immibis.microblocks.api.Part; 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.tileentity.TileEntity; import net.minecraft.util.IIcon; import net.minecraft.util.MathHelper; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import com.enderio.core.common.util.BlockCoord; import com.enderio.core.common.util.ItemUtil; import com.enderio.core.common.util.Util; import cpw.mods.fml.common.registry.GameRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import crazypants.enderio.EnderIO; import crazypants.enderio.EnderIOTab; import crazypants.enderio.ModObject; public abstract class AbstractItemConduit extends Item implements IConduitItem { protected ModObject modObj; protected ItemConduitSubtype[] subtypes; protected IIcon[] icons; protected AbstractItemConduit(ModObject modObj, ItemConduitSubtype... subtypes) { this.modObj = modObj; this.subtypes = subtypes; setCreativeTab(EnderIOTab.tabEnderIO); setUnlocalizedName(modObj.unlocalisedName); setMaxStackSize(64); setHasSubtypes(true); } protected void init() { GameRegistry.registerItem(this, modObj.unlocalisedName); } @Override @SideOnly(Side.CLIENT) public void registerIcons(IIconRegister IIconRegister) { icons = new IIcon[subtypes.length]; int index = 0; for (ItemConduitSubtype subtype : subtypes) { icons[index] = IIconRegister.registerIcon(subtype.iconKey); index++; } } @Override public boolean onItemUse(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { if (MicroblocksUtil.supportMicroblocks() && tryAddToMicroblocks(stack, player, world, x, y, z, side)) { return true; } BlockCoord placeAt = Util.canPlaceItem(stack, EnderIO.blockConduitBundle, player, world, x, y, z, side); if(placeAt != null) { if(!world.isRemote) { if(world.setBlock(placeAt.x, placeAt.y, placeAt.z, EnderIO.blockConduitBundle, 0, 1)) { TileEntity te = world.getTileEntity(placeAt.x, placeAt.y, placeAt.z); if(te instanceof IConduitBundle) { IConduitBundle bundle = (IConduitBundle) te; bundle.addConduit(createConduit(stack, player)); ConduitUtil.playBreakSound(Block.soundTypeMetal, world, placeAt.x, placeAt.y, placeAt.z); } } } if(!player.capabilities.isCreativeMode) { stack.stackSize--; } return true; } else { ForgeDirection dir = ForgeDirection.values()[side]; int placeX = x + dir.offsetX; int placeY = y + dir.offsetY; int placeZ = z + dir.offsetZ; if(world.getBlock(placeX, placeY, placeZ) == EnderIO.blockConduitBundle) { IConduitBundle bundle = (TileConduitBundle) world.getTileEntity(placeX, placeY, placeZ); if(bundle == null) { System.out.println("AbstractItemConduit.onItemUse: Bundle null"); return false; } if(!bundle.hasType(getBaseConduitType())) { if(!world.isRemote) { IConduit con = createConduit(stack, player); if(con == null) { System.out.println("AbstractItemConduit.onItemUse: Conduit null."); return false; } bundle.addConduit(con); ConduitUtil.playBreakSound(Block.soundTypeMetal, world, placeX, placeY, placeZ); if(!player.capabilities.isCreativeMode) { stack.stackSize--; } } return true; } } } return false; } private boolean tryAddToMicroblocks(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side) { TileEntity te = world.getTileEntity(x, y, z); if (te != null && te.getClass().getName().equals("mods.immibis.microblocks.TileMicroblockContainer")) { IMicroblockCoverSystem covers = ((IMicroblockSupporterTile) te).getCoverSystem(); world.setBlock(x, y, z, EnderIO.blockConduitBundle); EnderIO.blockConduitBundle.onBlockActivated(world, x, y, z, player, side, 0, 0, 0); IMicroblockCoverSystem newCovers = MicroblockAPIUtils.createMicroblockCoverSystem((IMicroblockSupporterTile) world.getTileEntity(x, y, z)); for (Part p : covers.getAllParts()) { newCovers.addPart(p); } ((TileConduitBundle)world.getTileEntity(x, y, z)).covers = newCovers; return true; } return false; } @Override public boolean onItemUseFirst(ItemStack stack, EntityPlayer player, World world, int x, int y, int z, int side, float hitX, float hitY, float hitZ) { // Conduit replacement if (player.isSneaking()) { return false; } TileEntity te = world.getTileEntity(x, y, z); if (te == null || !(te instanceof IConduitBundle)) { return false; } IConduitBundle bundle = (IConduitBundle) te; IConduit existingConduit = bundle.getConduit(getBaseConduitType()); if (existingConduit == null) { return false; } ItemStack existingConduitAsItemStack = existingConduit.createItem(); if (!ItemUtil.areStacksEqual(existingConduitAsItemStack, stack)) { if (!world.isRemote) { IConduit newConduit = createConduit(stack, player); if (newConduit == null) { System.out.println("AbstractItemConduit.onItemUse: Conduit null."); return false; } bundle.removeConduit(existingConduit); bundle.addConduit(newConduit); if (!player.capabilities.isCreativeMode) { stack.stackSize--; for (ItemStack drop : existingConduit.getDrops()) { if (!player.inventory.addItemStackToInventory(drop)) { ItemUtil.spawnItemInWorldWithRandomMotion(world, drop, x, y, z); } } player.inventoryContainer.detectAndSendChanges(); } return true; } else { player.swingItem(); } } return false; } @Override @SideOnly(Side.CLIENT) public IIcon getIconFromDamage(int damage) { damage = MathHelper.clamp_int(damage, 0, subtypes.length - 1); return icons[damage]; } @Override public String getUnlocalizedName(ItemStack par1ItemStack) { int i = MathHelper.clamp_int(par1ItemStack.getItemDamage(), 0, subtypes.length - 1); return subtypes[i].unlocalisedName; } @Override @SuppressWarnings({ "rawtypes", "unchecked" }) @SideOnly(Side.CLIENT) public void getSubItems(Item par1, CreativeTabs par2CreativeTabs, List par3List) { for (int j = 0; j < subtypes.length; ++j) { par3List.add(new ItemStack(this, 1, j)); } } }