diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index cbf2909ca3d..87dc8b40702 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -526,7 +526,13 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } catch (PropertyVetoException ex) {} } - public static boolean connect(Connection connection) { + public void showTableWaitingDialog(UUID roomId, UUID tableId, boolean isTournament) { + TableWaitingDialog tableWaitingDialog = new TableWaitingDialog(); + desktopPane.add(tableWaitingDialog, JLayeredPane.MODAL_LAYER); + tableWaitingDialog.showDialog(roomId, tableId, isTournament); + } + + public static boolean connect(Connection connection) { return session.connect(connection); } @@ -776,7 +782,12 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { }//GEN-LAST:event_btnPreferencesActionPerformed public void exitApp() { - session.disconnect(false); + if (session.isConnected()) { + if (JOptionPane.showConfirmDialog(this, "You are currently connected. Are you sure you want to disconnect?", "Confirm disconnect", JOptionPane.YES_NO_OPTION) != JOptionPane.YES_OPTION) { + return; + } + session.disconnect(false); + } Plugins.getInstance().shutdown(); dispose(); System.exit(0); 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 e96165f012e..819537c8384 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -105,6 +105,10 @@ public class CallbackClientImpl implements CallbackClient { } } } + else if (callback.getMethod().equals("joinedTable")) { + TableClientMessage message = (TableClientMessage) callback.getData(); + joinedTable(message.getRoomId(), message.getTableId(), message.getFlag()); + } else if (callback.getMethod().equals("replayInit")) { GamePanel panel = frame.getGame(callback.getObjectId()); if (panel != null) @@ -264,6 +268,15 @@ public class CallbackClientImpl implements CallbackClient { return clientId; } + private void joinedTable(UUID roomId, UUID tableId, boolean isTournament) { + try { + frame.showTableWaitingDialog(roomId, tableId, isTournament); + } + catch (Exception ex) { + handleException(ex); + } + } + protected void gameStarted(final UUID gameId, final UUID playerId) { try { frame.showGame(gameId, playerId); diff --git a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java index c6b61b38a39..628d7b5ab70 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -133,15 +133,11 @@ public class TablesPanel extends javax.swing.JPanel { } if (isTournament) { logger.info("Joining tournament " + tableId); - if (session.joinTournamentTable(roomId, tableId, session.getUserName(), "Human", 1)) { - showTableWaitingDialog(roomId, tableId, true); - } + session.joinTournamentTable(roomId, tableId, session.getUserName(), "Human", 1); } else { logger.info("Joining table " + tableId); joinTableDialog.showDialog(roomId, tableId); - if (joinTableDialog.isJoined()) - showTableWaitingDialog(roomId, tableId, false); } } else if (state.equals("Watch")) { logger.info("Watching table " + tableId); @@ -264,12 +260,6 @@ public class TablesPanel extends javax.swing.JPanel { if (c != null) ((TablesPane)c).hideFrame(); } - - private void showTableWaitingDialog(UUID roomId, UUID tableId, boolean isTournament) { - TableWaitingDialog tableWaitingDialog = new TableWaitingDialog(); - MageFrame.getDesktop().add(tableWaitingDialog, JLayeredPane.MODAL_LAYER); - tableWaitingDialog.showDialog(roomId, tableId, isTournament); - } /** This method is called from within the constructor to * initialize the form. @@ -418,9 +408,6 @@ public class TablesPanel extends javax.swing.JPanel { private void btnNewTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTournamentActionPerformed newTournamentDialog.showDialog(roomId); - if (newTournamentDialog.getTable() != null) { - showTableWaitingDialog(roomId, newTournamentDialog.getTable().getTableId(), true); - } }//GEN-LAST:event_btnNewTournamentActionPerformed private void btnQuickStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuickStartActionPerformed @@ -444,9 +431,6 @@ public class TablesPanel extends javax.swing.JPanel { private void btnNewTableActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnNewTableActionPerformed newTableDialog.showDialog(roomId); - if (newTableDialog.getTable() != null) { - showTableWaitingDialog(roomId, newTableDialog.getTable().getTableId(), false); - } }//GEN-LAST:event_btnNewTableActionPerformed private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed diff --git a/Mage.Common/src/mage/view/TableClientMessage.java b/Mage.Common/src/mage/view/TableClientMessage.java index 12b1b4863d6..8c8e6cd3630 100644 --- a/Mage.Common/src/mage/view/TableClientMessage.java +++ b/Mage.Common/src/mage/view/TableClientMessage.java @@ -31,7 +31,6 @@ package mage.view; import java.io.Serializable; import java.util.UUID; -import mage.cards.Card; import mage.cards.decks.Deck; /** @@ -42,10 +41,12 @@ public class TableClientMessage implements Serializable { private static final long serialVersionUID = 1L; private DeckView deck; + private UUID roomId; private UUID tableId; private UUID gameId; private UUID playerId; private int time; + private boolean flag; public TableClientMessage(Deck deck, UUID tableId, int time) { this.deck = new DeckView(deck); @@ -58,7 +59,13 @@ public class TableClientMessage implements Serializable { this.playerId = playerId; } - public DeckView getDeck() { + public TableClientMessage(UUID roomId, UUID tableId, boolean flag) { + this.roomId = roomId; + this.tableId = tableId; + this.flag = flag; + } + + public DeckView getDeck() { return deck; } @@ -66,7 +73,11 @@ public class TableClientMessage implements Serializable { return tableId; } - public UUID getGameId() { + public UUID getRoomId() { + return roomId; + } + + public UUID getGameId() { return gameId; } @@ -77,6 +88,10 @@ public class TableClientMessage implements Serializable { public int getTime() { return time; } + + public boolean getFlag() { + return flag; + } public void cleanUp() { diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index a16c7738536..a9d6813d029 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -136,6 +136,9 @@ public class TableController { Player player = createPlayer(name, seat.getPlayerType(), skill); tournament.addPlayer(player, seat.getPlayerType()); table.joinTable(player, seat); + User user = UserManager.getInstance().getUser(userId); + user.addTable(player.getId(), table); + user.joinedTable(table.getRoomId(), table.getId(), true); logger.info("player joined " + player.getId()); //only add human players to sessionPlayerMap if (seat.getPlayer().isHuman()) { @@ -161,6 +164,9 @@ public class TableController { Player player = createPlayer(name, seat.getPlayerType(), skill); match.addPlayer(player, deck); table.joinTable(player, seat); + User user = UserManager.getInstance().getUser(userId); + user.addTable(player.getId(), table); + user.joinedTable(table.getRoomId(), table.getId(), false); logger.info("player joined " + player.getId()); //only add human players to sessionPlayerMap if (seat.getPlayer().isHuman()) { diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index bc53955d85a..309e9b1df9f 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -33,6 +33,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.UUID; import mage.cards.decks.Deck; +import mage.game.Table; import mage.interfaces.callback.ClientCallback; import mage.server.draft.DraftSession; import mage.server.game.GameManager; @@ -57,6 +58,7 @@ public class User { private Date connectionTime = new Date(); private Date lastActivity = new Date(); private UserState userState; + private Map tables = new HashMap(); private Map gameSessions = new HashMap(); private Map draftSessions = new HashMap(); private Map tournamentSessions = new HashMap(); @@ -110,6 +112,10 @@ public class User { } } + public void joinedTable(final UUID roomId, final UUID tableId, boolean isTournament) { + fireCallback(new ClientCallback("joinedTable", tableId, new TableClientMessage(roomId, tableId, isTournament))); + } + public void gameStarted(final UUID gameId, final UUID playerId) { fireCallback(new ClientCallback("startGame", gameId, new TableClientMessage(gameId, playerId))); } @@ -178,6 +184,9 @@ public class User { entry.getValue().init(); entry.getValue().update(); } + for (Entry entry: tables.entrySet()) { + joinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament()); + } } public void addGame(UUID playerId, GameSession gameSession) { @@ -204,15 +213,29 @@ public class User { tournamentSessions.remove(playerId); } + public void addTable(UUID playerId, Table table) { + tables.put(playerId, table); + } + + public void removeTable(UUID playerId) { + tables.remove(playerId); + } + public void kill() { - for (Entry entry: gameSessions.entrySet()) { - entry.getValue().kill(); + for (GameSession session: gameSessions.values()) { + session.kill(); } - for (Entry entry: draftSessions.entrySet()) { - entry.getValue().setKilled(); + for (DraftSession session: draftSessions.values()) { + session.setKilled(); } - for (Entry entry: tournamentSessions.entrySet()) { - entry.getValue().setKilled(); + for (TournamentSession session: tournamentSessions.values()) { + session.setKilled(); + } + for (Entry entry: tables.entrySet()) { + entry.getValue().leaveTable(entry.getKey()); + if (TableManager.getInstance().isTableOwner(entry.getValue().getId(), userId)) { + TableManager.getInstance().removeTable(userId, entry.getValue().getId()); + } } } diff --git a/Mage/src/mage/game/Table.java b/Mage/src/mage/game/Table.java index a6452a9a772..7a7528fc3a6 100644 --- a/Mage/src/mage/game/Table.java +++ b/Mage/src/mage/game/Table.java @@ -172,7 +172,8 @@ public class Table implements Serializable { public void leaveTable(UUID playerId) { for (int i = 0; i < numSeats; i++ ) { - if (seats[i].getPlayer().getId().equals(playerId)) { + Player player = seats[i].getPlayer(); + if (player != null && player.getId().equals(playerId)) { seats[i].setPlayer(null); if (state == TableState.STARTING) state = TableState.WAITING;