diff --git a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java index 0d31bc130c8..5779c881af3 100644 --- a/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/BattlefieldPanel.java @@ -34,6 +34,24 @@ package mage.client.game; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Rectangle; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.UUID; +import javax.swing.JComponent; +import javax.swing.JLayeredPane; +import javax.swing.JScrollPane; +import javax.swing.border.Border; +import javax.swing.border.EmptyBorder; import mage.cards.MagePermanent; import mage.client.cards.BigCard; import mage.client.cards.Permanent; @@ -43,16 +61,6 @@ import mage.client.util.Config; import mage.constants.CardType; import mage.view.PermanentView; -import javax.swing.*; -import javax.swing.border.Border; -import javax.swing.border.EmptyBorder; -import java.awt.*; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; -import java.util.*; -import java.util.List; -import java.util.Map.Entry; - /** * * @author BetaSteward_at_googlemail.com @@ -103,6 +111,11 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { } public void cleanUp() { + for (Component c: this.jPanel.getComponents()) { + if (c instanceof Permanent || c instanceof MagePermanent) { + this.jPanel.remove(c); + } + } permanents.clear(); Plugins.getInstance().sortPermanents(uiComponentsList, permanents.values()); } @@ -225,7 +238,9 @@ public class BattlefieldPanel extends javax.swing.JLayeredPane { private void groupAttachments(PermanentView permanent) { MagePermanent perm = permanents.get(permanent.getId()); - if (perm == null) return; + if (perm == null) { + return; + } int position = getPosition(perm); perm.getLinks().clear(); Rectangle r = perm.getBounds(); diff --git a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java index 9d191156808..bcaa9d642f0 100644 --- a/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/FeedbackPanel.java @@ -136,8 +136,8 @@ public class FeedbackPanel extends javax.swing.JPanel { case END: this.btnLeft.setVisible(false); this.btnRight.setVisible(true); - this.btnRight.setText("OK"); - this.helper.setState("", false, "OK", true); + this.btnRight.setText("Close game"); + this.helper.setState("", false, "Close game", true); ArrowBuilder.getBuilder().removeAllArrows(gameId); endWithTimeout(); break; @@ -283,7 +283,10 @@ public class FeedbackPanel extends javax.swing.JPanel { if (mode == FeedbackMode.SELECT && (evt.getModifiers() & ActionEvent.CTRL_MASK) == ActionEvent.CTRL_MASK) { session.sendPlayerInteger(gameId, 0); } else if (mode == FeedbackMode.END) { - MageFrame.getGame(gameId).hideGame(); + GamePanel gamePanel = MageFrame.getGame(gameId); + if (gamePanel != null) { + gamePanel.removeGame(); + } } else { session.sendPlayerBoolean(gameId, false); } diff --git a/Mage.Client/src/main/java/mage/client/game/GamePane.java b/Mage.Client/src/main/java/mage/client/game/GamePane.java index 6a278bb302f..20299340811 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePane.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePane.java @@ -69,8 +69,7 @@ public class GamePane extends MagePane { gamePanel.cleanUp(); } - public void hideGame() { - KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner(); + public void removeGame() { this.cleanUp(); this.removeFrame(); } diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 5606d29d036..d2ad689add4 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -335,7 +335,7 @@ public final class GamePanel extends javax.swing.JPanel { this.gameChatPanel.clear(); this.gameChatPanel.connect(session.getGameChatId(gameId)); if (!session.joinGame(gameId)) { - hideGame(); + removeGame(); } } @@ -354,7 +354,7 @@ public final class GamePanel extends javax.swing.JPanel { this.gameChatPanel.clear(); this.gameChatPanel.connect(session.getGameChatId(gameId)); if (!session.watchGame(gameId)) { - hideGame(); + removeGame(); } for (PlayAreaPanel panel : getPlayers().values()) { panel.setPlayingMode(false); @@ -375,7 +375,7 @@ public final class GamePanel extends javax.swing.JPanel { this.pnlReplay.setVisible(true); this.gameChatPanel.clear(); if (!session.startReplay(gameId)) { - hideGame(); + removeGame(); } for (PlayAreaPanel panel : getPlayers().values()) { panel.setPlayingMode(false); @@ -385,13 +385,13 @@ public final class GamePanel extends javax.swing.JPanel { /** * Closes the game and it's resources */ - public void hideGame() { + public void removeGame() { Component c = this.getParent(); while (c != null && !(c instanceof GamePane)) { c = c.getParent(); } if (c != null) { - ((GamePane)c).hideGame(); + ((GamePane)c).removeGame(); } } @@ -1328,7 +1328,7 @@ public final class GamePanel extends javax.swing.JPanel { private void btnStopWatchingActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStopWatchingActionPerformed if (modalQuestion("Are you sure you want to stop watching?", "Stop watching") == JOptionPane.YES_OPTION) { session.stopWatching(gameId); - this.hideGame(); + this.removeGame(); } }//GEN-LAST:event_btnStopWatchingActionPerformed @@ -1451,8 +1451,8 @@ public final class GamePanel extends javax.swing.JPanel { } class ReplayTask extends SwingWorker> { - private Session session; - private UUID gameId; + private final Session session; + private final UUID gameId; private static final Logger logger = Logger.getLogger(ReplayTask.class); diff --git a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java index 62f34bfe7e3..8bc124da473 100644 --- a/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java +++ b/Mage.Client/src/main/java/mage/client/game/PlayAreaPanel.java @@ -66,7 +66,8 @@ public class PlayAreaPanel extends javax.swing.JPanel { public static final int PANEL_HEIGHT = 242; public static final int PANEL_HEIGHT_SMALL = 190; - /** Creates new form PlayAreaPanel */ + /** Creates new form PlayAreaPanel + * @param isPlayer */ public PlayAreaPanel(boolean isPlayer) { initComponents(); setOpaque(false); @@ -225,7 +226,7 @@ public class PlayAreaPanel extends javax.swing.JPanel { public void actionPerformed(ActionEvent e) { if (JOptionPane.showConfirmDialog(PlayAreaPanel.this, "Are you sure you want to stop watching the game?", "Confirm stop watching game", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { gamePanel.getSession().stopWatching(gameId); - gamePanel.hideGame(); + gamePanel.removeGame(); } } }); diff --git a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java index 35c279526ca..a2479d6f98b 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -64,10 +64,11 @@ import org.apache.log4j.Logger; public class CallbackClientImpl implements CallbackClient { private static final Logger logger = Logger.getLogger(CallbackClientImpl.class); - private UUID clientId; - private MageFrame frame; + private final UUID clientId; + private final MageFrame frame; private int messageId = 0; - private boolean firstRun; + private int gameInformMessageId = 0; + private final boolean firstRun; public CallbackClientImpl(MageFrame frame) { this.clientId = UUID.randomUUID(); @@ -165,7 +166,7 @@ public class CallbackClientImpl implements CallbackClient { } } else if (callback.getMethod().equals("gameOver")) { GamePanel panel = MageFrame.getGame(callback.getObjectId()); - if (panel != null) { + if (panel != null) { panel.endMessage((String) callback.getData(), callback.getMessageId()); } } else if (callback.getMethod().equals("gameError")) { @@ -238,15 +239,18 @@ public class CallbackClientImpl implements CallbackClient { } } else if (callback.getMethod().equals("gameInform")) { - if (callback.getMessageId() > messageId) { + if (callback.getMessageId() > gameInformMessageId) { GameClientMessage message = (GameClientMessage) callback.getData(); GamePanel panel = MageFrame.getGame(callback.getObjectId()); if (panel != null) { panel.inform(message.getMessage(), message.getGameView(), callback.getMessageId()); } } else { - logger.warn("message out of sequence - ignoring"); + logger.warn(new StringBuilder("message out of sequence - ignoring").append("MessageId = ").append(callback.getMessageId()).append(" method = ").append(callback.getMethod())); + //logger.warn("message out of sequence - ignoring"); } + + gameInformMessageId = messageId; } else if (callback.getMethod().equals("gameInformPersonal")) { GameClientMessage message = (GameClientMessage) callback.getData(); GamePanel panel = MageFrame.getGame(callback.getObjectId()); diff --git a/Mage.Server/src/main/java/mage/server/draft/DraftSession.java b/Mage.Server/src/main/java/mage/server/draft/DraftSession.java index ca1337eda39..09bd6b9aebc 100644 --- a/Mage.Server/src/main/java/mage/server/draft/DraftSession.java +++ b/Mage.Server/src/main/java/mage/server/draft/DraftSession.java @@ -88,6 +88,8 @@ public class DraftSession { } } + // not used + // public void inform(final String message) { if (!killed) { User user = UserManager.getInstance().getUser(userId); 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 474d8bd5719..23989143794 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameController.java +++ b/Mage.Server/src/main/java/mage/server/game/GameController.java @@ -689,6 +689,7 @@ public class GameController implements GameCallback { @Override public void gameResult(String result) { try { + logger.warn("Game Result: " + result); endGame(result); } catch (MageException ex) { logger.fatal("Game Result error", ex); diff --git a/Mage.Server/src/main/java/mage/server/game/GameWatcher.java b/Mage.Server/src/main/java/mage/server/game/GameWatcher.java index cb60c5a8936..6a96c534a84 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWatcher.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWatcher.java @@ -38,6 +38,7 @@ import org.apache.log4j.Logger; import java.rmi.RemoteException; import java.util.UUID; +import mage.game.GameState; import mage.game.match.Match; import mage.view.GameEndView; @@ -75,7 +76,16 @@ public class GameWatcher { if (!killed) { User user = UserManager.getInstance().getUser(userId); if (user != null) { - user.fireCallback(new ClientCallback("gameUpdate", game.getId(), getGameView())); + logger.warn("before gameUpdate"); + GameView gameView = getGameView(); + logger.warn("after View"); + UUID id = game.getId(); + logger.warn("after ID"); + ClientCallback clientCallback = new ClientCallback("gameUpdate", id, gameView); + logger.warn("callback obj"); + user.fireCallback(clientCallback); + // user.fireCallback(new ClientCallback("gameUpdate", game.getId(), getGameView())); + logger.warn("after gameUpdate"); } } } @@ -126,7 +136,13 @@ public class GameWatcher { } public GameView getGameView() { - return new GameView(game.getState(), game, this.isPlayer); + logger.warn("start getGameView"); + GameState gameState = game.getState(); + logger.warn("start afterState"); + GameView gameView = new GameView(gameState, game, this.isPlayer); + // return new GameView(game.getState(), game, this.isPlayer); + logger.warn("after getGameView"); + return gameView; } public GameEndView getGameEndView(UUID playerId, Match match) { diff --git a/Mage.Server/src/main/java/mage/server/game/GameWorker.java b/Mage.Server/src/main/java/mage/server/game/GameWorker.java index 7a66ff38e16..fd08923b0cd 100644 --- a/Mage.Server/src/main/java/mage/server/game/GameWorker.java +++ b/Mage.Server/src/main/java/mage/server/game/GameWorker.java @@ -59,6 +59,7 @@ public class GameWorker implements Callable { game.start(choosingPlayerId); game.fireUpdatePlayersEvent(); result.gameResult(game.getWinner()); + game.cleanUp(); } catch (MageException ex) { logger.fatal("GameWorker error ", ex); } diff --git a/Mage/src/mage/game/Game.java b/Mage/src/mage/game/Game.java index 5a475ebe9e2..efe43b6adeb 100644 --- a/Mage/src/mage/game/Game.java +++ b/Mage/src/mage/game/Game.java @@ -188,6 +188,7 @@ public interface Game extends MageItem, Serializable { void pause(); boolean isPaused(); void end(); + void cleanUp(); /* * Gives back the number of cards the player has after the next mulligan */ diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index c9814b46473..e6e19f9d474 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -549,6 +549,11 @@ public abstract class GameImpl> implements Game, Serializa start(choosingPlayerId, this.gameOptions != null ? gameOptions : GameOptions.getDefault()); } + @Override + public void cleanUp() { + gameCards.clear(); + } + @Override public void start(UUID choosingPlayerId, GameOptions options) { startTime = new Date(); @@ -815,8 +820,6 @@ public abstract class GameImpl> implements Game, Serializa for (Player player: state.getPlayers().values()) { player.abort(); } - // allow gc - gameCards.clear(); } } diff --git a/Mage/src/mage/game/turn/Step.java b/Mage/src/mage/game/turn/Step.java index 3cd53a79a2f..6e1bf500ac2 100644 --- a/Mage/src/mage/game/turn/Step.java +++ b/Mage/src/mage/game/turn/Step.java @@ -38,11 +38,12 @@ import mage.game.events.GameEvent.EventType; /** * * @author BetaSteward_at_googlemail.com + * @param */ public abstract class Step> implements Serializable { - private PhaseStep type; - private boolean hasPriority; + private final PhaseStep type; + private final boolean hasPriority; protected EventType stepEvent; protected EventType preStepEvent; protected EventType postStepEvent; @@ -81,7 +82,7 @@ public abstract class Step> implements Serializable { stepPart = StepPart.PRE; } - public void priority(Game game, UUID activePlayerId, boolean resuming) { + public void priority(Game game, UUID activePlayerId, boolean resuming) { if (hasPriority) { stepPart = StepPart.PRIORITY; game.playPriority(activePlayerId, resuming);