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.Entity; 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.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 boolean printed; private TNTTracer(World world){ this.world = world; this.locations = 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(); HandlerList.unregisterAll(this); } public void end(){ stop(); if(!printed){ 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(){ 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); } printed = false; end(); } @EventHandler public void onUnloadWorld(WorldUnloadEvent e){ if(e.getWorld().equals(world)){ end(); } } @Override public void run() { if(locations.size() < 20000){ for(Entity e : world.getEntitiesByClass(TNTPrimed.class)){ locations.add(e.getLocation()); } if(locations.size() >= 20000){ for(Player p : world.getPlayers()){ p.sendMessage(BauSystem.PREFIX + "§cEs werden keine weiteren Positionen mehr erfasst (20.000 Block Limit)"); } } } } 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); } }