Add onclick handler

This commit is contained in:
D4rkr34lm
2025-05-08 17:33:14 +02:00
parent a071d8a1f2
commit 67c679a20f
2 changed files with 38 additions and 3 deletions
@@ -13,8 +13,12 @@ import org.bukkit.Material;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.Action;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import yapion.hierarchy.types.YAPIONType;
import java.util.function.BiConsumer;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@Getter @Getter
@@ -26,21 +30,28 @@ public class RCursor {
private final Player owner; private final Player owner;
private final Material highlightMaterial; private final Material highlightMaterial;
private final ClickHandler onClickHandler;
private RFallingBlockEntity cursorEntity;
private Location cursorLocation;
private boolean isHittingEntity = false;
@Setter @Setter
private Material cursorMaterial; private Material cursorMaterial;
@Setter @Setter
private CursorMode cursorMode; private CursorMode cursorMode;
private boolean visible = true; private boolean visible = true;
private RFallingBlockEntity cursorEntity;
public RCursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, CursorMode cursorMode) {
public RCursor(REntityServer targetServer, Player owner, Material highlightMaterial, Material cursorMaterial, CursorMode cursorMode, 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.cursorMode = cursorMode;
this.onClickHandler = onClickHandler;
cursorServer = new REntityServer(); cursorServer = new REntityServer();
cursorServer.addPlayer(owner); cursorServer.addPlayer(owner);
@@ -65,6 +76,9 @@ public class RCursor {
Location activeCursorLocation = hitEntity == null ? cursorMode.positionTransform.apply(owner, rayTraceResult).toLocation(WORLD) Location activeCursorLocation = hitEntity == null ? cursorMode.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;
isHittingEntity = hitEntity != null;
if (cursorEntity == null) { if (cursorEntity == null) {
cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial); cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial);
cursorEntity.setNoGravity(true); cursorEntity.setNoGravity(true);
@@ -92,6 +106,12 @@ public class RCursor {
visible = true; visible = true;
} }
void handleClick(Action action) {
if(!visible || cursorLocation == null) return;
onClickHandler.handle(cursorLocation, isHittingEntity, action);
}
@AllArgsConstructor @AllArgsConstructor
public enum CursorMode { public enum CursorMode {
FREE((player, rayTraceResult) -> { FREE((player, rayTraceResult) -> {
@@ -172,4 +192,8 @@ public class RCursor {
private final BiFunction<Player, RayTraceUtils.RRayTraceResult, Vector> positionTransform; private final BiFunction<Player, RayTraceUtils.RRayTraceResult, Vector> positionTransform;
} }
public interface ClickHandler{
public void handle(Location cursorLocation, boolean didHitEntity, Action action);
}
} }
@@ -7,6 +7,8 @@ import de.steamwar.linkage.Linked;
import lombok.Getter; import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.player.PlayerInteractEvent;
import java.lang.ref.SoftReference; import java.lang.ref.SoftReference;
import java.util.HashMap; import java.util.HashMap;
@@ -80,4 +82,13 @@ public class RCursorManager {
} }
} }
@EventHandler
private void handlePlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer();
RCursor cursorOfPlayer = activeCursors.get(player).get();
if(cursorOfPlayer == null) return;
cursorOfPlayer.handleClick(event.getAction());
}
} }