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) {
super.placeBlock(player, state, face, holding, clickedLoc);
Material blockType = state.getBlock().getType();
if (blockType == Material.STEP) {
state.setType(Material.DOUBLE_STEP);
state.setData(holding.getData());
return;
} else if (blockType == Material.WOOD_STEP) {
state.setType(Material.WOOD_DOUBLE_STEP);
state.setData(holding.getData());
return;
} else if (blockType == Material.STONE_SLAB2) {
state.setType(Material.DOUBLE_STONE_SLAB2);
state.setData(holding.getData());
return;
} else if (blockType == Material.PURPUR_SLAB) {
state.setType(Material.PURPUR_DOUBLE_SLAB);
state.setData(holding.getData());
return;
}
if (face == BlockFace.DOWN || face != BlockFace.UP && clickedLoc.getY() >= 0.5) {
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 || data.getItemType() == Material.PURPUR_SLAB) {
Step slab = new Step(data.getItemType());
slab.setInverted(true);
data = slab;
}
state.setData(data);
}
}
private boolean matchingType(GlowBlock block, BlockFace face, ItemStack holding, boolean ignoreFace) {
if (holding == null) return false;
Material blockType = block.getType();
byte blockData = block.getData();
byte holdingData = holding.getData().getData();
return (blockType == Material.STEP || blockType == Material.WOOD_STEP || blockType == Material.STONE_SLAB2 || blockType == Material.PURPUR_SLAB) &&
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)));
}
}