Fixed exception when disconnecting from login screen and made minor optimizations to awareness

This commit is contained in:
Obique
2018-12-16 12:30:58 -06:00
parent 54661f163e
commit e9fda2f2d5
4 changed files with 19 additions and 20 deletions
@@ -71,12 +71,8 @@ public class ObjectAware {
object.onObjectEnterAware(added);
}
attemptFlush();
}
@NotNull
public Set<Player> getObservers() {
return getAwareStream().map(SWGObject::getOwnerShallow).filter(Objects::nonNull).filter(player -> player.isBaselinesSent(object)).collect(Collectors.toSet());
if (object instanceof CreatureObject)
((CreatureObject) object).flushObjectsAware();
}
@NotNull
@@ -102,11 +98,6 @@ public class ObjectAware {
return chunk.get();
}
private void attemptFlush() {
if (object instanceof CreatureObject)
((CreatureObject) object).flushObjectsAware();
}
private Stream<SWGObject> getAwareStream() {
return awareness.values().stream().flatMap(Collection::stream);
}
@@ -26,22 +26,24 @@
***********************************************************************************/
package com.projectswg.holocore.resources.support.objects.awareness;
import com.projectswg.common.network.packets.swg.zone.baselines.Baseline.BaselineType;
import com.projectswg.holocore.resources.support.objects.swg.SWGObject;
import com.projectswg.holocore.resources.support.objects.swg.creature.CreatureObject;
import org.jetbrains.annotations.NotNull;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.function.Consumer;
class TerrainMapChunk {
private final Set<SWGObject> objects;
private final Set<CreatureObject> creatures;
private TerrainMapChunk [] neighbors;
public TerrainMapChunk() {
this.objects = new CopyOnWriteArraySet<>();
this.creatures = ConcurrentHashMap.newKeySet();
this.neighbors = new TerrainMapChunk[]{this};
}
@@ -54,17 +56,18 @@ class TerrainMapChunk {
public void addObject(@NotNull SWGObject obj) {
objects.add(obj);
if (obj instanceof CreatureObject)
creatures.add((CreatureObject) obj);
}
public void removeObject(@NotNull SWGObject obj) {
objects.remove(obj);
if (obj instanceof CreatureObject)
creatures.remove(obj);
}
public void scan(Consumer<SWGObject> consumer) {
for (SWGObject test : objects) {
if (test.getBaselineType() == BaselineType.CREO)
consumer.accept(test);
}
creatures.forEach(consumer);
}
public Collection<SWGObject> getWithinAwareness(@NotNull CreatureObject obj) {
@@ -72,8 +75,9 @@ class TerrainMapChunk {
for (TerrainMapChunk neighbor : neighbors) {
for (SWGObject test : neighbor.objects) {
if (obj.isWithinAwarenessRange(test))
if (obj.isWithinAwarenessRange(test)) {
withinRange.add(test);
}
}
}
@@ -108,8 +108,8 @@ public class AwarenessService extends Service {
awareness.destroyObject(creature);
break;
case PE_LOGGED_OUT:
assert creature != null;
awareness.updateObject(creature);
if (creature != null)
awareness.updateObject(creature);
break;
default:
break;
@@ -131,7 +131,9 @@ public class TestObjectAwareness extends TestRunnerNoIntents {
initialize();
player.setHasOwner(false);
assertFalse(player.isLoggedInPlayer());
Assert.assertTrue(player.isPlayer());
Assert.assertFalse(player.isLoggedInPlayer());
Assert.assertTrue(testPlayer.isPlayer());
Assert.assertTrue(testPlayer.isLoggedInPlayer());
// Shouldn't be aware of anything else because it's a logged out player
@@ -141,7 +143,9 @@ public class TestObjectAwareness extends TestRunnerNoIntents {
}
player.setHasOwner(true);
Assert.assertTrue(player.isPlayer());
Assert.assertTrue(player.isLoggedInPlayer());
Assert.assertTrue(testPlayer.isPlayer());
Assert.assertTrue(testPlayer.isLoggedInPlayer());
for (TestLocation loc : TestLocation.values()) {