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