diff --git a/Mage.Server/src/main/java/mage/server/User.java b/Mage.Server/src/main/java/mage/server/User.java index a6e4bd83e8f..a8a6cf0188e 100644 --- a/Mage.Server/src/main/java/mage/server/User.java +++ b/Mage.Server/src/main/java/mage/server/User.java @@ -34,6 +34,7 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import mage.cards.decks.Deck; import mage.game.Table; import mage.interfaces.callback.ClientCallback; @@ -62,27 +63,40 @@ public class User { LostConnection, Disconnected, CleaningUp, ConnectingOtherInstance; } - private UUID userId = UUID.randomUUID(); - private String userName; - private String sessionId = ""; - private String host; + private final UUID userId; + private final String userName; + private final String host; + private final Date connectionTime; + private final Map tables; + private final Map gameSessions; + private final Map draftSessions; + private final Map tournamentSessions; + private final Map constructing; + private final Map sideboarding; + + private String sessionId; private String info; - private Date connectionTime = new Date(); - private Date lastActivity = new Date(); + private Date lastActivity; private UserState userState; - private Map tables = new HashMap(); - private Map gameSessions = new HashMap(); - private Map draftSessions = new HashMap(); - private Map tournamentSessions = new HashMap(); - private Map constructing = new HashMap(); - private Map sideboarding = new HashMap(); - private UserData userData; public User(String userName, String host) { + this.userId = UUID.randomUUID(); 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(); + this.tournamentSessions = new ConcurrentHashMap(); + this.constructing = new ConcurrentHashMap(); + this.sideboarding = new ConcurrentHashMap(); + + this.sessionId = ""; } public String getName() { @@ -219,16 +233,19 @@ public class User { entry.getValue().init(); entry.getValue().update(); } + for (Entry entry: gameSessions.entrySet()) { gameStarted(entry.getValue().getGameId(), entry.getKey()); entry.getValue().init(); GameManager.getInstance().sendPlayerString(entry.getValue().getGameId(), userId, ""); } + for (Entry entry: draftSessions.entrySet()) { draftStarted(entry.getValue().getDraftId(), entry.getKey()); entry.getValue().init(); entry.getValue().update(); } + for (Entry entry: constructing.entrySet()) { entry.getValue().construct(0); } diff --git a/Mage/src/mage/game/GameImpl.java b/Mage/src/mage/game/GameImpl.java index 8474f9f20fc..b0026657400 100644 --- a/Mage/src/mage/game/GameImpl.java +++ b/Mage/src/mage/game/GameImpl.java @@ -1708,7 +1708,7 @@ public abstract class GameImpl> implements Game, Serializa */ @Override - public synchronized void leave(UUID playerId) { + public void leave(UUID playerId) { Player player = getPlayer(playerId); if (player.hasLeft()) { return; @@ -1744,10 +1744,12 @@ public abstract class GameImpl> implements Game, Serializa } } // Then, if there are any objects still controlled by that player, those objects are exiled. - for (Iterator it = getBattlefield().getAllPermanents().iterator(); it.hasNext();) { - Permanent perm = it.next(); - if (perm.getControllerId().equals(playerId)) { - perm.moveToExile(null, "", null, this); + synchronized(getBattlefield()){ + for (Iterator it = getBattlefield().getAllPermanents().iterator(); it.hasNext();) { + Permanent perm = it.next(); + if (perm.getControllerId().equals(playerId)) { + perm.moveToExile(null, "", null, this); + } } }