package net.minecraft.block;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.Random;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.Item;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityComparator;
import net.minecraft.util.Direction;
import net.minecraft.util.IIcon;
import net.minecraft.world.IBlockAccess;
import net.minecraft.world.World;
public class BlockRedstoneComparator extends BlockRedstoneDiode implements ITileEntityProvider
{
private static final String __OBFID = "CL_00000220";
public BlockRedstoneComparator(boolean p_i45399_1_)
{
super(p_i45399_1_);
this.isBlockContainer = true;
}
public Item getItemDropped(int meta, Random random, int fortune)
{
return Items.comparator;
}
/**
* Gets an item for the block being called on. Args: world, x, y, z
*/
@SideOnly(Side.CLIENT)
public Item getItem(World worldIn, int x, int y, int z)
{
return Items.comparator;
}
protected int func_149901_b(int p_149901_1_)
{
return 2;
}
protected BlockRedstoneDiode getBlockPowered()
{
return Blocks.powered_comparator;
}
protected BlockRedstoneDiode getBlockUnpowered()
{
return Blocks.unpowered_comparator;
}
/**
* The type of render function that is called for this block
*/
public int getRenderType()
{
return 37;
}
/**
* Gets the block's texture. Args: side, meta
*/
@SideOnly(Side.CLIENT)
public IIcon getIcon(int side, int meta)
{
boolean flag = this.isRepeaterPowered || (meta & 8) != 0;
return side == 0 ? (flag ? Blocks.redstone_torch.getBlockTextureFromSide(side) : Blocks.unlit_redstone_torch.getBlockTextureFromSide(side)) : (side == 1 ? (flag ? Blocks.powered_comparator.blockIcon : this.blockIcon) : Blocks.double_stone_slab.getBlockTextureFromSide(1));
}
protected boolean func_149905_c(int p_149905_1_)
{
return this.isRepeaterPowered || (p_149905_1_ & 8) != 0;
}
protected int func_149904_f(IBlockAccess p_149904_1_, int p_149904_2_, int p_149904_3_, int p_149904_4_, int p_149904_5_)
{
return this.getTileEntityComparator(p_149904_1_, p_149904_2_, p_149904_3_, p_149904_4_).getOutputSignal();
}
private int getOutputStrength(World p_149970_1_, int p_149970_2_, int p_149970_3_, int p_149970_4_, int p_149970_5_)
{
return !this.func_149969_d(p_149970_5_) ? this.getInputStrength(p_149970_1_, p_149970_2_, p_149970_3_, p_149970_4_, p_149970_5_) : Math.max(this.getInputStrength(p_149970_1_, p_149970_2_, p_149970_3_, p_149970_4_, p_149970_5_) - this.func_149902_h(p_149970_1_, p_149970_2_, p_149970_3_, p_149970_4_, p_149970_5_), 0);
}
public boolean func_149969_d(int p_149969_1_)
{
return (p_149969_1_ & 4) == 4;
}
protected boolean isGettingInput(World p_149900_1_, int p_149900_2_, int p_149900_3_, int p_149900_4_, int p_149900_5_)
{
int i1 = this.getInputStrength(p_149900_1_, p_149900_2_, p_149900_3_, p_149900_4_, p_149900_5_);
if (i1 >= 15)
{
return true;
}
else if (i1 == 0)
{
return false;
}
else
{
int j1 = this.func_149902_h(p_149900_1_, p_149900_2_, p_149900_3_, p_149900_4_, p_149900_5_);
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 p_149903_1_, int p_149903_2_, int p_149903_3_, int p_149903_4_, int p_149903_5_)
{
int i1 = super.getInputStrength(p_149903_1_, p_149903_2_, p_149903_3_, p_149903_4_, p_149903_5_);
int j1 = getDirection(p_149903_5_);
int k1 = p_149903_2_ + Direction.offsetX[j1];
int l1 = p_149903_4_ + Direction.offsetZ[j1];
Block block = p_149903_1_.getBlock(k1, p_149903_3_, l1);
if (block.hasComparatorInputOverride())
{
i1 = block.getComparatorInputOverride(p_149903_1_, k1, p_149903_3_, l1, Direction.rotateOpposite[j1]);
}
else if (i1 < 15 && block.isNormalCube())
{
k1 += Direction.offsetX[j1];
l1 += Direction.offsetZ[j1];
block = p_149903_1_.getBlock(k1, p_149903_3_, l1);
if (block.hasComparatorInputOverride())
{
i1 = block.getComparatorInputOverride(p_149903_1_, k1, p_149903_3_, l1, Direction.rotateOpposite[j1]);
}
}
return i1;
}
/**
* Returns the blockTileEntity at given coordinates.
*/
public TileEntityComparator getTileEntityComparator(IBlockAccess p_149971_1_, int p_149971_2_, int p_149971_3_, int p_149971_4_)
{
return (TileEntityComparator)p_149971_1_.getTileEntity(p_149971_2_, p_149971_3_, p_149971_4_);
}
/**
* Called upon block activation (right click on the block). Args : world, x, y, z, player, side, hitX, hitY, hitZ.
* Return : Swing hand (client), abort the block placement (server)
*/
public boolean onBlockActivated(World worldIn, int x, int y, int z, EntityPlayer player, int side, float subX, float subY, float subZ)
{
int i1 = worldIn.getBlockMetadata(x, y, z);
boolean flag = this.isRepeaterPowered | (i1 & 8) != 0;
boolean flag1 = !this.func_149969_d(i1);
int j1 = flag1 ? 4 : 0;
j1 |= flag ? 8 : 0;
worldIn.playSoundEffect((double)x + 0.5D, (double)y + 0.5D, (double)z + 0.5D, "random.click", 0.3F, flag1 ? 0.55F : 0.5F);
worldIn.setBlockMetadataWithNotify(x, y, z, j1 | i1 & 3, 2);
this.func_149972_c(worldIn, x, y, z, worldIn.rand);
return true;
}
protected void func_149897_b(World p_149897_1_, int p_149897_2_, int p_149897_3_, int p_149897_4_, Block p_149897_5_)
{
if (!p_149897_1_.isBlockTickScheduledThisTick(p_149897_2_, p_149897_3_, p_149897_4_, this))
{
int l = p_149897_1_.getBlockMetadata(p_149897_2_, p_149897_3_, p_149897_4_);
int i1 = this.getOutputStrength(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l);
int j1 = this.getTileEntityComparator(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_).getOutputSignal();
if (i1 != j1 || this.func_149905_c(l) != this.isGettingInput(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l))
{
if (this.func_149912_i(p_149897_1_, p_149897_2_, p_149897_3_, p_149897_4_, l))
{
p_149897_1_.scheduleBlockUpdateWithPriority(p_149897_2_, p_149897_3_, p_149897_4_, this, this.func_149901_b(0), -1);
}
else
{
p_149897_1_.scheduleBlockUpdateWithPriority(p_149897_2_, p_149897_3_, p_149897_4_, this, this.func_149901_b(0), 0);
}
}
}
}
private void func_149972_c(World p_149972_1_, int p_149972_2_, int p_149972_3_, int p_149972_4_, Random p_149972_5_)
{
int l = p_149972_1_.getBlockMetadata(p_149972_2_, p_149972_3_, p_149972_4_);
int i1 = this.getOutputStrength(p_149972_1_, p_149972_2_, p_149972_3_, p_149972_4_, l);
int j1 = this.getTileEntityComparator(p_149972_1_, p_149972_2_, p_149972_3_, p_149972_4_).getOutputSignal();
this.getTileEntityComparator(p_149972_1_, p_149972_2_, p_149972_3_, p_149972_4_).setOutputSignal(i1);
if (j1 != i1 || !this.func_149969_d(l))
{
boolean flag = this.isGettingInput(p_149972_1_, p_149972_2_, p_149972_3_, p_149972_4_, l);
boolean flag1 = this.isRepeaterPowered || (l & 8) != 0;
if (flag1 && !flag)
{
p_149972_1_.setBlockMetadataWithNotify(p_149972_2_, p_149972_3_, p_149972_4_, l & -9, 2);
}
else if (!flag1 && flag)
{
p_149972_1_.setBlockMetadataWithNotify(p_149972_2_, p_149972_3_, p_149972_4_, l | 8, 2);
}
this.func_149911_e(p_149972_1_, p_149972_2_, p_149972_3_, p_149972_4_);
}
}
/**
* Ticks the block if it's been scheduled
*/
public void updateTick(World worldIn, int x, int y, int z, Random random)
{
if (this.isRepeaterPowered)
{
int l = worldIn.getBlockMetadata(x, y, z);
worldIn.setBlock(x, y, z, this.getBlockUnpowered(), l | 8, 4);
}
this.func_149972_c(worldIn, x, y, z, random);
}
public void onBlockAdded(World worldIn, int x, int y, int z)
{
super.onBlockAdded(worldIn, x, y, z);
worldIn.setTileEntity(x, y, z, this.createNewTileEntity(worldIn, 0));
}
public void breakBlock(World worldIn, int x, int y, int z, Block blockBroken, int meta)
{
super.breakBlock(worldIn, x, y, z, blockBroken, meta);
worldIn.removeTileEntity(x, y, z);
this.func_149911_e(worldIn, x, y, z);
}
public boolean onBlockEventReceived(World worldIn, int x, int y, int z, int eventId, int eventData)
{
super.onBlockEventReceived(worldIn, x, y, z, eventId, eventData);
TileEntity tileentity = worldIn.getTileEntity(x, y, z);
return tileentity != null ? tileentity.receiveClientEvent(eventId, eventData) : false;
}
/**
* Returns a new instance of a block's tile entity class. Called on placing the block.
*/
public TileEntity createNewTileEntity(World worldIn, int meta)
{
return new TileEntityComparator();
}
@Override
public void onNeighborChange(IBlockAccess world, int x, int y, int z, int tileX, int tileY, int tileZ)
{
if (y == tileY && world instanceof World)
{
onNeighborBlockChange((World)world, x, y, z, world.getBlock(tileX, tileY, tileZ));
}
}
@Override
public boolean getWeakChanges(IBlockAccess world, int x, int y, int z)
{
return true;
}
}