Skip to content

Commit c01a98a

Browse files
fix: skywars warping
1 parent 86c6b06 commit c01a98a

10 files changed

Lines changed: 128 additions & 89 deletions

File tree

type.bedwarsgame/src/main/java/net/swofty/type/bedwarsgame/events/ActionPlayerJoin.java

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.SneakyThrows;
44
import net.minestom.server.coordinate.Pos;
55
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
6+
import net.swofty.commons.ServerType;
67
import net.swofty.type.bedwarsgame.TypeBedWarsGameLoader;
78
import net.swofty.type.bedwarsgame.game.Game;
89
import net.swofty.type.bedwarsgame.user.BedWarsPlayer;
@@ -24,32 +25,40 @@ public void run(AsyncPlayerConfigurationEvent event) {
2425
event.setSpawningInstance(HypixelConst.getEmptyInstance());
2526
player.setRespawnPoint(new Pos(10, 10, 10));
2627

27-
MathUtility.delay(
28-
() -> {
29-
String preferredGameId;
30-
if (RedisGameMessage.game.containsKey(player.getUuid())) {
31-
preferredGameId = RedisGameMessage.game.get(player.getUuid());
32-
RedisGameMessage.game.remove(player.getUuid());
33-
} else {
34-
Logger.error("Failed to create a new game for player " + player.getUsername());
35-
return;
36-
}
37-
38-
Game preferred = TypeBedWarsGameLoader.getGameById(preferredGameId);
39-
if (preferred != null) {
40-
MathUtility.delay(
41-
() -> {
42-
// Check if this is a rejoin (player was disconnected from this game)
43-
if (preferred.hasDisconnectedPlayer(player.getUuid())) {
44-
preferred.rejoin(player);
45-
} else {
46-
preferred.join(player);
47-
}
48-
},
49-
15
50-
);
51-
}
52-
}, 15);
28+
MathUtility.delay(() -> tryJoinGame(player, false), 15);
29+
}
30+
31+
private void tryJoinGame(BedWarsPlayer player, boolean isRetry) {
32+
if (!player.isOnline()) return;
33+
34+
String preferredGameId = RedisGameMessage.game.remove(player.getUuid());
35+
if (preferredGameId == null) {
36+
if (!isRetry) {
37+
Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second...");
38+
MathUtility.delay(() -> tryJoinGame(player, true), 20);
39+
return;
40+
}
41+
Logger.error("Failed to find game assignment for player " + player.getUsername());
42+
player.sendMessage("§cNo game assignment found! Returning to lobby...");
43+
player.sendTo(ServerType.BEDWARS_LOBBY);
44+
return;
45+
}
46+
47+
Game preferred = TypeBedWarsGameLoader.getGameById(preferredGameId);
48+
if (preferred == null) {
49+
player.sendMessage("§cThe assigned game no longer exists! Returning to lobby...");
50+
player.sendTo(ServerType.BEDWARS_LOBBY);
51+
return;
52+
}
53+
54+
MathUtility.delay(() -> {
55+
if (!player.isOnline()) return;
56+
if (preferred.hasDisconnectedPlayer(player.getUuid())) {
57+
preferred.rejoin(player);
58+
} else {
59+
preferred.join(player);
60+
}
61+
}, 15);
5362
}
5463
}
5564

type.bedwarslobby/src/main/java/net/swofty/type/bedwarslobby/redis/service/RedisBedWarsLobbyPropagatePartyEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event)
284284
throw new RuntimeException("Couldn't find a proxy for " + warperName);
285285
}
286286

287-
if (warperServer.uuid() == HypixelConst.getServerUUID()) {
287+
if (warperServer.uuid().equals(HypixelConst.getServerUUID())) {
288288
return;
289289
}
290290

type.generic/src/main/java/net/swofty/type/generic/entity/npc/impl/NPCEntityImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ public NPCEntityImpl(@NotNull String bottomDisplay, @Nullable String skinTexture
3939
}
4040

4141
setNoGravity(true);
42+
setAutoViewable(false);
4243
}
4344

4445
@Override

type.lobby/src/main/java/net/swofty/type/lobby/LobbyOrchestratorConnector.java

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
import net.swofty.type.generic.user.HypixelPlayer;
1313
import org.jetbrains.annotations.Nullable;
1414

15+
import org.tinylog.Logger;
16+
1517
import java.util.ArrayList;
1618
import java.util.List;
1719
import java.util.UUID;
1820
import java.util.concurrent.CompletableFuture;
21+
import java.util.concurrent.TimeUnit;
1922

