package org.arkham.cs.events;
import java.util.HashMap;
import net.minecraft.server.v1_7_R4.Packet;
import net.minecraft.server.v1_7_R4.PacketPlayOutWorldEvent;
import org.arkham.cs.CosmeticSuite;
import org.arkham.cs.cosmetics.BlockTrail;
import org.arkham.cs.cosmetics.TrailingBlock;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.block.BlockFace;
import org.bukkit.block.Chest;
import org.bukkit.block.Furnace;
import org.bukkit.craftbukkit.v1_7_R4.CraftServer;
import org.bukkit.craftbukkit.v1_7_R4.CraftWorld;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.server.PluginDisableEvent;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable;
public class MoveListener implements Listener {
private HashMap<Location, Material> blocks = new HashMap<>();
public MoveListener(){
CosmeticSuite cs = CosmeticSuite.getInstance();
cs.getServer().getPluginManager().registerEvents(this, cs);
}
@SuppressWarnings("deprecation")
@EventHandler
public void onMove(PlayerMoveEvent event){
if(event.getTo().getBlockX() == event.getFrom().getBlockX() && event.getTo().getBlockZ() == event.getFrom().getBlockZ()){
return;
}
Player player = event.getPlayer();
final Location loc = player.getLocation().clone();
if(player.isFlying()){
TrailingBlock tb = TrailingBlock.get(player);
if(tb == null){
return;
}
tb.run(player);
return;
}
BlockTrail cb = BlockTrail.get(player);
if(cb == null){
return;
}
if(loc.getBlock().getRelative(BlockFace.DOWN).getType() == Material.AIR){
return;
}
final Block below = loc.getBlock().getRelative(BlockFace.DOWN);
if(below.getState() instanceof Chest){
return;
}
if(below.getState() instanceof Furnace){
return;
}
if(blocks.containsKey(below.getLocation())){
return;
}
if(below.getType() == Material.WATER || below.getType() == Material.LAVA || below.getType() == Material.STATIONARY_LAVA || below.getType() == Material.STATIONARY_WATER){
return;
}
blocks.put(below.getLocation(), below.getType());
final Material bellow_type = below.getType();
below.setMetadata("spawned", new FixedMetadataValue(CosmeticSuite.getInstance(), ""));
below.setType(cb.getDisplay().getType());
below.setData(cb.getDisplay().getData().getData());
play(below.getLocation(), below.getType());
new BukkitRunnable() {
@Override
public void run() {
Location l = loc.getBlock().getRelative(BlockFace.DOWN).getLocation();
l.getBlock().setType(bellow_type);
play(l, bellow_type);
below.removeMetadata("spawned", CosmeticSuite.getInstance());
blocks.remove(l);
}
}.runTaskLater(CosmeticSuite.getInstance(), 20L * 5);
}
@EventHandler
public void onBreak(BlockBreakEvent event){
Block block = event.getBlock();
if(block.hasMetadata("spawned")){
event.setCancelled(true);
}
}
@EventHandler
public void onExplode(EntityExplodeEvent event){
for(Block block : event.blockList()){
if(block.hasMetadata("spawned")){
event.blockList().remove(block);
}
}
}
public void play(final Location l, final Material m){
CosmeticSuite.getInstance().getServer().getScheduler().runTaskAsynchronously(CosmeticSuite.getInstance(), new Runnable(){
@SuppressWarnings("deprecation")
@Override
public void run(){
int particle_id = m.getId();
Packet particles = new PacketPlayOutWorldEvent(2001, Math.round(l.getBlockX()), Math.round(l.getBlockY()), Math.round(l.getBlockZ()), particle_id, false);
((CraftServer) CosmeticSuite.getInstance().getServer()).getServer().getPlayerList().sendPacketNearby(l.getBlockX(), l.getBlockY(), l.getBlockZ(), 16, ((CraftWorld) l.getWorld()).getHandle().dimension, particles);
}
});
}
@EventHandler
public void onShutDown(PluginDisableEvent event){
Plugin plugin = event.getPlugin();
if(!CosmeticSuite.getInstance().equals(plugin)){
return;
}
for(Location loc : blocks.keySet()){
Material type = blocks.get(loc);
loc.getBlock().setType(type);
loc.getBlock().removeMetadata("spawned", CosmeticSuite.getInstance());
}
blocks.clear();
}
}