package com.nisovin.magicspells.spells.buff;
import java.util.HashMap;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import com.nisovin.magicspells.spells.BuffSpell;
import com.nisovin.magicspells.util.BlockPlatform;
import com.nisovin.magicspells.util.MagicConfig;
public class FrostwalkSpell extends BuffSpell {
private int size;
private boolean leaveFrozen;
private HashMap<String,BlockPlatform> frostwalkers;
public FrostwalkSpell(MagicConfig config, String spellName) {
super(config, spellName);
size = getConfigInt("size", 2);
leaveFrozen = getConfigBoolean("leave-frozen", false);
frostwalkers = new HashMap<String,BlockPlatform>();
}
@Override
public boolean castBuff(Player player, float power, String[] args) {
frostwalkers.put(player.getName(), new BlockPlatform(Material.ICE, Material.STATIONARY_WATER, player.getLocation().getBlock().getRelative(0,-1,0), size, !leaveFrozen, "square"));
return true;
}
@EventHandler(priority=EventPriority.MONITOR)
public void onPlayerMove(PlayerMoveEvent event) {
if (frostwalkers.containsKey(event.getPlayer().getName())) {
Player player = event.getPlayer();
if (isExpired(player)) {
turnOff(player);
} else {
Block block;
boolean teleportUp = false;
if (event.getTo().getY() > event.getFrom().getY() && event.getTo().getY() % 1 > .62 && event.getTo().getBlock().getType() == Material.STATIONARY_WATER && event.getTo().getBlock().getRelative(0,1,0).getType() == Material.AIR) {
block = event.getTo().getBlock();
teleportUp = true;
} else {
block = event.getTo().getBlock().getRelative(0,-1,0);
}
boolean moved = frostwalkers.get(player.getName()).movePlatform(block);
if (moved) {
addUse(player);
chargeUseCost(player);
if (teleportUp) {
Location loc = player.getLocation().clone();
loc.setY(event.getTo().getBlockY()+1);
player.teleport(loc);
}
}
}
}
}
@EventHandler
public void onBlockBreak(BlockBreakEvent event) {
if (event.isCancelled()) return;
if (frostwalkers.size() > 0 && event.getBlock().getType() == Material.ICE) {
for (BlockPlatform platform : frostwalkers.values()) {
if (platform.blockInPlatform(event.getBlock())) {
event.setCancelled(true);
break;
}
}
}
}
@Override
public void turnOffBuff(Player player) {
BlockPlatform platform = frostwalkers.get(player.getName());
if (platform != null) {
platform.destroyPlatform();
frostwalkers.remove(player.getName());
}
}
@Override
protected void turnOff() {
for (BlockPlatform platform : frostwalkers.values()) {
platform.destroyPlatform();
}
frostwalkers.clear();
}
@Override
public boolean isActive(Player player) {
return frostwalkers.containsKey(player.getName());
}
}