package com.nisovin.magicspells.spells.buff;
import java.util.HashMap;
import java.util.HashSet;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.inventory.ItemStack;
import com.nisovin.magicspells.spells.BuffSpell;
import com.nisovin.magicspells.util.MagicConfig;
public class GillsSpell extends BuffSpell {
private boolean glassHeadEffect;
private HashSet<String> fishes;
private HashMap<Player,ItemStack> helmets;
public GillsSpell(MagicConfig config, String spellName) {
super(config, spellName);
glassHeadEffect = getConfigBoolean("glass-head-effect", true);
fishes = new HashSet<String>();
if (glassHeadEffect) {
helmets = new HashMap<Player,ItemStack>();
}
}
@Override
public boolean castBuff(Player player, float power, String[] args) {
fishes.add(player.getName());
if (glassHeadEffect) {
ItemStack helmet = player.getInventory().getHelmet();
if (helmet != null && helmet.getType() != Material.AIR) {
helmets.put(player, helmet);
}
player.getInventory().setHelmet(new ItemStack(Material.GLASS, 1));
}
return true;
}
@EventHandler
public void onEntityDamage(EntityDamageEvent event) {
if (event.isCancelled()) return;
if (!event.isCancelled() && event.getEntity() instanceof Player && event.getCause() == DamageCause.DROWNING) {
Player player = (Player)event.getEntity();
if (fishes.contains(player.getName())) {
if (isExpired(player)) {
turnOff(player);
} else {
addUse(player);
boolean ok = chargeUseCost(player);
if (ok) {
event.setCancelled(true);
player.setRemainingAir(player.getMaximumAir());
}
}
}
}
}
@Override
public void turnOffBuff(Player player) {
if (fishes.remove(player.getName())) {
if (glassHeadEffect) {
if (helmets.containsKey(player)) {
if (player.isOnline()) player.getInventory().setHelmet(helmets.get(player));
helmets.remove(player);
} else if (player.getInventory().getHelmet() != null && player.getInventory().getHelmet().getType() == Material.GLASS) {
if (player.isOnline()) player.getInventory().setHelmet(null);
}
}
}
}
@Override
protected void turnOff() {
for (String name : fishes) {
if (glassHeadEffect) {
Player player = Bukkit.getPlayerExact(name);
if (player != null && player.isOnline()) {
if (helmets.containsKey(player)) {
player.getInventory().setHelmet(helmets.get(player));
} else if (player.getInventory().getHelmet() != null && player.getInventory().getHelmet().getType() == Material.GLASS) {
player.getInventory().setHelmet(null);
}
}
}
}
if (helmets != null) {
helmets.clear();
}
fishes.clear();
}
@Override
public boolean isActive(Player player) {
return fishes.contains(player.getName());
}
}