/*
* 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.liderswag;
import com.sk89q.worldedit.bukkit.selections.CuboidSelection;
import java.util.TreeMap;
import java.util.TreeSet;
import org.bukkit.Material;
import org.bukkit.block.Skull;
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.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.block.SignChangeEvent;
import org.bukkit.event.entity.CreatureSpawnEvent;
import org.bukkit.event.entity.EntityDamageByBlockEvent;
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.InventoryOpenEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.event.player.PlayerTeleportEvent;
import org.bukkit.event.weather.WeatherChangeEvent;
/**
*
* @author Diego D'Onofrio <ddonofrio@member.fsf.org>
*/
public class EventManager {
public enum setupEvents {
HEADS, SIGNS
}
private class SetupListener implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onBlockPlace(BlockPlaceEvent e) {
setupEvents setupEvent = setupPlayers.get(e.getPlayer());
switch (setupEvent) {
case HEADS:
if (e.getBlock().getType() == Material.SKULL) {
//Skull skull = new CraftSkull(e.getBlock());
Skull skull = (Skull) e.getBlock().getState();
plugin.am.addScoreHead(skull,
setupPlayersArena.get(e.getPlayer()));
e.getPlayer().sendMessage(plugin.lm.getText("score-heads-added"));
e.getPlayer().sendMessage(plugin.lm.getText("listen-setup-finish"));
}
break;
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onBlockBreak(BlockBreakEvent e) {
setupEvents setupEvent = setupPlayers.get(e.getPlayer());
switch (setupEvent) {
case HEADS:
if (e.getBlock().getType() == Material.SKULL) {
//Skull skull = new CraftSkull(e.getBlock());
Skull skull = (Skull) e.getBlock().getState();
if (plugin.am.delScoreHead(skull,
setupPlayersArena.get(e.getPlayer()))) {
e.getPlayer().sendMessage(plugin.lm.getText("score-heads-removed"));
e.getPlayer().sendMessage(plugin.lm.getText("listen-setup-finish"));
} else {
e.getPlayer().sendMessage(plugin.lm.getText("score-heads-desordered-del"));
e.setCancelled(true);
}
}
break;
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void onPlayerQuit(PlayerQuitEvent e) {
removeSetUpListerners(e.getPlayer());
}
}
private class GameEvents implements Listener {
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockBreak(BlockBreakEvent e) {
for (CuboidSelection area : protectedAreas) {
if (area.contains(e.getBlock().getLocation())) {
e.setCancelled(true);
break;
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockPlace(BlockPlaceEvent e) {
for (CuboidSelection area : protectedAreas) {
if (area.contains(e.getBlock().getLocation())) {
e.setCancelled(true);
break;
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onMobSpawn(CreatureSpawnEvent e) {
if (e.getSpawnReason() == CreatureSpawnEvent.SpawnReason.NATURAL
|| e.getSpawnReason() == CreatureSpawnEvent.SpawnReason.DEFAULT) {
for (CuboidSelection area : protectedAreas) {
if (area.contains(e.getLocation())) {
e.setCancelled(true);
break;
}
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onWeatherChange(WeatherChangeEvent e) {
if (e.toWeatherState()) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockIgnite(BlockIgniteEvent e) {
for (CuboidSelection area : protectedAreas) {
if (area.contains(e.getBlock().getLocation())) {
e.setCancelled(true);
break;
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onSignChange(SignChangeEvent e) {
plugin.sgm.checkUpdateJoin(e);
}
@EventHandler(ignoreCancelled = false, priority = EventPriority.HIGHEST)
public void onPlayerInteract(PlayerInteractEvent e) {
plugin.sgm.checkJoin(e);
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerPickupItem(PlayerPickupItemEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityTarget(EntityTargetEvent e) {
if (e.getTarget() instanceof Player) {
if (plugin.pm.isSpectator((Player) e.getTarget())) {
e.setCancelled(true);
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockDamage(BlockDamageEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent e) {
if (e.getEntity() instanceof Player) {
if (plugin.pm.isSpectator((Player) e.getEntity())) {
e.setCancelled(true);
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageByEntityEvent e) {
if (e.getDamager() instanceof Player) {
Player player = (Player) e.getDamager();
if (plugin.pm.isSpectator(player)) {
e.setCancelled(true);
return;
}
}
if (e.getEntity() instanceof Player) {
if (plugin.pm.isSpectator((Player) e.getEntity())) {
e.setCancelled(true);
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageByBlockEvent e) {
if (e.getEntity() instanceof Player) {
if (plugin.pm.isSpectator((Player) e.getEntity())) {
e.setCancelled(true);
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onFoodLevelChange(FoodLevelChangeEvent e) {
if (plugin.pm.isSpectator((Player) e.getEntity())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerDrop(PlayerDropItemEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerInteractEntity(PlayerInteractEntityEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onInventoryClick(InventoryClickEvent e) {
if (plugin.pm.isSpectator((Player) e.getWhoClicked())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onInventoryOpen(InventoryOpenEvent e) {
if (plugin.pm.isSpectator((Player) e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerTeleport(PlayerTeleportEvent e) {
plugin.gm.controlPlayerMovement(e);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerMove(PlayerMoveEvent e) {
plugin.gm.controlPlayerMovement(e);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockBreakEvent(BlockBreakEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onBlockPlaceEvent(BlockPlaceEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
e.setCancelled(true);
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerQuit(PlayerQuitEvent e) {
plugin.gm.removePlayer(e.getPlayer());
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onRespawn(PlayerRespawnEvent e) {
if (plugin.pm.isSpectator(e.getPlayer())) {
plugin.gm.teleportToSpectator(e.getPlayer());
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onDeath(PlayerDeathEvent e) {
if (plugin.pm.isInGame(e.getEntity())) {
Player player = (Player) e.getEntity();
if (plugin.pm.isInGame(player)) {
plugin.gm.gameOver(player);
plugin.gm.teleportToSpectator(player);
e.setDeathMessage("");
e.getDrops().clear();
}
}
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerChat(AsyncPlayerChatEvent e) {
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.HIGHEST)
public void onPlayerChat(FoodLevelChangeEvent e) {
if (e.getEntity() instanceof Player) {
Player player = (Player) e.getEntity();
if (plugin.pm.isInGame(player) || plugin.pm.isSpectator(player)) {
e.setCancelled(true);
}
}
}
}
private final Main plugin;
private final SetupListener setupListener;
private final GameEvents gameEvents;
private final TreeMap<Player, setupEvents> setupPlayers;
private final TreeMap<Player, String> setupPlayersArena;
private final TreeSet<CuboidSelection> protectedAreas;
public EventManager(Main plugin) {
this.plugin = plugin;
setupListener = new SetupListener();
gameEvents = new GameEvents();
setupPlayers = new TreeMap<>(new Tools.PlayerComparator());
setupPlayersArena = new TreeMap<>(new Tools.PlayerComparator());
protectedAreas = new TreeSet<>(new Tools.SelectionComparator());
plugin.getServer().getPluginManager().registerEvents(gameEvents, plugin);
}
public void addSetUpListerners(Player player, setupEvents event, String arenaName) {
if (setupPlayers.isEmpty()) {
plugin.getServer().getPluginManager().registerEvents(setupListener, plugin);
}
setupPlayers.put(player, event);
setupPlayersArena.put(player, arenaName);
}
public void removeSetUpListerners(Player player) {
if (setupPlayers.remove(player) != null) {
setupPlayersArena.remove(player);
if (setupPlayers.isEmpty()) {
HandlerList.unregisterAll(setupListener);
}
}
}
public void addProtectedArea(CuboidSelection area) {
protectedAreas.add(area);
}
public void removeProtectedArea(CuboidSelection area) {
protectedAreas.remove(area);
}
}