From e9a5a652856113f39a8ea53070e71e334dfb620f Mon Sep 17 00:00:00 2001 From: Obique PSWG Date: Sun, 3 Jan 2016 03:29:49 -0600 Subject: [PATCH] Now logs out players properly when they disconnect --- src/resources/player/PlayerEvent.java | 1 + src/resources/player/PlayerState.java | 4 ++-- src/services/galaxy/ConnectionService.java | 3 +-- .../network/NetworkClientManager.java | 7 ++++-- .../player/CharacterCreationService.java | 2 +- src/services/player/LoginService.java | 2 +- src/services/player/PlayerManager.java | 23 ++++++++++++++++++- 7 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/resources/player/PlayerEvent.java b/src/resources/player/PlayerEvent.java index 2b5cde4b7..ff1b5546f 100644 --- a/src/resources/player/PlayerEvent.java +++ b/src/resources/player/PlayerEvent.java @@ -29,6 +29,7 @@ package resources.player; public enum PlayerEvent { + PE_CONNECTED, PE_CREATE_CHARACTER, PE_FIRST_ZONE, PE_ZONE_IN, diff --git a/src/resources/player/PlayerState.java b/src/resources/player/PlayerState.java index 8d8b6338f..1c2006e70 100644 --- a/src/resources/player/PlayerState.java +++ b/src/resources/player/PlayerState.java @@ -30,10 +30,10 @@ package resources.player; public enum PlayerState { DISCONNECTED, + CONNECTED, LOGGING_IN, LOGGED_IN, ZONING_IN, - ZONED_IN, - LOGGED_OUT + ZONED_IN } diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 4ad890635..516a020db 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -166,6 +166,7 @@ public class ConnectionService extends Service { e.printStackTrace(); } setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); + logOut(pei.getPlayer(), true); break; default: break; @@ -255,8 +256,6 @@ public class ConnectionService extends Service { Log.i("ConnectionService", "Logged out %s with character %s", p.getUsername(), p.getCharacterName()); removeFromLists(p); updatePlayTime(p); - p.setPlayerState(PlayerState.LOGGED_OUT); - new PlayerEventIntent(p, p.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast(); if (addToDisappear) { synchronized (disappearPlayers) { disappearPlayers.add(new DisappearPlayer(System.nanoTime(), p)); diff --git a/src/services/network/NetworkClientManager.java b/src/services/network/NetworkClientManager.java index 54beb4e10..1390e600e 100644 --- a/src/services/network/NetworkClientManager.java +++ b/src/services/network/NetworkClientManager.java @@ -194,7 +194,6 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet sockets.put(address, networkId); clients.put(networkId, new NetworkClient(address, networkId, this)); new ConnectionOpenedIntent(networkId).broadcast(); - System.out.println("Created Session: " + networkId + " / " + address); } } @@ -204,6 +203,8 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet if (networkId != null) { deleteSession(networkId); new ConnectionClosedIntent(networkId, DisconnectReason.OTHER_SIDE_TERMINATED).broadcast(); + } else { + System.err.println("Network ID not found for " + address + "!"); } } } @@ -211,8 +212,10 @@ public class NetworkClientManager extends Manager implements TCPCallback, Packet private void deleteSession(long networkId) { synchronized (clients) { NetworkClient client = clients.get(networkId); - if (client == null) + if (client == null) { + System.err.println("No NetworkClient found for network id: " + networkId); return; + } clients.remove(networkId); sockets.remove(client.getAddress()); } diff --git a/src/services/player/CharacterCreationService.java b/src/services/player/CharacterCreationService.java index b0a7a27e5..70bf9cdfe 100644 --- a/src/services/player/CharacterCreationService.java +++ b/src/services/player/CharacterCreationService.java @@ -471,7 +471,7 @@ public class CharacterCreationService extends Service { if (player == null || assignedTo == player) return false; PlayerState state = player.getPlayerState(); - return state != PlayerState.DISCONNECTED && state != PlayerState.LOGGED_OUT; + return state != PlayerState.DISCONNECTED; } } diff --git a/src/services/player/LoginService.java b/src/services/player/LoginService.java index fa8c23d20..d7b70d5c7 100644 --- a/src/services/player/LoginService.java +++ b/src/services/player/LoginService.java @@ -145,7 +145,7 @@ public class LoginService extends Service { } private void handleLogin(Player player, LoginClientId id) { - if (player.getPlayerState() != PlayerState.DISCONNECTED) { + if (player.getPlayerState() != PlayerState.CONNECTED) { System.err.println("Player cannot login when " + player.getPlayerState()); return; } diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 51cf38c0d..a1ac7ac0a 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -37,6 +37,7 @@ import java.util.Map; import network.packets.Packet; import intents.NotifyPlayersPacketIntent; import intents.PlayerEventIntent; +import intents.network.ConnectionClosedIntent; import intents.network.ConnectionOpenedIntent; import intents.network.GalacticPacketIntent; import intents.network.InboundPacketIntent; @@ -67,6 +68,7 @@ public class PlayerManager extends Manager { registerForIntent(PlayerEventIntent.TYPE); registerForIntent(NotifyPlayersPacketIntent.TYPE); registerForIntent(ConnectionOpenedIntent.TYPE); + registerForIntent(ConnectionClosedIntent.TYPE); } @Override @@ -84,6 +86,8 @@ public class PlayerManager extends Manager { onNotifyPlayersPacketIntent((NotifyPlayersPacketIntent) i); else if (i instanceof ConnectionOpenedIntent) onConnectionOpenedIntent((ConnectionOpenedIntent) i); + else if (i instanceof ConnectionClosedIntent) + onConnectionClosedIntent((ConnectionClosedIntent) i); } public boolean playerExists(String name) { @@ -264,8 +268,25 @@ public class PlayerManager extends Manager { } private void onConnectionOpenedIntent(ConnectionOpenedIntent coi) { + Player p = new Player(this, coi.getNetworkId()); synchronized (players) { - players.put(coi.getNetworkId(), new Player(this, coi.getNetworkId())); + 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.get(cci.getNetworkId()); + } + if (p != null) { + System.out.println("Disconnecting: " + p); + p.setPlayerState(PlayerState.DISCONNECTED); + new PlayerEventIntent(p, PlayerEvent.PE_LOGGED_OUT).broadcast(); + } else { + System.err.println("No player found for ID: " + cci.getNetworkId()); } } }