@Override public String toString() { return (isTopHalf() ? "TOP" : "BOTTOM") + " half of " + super.toString(); }
@Override public void onRedstoneUpdate(GlowBlock block) { GlowBlockState state = block.getState(); Door door = (Door) state.getData(); if (!door.isTopHalf()) { boolean powered = block.isBlockIndirectlyPowered(); if (powered != door.isOpen()) { door.setOpen(powered); state.update(); } } }
@Override public void onBlockChanged(GlowBlock block, Material oldType, byte oldData, Material newType, byte newData) { if (newType != Material.AIR) { return; } if (oldType.getData() == Door.class) { Door door = new Door(oldType); door.setData(oldData); if (door.isTopHalf()) { Block b = block.getRelative(BlockFace.DOWN); if (b.getState().getData() instanceof Door) { b.setType(Material.AIR); } } else { Block b = block.getRelative(BlockFace.UP); if (b.getState().getData() instanceof Door) { b.setType(Material.AIR); } } } }
/** * Opens and closes the door when right-clicked by the player. */ @Override public boolean blockInteract(GlowPlayer player, GlowBlock block, BlockFace face, Vector clickedLoc) { // handles opening and closing the door if (block.getType() == Material.IRON_DOOR_BLOCK) { return false; } GlowBlockState state = block.getState(); MaterialData data = state.getData(); if (data instanceof Door) { Door door = (Door) data; if (door.isTopHalf()) { door = null; block = block.getWorld().getBlockAt(block.getX(), block.getY() - 1, block.getZ()); state = block.getState(); data = state.getData(); if (data instanceof Door) { door = (Door) data; } } if (door != null) { door.setOpen(!door.isOpen()); } state.update(true); } return true; }
@Override public String toString() { return (isTopHalf() ? "TOP" : "BOTTOM") + " half of " + super.toString(); }
/** * Add a past state for this block, extending for the other block in case of * doors. This is for the case of interaction or redstone level change. * * @param block * @param relevantFlags */ private void addBlockWithAttachedPotential(final Block block, final long relevantFlags) { final MaterialData materialData = block.getState().getData(); if (materialData instanceof Door) { final Door door = (Door) materialData; final Block otherBlock = block.getRelative(door.isTopHalf() ? BlockFace.DOWN : BlockFace.UP); /* * TODO: In case of redstone: Double doors... detect those too? Is it still more * efficient than using BlockPhysics with lazy delayed updating * (TickListener...). Hinge corner... possibilities? */ if (otherBlock != null // Top of the map / special case. && (BlockProperties.getBlockFlags(otherBlock.getType()) | relevantFlags) == 0) { tracker.addBlocks(block, otherBlock); return; } } // Only add the block in question itself. tracker.addBlocks(block); }
@Override public void run(NPC npc, Block point, ListIterator<Block> path) { BlockState state = point.getState(); Door door = (Door) state.getData(); if (npc.getStoredLocation().distance(point.getLocation()) < 2) { boolean bottom = !door.isTopHalf(); Block set = bottom ? point : point.getRelative(BlockFace.DOWN); state = set.getState(); door = (Door) state.getData(); door.setOpen(true); state.setData(door); state.update(); } } }
if (doorData.isTopHalf()) { targetBlock = targetBlock.getRelative(BlockFace.DOWN); blockState = targetBlock.getState();
door_bottom = (door.isTopHalf()) ? block.getRelative(BlockFace.DOWN) : block; boolean opened = TARDISStaticUtils.isDoorOpen(door_bottom); if (opened && preset.hasDoor()) {
if (doorData.isTopHalf()) { targetBlock = targetBlock.getRelative(BlockFace.DOWN); blockState = targetBlock.getState();
door_bottom = (door.isTopHalf()) ? block.getRelative(BlockFace.DOWN) : block; boolean opened = TARDISStaticUtils.isDoorOpen(door_bottom); if (opened && preset.hasDoor()) {
BlockState state = b.getState(); if (state.getData() instanceof Door && ((Door) state.getData()).isTopHalf()) { state = b.getRelative(BlockFace.DOWN).getState();