package com.nicewuerfel.blockown.event; import com.google.common.base.Optional; import com.nicewuerfel.blockown.InvalidWorldNameException; import com.nicewuerfel.blockown.Material; import com.nicewuerfel.blockown.Message; import com.nicewuerfel.blockown.OwnedBlock; import com.nicewuerfel.blockown.OwnedEntity; import com.nicewuerfel.blockown.Permission; import com.nicewuerfel.blockown.Setting; import com.nicewuerfel.blockown.User; import com.nicewuerfel.blockown.WaitType; import com.nicewuerfel.blockown.database.Database; import com.nicewuerfel.blockown.database.DatabaseAction; import com.nicewuerfel.blockown.protection.ProtectAction; import com.nicewuerfel.blockown.protection.Protection; import com.nicewuerfel.blockown.protection.ProtectionCause; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import javax.annotation.Nonnull; public class L_PlayerInteract extends Listener { public L_PlayerInteract(Setting setting, Database database, Protection protection) { super(setting, database, protection); } private boolean checkValidity(Player player, @Nonnull OwnedBlock block) throws InvalidWorldNameException { if (block.getBlock().getType() == org.bukkit.Material.AIR) { return true; } if (!setting.isEnabledIn(block.getWorld())) { return true; } User user = User.getInstance(player.getUniqueId(), player); if (setting.isIgnoring(user)) { return true; } Optional<User> owner = database.getOwner(block); if (!owner.isPresent()) { return true; } ProtectionCause cause = user.getAccess(block.getMaterial(), owner.get()); if (cause != ProtectionCause.NONE) { if (setting.PROTECTION.ENABLE_MESSAGES) { player.sendMessage(cause.getMessage(Message.BLOCK.getMessage(), owner.get().getName())); } return false; } else { return true; } } private boolean checkValidity(Player player, @Nonnull OwnedEntity entity) throws InvalidWorldNameException { if (!setting.isEnabledIn(entity.getWorld())) { return true; } User user = User.getInstance(player.getUniqueId(), player); if (setting.isIgnoring(user)) { return true; } Optional<User> owner = database.getOwner(entity); if (!owner.isPresent()) { return true; } ProtectionCause cause = user.getAccess(entity.getMaterial(), owner.get()); if (cause != ProtectionCause.NONE) { if (setting.PROTECTION.ENABLE_MESSAGES) { player.sendMessage(cause.getMessage(Message.ENTITY.getMessage(), owner.get().getName())); } return false; } else { return true; } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerBlockInteract(PlayerInteractEvent event) { Block block = event.getClickedBlock(); if (block == null) { return; } OwnedBlock ownedBlock = OwnedBlock.newInstance(block); try { if (setting.PROTECTION.ALLOW_RIGHT_CLICKS_ON.contains(ownedBlock.getMaterial()) && event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { return; } if (!checkValidity(event.getPlayer(), ownedBlock)) { event.setCancelled(true); } } catch (InvalidWorldNameException ignored) { } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerEntityInteract(PlayerInteractEntityEvent event) { OwnedEntity entity = OwnedEntity.newInstance(event.getRightClicked()); try { if (setting.PROTECTION.ALLOW_RIGHT_CLICKS_ON.contains(entity.getMaterial())) { return; } if (!checkValidity(event.getPlayer(), entity)) { event.setCancelled(true); } } catch (InvalidWorldNameException ignored) { } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerDamageEntity(EntityDamageByEntityEvent event) { if (event.getDamager() instanceof Player) { Player player = (Player) event.getDamager(); OwnedEntity entity = OwnedEntity.newInstance(event.getEntity()); try { if (!checkValidity(player, entity)) { event.setCancelled(true); } } catch (InvalidWorldNameException ignored) { } } } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public void onPlayerBreakHanging(HangingBreakByEntityEvent event) { if (event.getRemover() instanceof Player) { Player player = (Player) event.getRemover(); OwnedEntity entity = OwnedEntity.newInstance(event.getEntity()); try { if (!checkValidity(player, entity)) { event.setCancelled(true); } } catch (InvalidWorldNameException ignored) { } } } /* * Handle entity choosing */ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerChooseEntity(PlayerInteractEntityEvent event) { if (!setting.isEnabledIn(event.getRightClicked().getWorld())) { return; } User user = User.getInstance(event.getPlayer().getUniqueId()); WaitType waitType = setting.getWaiting(user); if (waitType == null) { return; } event.setCancelled(true); OwnedEntity entity = OwnedEntity.newInstance(event.getRightClicked()); Material material; try { material = entity.getMaterial(); } catch (InvalidWorldNameException e) { // can't happen, since the OwnedEntity is backed by a bukkit Entity getOutput().printError("This should never happen! L_PLAYERINTERACT", e); return; } if (!setting.isOwnEnabled(material)) { return; } Optional<User> owner = database.getOwner(entity); Player player = event.getPlayer(); ProtectAction protectAction; DatabaseAction databaseAction; switch (waitType) { case SHOW_OWNER_ENTITY: if (!owner.isPresent()) { player .sendMessage(Message.COMMAND_SHOWOWNER_ENTITY_UNOWNED.getMessage(material.getName())); } else { player.sendMessage(Message.COMMAND_SHOWOWNER_ENTITY_FOUND .getMessage(owner.get().getName(), material.getName())); } break; case OWN_ENTITY: if (!owner.isPresent()) { databaseAction = DatabaseAction.newOwnInstance(entity, user); database.enqueue(databaseAction); player.sendMessage(Message.COMMAND_OWN_ENTITYSUCCESS.getMessage(material.getName())); } else { if (!owner.get().equals(user)) { player.sendMessage(Message.COMMAND_OWN_NOPERMISSIONFOROTHERS.getMessage()); } } break; case UNOWN_ENTITY: if (!owner.isPresent() || owner.get().equals(user) || player.hasPermission(Permission.ADMIN_UNOWN.toString())) { databaseAction = DatabaseAction.newUnownInstance(entity); database.enqueue(databaseAction); player.sendMessage(Message.COMMAND_UNOWN_ENTITYSUCCESS.getMessage(material.getName())); } else { player.sendMessage(Message.COMMAND_UNOWN_FOROTHERS_NOTALLOWED.getMessage()); } break; case PROTECT_ENTITY: protectAction = new ProtectAction.Builder(user).protect(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_PROTECT_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case UNPROTECT_ENTITY: protectAction = new ProtectAction.Builder(user).unprotect(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_UNPROTECT_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case LOCK_ENTITY: protectAction = new ProtectAction.Builder(user).lock(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_LOCK_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case UNLOCK_ENTITY: protectAction = new ProtectAction.Builder(user).unlock(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_UNLOCK_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; default: break; } } /* * Handle block choosing */ @EventHandler(priority = EventPriority.LOWEST) public void onPlayerChooseBlock(PlayerInteractEvent event) { if (event.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { Block nativeBlock = event.getClickedBlock(); if (!setting.isEnabledIn(nativeBlock.getWorld())) { return; } User user = User.getInstance(event.getPlayer().getUniqueId()); WaitType waitType = setting.getWaiting(user); if (waitType == null) { return; } event.setCancelled(true); OwnedBlock block = OwnedBlock.newInstance(nativeBlock); Material material; try { material = block.getMaterial(); } catch (InvalidWorldNameException e) { // can't happen, since the OwnedBlock is backed by a bukkit Block getOutput().printError("This should never happen! L_PLAYERINTERACT", e); return; } if (!setting.isOwnEnabled(material)) { return; } Optional<User> owner = database.getOwner(block); Player player = event.getPlayer(); ProtectAction protectAction; DatabaseAction databaseAction; switch (waitType) { case SHOW_OWNER_BLOCK: if (!owner.isPresent()) { player.sendMessage( Message.COMMAND_SHOWOWNER_BLOCK_UNOWNED.getMessage(material.getName())); } else { player.sendMessage(Message.COMMAND_SHOWOWNER_BLOCK_FOUND .getMessage(owner.get().getName(), material.getName())); } break; case OWN_BLOCK: if (!owner.isPresent()) { databaseAction = DatabaseAction.newOwnInstance(block, user); database.enqueue(databaseAction); player.sendMessage(Message.COMMAND_OWN_BLOCKSUCCESS.getMessage(material.getName())); } else { if (!owner.get().equals(user)) { player.sendMessage(Message.COMMAND_OWN_NOPERMISSIONFOROTHERS.getMessage()); } } break; case UNOWN_BLOCK: if (!owner.isPresent() || owner.get().equals(user) || player.hasPermission(Permission.ADMIN_UNOWN.toString())) { databaseAction = DatabaseAction.newUnownInstance(block); database.enqueue(databaseAction); player.sendMessage(Message.COMMAND_UNOWN_BLOCKSUCCESS.getMessage(material.getName())); } else { player.sendMessage(Message.COMMAND_UNOWN_FOROTHERS_NOTALLOWED.getMessage()); } break; case PROTECT_BLOCK: protectAction = new ProtectAction.Builder(user).protect(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_PROTECT_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case UNPROTECT_BLOCK: protectAction = new ProtectAction.Builder(user).unprotect(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_UNPROTECT_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case LOCK_BLOCK: protectAction = new ProtectAction.Builder(user).lock(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_LOCK_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; case UNLOCK_BLOCK: protectAction = new ProtectAction.Builder(user).unlock(material).build(); protection.enqueue(protectAction); player.sendMessage(Message.COMMAND_UNLOCK_SUCCESS.getMessage(material.getName())); player.sendMessage(Message.COMMAND_NO_MORE_CLICK_WAITING.getMessage()); setting.removeWaiting(user); break; default: break; } } } }