Improve SelectAdjacent

This commit is contained in:
2025-11-07 14:54:57 +01:00
parent 58460416c3
commit cc3b93a8f6
@@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem;
import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Point;
import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.Region;
import de.steamwar.bausystem.utils.FlatteningWrapper; import de.steamwar.bausystem.utils.FlatteningWrapper;
import de.steamwar.core.SWPlayer;
import de.steamwar.core.WorldEditRenderer; import de.steamwar.core.WorldEditRenderer;
import de.steamwar.linkage.Linked; import de.steamwar.linkage.Linked;
import de.steamwar.linkage.MinVersion; import de.steamwar.linkage.MinVersion;
@@ -35,13 +36,10 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.scheduler.BukkitTask; import org.bukkit.scheduler.BukkitTask;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Predicate; import java.util.function.Predicate;
@@ -71,32 +69,23 @@ public class SelectAdjacent implements Listener {
new Vector(0, -1, -1), new Vector(0, -1, -1),
}; };
private Map<Player, Selector> selectors = new HashMap<>();
@EventHandler @EventHandler
public void onPlayerInteract(PlayerInteractEvent event) { public void onPlayerInteract(PlayerInteractEvent event) {
if (!event.hasItem()) return; if (!event.hasItem()) return;
if (event.getItem().getType() != Material.WOODEN_AXE) return; if (event.getItem().getType() != Material.WOODEN_AXE) return;
Selector selector = selectors.get(event.getPlayer());
if (selector != null) selector.cancel();
if (!event.getPlayer().isSneaking()) return; if (!event.getPlayer().isSneaking()) return;
if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; if (event.getAction() != Action.LEFT_CLICK_BLOCK) return;
Material material = event.getPlayer().getInventory().getItemInOffHand().getType(); Material material = event.getPlayer().getInventory().getItemInOffHand().getType();
Selector selector;
if (material.isAir()) { if (material.isAir()) {
selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true); selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true);
} else { } else {
selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material); selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material);
} }
selectors.put(event.getPlayer(), selector); SWPlayer.of(event.getPlayer()).setComponent(selector);
} }
@EventHandler private class Selector implements SWPlayer.Component {
public void onPlayerQuit(PlayerQuitEvent event) {
Selector selector = selectors.remove(event.getPlayer());
if (selector != null) selector.cancel();
}
private class Selector {
private static final int MAX_BLOCKS = 500_000; private static final int MAX_BLOCKS = 500_000;
@@ -154,6 +143,7 @@ public class SelectAdjacent implements Listener {
if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) { if (toCalc.isEmpty() || seen.size() > MAX_BLOCKS) {
bukkitTask.cancel(); bukkitTask.cancel();
player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5); player.sendTitle("§aDone", "§e" + volume + " §7Blocks", 0, 20, 5);
SWPlayer.of(player).removeComponent(Selector.class);
} }
}, 1, 1); }, 1, 1);
} }
@@ -190,5 +180,10 @@ public class SelectAdjacent implements Listener {
} }
} }
} }
@Override
public void onUnmount(SWPlayer player) {
cancel();
}
} }
} }