From 9279d9cd8e707c35492bc40b01cb86eddd845d7f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Thu, 31 Jul 2025 18:37:02 +0200 Subject: [PATCH] Improve SelectAdjacent --- .../features/worldedit/SelectAdjacent.java | 14 ++++++++++++-- .../teamserver/listener/SelectAdjacent.java | 14 ++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java index 76ffc749..9afcd59e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/SelectAdjacent.java @@ -42,6 +42,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.function.Predicate; @Linked @MinVersion(20) @@ -79,7 +80,12 @@ public class SelectAdjacent implements Listener { if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; Selector selector = selectors.get(event.getPlayer()); if (selector != null) selector.cancel(); - selector = new Selector(event.getClickedBlock(), event.getPlayer()); + Material material = event.getPlayer().getInventory().getItemInOffHand().getType(); + if (material.isAir()) { + selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true); + } else { + selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material); + } selectors.put(event.getPlayer(), selector); } @@ -101,10 +107,12 @@ public class SelectAdjacent implements Listener { private int maxZ; private BukkitTask bukkitTask; + private Predicate predicate; private Set seen = new HashSet<>(); private Set toCalc = new HashSet<>(); - public Selector(Block block, Player player) { + public Selector(Block block, Player player, Predicate predicate) { + this.predicate = predicate; toCalc.add(block.getLocation()); minX = block.getX(); minY = block.getY(); @@ -148,6 +156,7 @@ public class SelectAdjacent implements Listener { for (Location location : current) { Block block = location.getBlock(); if (block.isEmpty() || block.isLiquid()) continue; + if (!predicate.test(block.getType())) continue; seen.add(location); minX = Math.min(minX, location.getBlockX()); @@ -160,6 +169,7 @@ public class SelectAdjacent implements Listener { for (Vector face : FACES) { Block next = block.getRelative(face.getBlockX(), face.getBlockY(), face.getBlockZ()); if (next.isEmpty() || next.isLiquid()) continue; + if (!predicate.test(next.getType())) continue; Location loc = next.getLocation(); if (seen.contains(loc)) continue; toCalc.add(loc); diff --git a/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java b/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java index 003703dd..2fbebbf3 100644 --- a/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java +++ b/Teamserver/src/de/steamwar/teamserver/listener/SelectAdjacent.java @@ -41,6 +41,7 @@ import org.bukkit.scheduler.BukkitTask; import org.bukkit.util.Vector; import java.util.*; +import java.util.function.Predicate; public class SelectAdjacent implements Listener { @@ -76,7 +77,12 @@ public class SelectAdjacent implements Listener { if (event.getAction() != Action.LEFT_CLICK_BLOCK) return; Selector selector = selectors.get(event.getPlayer()); if (selector != null) selector.cancel(); - selector = new Selector(event.getClickedBlock(), event.getPlayer()); + Material material = event.getPlayer().getInventory().getItemInOffHand().getType(); + if (material.isAir()) { + selector = new Selector(event.getClickedBlock(), event.getPlayer(), __ -> true); + } else { + selector = new Selector(event.getClickedBlock(), event.getPlayer(), type -> type == material); + } selectors.put(event.getPlayer(), selector); } @@ -101,10 +107,12 @@ public class SelectAdjacent implements Listener { private int maxZ; private BukkitTask bukkitTask; + private Predicate predicate; private Set seen = new HashSet<>(); private Set toCalc = new HashSet<>(); - public Selector(Block block, Player player) { + public Selector(Block block, Player player, Predicate predicate) { + this.predicate = predicate; toCalc.add(block.getLocation()); minX = block.getX(); minY = block.getY(); @@ -145,6 +153,7 @@ public class SelectAdjacent implements Listener { for (Location location : current) { Block block = location.getBlock(); if (block.isEmpty() || block.isLiquid()) continue; + if (!predicate.test(block.getType())) continue; seen.add(location); minX = Math.min(minX, location.getBlockX()); @@ -157,6 +166,7 @@ public class SelectAdjacent implements Listener { for (Vector face : FACES) { Block next = block.getRelative(face.getBlockX(), face.getBlockY(), face.getBlockZ()); if (next.isEmpty() || next.isLiquid()) continue; + if (!predicate.test(next.getType())) continue; Location loc = next.getLocation(); if (seen.contains(loc)) continue; toCalc.add(loc);