public static Optional<Integer> getDirectBlockPowerLevel(Location<?> ... blocks) { int power = -1; for(Location<?> block : blocks) { Optional<Integer> optional = getDirectBlockPowerLevel(block); if(optional.isPresent()) { if (power < optional.get()) { power = optional.get(); } } } if (power == -1) { return Optional.empty(); } else { return Optional.of(power); } }
public static Optional<Integer> getBlockPowerLevel(Location<?> block) { if (getDirectBlockPowerLevel(block).isPresent()) { return getDirectBlockPowerLevel(block); } else if (block.getProperty(PoweredProperty.class).isPresent()) { return Optional.of(block.getProperty(PoweredProperty.class).get().getValue() ? 15 : 0); } return Optional.empty(); }
@Listener public void onPlayerInteract(InteractBlockEvent.Secondary event, @First Player player) { event.getTargetBlock().getLocation().ifPresent((location) -> { int powerLevel = BlockUtil.getDirectBlockPowerLevel(location).orElse(-1); HandType hand = event instanceof InteractBlockEvent.Secondary.MainHand ? HandTypes.MAIN_HAND : HandTypes.OFF_HAND; if (powerLevel >= 0 && permissionNode.hasPermission(player) && player.getItemInHand(hand).isPresent() && player.getItemInHand(hand).get().getType() == ammeterItem.getValue().getType()) { player.sendMessage(getCurrentLine(powerLevel)); event.setCancelled(true); } }); }
@Listener public void onBlockUpdate(NotifyNeighborBlockEvent event, @First LocatableBlock source) { if(isValid(source.getLocation())) { boolean wasPowered = getState(source.getLocation()); List<Location<World>> locations = BlockUtil.getAdjacentExcept(source.getLocation(), Direction.NONE); locations.add(source.getLocation()); Optional<Integer> power = BlockUtil.getDirectBlockPowerLevel(locations.toArray(EMPTY_LOCATION_ARRAY)); power.ifPresent(integer -> { boolean isPowered = integer > 0; if (isPowered != wasPowered) { updateState(source.getLocation(), isPowered); } }); } } }