package net.glowstone.block.blocktype;
import net.glowstone.block.GlowBlock;
import net.glowstone.block.GlowBlockState;
import net.glowstone.block.ItemTable;
import net.glowstone.entity.GlowPlayer;
import org.bukkit.Material;
import org.bukkit.block.BlockFace;
import org.bukkit.inventory.ItemStack;
import org.bukkit.material.Diode;
import org.bukkit.material.MaterialData;
import org.bukkit.util.Vector;
public class BlockRedstoneRepeater extends BlockNeedsAttached {
private static final BlockFace[] ADJACENT = new BlockFace[]{BlockFace.NORTH, BlockFace.EAST, BlockFace.SOUTH, BlockFace.WEST, BlockFace.UP, BlockFace.DOWN};
public BlockRedstoneRepeater() {
setDrops(new ItemStack(Material.DIODE));
}
@Override
public boolean blockInteract(GlowPlayer player, GlowBlock block, BlockFace face, Vector clickedLoc) {
Diode diode = (Diode) block.getState().getData();
diode.setDelay(diode.getDelay() == 4 ? 1 : diode.getDelay() + 1);
block.setData(diode.getData());
return true;
}
@Override
public void afterPlace(GlowPlayer player, GlowBlock block, ItemStack holding, GlowBlockState oldState) {
updatePhysics(block);
}
@Override
public void onNearBlockChanged(GlowBlock block, BlockFace face, GlowBlock changedBlock, Material oldType, byte oldData, Material newType, byte newData) {
updatePhysics(block);
}
@Override
public void placeBlock(GlowPlayer player, GlowBlockState state, BlockFace face, ItemStack holding, Vector clickedLoc) {
super.placeBlock(player, state, face, holding, clickedLoc);
MaterialData data = state.getData();
if (data instanceof Diode) {
((Diode) data).setFacingDirection(player.getDirection());
state.setData(data);
} else {
warnMaterialData(Diode.class, data);
}
state.getWorld().requestPulse(state.getBlock());
}
@Override
public void updatePhysics(GlowBlock me) {
super.updatePhysics(me);
Diode diode = (Diode) me.getState().getData();
GlowBlock target = me.getRelative(diode.getFacing().getOppositeFace());
boolean powered = target.getType() == Material.REDSTONE_TORCH_ON || target.isBlockPowered() || target.getType() == Material.REDSTONE_WIRE
&& target.getData() > 0 && BlockRedstone.calculateConnections(target).contains(diode.getFacing())
|| target.getType() == Material.DIODE_BLOCK_ON && ((Diode) target.getState().getData()).getFacing() == diode.getFacing();
if (powered != (me.getType() == Material.DIODE_BLOCK_ON)) {
me.getWorld().requestPulse(me);
}
}
private void extraUpdate(GlowBlock block) {
Diode diode = (Diode) block.getState().getData();
ItemTable itemTable = ItemTable.instance();
GlowBlock target = block.getRelative(diode.getFacing());
if (target.getType().isSolid()) {
for (BlockFace face2 : ADJACENT) {
GlowBlock target2 = target.getRelative(face2);
BlockType notifyType = itemTable.getBlock(target2.getTypeId());
if (notifyType != null) {
if (target2.getFace(block) == null) {
notifyType.onNearBlockChanged(target2, BlockFace.SELF, block, block.getType(), block.getData(), block.getType(), block.getData());
}
notifyType.onRedstoneUpdate(target2);
}
}
}
}
@Override
public void receivePulse(GlowBlock block) {
Diode diode = (Diode) block.getState().getData();
GlowBlock target = block.getRelative(diode.getFacing().getOppositeFace());
boolean powered = target.getType() == Material.REDSTONE_TORCH_ON || target.isBlockPowered() || target.getType() == Material.REDSTONE_WIRE
&& target.getData() > 0 && BlockRedstone.calculateConnections(target).contains(diode.getFacing())
|| target.getType() == Material.DIODE_BLOCK_ON && ((Diode) target.getState().getData()).getFacing() == diode.getFacing();
if (!powered && block.getType() == Material.DIODE_BLOCK_ON) {
block.setTypeIdAndData(Material.DIODE_BLOCK_OFF.getId(), block.getData(), true);
extraUpdate(block);
} else if (powered && block.getType() == Material.DIODE_BLOCK_OFF) {
block.setTypeIdAndData(Material.DIODE_BLOCK_ON.getId(), block.getData(), true);
extraUpdate(block);
}
}
@Override
public boolean isPulseOnce(GlowBlock block) {
return true;
}
@Override
public int getPulseTickSpeed(GlowBlock block) {
Diode diode = (Diode) block.getState().getData();
return diode.getDelay() * 2;
}
}