Refactored parts of PlayerManager and LoginService

This commit is contained in:
Obique PSWG
2017-01-02 01:52:29 -06:00
parent a366aa7d57
commit 8c19bcbc28
3 changed files with 176 additions and 214 deletions
-9
View File
@@ -46,7 +46,6 @@ public class Player implements Comparable<Player> {
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<Player> {
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<Player> {
return connectionId;
}
public byte [] getSessionToken() {
return sessionToken;
}
public AccessLevel getAccessLevel() {
return accessLevel;
}
+71 -61
View File
@@ -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 <Galaxy> galaxies = getGalaxies(p);
SWGCharacter [] characters = getCharacters(p.getUserId());
List <Galaxy> 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 <Galaxy> getGalaxies(Player p) throws SQLException {
List<Galaxy> 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 <SWGCharacter> 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 <SWGCharacter> 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());
+105 -144
View File
@@ -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 <Long, Player> players;
private final Map<Long, Player> players;
private final LoginService loginService;
private final ZoneManager zoneService;
public PlayerManager() {
players = new SynchronizedMap<>();
loginService = new LoginService();
zoneService = new ZoneManager();
players = new HashMap<Long, Player>();
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<Long> networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditionalNotify, Packet... packets) {
public void notifyPlayers(List<Long> 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<Long> 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<Long> 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<Long> networkIds, NotifyPlayersPacketIntent.ConditionalNotify conditional, Terrain terrain, Packet... packets) {
if(conditional == null) {
public void notifyPlayersAtPlanet(List<Long> 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<Long> 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<Long> 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<Long, Player> 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();
}
}