From ca521f5495293cd03afebcf53de9df782ebeee71 Mon Sep 17 00:00:00 2001 From: D4rkr34lm Date: Tue, 5 Aug 2025 21:19:49 +0200 Subject: [PATCH] Improved Cursor mode logic --- .../bausystem/utils/cursor/RCursor.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) 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 9f3d5cb3..cf6b1dfb 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 @@ -16,7 +16,10 @@ import org.bukkit.entity.Player; import org.bukkit.event.block.Action; import org.bukkit.util.Vector; +import java.util.Comparator; +import java.util.List; import java.util.function.BiFunction; +import java.util.function.Predicate; @Getter public class RCursor { @@ -37,17 +40,17 @@ public class RCursor { @Setter private Material cursorMaterial; @Setter - private CursorMode cursorMode; + private List allowedCursorModes; private boolean visible = true; - public RCursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, CursorMode cursorMode, ClickHandler onClickHandler) { + public RCursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, List allowedModes, ClickHandler onClickHandler) { this.targetServer = targetServer; this.owner = owner; this.highlightMaterial = highlightMaterial; this.cursorMaterial = cursorMaterial; - this.cursorMode = cursorMode; + this.allowedCursorModes = allowedModes; this.onClickHandler = onClickHandler; cursorServer = new REntityServer(); @@ -70,7 +73,9 @@ public class RCursor { Material activeCursorMaterial = hitEntity == null ? cursorMaterial : highlightMaterial; - Location activeCursorLocation = hitEntity == null ? cursorMode.positionTransform.apply(owner, rayTraceResult).toLocation(WORLD) + CursorMode activeCursorMode = allowedCursorModes.stream().filter((mode) -> mode.isActive.test(owner)).min(Comparator.comparingInt(a -> a.priority)).orElse(CursorMode.BLOCK_ALIGNED); + + Location activeCursorLocation = hitEntity == null ? activeCursorMode.positionTransform.apply(owner, rayTraceResult).toLocation(WORLD) : new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD); cursorLocation = activeCursorLocation; @@ -116,7 +121,7 @@ public class RCursor { @AllArgsConstructor public enum CursorMode { - FREE((player, rayTraceResult) -> { + FREE(1,(player, rayTraceResult) -> { Vector pos = rayTraceResult.getHitPosition(); BlockFace face = rayTraceResult.getHitBlockFace(); @@ -146,16 +151,9 @@ public class RCursor { } } - if (!player.isSneaking()) { - pos.setX(pos.getBlockX() + 0.5); - if (face == null || face.getModY() == 0) - pos.setY(pos.getBlockY() + 0.0); - pos.setZ(pos.getBlockZ() + 0.5); - } - return pos; - }), - BLOCK_ALIGNED((player, rayTraceResult) -> { + }, (player) -> player.isSneaking()), + BLOCK_ALIGNED(0, (player, rayTraceResult) -> { Vector pos = rayTraceResult.getHitPosition(); BlockFace face = rayTraceResult.getHitBlockFace(); @@ -189,13 +187,15 @@ public class RCursor { } pos.setZ(pos.getBlockZ() + 0.5); return pos; - }); + }, (player) -> true); + private final int priority; private final BiFunction positionTransform; + private final Predicate isActive; } public interface ClickHandler{ - public void handle(Location cursorLocation, boolean didHitEntity, Action action); + void handle(Location cursorLocation, boolean didHitEntity, Action action); } }