/* * This file is part of Libelula Minecraft Edition Project. * * Libelula Minecraft Edition is free software: you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Libelula Minecraft Edition is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Libelula Minecraft Edition. * If not, see <http://www.gnu.org/licenses/>. * */ package me.libelula.hiipovssurvival; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.event.entity.EntityTargetEvent; import org.bukkit.event.entity.FoodLevelChangeEvent; import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerFishEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerMoveEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; /** * * @author Diego D'Onofrio <ddonofrio@member.fsf.org> * @version 1.0 * */ public final class EventManager { private final Main plugin; private final GameListeners gameEvents; private class GameListeners implements Listener { @EventHandler(priority = EventPriority.HIGHEST) public void onPlayerMove(PlayerMoveEvent e) { if (!plugin.pm.isGhost(e.getPlayer())) { for (Player ghost : plugin.getServer().getOnlinePlayers()) { if (plugin.pm.isGhost(ghost)) { if (e.getPlayer().getLocation().distance(ghost.getLocation()) < 4) { Location newPossibleLoc; newPossibleLoc = ghost.getLocation().add(0, 5, 0); if (newPossibleLoc.getBlock().getType() != Material.AIR || newPossibleLoc.add(0, 1, 0).getBlock().getType() != Material.AIR) { newPossibleLoc = ghost.getLocation().add(5, 0, 0); if (newPossibleLoc.getBlock().getType() != Material.AIR || newPossibleLoc.add(0, 1, 0).getBlock().getType() != Material.AIR) { newPossibleLoc = ghost.getLocation().add(-5, 0, 0); if (newPossibleLoc.getBlock().getType() != Material.AIR || newPossibleLoc.add(0, 1, 0).getBlock().getType() != Material.AIR) { newPossibleLoc = ghost.getLocation().add(0, 0, 5); if (newPossibleLoc.getBlock().getType() != Material.AIR || newPossibleLoc.add(0, 1, 0).getBlock().getType() != Material.AIR) { newPossibleLoc = ghost.getLocation().add(0, 0, -5); } } } } ghost.teleport(newPossibleLoc); ghost.setAllowFlight(true); ghost.setFlying(true); } } } } } @EventHandler(priority = EventPriority.HIGHEST) public void onDeath(PlayerDeathEvent e) { if (plugin.pm.isGhost(e.getEntity())) { e.setDeathMessage(""); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerCommand(PlayerCommandPreprocessEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { int timeToTalk = plugin.pm.getTimeToTalkOrCmd(e.getPlayer()); if (timeToTalk <= 0) { plugin.pm.registerChatOrCommand(e.getPlayer()); } else { e.getPlayer().sendMessage(plugin.prefix + ChatColor.RED + "Debes esperar " + timeToTalk + " segundos."); e.setCancelled(true); } } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerChat(AsyncPlayerChatEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { int timeToTalk = plugin.pm.getTimeToTalkOrCmd(e.getPlayer()); if (timeToTalk <= 0) { plugin.pm.registerChatOrCommand(e.getPlayer()); } else { e.getPlayer().sendMessage(plugin.prefix + ChatColor.RED + "Debes esperar " + timeToTalk + " segundos."); e.setCancelled(true); } } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onInventoryInteract(InventoryInteractEvent e) { Player player = (Player) e.getWhoClicked(); if (plugin.pm.isGhost(player)) { e.setCancelled(true); player.closeInventory(); } } @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onPlayerInteract(PlayerInteractEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { e.setCancelled(true); if (e.getItem() == null) { return; } if (e.getAction().equals(Action.LEFT_CLICK_AIR) || e.getAction().equals(Action.LEFT_CLICK_BLOCK) || e.getAction().equals(Action.RIGHT_CLICK_AIR) || e.getAction().equals(Action.RIGHT_CLICK_BLOCK)) { if (e.getItem().getType() == Material.ENDER_PEARL) { String targetName = e.getItem().getItemMeta().getDisplayName(); for (Player target : plugin.getServer().getOnlinePlayers()) { if (target.getName().equals(targetName)) { e.getPlayer().teleport(target); e.getPlayer().sendMessage(plugin.prefix + "Has sido teleportado a " + ChatColor.GOLD + targetName); break; } } } } } } @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onPlayerDrop(PlayerDropItemEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onEntityDamageByEntity(EntityDamageByEntityEvent e) { if (e.getDamager() instanceof Player) { if (plugin.pm.isGhost((Player) e.getDamager())) { e.setCancelled(true); return; } } if (e.getEntity() instanceof Player) { if (plugin.pm.isGhost((Player) e.getEntity())) { e.setCancelled(true); } } } @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onPlayerFish(PlayerFishEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = false, priority = EventPriority.LOWEST) public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onInventoryClick(InventoryClickEvent e) { Player player = (Player) e.getWhoClicked(); if (plugin.pm.isGhost(player)) { if (e.getCurrentItem() == null) { return; } if (e.getCurrentItem().getType() == Material.ENDER_PEARL) { String targetName = e.getCurrentItem().getItemMeta().getDisplayName(); for (Player target : plugin.getServer().getOnlinePlayers()) { if (target.getName().equals(targetName)) { player.teleport(target); player.sendMessage(plugin.prefix + "Has sido teleportado a " + ChatColor.GOLD + targetName); e.setCancelled(true); player.closeInventory(); break; } } } } } /* @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerTeleport(PlayerTeleportEvent e) { } */ @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerQuit(PlayerQuitEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { e.setQuitMessage(""); } else { plugin.pm.removePlayer(e.getPlayer()); e.setQuitMessage(ChatColor.GOLD + e.getPlayer().getName() + ChatColor.YELLOW + " se ha ido."); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onJoinEvent(PlayerJoinEvent e) { if (plugin.pm.isGhost(e.getPlayer())) { e.setJoinMessage(""); plugin.pm.setSpectator(e.getPlayer()); } else { plugin.pm.setPlayer(e.getPlayer()); e.setJoinMessage(plugin.prefix + "Ha llegado a la partida el jugador " + ChatColor.GOLD + e.getPlayer().getName()); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onBlockPlaceEvent(BlockPlaceEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onBlockBreakEvent(BlockBreakEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onPlayerPickupItem(PlayerPickupItemEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onEntityTarget(EntityTargetEvent e) { if (e.getTarget() instanceof Player) { if (plugin.pm.isGhost((Player) e.getTarget())) { e.setCancelled(true); } } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onBlockDamage(BlockDamageEvent e) { if (plugin.pm.isGhost((Player) e.getPlayer())) { e.setCancelled(true); } } @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) public void onEntityDamage(EntityDamageEvent e) { if (e.getEntity() instanceof Player) { if (plugin.pm.isGhost((Player) e.getEntity())) { e.setCancelled(true); } } } @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST) public void onFoodLevelChange(FoodLevelChangeEvent e) { if (plugin.pm.isGhost((Player) e.getEntity())) { e.setCancelled(true); } } } public EventManager(Main plugin) { this.plugin = plugin; gameEvents = new GameListeners(); } public void registerGameEvents() { plugin.getServer().getPluginManager().registerEvents(gameEvents, plugin); } public void unregisterGameEvents() { HandlerList.unregisterAll(gameEvents); } }