2023
public record LobbyOrchestratorConnector(HypixelPlayer player) {
2124
private static final ProxyService PROXY_SERVICE = new ProxyService(ServiceType.ORCHESTRATOR);
@@ -104,30 +107,37 @@ public void sendPartyToGame(ServerType targetServerType, String gameType, @Nulla
104107
UnderstandableProxyServer server = pair.first();
105108
String gameId = pair.second();
106109

107-
// Register all party members for this game
108110
List<UUID> partyMemberUuids = party.getMembers().stream()
109111
.map(FullParty.Member::getUuid)
110112
.toList();
111113

112-
int registeredCount = 0;
114+
List<CompletableFuture<Void>> registrationFutures = new ArrayList<>();
113115
for (UUID memberUuid : partyMemberUuids) {
114116
ChooseGameProtocolObject.ChooseGameMessage message =
115117
new ChooseGameProtocolObject.ChooseGameMessage(memberUuid, server, gameId);
116118

117-
PROXY_SERVICE.handleRequest(message)
118-
.exceptionally(throwable -> {
119-
// Log error but continue
120-
return null;
121-
});
122-
registeredCount++;
119+
registrationFutures.add(
120+
PROXY_SERVICE.handleRequest(message)
121+
.thenAccept(response -> {})
122+
.exceptionally(throwable -> {
123+
Logger.error("Failed to register party member " + memberUuid + " for game: " + throwable.getMessage());
124+
return null;
125+
})
126+
);
127+
}
128+
129+
try {
130+
CompletableFuture.allOf(registrationFutures.toArray(new CompletableFuture[0]))
131+
.orTimeout(3, TimeUnit.SECONDS)
132+
.join();
133+
} catch (Exception e) {
134+
Logger.warn("Some party member registrations timed out, proceeding with transfer anyway");
123135
}
124136

125137
player.sendMessage("§aSending your party to " + server.shortName() + "!");
126138

127-
// Transfer leader first
128139
player.asProxyPlayer().transferToWithIndication(server.uuid());
129140

130-
// Transfer all other party members
131141
for (UUID memberUuid : partyMemberUuids) {
132142
if (!memberUuid.equals(player.getUuid())) {
133143
ProxyPlayer memberProxy = new ProxyPlayer(memberUuid);

type.murdermysterygame/src/main/java/net/swofty/type/murdermysterygame/events/ActionPlayerJoin.java

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import lombok.SneakyThrows;
44
import net.minestom.server.coordinate.Pos;
55
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
6+
import net.swofty.commons.ServerType;
67
import net.swofty.type.murdermysterygame.TypeMurderMysteryGameLoader;
78
import net.swofty.type.murdermysterygame.game.Game;
89
import net.swofty.type.murdermysterygame.user.MurderMysteryPlayer;
@@ -24,30 +25,39 @@ public void run(AsyncPlayerConfigurationEvent event) {
2425
event.setSpawningInstance(HypixelConst.getEmptyInstance());
2526
player.setRespawnPoint(new Pos(0, 72, 0));
2627

27-
MathUtility.delay(
28-
() -> {
29-
String preferredGameId;
30-
if (RedisGameMessage.game.containsKey(player.getUuid())) {
31-
preferredGameId = RedisGameMessage.game.get(player.getUuid());
32-
RedisGameMessage.game.remove(player.getUuid());
33-
} else {
34-
Logger.error("Failed to find game for player " + player.getUsername());
35-
return;
36-
}
37-
38-
Game preferred = TypeMurderMysteryGameLoader.getGameById(preferredGameId);
39-
if (preferred != null) {
40-
MathUtility.delay(
41-
() -> {
42-
if (preferred.hasDisconnectedPlayer(player.getUuid())) {
43-
preferred.rejoin(player);
44-
} else {
45-
preferred.join(player);
46-
}
47-
},
48-
15
49-
);
50-
}
51-
}, 15);
28+
MathUtility.delay(() -> tryJoinGame(player, false), 15);
29+
}
30+
31+
private void tryJoinGame(MurderMysteryPlayer player, boolean isRetry) {
32+
if (!player.isOnline()) return;
33+
34+
String preferredGameId = RedisGameMessage.game.remove(player.getUuid());
35+
if (preferredGameId == null) {
36+
if (!isRetry) {
37+
Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second...");
38+
MathUtility.delay(() -> tryJoinGame(player, true), 20);
39+
return;
40+
}
41+
Logger.error("Failed to find game assignment for player " + player.getUsername());
42+
player.sendMessage("§cNo game assignment found! Returning to lobby...");
43+
player.sendTo(ServerType.MURDER_MYSTERY_LOBBY);
44+
return;
45+
}
46+
47+
Game preferred = TypeMurderMysteryGameLoader.getGameById(preferredGameId);
48+
if (preferred == null) {
49+
player.sendMessage("§cThe assigned game no longer exists! Returning to lobby...");
50+
player.sendTo(ServerType.MURDER_MYSTERY_LOBBY);
51+
return;
52+
}
53+
54+
MathUtility.delay(() -> {
55+
if (!player.isOnline()) return;
56+
if (preferred.hasDisconnectedPlayer(player.getUuid())) {
57+
preferred.rejoin(player);
58+
} else {
59+
preferred.join(player);
60+
}
61+
}, 15);
5262
}
5363
}

type.murdermysterylobby/src/main/java/net/swofty/type/murdermysterylobby/redis/service/RedisMurderMysteryLobbyPropagatePartyEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event)
283283
throw new RuntimeException("Couldn't find a proxy for " + warperName);
284284
}
285285

286-
if (warperServer.uuid() == HypixelConst.getServerUUID()) {
286+
if (warperServer.uuid().equals(HypixelConst.getServerUUID())) {
287287
return;
288288
}
289289

type.prototypelobby/src/main/java/net/swofty/type/prototypelobby/redis/service/RedisPrototypeLobbyPropagatePartyEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event)
284284
throw new RuntimeException("Couldn't find a proxy for " + warperName);
285285
}
286286

