forked from SteamWar/SteamWar
Add onclick handler
This commit is contained in:
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user