package tv.mineinthebox.essentials.events.players;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.BlockState;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import tv.mineinthebox.essentials.xEssentials;
import tv.mineinthebox.essentials.interfaces.XPlayer;
public class TorchEvent implements Listener {
private final Map<String, LinkedList<BlockState>> list = new HashMap<String, LinkedList<BlockState>>();
private final xEssentials pl;
public TorchEvent(xEssentials pl) {
this.pl = pl;
}
@SuppressWarnings("deprecation")
@EventHandler
public void onTorchMove(PlayerMoveEvent e) {
if(pl.getManagers().getPlayerManager().isOnline(e.getPlayer().getName())) {
XPlayer xp = pl.getManagers().getPlayerManager().getPlayer(e.getPlayer().getName());
if(xp.isTorch()) {
if(e.getFrom().distanceSquared(e.getTo()) > 0) {
if(e.getPlayer().getItemInHand().getType() == Material.TORCH) {
Block block = e.getPlayer().getLocation().getBlock().getRelative(BlockFace.DOWN);
if(block.getType() == Material.AIR || block.getType() == Material.WATER || block.getType() == Material.STATIONARY_WATER || block.getType() == Material.LAVA || block.getType() == Material.STATIONARY_LAVA || block.getType() == Material.LONG_GRASS || block.getType() == Material.RED_ROSE || (block.getType().isTransparent() && !block.getType().isSolid())) {
return;
}
e.getPlayer().sendBlockChange(block.getLocation(), Material.GLOWSTONE, block.getData());
getTrailList(e.getPlayer()).add(block.getState());
removeGlow(e.getPlayer());
}
}
}
}
}
@EventHandler
public void onTorchQuit(PlayerQuitEvent e) {
if(list.containsKey(e.getPlayer().getName())) {
List<BlockState> alist = list.get(e.getPlayer().getName());
alist.clear();
list.remove(e.getPlayer().getName());
}
}
@EventHandler
public void onTorchQuit(PlayerKickEvent e) {
if(list.containsKey(e.getPlayer().getName())) {
List<BlockState> alist = list.get(e.getPlayer().getName());
alist.clear();
list.remove(e.getPlayer().getName());
}
}
private LinkedList<BlockState> getTrailList(Player p) {
LinkedList<BlockState> blocklist = list.get(p.getName());
if(blocklist == null) {
blocklist = new LinkedList<BlockState>();
list.put(p.getName(), blocklist);
}
return blocklist;
}
private void removeGlow(Player p) {
LinkedList<BlockState> blocklist = list.get(p.getName());
if(blocklist.size() > 10) {
BlockState old = blocklist.removeFirst();
old.update();
}
}
}