diff --git a/src/resources/collections/SWGBitSet.java b/src/resources/collections/SWGBitSet.java index dc2fc815e..4a768bfb2 100644 --- a/src/resources/collections/SWGBitSet.java +++ b/src/resources/collections/SWGBitSet.java @@ -31,7 +31,6 @@ import network.packets.swg.zone.baselines.Baseline; import resources.encodables.Encodable; import resources.network.DeltaBuilder; import resources.objects.SWGObject; -import resources.player.PlayerState; import java.io.Serializable; import java.nio.ByteBuffer; @@ -83,7 +82,7 @@ public class SWGBitSet extends BitSet implements Encodable, Serializable { } public void sendDeltaMessage(SWGObject target) { - if (target.getOwner() == null || target.getOwner().getPlayerState() != PlayerState.ZONED_IN) { + if (target.getOwner() == null) { return; } diff --git a/src/resources/objects/SWGObject.java b/src/resources/objects/SWGObject.java index ce516a749..9c6e63260 100644 --- a/src/resources/objects/SWGObject.java +++ b/src/resources/objects/SWGObject.java @@ -614,10 +614,7 @@ public abstract class SWGObject implements Serializable, Comparable { } public void clearAware() { - SWGObject [] objects; - synchronized (objectsAware) { - objects = objectsAware.toArray(new SWGObject[objectsAware.size()]); - } + List objects = new ArrayList<>(objectsAware); for (SWGObject o : objects) { o.awarenessOutOfRange(this); awarenessOutOfRange(o); @@ -639,21 +636,21 @@ public abstract class SWGObject implements Serializable, Comparable { } private Set getObserversFromSet(Set aware, SWGObject childObject) { + Set awareExtra = new HashSet<>(aware); + awareExtra.addAll(objectsAware); if (getParent() == null) { Set observers = new HashSet<>(); - synchronized (aware) { - for (SWGObject obj : aware) { - Player p = obj.getOwner(); - if (childObject.isValidPlayer(p)) - observers.add(obj); - else - childObject.getChildrenObservers(observers, obj); - } + for (SWGObject obj : awareExtra) { + Player p = obj.getOwner(); + if (childObject.isValidPlayer(p)) + observers.add(obj); + else + getChildrenObservers(observers, obj); } - childObject.getChildrenObservers(observers, this); + getChildrenObservers(observers, this); return observers; } else { - return getParent().getObserversFromSet(aware, childObject); // Search for top level parent + return getParent().getObserversFromSet(awareExtra, childObject); // Search for top level parent } } diff --git a/src/resources/server_info/DataManager.java b/src/resources/server_info/DataManager.java index f7b3a46d2..b228067f6 100644 --- a/src/resources/server_info/DataManager.java +++ b/src/resources/server_info/DataManager.java @@ -85,8 +85,8 @@ public class DataManager implements IntentReceiver { private boolean createFilesAndDirectories(File file) { if (file.exists()) return true; - String parentName = file.getParent(); try { + String parentName = file.getParent(); if (parentName != null && !parentName.isEmpty()) { File parent = new File(file.getParent()); if (!parent.exists() && !parent.mkdirs()) diff --git a/src/services/galaxy/ConnectionService.java b/src/services/galaxy/ConnectionService.java index 4e3c25d29..2e660532b 100644 --- a/src/services/galaxy/ConnectionService.java +++ b/src/services/galaxy/ConnectionService.java @@ -148,6 +148,12 @@ public class ConnectionService extends Service { } break; } + case PE_ZONE_IN: + clearPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); + break; + case PE_LOGGED_OUT: + setPlayerFlag(pei.getPlayer(), pei.getEvent(), PlayerFlags.LD); + break; default: break; } @@ -184,14 +190,11 @@ public class ConnectionService extends Service { CreatureObject creature = zpsi.getCreature(); removeFromLists(before); updatePlayTime(before); - if (creature.getPlayerObject() != null) - creature.getPlayerObject().clearFlagBitmask(PlayerFlags.LD); Log.i("ConnectionService", "Logged out %s with character %s", before.getUsername(), before.getCharacterName()); new PlayerEventIntent(before, before.getGalaxyName(), PlayerEvent.PE_LOGGED_OUT).broadcast(); Log.i("ConnectionService", "Disconnected %s with character %s and reason: %s", before.getUsername(), before.getCharacterName(), DisconnectReason.NEW_CONNECTION_ATTEMPT); new CloseConnectionIntent(before.getConnectionId(), before.getNetworkId(), DisconnectReason.NEW_CONNECTION_ATTEMPT).broadcast(); before.setPlayerState(PlayerState.DISCONNECTED); - before.setCreatureObject(null); creature.setOwner(after); } @@ -216,18 +219,43 @@ public class ConnectionService extends Service { } } + private void setPlayerFlag(Player p, PlayerEvent event, PlayerFlags flag) { + PlayerObject player = getPlayerObject(p, event); + if (player == null) + return; + player.setFlagBitmask(flag); + } + + private void clearPlayerFlag(Player p, PlayerEvent event, PlayerFlags flag) { + PlayerObject player = getPlayerObject(p, event); + if (player == null) + return; + player.clearFlagBitmask(flag); + } + + private PlayerObject getPlayerObject(Player p, PlayerEvent event) { + CreatureObject creature = p.getCreatureObject(); + if (creature == null) { + Log.e("ConnectionService", "Unable to set player flags for user: %s on event: %s - CreatureObject is null", p.getUsername(), event); + return null; + } + PlayerObject player = creature.getPlayerObject(); + if (player == null) { + Log.e("ConnectionService", "Unable to set player flags for user: %s on event: %s - PlayerObject is null", p.getUsername(), event); + return null; + } + return player; + } + private void logOut(Player p) { logOut(p, true); } private void logOut(Player p, boolean addToDisappear) { - removeFromLists(p); + System.out.println("[" + p.getUsername() +"] Logged out " + p.getCharacterName()); Log.i("ConnectionService", "Logged out %s with character %s", p.getUsername(), p.getCharacterName()); + removeFromLists(p); updatePlayTime(p); - if (p.getPlayerState() != PlayerState.LOGGED_OUT) - System.out.println("[" + p.getUsername() +"] Logged out " + p.getCharacterName()); - 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) { @@ -239,21 +267,18 @@ public class ConnectionService extends Service { } private void disappear(Player p, DisconnectReason reason) { + System.out.println("[" + p.getUsername() +"] " + p.getCharacterName() + " disappeared"); Log.i("ConnectionService", "Disappeared %s with character %s", p.getUsername(), p.getCharacterName()); - if (p.getPlayerObject() != null) - p.getPlayerObject().clearFlagBitmask(PlayerFlags.LD); - + switch(reason) { case NEW_CONNECTION_ATTEMPT: // The player is attempting to re-zone removeFromDisappear(p); break; default: removeFromLists(p); - p.getCreatureObject().setOwner(null); break; } p.setPlayerState(PlayerState.DISCONNECTED); - System.out.println("[" + p.getUsername() +"] " + p.getCharacterName() + " disappeared"); new PlayerEventIntent(p, PlayerEvent.PE_DISAPPEAR).broadcast(); } diff --git a/src/services/objects/ObjectManager.java b/src/services/objects/ObjectManager.java index c1f74c605..9c597fafa 100644 --- a/src/services/objects/ObjectManager.java +++ b/src/services/objects/ObjectManager.java @@ -276,6 +276,8 @@ public class ObjectManager extends Manager { objectAwareness.remove(p.getCreatureObject()); for (SWGObject obj : p.getCreatureObject().getObservers()) p.getCreatureObject().destroyObject(obj.getOwner()); + p.getCreatureObject().setOwner(null); + p.setCreatureObject(null); break; case PE_FIRST_ZONE: if (p.getCreatureObject().getParent() == null)