package net.minecraft.block; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.Random; import net.minecraft.client.renderer.texture.IconRegister; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityComparator; import net.minecraft.util.Direction; import net.minecraft.util.Icon; import net.minecraft.world.IBlockAccess; import net.minecraft.world.World; public class BlockComparator extends BlockRedstoneLogic implements ITileEntityProvider { public BlockComparator(int par1, boolean par2) { super(par1, par2); this.isBlockContainer = true; } /** * Returns the ID of the items to drop on destruction. */ public int idDropped(int par1, Random par2Random, int par3) { return Item.comparator.itemID; } @SideOnly(Side.CLIENT) /** * only called by clickMiddleMouseButton , and passed to inventory.setCurrentItem (along with isCreative) */ public int idPicked(World par1World, int par2, int par3, int par4) { return Item.comparator.itemID; } protected int func_94481_j_(int par1) { return 2; } protected BlockRedstoneLogic func_94485_e() { return Block.redstoneComparatorActive; } protected BlockRedstoneLogic func_94484_i() { return Block.redstoneComparatorIdle; } /** * The type of render function that is called for this block */ public int getRenderType() { return 37; } @SideOnly(Side.CLIENT) /** * From the specified side and block metadata retrieves the blocks texture. Args: side, metadata */ public Icon getIcon(int par1, int par2) { boolean flag = this.isRepeaterPowered || (par2 & 8) != 0; return par1 == 0 ? (flag ? Block.torchRedstoneActive.getBlockTextureFromSide(par1) : Block.torchRedstoneIdle.getBlockTextureFromSide(par1)) : (par1 == 1 ? (flag ? Block.redstoneComparatorActive.blockIcon : this.blockIcon) : Block.stoneDoubleSlab.getBlockTextureFromSide(1)); } protected boolean func_96470_c(int par1) { return this.isRepeaterPowered || (par1 & 8) != 0; } protected int func_94480_d(IBlockAccess par1IBlockAccess, int par2, int par3, int par4, int par5) { return this.getTileEntityComparator(par1IBlockAccess, par2, par3, par4).func_96100_a(); } private int func_94491_m(World par1World, int par2, int par3, int par4, int par5) { return !this.func_94490_c(par5) ? this.getInputStrength(par1World, par2, par3, par4, par5) : Math.max(this.getInputStrength(par1World, par2, par3, par4, par5) - this.func_94482_f(par1World, par2, par3, par4, par5), 0); } public boolean func_94490_c(int par1) { return (par1 & 4) == 4; } protected boolean func_94478_d(World par1World, int par2, int par3, int par4, int par5) { int i1 = this.getInputStrength(par1World, par2, par3, par4, par5); if (i1 >= 15) { return true; } else if (i1 == 0) { return false; } else { int j1 = this.func_94482_f(par1World, par2, par3, par4, par5); return j1 == 0 ? true : i1 >= j1; } } /** * Returns the signal strength at one input of the block. Args: world, X, Y, Z, side */ protected int getInputStrength(World par1World, int par2, int par3, int par4, int par5) { int i1 = super.getInputStrength(par1World, par2, par3, par4, par5); int j1 = getDirection(par5); int k1 = par2 + Direction.offsetX[j1]; int l1 = par4 + Direction.offsetZ[j1]; int i2 = par1World.getBlockId(k1, par3, l1); if (i2 > 0) { if (Block.blocksList[i2].hasComparatorInputOverride()) { i1 = Block.blocksList[i2].getComparatorInputOverride(par1World, k1, par3, l1, Direction.rotateOpposite[j1]); } else if (i1 < 15 && Block.isNormalCube(i2)) { k1 += Direction.offsetX[j1]; l1 += Direction.offsetZ[j1]; i2 = par1World.getBlockId(k1, par3, l1); if (i2 > 0 && Block.blocksList[i2].hasComparatorInputOverride()) { i1 = Block.blocksList[i2].getComparatorInputOverride(par1World, k1, par3, l1, Direction.rotateOpposite[j1]); } } } return i1; } /** * Returns the blockTileEntity at given coordinates. */ public TileEntityComparator getTileEntityComparator(IBlockAccess par1IBlockAccess, int par2, int par3, int par4) { return (TileEntityComparator)par1IBlockAccess.getBlockTileEntity(par2, par3, par4); } /** * Called upon block activation (right click on the block.) */ public boolean onBlockActivated(World par1World, int par2, int par3, int par4, EntityPlayer par5EntityPlayer, int par6, float par7, float par8, float par9) { int i1 = par1World.getBlockMetadata(par2, par3, par4); boolean flag = this.isRepeaterPowered | (i1 & 8) != 0; boolean flag1 = !this.func_94490_c(i1); int j1 = flag1 ? 4 : 0; j1 |= flag ? 8 : 0; par1World.playSoundEffect((double)par2 + 0.5D, (double)par3 + 0.5D, (double)par4 + 0.5D, "random.click", 0.3F, flag1 ? 0.55F : 0.5F); par1World.setBlockMetadataWithNotify(par2, par3, par4, j1 | i1 & 3, 2); this.func_96476_c(par1World, par2, par3, par4, par1World.rand); return true; } protected void func_94479_f(World par1World, int par2, int par3, int par4, int par5) { if (!par1World.isBlockTickScheduled(par2, par3, par4, this.blockID)) { int i1 = par1World.getBlockMetadata(par2, par3, par4); int j1 = this.func_94491_m(par1World, par2, par3, par4, i1); int k1 = this.getTileEntityComparator(par1World, par2, par3, par4).func_96100_a(); if (j1 != k1 || this.func_96470_c(i1) != this.func_94478_d(par1World, par2, par3, par4, i1)) { if (this.func_83011_d(par1World, par2, par3, par4, i1)) { par1World.func_82740_a(par2, par3, par4, this.blockID, this.func_94481_j_(0), -1); } else { par1World.func_82740_a(par2, par3, par4, this.blockID, this.func_94481_j_(0), 0); } } } } private void func_96476_c(World par1World, int par2, int par3, int par4, Random par5Random) { int l = par1World.getBlockMetadata(par2, par3, par4); int i1 = this.func_94491_m(par1World, par2, par3, par4, l); int j1 = this.getTileEntityComparator(par1World, par2, par3, par4).func_96100_a(); this.getTileEntityComparator(par1World, par2, par3, par4).func_96099_a(i1); if (j1 != i1 || !this.func_94490_c(l)) { boolean flag = this.func_94478_d(par1World, par2, par3, par4, l); boolean flag1 = this.isRepeaterPowered || (l & 8) != 0; if (flag1 && !flag) { par1World.setBlockMetadataWithNotify(par2, par3, par4, l & -9, 2); } else if (!flag1 && flag) { par1World.setBlockMetadataWithNotify(par2, par3, par4, l | 8, 2); } this.func_94483_i_(par1World, par2, par3, par4); } } /** * Ticks the block if it's been scheduled */ public void updateTick(World par1World, int par2, int par3, int par4, Random par5Random) { if (this.isRepeaterPowered) { int l = par1World.getBlockMetadata(par2, par3, par4); par1World.setBlock(par2, par3, par4, this.func_94484_i().blockID, l | 8, 4); } this.func_96476_c(par1World, par2, par3, par4, par5Random); } /** * Called whenever the block is added into the world. Args: world, x, y, z */ public void onBlockAdded(World par1World, int par2, int par3, int par4) { super.onBlockAdded(par1World, par2, par3, par4); par1World.setBlockTileEntity(par2, par3, par4, this.createNewTileEntity(par1World)); } /** * ejects contained items into the world, and notifies neighbours of an update, as appropriate */ public void breakBlock(World par1World, int par2, int par3, int par4, int par5, int par6) { super.breakBlock(par1World, par2, par3, par4, par5, par6); par1World.removeBlockTileEntity(par2, par3, par4); this.func_94483_i_(par1World, par2, par3, par4); } /** * Called when the block receives a BlockEvent - see World.addBlockEvent. By default, passes it on to the tile * entity at this location. Args: world, x, y, z, blockID, EventID, event parameter */ public boolean onBlockEventReceived(World par1World, int par2, int par3, int par4, int par5, int par6) { super.onBlockEventReceived(par1World, par2, par3, par4, par5, par6); TileEntity tileentity = par1World.getBlockTileEntity(par2, par3, par4); return tileentity != null ? tileentity.receiveClientEvent(par5, par6) : false; } /** * Returns a new instance of a block's tile entity class. Called on placing the block. */ public TileEntity createNewTileEntity(World par1World) { return new TileEntityComparator(); } @SideOnly(Side.CLIENT) /** * When this method is called, your block should register all the icons it needs with the given IconRegister. This * is the only chance you get to register icons. */ public void registerIcons(IconRegister par1IconRegister) { this.blockIcon = par1IconRegister.registerIcon(this.isRepeaterPowered ? "comparator_lit" : "comparator"); } }