Fix concurrency related error while spawning monsters

This commit is contained in:
Melledy 2022-04-25 14:27:54 -07:00
parent 2b75cda6df
commit f0ae673091

View File

@ -144,7 +144,7 @@ public class GenshinScene {
return this.entities.containsKey(entity.getId()); return this.entities.containsKey(entity.getId());
} }
public void addPlayer(GenshinPlayer player) { public synchronized void addPlayer(GenshinPlayer player) {
// Check if player already in // Check if player already in
if (getPlayers().contains(player)) { if (getPlayers().contains(player)) {
return; return;
@ -163,7 +163,7 @@ public class GenshinScene {
this.setupPlayerAvatars(player); this.setupPlayerAvatars(player);
} }
public void removePlayer(GenshinPlayer player) { public synchronized void removePlayer(GenshinPlayer player) {
// Remove player from scene // Remove player from scene
getPlayers().remove(player); getPlayers().remove(player);
player.setScene(null); player.setScene(null);
@ -367,7 +367,6 @@ public class GenshinScene {
entity.setSpawnEntry(entry); entity.setSpawnEntry(entry);
toAdd.add(entity); toAdd.add(entity);
this.addEntityDirectly(entity);
// Add to spawned list // Add to spawned list
this.getSpawnedEntities().add(entry); this.getSpawnedEntities().add(entry);
@ -377,14 +376,15 @@ public class GenshinScene {
for (GenshinEntity entity : this.getEntities().values()) { for (GenshinEntity entity : this.getEntities().values()) {
if (entity.getSpawnEntry() != null && !visible.contains(entity.getSpawnEntry())) { if (entity.getSpawnEntry() != null && !visible.contains(entity.getSpawnEntry())) {
toRemove.add(entity); toRemove.add(entity);
this.removeEntityDirectly(entity);
} }
} }
if (toAdd.size() > 0) { if (toAdd.size() > 0) {
toAdd.stream().forEach(this::addEntityDirectly);
this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VisionBorn)); this.broadcastPacket(new PacketSceneEntityAppearNotify(toAdd, VisionType.VisionBorn));
} }
if (toRemove.size() > 0) { if (toRemove.size() > 0) {
toRemove.stream().forEach(this::removeEntityDirectly);
this.broadcastPacket(new PacketSceneEntityDisappearNotify(toRemove, VisionType.VisionRemove)); this.broadcastPacket(new PacketSceneEntityDisappearNotify(toRemove, VisionType.VisionRemove));
} }
} }