package net.minecraft.server;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import javax.annotation.Nullable;
import org.bukkit.event.entity.EntityInteractEvent; // CraftBukkit
public class BlockTripwire extends Block {
public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
public static final BlockStateBoolean ATTACHED = BlockStateBoolean.of("attached");
public static final BlockStateBoolean DISARMED = BlockStateBoolean.of("disarmed");
public static final BlockStateBoolean NORTH = BlockStateBoolean.of("north");
public static final BlockStateBoolean EAST = BlockStateBoolean.of("east");
public static final BlockStateBoolean SOUTH = BlockStateBoolean.of("south");
public static final BlockStateBoolean WEST = BlockStateBoolean.of("west");
protected static final AxisAlignedBB B = new AxisAlignedBB(0.0D, 0.0625D, 0.0D, 1.0D, 0.15625D, 1.0D);
protected static final AxisAlignedBB C = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 0.5D, 1.0D);
public BlockTripwire() {
super(Material.ORIENTABLE);
this.y(this.blockStateList.getBlockData().set(BlockTripwire.POWERED, Boolean.valueOf(false)).set(BlockTripwire.ATTACHED, Boolean.valueOf(false)).set(BlockTripwire.DISARMED, Boolean.valueOf(false)).set(BlockTripwire.NORTH, Boolean.valueOf(false)).set(BlockTripwire.EAST, Boolean.valueOf(false)).set(BlockTripwire.SOUTH, Boolean.valueOf(false)).set(BlockTripwire.WEST, Boolean.valueOf(false)));
this.a(true);
}
public AxisAlignedBB b(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return !((Boolean) iblockdata.get(BlockTripwire.ATTACHED)).booleanValue() ? BlockTripwire.C : BlockTripwire.B;
}
public IBlockData updateState(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return iblockdata.set(BlockTripwire.NORTH, Boolean.valueOf(a(iblockaccess, blockposition, iblockdata, EnumDirection.NORTH))).set(BlockTripwire.EAST, Boolean.valueOf(a(iblockaccess, blockposition, iblockdata, EnumDirection.EAST))).set(BlockTripwire.SOUTH, Boolean.valueOf(a(iblockaccess, blockposition, iblockdata, EnumDirection.SOUTH))).set(BlockTripwire.WEST, Boolean.valueOf(a(iblockaccess, blockposition, iblockdata, EnumDirection.WEST)));
}
@Nullable
public AxisAlignedBB a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return BlockTripwire.k;
}
public boolean b(IBlockData iblockdata) {
return false;
}
public boolean c(IBlockData iblockdata) {
return false;
}
public Item getDropType(IBlockData iblockdata, Random random, int i) {
return Items.STRING;
}
public ItemStack a(World world, BlockPosition blockposition, IBlockData iblockdata) {
return new ItemStack(Items.STRING);
}
public void onPlace(World world, BlockPosition blockposition, IBlockData iblockdata) {
world.setTypeAndData(blockposition, iblockdata, 3);
this.e(world, blockposition, iblockdata);
}
public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) {
this.e(world, blockposition, iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(true)));
}
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) {
if (!world.isClientSide) {
if (!entityhuman.getItemInMainHand().isEmpty() && entityhuman.getItemInMainHand().getItem() == Items.SHEARS) {
world.setTypeAndData(blockposition, iblockdata.set(BlockTripwire.DISARMED, Boolean.valueOf(true)), 4);
}
}
}
private void e(World world, BlockPosition blockposition, IBlockData iblockdata) {
EnumDirection[] aenumdirection = new EnumDirection[] { EnumDirection.SOUTH, EnumDirection.WEST};
int i = aenumdirection.length;
int j = 0;
while (j < i) {
EnumDirection enumdirection = aenumdirection[j];
int k = 1;
while (true) {
if (k < 42) {
BlockPosition blockposition1 = blockposition.shift(enumdirection, k);
IBlockData iblockdata1 = world.getType(blockposition1);
if (iblockdata1.getBlock() == Blocks.TRIPWIRE_HOOK) {
if (iblockdata1.get(BlockTripwireHook.FACING) == enumdirection.opposite()) {
Blocks.TRIPWIRE_HOOK.a(world, blockposition1, iblockdata1, false, true, k, iblockdata);
}
} else if (iblockdata1.getBlock() == Blocks.TRIPWIRE) {
++k;
continue;
}
}
++j;
break;
}
}
}
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Entity entity) {
if (!world.isClientSide) {
if (!((Boolean) iblockdata.get(BlockTripwire.POWERED)).booleanValue()) {
this.b(world, blockposition);
}
}
}
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {}
public void b(World world, BlockPosition blockposition, IBlockData iblockdata, Random random) {
if (!world.isClientSide) {
if (((Boolean) world.getType(blockposition).get(BlockTripwire.POWERED)).booleanValue()) {
this.b(world, blockposition);
}
}
}
private void b(World world, BlockPosition blockposition) {
IBlockData iblockdata = world.getType(blockposition);
boolean flag = ((Boolean) iblockdata.get(BlockTripwire.POWERED)).booleanValue();
boolean flag1 = false;
List list = world.getEntities((Entity) null, iblockdata.d(world, blockposition).a(blockposition));
if (!list.isEmpty()) {
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Entity entity = (Entity) iterator.next();
if (!entity.isIgnoreBlockTrigger()) {
flag1 = true;
break;
}
}
}
// CraftBukkit start - Call interact even when triggering connected tripwire
if (flag != flag1 && flag1 && (Boolean)iblockdata.get(ATTACHED)) {
org.bukkit.World bworld = world.getWorld();
org.bukkit.plugin.PluginManager manager = world.getServer().getPluginManager();
org.bukkit.block.Block block = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
boolean allowed = false;
// If all of the events are cancelled block the tripwire trigger, else allow
for (Object object : list) {
if (object != null) {
org.bukkit.event.Cancellable cancellable;
if (object instanceof EntityHuman) {
cancellable = org.bukkit.craftbukkit.event.CraftEventFactory.callPlayerInteractEvent((EntityHuman) object, org.bukkit.event.block.Action.PHYSICAL, blockposition, null, null, null);
} else if (object instanceof Entity) {
cancellable = new EntityInteractEvent(((Entity) object).getBukkitEntity(), block);
manager.callEvent((EntityInteractEvent) cancellable);
} else {
continue;
}
if (!cancellable.isCancelled()) {
allowed = true;
break;
}
}
}
if (!allowed) {
return;
}
}
// CraftBukkit end
if (flag1 != flag) {
iblockdata = iblockdata.set(BlockTripwire.POWERED, Boolean.valueOf(flag1));
world.setTypeAndData(blockposition, iblockdata, 3);
this.e(world, blockposition, iblockdata);
}
if (flag1) {
world.a(new BlockPosition(blockposition), (Block) this, this.a(world));
}
}
public static boolean a(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata, EnumDirection enumdirection) {
BlockPosition blockposition1 = blockposition.shift(enumdirection);
IBlockData iblockdata1 = iblockaccess.getType(blockposition1);
Block block = iblockdata1.getBlock();
if (block == Blocks.TRIPWIRE_HOOK) {
EnumDirection enumdirection1 = enumdirection.opposite();
return iblockdata1.get(BlockTripwireHook.FACING) == enumdirection1;
} else {
return block == Blocks.TRIPWIRE;
}
}
public IBlockData fromLegacyData(int i) {
return this.getBlockData().set(BlockTripwire.POWERED, Boolean.valueOf((i & 1) > 0)).set(BlockTripwire.ATTACHED, Boolean.valueOf((i & 4) > 0)).set(BlockTripwire.DISARMED, Boolean.valueOf((i & 8) > 0));
}
public int toLegacyData(IBlockData iblockdata) {
int i = 0;
if (((Boolean) iblockdata.get(BlockTripwire.POWERED)).booleanValue()) {
i |= 1;
}
if (((Boolean) iblockdata.get(BlockTripwire.ATTACHED)).booleanValue()) {
i |= 4;
}
if (((Boolean) iblockdata.get(BlockTripwire.DISARMED)).booleanValue()) {
i |= 8;
}
return i;
}
public IBlockData a(IBlockData iblockdata, EnumBlockRotation enumblockrotation) {
switch (enumblockrotation) {
case CLOCKWISE_180:
return iblockdata.set(BlockTripwire.NORTH, iblockdata.get(BlockTripwire.SOUTH)).set(BlockTripwire.EAST, iblockdata.get(BlockTripwire.WEST)).set(BlockTripwire.SOUTH, iblockdata.get(BlockTripwire.NORTH)).set(BlockTripwire.WEST, iblockdata.get(BlockTripwire.EAST));
case COUNTERCLOCKWISE_90:
return iblockdata.set(BlockTripwire.NORTH, iblockdata.get(BlockTripwire.EAST)).set(BlockTripwire.EAST, iblockdata.get(BlockTripwire.SOUTH)).set(BlockTripwire.SOUTH, iblockdata.get(BlockTripwire.WEST)).set(BlockTripwire.WEST, iblockdata.get(BlockTripwire.NORTH));
case CLOCKWISE_90:
return iblockdata.set(BlockTripwire.NORTH, iblockdata.get(BlockTripwire.WEST)).set(BlockTripwire.EAST, iblockdata.get(BlockTripwire.NORTH)).set(BlockTripwire.SOUTH, iblockdata.get(BlockTripwire.EAST)).set(BlockTripwire.WEST, iblockdata.get(BlockTripwire.SOUTH));
default:
return iblockdata;
}
}
public IBlockData a(IBlockData iblockdata, EnumBlockMirror enumblockmirror) {
switch (enumblockmirror) {
case LEFT_RIGHT:
return iblockdata.set(BlockTripwire.NORTH, iblockdata.get(BlockTripwire.SOUTH)).set(BlockTripwire.SOUTH, iblockdata.get(BlockTripwire.NORTH));
case FRONT_BACK:
return iblockdata.set(BlockTripwire.EAST, iblockdata.get(BlockTripwire.WEST)).set(BlockTripwire.WEST, iblockdata.get(BlockTripwire.EAST));
default:
return super.a(iblockdata, enumblockmirror);
}
}
protected BlockStateList getStateList() {
return new BlockStateList(this, new IBlockState[] { BlockTripwire.POWERED, BlockTripwire.ATTACHED, BlockTripwire.DISARMED, BlockTripwire.NORTH, BlockTripwire.EAST, BlockTripwire.WEST, BlockTripwire.SOUTH});
}
}