package net.glowstone.block.blocktype;
import net.glowstone.block.GlowBlock;
import net.glowstone.block.GlowBlockState;
import net.glowstone.entity.GlowPlayer;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Gate;
import org.bukkit.material.MaterialData;
import org.bukkit.util.Vector;
import java.util.Arrays;
import java.util.Collection;
public class BlockFenceGate extends BlockOpenable {
@Override
public void placeBlock(GlowPlayer player, GlowBlockState state, BlockFace face, ItemStack holding, Vector clickedLoc) {
super.placeBlock(player, state, face, holding, clickedLoc);
MaterialData materialData = state.getData();
if (materialData instanceof Gate) {
Gate gate = (Gate) materialData;
float yaw = player.getLocation().getYaw();
gate.setFacingDirection(blockFaceFromYaw(yaw));
state.update(true);
} else {
warnMaterialData(Gate.class, materialData);
}
}
private static BlockFace blockFaceFromYaw(float yaw) {
// nb: opposite from getOppositeBlockFace in BlockType
yaw = yaw % 360;
if (yaw < 0) {
yaw += 360.0;
}
if (0 <= yaw && yaw < 45) {
return BlockFace.SOUTH;
} else if (45 <= yaw && yaw < 135) {
return BlockFace.WEST;
} else if (135 <= yaw && yaw < 225) {
return BlockFace.NORTH;
} else if (225 <= yaw && yaw < 315) {
return BlockFace.EAST;
} else if (315 <= yaw && yaw < 360.0) {
return BlockFace.SOUTH;
} else {
return BlockFace.EAST;
}
}
@Override
protected void onOpened(GlowPlayer player, GlowBlock block, BlockFace face, Vector clickedLoc, GlowBlockState state, MaterialData materialData) {
if (materialData instanceof Gate) {
Gate gate = (Gate) materialData;
gate.setFacingDirection(getOpenDirection(player.getLocation().getYaw(), gate.getFacing()));
} else {
warnMaterialData(Gate.class, materialData);
}
}
@Override
public Collection<ItemStack> getDrops(GlowBlock block, ItemStack tool) {
return Arrays.asList(new ItemStack(block.getType()));
}
private static BlockFace getOpenDirection(float yaw, BlockFace oldFacing) {
BlockFace facingDirection = blockFaceFromYaw(yaw);
if (facingDirection == oldFacing.getOppositeFace()) {
return facingDirection;
} else {
return oldFacing;
}
}
@Override
public void onRedstoneUpdate(GlowBlock block) {
GlowBlockState state = block.getState();
Gate gate = (Gate) state.getData();
boolean powered = block.isBlockIndirectlyPowered();
if (powered != gate.isOpen()) {
gate.setOpen(powered);
state.update();
}
}
}