Improved Cursor mode logic
All checks were successful
SteamWarCI Build successful

This commit is contained in:
D4rkr34lm
2025-08-05 21:19:49 +02:00
parent 7a598185a0
commit ca521f5495

View File

@ -16,7 +16,10 @@ import org.bukkit.entity.Player;
import org.bukkit.event.block.Action; import org.bukkit.event.block.Action;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import java.util.Comparator;
import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Predicate;
@Getter @Getter
public class RCursor { public class RCursor {
@ -37,17 +40,17 @@ public class RCursor {
@Setter @Setter
private Material cursorMaterial; private Material cursorMaterial;
@Setter @Setter
private CursorMode cursorMode; private List<CursorMode> allowedCursorModes;
private boolean visible = true; 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<CursorMode> allowedModes, ClickHandler onClickHandler) {
this.targetServer = targetServer; this.targetServer = targetServer;
this.owner = owner; this.owner = owner;
this.highlightMaterial = highlightMaterial; this.highlightMaterial = highlightMaterial;
this.cursorMaterial = cursorMaterial; this.cursorMaterial = cursorMaterial;
this.cursorMode = cursorMode; this.allowedCursorModes = allowedModes;
this.onClickHandler = onClickHandler; this.onClickHandler = onClickHandler;
cursorServer = new REntityServer(); cursorServer = new REntityServer();
@ -70,7 +73,9 @@ public class RCursor {
Material activeCursorMaterial = hitEntity == null ? cursorMaterial : highlightMaterial; 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); : new Vector(hitEntity.getX(), hitEntity.getY(), hitEntity.getZ()).toLocation(WORLD);
cursorLocation = activeCursorLocation; cursorLocation = activeCursorLocation;
@ -116,7 +121,7 @@ public class RCursor {
@AllArgsConstructor @AllArgsConstructor
public enum CursorMode { public enum CursorMode {
FREE((player, rayTraceResult) -> { FREE(1,(player, rayTraceResult) -> {
Vector pos = rayTraceResult.getHitPosition(); Vector pos = rayTraceResult.getHitPosition();
BlockFace face = rayTraceResult.getHitBlockFace(); 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; return pos;
}), }, (player) -> player.isSneaking()),
BLOCK_ALIGNED((player, rayTraceResult) -> { BLOCK_ALIGNED(0, (player, rayTraceResult) -> {
Vector pos = rayTraceResult.getHitPosition(); Vector pos = rayTraceResult.getHitPosition();
BlockFace face = rayTraceResult.getHitBlockFace(); BlockFace face = rayTraceResult.getHitBlockFace();
@ -189,13 +187,15 @@ public class RCursor {
} }
pos.setZ(pos.getBlockZ() + 0.5); pos.setZ(pos.getBlockZ() + 0.5);
return pos; return pos;
}); }, (player) -> true);
private final int priority;
private final BiFunction<Player, RayTraceUtils.RRayTraceResult, Vector> positionTransform; private final BiFunction<Player, RayTraceUtils.RRayTraceResult, Vector> positionTransform;
private final Predicate<Player> isActive;
} }
public interface ClickHandler{ public interface ClickHandler{
public void handle(Location cursorLocation, boolean didHitEntity, Action action); void handle(Location cursorLocation, boolean didHitEntity, Action action);
} }
} }