package com.nisovin.magicspells.spells.buff; import java.util.HashMap; import org.bukkit.Bukkit; import org.bukkit.entity.Creature; 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.EntityTargetEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import com.nisovin.magicspells.MagicSpells; import com.nisovin.magicspells.events.SpellCastEvent; import com.nisovin.magicspells.spells.BuffSpell; import com.nisovin.magicspells.util.MagicConfig; public class InvisibilitySpell extends BuffSpell { private boolean preventPickups; private boolean cancelOnSpellCast; private HashMap<String,CostCharger> invisibles = new HashMap<String, InvisibilitySpell.CostCharger>(); public InvisibilitySpell(MagicConfig config, String spellName) { super(config, spellName); preventPickups = getConfigBoolean("prevent-pickups", true); cancelOnSpellCast = getConfigBoolean("cancel-on-spell-cast", false); } @Override public void initialize() { super.initialize(); if (cancelOnSpellCast) { registerEvents(new SpellCastListener()); } } @Override public boolean castBuff(Player player, float power, String[] args) { makeInvisible(player); invisibles.put(player.getName(), new CostCharger(player)); return true; } @Override public boolean recastBuff(Player player, float power, String[] args) { makeInvisible(player); if (invisibles.containsKey(player.getName())) { invisibles.put(player.getName(), new CostCharger(player)); } return true; } private void makeInvisible(Player player) { // make player invisible for (Player p : Bukkit.getOnlinePlayers()) { p.hidePlayer(player); } // detarget monsters Creature creature; for (Entity e : player.getNearbyEntities(30, 30, 30)) { if (e instanceof Creature) { creature = (Creature)e; if (creature.getTarget() != null && creature.getTarget().equals(player)) { creature.setTarget(null); } } } } @EventHandler public void onPlayerItemPickup(PlayerPickupItemEvent event) { if (preventPickups && invisibles.containsKey(event.getPlayer().getName())) { event.setCancelled(true); } } @EventHandler public void onEntityTarget(EntityTargetEvent event) { if (!event.isCancelled() && event.getTarget() instanceof Player) { if (invisibles.containsKey(((Player)event.getTarget()).getName())) { event.setCancelled(true); } } } @EventHandler(priority=EventPriority.MONITOR) public void onPlayerJoin(PlayerJoinEvent event) { Player player = event.getPlayer(); for (String name : invisibles.keySet()) { Player p = Bukkit.getPlayerExact(name); if (p != null && !name.equals(player.getName())) { player.hidePlayer(p); } } if (invisibles.containsKey(player.getName())) { for (Player p : Bukkit.getOnlinePlayers()) { p.hidePlayer(player); } } } @Override public void turnOffBuff(Player player) { // stop charge ticker CostCharger c = invisibles.remove(player.getName()); if (c != null) { c.stop(); // force visible for (Player p : Bukkit.getOnlinePlayers()) { p.showPlayer(player); } } } @Override protected void turnOff() { for (CostCharger c : invisibles.values()) { c.stop(); } invisibles.clear(); } public class SpellCastListener implements Listener { @EventHandler(priority=EventPriority.MONITOR, ignoreCancelled=true) public void onSpellCast(SpellCastEvent event) { if (isActive(event.getCaster()) && !event.getSpell().getInternalName().equals(internalName)) { turnOff(event.getCaster()); } } } private class CostCharger implements Runnable { int taskId = -1; Player player; public CostCharger(Player player) { this.player = player; if (useCostInterval > 0) { taskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(MagicSpells.plugin, this, 20, 20); } } public void run() { addUseAndChargeCost(player); } public void stop() { if (taskId != -1) { Bukkit.getScheduler().cancelTask(taskId); } } } @Override public boolean isActive(Player player) { return invisibles.containsKey(player.getName()); } }