diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java
index 5f763a24630..b093d29e3d8 100644
--- a/Mage.Client/src/main/java/mage/client/MageFrame.java
+++ b/Mage.Client/src/main/java/mage/client/MageFrame.java
@@ -242,8 +242,10 @@ public class MageFrame extends javax.swing.JFrame {
public void run() {
if (autoConnect())
enableButtons();
- else
+ else {
disableButtons();
+ connectDialog.showDialog();
+ }
}
});
}
diff --git a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
index 2d07be8423d..c71b096efa8 100644
--- a/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
+++ b/Mage.Client/src/main/java/mage/client/deckeditor/DeckEditorPanel.java
@@ -449,8 +449,8 @@ public class DeckEditorPanel extends javax.swing.JPanel {
}//GEN-LAST:event_btnImportActionPerformed
private void btnSubmitActionPerformed(java.awt.event.ActionEvent evt) {
- MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists());
- this.setVisible(false);
+ if (MageFrame.getSession().submitDeck(tableId, deck.getDeckCardLists()))
+ this.setVisible(false);
}
private void btnAddLandActionPerformed(java.awt.event.ActionEvent evt) {
diff --git a/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java b/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java
index 8b7fe1c5e7e..f86b64a96fb 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/JoinTableDialog.java
@@ -40,9 +40,7 @@ import java.util.UUID;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
-import mage.cards.decks.DeckCardLists;
import mage.client.remote.Session;
-import mage.client.util.PhaseManager;
import mage.sets.Sets;
import mage.util.Logging;
@@ -138,7 +136,7 @@ public class JoinTableDialog extends MageDialog {
private void btnOKActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnOKActionPerformed
Session session = MageFrame.getSession();
try {
- joined = session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), Sets.loadDeck(this.newPlayerPanel.getDeckFile()));
+ joined = session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), "Human", Sets.loadDeck(this.newPlayerPanel.getDeckFile()));
} catch (Exception ex) {
handleError(ex);
}
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 557e4ea3420..d571f61504a 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTableDialog.java
@@ -310,7 +310,7 @@ public class NewTableDialog extends MageDialog {
options.setWinsNeeded((Integer)this.spnNumWins.getValue());
table = session.createTable(roomId, options);
try {
- if (session.joinTable(roomId, table.getTableId(), this.player1Panel.getPlayerName(), Sets.loadDeck(this.player1Panel.getDeckFile()))) {
+ if (session.joinTable(roomId, table.getTableId(), this.player1Panel.getPlayerName(), "Human", Sets.loadDeck(this.player1Panel.getDeckFile()))) {
for (TablePlayerPanel player: players) {
if (!player.getPlayerType().equals("Human")) {
if (!player.joinTable(roomId, table.getTableId())) {
diff --git a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
index 3c78b2e9f4a..aced948c775 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.form
@@ -59,7 +59,7 @@
-
+
@@ -164,7 +164,7 @@
-
+
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 b6b2547960a..f80cbf3c449 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/NewTournamentDialog.java
@@ -259,7 +259,7 @@ public class NewTournamentDialog extends MageDialog {
tOptions.getMatchOptions().setAttackOption(MultiplayerAttackOption.LEFT);
tOptions.getMatchOptions().setRange(RangeOfInfluence.ALL);
table = session.createTournamentTable(roomId, tOptions);
- if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText())) {
+ if (session.joinTournamentTable(roomId, table.getTableId(), this.txtPlayer1Name.getText(), "Human")) {
for (TournamentPlayerPanel player: players) {
if (!player.getPlayerType().equals("Human")) {
if (!player.joinTournamentTable(roomId, table.getTableId())) {
diff --git a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
index b6702db2779..218f9bc2f2b 100644
--- a/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
+++ b/Mage.Client/src/main/java/mage/client/dialog/TableWaitingDialog.java
@@ -87,14 +87,14 @@ public class TableWaitingDialog extends MageDialog implements Observer {
this.btnMoveDown.setEnabled(true);
this.btnMoveUp.setEnabled(true);
break;
- case DUELING:
- closeDialog();
- return;
- default:
+ case WAITING:
this.btnStart.setEnabled(false);
this.btnMoveDown.setEnabled(false);
this.btnMoveUp.setEnabled(false);
break;
+ default:
+ closeDialog();
+ return;
}
int row = this.tableSeats.getSelectedRow();
tableWaitModel.loadData(table);
diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form
index e6efee9f264..97a1ed3ecff 100644
--- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form
+++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form
@@ -89,6 +89,11 @@
+
+
+
+
+
@@ -119,7 +124,9 @@
-
+
+
+
@@ -192,6 +199,11 @@
+
+
+
+
+
diff --git a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
index 65f0759fbd9..cdb949e5b4f 100644
--- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
+++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java
@@ -56,6 +56,7 @@ public class DraftPanel extends javax.swing.JPanel {
private Session session;
private Timer countdown;
private int timeout;
+ private boolean picked;
/** Creates new form DraftPanel */
public DraftPanel() {
@@ -103,12 +104,18 @@ public class DraftPanel extends javax.swing.JPanel {
@Override
public void event(Event event) {
if (event.getEventName().equals("pick-a-card")) {
- countdown.stop();
- session.sendCardPick(draftId, (UUID)event.getSource());
+ DraftPickView view = session.sendCardPick(draftId, (UUID)event.getSource());
+ if (view != null) {
+ draftBooster.loadBooster(view.getBooster(), bigCard);
+ draftPicks.loadCards(view.getPicks(), bigCard, null);
+ setMessage("Waiting for other players");
+ }
}
}
}
);
+ setMessage("");
+ countdown.stop();
this.timeout = draftPickView.getTimeout();
setTimeout(Integer.toString(timeout));
if (timeout != 0) {
@@ -129,6 +136,10 @@ public class DraftPanel extends javax.swing.JPanel {
c.setVisible(false);
}
+ protected void setMessage(String message) {
+ this.lblMessage.setText(message);
+ }
+
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
@@ -153,6 +164,7 @@ public class DraftPanel extends javax.swing.JPanel {
chkPack2 = new javax.swing.JCheckBox();
chkPack3 = new javax.swing.JCheckBox();
txtTimeRemaining = new javax.swing.JTextField();
+ lblMessage = new javax.swing.JLabel();
draftBooster = new mage.client.cards.DraftGrid();
draftPicks = new mage.client.cards.CardGrid();
@@ -183,6 +195,8 @@ public class DraftPanel extends javax.swing.JPanel {
txtTimeRemaining.setHorizontalAlignment(javax.swing.JTextField.CENTER);
txtTimeRemaining.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
+ lblMessage.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
+
javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
jPanel1.setLayout(jPanel1Layout);
jPanel1Layout.setHorizontalGroup(
@@ -214,6 +228,10 @@ public class DraftPanel extends javax.swing.JPanel {
.addComponent(chkPack3)
.addComponent(chkPack2)
.addComponent(chkPack1)))
+ .addGroup(jPanel1Layout.createSequentialGroup()
+ .addContainerGap()
+ .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 236, Short.MAX_VALUE)
+ .addContainerGap())
);
jPanel1Layout.setVerticalGroup(
jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@@ -239,7 +257,9 @@ public class DraftPanel extends javax.swing.JPanel {
.addComponent(txtCardNo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(txtTimeRemaining, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 41, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 29, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(bigCard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
);
@@ -290,6 +310,7 @@ public class DraftPanel extends javax.swing.JPanel {
private javax.swing.JPanel jPanel1;
private javax.swing.JSeparator jSeparator1;
private javax.swing.JLabel lblCardNo;
+ private javax.swing.JLabel lblMessage;
private javax.swing.JLabel lblPack1;
private javax.swing.JLabel lblPack2;
private javax.swing.JLabel lblPack3;
diff --git a/Mage.Client/src/main/java/mage/client/remote/Session.java b/Mage.Client/src/main/java/mage/client/remote/Session.java
index d8cecf86be7..202124dd8fd 100644
--- a/Mage.Client/src/main/java/mage/client/remote/Session.java
+++ b/Mage.Client/src/main/java/mage/client/remote/Session.java
@@ -56,6 +56,7 @@ import mage.interfaces.Server;
import mage.interfaces.ServerState;
import mage.interfaces.callback.CallbackClientDaemon;
import mage.util.Logging;
+import mage.view.DraftPickView;
import mage.view.GameTypeView;
import mage.view.TableView;
import mage.view.TournamentTypeView;
@@ -105,6 +106,7 @@ public class Session {
return true;
} catch (MageException ex) {
logger.log(Level.SEVERE, null, ex);
+ disconnect();
JOptionPane.showMessageDialog(frame, "Unable to connect to server. " + ex.getMessage());
} catch (RemoteException ex) {
logger.log(Level.SEVERE, "Unable to connect to server - ", ex);
@@ -272,9 +274,9 @@ public class Session {
return false;
}
- public boolean joinTable(UUID roomId, UUID tableId, String playerName, DeckCardLists deckList) {
+ public boolean joinTable(UUID roomId, UUID tableId, String playerName, String playerType, DeckCardLists deckList) {
try {
- return server.joinTable(sessionId, roomId, tableId, playerName, deckList);
+ return server.joinTable(sessionId, roomId, tableId, playerName, playerType, deckList);
} catch (RemoteException ex) {
handleRemoteException(ex);
} catch (MageException ex) {
@@ -285,9 +287,9 @@ public class Session {
return false;
}
- public boolean joinTournamentTable(UUID roomId, UUID tableId, String playerName) {
+ public boolean joinTournamentTable(UUID roomId, UUID tableId, String playerName, String playerType) {
try {
- return server.joinTournamentTable(sessionId, roomId, tableId, playerName);
+ return server.joinTournamentTable(sessionId, roomId, tableId, playerName, playerType);
} catch (RemoteException ex) {
handleRemoteException(ex);
} catch (MageException ex) {
@@ -381,16 +383,15 @@ public class Session {
return false;
}
- public boolean sendCardPick(UUID draftId, UUID cardId) {
+ public DraftPickView sendCardPick(UUID draftId, UUID cardId) {
try {
- server.sendCardPick(draftId, sessionId, cardId);
- return true;
+ return server.sendCardPick(draftId, sessionId, cardId);
} catch (RemoteException ex) {
handleRemoteException(ex);
} catch (MageException ex) {
handleMageException(ex);
}
- return false;
+ return null;
}
public boolean joinChat(UUID chatId, ChatPanel chat) {
@@ -586,8 +587,7 @@ public class Session {
public boolean submitDeck(UUID tableId, DeckCardLists deck) {
try {
- server.submitDeck(sessionId, tableId, deck);
- return true;
+ return server.submitDeck(sessionId, tableId, deck);
} catch (RemoteException ex) {
handleRemoteException(ex);
} catch (MageException ex) {
diff --git a/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java b/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java
index 3cb2aa66fac..37c547e028d 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TablePlayerPanel.java
@@ -82,7 +82,7 @@ public class TablePlayerPanel extends javax.swing.JPanel {
public boolean joinTable(UUID roomId, UUID tableId) throws FileNotFoundException, IOException, ClassNotFoundException {
if (!this.cbPlayerType.getSelectedItem().equals("Human")) {
- return session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), Sets.loadDeck(this.newPlayerPanel.getDeckFile()));
+ return session.joinTable(roomId, tableId, this.newPlayerPanel.getPlayerName(), (String)this.cbPlayerType.getSelectedItem(), Sets.loadDeck(this.newPlayerPanel.getDeckFile()));
}
return true;
}
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 fbd99831b34..2e50ac427de 100644
--- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java
@@ -97,13 +97,20 @@ public class TablesPanel extends javax.swing.JPanel implements Observer {
int modelRow = Integer.valueOf( e.getActionCommand() );
UUID tableId = UUID.fromString((String)tableModel.getValueAt(modelRow, 0));
String state = (String)tableModel.getValueAt(modelRow, 4);
+ boolean isTournament = (Boolean)tableModel.getValueAt(modelRow, 5);
if (state.equals("Join")) {
- logger.info("Joining table " + tableId);
-
- joinTableDialog.showDialog(roomId, tableId);
- if (joinTableDialog.isJoined())
- tableWaitingDialog.showDialog(roomId, tableId, false);
+ if (isTournament) {
+ logger.info("Joining tournament " + tableId);
+ if (session.joinTournamentTable(roomId, tableId, session.getUserName(), "Human"))
+ tableWaitingDialog.showDialog(roomId, tableId, true);
+ }
+ else {
+ logger.info("Joining table " + tableId);
+ joinTableDialog.showDialog(roomId, tableId);
+ if (joinTableDialog.isJoined())
+ tableWaitingDialog.showDialog(roomId, tableId, false);
+ }
} else if (state.equals("Watch")) {
logger.info("Watching table " + tableId);
if (!session.watchTable(roomId, tableId))
@@ -305,18 +312,8 @@ public class TablesPanel extends javax.swing.JPanel implements Observer {
options.setRange(RangeOfInfluence.ALL);
options.setWinsNeeded(1);
table = session.createTable(roomId, options);
- session.joinTable(
- roomId,
- table.getTableId(),
- "Human",
- Sets.loadDeck("test.dck")
- );
- session.joinTable(
- roomId,
- table.getTableId(),
- "Computer",
- Sets.loadDeck("test.dck")
- );
+ session.joinTable(roomId, table.getTableId(), "Human", "Human", Sets.loadDeck("test.dck"));
+ session.joinTable(roomId, table.getTableId(), "Computer", "Computer - default", Sets.loadDeck("test.dck"));
hideTables();
session.startGame(roomId, table.getTableId());
} catch (Exception ex) {
@@ -392,6 +389,8 @@ class TableTableModel extends AbstractTableModel {
default:
return "";
}
+ case 5:
+ return tables[arg0].isTournament();
}
return "";
}
diff --git a/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java b/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java
index 4f0493711be..d530406bdbf 100644
--- a/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java
+++ b/Mage.Client/src/main/java/mage/client/table/TournamentPlayerPanel.java
@@ -65,7 +65,7 @@ public class TournamentPlayerPanel extends javax.swing.JPanel {
public boolean joinTournamentTable(UUID roomId, UUID tableId) {
if (!this.cbPlayerType.getSelectedItem().equals("Human")) {
- return session.joinTournamentTable(roomId, tableId, this.txtPlayerName.getText());
+ return session.joinTournamentTable(roomId, tableId, this.txtPlayerName.getText(), (String)this.cbPlayerType.getSelectedItem());
}
return true;
}
diff --git a/Mage.Common/src/mage/interfaces/Server.java b/Mage.Common/src/mage/interfaces/Server.java
index d08cb7a48f3..d11f445c7fe 100644
--- a/Mage.Common/src/mage/interfaces/Server.java
+++ b/Mage.Common/src/mage/interfaces/Server.java
@@ -37,6 +37,7 @@ import mage.cards.decks.DeckCardLists;
import mage.game.GameException;
import mage.game.tournament.TournamentOptions;
import mage.interfaces.callback.CallbackServer;
+import mage.view.DraftPickView;
import mage.view.TableView;
import mage.view.GameView;
import mage.view.TournamentView;
@@ -56,8 +57,8 @@ public interface Server extends Remote, CallbackServer {
//table methods
public TableView createTable(UUID sessionId, UUID roomId, MatchOptions matchOptions) throws RemoteException, MageException;
public TableView createTournamentTable(UUID sessionId, UUID roomId, TournamentOptions tournamentOptions) throws RemoteException, MageException;
- public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, DeckCardLists deckList) throws RemoteException, MageException, GameException;
- public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name) throws RemoteException, MageException, GameException;
+ public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws RemoteException, MageException, GameException;
+ public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType) throws RemoteException, MageException, GameException;
public boolean submitDeck(UUID sessionId, UUID tableId, DeckCardLists deckList) throws RemoteException, MageException, GameException;
public boolean watchTable(UUID sessionId, UUID roomId, UUID tableId) throws RemoteException, MageException;
public boolean replayTable(UUID sessionId, UUID roomId, UUID tableId) throws RemoteException, MageException;
@@ -98,7 +99,7 @@ public interface Server extends Remote, CallbackServer {
//draft methods
public void joinDraft(UUID draftId, UUID sessionId) throws RemoteException, MageException;
- public void sendCardPick(UUID draftId, UUID sessionId, UUID cardId) throws RemoteException, MageException;
+ public DraftPickView sendCardPick(UUID draftId, UUID sessionId, UUID cardId) throws RemoteException, MageException;
//replay methods
public void replayGame(UUID sessionId) throws RemoteException, MageException;
diff --git a/Mage.Common/src/mage/view/DraftPickView.java b/Mage.Common/src/mage/view/DraftPickView.java
index 34d8e1090de..ddb7b0dc2e2 100644
--- a/Mage.Common/src/mage/view/DraftPickView.java
+++ b/Mage.Common/src/mage/view/DraftPickView.java
@@ -40,11 +40,13 @@ public class DraftPickView implements Serializable {
protected CardsView booster;
protected CardsView picks;
+ protected boolean picking;
protected int timeout;
public DraftPickView(DraftPlayer player, int timeout) {
this.booster = new CardsView(player.getBooster());
this.picks = new CardsView(player.getDeck().getSideboard());
+ this.picking = player.isPicking();
this.timeout = timeout;
}
@@ -56,6 +58,10 @@ public class DraftPickView implements Serializable {
return picks;
}
+ public boolean isPicking() {
+ return this.picking;
+ }
+
public int getTimeout() {
return timeout;
}
diff --git a/Mage.Common/src/mage/view/TableView.java b/Mage.Common/src/mage/view/TableView.java
index 006f3d6b998..7d8af244b8b 100644
--- a/Mage.Common/src/mage/view/TableView.java
+++ b/Mage.Common/src/mage/view/TableView.java
@@ -47,6 +47,7 @@ public class TableView implements Serializable {
private String gameType;
private String deckType;
private TableState tableState;
+ private boolean isTournament;
private List seats = new ArrayList();
public TableView(Table table) {
@@ -54,6 +55,7 @@ public class TableView implements Serializable {
this.gameType = table.getGameType();
this.deckType = table.getDeckType();
this.tableState = table.getState();
+ this.isTournament = table.isTournament();
for (Seat seat: table.getSeats()) {
seats.add(new SeatView(seat));
}
@@ -79,5 +81,8 @@ public class TableView implements Serializable {
return seats;
}
+ public boolean isTournament() {
+ return this.isTournament;
+ }
}
diff --git a/Mage.Server/plugins/mage-player-ai.jar b/Mage.Server/plugins/mage-player-ai.jar
index fa9801e7ee8..a7989fd3231 100644
Binary files a/Mage.Server/plugins/mage-player-ai.jar and b/Mage.Server/plugins/mage-player-ai.jar differ
diff --git a/Mage.Server/plugins/mage-player-human.jar b/Mage.Server/plugins/mage-player-human.jar
index 96322403c9b..ea5222287e4 100644
Binary files a/Mage.Server/plugins/mage-player-human.jar and b/Mage.Server/plugins/mage-player-human.jar differ
diff --git a/Mage.Server/src/main/java/mage/server/ServerImpl.java b/Mage.Server/src/main/java/mage/server/ServerImpl.java
index ff671bee167..4f68a20b88a 100644
--- a/Mage.Server/src/main/java/mage/server/ServerImpl.java
+++ b/Mage.Server/src/main/java/mage/server/ServerImpl.java
@@ -59,6 +59,7 @@ import mage.server.tournament.TournamentManager;
import mage.server.util.ThreadExecutor;
import mage.util.Logging;
import mage.view.ChatMessage.MessageColor;
+import mage.view.DraftPickView;
import mage.view.GameView;
import mage.view.TableView;
import mage.view.TournamentView;
@@ -162,9 +163,9 @@ public class ServerImpl extends RemoteServer implements Server {
}
@Override
- public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, DeckCardLists deckList) throws MageException, GameException {
+ public boolean joinTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws MageException, GameException {
try {
- boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTable(sessionId, tableId, name, deckList);
+ boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTable(sessionId, tableId, name, playerType, deckList);
logger.info("Session " + sessionId + " joined table " + tableId);
return ret;
}
@@ -177,9 +178,9 @@ public class ServerImpl extends RemoteServer implements Server {
}
@Override
- public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name) throws MageException, GameException {
+ public boolean joinTournamentTable(UUID sessionId, UUID roomId, UUID tableId, String name, String playerType) throws MageException, GameException {
try {
- boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTournamentTable(sessionId, tableId, name);
+ boolean ret = GamesRoomManager.getInstance().getRoom(roomId).joinTournamentTable(sessionId, tableId, name, playerType);
logger.info("Session " + sessionId + " joined table " + tableId);
return ret;
}
@@ -562,20 +563,14 @@ public class ServerImpl extends RemoteServer implements Server {
}
@Override
- public void sendCardPick(final UUID draftId, final UUID sessionId, final UUID cardPick) throws MageException {
+ public DraftPickView sendCardPick(final UUID draftId, final UUID sessionId, final UUID cardPick) throws MageException {
try {
- rmiExecutor.execute(
- new Runnable() {
- @Override
- public void run() {
- DraftManager.getInstance().sendCardPick(draftId, sessionId, cardPick);
- }
- }
- );
+ return DraftManager.getInstance().sendCardPick(draftId, sessionId, cardPick);
}
catch (Exception ex) {
handleException(ex);
}
+ return null;
}
@Override
diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java
index 446872431d8..d1540b965d6 100644
--- a/Mage.Server/src/main/java/mage/server/TableController.java
+++ b/Mage.Server/src/main/java/mage/server/TableController.java
@@ -102,7 +102,7 @@ public class TableController {
chatId = ChatManager.getInstance().createChatSession();
this.options = options;
match = GameFactory.getInstance().createMatch(options.getGameType(), options);
- table = new Table(options.getGameType(), options.getName(), DeckValidatorFactory.getInstance().createDeckValidator(options.getDeckType()), options.getPlayerTypes());
+ table = new Table(options.getGameType(), options.getName(), DeckValidatorFactory.getInstance().createDeckValidator(options.getDeckType()), options.getPlayerTypes(), false);
init();
}
@@ -111,7 +111,7 @@ public class TableController {
chatId = ChatManager.getInstance().createChatSession();
this.tournamentOptions = options;
tournament = TournamentFactory.getInstance().createTournament(options.getTournamentType(), options);
- table = new Table(options.getTournamentType(), options.getName(), DeckValidatorFactory.getInstance().createDeckValidator(options.getMatchOptions().getDeckType()), options.getPlayerTypes());
+ table = new Table(options.getTournamentType(), options.getName(), DeckValidatorFactory.getInstance().createDeckValidator(options.getMatchOptions().getDeckType()), options.getPlayerTypes(), true);
init();
}
@@ -136,11 +136,11 @@ public class TableController {
);
}
- public synchronized boolean joinTournament(UUID sessionId, String name) throws GameException {
+ public synchronized boolean joinTournament(UUID sessionId, String name, String playerType) throws GameException {
if (table.getState() != TableState.WAITING) {
return false;
}
- Seat seat = table.getNextAvailableSeat();
+ Seat seat = table.getNextAvailableSeat(playerType);
if (seat == null) {
throw new GameException("No available seats.");
}
@@ -156,11 +156,11 @@ public class TableController {
return true;
}
- public synchronized boolean joinTable(UUID sessionId, String name, DeckCardLists deckList) throws GameException {
+ public synchronized boolean joinTable(UUID sessionId, String name, String playerType, DeckCardLists deckList) throws GameException {
if (table.getState() != TableState.WAITING) {
return false;
}
- Seat seat = table.getNextAvailableSeat();
+ Seat seat = table.getNextAvailableSeat(playerType);
if (seat == null) {
throw new GameException("No available seats.");
}
@@ -181,11 +181,11 @@ public class TableController {
return true;
}
- public void addPlayer(UUID sessionId, Player player, Deck deck) throws GameException {
+ public void addPlayer(UUID sessionId, Player player, String playerType, Deck deck) throws GameException {
if (table.getState() != TableState.WAITING) {
return;
}
- Seat seat = table.getNextAvailableSeat();
+ Seat seat = table.getNextAvailableSeat(playerType);
if (seat == null) {
throw new GameException("No available seats.");
}
diff --git a/Mage.Server/src/main/java/mage/server/TableManager.java b/Mage.Server/src/main/java/mage/server/TableManager.java
index 64baa8ea55f..168f535ea56 100644
--- a/Mage.Server/src/main/java/mage/server/TableManager.java
+++ b/Mage.Server/src/main/java/mage/server/TableManager.java
@@ -86,12 +86,12 @@ public class TableManager {
return tables.values();
}
- public boolean joinTable(UUID sessionId, UUID tableId, String name, DeckCardLists deckList) throws GameException {
- return controllers.get(tableId).joinTable(sessionId, name, deckList);
+ public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws GameException {
+ return controllers.get(tableId).joinTable(sessionId, name, playerType, deckList);
}
- public boolean joinTournament(UUID sessionId, UUID tableId, String name) throws GameException {
- return controllers.get(tableId).joinTournament(sessionId, name);
+ public boolean joinTournament(UUID sessionId, UUID tableId, String name, String playerType) throws GameException {
+ return controllers.get(tableId).joinTournament(sessionId, name, playerType);
}
public boolean submitDeck(UUID sessionId, UUID tableId, DeckCardLists deckList) throws GameException {
@@ -165,7 +165,7 @@ public class TableManager {
controllers.get(tableId).construct();
}
- public void addPlayer(UUID sessionId, UUID tableId, Player player, Deck deck) throws GameException {
- controllers.get(tableId).addPlayer(sessionId, player, deck);
+ public void addPlayer(UUID sessionId, UUID tableId, Player player, String playerType, Deck deck) throws GameException {
+ controllers.get(tableId).addPlayer(sessionId, player, playerType, deck);
}
}
diff --git a/Mage.Server/src/main/java/mage/server/draft/DraftController.java b/Mage.Server/src/main/java/mage/server/draft/DraftController.java
index 59b98789b34..04fa685b65e 100644
--- a/Mage.Server/src/main/java/mage/server/draft/DraftController.java
+++ b/Mage.Server/src/main/java/mage/server/draft/DraftController.java
@@ -184,8 +184,11 @@ public class DraftController {
return this.draftSessionId;
}
- public void sendCardPick(UUID sessionId, UUID cardId) {
- draftSessions.get(sessionPlayerMap.get(sessionId)).sendCardPick(cardId);
+ public DraftPickView sendCardPick(UUID sessionId, UUID cardId) {
+ if (draftSessions.get(sessionPlayerMap.get(sessionId)).sendCardPick(cardId)) {
+ return getDraftPickView(sessionPlayerMap.get(sessionId), 0);
+ }
+ return null;
}
private synchronized void updateDraft() {
diff --git a/Mage.Server/src/main/java/mage/server/draft/DraftManager.java b/Mage.Server/src/main/java/mage/server/draft/DraftManager.java
index a218b5aca78..ecae582d514 100644
--- a/Mage.Server/src/main/java/mage/server/draft/DraftManager.java
+++ b/Mage.Server/src/main/java/mage/server/draft/DraftManager.java
@@ -31,6 +31,7 @@ package mage.server.draft;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import mage.game.draft.Draft;
+import mage.view.DraftPickView;
/**
*
@@ -61,8 +62,8 @@ public class DraftManager {
draftControllers.remove(gameId);
}
- public void sendCardPick(UUID draftId, UUID sessionId, UUID cardId) {
- draftControllers.get(draftId).sendCardPick(sessionId, cardId);
+ public DraftPickView sendCardPick(UUID draftId, UUID sessionId, UUID cardId) {
+ return draftControllers.get(draftId).sendCardPick(sessionId, cardId);
}
public void removeSession(UUID sessionId) {
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 f4d2c4eaf0a..eeae95f9bee 100644
--- a/Mage.Server/src/main/java/mage/server/draft/DraftSession.java
+++ b/Mage.Server/src/main/java/mage/server/draft/DraftSession.java
@@ -151,9 +151,10 @@ public class DraftSession {
killed = true;
}
- public void sendCardPick(UUID cardId) {
+ public boolean sendCardPick(UUID cardId) {
cancelTimeout();
- draft.addPick(playerId, cardId);
+ return draft.addPick(playerId, cardId);
+
}
}
diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoom.java b/Mage.Server/src/main/java/mage/server/game/GamesRoom.java
index a991fe792a1..e752b81a3e1 100644
--- a/Mage.Server/src/main/java/mage/server/game/GamesRoom.java
+++ b/Mage.Server/src/main/java/mage/server/game/GamesRoom.java
@@ -44,8 +44,8 @@ import mage.view.TableView;
public interface GamesRoom extends Room {
public List getTables();
- public boolean joinTable(UUID sessionId, UUID tableId, String name, DeckCardLists deckList) throws GameException;
- public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name) throws GameException;
+ public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws GameException;
+ public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name, String playerType) throws GameException;
public TableView createTable(UUID sessionId, MatchOptions options);
public TableView createTournamentTable(UUID sessionId, TournamentOptions options);
public void removeTable(UUID sessionId, UUID tableId);
diff --git a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
index 7170db13e6a..edca14c2a7a 100644
--- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
+++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java
@@ -65,9 +65,9 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable {
}
@Override
- public boolean joinTable(UUID sessionId, UUID tableId, String name, DeckCardLists deckList) throws GameException {
+ public boolean joinTable(UUID sessionId, UUID tableId, String name, String playerType, DeckCardLists deckList) throws GameException {
if (tables.containsKey(tableId)) {
- return TableManager.getInstance().joinTable(sessionId, tableId, name, deckList);
+ return TableManager.getInstance().joinTable(sessionId, tableId, name, playerType, deckList);
} else {
return false;
}
@@ -81,9 +81,9 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable {
}
@Override
- public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name) throws GameException {
+ public boolean joinTournamentTable(UUID sessionId, UUID tableId, String name, String playerType) throws GameException {
if (tables.containsKey(tableId)) {
- return TableManager.getInstance().joinTournament(sessionId, tableId, name);
+ return TableManager.getInstance().joinTournament(sessionId, tableId, name, playerType);
} else {
return false;
}
diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
index e5e2d3ca126..cbb622cd344 100644
--- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
+++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java
@@ -106,7 +106,7 @@ public class TournamentController {
checkStart();
}
- public void join(UUID sessionId) {
+ public synchronized void join(UUID sessionId) {
UUID playerId = sessionPlayerMap.get(sessionId);
TournamentSession tournamentSession = new TournamentSession(tournament, sessionId, playerId);
tournamentSessions.put(playerId, tournamentSession);
@@ -157,8 +157,8 @@ public class TournamentController {
Table table = tableManager.createTable(sessionId, matchOptions);
TournamentPlayer player1 = pair.getPlayer1();
TournamentPlayer player2 = pair.getPlayer2();
- tableManager.addPlayer(getPlayerSessionId(player1.getPlayer().getId()), table.getId(), player1.getPlayer(), player1.getDeck());
- tableManager.addPlayer(getPlayerSessionId(player2.getPlayer().getId()), table.getId(), player2.getPlayer(), player2.getDeck());
+ tableManager.addPlayer(getPlayerSessionId(player1.getPlayer().getId()), table.getId(), player1.getPlayer(), player1.getPlayerType(), player1.getDeck());
+ tableManager.addPlayer(getPlayerSessionId(player2.getPlayer().getId()), table.getId(), player2.getPlayer(), player2.getPlayerType(), player2.getDeck());
tableManager.startMatch(sessionId, null, table.getId());
pair.setMatch(tableManager.getMatch(table.getId()));
} catch (GameException ex) {
diff --git a/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java b/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java
index 37c47c90967..e7a855c7d04 100644
--- a/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java
+++ b/Mage.Tests/src/test/java/org/mage/test/base/MageBase.java
@@ -74,8 +74,8 @@ public class MageBase {
options.setWinsNeeded(1);
TableView table = server.createTable(sessionId, roomId, options);
System.out.println("Cards in the deck: " + Sets.loadDeck("UW Control.dck").getCards().size());
- server.joinTable(sessionId, roomId, table.getTableId(), "Human", Sets.loadDeck("UW Control.dck"));
- server.joinTable(sessionId, roomId, table.getTableId(), "Computer", Sets.loadDeck("UW Control.dck"));
+ server.joinTable(sessionId, roomId, table.getTableId(), "Human", "Human", Sets.loadDeck("UW Control.dck"));
+ server.joinTable(sessionId, roomId, table.getTableId(), "Computer", "Computer - default", Sets.loadDeck("UW Control.dck"));
server.startMatch(sessionId, roomId, table.getTableId());
synchronized (syncStart) {
diff --git a/Mage/src/mage/game/Table.java b/Mage/src/mage/game/Table.java
index eeebe6e0a4c..196ccc78c5e 100644
--- a/Mage/src/mage/game/Table.java
+++ b/Mage/src/mage/game/Table.java
@@ -51,16 +51,18 @@ public class Table implements Serializable {
private String gameType;
private Seat[] seats;
private int numSeats;
+ private boolean isTournament;
private DeckValidator validator;
private TableState state = TableState.WAITING;
protected TableEventSource tableEventSource = new TableEventSource();
- public Table(String gameType, String name, DeckValidator validator, List playerTypes) {
+ public Table(String gameType, String name, DeckValidator validator, List playerTypes, boolean isTournament) {
tableId = UUID.randomUUID();
this.numSeats = playerTypes.size();
this.gameType = gameType;
this.name = name;
+ this.isTournament = isTournament;
createSeats(playerTypes);
this.validator = validator;
}
@@ -98,6 +100,10 @@ public class Table implements Serializable {
return validator.getName();
}
+ public boolean isTournament() {
+ return this.isTournament;
+ }
+
public UUID joinTable(Player player, Seat seat) throws GameException {
if (seat.getPlayer() != null) {
throw new GameException("Seat is occupied.");
@@ -120,9 +126,9 @@ public class Table implements Serializable {
return seats;
}
- public Seat getNextAvailableSeat() {
+ public Seat getNextAvailableSeat(String playerType) {
for (int i = 0; i < numSeats; i++ ) {
- if (seats[i].getPlayer() == null)
+ if (seats[i].getPlayer() == null && seats[i].getPlayerType().equals(playerType))
return seats[i];
}
return null;
diff --git a/Mage/src/mage/game/draft/Draft.java b/Mage/src/mage/game/draft/Draft.java
index 07ec023b240..d3b04b7d13c 100644
--- a/Mage/src/mage/game/draft/Draft.java
+++ b/Mage/src/mage/game/draft/Draft.java
@@ -51,7 +51,7 @@ public interface Draft extends MageItem, Serializable {
public List getSets();
public int getBoosterNum();
public int getCardNum();
- public void addPick(UUID playerId, UUID cardId);
+ public boolean addPick(UUID playerId, UUID cardId);
public void start();
public boolean allJoined();
public void leave(UUID playerId);
diff --git a/Mage/src/mage/game/draft/DraftImpl.java b/Mage/src/mage/game/draft/DraftImpl.java
index 34ec4c434df..64bcece061d 100644
--- a/Mage/src/mage/game/draft/DraftImpl.java
+++ b/Mage/src/mage/game/draft/DraftImpl.java
@@ -232,18 +232,21 @@ public abstract class DraftImpl> implements Draft {
}
@Override
- public void addPick(UUID playerId, UUID cardId) {
+ public boolean addPick(UUID playerId, UUID cardId) {
DraftPlayer player = players.get(playerId);
- for (Card card: player.booster) {
- if (card.getId().equals(cardId)) {
- player.addPick(card);
- player.booster.remove(card);
- break;
+ if (player.isPicking()) {
+ for (Card card: player.booster) {
+ if (card.getId().equals(cardId)) {
+ player.addPick(card);
+ player.booster.remove(card);
+ break;
+ }
+ }
+ synchronized(this) {
+ this.notifyAll();
}
}
- synchronized(this) {
- this.notifyAll();
- }
+ return !player.isPicking();
}
}