This commit is contained in:
@ -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<CursorMode> 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<CursorMode> 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<Player, RayTraceUtils.RRayTraceResult, Vector> positionTransform;
|
||||
private final Predicate<Player> isActive;
|
||||
}
|
||||
|
||||
public interface ClickHandler{
|
||||
public void handle(Location cursorLocation, boolean didHitEntity, Action action);
|
||||
void handle(Location cursorLocation, boolean didHitEntity, Action action);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user