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 450f0fbe050..b0071b206d7 100644
--- a/Mage.Server/src/main/java/mage/server/game/GameController.java
+++ b/Mage.Server/src/main/java/mage/server/game/GameController.java
@@ -1,13 +1,5 @@
package mage.server.game;
-import java.io.*;
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.concurrent.*;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.zip.GZIPOutputStream;
import mage.MageException;
import mage.abilities.Ability;
import mage.abilities.common.PassAbility;
@@ -21,11 +13,7 @@ import mage.choices.Choice;
import mage.constants.ManaType;
import mage.constants.PlayerAction;
import mage.constants.Zone;
-import mage.game.Game;
-import mage.game.GameException;
-import mage.game.GameOptions;
-import mage.game.GameState;
-import mage.game.Table;
+import mage.game.*;
import mage.game.command.Plane;
import mage.game.events.Listener;
import mage.game.events.PlayerQueryEvent;
@@ -47,6 +35,15 @@ import mage.view.ChatMessage.MessageColor;
import mage.view.ChatMessage.MessageType;
import org.apache.log4j.Logger;
+import java.io.*;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.*;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.zip.GZIPOutputStream;
+
/**
* @author BetaSteward_at_googlemail.com
*/
@@ -1172,7 +1169,13 @@ public class GameController implements GameCallback {
return sb.toString();
}
+ private String getName(Player player) {
+ return player != null ? player.getName() : "-";
+ }
+
public String attemptToFixGame() {
+ // try to fix disconnects
+
if (game == null) {
return "";
}
@@ -1185,15 +1188,14 @@ public class GameController implements GameCallback {
sb.append(state);
boolean fixedAlready = false;
- sb.append("
Active player is: ");
- sb.append(game.getPlayer(state.getActivePlayerId()).getName());
+ Player activePlayer = game.getPlayer(state.getActivePlayerId());
+
+ // fix active
+ sb.append("
Checking active player: " + getName(activePlayer));
+ if (activePlayer != null && activePlayer.hasLeft()) {
+ sb.append("
Found disconnected player! Concede...");
+ activePlayer.concede(game);
- PassAbility pass = new PassAbility();
- if (game.getPlayer(state.getActivePlayerId()).hasLeft()) {
- Player p = game.getPlayer(state.getActivePlayerId());
- if (p != null) {
- p.concede(game);
- }
Phase currentPhase = game.getPhase();
if (currentPhase != null) {
currentPhase.getStep().skipStep(game, state.getActivePlayerId());
@@ -1205,9 +1207,11 @@ public class GameController implements GameCallback {
sb.append("
Active player has left");
}
- sb.append("
getChoosingPlayerId: ");
+ // fix lost choosing dialog
+ sb.append("
Checking choosing player: " + getName(game.getPlayer(state.getChoosingPlayerId())));
if (state.getChoosingPlayerId() != null) {
if (game.getPlayer(state.getChoosingPlayerId()).hasLeft()) {
+ sb.append("
Found disconnected player! Concede...");
Player p = game.getPlayer(state.getChoosingPlayerId());
if (p != null) {
p.concede(game);
@@ -1224,9 +1228,11 @@ public class GameController implements GameCallback {
}
}
- sb.append("
Player with Priority is: ");
+ // fix lost priority
+ sb.append("
Checking priority player: " + getName(game.getPlayer(state.getPriorityPlayerId())));
if (state.getPriorityPlayerId() != null) {
- if (game.getPlayer(state.getPriorityPlayerId()).hasLeft()) {
+ if (game.getPlayer(state.getPriorityPlayerId()).hasLeft()) {
+ sb.append("
Found disconnected player! Concede...");
Player p = game.getPlayer(state.getPriorityPlayerId());
if (p != null) {
p.concede(game);
@@ -1242,7 +1248,8 @@ public class GameController implements GameCallback {
sb.append("");
}
- sb.append("
Future Timeout:");
+ // fix timeout
+ sb.append("
Checking Future Timeout: ");
if (futureTimeout != null) {
sb.append("Cancelled?=");
sb.append(futureTimeout.isCancelled());
@@ -1251,6 +1258,7 @@ public class GameController implements GameCallback {
sb.append(",,,GetDelay?=");
sb.append((int) futureTimeout.getDelay(TimeUnit.SECONDS));
if ((int) futureTimeout.getDelay(TimeUnit.SECONDS) < 25) {
+ PassAbility pass = new PassAbility();
game.endTurn(pass);
sb.append("
Forcibly passing the turn!");
}
@@ -1260,5 +1268,4 @@ public class GameController implements GameCallback {
sb.append("");
return sb.toString();
}
-
}