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 allTracer = new HashMap<>(); private final World world; private final BukkitTask task; private final Set locations; private final Set 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 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); } }