diff --git a/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java b/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java index 51f8fa9..646dcd3 100644 --- a/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java +++ b/src/main/java/de/fanta/challengesjoinentities/listeners/EntityListener.java @@ -4,8 +4,13 @@ import de.fanta.challengesjoinentities.ChatUtil; import de.fanta.challengesjoinentities.JoinEntityData; import de.speedy64.globalport.GlobalApi; +import org.bukkit.GameMode; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.inventory.EquipmentSlot; @@ -18,39 +23,61 @@ this.plugin = plugin; } - @EventHandler + @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) public void onEntityInteract(PlayerInteractEntityEvent event) { if (!plugin.isJoinEntity(event.getRightClicked()) || event.getHand() != EquipmentSlot.HAND) { return; } - String serverName = plugin.getServerNameForEntity(event.getRightClicked().getUniqueId()); + if (event.getPlayer().getGameMode() != GameMode.CREATIVE || !event.getPlayer().isSneaking()) { + event.setCancelled(true); + onPlayerClickEntity(event.getPlayer(), event.getRightClicked()); + } + } + + @EventHandler(ignoreCancelled = true) + public void onEntityDamage(EntityDamageEvent event) { + if (plugin.isJoinEntity(event.getEntity())) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onEntityDamageByPlayer(EntityDamageByEntityEvent event) { + if (!plugin.isJoinEntity(event.getEntity())) { + return; + } + + event.setCancelled(true); + if (event.getDamager() instanceof Player) { + onPlayerClickEntity((Player) event.getDamager(), event.getEntity()); + } + } + + public void onPlayerClickEntity(Player player, Entity clicked) { + if (player == null || clicked == null) { + return; + } + String serverName = plugin.getServerNameForEntity(clicked.getUniqueId()); if (serverName != null) { JoinEntityData data = plugin.getEntityData(serverName); if (data != null) { switch (data.getServerStatus()) { case ONLINE: if (data.getPlayerCount() < data.getMaxPlayers()) { - GlobalApi.portOnlinePlayerToLocation(event.getPlayer().getName(), data.getGlobalPortLocationName()); + GlobalApi.portOnlinePlayerToLocation(player.getName(), data.getGlobalPortLocationName()); } else { - ChatUtil.sendErrorMessage(event.getPlayer(), "Der Server ist bereits voll!"); + ChatUtil.sendErrorMessage(player, "Der Server ist bereits voll!"); } break; case OFFLINE: - ChatUtil.sendErrorMessage(event.getPlayer(), "Der Server ist gerade offline."); + ChatUtil.sendErrorMessage(player, "Der Server ist gerade offline."); break; case RUNNING: - ChatUtil.sendErrorMessage(event.getPlayer(), "Hier läuft bereits eine Challenge!"); + ChatUtil.sendErrorMessage(player, "Hier läuft bereits eine Challenge!"); break; } } } } - - @EventHandler - public void onEntityDamage(EntityDamageEvent event) { - if (plugin.isJoinEntity(event.getEntity())) { - event.setCancelled(true); - } - } }