package net.minecraft.server;
import java.util.Iterator;
import javax.annotation.Nullable;
import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit
public class BlockLever extends Block {
public static final BlockStateEnum<BlockLever.EnumLeverPosition> FACING = BlockStateEnum.of("facing", BlockLever.EnumLeverPosition.class);
public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
protected static final AxisAlignedBB c = new AxisAlignedBB(0.3125D, 0.20000000298023224D, 0.625D, 0.6875D, 0.800000011920929D, 1.0D);
protected static final AxisAlignedBB d = new AxisAlignedBB(0.3125D, 0.20000000298023224D, 0.0D, 0.6875D, 0.800000011920929D, 0.375D);
protected static final AxisAlignedBB e = new AxisAlignedBB(0.625D, 0.20000000298023224D, 0.3125D, 1.0D, 0.800000011920929D, 0.6875D);
protected static final AxisAlignedBB f = new AxisAlignedBB(0.0D, 0.20000000298023224D, 0.3125D, 0.375D, 0.800000011920929D, 0.6875D);
protected static final AxisAlignedBB g = new AxisAlignedBB(0.25D, 0.0D, 0.25D, 0.75D, 0.6000000238418579D, 0.75D);
protected static final AxisAlignedBB B = new AxisAlignedBB(0.25D, 0.4000000059604645D, 0.25D, 0.75D, 1.0D, 0.75D);
protected BlockLever() {
super(Material.ORIENTABLE);
this.y(this.blockStateList.getBlockData().set(BlockLever.FACING, BlockLever.EnumLeverPosition.NORTH).set(BlockLever.POWERED, Boolean.valueOf(false)));
this.a(CreativeModeTab.d);
}
@Nullable
public AxisAlignedBB a(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
return BlockLever.k;
}
public boolean b(IBlockData iblockdata) {
return false;
}
public boolean c(IBlockData iblockdata) {
return false;
}
public boolean canPlace(World world, BlockPosition blockposition, EnumDirection enumdirection) {
return a(world, blockposition, enumdirection.opposite());
}
public boolean canPlace(World world, BlockPosition blockposition) {
EnumDirection[] aenumdirection = EnumDirection.values();
int i = aenumdirection.length;
for (int j = 0; j < i; ++j) {
EnumDirection enumdirection = aenumdirection[j];
if (a(world, blockposition, enumdirection)) {
return true;
}
}
return false;
}
protected static boolean a(World world, BlockPosition blockposition, EnumDirection enumdirection) {
return BlockButtonAbstract.a(world, blockposition, enumdirection);
}
public IBlockData getPlacedState(World world, BlockPosition blockposition, EnumDirection enumdirection, float f, float f1, float f2, int i, EntityLiving entityliving) {
IBlockData iblockdata = this.getBlockData().set(BlockLever.POWERED, Boolean.valueOf(false));
if (a(world, blockposition, enumdirection.opposite())) {
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.a(enumdirection, entityliving.getDirection()));
} else {
Iterator iterator = EnumDirection.EnumDirectionLimit.HORIZONTAL.iterator();
EnumDirection enumdirection1;
do {
if (!iterator.hasNext()) {
if (world.getType(blockposition.down()).r()) {
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.a(EnumDirection.UP, entityliving.getDirection()));
}
return iblockdata;
}
enumdirection1 = (EnumDirection) iterator.next();
} while (enumdirection1 == enumdirection || !a(world, blockposition, enumdirection1.opposite()));
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.a(enumdirection1, entityliving.getDirection()));
}
}
public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) {
if (this.e(world, blockposition, iblockdata) && !a(world, blockposition, ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).c().opposite())) {
this.b(world, blockposition, iblockdata, 0);
world.setAir(blockposition);
}
}
private boolean e(World world, BlockPosition blockposition, IBlockData iblockdata) {
if (this.canPlace(world, blockposition)) {
return true;
} else {
this.b(world, blockposition, iblockdata, 0);
world.setAir(blockposition);
return false;
}
}
public AxisAlignedBB b(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) {
switch ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)) {
case EAST:
default:
return BlockLever.f;
case WEST:
return BlockLever.e;
case SOUTH:
return BlockLever.d;
case NORTH:
return BlockLever.c;
case UP_Z:
case UP_X:
return BlockLever.g;
case DOWN_X:
case DOWN_Z:
return BlockLever.B;
}
}
public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) {
if (world.isClientSide) {
return true;
} else {
// CraftBukkit start - Interact Lever
boolean powered = iblockdata.get(POWERED);
org.bukkit.block.Block block = world.getWorld().getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ());
int old = (powered) ? 15 : 0;
int current = (!powered) ? 15 : 0;
BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(block, old, current);
world.getServer().getPluginManager().callEvent(eventRedstone);
if ((eventRedstone.getNewCurrent() > 0) != (!powered)) {
return true;
}
// CraftBukkit end
iblockdata = iblockdata.a((IBlockState) BlockLever.POWERED);
world.setTypeAndData(blockposition, iblockdata, 3);
float f3 = ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0.6F : 0.5F;
world.a((EntityHuman) null, blockposition, SoundEffects.dv, SoundCategory.BLOCKS, 0.3F, f3);
world.applyPhysics(blockposition, this, false);
EnumDirection enumdirection1 = ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).c();
world.applyPhysics(blockposition.shift(enumdirection1.opposite()), this, false);
return true;
}
}
public void remove(World world, BlockPosition blockposition, IBlockData iblockdata) {
if (((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue()) {
world.applyPhysics(blockposition, this, false);
EnumDirection enumdirection = ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).c();
world.applyPhysics(blockposition.shift(enumdirection.opposite()), this, false);
}
super.remove(world, blockposition, iblockdata);
}
public int b(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, EnumDirection enumdirection) {
return ((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 15 : 0;
}
public int c(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition, EnumDirection enumdirection) {
return !((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue() ? 0 : (((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).c() == enumdirection ? 15 : 0);
}
public boolean isPowerSource(IBlockData iblockdata) {
return true;
}
public IBlockData fromLegacyData(int i) {
return this.getBlockData().set(BlockLever.FACING, BlockLever.EnumLeverPosition.a(i & 7)).set(BlockLever.POWERED, Boolean.valueOf((i & 8) > 0));
}
public int toLegacyData(IBlockData iblockdata) {
byte b0 = 0;
int i = b0 | ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).a();
if (((Boolean) iblockdata.get(BlockLever.POWERED)).booleanValue()) {
i |= 8;
}
return i;
}
public IBlockData a(IBlockData iblockdata, EnumBlockRotation enumblockrotation) {
switch (enumblockrotation) {
case CLOCKWISE_180:
switch ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)) {
case EAST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.WEST);
case WEST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.EAST);
case SOUTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.NORTH);
case NORTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.SOUTH);
default:
return iblockdata;
}
case COUNTERCLOCKWISE_90:
switch ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)) {
case EAST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.NORTH);
case WEST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.SOUTH);
case SOUTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.EAST);
case NORTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.WEST);
case UP_Z:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.UP_X);
case UP_X:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.UP_Z);
case DOWN_X:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.DOWN_Z);
case DOWN_Z:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.DOWN_X);
}
case CLOCKWISE_90:
switch ((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)) {
case EAST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.SOUTH);
case WEST:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.NORTH);
case SOUTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.WEST);
case NORTH:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.EAST);
case UP_Z:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.UP_X);
case UP_X:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.UP_Z);
case DOWN_X:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.DOWN_Z);
case DOWN_Z:
return iblockdata.set(BlockLever.FACING, BlockLever.EnumLeverPosition.DOWN_X);
}
default:
return iblockdata;
}
}
public IBlockData a(IBlockData iblockdata, EnumBlockMirror enumblockmirror) {
return iblockdata.a(enumblockmirror.a(((BlockLever.EnumLeverPosition) iblockdata.get(BlockLever.FACING)).c()));
}
protected BlockStateList getStateList() {
return new BlockStateList(this, new IBlockState[] { BlockLever.FACING, BlockLever.POWERED});
}
public static enum EnumLeverPosition implements INamable {
DOWN_X(0, "down_x", EnumDirection.DOWN), EAST(1, "east", EnumDirection.EAST), WEST(2, "west", EnumDirection.WEST), SOUTH(3, "south", EnumDirection.SOUTH), NORTH(4, "north", EnumDirection.NORTH), UP_Z(5, "up_z", EnumDirection.UP), UP_X(6, "up_x", EnumDirection.UP), DOWN_Z(7, "down_z", EnumDirection.DOWN);
private static final BlockLever.EnumLeverPosition[] i = new BlockLever.EnumLeverPosition[values().length];
private final int j;
private final String k;
private final EnumDirection l;
private EnumLeverPosition(int i, String s, EnumDirection enumdirection) {
this.j = i;
this.k = s;
this.l = enumdirection;
}
public int a() {
return this.j;
}
public EnumDirection c() {
return this.l;
}
public String toString() {
return this.k;
}
public static BlockLever.EnumLeverPosition a(int i) {
if (i < 0 || i >= BlockLever.EnumLeverPosition.i.length) {
i = 0;
}
return BlockLever.EnumLeverPosition.i[i];
}
public static BlockLever.EnumLeverPosition a(EnumDirection enumdirection, EnumDirection enumdirection1) {
switch (enumdirection) {
case DOWN:
switch (enumdirection1.k()) {
case X:
return BlockLever.EnumLeverPosition.DOWN_X;
case Z:
return BlockLever.EnumLeverPosition.DOWN_Z;
default:
throw new IllegalArgumentException("Invalid entityFacing " + enumdirection1 + " for facing " + enumdirection);
}
case UP:
switch (enumdirection1.k()) {
case X:
return BlockLever.EnumLeverPosition.UP_X;
case Z:
return BlockLever.EnumLeverPosition.UP_Z;
default:
throw new IllegalArgumentException("Invalid entityFacing " + enumdirection1 + " for facing " + enumdirection);
}
case NORTH:
return BlockLever.EnumLeverPosition.NORTH;
case SOUTH:
return BlockLever.EnumLeverPosition.SOUTH;
case WEST:
return BlockLever.EnumLeverPosition.WEST;
case EAST:
return BlockLever.EnumLeverPosition.EAST;
default:
throw new IllegalArgumentException("Invalid facing: " + enumdirection);
}
}
public String getName() {
return this.k;
}
static {
BlockLever.EnumLeverPosition[] ablocklever_enumleverposition = values();
int i = ablocklever_enumleverposition.length;
for (int j = 0; j < i; ++j) {
BlockLever.EnumLeverPosition blocklever_enumleverposition = ablocklever_enumleverposition[j];
BlockLever.EnumLeverPosition.i[blocklever_enumleverposition.a()] = blocklever_enumleverposition;
}
}
}
}