package com.nisovin.magicspells.spells.buff;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.material.MaterialData;
import com.nisovin.magicspells.materials.MagicBlockMaterial;
import com.nisovin.magicspells.materials.MagicMaterial;
import com.nisovin.magicspells.spells.BuffSpell;
import com.nisovin.magicspells.util.MagicConfig;
import com.nisovin.magicspells.util.Util;
public class LightwalkSpell extends BuffSpell {
private HashMap<String, Block> lightwalkers;
private MagicMaterial mat = new MagicBlockMaterial(new MaterialData(Material.GLOWSTONE));
public LightwalkSpell(MagicConfig config, String spellName) {
super(config, spellName);
lightwalkers = new HashMap<String, Block>();
}
@Override
public boolean castBuff(Player player, float power, String[] args) {
lightwalkers.put(player.getName(), null);
return true;
}
@EventHandler(priority=EventPriority.MONITOR)
public void onPlayerMove(PlayerMoveEvent event) {
if (lightwalkers.containsKey(event.getPlayer().getName())) {
Player p = event.getPlayer();
Block oldBlock = lightwalkers.get(p.getName());
Block newBlock = p.getLocation().getBlock().getRelative(BlockFace.DOWN);
if ((oldBlock == null || !oldBlock.equals(newBlock)) && allowedType(newBlock.getType()) && newBlock.getType() != Material.AIR) {
if (isExpired(p)) {
turnOff(p);
} else {
if (oldBlock != null) {
Util.restoreFakeBlockChange(p, oldBlock);
}
Util.sendFakeBlockChange(p, newBlock, mat);
lightwalkers.put(p.getName(), newBlock);
addUse(p);
chargeUseCost(p);
}
}
}
}
private boolean allowedType(Material mat) {
return mat == Material.DIRT ||
mat == Material.GRASS ||
mat == Material.GRAVEL ||
mat == Material.STONE ||
mat == Material.COBBLESTONE ||
mat == Material.WOOD ||
mat == Material.LOG ||
mat == Material.NETHERRACK ||
mat == Material.SOUL_SAND ||
mat == Material.SAND ||
mat == Material.SANDSTONE ||
mat == Material.GLASS ||
mat == Material.WOOL ||
mat == Material.DOUBLE_STEP ||
mat == Material.BRICK ||
mat == Material.OBSIDIAN;
}
@Override
public void turnOffBuff(Player player) {
Block b = lightwalkers.remove(player.getName());
if (b != null) {
Util.restoreFakeBlockChange(player, b);
}
}
@Override
protected void turnOff() {
for (String s : lightwalkers.keySet()) {
Player p = Bukkit.getServer().getPlayer(s);
if (p != null) {
Block b = lightwalkers.get(s);
if (b != null) {
Util.restoreFakeBlockChange(p, b);
}
}
}
lightwalkers.clear();
}
@Override
public boolean isActive(Player player) {
return lightwalkers.containsKey(player.getName());
}
}