
net.minecraft.server.BlockDoor Maven / Gradle / Ivy
package net.minecraft.server;
import org.bukkit.event.block.BlockRedstoneEvent;
import java.util.Random;
public class BlockDoor extends Block {
public static final BlockStateDirection FACING = BlockStateDirection.of("facing", EnumDirection.EnumDirectionLimit.HORIZONTAL);
public static final BlockStateBoolean OPEN = BlockStateBoolean.of("open");
public static final BlockStateEnum HINGE = BlockStateEnum.of("hinge", BlockDoor.EnumDoorHinge.class);
public static final BlockStateBoolean POWERED = BlockStateBoolean.of("powered");
public static final BlockStateEnum HALF = BlockStateEnum.of("half", BlockDoor.EnumDoorHalf.class);
protected BlockDoor(Material material) {
super(material);
this.j(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));
}
public static int e(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 b(k) | (flag ? 8 : 0) | (flag1 ? 16 : 0) | (flag2 ? 32 : 0);
}
protected static int b(int i) {
return i & 7;
}
public static boolean f(IBlockAccess iblockaccess, BlockPosition blockposition) {
return g(e(iblockaccess, blockposition));
}
public static EnumDirection h(IBlockAccess iblockaccess, BlockPosition blockposition) {
return f(e(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;
}
protected static boolean j(int i) {
return (i & 16) != 0;
}
public String getName() {
return LocaleI18n.get((this.a() + ".name").replaceAll("tile", "item"));
}
public boolean c() {
return false;
}
public boolean b(IBlockAccess iblockaccess, BlockPosition blockposition) {
return g(e(iblockaccess, blockposition));
}
public boolean d() {
return false;
}
public AxisAlignedBB a(World world, BlockPosition blockposition, IBlockData iblockdata) {
this.updateShape(world, blockposition);
return super.a(world, blockposition, iblockdata);
}
public void updateShape(IBlockAccess iblockaccess, BlockPosition blockposition) {
this.k(e(iblockaccess, blockposition));
}
private void k(int i) {
float f = 0.1875F;
this.a(0.0F, 0.0F, 0.0F, 1.0F, 2.0F, 1.0F);
EnumDirection enumdirection = f(i);
boolean flag = g(i);
boolean flag1 = j(i);
if (flag) {
if (enumdirection == EnumDirection.EAST) {
if (!flag1) {
this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f);
} else {
this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F);
}
} else if (enumdirection == EnumDirection.SOUTH) {
if (!flag1) {
this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
} else {
this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F);
}
} else if (enumdirection == EnumDirection.WEST) {
if (!flag1) {
this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F);
} else {
this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f);
}
} else if (enumdirection == EnumDirection.NORTH) {
if (!flag1) {
this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F);
} else {
this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
}
}
} else if (enumdirection == EnumDirection.EAST) {
this.a(0.0F, 0.0F, 0.0F, f, 1.0F, 1.0F);
} else if (enumdirection == EnumDirection.SOUTH) {
this.a(0.0F, 0.0F, 0.0F, 1.0F, 1.0F, f);
} else if (enumdirection == EnumDirection.WEST) {
this.a(1.0F - f, 0.0F, 0.0F, 1.0F, 1.0F, 1.0F);
} else if (enumdirection == EnumDirection.NORTH) {
this.a(0.0F, 0.0F, 1.0F - f, 1.0F, 1.0F, 1.0F);
}
}
public boolean interact(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman, EnumDirection enumdirection, float f, float f1, float f2) {
if (this.material == Material.ORE) {
return true;
} 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(BlockDoor.OPEN);
world.setTypeAndData(blockposition1, iblockdata, 2);
world.b(blockposition1, blockposition);
world.a(entityhuman, iblockdata.get(BlockDoor.OPEN).booleanValue() ? 1003 : 1006, 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)), 2);
world.b(blockposition1, blockposition);
world.a(null, flag ? 1003 : 1006, blockposition, 0);
}
}
}
public void doPhysics(World world, BlockPosition pos, IBlockData iblockdata, Block block) {
if (iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER) {
BlockPosition blockposition1 = pos.down();
IBlockData iblockdata1 = world.getType(blockposition1);
if (iblockdata1.getBlock() != this) {
world.setAir(pos);
} else if (block != this) {
this.doPhysics(world, blockposition1, iblockdata1, block);
}
} else {
boolean flag = false;
BlockPosition blockposition2 = pos.up();
IBlockData iblockdata2 = world.getType(blockposition2);
if (iblockdata2.getBlock() != this) {
world.setAir(pos);
flag = true;
}
if (!World.a(world, pos.down())) {
world.setAir(pos);
flag = true;
if (iblockdata2.getBlock() == this) {
world.setAir(blockposition2);
}
}
if (flag) {
if (!world.isClientSide) {
this.b(world, pos, iblockdata, 0);
}
} else {
// CraftBukkit start
org.bukkit.World bworld = world.getWorld();
org.bukkit.block.Block bukkitBlock = bworld.getBlockAt(pos.getX(), pos.getY(), pos.getZ());
org.bukkit.block.Block blockTop = bworld.getBlockAt(blockposition2.getX(), blockposition2.getY(), blockposition2.getZ());
int power = bukkitBlock.getBlockPower();
int powerTop = blockTop.getBlockPower();
if (powerTop > power) power = powerTop;
int oldPower = iblockdata2.get(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;
world.setTypeAndData(blockposition2, iblockdata2.set(BlockDoor.POWERED, Boolean.valueOf(flag1)), 2);
if (flag1 != iblockdata.get(BlockDoor.OPEN).booleanValue()) {
world.setTypeAndData(pos, iblockdata.set(BlockDoor.OPEN, Boolean.valueOf(flag1)), 2);
world.b(pos, pos);
world.a(null, flag1 ? 1003 : 1006, pos, 0);
}
}
// CraftBukkit end
}
}
}
public Item getDropType(IBlockData iblockdata, Random random, int i) {
return iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER ? null : this.l();
}
public MovingObjectPosition a(World world, BlockPosition blockposition, Vec3D vec3d, Vec3D vec3d1) {
this.updateShape(world, blockposition);
return super.a(world, blockposition, vec3d, vec3d1);
}
public boolean canPlace(World world, BlockPosition blockposition) {
return blockposition.getY() < 255 && World.a(world, blockposition.down()) && super.canPlace(world, blockposition) && super.canPlace(world, blockposition.up());
}
public int k() {
return 1;
}
private Item l() {
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)))));
}
public void a(World world, BlockPosition blockposition, IBlockData iblockdata, EntityHuman entityhuman) {
BlockPosition blockposition1 = blockposition.down();
if (entityhuman.abilities.canInstantlyBuild && iblockdata.get(BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER && world.getType(blockposition1).getBlock() == this) {
world.setAir(blockposition1);
}
}
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;
}
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));
}
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().b();
if (iblockdata.get(BlockDoor.OPEN).booleanValue()) {
i |= 4;
}
}
return i;
}
protected BlockStateList getStateList() {
return new BlockStateList(this, BlockDoor.HALF, BlockDoor.FACING, BlockDoor.OPEN, BlockDoor.HINGE, BlockDoor.POWERED);
}
public enum EnumDoorHinge implements INamable {
LEFT, RIGHT;
EnumDoorHinge() {
}
public String toString() {
return this.getName();
}
public String getName() {
return this == BlockDoor.EnumDoorHinge.LEFT ? "left" : "right";
}
}
public enum EnumDoorHalf implements INamable {
UPPER, LOWER;
EnumDoorHalf() {
}
public String toString() {
return this.getName();
}
public String getName() {
return this == BlockDoor.EnumDoorHalf.UPPER ? "upper" : "lower";
}
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy