This commit is contained in:
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user