diff --git a/Mage.Server/src/main/java/mage/server/ChatManager.java b/Mage.Server/src/main/java/mage/server/ChatManager.java index ed017b14229..d25448c3cfe 100644 --- a/Mage.Server/src/main/java/mage/server/ChatManager.java +++ b/Mage.Server/src/main/java/mage/server/ChatManager.java @@ -244,6 +244,27 @@ public enum ChatManager { } return true; } + if (command.startsWith("FIX")) { + message += "
" + GameManager.instance.getChatId(chatId); + ChatSession session = chatSessions.get(chatId); + if (session != null && session.getInfo() != null) { + String gameId = session.getInfo(); + if (gameId.startsWith("Game ")) { + UUID id = java.util.UUID.fromString(gameId.substring(5, gameId.length())); + for (Entry entry : GameManager.instance.getGameController().entrySet()) { + if (entry.getKey().equals(id)) { + GameController controller = entry.getValue(); + if (controller != null) { + message += controller.attemptToFixGame(); + chatSessions.get(chatId).broadcastInfoToUser(user, message); + } + } + } + + } + } + return true; + } if (command.startsWith("CARD ")) { Matcher matchPattern = getCardTextPattern.matcher(message.toLowerCase(Locale.ENGLISH)); if (matchPattern.find()) { diff --git a/Mage.Server/src/main/java/mage/server/game/GameController.java b/Mage.Server/src/main/java/mage/server/game/GameController.java index 8bce119961f..3b18789ecf9 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -37,6 +37,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.zip.GZIPOutputStream; import mage.MageException; import mage.abilities.Ability; +import mage.abilities.common.PassAbility; import mage.cards.Card; import mage.cards.Cards; import mage.cards.decks.Deck; @@ -57,6 +58,7 @@ import mage.game.events.PlayerQueryEvent; import mage.game.events.TableEvent; import mage.game.match.MatchPlayer; import mage.game.permanent.Permanent; +import mage.game.turn.Phase; import mage.interfaces.Action; import mage.players.Player; import mage.server.*; @@ -1150,13 +1152,13 @@ public class GameController implements GameCallback { sb.append(state.getPlayerList()); sb.append("
getPlayers: "); sb.append(state.getPlayers()); - sb.append("
Player with Priority is: "); + sb.append("
Player with Priority is: "); if (state.getPriorityPlayerId() != null) { sb.append(game.getPlayer(state.getPriorityPlayerId()).getName()); } else { sb.append("noone!"); } - sb.append("
getRevealed: "); + sb.append("

getRevealed: "); sb.append(state.getRevealed()); sb.append("
getSpecialActions: "); sb.append(state.getSpecialActions()); @@ -1187,4 +1189,80 @@ public class GameController implements GameCallback { return sb.toString(); } + public String attemptToFixGame() { + if (game == null) { + return ""; + } + GameState state = game.getState(); + if (state == null) { + return ""; + } + StringBuilder sb = new StringBuilder(); + sb.append("
Game State:
"); + sb.append(state); + boolean fixedAlready = false; + + sb.append("
Active player is: "); + sb.append(game.getPlayer(state.getActivePlayerId()).getName()); + PassAbility pass = new PassAbility(); + if (game.getPlayer(state.getActivePlayerId()).hasLeft()) { + Phase currentPhase = game.getPhase(); + if (currentPhase != null) { + currentPhase.getStep().skipStep(game, state.getActivePlayerId()); + sb.append("
Forcibly passing the phase!"); + fixedAlready = true; + } else { + sb.append("
Current phase null"); + } + sb.append("
Active player has left"); + } + + sb.append("
getChoosingPlayerId: "); + if (state.getChoosingPlayerId() != null) { + if (game.getPlayer(state.getChoosingPlayerId()).hasLeft()) { + Phase currentPhase = game.getPhase(); + if (currentPhase != null && !fixedAlready) { + currentPhase.getStep().endStep(game, state.getActivePlayerId()); + fixedAlready = true; + sb.append("
Forcibly passing the phase!"); + } else if (currentPhase == null) { + sb.append("
Current phase null"); + } + sb.append("
Choosing player has left"); + } + } + + sb.append("
Player with Priority is: "); + if (state.getPriorityPlayerId() != null) { + if (game.getPlayer(state.getPriorityPlayerId()).hasLeft()) { + Phase currentPhase = game.getPhase(); + if (currentPhase != null && !fixedAlready) { + currentPhase.getStep().skipStep(game, state.getActivePlayerId()); + fixedAlready = true; + sb.append("
Forcibly passing the phase!"); + } + } + sb.append(game.getPlayer(state.getPriorityPlayerId()).getName()); + sb.append("
"); + } + + sb.append("
Future Timeout:"); + if (futureTimeout != null) { + sb.append("Cancelled?="); + sb.append(futureTimeout.isCancelled()); + sb.append(",,,Done?="); + sb.append(futureTimeout.isDone()); + sb.append(",,,GetDelay?="); + sb.append((int) futureTimeout.getDelay(TimeUnit.SECONDS)); + if ((int) futureTimeout.getDelay(TimeUnit.SECONDS) < 25) { + game.endTurn(pass); + sb.append("
Forcibly passing the turn!"); + } + } else { + sb.append("Not using future Timeout!"); + } + sb.append("
"); + return sb.toString(); + } + }