Made it possible for more RCursors per player to be active

This commit is contained in:
D4rkr34lm
2025-10-23 17:15:13 +02:00
parent ca521f5495
commit 633dc67be0
3 changed files with 41 additions and 31 deletions
+1
View File
@@ -14,6 +14,7 @@ steamwar.properties
# VSCode # VSCode
bin/ bin/
.vscode .vscode
.settings
# Other # Other
lib lib
@@ -60,11 +60,13 @@ public class RCursor {
} }
public void render() { public void render() {
if (!visible) return; if (!visible)
return;
RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(owner, owner.getLocation(), targetServer.getEntities()); RayTraceUtils.RRayTraceResult rayTraceResult = RayTraceUtils.traceREntity(owner, owner.getLocation(), targetServer.getEntities());
if (rayTraceResult == null) { if (rayTraceResult == null) {
if(cursorEntity != null) cursorEntity.die(); if (cursorEntity != null)
cursorEntity.die();
cursorEntity = null; cursorEntity = null;
return; return;
} }
@@ -84,13 +86,13 @@ public class RCursor {
if (cursorEntity == null) { if (cursorEntity == null) {
cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial); cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial);
cursorEntity.setNoGravity(true); cursorEntity.setNoGravity(true);
} if (cursorEntity.getMaterial() == activeCursorMaterial) { } else if (cursorEntity.getMaterial() == activeCursorMaterial) {
cursorEntity.move(activeCursorLocation); cursorEntity.move(activeCursorLocation);
} else { } else {
cursorEntity.die(); cursorEntity.die();
cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial); cursorEntity = new RFallingBlockEntity(cursorServer, activeCursorLocation, activeCursorMaterial);
cursorEntity.setNoGravity(true); cursorEntity.setNoGravity(true);
if(activeCursorMaterial == highlightMaterial) { if (activeCursorMaterial == highlightMaterial) {
cursorEntity.setGlowing(true); cursorEntity.setGlowing(true);
} }
} }
@@ -109,7 +111,8 @@ public class RCursor {
} }
void handleClick(Action action) { void handleClick(Action action) {
if(!visible || cursorLocation == null) return; if (!visible || cursorLocation == null)
return;
onClickHandler.handle(cursorLocation, isHittingEntity, action); onClickHandler.handle(cursorLocation, isHittingEntity, action);
} }
@@ -121,7 +124,7 @@ public class RCursor {
@AllArgsConstructor @AllArgsConstructor
public enum CursorMode { public enum CursorMode {
FREE(1,(player, rayTraceResult) -> { FREE(1, (player, rayTraceResult) -> {
Vector pos = rayTraceResult.getHitPosition(); Vector pos = rayTraceResult.getHitPosition();
BlockFace face = rayTraceResult.getHitBlockFace(); BlockFace face = rayTraceResult.getHitBlockFace();
@@ -152,8 +155,7 @@ public class RCursor {
} }
return pos; return pos;
}, (player) -> player.isSneaking()), }, (player) -> player.isSneaking()), BLOCK_ALIGNED(0, (player, rayTraceResult) -> {
BLOCK_ALIGNED(0, (player, rayTraceResult) -> {
Vector pos = rayTraceResult.getHitPosition(); Vector pos = rayTraceResult.getHitPosition();
BlockFace face = rayTraceResult.getHitBlockFace(); BlockFace face = rayTraceResult.getHitBlockFace();
@@ -195,7 +197,7 @@ public class RCursor {
private final Predicate<Player> isActive; private final Predicate<Player> isActive;
} }
public interface ClickHandler{ public interface ClickHandler {
void handle(Location cursorLocation, boolean didHitEntity, Action action); void handle(Location cursorLocation, boolean didHitEntity, Action action);
} }
} }
@@ -11,9 +11,10 @@ import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.BiFunction; import java.util.function.BiFunction;
@@ -24,7 +25,7 @@ public class RCursorManager implements Listener {
private static RCursorManager instance; private static RCursorManager instance;
private final Set<Player> calculationActive = new HashSet<>(); private final Set<Player> calculationActive = new HashSet<>();
private final Map<Player, RCursor> activeCursors = new HashMap<>(); private final Map<Player, List<RCursor>> activeCursors = new HashMap<>();
public RCursorManager() { public RCursorManager() {
if (instance == null) { if (instance == null) {
@@ -32,14 +33,14 @@ public class RCursorManager implements Listener {
} }
BiFunction<Player, Object, Object> function = (player, object) -> { BiFunction<Player, Object, Object> function = (player, object) -> {
updateCursor(player); updateCursors(player);
return object; return object;
}; };
Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
Set<Player> playersWithActiveCursor = activeCursors.keySet(); Set<Player> playersWithActiveCursor = activeCursors.keySet();
playersWithActiveCursor.forEach(this::updateCursor); playersWithActiveCursor.forEach(this::updateCursors);
}, 0); }, 0);
Class<?> positionPacketClass = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos"); Class<?> positionPacketClass = Reflection.getClass("net.minecraft.network.protocol.game.ServerboundMovePlayerPacket$Pos");
@@ -52,26 +53,31 @@ public class RCursorManager implements Listener {
} }
void registerCursor(RCursor cursor) { void registerCursor(RCursor cursor) {
closeCursorOf(cursor.getOwner()); List<RCursor> cursorsOfPlayer = activeCursors.getOrDefault(cursor.getOwner(), new ArrayList<>());
cursorsOfPlayer.add(cursor);
activeCursors.put(cursor.getOwner(), cursor); activeCursors.put(cursor.getOwner(), cursorsOfPlayer);
} }
void unregisterCursor(RCursor cursor) { void unregisterCursor(RCursor cursor) {
List<RCursor> cursorsOfPlayer = activeCursors.get(cursor.getOwner());
if (cursorsOfPlayer != null) {
cursorsOfPlayer.remove(cursor);
if (cursorsOfPlayer.isEmpty()) {
activeCursors.remove(cursor.getOwner()); activeCursors.remove(cursor.getOwner());
} }
}
}
private void closeCursorOf(Player player) { private void closeCursorsOf(Player player) {
RCursor currentPlayerCursor = activeCursors.get(player); List<RCursor> cursorsOfPlayer = activeCursors.remove(player);
if (cursorsOfPlayer != null) {
if(currentPlayerCursor != null) { new ArrayList<>(cursorsOfPlayer).forEach(RCursor::close);
currentPlayerCursor.close(); }
};
} }
private void updateCursor(Player player) { private void updateCursors(Player player) {
if (!activeCursors.containsKey(player)) { if (!activeCursors.containsKey(player)) {
return; return;
} }
@@ -84,10 +90,10 @@ public class RCursorManager implements Listener {
} }
} }
RCursor cursor = activeCursors.get(player); List<RCursor> cursors = activeCursors.get(player);
if (cursor != null) { if (cursors != null) {
cursor.render(); cursors.forEach(RCursor::render);
} }
synchronized (calculationActive) { synchronized (calculationActive) {
@@ -99,13 +105,14 @@ public class RCursorManager implements Listener {
private void handlePlayerInteract(PlayerInteractEvent event) { private void handlePlayerInteract(PlayerInteractEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
RCursor cursorOfPlayer = activeCursors.get(player); List<RCursor> cursorsOfPlayer = activeCursors.get(player);
if (cursorsOfPlayer != null) {
cursorOfPlayer.handleClick(event.getAction()); cursorsOfPlayer.forEach(cursor -> cursor.handleClick(event.getAction()));
}
} }
@EventHandler @EventHandler
private void handlePlayerQuit(PlayerQuitEvent event) { private void handlePlayerQuit(PlayerQuitEvent event) {
closeCursorOf(event.getPlayer()); closeCursorsOf(event.getPlayer());
} }
} }