From 42364f7e27bd4ceddedbc22edabd95dc6e06276c Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Sat, 13 Feb 2021 14:54:13 +0400 Subject: [PATCH] Server: fixed NPE error on wrong AI usage in new game dialogs (fixes #7556); --- .../java/mage/client/cards/ICardGrid.java | 4 +-- .../mage/client/deckeditor/CardSelector.java | 2 +- .../mage/client/dialog/NewTableDialog.java | 24 ++++++++++------- .../client/dialog/NewTournamentDialog.java | 26 ++++++++++++------- .../client/remote/CallbackClientImpl.java | 2 +- 5 files changed, 34 insertions(+), 24 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/cards/ICardGrid.java b/Mage.Client/src/main/java/mage/client/cards/ICardGrid.java index ccccb661b3..99b1f9cee6 100644 --- a/Mage.Client/src/main/java/mage/client/cards/ICardGrid.java +++ b/Mage.Client/src/main/java/mage/client/cards/ICardGrid.java @@ -30,7 +30,7 @@ public interface ICardGrid { // only for debug, return inner cards list Object getCardsStore(); - // specil memory optimization to clean inner cards list before new cards load, so you don't need 2x memory - // WARNING, you must call it in same code as new cards list prepare + // special memory optimization to clean inner cards list before new cards load, so you don't need 2x memory + // WARNING, you must call it in the same code as new cards list prepare void clearCardsStoreBeforeUpdate(); } diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java index ab0b7b23cc..1ec5c73159 100644 --- a/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java +++ b/Mage.Client/src/main/java/mage/client/deckeditor/CardSelector.java @@ -471,7 +471,7 @@ public class CardSelector extends javax.swing.JPanel implements ComponentListene private void debugObjectMemorySize(String name, Object object) { // just debug code, don't use it in production - // need 2x memory for find a size + // need 2x memory to find a size try { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java index 454becb0dd..4f2167c5fb 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java @@ -522,6 +522,19 @@ public class NewTableDialog extends MageDialog { return; } try { + // join AI + for (TablePlayerPanel player : players) { + if (player.getPlayerType() != PlayerType.HUMAN) { + if (!player.joinTable(roomId, table.getTableId())) { + // error message must be send by the server + SessionHandler.removeTable(roomId, table.getTableId()); + table = null; + return; + } + } + } + + // join itself if (SessionHandler.joinTable( roomId, table.getTableId(), @@ -529,16 +542,7 @@ public class NewTableDialog extends MageDialog { PlayerType.HUMAN, 1, DeckImporter.importDeckFromFile(this.player1Panel.getDeckFile(), true), this.txtPassword.getText())) { - for (TablePlayerPanel player : players) { - if (player.getPlayerType() != PlayerType.HUMAN) { - if (!player.joinTable(roomId, table.getTableId())) { - // error message must be send by the server - SessionHandler.removeTable(roomId, table.getTableId()); - table = null; - return; - } - } - } + // all fine, can close create dialog (join dialog will be opened after feedback from server) this.hideDialog(); return; } diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java index bc884ff57d..65c0a4d002 100644 --- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java +++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java @@ -692,6 +692,20 @@ public class NewTournamentDialog extends MageDialog { // message must be send by server! return; } + + // join AI + for (TournamentPlayerPanel player : players) { + if (player.getPlayerType().getSelectedItem() != PlayerType.HUMAN) { + if (!player.joinTournamentTable(roomId, table.getTableId(), DeckImporter.importDeckFromFile(this.player1Panel.getDeckFile(), true))) { + // error message must be send by sever + SessionHandler.removeTable(roomId, table.getTableId()); + table = null; + return; + } + } + } + + // join itself if (SessionHandler.joinTournamentTable( roomId, table.getTableId(), @@ -699,19 +713,11 @@ public class NewTournamentDialog extends MageDialog { PlayerType.HUMAN, 1, DeckImporter.importDeckFromFile(this.player1Panel.getDeckFile(), true), tOptions.getPassword())) { - for (TournamentPlayerPanel player : players) { - if (player.getPlayerType().getSelectedItem() != PlayerType.HUMAN) { - if (!player.joinTournamentTable(roomId, table.getTableId(), DeckImporter.importDeckFromFile(this.player1Panel.getDeckFile(), true))) { - // error message must be send by sever - SessionHandler.removeTable(roomId, table.getTableId()); - table = null; - return; - } - } - } + // all fine, can close create dialog (join dialog will be opened after feedback from server) this.hideDialog(); return; } + JOptionPane.showMessageDialog(MageFrame.getDesktop(), "Error joining tournament.", "Error", JOptionPane.ERROR_MESSAGE); SessionHandler.removeTable(roomId, table.getTableId()); table = null; 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 7a12eda92e..aeeb3fd273 100644 --- a/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java +++ b/Mage.Client/src/main/java/mage/client/remote/CallbackClientImpl.java @@ -608,7 +608,7 @@ public class CallbackClientImpl implements CallbackClient { logger.fatal("Client error\n", ex); String errorMessage = ex.getMessage(); if (errorMessage == null || errorMessage.isEmpty() || errorMessage.equals("Null")) { - errorMessage = ex.getClass().getSimpleName() + " - look server logs for more details"; + errorMessage = ex.getClass().getSimpleName() + " - look server or client logs for more details"; } frame.showError("Server's error: " + errorMessage); }