diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index defdd5aab..6d4741316 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -41,6 +41,7 @@ import intents.PlayerEventIntent; import intents.network.CloseConnectionIntent; import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; +import intents.player.ZonePlayerSwapIntent; import resources.control.Intent; import resources.control.Service; import resources.objects.creature.CreatureObject; @@ -104,6 +105,7 @@ public class ConnectionService extends Service { registerForIntent(PlayerEventIntent.TYPE); registerForIntent(GalacticPacketIntent.TYPE); registerForIntent(ForceDisconnectIntent.TYPE); + registerForIntent(ZonePlayerSwapIntent.TYPE); return super.initialize(); } @@ -133,6 +135,8 @@ public class ConnectionService extends Service { onGalacticPacketIntent((GalacticPacketIntent) i); else if (i instanceof ForceDisconnectIntent) onForceDisconnectIntent((ForceDisconnectIntent) i); + else if (i instanceof ZonePlayerSwapIntent) + onZonePlayerSwapIntent((ZonePlayerSwapIntent) i); } private void onPlayerEventIntent(PlayerEventIntent pei) { @@ -174,6 +178,19 @@ public class ConnectionService extends Service { disappear(fdi.getPlayer(), fdi.getDisconnectReason()); } + private void onZonePlayerSwapIntent(ZonePlayerSwapIntent zpsi) { + Player before = zpsi.getBeforePlayer(); + Player after = zpsi.getAfterPlayer(); + CreatureObject creature = zpsi.getCreature(); + removeFromLists(before); + updatePlayTime(before); + creature.getPlayerObject().clearFlagBitmask(PlayerFlags.LD); + new PlayerEventIntent(before, before.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast(); + before.setPlayerState(PlayerState.DISCONNECTED); + before.setCreatureObject(null); + creature.setOwner(after); + } + private void removeFromLists(Player player) { synchronized (zonedInPlayers) { Iterator zonedIterator = zonedInPlayers.iterator(); @@ -215,12 +232,12 @@ public class ConnectionService extends Service { if (p.getPlayerObject() != null) p.getPlayerObject().setFlagBitmask(PlayerFlags.LD); 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)); } updateService.schedule(disappearRunnable, (long) DISAPPEAR_THRESHOLD, TimeUnit.MILLISECONDS); - new PlayerEventIntent(p, p.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast(); } } diff --git a/src/services/player/PlayerManager.java b/src/services/player/PlayerManager.java index 8b884ec29..d90afb029 100644 --- a/src/services/player/PlayerManager.java +++ b/src/services/player/PlayerManager.java @@ -36,14 +36,13 @@ import java.util.Map; import network.packets.Packet; import network.packets.soe.SessionRequest; -import network.packets.soe.Disconnect.DisconnectReason; import network.packets.swg.login.ClientIdMsg; import network.packets.swg.zone.insertion.SelectCharacter; import intents.NotifyPlayersPacketIntent; import intents.PlayerEventIntent; -import intents.network.ForceDisconnectIntent; import intents.network.GalacticPacketIntent; import intents.network.InboundPacketIntent; +import intents.player.ZonePlayerSwapIntent; import resources.Terrain; import resources.control.Intent; import resources.control.Manager; @@ -182,7 +181,7 @@ public class PlayerManager extends Manager { while (it.hasNext()) { Player p = it.next(); if (p != player && p.getCreatureObject() != null && p.getCreatureObject().getObjectId() == charId) { - new ForceDisconnectIntent(p, DisconnectReason.NEW_CONNECTION_ATTEMPT, true).broadcast(); + new ZonePlayerSwapIntent(p, player, p.getCreatureObject()).broadcast(); it.remove(); } }