137 Zeilen
3.6 KiB
Java
137 Zeilen
3.6 KiB
Java
|
package de.warking.bausystem.world;
|
||
|
|
||
|
import de.warking.bausystem.BauSystem;
|
||
|
import org.bukkit.Bukkit;
|
||
|
import org.bukkit.Location;
|
||
|
import org.bukkit.Material;
|
||
|
import org.bukkit.World;
|
||
|
import org.bukkit.block.Block;
|
||
|
import org.bukkit.entity.EntityType;
|
||
|
import org.bukkit.entity.Player;
|
||
|
import org.bukkit.entity.TNTPrimed;
|
||
|
import org.bukkit.event.EventHandler;
|
||
|
import org.bukkit.event.HandlerList;
|
||
|
import org.bukkit.event.Listener;
|
||
|
import org.bukkit.event.entity.EntityExplodeEvent;
|
||
|
import org.bukkit.event.entity.EntitySpawnEvent;
|
||
|
import org.bukkit.event.world.WorldUnloadEvent;
|
||
|
import org.bukkit.scheduler.BukkitTask;
|
||
|
|
||
|
import java.util.HashMap;
|
||
|
import java.util.HashSet;
|
||
|
import java.util.Map;
|
||
|
import java.util.Set;
|
||
|
|
||
|
public class TNTTracer implements Listener, Runnable {
|
||
|
|
||
|
private static final Map<World, TNTTracer> allTracer = new HashMap<>();
|
||
|
|
||
|
private final World world;
|
||
|
private final BukkitTask task;
|
||
|
private final Set<Location> locations;
|
||
|
private final Set<TNTPrimed> tnts;
|
||
|
private boolean printed;
|
||
|
|
||
|
private TNTTracer(World world){
|
||
|
this.world = world;
|
||
|
this.locations = new HashSet<>();
|
||
|
this.tnts = new HashSet<>();
|
||
|
this.printed = false;
|
||
|
this.task = Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), this, 1, 1);
|
||
|
Bukkit.getPluginManager().registerEvents(this, BauSystem.getInstance());
|
||
|
allTracer.put(world, this);
|
||
|
}
|
||
|
|
||
|
private void stop(){
|
||
|
task.cancel();
|
||
|
tnts.clear();
|
||
|
HandlerList.unregisterAll(this);
|
||
|
}
|
||
|
|
||
|
public void end(){
|
||
|
stop();
|
||
|
locations.clear();
|
||
|
allTracer.remove(world);
|
||
|
}
|
||
|
|
||
|
public void show(){
|
||
|
stop();
|
||
|
printed = true;
|
||
|
Set<Location> unsetLoc = new HashSet<>();
|
||
|
for(Location l : locations){
|
||
|
Block b = world.getBlockAt(l);
|
||
|
if(b.getType() != Material.AIR){
|
||
|
unsetLoc.add(l);
|
||
|
continue;
|
||
|
}
|
||
|
b.setType(Material.STAINED_GLASS);
|
||
|
b.setData((byte) 1);
|
||
|
}
|
||
|
locations.removeAll(unsetLoc);
|
||
|
}
|
||
|
|
||
|
public void hide(){
|
||
|
end();
|
||
|
if(!printed)
|
||
|
return;
|
||
|
for(Location l : locations){
|
||
|
Block b = world.getBlockAt(l);
|
||
|
if(b.getType() != Material.STAINED_GLASS || b.getData() != 1)
|
||
|
continue;
|
||
|
b.setType(Material.AIR);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@EventHandler
|
||
|
public void onExplode(EntityExplodeEvent e){
|
||
|
if(e.getEntityType() != EntityType.PRIMED_TNT)
|
||
|
return;
|
||
|
|
||
|
tnts.remove((TNTPrimed) e.getEntity());
|
||
|
}
|
||
|
|
||
|
@EventHandler
|
||
|
public void onSpawn(EntitySpawnEvent e){
|
||
|
if(e.getEntityType() != EntityType.PRIMED_TNT)
|
||
|
return;
|
||
|
|
||
|
if(e.getLocation().getWorld() != world)
|
||
|
return;
|
||
|
|
||
|
if(tnts.size() > 150){
|
||
|
for(Player p : Bukkit.getOnlinePlayers()){
|
||
|
p.sendMessage(BauSystem.PREFIX + "§cEs können nicht mehr als 150 TNT verfolgt werden!");
|
||
|
}
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
tnts.add((TNTPrimed) e.getEntity());
|
||
|
}
|
||
|
|
||
|
@EventHandler
|
||
|
public void onUnloadWorld(WorldUnloadEvent e){
|
||
|
if(e.getWorld().equals(world)){
|
||
|
end();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@Override
|
||
|
public void run() {
|
||
|
for(TNTPrimed tnt : tnts){
|
||
|
locations.add(tnt.getLocation());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void newTracer(World w){
|
||
|
if(allTracer.containsKey(w)){
|
||
|
TNTTracer existing = allTracer.get(w);
|
||
|
existing.end();
|
||
|
}
|
||
|
new TNTTracer(w);
|
||
|
}
|
||
|
|
||
|
public static TNTTracer get(World w){
|
||
|
return allTracer.get(w);
|
||
|
}
|
||
|
}
|