From 2ccae8c7ef70f79f01f59fcbbe324d78266fd472 Mon Sep 17 00:00:00 2001 From: Quackster Date: Sat, 10 Feb 2024 13:17:21 +1000 Subject: [PATCH] Cancel teleportation when moving between rooms by using navigator --- .../item/interactors/types/TeleportInteractor.java | 6 ++++++ .../alexdev/havana/game/room/entities/RoomPlayer.java | 11 +++++++++++ .../havana/game/room/managers/RoomEntityManager.java | 1 + .../alexdev/havana/game/room/mapping/RoomMapping.java | 1 + .../havana/messages/incoming/rooms/TRYFLAT.java | 6 ++++++ 5 files changed, 25 insertions(+) diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java index 3663615..bf8ae37 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/item/interactors/types/TeleportInteractor.java @@ -67,7 +67,9 @@ public class TeleportInteractor extends GenericTrigger { var resolved = ItemManager.getInstance().resolveItem(pairId); Item pairedTeleporter = resolved != null ? resolved : targetTeleporter; + roomUser.setAuthenticateTelporterId(pairedTeleporter.getDatabaseId()); + roomUser.setAuthenticateTelporterRoomId(pairedTeleporter.getRoomId()); // Check if the user is inside the teleporter, if so, walk out. Useful if the user is stuck inside. if (item.getPosition().equals(roomUser.getPosition()) && !RoomTile.isValidTile(room, player, item.getPosition().getSquareInFront())) { @@ -124,6 +126,7 @@ public class TeleportInteractor extends GenericTrigger { } roomUser.setAuthenticateTelporterId(-1); + roomUser.setAuthenticateTelporterRoomId(-1); pairedTeleporter.setCustomData(TELEPORTER_CLOSE); pairedTeleporter.updateStatus(); @@ -169,6 +172,7 @@ public class TeleportInteractor extends GenericTrigger { GameScheduler.getInstance().getService().schedule(() -> { if (roomUser.getRoom().getId() != room.getId()) { roomUser.setAuthenticateTelporterId(-1); + roomUser.setAuthenticateTelporterRoomId(-1); return; } /*if (roomUser.getAuthenticateTelporterId() == -1) { @@ -186,6 +190,7 @@ public class TeleportInteractor extends GenericTrigger { GameScheduler.getInstance().getService().schedule(() -> { if (roomUser.getRoom().getId() != room.getId()) { roomUser.setAuthenticateTelporterId(-1); + roomUser.setAuthenticateTelporterRoomId(-1); return; } /*if (roomUser.getAuthenticateTelporterId() == -1) { @@ -193,6 +198,7 @@ public class TeleportInteractor extends GenericTrigger { }*/ roomUser.setAuthenticateTelporterId(-1); + roomUser.setAuthenticateTelporterRoomId(-1); if (pairedTeleporter.getRoomId() == item.getRoomId()) { pairedTeleporter.setCustomData(TELEPORTER_CLOSE); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java index 9872b2c..a23cb30 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/entities/RoomPlayer.java @@ -29,6 +29,7 @@ public class RoomPlayer extends RoomEntity { private int authenticateId; private long authenticateTelporterId; + private long authenticateTelporterRoomId; private int observingGameId; private boolean isTyping; @@ -60,6 +61,7 @@ public class RoomPlayer extends RoomEntity { this.player = player; this.authenticateId = -1; this.authenticateTelporterId = -1; + this.authenticateTelporterRoomId = -1; this.tradeItems = new CopyOnWriteArrayList<>(); } @@ -223,6 +225,7 @@ public class RoomPlayer extends RoomEntity { // Remove authentications this.authenticateId = -1; this.authenticateTelporterId = -1; + this.authenticateTelporterRoomId = -1; } public void startObservingGame(int gameId) { @@ -409,4 +412,12 @@ public class RoomPlayer extends RoomEntity { public void setLastLobbyRedirection(GameType lastLobbyRedirection) { this.lastLobbyRedirection = lastLobbyRedirection; } + + public long getAuthenticateTelporterRoomId() { + return authenticateTelporterRoomId; + } + + public void setAuthenticateTelporterRoomId(long authenticateTelporterRoomId) { + this.authenticateTelporterRoomId = authenticateTelporterRoomId; + } } \ No newline at end of file diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java index 96d6847..3a3b9f2 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/managers/RoomEntityManager.java @@ -259,6 +259,7 @@ public class RoomEntityManager { } player.getRoomUser().setAuthenticateTelporterId(-1); + player.getRoomUser().setAuthenticateTelporterRoomId(-1); } GamePlayer gamePlayer = player.getRoomUser().getGamePlayer(); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java index 44f1654..eec6248 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/room/mapping/RoomMapping.java @@ -276,6 +276,7 @@ public class RoomMapping { if (p.getRoomUser().getPosition().equals(oldPosition) || p.getRoomUser().getAuthenticateTelporterId() == item.getVirtualId()) { p.getRoomUser().setAuthenticateTelporterId(-1); + p.getRoomUser().setAuthenticateTelporterRoomId(-1); p.getRoomUser().setWalkingAllowed(true); } } diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java index 873bbb8..1bca1f4 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/incoming/rooms/TRYFLAT.java @@ -77,6 +77,12 @@ public class TRYFLAT implements MessageEvent { } } + // User switched rooms, cancel teleportation + if (player.getRoomUser().getAuthenticateTelporterRoomId() != roomId) { + player.getRoomUser().setAuthenticateTelporterId(-1); + player.getRoomUser().setAuthenticateTelporterRoomId(-1); + } + player.getRoomUser().setAuthenticateId(roomId); player.send(new FLAT_LETIN()); }