From 8c19bcbc28db70c23a1a9cb0d5e53cf3e6b0612d Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Mon, 2 Jan 2017 01:52:29 -0600 Subject: [PATCH] Refactored parts of PlayerManager and LoginService --- src/resources/player/Player.java | 9 - src/services/player/LoginService.java | 132 +++++++------ src/services/player/PlayerManager.java | 249 +++++++++++-------------- 3 files changed, 176 insertions(+), 214 deletions(-) diff --git a/src/resources/player/Player.java b/src/resources/player/Player.java index 7755d3a50..c638cd5c4 100644 --- a/src/resources/player/Player.java +++ b/src/resources/player/Player.java @@ -46,7 +46,6 @@ public class Player implements Comparable { private String username = ""; private int userId = 0; - private byte [] sessionToken = new byte[0]; private int connectionId = 0; private AccessLevel accessLevel = AccessLevel.PLAYER; private PlayerServer server = PlayerServer.NONE; @@ -97,10 +96,6 @@ public class Player implements Comparable { this.connectionId = connId; } - public void setSessionToken(byte [] sessionToken) { - this.sessionToken = sessionToken; - } - public void setAccessLevel(AccessLevel accessLevel) { this.accessLevel = accessLevel; } @@ -151,10 +146,6 @@ public class Player implements Comparable { return connectionId; } - public byte [] getSessionToken() { - return sessionToken; - } - public AccessLevel getAccessLevel() { return accessLevel; } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index bdfff3259..d3212609e 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -39,7 +39,6 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; -import java.util.Random; import network.packets.Packet; import network.packets.swg.ErrorMessage; @@ -77,16 +76,14 @@ import services.CoreManager; public class LoginService extends Service { private static final String REQUIRED_VERSION = "20111130-15:46"; + private static final byte [] SESSION_TOKEN = new byte[24]; - private Random random; private PreparedStatement getUser; private PreparedStatement getCharacter; private PreparedStatement getCharacters; private PreparedStatement deleteCharacter; public LoginService() { - random = new Random(); - registerForIntent(DeleteCharacterIntent.TYPE); registerForIntent(GalacticPacketIntent.TYPE); } @@ -95,7 +92,7 @@ public class LoginService extends Service { public boolean initialize() { RelationalDatabase local = getLocalDatabase(); getUser = local.prepareStatement("SELECT * FROM users WHERE LOWER(username) = LOWER(?)"); - getCharacter = local.prepareStatement("SELECT * FROM characters WHERE LOWER(name) = LOWER(?)"); + getCharacter = local.prepareStatement("SELECT id FROM characters WHERE userid = ?"); getCharacters = local.prepareStatement("SELECT * FROM characters WHERE userid = ?"); deleteCharacter = local.prepareStatement("DELETE FROM characters WHERE id = ?"); return super.initialize(); @@ -107,17 +104,41 @@ public class LoginService extends Service { deleteCharacter(((DeleteCharacterIntent) i).getCreature()); } else if (i instanceof GalacticPacketIntent) { GalacticPacketIntent gpi = (GalacticPacketIntent) i; - handlePacket(gpi, gpi.getPlayerManager().getPlayerFromNetworkId(gpi.getNetworkId()), gpi.getPacket()); + handlePacket(gpi, gpi.getPacket()); } } - public void handlePacket(GalacticIntent intent, Player player, Packet p) { - if (p instanceof LoginClientId) - handleLogin(player, (LoginClientId) p); - if (p instanceof DeleteCharacterRequest) - handleCharDeletion(intent, player, (DeleteCharacterRequest) p); - if (p instanceof LagRequest && player.getPlayerServer() == PlayerServer.LOGIN) - handleLagRequest(player); + public long getCharacterId(String name) { + Assert.notNull(name); + Assert.test(!name.trim().isEmpty()); + synchronized (getCharacter) { + try { + getCharacter.setString(1, name); + try (ResultSet set = getCharacter.executeQuery()) { + if (set.next()) + return set.getLong("id"); + } + } catch (SQLException e) { + Log.e(this, e); + } + } + return 0; + } + + private void handlePacket(GalacticPacketIntent gpi, Packet p) { + if (p instanceof LoginClientId) { + handleLogin(getPlayer(gpi.getPlayerManager(), gpi.getNetworkId()), (LoginClientId) p); + } else if (p instanceof DeleteCharacterRequest) { + handleCharDeletion(gpi, getPlayer(gpi.getPlayerManager(), gpi.getNetworkId()), (DeleteCharacterRequest) p); + } else if (p instanceof LagRequest) { + Player player = getPlayer(gpi.getPlayerManager(), gpi.getNetworkId()); + if (player.getPlayerServer() == PlayerServer.LOGIN) + handleLagRequest(player); + } + } + + private Player getPlayer(PlayerManager playerManager, long networkId) { + return playerManager.getPlayerFromNetworkId(networkId); } private String getServerString() { @@ -133,18 +154,20 @@ public class LoginService extends Service { private void handleCharDeletion(GalacticIntent intent, Player player, DeleteCharacterRequest request) { SWGObject obj = intent.getObjectManager().getObjectById(request.getPlayerId()); - boolean success = false; - if (obj != null && obj instanceof CreatureObject) { - success = deleteCharacter(obj); - Log.i("LoginService", "Deleted character %s for user %s", ((CreatureObject)obj).getName(), player.getUsername()); - } else - Log.w("LoginService", "Could not delete character! Character: ID: " + request.getPlayerId() + " / " + obj); + boolean success = obj != null && deleteCharacter(obj); + if (success) { + new DestroyObjectIntent(obj).broadcast(); + Log.i(this, "Deleted character %s for user %s", ((CreatureObject)obj).getName(), player.getUsername()); + } else { + Log.e(this, "Could not delete character! Character: ID: " + request.getPlayerId() + " / " + obj); + } player.sendPacket(new DeleteCharacterResponse(success)); } private void handleLogin(Player player, LoginClientId id) { Assert.notNull(player); Assert.test(player.getPlayerState() == PlayerState.CONNECTED); + Assert.test(player.getPlayerServer() == PlayerServer.NONE); player.setPlayerState(PlayerState.LOGGING_IN); player.setPlayerServer(PlayerServer.LOGIN); final boolean doClientCheck = getConfig(ConfigFile.NETWORK).getBoolean("LOGIN-VERSION-CHECKS", true); @@ -174,7 +197,7 @@ public class LoginService extends Service { } private void onLoginClientVersionError(Player player, LoginClientId id) { - Log.i("LoginService", "%s cannot login due to invalid version code: %s, expected %s from %s:%d", player.getUsername(), id.getVersion(), REQUIRED_VERSION, id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to invalid version code: %s, expected %s from %s:%d", player.getUsername(), id.getVersion(), REQUIRED_VERSION, id.getAddress(), id.getPort()); String type = "Login Failed!"; String message = "Invalid Client Version Code: " + id.getVersion(); player.sendPacket(new ErrorMessage(type, message, false)); @@ -185,10 +208,6 @@ public class LoginService extends Service { private void onSuccessfulLogin(ResultSet user, Player player, LoginClientId id) throws SQLException { player.setUsername(user.getString("username")); player.setUserId(user.getInt("id")); - int tokenLength = getConfig(ConfigFile.NETWORK).getInt("SESSION-TOKEN-LENGTH", 24); - byte [] sessionToken = new byte[tokenLength]; - random.nextBytes(sessionToken); - player.setSessionToken(sessionToken); switch(user.getString("access_level")) { case "player": player.setAccessLevel(AccessLevel.PLAYER); break; case "warden": player.setAccessLevel(AccessLevel.WARDEN); break; @@ -199,7 +218,7 @@ public class LoginService extends Service { } player.setPlayerState(PlayerState.LOGGED_IN); sendLoginSuccessPacket(player); - Log.i("LoginService", "%s connected to the login server from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s connected to the login server from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_SUCCESS).broadcast(); } @@ -207,7 +226,7 @@ public class LoginService extends Service { String type = "Login Failed!"; String message = "Sorry, you're banned!"; player.sendPacket(new ErrorMessage(type, message, false)); - Log.i("LoginService", "%s cannot login due to a ban, from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to a ban, from %s:%d", player.getUsername(), id.getAddress(), id.getPort()); player.setPlayerState(PlayerState.DISCONNECTED); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_BANNED).broadcast(); } @@ -217,7 +236,7 @@ public class LoginService extends Service { String message = getUserPassError(set, id.getUsername(), id.getPassword()); player.sendPacket(new ErrorMessage(type, message, false)); player.sendPacket(new LoginIncorrectClientId(getServerString(), REQUIRED_VERSION)); - Log.i("LoginService", "%s cannot login due to invalid user/pass from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); + Log.i(this, "%s cannot login due to invalid user/pass from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); player.setPlayerState(PlayerState.DISCONNECTED); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_INVALID_USER_PASS).broadcast(); } @@ -227,27 +246,27 @@ public class LoginService extends Service { String message = "Server Error."; player.sendPacket(new ErrorMessage(type, message, false)); player.setPlayerState(PlayerState.DISCONNECTED); - Log.e("LoginService", "%s cannot login due to server error, from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); + Log.e(this, "%s cannot login due to server error, from %s:%d", id.getUsername(), id.getAddress(), id.getPort()); new LoginEventIntent(player.getNetworkId(), LoginEvent.LOGIN_FAIL_SERVER_ERROR).broadcast(); } - private void sendLoginSuccessPacket(Player p) throws SQLException { - LoginClientToken token = new LoginClientToken(p.getSessionToken(), p.getUserId(), p.getUsername()); + private void sendLoginSuccessPacket(Player player) throws SQLException { + LoginClientToken token = new LoginClientToken(SESSION_TOKEN, player.getUserId(), player.getUsername()); LoginEnumCluster cluster = new LoginEnumCluster(); LoginClusterStatus clusterStatus = new LoginClusterStatus(); - List galaxies = getGalaxies(p); - SWGCharacter [] characters = getCharacters(p.getUserId()); + List galaxies = getGalaxies(player); + SWGCharacter [] characters = getCharacters(player.getUserId()); for (Galaxy g : galaxies) { cluster.addGalaxy(g); clusterStatus.addGalaxy(g); } cluster.setMaxCharacters(getConfig(ConfigFile.PRIMARY).getInt("GALAXY-MAX-CHARACTERS", 2)); - p.sendPacket(new ServerNowEpochTime((int)(System.currentTimeMillis()/1E3))); - p.sendPacket(token); - p.sendPacket(cluster); - p.sendPacket(new CharacterCreationDisabled()); - p.sendPacket(new EnumerateCharacterId(characters)); - p.sendPacket(clusterStatus); + player.sendPacket(new ServerNowEpochTime((int)(System.currentTimeMillis()/1E3))); + player.sendPacket(token); + player.sendPacket(cluster); + player.sendPacket(new CharacterCreationDisabled()); + player.sendPacket(new EnumerateCharacterId(characters)); + player.sendPacket(clusterStatus); } private boolean isUserValid(ResultSet set, String password) throws SQLException { @@ -279,13 +298,6 @@ public class LoginService extends Service { return "Invalid password"; } - public ResultSet getCharacter(String character) throws SQLException { - synchronized (getCharacter) { - getCharacter.setString(1, character); - return getCharacter.executeQuery(); - } - } - private List getGalaxies(Player p) throws SQLException { List galaxies = new ArrayList<>(); galaxies.add(CoreManager.getGalaxy()); @@ -293,27 +305,25 @@ public class LoginService extends Service { } private SWGCharacter [] getCharacters(int userId) throws SQLException { - getCharacters.setInt(1, userId); - ResultSet set = getCharacters.executeQuery(); - List characters = new ArrayList<>(); - try { - while (set.next()) { - SWGCharacter c = new SWGCharacter(); - c.setId(set.getInt("id")); - c.setName(set.getString("name")); - c.setGalaxyId(CoreManager.getGalaxyId()); - c.setRaceCrc(Race.getRaceByFile(set.getString("race")).getCrc()); - c.setType(1); // 1 = Normal (2 = Jedi, 3 = Spectral) - characters.add(c); + synchronized (getCharacters) { + getCharacters.setInt(1, userId); + List characters = new ArrayList<>(); + try (ResultSet set = getCharacters.executeQuery()) { + while (set.next()) { + SWGCharacter c = new SWGCharacter(); + c.setId(set.getInt("id")); + c.setName(set.getString("name")); + c.setGalaxyId(CoreManager.getGalaxyId()); + c.setRaceCrc(Race.getRaceByFile(set.getString("race")).getCrc()); + c.setType(1); // 1 = Normal (2 = Jedi, 3 = Spectral) + characters.add(c); + } } - } finally { - set.close(); + return characters.toArray(new SWGCharacter[characters.size()]); } - return characters.toArray(new SWGCharacter[characters.size()]); } private boolean deleteCharacter(SWGObject obj) { - new DestroyObjectIntent(obj).broadcast(); synchronized (deleteCharacter) { try { deleteCharacter.setLong(1, obj.getObjectId()); diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index c260e8923..f9a0a7dc9 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -27,69 +27,60 @@ ***********************************************************************************/ package services.player; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.HashMap; import java.util.List; import java.util.Locale; import java.util.Map; - +import java.util.function.BiConsumer; import network.packets.Packet; import intents.NotifyPlayersPacketIntent; import intents.PlayerEventIntent; import intents.network.ConnectionClosedIntent; import intents.network.ConnectionOpenedIntent; import resources.Terrain; +import resources.control.Assert; import resources.control.Intent; import resources.control.Manager; import resources.player.Player; import resources.player.PlayerEvent; import resources.player.PlayerState; -import resources.server_info.Log; +import resources.server_info.SynchronizedMap; public class PlayerManager extends Manager { - private final Map players; + private final Map players; private final LoginService loginService; private final ZoneManager zoneService; public PlayerManager() { + players = new SynchronizedMap<>(); loginService = new LoginService(); zoneService = new ZoneManager(); - players = new HashMap(); - addChildService(loginService); addChildService(zoneService); - registerForIntent(PlayerEventIntent.TYPE); registerForIntent(NotifyPlayersPacketIntent.TYPE); registerForIntent(ConnectionOpenedIntent.TYPE); registerForIntent(ConnectionClosedIntent.TYPE); } - @Override - public boolean terminate() { - return super.terminate(); - } - @Override public void onIntentReceived(Intent i) { - if (i instanceof PlayerEventIntent) - onPlayerEventIntent((PlayerEventIntent) i); - else if (i instanceof NotifyPlayersPacketIntent) + if (i instanceof NotifyPlayersPacketIntent) onNotifyPlayersPacketIntent((NotifyPlayersPacketIntent) i); else if (i instanceof ConnectionOpenedIntent) onConnectionOpenedIntent((ConnectionOpenedIntent) i); else if (i instanceof ConnectionClosedIntent) onConnectionClosedIntent((ConnectionClosedIntent) i); } - + public boolean playerExists(String name) { return zoneService.characterExistsForName(name); } - + public Player getPlayerByCreatureName(String name) { + Assert.notNull(name); + Assert.test(!name.trim().isEmpty()); synchronized (players) { for (Player p : players.values()) { if (p.getCreatureObject() != null && p.getCharacterName().equalsIgnoreCase(name)) @@ -100,179 +91,149 @@ public class PlayerManager extends Manager { } public Player getPlayerByCreatureFirstName(String name) { - if (name == null || name.isEmpty()) - return null; + Assert.notNull(name); name = name.trim().toLowerCase(Locale.ENGLISH); + Assert.test(!name.isEmpty()); synchronized (players) { for (Player p : players.values()) { - if (p.getCreatureObject() != null) { - String cName = p.getCharacterName().toLowerCase(Locale.ENGLISH); - if (cName.equals(name)) - return p; - int spaceIndex = cName.indexOf(' '); - if (spaceIndex != -1 && cName.substring(0, spaceIndex).equals(name)) - return p; - } + if (p.getCreatureObject() == null) + continue; + String cName = p.getCharacterName().toLowerCase(Locale.ENGLISH); + if (cName.equals(name)) + return p; + int spaceIndex = cName.indexOf(' '); + if (spaceIndex != -1 && cName.substring(0, spaceIndex).equals(name)) + return p; } } return null; } public long getCharacterIdByName(String name) { - long id = 0; - try { - ResultSet result = loginService.getCharacter(name); - if (result.next()) - id = result.getLong("id"); - result.close(); - } catch (SQLException e) { - Log.e(this, e); - } - - return id; + Assert.notNull(name); + Assert.test(!name.trim().isEmpty()); + return loginService.getCharacterId(name); } - public void notifyPlayers(Packet... packets) { - synchronized(players) { - for (Player p : players.values()) { - if (p != null && p.getCreatureObject() != null) - p.sendPacket(packets); - } - } + public void notifyPlayers(Packet ... packets) { + iteratePlayers((key, p) -> { + if (p.getCreatureObject() != null) + p.sendPacket(packets); + }); } - - public void notifyPlayers(NotifyPlayersPacketIntent.ConditionalNotify conditional, Packet... packets) { + + public void notifyPlayers(NotifyPlayersPacketIntent.ConditionalNotify conditional, Packet ... packets) { if (conditional == null) { notifyPlayers(packets); return; } - - synchronized (players) { - for (Player player : players.values()) { - if (conditional.meetsCondition(player)) { - player.sendPacket(packets); - } - } - } + + iteratePlayers((key, p) -> { + if (conditional.meetsCondition(p)) + p.sendPacket(packets); + }); } - - public void notifyPlayers(List networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditionalNotify, Packet... packets) { + + public void notifyPlayers(List networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditionalNotify, Packet ... packets) { if (conditionalNotify == null) { notifyPlayers(networkIds, packets); return; } - - synchronized (players) { - networkIds.forEach(id -> { - Player p = players.get(id); - if (p != null && p.getCreatureObject() != null && conditionalNotify.meetsCondition(p)) - p.sendPacket(packets); - }); - } + + networkIds.forEach(id -> { + Player p = getPlayerFromNetworkId(id); + Assert.notNull(p); + if (p.getCreatureObject() != null && conditionalNotify.meetsCondition(p)) + p.sendPacket(packets); + }); } - - public void notifyPlayers(List networkIds, Packet... packets) { - synchronized (players) { - networkIds.forEach(id -> { - Player p = players.get(id); - if (p != null && p.getCreatureObject() != null) - p.sendPacket(packets); - }); - } + + public void notifyPlayers(List networkIds, Packet ... packets) { + networkIds.forEach(id -> { + Player p = getPlayerFromNetworkId(id); + Assert.notNull(p); + if (p.getCreatureObject() != null) + p.sendPacket(packets); + }); } - - public void notifyPlayersAtPlanet(NotifyPlayersPacketIntent.ConditionalNotify conditional, Terrain terrain, Packet... packets) { + + public void notifyPlayersAtPlanet(NotifyPlayersPacketIntent.ConditionalNotify conditional, Terrain terrain, Packet ... packets) { if (conditional == null) { notifyPlayersAtPlanet(terrain, packets); return; } - - synchronized(players) { - for (Player p : players.values()) { - if (p != null && p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain && conditional.meetsCondition(p)) - p.sendPacket(packets); - } - } + + iteratePlayers((key, p) -> { + if (p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain && conditional.meetsCondition(p)) + p.sendPacket(packets); + }); } - - public void notifyPlayersAtPlanet(Terrain terrain, Packet... packets) { - synchronized(players) { - for (Player p : players.values()) { - if (p != null && p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain) - p.sendPacket(packets); - } - } + + public void notifyPlayersAtPlanet(Terrain terrain, Packet ... packets) { + iteratePlayers((key, p) -> { + if (p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain) + p.sendPacket(packets); + }); } - - public void notifyPlayersAtPlanet(List networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditional, Terrain terrain, Packet... packets) { - if(conditional == null) { + + public void notifyPlayersAtPlanet(List networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditional, Terrain terrain, Packet ... packets) { + if (conditional == null) { notifyPlayersAtPlanet(networkIds, terrain, packets); return; } - - synchronized(players) { - networkIds.forEach(id -> { - Player p = players.get(id); - if (p != null && p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain && conditional.meetsCondition(p)) - p.sendPacket(packets); - }); - } - } - - public void notifyPlayersAtPlanet(List networkIds, Terrain terrain, Packet... packets) { - synchronized(players) { - networkIds.forEach(id -> { - Player p = players.get(id); - if (p != null && p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain) - p.sendPacket(packets); - }); - } - } - - public Player getPlayerFromNetworkId(long networkId) { - synchronized (players) { - return players.get(networkId); - } + + networkIds.forEach(id -> { + Player p = getPlayerFromNetworkId(id); + Assert.notNull(p); + if (p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain && conditional.meetsCondition(p)) + p.sendPacket(packets); + }); } - private void onPlayerEventIntent(PlayerEventIntent pei) { - synchronized (players) { - if (pei.getEvent() == PlayerEvent.PE_DESTROYED) { - Player p = pei.getPlayer(); - if (p.getPlayerState() == PlayerState.DISCONNECTED) { - players.remove(p.getNetworkId()); - } - } - } + public void notifyPlayersAtPlanet(List networkIds, Terrain terrain, Packet ... packets) { + networkIds.forEach(id -> { + Player p = getPlayerFromNetworkId(id); + Assert.notNull(p); + if (p.getCreatureObject() != null && p.getCreatureObject().getTerrain() == terrain) + p.sendPacket(packets); + }); + } + + public Player getPlayerFromNetworkId(long networkId) { + return players.get(networkId); } private void onNotifyPlayersPacketIntent(NotifyPlayersPacketIntent nppi) { if (nppi.getNetworkIds() != null) { - if (nppi.getTerrain() != null) notifyPlayersAtPlanet(nppi.getNetworkIds(), nppi.getCondition(), nppi.getTerrain(), nppi.getPacket()); - else notifyPlayers(nppi.getNetworkIds(), nppi.getCondition(), nppi.getPacket()); + if (nppi.getTerrain() != null) + notifyPlayersAtPlanet(nppi.getNetworkIds(), nppi.getCondition(), nppi.getTerrain(), nppi.getPacket()); + else + notifyPlayers(nppi.getNetworkIds(), nppi.getCondition(), nppi.getPacket()); } else { - if (nppi.getTerrain() != null) notifyPlayersAtPlanet(nppi.getCondition(), nppi.getTerrain(), nppi.getPacket()); - else notifyPlayers(nppi.getCondition(), nppi.getPacket()); + if (nppi.getTerrain() != null) + notifyPlayersAtPlanet(nppi.getCondition(), nppi.getTerrain(), nppi.getPacket()); + else + notifyPlayers(nppi.getCondition(), nppi.getPacket()); + } + } + + private void iteratePlayers(BiConsumer consumer) { + synchronized (players) { + players.forEach(consumer); } } private void onConnectionOpenedIntent(ConnectionOpenedIntent coi) { Player p = new Player(this, coi.getNetworkId()); - synchronized (players) { - players.put(coi.getNetworkId(), p); - } + Assert.isNull(players.put(coi.getNetworkId(), p)); p.setPlayerState(PlayerState.CONNECTED); new PlayerEventIntent(p, PlayerEvent.PE_CONNECTED).broadcast(); } private void onConnectionClosedIntent(ConnectionClosedIntent cci) { - Player p; - synchronized (players) { - p = players.remove(cci.getNetworkId()); - } - if (p != null) { - p.setPlayerState(PlayerState.DISCONNECTED); - new PlayerEventIntent(p, PlayerEvent.PE_LOGGED_OUT).broadcast(); - } + Player p = players.remove(cci.getNetworkId()); + Assert.notNull(p); + p.setPlayerState(PlayerState.DISCONNECTED); + new PlayerEventIntent(p, PlayerEvent.PE_LOGGED_OUT).broadcast(); } }