package net.minecraft.server; import java.util.Random; import org.bukkit.event.block.BlockRedstoneEvent; // CraftBukkit public class BlockDoor extends Block { public static final BlockStateDirection FACING = BlockFacingHorizontal.FACING; public static final BlockStateBoolean OPEN = BlockStateBoolean.of("open"); public static final BlockStateEnum<BlockDoor.EnumDoorHinge> HINGE = BlockStateEnum.of("hinge", BlockDoor.EnumDoorHinge.class); public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered"); public static final BlockStateEnum<BlockDoor.EnumDoorHalf> HALF = BlockStateEnum.of("half", BlockDoor.EnumDoorHalf.class); protected static final AxisAlignedBB f = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 1.0D, 1.0D, 0.1875D); protected static final AxisAlignedBB g = new AxisAlignedBB(0.0D, 0.0D, 0.8125D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB B = new AxisAlignedBB(0.8125D, 0.0D, 0.0D, 1.0D, 1.0D, 1.0D); protected static final AxisAlignedBB C = new AxisAlignedBB(0.0D, 0.0D, 0.0D, 0.1875D, 1.0D, 1.0D); protected BlockDoor(Material material) { super(material); this.y(this.blockStateList.getBlockData().set(BlockDoor.FACING, EnumDirection.NORTH).set(BlockDoor.OPEN, Boolean.valueOf(false)).set(BlockDoor.HINGE, BlockDoor.EnumDoorHinge.LEFT).set(BlockDoor.POWERED, Boolean.valueOf(false)).set(BlockDoor.HALF, BlockDoor.EnumDoorHalf.LOWER)); } @Override public AxisAlignedBB b(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) { iblockdata = iblockdata.b(iblockaccess, blockposition); EnumDirection enumdirection = iblockdata.get(BlockDoor.FACING); boolean flag = !iblockdata.get(BlockDoor.OPEN).booleanValue(); boolean flag1 = iblockdata.get(BlockDoor.HINGE) == BlockDoor.EnumDoorHinge.RIGHT; switch (enumdirection) { case EAST: default: return flag ? BlockDoor.C : (flag1 ? BlockDoor.g : BlockDoor.f); case SOUTH: return flag ? BlockDoor.f : (flag1 ? BlockDoor.C : BlockDoor.B); case WEST: return flag ? BlockDoor.B : (flag1 ? BlockDoor.f : BlockDoor.g); case NORTH: return flag ? BlockDoor.g : (flag1 ? BlockDoor.B : BlockDoor.C); } } @Override public String getName() { return LocaleI18n.get((this.a() + ".name").replaceAll("tile", "item")); } @Override public boolean b(IBlockData iblockdata) { return false; } @Override public boolean b(IBlockAccess iblockaccess, BlockPosition blockposition) { return g(c(iblockaccess, blockposition)); } @Override public boolean c(IBlockData iblockdata) { return false; } private int e() { return this.material == Material.ORE ? 1011 : 1012; } private int g() { return this.material == Material.ORE ? 1005 : 1006; } @Override public MaterialMapColor r(IBlockData iblockdata) { return iblockdata.getBlock() == Blocks.IRON_DOOR ? MaterialMapColor.h : (iblockdata.getBlock() == Blocks.WOODEN_DOOR ? BlockWood.EnumLogVariant.OAK.c() : (iblockdata.getBlock() == Blocks.SPRUCE_DOOR ? BlockWood.EnumLogVariant.SPRUCE.c() : (iblockdata.getBlock() == Blocks.BIRCH_DOOR ? BlockWood.EnumLogVariant.BIRCH.c() : (iblockdata.getBlock() == Blocks.JUNGLE_DOOR ? BlockWood.EnumLogVariant.JUNGLE.c() : (iblockdata.getBlock() == Blocks.ACACIA_DOOR ? BlockWood.EnumLogVariant.ACACIA.c() : (iblockdata.getBlock() == Blocks.DARK_OAK_DOOR ? BlockWood.EnumLogVariant.DARK_OAK.c() : super.r(iblockdata))))))); } @Override public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumHand enumhand, EnumDirection enumdirection, float f, float f1, float f2) { if (this.material == Material.ORE) { return false; } else { BlockPosition blockposition1 = iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER ? blockposition : blockposition.down(); IBlockData iblockdata1 = blockposition.equals(blockposition1) ? iblockdata : world.getType(blockposition1); if (iblockdata1.getBlock() != this) { return false; } else { iblockdata = iblockdata1.a((IBlockState) BlockDoor.OPEN); world.setTypeAndData(blockposition1, iblockdata, 10); world.b(blockposition1, blockposition); world.a(entityhuman, iblockdata.get(BlockDoor.OPEN).booleanValue() ? this.g() : this.e(), blockposition, 0); return true; } } } public void setDoor(World world, BlockPosition blockposition, boolean flag) { IBlockData iblockdata = world.getType(blockposition); if (iblockdata.getBlock() == this) { BlockPosition blockposition1 = iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER ? blockposition : blockposition.down(); IBlockData iblockdata1 = blockposition == blockposition1 ? iblockdata : world.getType(blockposition1); if (iblockdata1.getBlock() == this && iblockdata1.get(BlockDoor.OPEN).booleanValue() != flag) { world.setTypeAndData(blockposition1, iblockdata1.set(BlockDoor.OPEN, Boolean.valueOf(flag)), 10); world.b(blockposition1, blockposition); world.a((EntityHuman) null, flag ? this.g() : this.e(), blockposition, 0); } } } @Override public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Block block, BlockPosition blockposition1) { if (iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER) { BlockPosition blockposition2 = blockposition.down(); IBlockData iblockdata1 = world.getType(blockposition2); if (iblockdata1.getBlock() != this) { world.setAir(blockposition); } else if (block != this) { iblockdata1.doPhysics(world, blockposition2, block, blockposition1); } } else { boolean flag = false; BlockPosition blockposition3 = blockposition.up(); IBlockData iblockdata2 = world.getType(blockposition3); if (iblockdata2.getBlock() != this) { world.setAir(blockposition); flag = true; } if (!world.getType(blockposition.down()).r()) { world.setAir(blockposition); flag = true; if (iblockdata2.getBlock() == this) { world.setAir(blockposition3); } } if (flag) { if (!world.isClientSide) { this.b(world, blockposition, iblockdata, 0); } } else { // CraftBukkit start org.bukkit.World bworld = world.getWorld(); org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(blockposition.getX(), blockposition.getY(), blockposition.getZ()); org.bukkit.block.Block blockTop = bworld.getBlockAt(blockposition3.getX(), blockposition3.getY(), blockposition3.getZ()); int power = bukkitBlock.getBlockPower(); int powerTop = blockTop.getBlockPower(); if (powerTop > power) power = powerTop; int oldPower = iblockdata2.get(BlockDoor.POWERED) ? 15 : 0; if (oldPower == 0 ^ power == 0) { BlockRedstoneEvent eventRedstone = new BlockRedstoneEvent(bukkitBlock, oldPower, power); world.getServer().getPluginManager().callEvent(eventRedstone); boolean flag1 = eventRedstone.getNewCurrent() > 0; // CraftBukkit end world.setTypeAndData(blockposition3, iblockdata2.set(BlockDoor.POWERED, Boolean.valueOf(flag1)), 2); if (flag1 != iblockdata.get(BlockDoor.OPEN).booleanValue()) { world.setTypeAndData(blockposition, iblockdata.set(BlockDoor.OPEN, Boolean.valueOf(flag1)), 2); world.b(blockposition, blockposition); world.a((EntityHuman) null, flag1 ? this.g() : this.e(), blockposition, 0); } } } } } @Override public Item getDropType(IBlockData iblockdata, Random random, int i) { return iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER ? Items.a : this.h(); } @Override public boolean canPlace(World world, BlockPosition blockposition) { return blockposition.getY() >= 255 ? false : world.getType(blockposition.down()).r() && super.canPlace(world, blockposition) && super.canPlace(world, blockposition.up()); } @Override public EnumPistonReaction h(IBlockData iblockdata) { return EnumPistonReaction.DESTROY; } public static int c(IBlockAccess iblockaccess, BlockPosition blockposition) { IBlockData iblockdata = iblockaccess.getType(blockposition); int i = iblockdata.getBlock().toLegacyData(iblockdata); boolean flag = i(i); IBlockData iblockdata1 = iblockaccess.getType(blockposition.down()); int j = iblockdata1.getBlock().toLegacyData(iblockdata1); int k = flag ? j : i; IBlockData iblockdata2 = iblockaccess.getType(blockposition.up()); int l = iblockdata2.getBlock().toLegacyData(iblockdata2); int i1 = flag ? i : l; boolean flag1 = (i1 & 1) != 0; boolean flag2 = (i1 & 2) != 0; return e(k) | (flag ? 8 : 0) | (flag1 ? 16 : 0) | (flag2 ? 32 : 0); } @Override public ItemStack a(World world, BlockPosition blockposition, IBlockData iblockdata) { return new ItemStack(this.h()); } private Item h() { return this == Blocks.IRON_DOOR ? Items.IRON_DOOR : (this == Blocks.SPRUCE_DOOR ? Items.SPRUCE_DOOR : (this == Blocks.BIRCH_DOOR ? Items.BIRCH_DOOR : (this == Blocks.JUNGLE_DOOR ? Items.JUNGLE_DOOR : (this == Blocks.ACACIA_DOOR ? Items.ACACIA_DOOR : (this == Blocks.DARK_OAK_DOOR ? Items.DARK_OAK_DOOR : Items.WOODEN_DOOR))))); } @Override public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) { BlockPosition blockposition1 = blockposition.down(); BlockPosition blockposition2 = blockposition.up(); if (entityhuman.abilities.canInstantlyBuild && iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER && world.getType(blockposition1).getBlock() == this) { world.setAir(blockposition1); } if (iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER && world.getType(blockposition2).getBlock() == this) { if (entityhuman.abilities.canInstantlyBuild) { world.setAir(blockposition); } world.setAir(blockposition2); } } @Override public IBlockData updateState(IBlockData iblockdata, IBlockAccess iblockaccess, BlockPosition blockposition) { IBlockData iblockdata1; if (iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.LOWER) { iblockdata1 = iblockaccess.getType(blockposition.up()); if (iblockdata1.getBlock() == this) { iblockdata = iblockdata.set(BlockDoor.HINGE, iblockdata1.get(BlockDoor.HINGE)).set(BlockDoor.POWERED, iblockdata1.get(BlockDoor.POWERED)); } } else { iblockdata1 = iblockaccess.getType(blockposition.down()); if (iblockdata1.getBlock() == this) { iblockdata = iblockdata.set(BlockDoor.FACING, iblockdata1.get(BlockDoor.FACING)).set(BlockDoor.OPEN, iblockdata1.get(BlockDoor.OPEN)); } } return iblockdata; } @Override public IBlockData a(IBlockData iblockdata, EnumBlockRotation enumblockrotation) { return iblockdata.get(BlockDoor.HALF) != BlockDoor.EnumDoorHalf.LOWER ? iblockdata : iblockdata.set(BlockDoor.FACING, enumblockrotation.a(iblockdata.get(BlockDoor.FACING))); } @Override public IBlockData a(IBlockData iblockdata, EnumBlockMirror enumblockmirror) { return enumblockmirror == EnumBlockMirror.NONE ? iblockdata : iblockdata.a(enumblockmirror.a(iblockdata.get(BlockDoor.FACING))).a((IBlockState) BlockDoor.HINGE); } @Override public IBlockData fromLegacyData(int i) { return (i & 8) > 0 ? this.getBlockData().set(BlockDoor.HALF, BlockDoor.EnumDoorHalf.UPPER).set(BlockDoor.HINGE, (i & 1) > 0 ? BlockDoor.EnumDoorHinge.RIGHT : BlockDoor.EnumDoorHinge.LEFT).set(BlockDoor.POWERED, Boolean.valueOf((i & 2) > 0)) : this.getBlockData().set(BlockDoor.HALF, BlockDoor.EnumDoorHalf.LOWER).set(BlockDoor.FACING, EnumDirection.fromType2(i & 3).f()).set(BlockDoor.OPEN, Boolean.valueOf((i & 4) > 0)); } @Override public int toLegacyData(IBlockData iblockdata) { byte b0 = 0; int i; if (iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER) { i = b0 | 8; if (iblockdata.get(BlockDoor.HINGE) == BlockDoor.EnumDoorHinge.RIGHT) { i |= 1; } if (iblockdata.get(BlockDoor.POWERED).booleanValue()) { i |= 2; } } else { i = b0 | iblockdata.get(BlockDoor.FACING).e().get2DRotationValue(); if (iblockdata.get(BlockDoor.OPEN).booleanValue()) { i |= 4; } } return i; } protected static int e(int i) { return i & 7; } public static boolean d(IBlockAccess iblockaccess, BlockPosition blockposition) { return g(c(iblockaccess, blockposition)); } public static EnumDirection f(IBlockAccess iblockaccess, BlockPosition blockposition) { return f(c(iblockaccess, blockposition)); } public static EnumDirection f(int i) { return EnumDirection.fromType2(i & 3).f(); } protected static boolean g(int i) { return (i & 4) != 0; } protected static boolean i(int i) { return (i & 8) != 0; } @Override protected BlockStateList getStateList() { return new BlockStateList(this, new IBlockState[] { BlockDoor.HALF, BlockDoor.FACING, BlockDoor.OPEN, BlockDoor.HINGE, BlockDoor.POWERED}); } public static enum EnumDoorHinge implements INamable { LEFT, RIGHT; private EnumDoorHinge() {} @Override public String toString() { return this.getName(); } @Override public String getName() { return this == BlockDoor.EnumDoorHinge.LEFT ? "left" : "right"; } } public static enum EnumDoorHalf implements INamable { UPPER, LOWER; private EnumDoorHalf() {} @Override public String toString() { return this.getName(); } @Override public String getName() { return this == BlockDoor.EnumDoorHalf.UPPER ? "upper" : "lower"; } } }