if (!isProtected(player, rm, x, y, z, block, minecraftID)) {
final PlayerInteractBlockEvent event = new PlayerInteractBlockEvent(player, block, point, clickedFace, Action.LEFT_CLICK);
if (player.getEngine().getEventManager().callEvent(event).isCancelled()) {
if (human.isCreative() || blockMaterial.getHardness() == 0.0f) {
session.send(new BlockChangeMessage(block, player.getNetwork().getRepositionManager()));
Sign sign = block.get(Sign.class);
if (sign != null) {
session.send(new SignMessage(block.getX(), block.getY(), block.getZ(), sign.getText(), player.getNetwork().getRepositionManager()));
}
}
} else {
// Perform interactions
if (heldItem == null) {
// interacting using fist
} else if (!isInteractable) {
// interacting with nothing using item
heldItem.getMaterial().onInteract(player, Action.LEFT_CLICK);
} else {
// interacting with block using item
heldItem.getMaterial().onInteract(player, block, Action.LEFT_CLICK, clickedFace);
}
if (isInteractable) {
Block neigh = block.translate(clickedFace);
boolean fire = neigh.getMaterial().equals(VanillaMaterials.FIRE);
if (fire) {
// put out fire
if (VanillaMaterials.FIRE.onDestroy(neigh, new PlayerBreakCause(player, neigh))) {
GeneralEffects.RANDOM_FIZZ.playGlobal(block.getPosition());
}
} else if (human.isSurvival() && blockMaterial.getHardness() != 0.0f) {
ItemStack currentItem = PlayerUtil.getHeldSlot(player).get();
if (currentItem != null) {
player.get(Digging.class).startDigging(new Point(w, x, y, z), currentItem.getMaterial());
} else {
player.get(Digging.class).startDigging(new Point(w, x, y, z), VanillaMaterials.AIR);
}
} else {
// insta-break
if (breakBlock(blockMaterial, block, human, session)) {
GeneralEffects.BREAKBLOCK.playGlobal(block.getPosition(), blockMaterial, player);
}
}
}
}
}
break;
case PlayerDiggingMessage.STATE_CANCEL_DIGGING:
if (!isProtected(player, rm, x, y, z, block, minecraftID)) {
player.get(Digging.class).stopDigging(new Point(w, x, y, z), false);
}
break;
case PlayerDiggingMessage.STATE_DONE_DIGGING:
if (!isProtected(player, rm, x, y, z, block, minecraftID)) {
Digging diggingComponent = player.get(Digging.class);
if (!diggingComponent.stopDigging(new Point(w, x, y, z), true) || !isInteractable) {
if (!diggingComponent.isDigging()) {
session.send(new BlockChangeMessage(block, player.getNetwork().getRepositionManager()));
Sign sign = block.get(Sign.class);
if (sign != null) {
session.send(new SignMessage(block.getX(), block.getY(), block.getZ(), sign.getText(), player.getNetwork().getRepositionManager()));
}
}
return;
}