From 633dc67be0374c13c6dc13809118baea84002544 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Thu, 23 Oct 2025 17:15:13 +0200 Subject: [PATCH] Made it possible for more RCursors per player to be active --- .gitignore | 1 + .../bausystem/utils/cursor/RCursor.java | 20 ++++---- .../utils/cursor/RCursorManager.java | 51 +++++++++++-------- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/.gitignore b/.gitignore index b0a7fe1b..6a46e68d 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ steamwar.properties # VSCode bin/ .vscode +.settings # Other lib diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java index cf6b1dfb..ef475eb3 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursor.java @@ -60,11 +60,13 @@ public class RCursor { } public void render() { - if (!visible) return; + if (!visible) + return; RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(owner, owner.getLocation(), targetServer.getEntities()); if (rayTraceResult == null) { - if(cursorEntity != null) cursorEntity.die(); + if (cursorEntity != null) + cursorEntity.die(); cursorEntity = null; return; } @@ -84,13 +86,13 @@ public class RCursor { if (cursorEntity == null) { cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial); cursorEntity.setNoGravity(true); - } if (cursorEntity.getMaterial() == activeCursorMaterial) { + } else if (cursorEntity.getMaterial() == activeCursorMaterial) { cursorEntity.move(activeCursorLocation); } else { cursorEntity.die(); cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial); cursorEntity.setNoGravity(true); - if(activeCursorMaterial == highlightMaterial) { + if (activeCursorMaterial == highlightMaterial) { cursorEntity.setGlowing(true); } } @@ -109,7 +111,8 @@ public class RCursor { } void handleClick(Action action) { - if(!visible || cursorLocation == null) return; + if (!visible || cursorLocation == null) + return; onClickHandler.handle(cursorLocation, isHittingEntity, action); } @@ -121,7 +124,7 @@ public class RCursor { @AllArgsConstructor public enum CursorMode { - FREE(1,(player, rayTraceResult) -> { + FREE(1, (player, rayTraceResult) -> { Vector pos = rayTraceResult.getHitPosition(); BlockFace face = rayTraceResult.getHitBlockFace(); @@ -152,8 +155,7 @@ public class RCursor { } return pos; - }, (player) -> player.isSneaking()), - BLOCK_ALIGNED(0, (player, rayTraceResult) -> { + }, (player) -> player.isSneaking()), BLOCK_ALIGNED(0, (player, rayTraceResult) -> { Vector pos = rayTraceResult.getHitPosition(); BlockFace face = rayTraceResult.getHitBlockFace(); @@ -195,7 +197,7 @@ public class RCursor { private final Predicate isActive; } - public interface ClickHandler{ + public interface ClickHandler { void handle(Location cursorLocation, boolean didHitEntity, Action action); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java index 4f406d5c..a67f7bad 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/cursor/RCursorManager.java @@ -11,9 +11,10 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; - +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.BiFunction; @@ -24,7 +25,7 @@ public class RCursorManager implements Listener { private static RCursorManager instance; private final Set calculationActive = new HashSet<>(); - private final Map activeCursors = new HashMap<>(); + private final Map> activeCursors = new HashMap<>(); public RCursorManager() { if (instance == null) { @@ -32,14 +33,14 @@ public class RCursorManager implements Listener { } BiFunction function = (player, object) -> { - updateCursor(player); + updateCursors(player); return object; }; Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { Set playersWithActiveCursor = activeCursors.keySet(); - playersWithActiveCursor.forEach(this::updateCursor); + playersWithActiveCursor.forEach(this::updateCursors); }, 0); Class positionPacketClass = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos"); @@ -52,26 +53,31 @@ public class RCursorManager implements Listener { } void registerCursor(RCursor cursor) { - closeCursorOf(cursor.getOwner()); - - activeCursors.put(cursor.getOwner(), cursor); + List cursorsOfPlayer = activeCursors.getOrDefault(cursor.getOwner(), new ArrayList<>()); + cursorsOfPlayer.add(cursor); + activeCursors.put(cursor.getOwner(), cursorsOfPlayer); } void unregisterCursor(RCursor cursor) { - activeCursors.remove(cursor.getOwner()); + List cursorsOfPlayer = activeCursors.get(cursor.getOwner()); + if (cursorsOfPlayer != null) { + cursorsOfPlayer.remove(cursor); + if (cursorsOfPlayer.isEmpty()) { + activeCursors.remove(cursor.getOwner()); + } + } } - private void closeCursorOf(Player player) { - RCursor currentPlayerCursor = activeCursors.get(player); - - if(currentPlayerCursor != null) { - currentPlayerCursor.close(); - }; + private void closeCursorsOf(Player player) { + List cursorsOfPlayer = activeCursors.remove(player); + if (cursorsOfPlayer != null) { + new ArrayList<>(cursorsOfPlayer).forEach(RCursor::close); + } } - private void updateCursor(Player player) { + private void updateCursors(Player player) { if (!activeCursors.containsKey(player)) { return; } @@ -84,10 +90,10 @@ public class RCursorManager implements Listener { } } - RCursor cursor = activeCursors.get(player); + List cursors = activeCursors.get(player); - if (cursor != null) { - cursor.render(); + if (cursors != null) { + cursors.forEach(RCursor::render); } synchronized (calculationActive) { @@ -99,13 +105,14 @@ public class RCursorManager implements Listener { private void handlePlayerInteract(PlayerInteractEvent event) { Player player = event.getPlayer(); - RCursor cursorOfPlayer = activeCursors.get(player); - - cursorOfPlayer.handleClick(event.getAction()); + List cursorsOfPlayer = activeCursors.get(player); + if (cursorsOfPlayer != null) { + cursorsOfPlayer.forEach(cursor -> cursor.handleClick(event.getAction())); + } } @EventHandler private void handlePlayerQuit(PlayerQuitEvent event) { - closeCursorOf(event.getPlayer()); + closeCursorsOf(event.getPlayer()); } }