Skip to content

Commit 6a44bab

Browse files
fix(velocity): fix typo, race condition, and NPE in transfer flow
1 parent fa35c0e commit 6a44bab

File tree

3 files changed

+35
-22
lines changed

3 files changed

+35
-22
lines changed

velocity.extension/src/main/java/net/swofty/velocity/command/LimboCommand.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public void execute(Invocation invocation) {
2424
player.sendMessage(Component.text("§eBecause of this, you were routed to Limbo, a subset of your own imagination."));
2525
player.sendMessage(Component.text("§dThis place doesn't exist anywhere, any you can stay here as long as you'd like."));
2626
player.sendMessage(Component.text("§6To return to \"reality\", use §b/lobby GAME."));
27-
player.sendMessage(Component.text("§cExamples: /lobbby, /lobby skywars, /lobby arcade"));
27+
player.sendMessage(Component.text("§cExamples: /lobby, /lobby skywars, /lobby arcade"));
2828
player.sendMessage(Component.text("§4Watch out, though, as there are things that live in Limbo."));
2929
return;
3030
}

velocity.extension/src/main/java/net/swofty/velocity/gamemanager/TransferHandler.java

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,10 @@ public void previousServerIsFinished() {
117117
public void transferTo(ServerType type) {
118118
new Thread(() -> {
119119
RegisteredServer originServer = playersOriginServer.get(player);
120+
if (originServer == null) {
121+
player.getCurrentServer().ifPresent(conn -> playersOriginServer.put(player, conn.getServer()));
122+
originServer = playersOriginServer.get(player);
123+
}
120124
ServerType originServerType = GameManager.getTypeFromRegisteredServer(originServer);
121125

122126
playersGoalServerType.remove(player);
@@ -147,27 +151,36 @@ public void forceRemoveFromLimbo() {
147151
playersOriginServer.remove(player);
148152
}
149153

150-
public void transferTo(RegisteredServer toTransferTo) {
154+
public CompletableFuture<Void> transferTo(RegisteredServer toTransferTo) {
155+
CompletableFuture<Void> future = new CompletableFuture<>();
151156
new Thread(() -> {
152-
RegisteredServer originServer = playersOriginServer.get(player);
153-
ServerType originServerType = GameManager.getTypeFromRegisteredServer(originServer);
154-
155-
playersGoalServerType.remove(player);
156-
playersOriginServer.remove(player);
157-
158-
ServerType type = GameManager.getTypeFromRegisteredServer(toTransferTo);
159-
UUID serverUUID = UUID.fromString(toTransferTo.getServerInfo().getName());
160-
161-
if (originServer != null && originServerType != null) {
162-
RedisMessage.sendMessageToServer(serverUUID,
163-
FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE,
164-
new JSONObject().put("uuid", player.getUniqueId().toString())
165-
.put("origin-type", originServerType.name())
166-
);
157+
try {
158+
RegisteredServer originServer = playersOriginServer.get(player);
159+
if (originServer == null) {
160+
player.getCurrentServer().ifPresent(conn -> playersOriginServer.put(player, conn.getServer()));
161+
originServer = playersOriginServer.get(player);
162+
}
163+
ServerType originServerType = GameManager.getTypeFromRegisteredServer(originServer);
164+
165+
playersGoalServerType.remove(player);
166+
playersOriginServer.remove(player);
167+
168+
UUID serverUUID = UUID.fromString(toTransferTo.getServerInfo().getName());
169+
170+
if (originServer != null && originServerType != null) {
171+
RedisMessage.sendMessageToServer(serverUUID,
172+
FromProxyChannels.GIVE_PLAYERS_ORIGIN_TYPE,
173+
new JSONObject().put("uuid", player.getUniqueId().toString())
174+
.put("origin-type", originServerType.name())
175+
);
176+
}
177+
178+
player.createConnectionRequest(toTransferTo).connectWithIndication();
179+
future.complete(null);
180+
} catch (Exception e) {
181+
future.completeExceptionally(e);
167182
}
168-
169-
GameManager.GameServer toTransferToAsGame = GameManager.getFromUUID(serverUUID);
170-
player.createConnectionRequest(toTransferTo).connectWithIndication();
171183
}).start();
184+
return future;
172185
}
173186
}

velocity.extension/src/main/java/net/swofty/velocity/redis/listeners/ListenerPlayerHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ public JSONObject receivedMessage(JSONObject message, UUID serverUUID) {
8989
}
9090

9191
transferHandler.addToDisregard();
92-
transferHandler.transferTo(serverInfo.registeredServer());
93-
transferHandler.removeFromDisregard();
92+
transferHandler.transferTo(serverInfo.registeredServer())
93+
.thenRun(transferHandler::removeFromDisregard);
9494

9595
}
9696
case TRANSFER -> {

0 commit comments

Comments
 (0)