package tv.mineinthebox.essentials.events.pvp; import java.util.HashMap; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Skeleton; 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.EntityDeathEvent; import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; import tv.mineinthebox.essentials.xEssentials; import tv.mineinthebox.essentials.interfaces.XOfflinePlayer; import tv.mineinthebox.essentials.interfaces.XPlayer; public class NpcReplacePlayerEvent implements Listener { private final HashMap<String, String> essentialsPlayers = new HashMap<String, String>(); private final HashMap<UUID, ItemStack[]> npcs = new HashMap<UUID, ItemStack[]>(); private final xEssentials pl; public NpcReplacePlayerEvent(xEssentials pl) { this.pl = pl; } @EventHandler public void onDamage(EntityDamageByEntityEvent e) { if(e.getEntity() instanceof Player) { if(e.getDamager() instanceof Player) { Player p = (Player) e.getEntity(); Player damage = (Player) e.getDamager(); essentialsPlayers.put(damage.getName(), p.getName()); } } } @EventHandler public void onNameTag(PlayerInteractEntityEvent e) { if(e.getRightClicked() instanceof Skeleton) { Skeleton skel = (Skeleton) e.getRightClicked(); if(skel.isCustomNameVisible()) { if(npcs.containsKey(skel.getUniqueId())) { e.setCancelled(true); } } } } @EventHandler public void onQuit(PlayerQuitEvent e) { if(essentialsPlayers.containsKey(e.getPlayer().getName())) { XPlayer xp = pl.getManagers().getPlayerManager().getPlayer(e.getPlayer().getName()); if(xp.isVanished()) { essentialsPlayers.remove(e.getPlayer().getName()); return; } ItemStack[] items = e.getPlayer().getInventory().getContents(); Skeleton skel = (Skeleton) e.getPlayer().getWorld().spawnEntity(e.getPlayer().getLocation(), EntityType.SKELETON); //lets pimp the skeleton a bit! turnSkelToNpc(skel, e.getPlayer().getName()); npcs.put(skel.getUniqueId(), items); essentialsPlayers.remove(e.getPlayer().getName()); NpcDespawn(skel); } } @EventHandler public void onTeleport(PlayerTeleportEvent e) { if(essentialsPlayers.containsKey(e.getPlayer().getName())) { XPlayer xp = pl.getManagers().getPlayerManager().getPlayer(e.getPlayer().getName()); if(xp.isVanished()) { return; } ItemStack[] items = e.getPlayer().getInventory().getContents(); Skeleton skel = (Skeleton) e.getPlayer().getWorld().spawnEntity(e.getPlayer().getLocation(), EntityType.SKELETON); //lets pimp the skeleton a bit! turnSkelToNpc(skel, e.getPlayer().getName()); npcs.put(skel.getUniqueId(), items); essentialsPlayers.remove(e.getPlayer().getName()); NpcDespawn(skel); } } @EventHandler public void onQuit(PlayerKickEvent e) { if(essentialsPlayers.containsKey(e.getPlayer().getName())) { XPlayer xp = pl.getManagers().getPlayerManager().getPlayer(e.getPlayer().getName()); if(xp.isVanished()) { essentialsPlayers.remove(e.getPlayer().getName()); return; } ItemStack[] items = e.getPlayer().getInventory().getContents(); Skeleton skel = (Skeleton) e.getPlayer().getWorld().spawnEntity(e.getPlayer().getLocation(), EntityType.SKELETON); //lets pimp the skeleton a bit! turnSkelToNpc(skel, e.getPlayer().getName()); npcs.put(skel.getUniqueId(), items); essentialsPlayers.remove(e.getPlayer().getName()); NpcDespawn(skel); } } @SuppressWarnings("deprecation") @EventHandler public void onNpcDeath(EntityDeathEvent e) { if(npcs.containsKey(e.getEntity().getUniqueId())) { e.getDrops().clear(); for(ItemStack stack : npcs.get(e.getEntity().getUniqueId())) { e.getDrops().add(stack); } String PlayerName = e.getEntity().getCustomName(); Player p = Bukkit.getPlayer(PlayerName); if(p instanceof Player) { p.getInventory().clear(); } else { XOfflinePlayer off = pl.getManagers().getPlayerManager().getOfflinePlayer(PlayerName); off.ClearInventoryOnRelog(); } } } private void NpcDespawn(final Entity entity) { Bukkit.getScheduler().scheduleSyncDelayedTask(pl, new Runnable() { @Override public void run() { if(npcs.containsKey(entity.getUniqueId())) { npcs.remove(entity.getUniqueId()); entity.remove(); } } }, 1000); } @EventHandler(priority = EventPriority.HIGH) public void onJoinNpc(PlayerJoinEvent e) { for(Entity entity : e.getPlayer().getNearbyEntities(16, 16, 16)) { if(entity instanceof Skeleton) { Skeleton skel = (Skeleton) entity; if(skel.isCustomNameVisible()) { if(skel.getCustomName().equalsIgnoreCase(e.getPlayer().getName())) { e.getPlayer().kickPlayer(ChatColor.GREEN + "[Combat log]" + ChatColor.GRAY + "\nyou are not allowed to join until the npc is dead."); e.setJoinMessage(""); return; } } } } XPlayer xp = pl.getManagers().getPlayerManager().getPlayer(e.getPlayer().getName()); if(xp.isInventoryClearanceOnRelog()) { xp.ClearInventoryOnRelog(); } } private void turnSkelToNpc(Skeleton skel, String player) { ItemStack head = new ItemStack(Material.SKULL_ITEM); head.setDurability((short)3); SkullMeta meta = (SkullMeta) head.getItemMeta(); meta.setOwner(player); head.setItemMeta(meta); head.setAmount(1); skel.getEquipment().setHelmet(head); skel.getEquipment().setHelmetDropChance(0); ItemStack chestplate = new ItemStack(Material.IRON_CHESTPLATE); chestplate.setAmount(1); skel.getEquipment().setChestplate(chestplate); skel.getEquipment().setChestplateDropChance(0); ItemStack leggings = new ItemStack(Material.IRON_LEGGINGS); leggings.setAmount(1); skel.getEquipment().setLeggings(leggings); skel.getEquipment().setLeggingsDropChance(0); ItemStack shoes = new ItemStack(Material.IRON_BOOTS); skel.getEquipment().setBoots(shoes); skel.getEquipment().setBootsDropChance(0); skel.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, Integer.MAX_VALUE, 30)); skel.addPotionEffect(new PotionEffect(PotionEffectType.JUMP, Integer.MAX_VALUE, 30)); skel.setCustomName(player); skel.setCustomNameVisible(true); } }