From c774e95335afe9d1a066e9dcc6027e8d59e6525d Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Sat, 27 Jun 2015 09:32:50 +0200 Subject: [PATCH] * Fixed some possible java exception causes. --- .../src/main/java/mage/server/User.java | 80 ++++++------ .../java/mage/server/game/GamesRoomImpl.java | 84 ++++++------- .../PlaneswalkerRedirectionEffect.java | 25 ++-- Mage/src/mage/game/GameCommanderImpl.java | 114 +++++++++--------- .../watchers/common/CommanderInfoWatcher.java | 37 +++--- 5 files changed, 173 insertions(+), 167 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index 183e0704ca..2fc65355e9 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -1,16 +1,16 @@ /* * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,7 +20,7 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. @@ -43,6 +43,7 @@ import mage.game.Table; import mage.game.tournament.TournamentPlayer; import mage.interfaces.callback.ClientCallback; import mage.players.net.UserData; +import mage.players.net.UserGroup; import mage.server.draft.DraftSession; import mage.server.game.GameManager; import mage.server.game.GameSessionPlayer; @@ -53,7 +54,6 @@ import mage.server.util.SystemUtil; import mage.view.TableClientMessage; import org.apache.log4j.Logger; - /** * * @author BetaSteward_at_googlemail.com @@ -63,12 +63,13 @@ public class User { private static final Logger logger = Logger.getLogger(User.class); public enum UserState { + Created, Connected, Disconnected, Reconnected, Expired; } private final UUID userId; - private final String userName; - private final String host; + private final String userName; + private final String host; private final Date connectionTime; private final Map tables; private final ArrayList tablesToDelete; @@ -90,10 +91,10 @@ public class User { this.userName = userName; this.host = host; this.userState = UserState.Created; - + this.connectionTime = new Date(); this.lastActivity = new Date(); - + this.tables = new ConcurrentHashMap<>(); this.gameSessions = new ConcurrentHashMap<>(); this.draftSessions = new ConcurrentHashMap<>(); @@ -103,6 +104,8 @@ public class User { this.watchedGames = new ArrayList<>(); this.tablesToDelete = new ArrayList<>(); this.sessionId = ""; + // default these to avaiod NPE -> will be updated from client short after + this.userData = new UserData(UserGroup.PLAYER, 0, false, false, false, null, "world.png", false); } public String getName() { @@ -155,16 +158,16 @@ public class User { long secondsDisconnected = getSecondsDisconnected(); long secondsLeft; String sign = ""; - if (secondsDisconnected > (3 * 60)) { - sign="-"; - secondsLeft = secondsDisconnected - (3 *60); + if (secondsDisconnected > (3 * 60)) { + sign = "-"; + secondsLeft = secondsDisconnected - (3 * 60); } else { - secondsLeft = (3 * 60) - secondsDisconnected; + secondsLeft = (3 * 60) - secondsDisconnected; } int minutes = (int) secondsLeft / 60; int seconds = (int) secondsLeft % 60; - return new StringBuilder(sign).append(Integer.toString(minutes)).append(":").append(seconds > 9 ? seconds: "0" + Integer.toString(seconds)).toString(); + return new StringBuilder(sign).append(Integer.toString(minutes)).append(":").append(seconds > 9 ? seconds : "0" + Integer.toString(seconds)).toString(); } public long getSecondsDisconnected() { @@ -217,11 +220,11 @@ public class User { fireCallback(new ClientCallback("showGameEndDialog", gameId)); } - public void showUserMessage(final String titel, String message) { + public void showUserMessage(final String titel, String message) { List messageData = new LinkedList<>(); messageData.add(titel); messageData.add(message); - fireCallback(new ClientCallback("showUserMessage", null, messageData )); + fireCallback(new ClientCallback("showUserMessage", null, messageData)); } public boolean ccWatchGame(final UUID gameId) { @@ -248,7 +251,7 @@ public class User { GameManager.getInstance().sendPlayerManaType(gameId, playerId, userId, data); } - public void sendPlayerBoolean(final UUID gameId, final Boolean data) { + public void sendPlayerBoolean(final UUID gameId, final Boolean data) { lastActivity = new Date(); GameManager.getInstance().sendPlayerBoolean(gameId, userId, data); } @@ -275,14 +278,15 @@ public class User { return true; } logger.trace(new StringBuilder("isExpired: User ").append(userName).append(" lastActivity: ").append(lastActivity).append(" expired: ").append(expired).toString()); - return false; /*userState == UserState.Disconnected && */ + return false; /*userState == UserState.Disconnected && */ + } private void reconnect() { - for (Entry entry: tables.entrySet()) { + for (Entry entry : tables.entrySet()) { ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament()); } - for (Entry entry: userTournaments.entrySet()) { + for (Entry entry : userTournaments.entrySet()) { TournamentController tournamentController = TournamentManager.getInstance().getTournamentController(entry.getValue()); if (tournamentController != null) { ccTournamentStarted(entry.getValue(), entry.getKey()); @@ -290,22 +294,22 @@ public class User { } } - for (Entry entry: gameSessions.entrySet()) { + for (Entry entry : gameSessions.entrySet()) { ccGameStarted(entry.getValue().getGameId(), entry.getKey()); entry.getValue().init(); GameManager.getInstance().sendPlayerString(entry.getValue().getGameId(), userId, ""); } - for (Entry entry: draftSessions.entrySet()) { + for (Entry entry : draftSessions.entrySet()) { ccDraftStarted(entry.getValue().getDraftId(), entry.getKey()); entry.getValue().init(); entry.getValue().update(); } - - for (Entry entry: constructing.entrySet()) { + + for (Entry entry : constructing.entrySet()) { entry.getValue().construct(0); // TODO: Check if this is correct } - for (Entry entry: sideboarding.entrySet()) { + for (Entry entry : sideboarding.entrySet()) { TableController controller = TableManager.getInstance().getController(entry.getKey()); ccSideboard(entry.getValue(), entry.getKey(), controller.getRemainingTime(), controller.getOptions().isLimited()); } @@ -355,32 +359,32 @@ public class User { sideboarding.remove(tableId); } - public void remove(DisconnectReason reason) { + public void remove(DisconnectReason reason) { logger.trace("REMOVE " + getName() + " Draft sessions " + draftSessions.size()); - for (DraftSession draftSession: draftSessions.values()) { + for (DraftSession draftSession : draftSessions.values()) { draftSession.setKilled(); } draftSessions.clear(); logger.trace("REMOVE " + getName() + " Tournament sessions " + userTournaments.size()); - for (UUID tournamentId: userTournaments.values()) { + for (UUID tournamentId : userTournaments.values()) { TournamentManager.getInstance().quit(tournamentId, getId()); } userTournaments.clear(); logger.trace("REMOVE " + getName() + " Tables " + tables.size()); - for (Entry entry: tables.entrySet()) { + for (Entry entry : tables.entrySet()) { logger.debug("-- leave tableId: " + entry.getValue().getId()); TableManager.getInstance().leaveTable(userId, entry.getValue().getId()); } tables.clear(); - logger.trace("REMOVE " + getName() + " Game sessions: " + gameSessions.size() ); - for (GameSessionPlayer gameSessionPlayer: gameSessions.values()) { - logger.debug("-- kill game session of gameId: " + gameSessionPlayer.getGameId() ); + logger.trace("REMOVE " + getName() + " Game sessions: " + gameSessions.size()); + for (GameSessionPlayer gameSessionPlayer : gameSessions.values()) { + logger.debug("-- kill game session of gameId: " + gameSessionPlayer.getGameId()); GameManager.getInstance().quitMatch(gameSessionPlayer.getGameId(), userId); gameSessionPlayer.quitGame(); } gameSessions.clear(); logger.trace("REMOVE " + getName() + " watched Games " + watchedGames.size()); - for (UUID gameId: watchedGames) { + for (UUID gameId : watchedGames) { GameManager.getInstance().stopWatching(gameId, userId); } watchedGames.clear(); @@ -428,7 +432,7 @@ public class User { } if (!isConnected()) { - tournamentPlayer.setDisconnectInfo(" (discon. "+ getDisconnectDuration() + ")"); + tournamentPlayer.setDisconnectInfo(" (discon. " + getDisconnectDuration() + ")"); } else { tournamentPlayer.setDisconnectInfo(""); } @@ -460,7 +464,7 @@ public class User { } } if (!tablesToDelete.isEmpty()) { - for(UUID keyId: tablesToDelete) { + for (UUID keyId : tablesToDelete) { removeTable(keyId); } tablesToDelete.clear(); @@ -513,8 +517,8 @@ public class User { if (isConnected()) { return pingInfo; } else { - return " (discon. "+ getDisconnectDuration() + ")"; + return " (discon. " + getDisconnectDuration() + ")"; } } - + } 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 55c9205065..485ce0252c 100644 --- a/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java +++ b/Mage.Server/src/main/java/mage/server/game/GamesRoomImpl.java @@ -1,31 +1,30 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright notice, this list -* of conditions and the following disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR -* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* The views and conclusions contained in the software and documentation are those of the -* authors and should not be interpreted as representing official policies, either expressed -* or implied, of BetaSteward_at_googlemail.com. -*/ - + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ package mage.server.game; import java.io.Serializable; @@ -73,16 +72,16 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { private final ConcurrentHashMap tables = new ConcurrentHashMap<>(); - public GamesRoomImpl() { + public GamesRoomImpl() { updateExecutor.scheduleAtFixedRate(new Runnable() { @Override - public void run(){ + public void run() { try { update(); } catch (Exception ex) { logger.fatal("Games room update exception! " + ex.toString(), ex); } - + } }, 2, 2, TimeUnit.SECONDS); } @@ -97,12 +96,11 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { ArrayList matchList = new ArrayList<>(); List allTables = new ArrayList<>(tables.values()); Collections.sort(allTables, new TableListSorter()); - for (Table table: allTables) { + for (Table table : allTables) { if (table.getState() != TableState.FINISHED) { tableList.add(new TableView(table)); - } - else if (matchList.size() < 50) { - if (table.isTournament()) { + } else if (matchList.size() < 50) { + if (table.isTournament()) { matchList.add(new MatchView(table)); } else { matchList.add(new MatchView(table)); @@ -113,23 +111,23 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { TournamentManager.getInstance().removeTournament(table.getTournament().getId()); } this.removeTable(table.getId()); - } + } } tableView = tableList; matchView = matchList; List users = new ArrayList<>(); for (User user : UserManager.getInstance().getUsers()) { try { - users.add(new UsersView(user.getUserData().getFlagName(), user.getName(), user.getInfo(), user.getGameInfo(), user.getPingInfo())); + users.add(new UsersView(user.getUserData().getFlagName(), user.getName(), user.getInfo(), user.getGameInfo(), user.getPingInfo())); } catch (Exception ex) { logger.fatal("User update exception: " + user.getName() + " - " + ex.toString(), ex); users.add(new UsersView(user.getUserData().getFlagName(), user.getName(), user.getInfo(), "[exception]", user.getPingInfo())); } } - Collections.sort(users, new UserNameSorter()); + Collections.sort(users, new UserNameSorter()); List roomUserInfo = new ArrayList<>(); - roomUserInfo.add(new RoomUsersView(users, + roomUserInfo.add(new RoomUsersView(users, GameManager.getInstance().getNumberActiveGames(), ThreadExecutor.getInstance().getActiveThreads(ThreadExecutor.getInstance().getGameExecutor()), ConfigSettings.getInstance().getMaxGameThreads() @@ -218,18 +216,19 @@ public class GamesRoomImpl extends RoomImpl implements GamesRoom, Serializable { /** * Sorts the tables for table and match view of the client room - * + * * @author LevelX2 */ class TableListSorter implements Comparator
{ + @Override public int compare(Table one, Table two) { if (!one.getState().equals(TableState.SIDEBOARDING) && !one.getState().equals(TableState.DUELING)) { - if (one.getState().compareTo(two.getState()) != 0 ) { + if (one.getState().compareTo(two.getState()) != 0) { return one.getState().compareTo(two.getState()); } } else if (!two.getState().equals(TableState.SIDEBOARDING) && !two.getState().equals(TableState.DUELING)) { - if (one.getState().compareTo(two.getState()) != 0 ) { + if (one.getState().compareTo(two.getState()) != 0) { return one.getState().compareTo(two.getState()); } } @@ -259,8 +258,9 @@ class TableListSorter implements Comparator
{ } class UserNameSorter implements Comparator { + @Override public int compare(UsersView one, UsersView two) { return one.getUserName().compareToIgnoreCase(two.getUserName()); } -} \ No newline at end of file +} diff --git a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java index 3e4aad2d6e..2ec88278ea 100644 --- a/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java +++ b/Mage/src/mage/abilities/effects/PlaneswalkerRedirectionEffect.java @@ -1,16 +1,16 @@ /* * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,14 +20,14 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. */ - package mage.abilities.effects; +import java.util.List; import java.util.UUID; import mage.abilities.Ability; import mage.constants.Duration; @@ -42,7 +42,6 @@ import mage.game.stack.StackObject; import mage.players.Player; import mage.target.TargetPermanent; - /** * * @author BetaSteward_at_googlemail.com @@ -68,10 +67,10 @@ public class PlaneswalkerRedirectionEffect extends RedirectionEffect { public boolean checksEventType(GameEvent event, Game game) { return event.getType() == EventType.DAMAGE_PLAYER; } - + @Override public boolean applies(GameEvent event, Ability source, Game game) { - DamageEvent damageEvent = (DamageEvent)event; + DamageEvent damageEvent = (DamageEvent) event; UUID playerId = getSourceControllerId(event.getSourceId(), game); if (!damageEvent.isCombatDamage() && game.getOpponents(event.getTargetId()).contains(playerId)) { Player target = game.getPlayer(event.getTargetId()); @@ -81,9 +80,11 @@ public class PlaneswalkerRedirectionEffect extends RedirectionEffect { if (numPlaneswalkers > 0 && player.chooseUse(outcome, "Redirect damage to planeswalker?", game)) { redirectTarget = new TargetPermanent(filter); if (numPlaneswalkers == 1) { - redirectTarget.add(game.getBattlefield().getAllActivePermanents(filter, target.getId(), game).get(0).getId(), game); - } - else { + List planeswalker = game.getBattlefield().getAllActivePermanents(filter, target.getId(), game); + if (!planeswalker.isEmpty()) { + redirectTarget.add(planeswalker.get(0).getId(), game); + } + } else { player.choose(Outcome.Damage, redirectTarget, null, game); } if (!game.isSimulation()) { diff --git a/Mage/src/mage/game/GameCommanderImpl.java b/Mage/src/mage/game/GameCommanderImpl.java index 92fbac3425..f6a47aad00 100644 --- a/Mage/src/mage/game/GameCommanderImpl.java +++ b/Mage/src/mage/game/GameCommanderImpl.java @@ -1,31 +1,30 @@ /* -* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. -* -* Redistribution and use in source and binary forms, with or without modification, are -* permitted provided that the following conditions are met: -* -* 1. Redistributions of source code must retain the above copyright notice, this list of -* conditions and the following disclaimer. -* -* 2. Redistributions in binary form must reproduce the above copyright notice, this list -* of conditions and the following disclaimer in the documentation and/or other materials -* provided with the distribution. -* -* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED -* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND -* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR -* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING -* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF -* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -* -* The views and conclusions contained in the software and documentation are those of the -* authors and should not be interpreted as representing official policies, either expressed -* or implied, of BetaSteward_at_googlemail.com. -*/ - + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ package mage.game; import java.util.HashMap; @@ -57,10 +56,10 @@ import mage.watchers.common.CommanderInfoWatcher; public abstract class GameCommanderImpl extends GameImpl { static boolean CHECK_COMMANDER_DAMAGE = true; - + private final Map mulliganedCards = new HashMap<>(); // private final Set commanderCombatWatcher = new HashSet<>(); - + protected boolean alsoHand; // replace commander going to hand protected boolean alsoLibrary; // replace commander going to library protected boolean startingPlayerSkipsDraw = true; @@ -80,12 +79,12 @@ public abstract class GameCommanderImpl extends GameImpl { protected void init(UUID choosingPlayerId) { Ability ability = new SimpleStaticAbility(Zone.COMMAND, new InfoEffect("Commander effects")); //Move commander to command zone - for (UUID playerId: state.getPlayerList(startingPlayerId)) { + for (UUID playerId : state.getPlayerList(startingPlayerId)) { Player player = getPlayer(playerId); - if (player != null){ - if (player.getSideboard().size() > 0){ - Card commander = getCard((UUID)player.getSideboard().toArray()[0]); - if (commander != null) { + if (player != null) { + if (player.getSideboard().size() > 0) { + Card commander = getCard((UUID) player.getSideboard().toArray()[0]); + if (commander != null) { player.setCommanderId(commander.getId()); commander.moveToZone(Zone.COMMAND, null, this, true); commander.getAbilities().setControllerId(player.getId()); @@ -107,7 +106,6 @@ public abstract class GameCommanderImpl extends GameImpl { state.getTurnMods().add(new TurnMod(startingPlayerId, PhaseStep.DRAW)); } } - //20130711 /*903.8. The Commander variant uses an alternate mulligan rule. @@ -123,12 +121,12 @@ public abstract class GameCommanderImpl extends GameImpl { TargetCardInHand target = new TargetCardInHand(1, player.getHand().size(), new FilterCard("card to mulligan")); target.setNotTarget(true); target.setRequired(false); - if (player.choose(Outcome.Exile, player.getHand(), target, this)){ + if (player.choose(Outcome.Exile, player.getHand(), target, this)) { int numCards = target.getTargets().size(); - for(UUID uuid : target.getTargets()){ + for (UUID uuid : target.getTargets()) { Card card = player.getHand().get(uuid, this); - if(card != null){ - if(!mulliganedCards.containsKey(playerId)){ + if (card != null) { + if (!mulliganedCards.containsKey(playerId)) { mulliganedCards.put(playerId, new CardsImpl()); } card.moveToExile(null, "", null, this); @@ -140,14 +138,15 @@ public abstract class GameCommanderImpl extends GameImpl { if (freeMulligans > 0) { if (usedFreeMulligans != null && usedFreeMulligans.containsKey(player.getId())) { int used = usedFreeMulligans.get(player.getId()); - if (used < freeMulligans ) { + if (used < freeMulligans) { deduction = 0; - usedFreeMulligans.put(player.getId(), used+1); + usedFreeMulligans.put(player.getId(), used + 1); } } else { - deduction = 0;{ + deduction = 0; + { - } + } usedFreeMulligans.put(player.getId(), 1); } } @@ -155,25 +154,25 @@ public abstract class GameCommanderImpl extends GameImpl { fireInformEvent(new StringBuilder(player.getLogName()) .append(" mulligans ") .append(numCards) - .append(numCards == 1? " card":" cards") - .append(deduction == 0 ? " for free and draws ":" down to ") + .append(numCards == 1 ? " card" : " cards") + .append(deduction == 0 ? " for free and draws " : " down to ") .append(Integer.toString(player.getHand().size())) - .append(player.getHand().size() <= 1? " card":" cards").toString()); + .append(player.getHand().size() <= 1 ? " card" : " cards").toString()); } } @Override - public void endMulligan(UUID playerId){ + public void endMulligan(UUID playerId) { //return cards to Player player = getPlayer(playerId); - if(player != null && mulliganedCards.containsKey(playerId)){ - for(Card card : mulliganedCards.get(playerId).getCards(this)){ - if(card != null){ + if (player != null && mulliganedCards.containsKey(playerId)) { + for (Card card : mulliganedCards.get(playerId).getCards(this)) { + if (card != null) { card.moveToZone(Zone.LIBRARY, null, this, false); card.setFaceDown(false, this); } } - if(mulliganedCards.get(playerId).size() > 0){ + if (mulliganedCards.get(playerId).size() > 0) { player.shuffleLibrary(this); } } @@ -186,12 +185,15 @@ public abstract class GameCommanderImpl extends GameImpl { */ @Override protected boolean checkStateBasedActions() { - for (Player player: getPlayers().values()) { + for (Player player : getPlayers().values()) { CommanderInfoWatcher damageWatcher = (CommanderInfoWatcher) getState().getWatchers().get("CommanderCombatDamageWatcher", player.getCommanderId()); - for(Map.Entry entrySet : damageWatcher.getDamageToPlayer().entrySet()){ + if (damageWatcher == null) { + continue; + } + for (Map.Entry entrySet : damageWatcher.getDamageToPlayer().entrySet()) { if (entrySet.getValue() > 20) { Player opponent = getPlayer(entrySet.getKey()); - if (opponent != null && player.isInGame()){ + if (opponent != null && player.isInGame()) { opponent.lost(this); } } @@ -203,7 +205,7 @@ public abstract class GameCommanderImpl extends GameImpl { @Override public Set getOpponents(UUID playerId) { Set opponents = new HashSet<>(); - for (UUID opponentId: this.getPlayer(playerId).getInRange()) { + for (UUID opponentId : this.getPlayer(playerId).getInRange()) { if (!opponentId.equals(playerId)) { opponents.add(opponentId); } @@ -213,7 +215,7 @@ public abstract class GameCommanderImpl extends GameImpl { @Override public boolean isOpponent(Player player, UUID playerToCheck) { - return !player.getId().equals(playerToCheck); + return !player.getId().equals(playerToCheck); } public void setAlsoHand(boolean alsoHand) { diff --git a/Mage/src/mage/watchers/common/CommanderInfoWatcher.java b/Mage/src/mage/watchers/common/CommanderInfoWatcher.java index a59f3eb800..963fcaf374 100644 --- a/Mage/src/mage/watchers/common/CommanderInfoWatcher.java +++ b/Mage/src/mage/watchers/common/CommanderInfoWatcher.java @@ -1,16 +1,16 @@ /* * Copyright 2011 BetaSteward_at_googlemail.com. All rights reserved. - * + * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: - * + * * 1. Redistributions of source code must retain the above copyright notice, this list of * conditions and the following disclaimer. - * + * * 2. Redistributions in binary form must reproduce the above copyright notice, this list * of conditions and the following disclaimer in the documentation and/or other materials * provided with the distribution. - * + * * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR @@ -20,7 +20,7 @@ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * + * * The views and conclusions contained in the software and documentation are those of the * authors and should not be interpreted as representing official policies, either expressed * or implied, of BetaSteward_at_googlemail.com. @@ -43,15 +43,14 @@ import mage.watchers.Watcher; /* 20130711 *903.14a A player that’s been dealt 21 or more combat damage by the same commander - * over the course of the game loses the game. (This is a state-based action. See rule 704.) + * over the course of the game loses the game. (This is a state-based action. See rule 704.) * * * @author Plopman */ - public class CommanderInfoWatcher extends Watcher { - public Map damageToPlayer = new HashMap<>(); + public final Map damageToPlayer = new HashMap<>(); public boolean checkCommanderDamage; public CommanderInfoWatcher(UUID commander, boolean checkCommanderDamage) { @@ -59,7 +58,6 @@ public class CommanderInfoWatcher extends Watcher { this.sourceId = commander; this.checkCommanderDamage = checkCommanderDamage; } - public CommanderInfoWatcher(final CommanderInfoWatcher watcher) { super(watcher); @@ -76,20 +74,21 @@ public class CommanderInfoWatcher extends Watcher { public void watch(GameEvent event, Game game) { if (checkCommanderDamage && event.getType() == EventType.DAMAGED_PLAYER && event instanceof DamagedPlayerEvent) { if (sourceId.equals(event.getSourceId())) { - DamagedPlayerEvent damageEvent = (DamagedPlayerEvent)event; + DamagedPlayerEvent damageEvent = (DamagedPlayerEvent) event; if (damageEvent.isCombatDamage()) { UUID playerUUID = event.getTargetId(); Integer damage = damageToPlayer.get(playerUUID); - if(damage == null){ + if (damage == null) { damage = 0; } damage += damageEvent.getAmount(); damageToPlayer.put(playerUUID, damage); Player player = game.getPlayer(playerUUID); MageObject commander = game.getObject(sourceId); - if (player != null && commander != null){ - if (!game.isSimulation()) + if (player != null && commander != null) { + if (!game.isSimulation()) { game.informPlayers(commander.getLogName() + " did " + damage + " combat damage to " + player.getLogName() + " during the game."); + } this.addCardInfoToCommander(game); } } @@ -109,18 +108,18 @@ public class CommanderInfoWatcher extends Watcher { if (object != null) { StringBuilder sb = new StringBuilder(); sb.append("Commander"); - Integer castCount = (Integer)game.getState().getValue(sourceId + "_castCount"); + Integer castCount = (Integer) game.getState().getValue(sourceId + "_castCount"); if (castCount != null) { - sb.append(" ").append(castCount).append(castCount == 1 ? " time":" times").append(" casted from the command zone."); + sb.append(" ").append(castCount).append(castCount == 1 ? " time" : " times").append(" casted from the command zone."); } - this.addInfo(object, "Commander",sb.toString(), game); - + this.addInfo(object, "Commander", sb.toString(), game); + if (checkCommanderDamage) { for (Map.Entry entry : damageToPlayer.entrySet()) { Player damagedPlayer = game.getPlayer(entry.getKey()); sb.setLength(0); sb.append("Commander did ").append(entry.getValue()).append(" combat damage to player ").append(damagedPlayer.getLogName()).append("."); - this.addInfo(object, new StringBuilder("Commander").append(entry.getKey()).toString(),sb.toString(), game); + this.addInfo(object, new StringBuilder("Commander").append(entry.getKey()).toString(), sb.toString(), game); } } } @@ -135,6 +134,6 @@ public class CommanderInfoWatcher extends Watcher { public Map getDamageToPlayer() { return damageToPlayer; - } + } }