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();
+ }
+
}