287-
if (warperServer.uuid() == HypixelConst.getServerUUID()) {
287+
if (warperServer.uuid().equals(HypixelConst.getServerUUID())) {
288288
return;
289289
}
290290

type.skyblockgeneric/src/main/java/net/swofty/type/skyblockgeneric/redis/service/RedisSkyBlockPropagatePartyEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ private void handleWarpEvent(SkyBlockPlayer player, PartyWarpResponseEvent event
285285
throw new RuntimeException("Couldn't find a proxy for " + warperName);
286286
}
287287

288-
if (warperServer.uuid() == HypixelConst.getServerUUID()) {
288+
if (warperServer.uuid().equals(HypixelConst.getServerUUID())) {
289289
return;
290290
}
291291

type.skywarsgame/src/main/java/net/swofty/type/skywarsgame/events/ActionPlayerJoin.java

Lines changed: 32 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,43 @@ public void onJoin(AsyncPlayerConfigurationEvent event) {
2424
event.setSpawningInstance(HypixelConst.getEmptyInstance());
2525
player.setRespawnPoint(new Pos(0, 100, 0));
2626

27-
MathUtility.delay(() -> {
28-
String assignedGameId = RedisGameMessage.game.remove(player.getUuid());
29-
if (assignedGameId == null) {
30-
player.sendMessage("§cNo game assignment found! Returning to lobby...");
31-
player.sendTo(ServerType.SKYWARS_LOBBY);
32-
return;
33-
}
27+
MathUtility.delay(() -> tryJoinGame(player, false), 15);
28+
}
3429

35-
SkywarsGame assignedGame = TypeSkywarsGameLoader.getGameById(assignedGameId);
36-
if (assignedGame == null) {
37-
player.sendMessage("§cThe assigned game no longer exists! Returning to lobby...");
38-
player.sendTo(ServerType.SKYWARS_LOBBY);
39-
return;
40-
}
30+
private void tryJoinGame(SkywarsPlayer player, boolean isRetry) {
31+
if (!player.isOnline()) return;
4132

42-
if (assignedGame.getGameStatus() != SkywarsGameStatus.WAITING) {
43-
player.sendMessage("§cThe game has already started! Returning to lobby...");
44-
player.sendTo(ServerType.SKYWARS_LOBBY);
33+
String assignedGameId = RedisGameMessage.game.remove(player.getUuid());
34+
if (assignedGameId == null) {
35+
if (!isRetry) {
36+
Logger.info("No game assignment found for " + player.getUsername() + ", retrying in 1 second...");
37+
MathUtility.delay(() -> tryJoinGame(player, true), 20);
4538
return;
4639
}
40+
player.sendMessage("§cNo game assignment found! Returning to lobby...");
41+
player.sendTo(ServerType.SKYWARS_LOBBY);
42+
return;
43+
}
4744

48-
if (assignedGame.getPlayers().size() >= assignedGame.getGameType().getMaxPlayers()) {
49-
player.sendMessage("§cThe game is full! Returning to lobby...");
50-
player.sendTo(ServerType.SKYWARS_LOBBY);
51-
return;
52-
}
45+
SkywarsGame assignedGame = TypeSkywarsGameLoader.getGameById(assignedGameId);
46+
if (assignedGame == null) {
47+
player.sendMessage("§cThe assigned game no longer exists! Returning to lobby...");
48+
player.sendTo(ServerType.SKYWARS_LOBBY);
49+
return;
50+
}
51+
52+
if (assignedGame.getGameStatus() != SkywarsGameStatus.WAITING) {
53+
player.sendMessage("§cThe game has already started! Returning to lobby...");
54+
player.sendTo(ServerType.SKYWARS_LOBBY);
55+
return;
56+
}
57+
58+
if (assignedGame.getPlayers().size() >= assignedGame.getGameType().getMaxPlayers()) {
59+
player.sendMessage("§cThe game is full! Returning to lobby...");
60+
player.sendTo(ServerType.SKYWARS_LOBBY);
61+
return;
62+
}
5363

54-
assignedGame.join(player);
55-
}, 15);
64+
assignedGame.join(player);
5665
}
5766
}

type.skywarslobby/src/main/java/net/swofty/type/skywarslobby/redis/service/RedisSkywarsLobbyPropagatePartyEvent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ private void handleWarpEvent(HypixelPlayer player, PartyWarpResponseEvent event)
283283
throw new RuntimeException("Couldn't find a proxy for " + warperName);
284284
}
285285

286-
if (warperServer.uuid() == HypixelConst.getServerUUID()) {
286+
if (warperServer.uuid().equals(HypixelConst.getServerUUID())) {
287287
return;
288288
}
289289

0 commit comments

Comments
 (0)