Skip to content

Commit 8952424

Browse files
committed
fix(server): handle empty PlayerSlots
1 parent 540a014 commit 8952424

File tree

4 files changed

+21
-14
lines changed

4 files changed

+21
-14
lines changed

sdk/src/main/server-api/sc/framework/plugins/Player.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,11 +64,8 @@ class Player @JvmOverloads constructor(
6464
this.listeners.remove(listener)
6565
}
6666

67-
fun notifyListeners(o: RoomMessage) {
68-
for (listener in ArrayList(listeners)) {
69-
listener.onPlayerEvent(o)
70-
}
71-
}
67+
fun notifyListeners(o: RoomMessage) =
68+
ArrayList(listeners).forEach { it.onPlayerEvent(o) }
7269

7370
fun requestMove() {
7471
val request = MoveRequest()

sdk/src/main/server-api/sc/networking/clients/XStreamClient.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public enum DisconnectCause {
4949
PROTOCOL_ERROR,
5050
LOST_CONNECTION,
5151
TIMEOUT,
52+
NOT_CONNECTED,
5253
UNKNOWN
5354
}
5455

server/src/main/java/sc/server/gaming/GameRoom.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ public synchronized void onGameOver(Map<Player, PlayerScore> results) {
7575
saveReplayMessage(result);
7676
broadcast(result);
7777
} catch (Throwable t) {
78-
logger.error("Failed to generate GameResult from " + results, t);
78+
logger.error("Failed to broadcast GameResult from " + results, t);
7979
}
8080

8181
saveReplay();
@@ -123,7 +123,7 @@ private void broadcast(ObservableRoomMessage message) {
123123

124124
/** Send ProtocolMessage to all listeners. */
125125
private void broadcast(ProtocolPacket packet) {
126-
playerSlots.forEach(slot -> slot.getClient().send(packet));
126+
playerSlots.forEach(slot -> slot.sendPacket(packet));
127127
observers.forEach(observer -> observer.send(packet));
128128
}
129129

@@ -161,7 +161,7 @@ public void onClientError(ErrorMessage errorPacket) {
161161
/** Sends the given GameState to all Players. */
162162
private void sendStateToPlayers(IGameState data) {
163163
playerSlots.forEach(slot ->
164-
slot.getClient().send(createRoomPacket(new MementoMessage(data, slot.getPlayer()))));
164+
slot.onPlayerEvent(new MementoMessage(data, slot.getPlayer())));
165165
}
166166

167167

@@ -226,9 +226,9 @@ private void startIfReady() {
226226
}
227227

228228
private synchronized void start() {
229+
logger.info("Starting {}", game);
229230
this.game.start();
230231
setStatus(GameStatus.ACTIVE);
231-
logger.info("Started {}", game);
232232
}
233233

234234
/** Get the number of players allowed in the game. */
@@ -313,7 +313,7 @@ private Player resolvePlayer(Client client) throws GameRoomException {
313313
}
314314

315315
/** Get Server {@link IClient Clients} of all {@link PlayerSlot Players}. */
316-
public Collection<IClient> getClients() {
316+
public Collection<Object> getClients() {
317317
return playerSlots.stream()
318318
.filter(p -> !p.isEmpty())
319319
.map(PlayerSlot::getClient)
@@ -364,7 +364,7 @@ public synchronized void pause(boolean pause) {
364364
* conditions are not met. This should result in a GameOver.
365365
*/
366366
public synchronized void step(boolean forced) {
367-
if (this.status == GameStatus.CREATED) {
367+
if (getStatus() == GameStatus.CREATED) {
368368
if (forced) {
369369
logger.warn("Forcing game start for {}", game);
370370
start();
@@ -378,7 +378,7 @@ public synchronized void step(boolean forced) {
378378

379379
/** Kick all players, destroy the game and remove it from the manager. */
380380
public void cancel() {
381-
// this will invoked onGameOver and thus stop everything else
381+
// this will invoke onGameOver and thus stop everything else
382382
this.game.stop();
383383
}
384384

server/src/main/java/sc/server/gaming/PlayerSlot.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import sc.framework.plugins.Player;
66
import sc.networking.clients.IClient;
77
import sc.networking.clients.XStreamClient;
8+
import sc.protocol.ProtocolPacket;
89
import sc.protocol.room.RoomMessage;
910
import sc.server.network.Client;
1011
import sc.server.network.IClientListener;
@@ -72,17 +73,25 @@ public synchronized void free() {
7273
this.reserved = false;
7374
}
7475

75-
public IClient getClient() {
76+
public Object getClient() {
7677
return this.client;
7778
}
7879

7980
public Player getPlayer() {
8081
return player;
8182
}
8283

84+
public void sendPacket(ProtocolPacket packet) {
85+
if(client != null) {
86+
client.send(packet);
87+
} else {
88+
onClientDisconnected(null, XStreamClient.DisconnectCause.NOT_CONNECTED);
89+
}
90+
}
91+
8392
@Override
8493
public void onPlayerEvent(RoomMessage message) {
85-
client.send(getRoom().createRoomPacket(message));
94+
sendPacket(getRoom().createRoomPacket(message));
8695
}
8796

8897
@Override

0 commit comments

Comments
 (0)