package net.glowstone.block.blocktype; import net.glowstone.block.GlowBlock; import net.glowstone.block.GlowBlockState; import net.glowstone.entity.GlowPlayer; import net.glowstone.inventory.ToolType; import org.bukkit.Material; import org.bukkit.block.BlockFace; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.material.Step; import org.bukkit.material.WoodenStep; import org.bukkit.util.Vector; import java.util.Arrays; import java.util.Collection; public class BlockSlab extends BlockType { @Override public void placeBlock(GlowPlayer player, GlowBlockState state, BlockFace face, ItemStack holding, Vector clickedLoc) { Material blockType = state.getBlock().getType(); if (blockType == Material.STEP) { state.setType(Material.DOUBLE_STEP); state.setRawData((byte) holding.getDurability()); return; } else if (blockType == Material.WOOD_STEP) { state.setType(Material.WOOD_DOUBLE_STEP); state.setRawData((byte) holding.getDurability()); return; } else if (blockType == Material.STONE_SLAB2) { state.setType(Material.DOUBLE_STONE_SLAB2); state.setRawData((byte) holding.getDurability()); return; } super.placeBlock(player, state, face, holding, clickedLoc); if (face == BlockFace.DOWN || (face != BlockFace.UP && clickedLoc.getY() >= 8.0D)) { MaterialData data = state.getData(); if ((data instanceof Step)) { ((Step) data).setInverted(true); } else if ((data instanceof WoodenStep)) { ((WoodenStep) data).setInverted(true); } else if (data.getItemType() == Material.STONE_SLAB2) { Step slab = new Step(Material.STONE_SLAB2); slab.setInverted(true); data = slab; } state.setData(data); } } private boolean matchingType(GlowBlock block, BlockFace face, ItemStack holding, boolean ignoreFace) { if (holding == null) return false; byte blockData = block.getData(); byte holdingData = (byte) holding.getDurability(); Material blockType = block.getType(); return (blockType == Material.STEP || blockType == Material.WOOD_STEP || blockType == Material.STONE_SLAB2) && blockType == holding.getType() && ((face == BlockFace.UP && blockData == holdingData) || (face == BlockFace.DOWN && blockData - 8 == holdingData) || (ignoreFace && blockData % 8 == holdingData)); } @Override public boolean canOverride(GlowBlock block, BlockFace face, ItemStack holding) { return matchingType(block, face, holding, true); } @Override public boolean canAbsorb(GlowBlock block, BlockFace face, ItemStack holding) { return matchingType(block, face, holding, false); } @Override public Collection<ItemStack> getDrops(GlowBlock block, ItemStack tool) { if (block.getType() == Material.WOOD_STEP || (tool != null && ToolType.PICKAXE.matches(tool.getType()))) { return getMinedDrops(block); } return BlockDropless.EMPTY_STACK; } @Override public Collection<ItemStack> getMinedDrops(GlowBlock block) { return Arrays.asList(new ItemStack(block.getType(), 1, (short) (block.getData() % 8))); } }