2011-06-02 11:43:25 +00:00
|
|
|
package com.earth2me.essentials;
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Set;
|
2011-08-27 18:39:54 +00:00
|
|
|
import java.util.logging.Level;
|
|
|
|
import java.util.logging.Logger;
|
2011-06-02 11:43:25 +00:00
|
|
|
import net.minecraft.server.ChunkPosition;
|
|
|
|
import net.minecraft.server.Packet60Explosion;
|
|
|
|
import org.bukkit.Location;
|
|
|
|
import org.bukkit.block.Block;
|
|
|
|
import org.bukkit.craftbukkit.CraftServer;
|
|
|
|
import org.bukkit.craftbukkit.CraftWorld;
|
|
|
|
import org.bukkit.entity.LivingEntity;
|
|
|
|
import org.bukkit.entity.Player;
|
|
|
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
|
|
|
import org.bukkit.event.entity.EntityListener;
|
|
|
|
|
|
|
|
|
|
|
|
public class TNTExplodeListener extends EntityListener implements Runnable
|
|
|
|
{
|
|
|
|
private final IEssentials ess;
|
|
|
|
private boolean enabled = false;
|
|
|
|
private int timer = -1;
|
|
|
|
|
|
|
|
public TNTExplodeListener(IEssentials ess)
|
|
|
|
{
|
|
|
|
this.ess = ess;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void enable()
|
|
|
|
{
|
|
|
|
if (!enabled)
|
|
|
|
{
|
|
|
|
enabled = true;
|
|
|
|
timer = ess.scheduleSyncDelayedTask(this, 1000);
|
|
|
|
return;
|
|
|
|
}
|
2011-10-25 21:18:28 +00:00
|
|
|
if (timer != -1)
|
|
|
|
{
|
2011-06-02 11:43:25 +00:00
|
|
|
ess.getScheduler().cancelTask(timer);
|
|
|
|
timer = ess.scheduleSyncDelayedTask(this, 1000);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void onEntityExplode(final EntityExplodeEvent event)
|
|
|
|
{
|
|
|
|
if (!enabled)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
if (event.getEntity() instanceof LivingEntity)
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
2011-10-25 21:18:28 +00:00
|
|
|
try
|
2011-06-02 11:43:25 +00:00
|
|
|
{
|
2011-10-25 21:18:28 +00:00
|
|
|
final Set<ChunkPosition> set = new HashSet<ChunkPosition>(event.blockList().size());
|
|
|
|
final Player[] players = ess.getServer().getOnlinePlayers();
|
|
|
|
final List<ChunkPosition> blocksUnderPlayers = new ArrayList<ChunkPosition>(players.length);
|
|
|
|
final Location loc = event.getLocation();
|
|
|
|
for (Player player : players)
|
2011-06-02 11:43:25 +00:00
|
|
|
{
|
2011-10-25 21:18:28 +00:00
|
|
|
if (player.getWorld().equals(loc.getWorld()))
|
|
|
|
{
|
|
|
|
blocksUnderPlayers.add(new ChunkPosition(player.getLocation().getBlockX(), player.getLocation().getBlockY() - 1, player.getLocation().getBlockZ()));
|
|
|
|
}
|
2011-06-02 11:43:25 +00:00
|
|
|
}
|
2011-10-25 21:18:28 +00:00
|
|
|
for (Block block : event.blockList())
|
2011-06-02 11:43:25 +00:00
|
|
|
{
|
2011-10-25 21:18:28 +00:00
|
|
|
final ChunkPosition cp = new ChunkPosition(block.getX(), block.getY(), block.getZ());
|
|
|
|
if (!blocksUnderPlayers.contains(cp))
|
|
|
|
{
|
|
|
|
set.add(cp);
|
|
|
|
}
|
2011-06-02 11:43:25 +00:00
|
|
|
}
|
2011-10-25 21:18:28 +00:00
|
|
|
((CraftServer)ess.getServer()).getHandle().sendPacketNearby(loc.getX(), loc.getY(), loc.getZ(), 64.0, ((CraftWorld)loc.getWorld()).getHandle().worldProvider.dimension, new Packet60Explosion(loc.getX(), loc.getY(), loc.getZ(), 3.0F, set));
|
2011-06-02 11:43:25 +00:00
|
|
|
}
|
2011-10-25 21:18:28 +00:00
|
|
|
catch (Throwable ex)
|
|
|
|
{
|
2011-08-27 18:39:54 +00:00
|
|
|
Logger.getLogger("Minecraft").log(Level.SEVERE, null, ex);
|
|
|
|
}
|
2011-06-02 11:43:25 +00:00
|
|
|
event.setCancelled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void run()
|
|
|
|
{
|
|
|
|
enabled = false;
|
|
|
|
}
|
|
|
|
}
|