diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 5bce5e28b8b..75c62ac6f76 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -158,9 +158,9 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { //TODO: make gray theme, implement theme selector in preferences dialog private static boolean grayMode = false; - private static final Map chats = new HashMap(); - private static final Map games = new HashMap(); - private static final Map drafts = new HashMap(); + private static final Map chats = new HashMap<>(); + private static final Map games = new HashMap<>(); + private static final Map drafts = new HashMap<>(); private static final MageUI ui = new MageUI(); private static final ScheduledExecutorService pingTaskExecutor = Executors.newSingleThreadScheduledExecutor(); 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 32955ca1f90..77ba157089e 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.form @@ -54,7 +54,6 @@ - @@ -94,11 +93,22 @@ + + + + + + + + + + + @@ -122,10 +132,10 @@ - + - + @@ -133,58 +143,64 @@ - - - + - + + + + - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - @@ -204,6 +220,8 @@ + + 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 a22b150365e..be580c5e864 100644 --- a/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java +++ b/Mage.Client/src/main/java/mage/client/draft/DraftPanel.java @@ -38,6 +38,7 @@ import java.awt.Component; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.UUID; +import javax.swing.JOptionPane; import javax.swing.Timer; import mage.client.MageFrame; import mage.client.deckeditor.SortSettingDraft; @@ -193,42 +194,50 @@ public class DraftPanel extends javax.swing.JPanel { jSeparator1 = new javax.swing.JSeparator(); draftLeftPane = new javax.swing.JPanel(); - bigCard = new mage.client.cards.BigCard(); - lblCardNo = new javax.swing.JLabel(); + btnQuitTournament = new javax.swing.JButton(); lblPack1 = new javax.swing.JLabel(); - lblPack2 = new javax.swing.JLabel(); - lblPack3 = new javax.swing.JLabel(); txtPack1 = new javax.swing.JTextField(); - txtPack2 = new javax.swing.JTextField(); - txtPack3 = new javax.swing.JTextField(); - txtCardNo = new javax.swing.JTextField(); chkPack1 = new javax.swing.JCheckBox(); + lblPack2 = new javax.swing.JLabel(); + txtPack2 = new javax.swing.JTextField(); chkPack2 = new javax.swing.JCheckBox(); + lblPack3 = new javax.swing.JLabel(); + txtPack3 = new javax.swing.JTextField(); chkPack3 = new javax.swing.JCheckBox(); + lblCardNo = new javax.swing.JLabel(); + txtCardNo = new javax.swing.JTextField(); txtTimeRemaining = new javax.swing.JTextField(); lblMessage = new javax.swing.JLabel(); + bigCard = new mage.client.cards.BigCard(); draftPicks = new mage.client.cards.CardsList(); draftBooster = new mage.client.cards.DraftGrid(); draftLeftPane.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED)); - lblCardNo.setText("Card #:"); + btnQuitTournament.setText("Quit Tournament"); + btnQuitTournament.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + btnQuitTournamentActionPerformed(evt); + } + }); lblPack1.setText("Pack 1:"); - lblPack2.setText("Pack 2:"); - - lblPack3.setText("Pack 3:"); - txtPack1.setEditable(false); txtPack1.setEnabled(false); + lblPack2.setText("Pack 2:"); + txtPack2.setEditable(false); txtPack2.setEnabled(false); + lblPack3.setText("Pack 3:"); + txtPack3.setEditable(false); txtPack3.setEnabled(false); + lblCardNo.setText("Card #:"); + txtCardNo.setEditable(false); txtCardNo.setEnabled(false); @@ -243,7 +252,6 @@ public class DraftPanel extends javax.swing.JPanel { draftLeftPane.setLayout(draftLeftPaneLayout); draftLeftPaneLayout.setHorizontalGroup( draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) - .addComponent(bigCard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addGroup(draftLeftPaneLayout.createSequentialGroup() .addContainerGap() .addGroup(draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) @@ -273,11 +281,19 @@ public class DraftPanel extends javax.swing.JPanel { .addGroup(draftLeftPaneLayout.createSequentialGroup() .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 236, Short.MAX_VALUE) .addContainerGap()))) + .addGroup(draftLeftPaneLayout.createSequentialGroup() + .addGroup(draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(bigCard, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addGroup(draftLeftPaneLayout.createSequentialGroup() + .addContainerGap() + .addComponent(btnQuitTournament))) + .addGap(0, 0, Short.MAX_VALUE)) ); draftLeftPaneLayout.setVerticalGroup( draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, draftLeftPaneLayout.createSequentialGroup() - .addContainerGap() + .addComponent(btnQuitTournament) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblPack1) .addComponent(txtPack1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) @@ -296,10 +312,10 @@ public class DraftPanel extends javax.swing.JPanel { .addGroup(draftLeftPaneLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(lblCardNo) .addComponent(txtCardNo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) - .addGap(18, 18, 18) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(txtTimeRemaining, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 32, Short.MAX_VALUE) + .addComponent(lblMessage, javax.swing.GroupLayout.DEFAULT_SIZE, 24, 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)) ); @@ -338,9 +354,16 @@ public class DraftPanel extends javax.swing.JPanel { ); }// //GEN-END:initComponents + private void btnQuitTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuitTournamentActionPerformed + if (JOptionPane.showConfirmDialog(this, "Are you sure you want to quit the tournament?", "Confirm quit tournament", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + MageFrame.getSession().quitDraft(draftId); + MageFrame.removeDraft(draftId); + } + }//GEN-LAST:event_btnQuitTournamentActionPerformed // Variables declaration - do not modify//GEN-BEGIN:variables private mage.client.cards.BigCard bigCard; + private javax.swing.JButton btnQuitTournament; private javax.swing.JCheckBox chkPack1; private javax.swing.JCheckBox chkPack2; private javax.swing.JCheckBox chkPack3; 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 76333ad4ea7..4ec38cf5f31 100644 --- a/Mage.Client/src/main/java/mage/client/table/TablesPanel.java +++ b/Mage.Client/src/main/java/mage/client/table/TablesPanel.java @@ -737,6 +737,7 @@ class TableTableModel extends AbstractTableModel { } return "Join"; case CONSTRUCTING: + case DRAFTING: if (tables[arg0].isTournament()) { return "Show"; } diff --git a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java index db7f2df17eb..10149f4720d 100644 --- a/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java +++ b/Mage.Client/src/main/java/mage/client/tournament/TournamentPanel.java @@ -420,7 +420,6 @@ public class TournamentPanel extends javax.swing.JPanel { }//GEN-LAST:event_btnCloseWindowActionPerformed private void btnQuitTournamentActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnQuitTournamentActionPerformed - // TODO add your handling code here: if (JOptionPane.showConfirmDialog(this, "Are you sure you want to quit the tournament?", "Confirm quit tournament", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { MageFrame.getSession().quitTournament(tournamentId); } diff --git a/Mage.Common/src/mage/interfaces/MageServer.java b/Mage.Common/src/mage/interfaces/MageServer.java index 290a86a1857..2e2a4bf17c0 100644 --- a/Mage.Common/src/mage/interfaces/MageServer.java +++ b/Mage.Common/src/mage/interfaces/MageServer.java @@ -124,6 +124,7 @@ public interface MageServer { //draft methods void joinDraft(UUID draftId, String sessionId) throws MageException; + void quitDraft(UUID draftId, String sessionId) throws MageException; DraftPickView sendCardPick(UUID draftId, String sessionId, UUID cardId) throws MageException; //challenge methods diff --git a/Mage.Common/src/mage/remote/SessionImpl.java b/Mage.Common/src/mage/remote/SessionImpl.java index 5c668ad42aa..08569415d8e 100644 --- a/Mage.Common/src/mage/remote/SessionImpl.java +++ b/Mage.Common/src/mage/remote/SessionImpl.java @@ -1000,6 +1000,7 @@ public class SessionImpl implements Session { } return false; } + @Override public boolean quitTournament(UUID tournamentId) { try { @@ -1015,6 +1016,19 @@ public class SessionImpl implements Session { return false; } + @Override + public boolean quitDraft(UUID draftId) { + try { + if (isConnected()) { + server.quitDraft(draftId, sessionId); + return true; + } + } catch (MageException ex) { + handleMageException(ex); + } + return false; + } + @Override public boolean undo(UUID gameId) { try { diff --git a/Mage.Common/src/mage/remote/interfaces/GamePlay.java b/Mage.Common/src/mage/remote/interfaces/GamePlay.java index bcc9eea2105..34a108e0822 100644 --- a/Mage.Common/src/mage/remote/interfaces/GamePlay.java +++ b/Mage.Common/src/mage/remote/interfaces/GamePlay.java @@ -57,6 +57,8 @@ public interface GamePlay { boolean quitTournament(UUID tournamentId); + boolean quitDraft(UUID draftId); + boolean submitDeck(UUID tableId, DeckCardLists deck); boolean updateDeck(UUID tableId, DeckCardLists deck); diff --git a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java index ff2e4cc0fdb..92696ef0d93 100644 --- a/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java +++ b/Mage.Server.Plugins/Mage.Player.AI.MA/src/mage/player/ai/ComputerPlayer7.java @@ -28,27 +28,51 @@ package mage.player.ai; -import mage.constants.PhaseStep; -import mage.constants.RangeOfInfluence; +import java.util.LinkedList; +import java.util.List; +import java.util.UUID; import mage.abilities.Ability; +import mage.constants.PhaseStep; +import static mage.constants.PhaseStep.BEGIN_COMBAT; +import static mage.constants.PhaseStep.CLEANUP; +import static mage.constants.PhaseStep.COMBAT_DAMAGE; +import static mage.constants.PhaseStep.DECLARE_ATTACKERS; +import static mage.constants.PhaseStep.DECLARE_BLOCKERS; +import static mage.constants.PhaseStep.DRAW; +import static mage.constants.PhaseStep.END_COMBAT; +import static mage.constants.PhaseStep.END_TURN; +import static mage.constants.PhaseStep.FIRST_COMBAT_DAMAGE; +import static mage.constants.PhaseStep.POSTCOMBAT_MAIN; +import static mage.constants.PhaseStep.PRECOMBAT_MAIN; +import static mage.constants.PhaseStep.UPKEEP; +import mage.constants.RangeOfInfluence; import mage.game.Game; import mage.game.combat.Combat; import mage.game.combat.CombatGroup; import mage.game.events.GameEvent; -import mage.game.turn.*; -import mage.players.Player; +import mage.game.turn.BeginCombatStep; +import mage.game.turn.CleanupStep; +import mage.game.turn.CombatDamageStep; +import mage.game.turn.CombatPhase; +import mage.game.turn.DeclareAttackersStep; +import mage.game.turn.DeclareBlockersStep; +import mage.game.turn.EndOfCombatStep; +import mage.game.turn.EndPhase; +import mage.game.turn.EndStep; +import mage.game.turn.FirstCombatDamageStep; +import mage.game.turn.PostCombatMainPhase; +import mage.game.turn.PostCombatMainStep; +import mage.game.turn.Step; import org.apache.log4j.Logger; -import java.util.LinkedList; -import java.util.List; -import java.util.UUID; + /** * * @author ayratn */ -public class ComputerPlayer7 extends ComputerPlayer6 implements Player { +public class ComputerPlayer7 extends ComputerPlayer6 { private static final transient Logger logger = Logger.getLogger(ComputerPlayer7.class); diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index c57359e6ca4..1fc642424dc 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -105,10 +105,12 @@ public class ComputerPlayer> extends PlayerImpl i super(name, range); human = false; userData = new UserData(UserGroup.COMPUTER, 64, false); + pickedCards = new ArrayList(); } protected ComputerPlayer(UUID id) { super(id); + pickedCards = new ArrayList(); } public ComputerPlayer(final ComputerPlayer player) { @@ -1450,7 +1452,7 @@ public class ComputerPlayer> extends PlayerImpl i @Override public void construct(Tournament tournament, Deck deck) { - if (deck.getCards().size() < 40) { + if (deck != null && deck.getCards().size() < 40 && deck.getSideboard().size() > 0 ) { //pick the top 23 cards if (chosenColors == null) { for (Card card: deck.getSideboard()) { @@ -1604,9 +1606,6 @@ public class ComputerPlayer> extends PlayerImpl i * @param score */ protected void rememberPick(Card card, int score) { - if (pickedCards == null) { - pickedCards = new ArrayList(); - } pickedCards.add(new PickedCard(card, score)); } @@ -1891,12 +1890,19 @@ public class ComputerPlayer> extends PlayerImpl i private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); - unplayable = new TreeMap(); - playableNonInstant = new ArrayList(); - playableInstant = new ArrayList(); - playableAbilities = new ArrayList(); + unplayable = new TreeMap<>(); + playableNonInstant = new ArrayList<>(); + playableInstant = new ArrayList<>(); + playableAbilities = new ArrayList<>(); } + @Override + public void cleanUpOnMatchEnd() { + super.cleanUpOnMatchEnd(); //To change body of generated methods, choose Tools | Templates. + } + + + @Override public T copy() { return (T)new ComputerPlayer(this); diff --git a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournament.java b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournament.java index be436a638f7..f375a816eb6 100644 --- a/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournament.java +++ b/Mage.Server.Plugins/Mage.Tournament.BoosterDraft/src/mage/tournament/BoosterDraftEliminationTournament.java @@ -67,6 +67,9 @@ public class BoosterDraftEliminationTournament extends TournamentSingleEliminati @Override public void nextStep() { + if (isAbort()) { + currentStep = TournamentStep.COMPETE; + } switch (currentStep) { case START: currentStep = TournamentStep.DRAFT; diff --git a/Mage.Server/src/main/java/mage/server/MageServerImpl.java b/Mage.Server/src/main/java/mage/server/MageServerImpl.java index 6380cb50d46..9bab124dba5 100644 --- a/Mage.Server/src/main/java/mage/server/MageServerImpl.java +++ b/Mage.Server/src/main/java/mage/server/MageServerImpl.java @@ -40,6 +40,7 @@ import mage.cards.repository.CardRepository; import mage.cards.repository.ExpansionInfo; import mage.cards.repository.ExpansionRepository; import mage.game.GameException; +import mage.game.Table; import mage.game.match.MatchOptions; import mage.game.tournament.TournamentOptions; import mage.interfaces.Action; @@ -659,6 +660,22 @@ public class MageServerImpl implements MageServer { }); } + @Override + public void quitDraft(final UUID draftId, final String sessionId) throws MageException { + execute("quitDraft", sessionId, new Action() { + @Override + public void execute() { + UUID tableId = DraftManager.getInstance().getControllerByDraftId(draftId).getTableId(); + UUID userId = SessionManager.getInstance().getSession(sessionId).getUserId(); + Table table = TableManager.getInstance().getTable(tableId); + if (table.isTournament()) { + UUID tournamentId = table.getTournament().getId(); + TournamentManager.getInstance().quit(tournamentId, userId); + } + } + }); + } + @Override public void undo(final UUID gameId, final String sessionId) throws MageException { execute("undo", sessionId, new Action() { diff --git a/Mage.Server/src/main/java/mage/server/Session.java b/Mage.Server/src/main/java/mage/server/Session.java index e88deb56176..60573ddb908 100644 --- a/Mage.Server/src/main/java/mage/server/Session.java +++ b/Mage.Server/src/main/java/mage/server/Session.java @@ -28,10 +28,15 @@ package mage.server; +import java.util.Date; +import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import mage.MageException; import mage.interfaces.callback.ClientCallback; import mage.players.net.UserData; import mage.players.net.UserGroup; +import mage.server.util.ConfigSettings; import mage.view.UserDataView; import org.apache.log4j.Logger; import org.jboss.remoting.callback.AsynchInvokerCallbackHandler; @@ -39,12 +44,6 @@ import org.jboss.remoting.callback.Callback; import org.jboss.remoting.callback.HandleCallbackException; import org.jboss.remoting.callback.InvokerCallbackHandler; -import java.util.Date; -import java.util.UUID; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import mage.server.util.ConfigSettings; - /** * * @author BetaSteward_at_googlemail.com @@ -53,13 +52,13 @@ public class Session { private static final Logger logger = Logger.getLogger(Session.class); - private String sessionId; + private final String sessionId; private UUID userId; private String host; private int messageId = 0; - private Date timeConnected; + private final Date timeConnected; private boolean isAdmin = false; - private AsynchInvokerCallbackHandler callbackHandler; + private final AsynchInvokerCallbackHandler callbackHandler; public Session(String sessionId, InvokerCallbackHandler callbackHandler) { this.sessionId = sessionId; @@ -134,30 +133,42 @@ public class Session { } private void updateAvatar(String userName, UserData userData) { - //TODO: move to separate class + //TODO: move to separate class //TODO: add for checking for private key - if (userName.equals("nantuko")) { - userData.setAvatarId(1000); - } else if (userName.equals("i_no_k")) { - userData.setAvatarId(1002); - } else if (userName.equals("Askael")) { - userData.setAvatarId(1004); - } else if (userName.equals("North")) { - userData.setAvatarId(1006); - } else if (userName.equals("BetaSteward")) { - userData.setAvatarId(1008); - } else if (userName.equals("Arching")) { - userData.setAvatarId(1010); - } else if (userName.equals("loki")) { - userData.setAvatarId(1012); - } else if (userName.equals("Alive")) { - userData.setAvatarId(1014); - } else if (userName.equals("Rahan")) { - userData.setAvatarId(1016); - } else if (userName.equals("Ayrat")) { - userData.setAvatarId(1018); - } else if (userName.equals("Bandit")) { - userData.setAvatarId(1020); + switch (userName) { + case "nantuko": + userData.setAvatarId(1000); + break; + case "i_no_k": + userData.setAvatarId(1002); + break; + case "Askael": + userData.setAvatarId(1004); + break; + case "North": + userData.setAvatarId(1006); + break; + case "BetaSteward": + userData.setAvatarId(1008); + break; + case "Arching": + userData.setAvatarId(1010); + break; + case "loki": + userData.setAvatarId(1012); + break; + case "Alive": + userData.setAvatarId(1014); + break; + case "Rahan": + userData.setAvatarId(1016); + break; + case "Ayrat": + userData.setAvatarId(1018); + break; + case "Bandit": + userData.setAvatarId(1020); + break; } } diff --git a/Mage.Server/src/main/java/mage/server/SessionManager.java b/Mage.Server/src/main/java/mage/server/SessionManager.java index 03f54231790..3e75b2e819d 100644 --- a/Mage.Server/src/main/java/mage/server/SessionManager.java +++ b/Mage.Server/src/main/java/mage/server/SessionManager.java @@ -49,7 +49,7 @@ public class SessionManager { public static SessionManager getInstance() { return INSTANCE; } - private ConcurrentHashMap sessions = new ConcurrentHashMap(); + private final ConcurrentHashMap sessions = new ConcurrentHashMap<>(); public Session getSession(String sessionId) { if (sessions == null || sessionId == null) { @@ -116,7 +116,7 @@ public class SessionManager { } public Map getSessions() { - Map map = new HashMap(); + Map map = new HashMap<>(); for (Map.Entry entry : sessions.entrySet()) { map.put(entry.getKey(), entry.getValue()); } @@ -139,10 +139,7 @@ public class SessionManager { } public boolean isValidSession(String sessionId) { - if (sessions.containsKey(sessionId)) { - return true; - } - return false; + return sessions.containsKey(sessionId); } public User getUser(String sessionId) { diff --git a/Mage.Server/src/main/java/mage/server/TableController.java b/Mage.Server/src/main/java/mage/server/TableController.java index c06522d1fbe..6d288909310 100644 --- a/Mage.Server/src/main/java/mage/server/TableController.java +++ b/Mage.Server/src/main/java/mage/server/TableController.java @@ -168,11 +168,11 @@ public class TableController { return false; } tournament.addPlayer(player, seat.getPlayerType()); - table.joinTable(player, seat); - user.addTable(player.getId(), table); + table.joinTable(player, seat); logger.debug("player joined " + player.getId()); //only inform human players and add them to sessionPlayerMap if (seat.getPlayer().isHuman()) { + user.addTable(player.getId(), table); user.joinedTable(table.getRoomId(), table.getId(), true); userPlayerMap.put(userId, player.getId()); } 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 9c830f97331..5dc3ef20872 100644 --- a/Mage.Server/src/main/java/mage/server/draft/DraftController.java +++ b/Mage.Server/src/main/java/mage/server/draft/DraftController.java @@ -55,11 +55,11 @@ public class DraftController { private static final Logger logger = Logger.getLogger(GameController.class); public static final String INIT_FILE_PATH = "config" + File.separator + "init.txt"; - private ConcurrentHashMap draftSessions = new ConcurrentHashMap(); - private ConcurrentHashMap userPlayerMap; - private UUID draftSessionId; - private Draft draft; - private UUID tableId; + private final ConcurrentHashMap draftSessions = new ConcurrentHashMap<>(); + private final ConcurrentHashMap userPlayerMap; + private final UUID draftSessionId; + private final Draft draft; + private final UUID tableId; public DraftController(Draft draft, ConcurrentHashMap userPlayerMap, UUID tableId) { draftSessionId = UUID.randomUUID(); @@ -130,10 +130,20 @@ public class DraftController { checkStart(); } + public DraftSession getDraftSession(UUID playerId) { + if (draftSessions.containsKey(playerId)) { + return draftSessions.get(playerId); + } + return null; + } + public boolean replacePlayer(Player oldPlayer, Player newPlayer) { - if (draft.replacePlayer(oldPlayer, newPlayer)) { - draftSessions.get(oldPlayer.getId()).setKilled(); - draftSessions.remove(oldPlayer.getId()); + if (draft.replacePlayer(oldPlayer, newPlayer)) { + DraftSession draftSession = draftSessions.get(oldPlayer.getId()); + if (draftSession != null) { + draftSession.draftOver(); // closes the draft panel of the replaced player + draftSessions.remove(oldPlayer.getId()); + } return true; } return false; 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 c0a600b4791..fbcea171f52 100644 --- a/Mage.Server/src/main/java/mage/server/draft/DraftManager.java +++ b/Mage.Server/src/main/java/mage/server/draft/DraftManager.java @@ -46,7 +46,7 @@ public class DraftManager { private DraftManager() {} - private ConcurrentHashMap draftControllers = new ConcurrentHashMap(); + private final ConcurrentHashMap draftControllers = new ConcurrentHashMap<>(); public UUID createDraftSession(Draft draft, ConcurrentHashMap userPlayerMap, UUID tableId) { DraftController draftController = new DraftController(draft, userPlayerMap, tableId); @@ -84,6 +84,10 @@ public class DraftManager { draftControllers.remove(draftId); } + public DraftController getControllerByDraftId(UUID draftId) { + return draftControllers.get(draftId); + } + public DraftController getController(UUID tableId) { for (DraftController controller: draftControllers.values()) { if (controller.getTableId().equals(tableId)) { 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 208161f83e1..234b2b823b2 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentController.java @@ -50,7 +50,9 @@ import mage.server.TableController; import mage.server.TableManager; import mage.server.User; import mage.server.UserManager; +import mage.server.draft.DraftController; import mage.server.draft.DraftManager; +import mage.server.draft.DraftSession; import mage.server.game.GamesRoomManager; import mage.server.util.ThreadExecutor; import mage.view.ChatMessage.MessageColor; @@ -75,8 +77,6 @@ public class TournamentController { private ConcurrentHashMap userPlayerMap = new ConcurrentHashMap<>(); private final ConcurrentHashMap tournamentSessions = new ConcurrentHashMap<>(); - private boolean abort = false; - public TournamentController(Tournament tournament, ConcurrentHashMap userPlayerMap, UUID tableId) { this.userPlayerMap = userPlayerMap; chatId = ChatManager.getInstance().createChatSession(); @@ -99,14 +99,14 @@ public class TournamentController { startDraft(event.getDraft()); break; case CONSTRUCT: - if (!abort) { + if (!isAbort()) { construct(); } else { endTournament(); } break; case START_MATCH: - if (!abort) { + if (!isAbort()) { initTournament(); // set state startMatch(event.getPair(), event.getMatchOptions()); } @@ -193,9 +193,12 @@ public class TournamentController { } private void endTournament() { + for (TournamentPlayer player: tournament.getPlayers()) { + player.setStateAtTournamentEnd(); + } for (final TournamentSession tournamentSession: tournamentSessions.values()) { tournamentSession.tournamentOver(); - tournamentSession.removeTournament(); + tournamentSession.removeTournamentForUser(); } this.tournamentSessions.clear(); TableManager.getInstance().endTournament(tableId, tournament); @@ -286,7 +289,15 @@ public class TournamentController { if (tPlayer.getState().equals(TournamentPlayerState.DRAFTING)) { info = "during Draft phase"; if (!checkToReplaceDraftPlayerByAi(userId, tPlayer)) { - this.abortTournament(); + this.abortDraftTournament(); + } else { + DraftController draftController = DraftManager.getInstance().getController(tableId); + if (draftController != null) { + DraftSession draftSession = draftController.getDraftSession(playerId); + if (draftSession != null) { + DraftManager.getInstance().kill(draftSession.getDraftId(), userId); + } + } } } else if (tPlayer.getState().equals(TournamentPlayerState.CONSTRUCTING)) { info = "during Construction phase"; @@ -315,13 +326,18 @@ public class TournamentController { if (humans > 1) { String replacePlayerName = "Draftbot"; User user = UserManager.getInstance().getUser(userId); - if (user != null) { - replacePlayerName = "Draftbot (" + user.getName() + ")"; - } TableController tableController = TableManager.getInstance().getController(tableId); if (tableController != null) { + if (user != null) { + replacePlayerName = "Draftbot (" + user.getName() + ")"; + } tableController.replaceDraftPlayer(leavingPlayer.getPlayer(), replacePlayerName, "Computer - draftbot", 5); - ChatManager.getInstance().broadcast(chatId, "", leavingPlayer.getPlayer().getName() + " was replaced by draftbot", MessageColor.BLACK, true, null); + if (user != null) { + user.removeDraft(leavingPlayer.getPlayer().getId()); + user.removeTable(leavingPlayer.getPlayer().getId()); + user.removeTournament(leavingPlayer.getPlayer().getId()); + } + ChatManager.getInstance().broadcast(chatId, "", leavingPlayer.getPlayer().getName() + " was replaced by draftbot", MessageColor.BLACK, true, MessageType.STATUS); } return true; } @@ -341,8 +357,12 @@ public class TournamentController { return new TournamentView(tournament); } - private void abortTournament() { - this.abort = true; + private void abortDraftTournament() { + tournament.setAbort(true); DraftManager.getInstance().getController(tableId).abortDraft(); } + + public boolean isAbort() { + return tournament.isAbort(); + } } diff --git a/Mage.Server/src/main/java/mage/server/tournament/TournamentSession.java b/Mage.Server/src/main/java/mage/server/tournament/TournamentSession.java index 8d2cf601d30..9ea8b93a610 100644 --- a/Mage.Server/src/main/java/mage/server/tournament/TournamentSession.java +++ b/Mage.Server/src/main/java/mage/server/tournament/TournamentSession.java @@ -147,7 +147,7 @@ public class TournamentSession { } } - public void removeTournament() { + public void removeTournamentForUser() { User user = UserManager.getInstance().getUser(userId); if (user != null) { user.removeTournament(playerId); @@ -163,7 +163,7 @@ public class TournamentSession { } void tournamentOver() { - //TODO: implement this + } } diff --git a/Mage/src/mage/cards/decks/Deck.java b/Mage/src/mage/cards/decks/Deck.java index d0ef19d0f33..5b0caa8fb05 100644 --- a/Mage/src/mage/cards/decks/Deck.java +++ b/Mage/src/mage/cards/decks/Deck.java @@ -39,8 +39,8 @@ import mage.game.GameException; public class Deck implements Serializable { private String name; - private Set cards = new LinkedHashSet(); - private Set sideboard = new LinkedHashSet(); + private final Set cards = new LinkedHashSet<>(); + private final Set sideboard = new LinkedHashSet<>(); public static Deck load(DeckCardLists deckCardLists) throws GameException { return Deck.load(deckCardLists, false); @@ -102,7 +102,7 @@ public class Deck implements Serializable { } public Set getExpansionSetCodes() { - Set sets = new LinkedHashSet(); + Set sets = new LinkedHashSet<>(); for (Card card : getCards()) { if (!sets.contains(card.getExpansionSetCode())) { sets.add(card.getExpansionSetCode()); diff --git a/Mage/src/mage/game/draft/BoosterDraft.java b/Mage/src/mage/game/draft/BoosterDraft.java index f37cd3fd67e..d7a0c6d3de8 100644 --- a/Mage/src/mage/game/draft/BoosterDraft.java +++ b/Mage/src/mage/game/draft/BoosterDraft.java @@ -43,13 +43,12 @@ public class BoosterDraft extends DraftImpl { @Override public void start() { - while (boosterNum < numberBoosters) { + while (!isAbort() && boosterNum < numberBoosters) { openBooster(); while (!isAbort() && pickCards()) { if (boosterNum % 2 == 1) { passLeft(); - } - else { + } else { passRight(); } fireUpdatePlayersEvent(); diff --git a/Mage/src/mage/game/draft/DraftImpl.java b/Mage/src/mage/game/draft/DraftImpl.java index f4caf1fc55d..40afbd8b87a 100644 --- a/Mage/src/mage/game/draft/DraftImpl.java +++ b/Mage/src/mage/game/draft/DraftImpl.java @@ -48,12 +48,13 @@ import mage.players.PlayerList; /** * * @author BetaSteward_at_googlemail.com + * @param */ public abstract class DraftImpl> implements Draft { protected final UUID id; - protected Map players = new HashMap(); - protected PlayerList table = new PlayerList(); + protected final Map players = new HashMap<>(); + protected final PlayerList table = new PlayerList(); protected int numberBoosters; protected DraftCube draftCube; protected List sets; @@ -95,7 +96,7 @@ public abstract class DraftImpl> implements Draft { DraftPlayer newDraftPlayer = new DraftPlayer(newPlayer); DraftPlayer oldDraftPlayer = players.get(oldPlayer.getId()); newDraftPlayer.setBooster(oldDraftPlayer.getBooster()); - Map newPlayers = new HashMap(); + Map newPlayers = new HashMap<>(); PlayerList newTable = new PlayerList(); synchronized (players) { for(Map.Entry entry :players.entrySet()) { @@ -105,7 +106,10 @@ public abstract class DraftImpl> implements Draft { newPlayers.put(entry.getKey(), entry.getValue()); } } - players = newPlayers; + players.clear(); + for (Map.Entry entry: newPlayers.entrySet()) { + players.put(entry.getKey(), entry.getValue()); + } } synchronized (table) { for(UUID playerId :table) { @@ -115,7 +119,8 @@ public abstract class DraftImpl> implements Draft { newTable.add(playerId); } } - table = newTable; + table.clear(); + table.addAll(newTable); } if (oldDraftPlayer.isPicking()) { newDraftPlayer.setPicking(); @@ -179,13 +184,13 @@ public abstract class DraftImpl> implements Draft { this.addPick(playerId, players.get(playerId).getBooster().get(0).getId()); } - protected void passLeft() { + protected void passLeft() { synchronized (players) { UUID startId = table.get(0); UUID currentId = startId; UUID nextId = table.getNext(); - DraftPlayer current = players.get(currentId); - DraftPlayer next = players.get(nextId); + DraftPlayer current = players.get(currentId); + DraftPlayer next = players.get(nextId); List currentBooster = current.booster; while (true) { List nextBooster = next.booster; @@ -194,8 +199,6 @@ public abstract class DraftImpl> implements Draft { break; } currentBooster = nextBooster; - current = next; - currentId = nextId; nextId = table.getNext(); next = players.get(nextId); } @@ -217,8 +220,6 @@ public abstract class DraftImpl> implements Draft { break; } currentBooster = prevBooster; - current = prev; - currentId = prevId; prevId = table.getPrevious(); prev = players.get(prevId); } @@ -261,6 +262,9 @@ public abstract class DraftImpl> implements Draft { } protected boolean donePicking() { + if(isAbort()) { + return true; + } for (DraftPlayer player: players.values()) { if (player.isPicking()) { return false; diff --git a/Mage/src/mage/game/draft/DraftPlayer.java b/Mage/src/mage/game/draft/DraftPlayer.java index c794ffbc2fb..9e798bd22ec 100644 --- a/Mage/src/mage/game/draft/DraftPlayer.java +++ b/Mage/src/mage/game/draft/DraftPlayer.java @@ -87,7 +87,7 @@ public class DraftPlayer { public List getBooster() { synchronized(booster) { - return new ArrayList(booster); + return new ArrayList<>(booster); } } diff --git a/Mage/src/mage/game/tournament/Tournament.java b/Mage/src/mage/game/tournament/Tournament.java index cd0eb1ad48b..8487c68b78b 100644 --- a/Mage/src/mage/game/tournament/Tournament.java +++ b/Mage/src/mage/game/tournament/Tournament.java @@ -84,5 +84,6 @@ public interface Tournament { int getNumberRounds(); void cleanUpOnTournamentEnd(); - + boolean isAbort(); + void setAbort(boolean abort); } diff --git a/Mage/src/mage/game/tournament/TournamentImpl.java b/Mage/src/mage/game/tournament/TournamentImpl.java index de75a69a0c5..c8fad5e3a05 100644 --- a/Mage/src/mage/game/tournament/TournamentImpl.java +++ b/Mage/src/mage/game/tournament/TournamentImpl.java @@ -73,10 +73,12 @@ public abstract class TournamentImpl implements Tournament { protected Date startTime; protected Date endTime; + protected boolean abort; public TournamentImpl(TournamentOptions options) { this.options = options; startTime = new Date(); + abort = false; } @Override @@ -320,22 +322,25 @@ public abstract class TournamentImpl implements Tournament { public void construct() { tableEventSource.fireTableEvent(EventType.CONSTRUCT); - for (final TournamentPlayer player: players.values()) { - player.setConstructing(); - new Thread( - new Runnable() { - @Override - public void run() { - player.getPlayer().construct(TournamentImpl.this, player.getDeck()); + if (!isAbort()) { + for (final TournamentPlayer player: players.values()) { + + player.setConstructing(); + new Thread( + new Runnable() { + @Override + public void run() { + player.getPlayer().construct(TournamentImpl.this, player.getDeck()); + } } + ).start(); + } + synchronized(this) { + while (!isDoneConstructing()) { + try { + this.wait(); + } catch (InterruptedException ex) { } } - ).start(); - } - synchronized(this) { - while (!isDoneConstructing()) { - try { - this.wait(); - } catch (InterruptedException ex) { } } } nextStep(); @@ -406,7 +411,11 @@ public abstract class TournamentImpl implements Tournament { for(TournamentPlayer winner: this.getActivePlayers()) { winner.setState(TournamentPlayerState.FINISHED); if (options.getNumberRounds() == 0) { // if no swiss, last active is the winner - winner.setStateInfo("Winner"); + if (isAbort()) { + winner.setStateInfo("Tournament canceled"); + } else { + winner.setStateInfo("Winner"); + } } } } @@ -418,4 +427,14 @@ public abstract class TournamentImpl implements Tournament { } } + @Override + public boolean isAbort() { + return abort; + } + + @Override + public void setAbort(boolean abort) { + this.abort = abort; + } + } diff --git a/Mage/src/mage/game/tournament/TournamentPlayer.java b/Mage/src/mage/game/tournament/TournamentPlayer.java index 5379781811c..56a1e1629cb 100644 --- a/Mage/src/mage/game/tournament/TournamentPlayer.java +++ b/Mage/src/mage/game/tournament/TournamentPlayer.java @@ -170,5 +170,15 @@ public class TournamentPlayer { public void CleanUpOnTournamentEnd() { this.deck = null; } + + public void setStateAtTournamentEnd() { + if (this.getState().equals(TournamentPlayerState.DRAFTING) + || this.getState().equals(TournamentPlayerState.CONSTRUCTING) + || this.getState().equals(TournamentPlayerState.DUELING) + || this.getState().equals(TournamentPlayerState.SIDEBOARDING) + || this.getState().equals(TournamentPlayerState.WAITING)) { + this.setState(TournamentPlayerState.FINISHED); + } + } }