SteamWar/BauSystem
Archiviert
13
0
Dieses Repository wurde am 2024-08-04 archiviert. Du kannst Dateien ansehen und es klonen, aber nicht pushen oder Issues/Pull-Requests öffnen.
BauSystem/src/de/warking/bausystem/world/TNTTracer.java

137 Zeilen
3.6 KiB
Java

2019-04-02 07:08:27 +02:00
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);
}
}