Server: fixed correct game finish on no players in game (rare race conditional);

This commit is contained in:
Oleg Agafonov 2021-02-07 04:42:12 +04:00
parent 7670619fc6
commit 0496ea9509

View file

@ -799,14 +799,23 @@ public abstract class GameImpl implements Game, Serializable {
} }
protected void play(UUID nextPlayerId) { protected void play(UUID nextPlayerId) {
boolean forcedToFinished = false;
if (!isPaused() && !checkIfGameIsOver()) { if (!isPaused() && !checkIfGameIsOver()) {
playerList = state.getPlayerList(nextPlayerId); playerList = state.getPlayerList(nextPlayerId);
Player playerByOrder = getPlayer(playerList.get()); Player playerByOrder = getPlayer(playerList.get());
state.setPlayerByOrderId(playerByOrder.getId()); state.setPlayerByOrderId(playerByOrder == null ? null : playerByOrder.getId());
// PLAY game
while (!isPaused() && !checkIfGameIsOver()) { while (!isPaused() && !checkIfGameIsOver()) {
if (!playExtraTurns()) { if (!playExtraTurns()) {
break; break;
} }
if (playerByOrder == null) {
logger.error("Can't find next player by order, but game stil run. Finish it.");
forcedToFinished = true;
break;
}
GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, playerByOrder.getId()); GameEvent event = new GameEvent(GameEvent.EventType.PLAY_TURN, null, null, playerByOrder.getId());
if (!replaceEvent(event)) { if (!replaceEvent(event)) {
if (!playTurn(playerByOrder)) { if (!playTurn(playerByOrder)) {
@ -822,9 +831,11 @@ public abstract class GameImpl implements Game, Serializable {
} }
} }
} }
if (checkIfGameIsOver() && !isSimulation()) {
// END game
if (checkIfGameIsOver() && !isSimulation() || forcedToFinished) {
winnerId = findWinnersAndLosers(); winnerId = findWinnersAndLosers();
StringBuilder sb = new StringBuilder("GAME END gameId: ").append(this.getId()).append(' '); StringBuilder sb = new StringBuilder("GAME END gameId: ").append(this.getId()).append(' ');
int count = 0; int count = 0;
for (Player player : this.getState().getPlayers().values()) { for (Player player : this.getState().getPlayers().values()) {
if (count > 0) { if (count > 0) {