package be.isach.ultracosmetics.listeners;
import be.isach.ultracosmetics.UltraCosmetics;
import be.isach.ultracosmetics.config.MessageManager;
import be.isach.ultracosmetics.config.SettingsManager;
import be.isach.ultracosmetics.cosmetics.suits.ArmorSlot;
import be.isach.ultracosmetics.player.UltraPlayer;
import be.isach.ultracosmetics.run.FallDamageManager;
import be.isach.ultracosmetics.util.ItemFactory;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
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.EntityDamageEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryDragEvent;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.event.player.PlayerDropItemEvent;
import org.bukkit.event.player.PlayerInteractAtEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerPickupItemEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerRespawnEvent;
import org.bukkit.inventory.ItemStack;
import java.util.Arrays;
import java.util.List;
/**
* Player listeners.
*
* @author iSach
* @since 08-03-2015
*/
public class PlayerListener implements Listener {
private UltraCosmetics ultraCosmetics;
public PlayerListener(UltraCosmetics ultraCosmetics) {
this.ultraCosmetics = ultraCosmetics;
}
@EventHandler(priority = EventPriority.LOWEST)
public void onJoin(final PlayerJoinEvent event) {
Bukkit.getScheduler().runTaskAsynchronously(ultraCosmetics, () -> {
ultraCosmetics.getPlayerManager().create(event.getPlayer());
if (SettingsManager.getConfig().getBoolean("Menu-Item.Give-On-Join") && event.getPlayer().hasPermission("ultracosmetics.receivechest") && SettingsManager.getConfig().getStringList("Enabled-Worlds").contains(event.getPlayer().getWorld().getName())) {
Bukkit.getScheduler().runTaskLater(ultraCosmetics, () -> {
UltraPlayer cp = ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer());
if (cp != null && event.getPlayer() != null)
cp.giveMenuItem();
}, 5);
}
if (ultraCosmetics.getUpdateChecker() != null && ultraCosmetics.getUpdateChecker().isOutdated())
if (event.getPlayer().isOp())
event.getPlayer().sendMessage(ChatColor.BOLD + "" + ChatColor.ITALIC + "UltraCosmetics > " + ChatColor.RED + "" + ChatColor.BOLD + "An update is available: " + ultraCosmetics.getUpdateChecker().getLastVersion());
});
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onWorldChange(final PlayerChangedWorldEvent event) {
Bukkit.getScheduler().runTaskAsynchronously(ultraCosmetics, () -> {
if (SettingsManager.getConfig().getBoolean("Menu-Item.Give-On-Join") && event.getPlayer().hasPermission("ultracosmetics.receivechest") && SettingsManager.getConfig().getStringList("Enabled-Worlds").contains(event.getPlayer().getWorld().getName())) {
Bukkit.getScheduler().runTaskLater(ultraCosmetics, () -> ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer()).giveMenuItem(), 5);
}
});
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onDrop(PlayerDropItemEvent event) {
if (event.getItemDrop().getItemStack().hasItemMeta()
&& event.getItemDrop().getItemStack().getItemMeta().hasDisplayName()
&& event.getItemDrop().getItemStack().getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.setCancelled(true);
event.getItemDrop().remove();
ItemStack chest = event.getPlayer().getItemInHand().clone();
chest.setAmount(1);
event.getPlayer().setItemInHand(chest);
event.getPlayer().updateInventory();
}
}
@EventHandler
public void onInteract(final PlayerInteractEvent event) {
UltraPlayer ultraPlayer = ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer());
if (ultraPlayer.getCurrentTreasureChest() != null) {
event.setCancelled(true);
return;
}
if (event.getItem() != null
&& event.getItem().hasItemMeta()
&& event.getItem().getItemMeta().hasDisplayName()
&& event.getItem().getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.setCancelled(true);
ultraCosmetics.getMenus().getMainMenu().open(ultraPlayer);
}
}
/**
* Cancel players from removing, picking the item in their inventory.
*
* @param event
*/
@EventHandler(priority = EventPriority.HIGHEST)
public void cancelMove(InventoryClickEvent event) {
Player player = (Player) event.getWhoClicked();
if ((SettingsManager.getConfig().getStringList("Enabled-Worlds")).contains(player.getWorld().getName())) {
if ((event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR)
&& (event.getCursor() == null || event.getCursor().getType() == Material.AIR)) {
event.setCancelled(true);
player.updateInventory();
return;
}
if (event.getCurrentItem() != null
&& event.getCurrentItem().hasItemMeta()
&& event.getCurrentItem().getItemMeta().hasDisplayName()
&& event.getCurrentItem().getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.setCancelled(true);
player.updateInventory();
}
}
}
/**
* Cancel players from removing, picking the item in their inventory.
*
* @param event
*/
@EventHandler(priority = EventPriority.HIGHEST)
public void cancelMove(InventoryDragEvent event) {
for (ItemStack item : event.getNewItems().values()) {
if (item != null
&& item.hasItemMeta()
&& item.getItemMeta().hasDisplayName()
&& item.getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.setCancelled(true);
((Player) event.getWhoClicked()).updateInventory();
return;
}
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onRespawn(PlayerRespawnEvent event) {
if ((boolean) SettingsManager.getConfig().get("Menu-Item.Give-On-Respawn") && ((List<String>) SettingsManager.getConfig().get("Enabled-Worlds")).contains(event.getPlayer().getWorld().getName())) {
int slot = SettingsManager.getConfig().getInt("Menu-Item.Slot");
if (event.getPlayer().getInventory().getItem(slot) != null) {
event.getPlayer().getWorld().dropItemNaturally(event.getPlayer().getLocation(), event.getPlayer().getInventory().getItem(slot));
event.getPlayer().getInventory().remove(slot);
}
String name = ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname")));
Material material = Material.valueOf((String) SettingsManager.getConfig().get("Menu-Item.Type"));
byte data = Byte.valueOf(String.valueOf(SettingsManager.getConfig().get("Menu-Item.Data")));
event.getPlayer().getInventory().setItem(slot, ItemFactory.create(material, data, name));
}
}
@EventHandler(priority = EventPriority.LOWEST)
public void onQuit(PlayerQuitEvent event) {
if (ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer()).getCurrentTreasureChest() != null) {
ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer()).getCurrentTreasureChest().forceOpen(0);
}
ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer()).clear();
ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer()).removeMenuItem();
ultraCosmetics.getPlayerManager().remove(event.getPlayer());
}
@EventHandler(priority = EventPriority.LOWEST)
public void onDeath(PlayerDeathEvent event) {
int slot = SettingsManager.getConfig().getInt("Menu-Item.Slot");
if (event.getEntity().getInventory().getItem(slot) != null
&& event.getEntity().getInventory().getItem(slot).hasItemMeta()
&& event.getEntity().getInventory().getItem(slot).getItemMeta().hasDisplayName()
&& event.getEntity().getInventory().getItem(slot).getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.getDrops().remove(event.getEntity().getInventory().getItem(slot));
event.getEntity().getInventory().setItem(slot, null);
}
UltraPlayer ultraPlayer = ultraCosmetics.getPlayerManager().getUltraPlayer(event.getEntity());
if (ultraPlayer.getCurrentGadget() != null)
event.getDrops().remove(event.getEntity().getInventory().getItem((Integer) SettingsManager.getConfig().get("Gadget-Slot")));
if (ultraPlayer.getCurrentHat() != null)
event.getDrops().remove(ultraPlayer.getCurrentHat().getItemStack());
Arrays.asList(ArmorSlot.values()).forEach(armorSlot -> {
if (ultraPlayer.getSuit(armorSlot) != null) {
event.getDrops().remove(ultraPlayer.getSuit(armorSlot).getItemStack());
}
});
if (ultraPlayer.getCurrentEmote() != null)
event.getDrops().remove(ultraPlayer.getCurrentEmote().getItemStack());
ultraPlayer.clear();
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onEntityDamage(EntityDamageEvent event) {
if (event.getCause() == EntityDamageEvent.DamageCause.FALL
&& FallDamageManager.shouldBeProtected(event.getEntity())) {
event.setCancelled(true);
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerPickUpItem(PlayerPickupItemEvent event) {
if (event.getItem().getItemStack() != null
&& event.getItem().getItemStack().hasItemMeta()
&& event.getItem().getItemStack().getItemMeta().hasDisplayName()
&& event.getItem().getItemStack().getItemMeta().getDisplayName().equals(ChatColor.translateAlternateColorCodes('&', String.valueOf(SettingsManager.getConfig().get("Menu-Item.Displayname"))))) {
event.setCancelled(true);
event.getItem().remove();
}
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onPlayerInteractGhost(PlayerInteractAtEntityEvent event) {
if (event.getRightClicked() != null
&& event.getRightClicked().hasMetadata("C_AD_ArmorStand"))
event.setCancelled(true);
}
@EventHandler
public void onCommand(PlayerCommandPreprocessEvent event) {
if (SettingsManager.getConfig().getList("Disabled-Commands").contains(event.getMessage().split(" ")[0].replace("/", "").toLowerCase())){
UltraPlayer player = ultraCosmetics.getPlayerManager().getUltraPlayer(event.getPlayer());
if (player.getCurrentEmote() != null || player.getCurrentHat() != null || player.hasSuitOn()) {
event.setCancelled(true);
event.getPlayer().sendMessage(MessageManager.getMessage("Disabled-Command-Wearing-Message"));
} else if (player.getCurrentGadget() != null && player.getCurrentGadget().getItemStack().equals(event.getPlayer().getItemInHand())) {
event.setCancelled(true);
event.getPlayer().sendMessage(MessageManager.getMessage("Disabled-Command-Holding-Message"));
}
}
}
}