diff --git a/trunk/dist/game/data/scripts/gracia/AI/Lindvior.java b/trunk/dist/game/data/scripts/gracia/AI/Lindvior.java index 8f1aa0f59c..5130919a24 100644 --- a/trunk/dist/game/data/scripts/gracia/AI/Lindvior.java +++ b/trunk/dist/game/data/scripts/gracia/AI/Lindvior.java @@ -86,9 +86,9 @@ public class Lindvior extends AbstractNpcAI } break; case "start": - _lindviorCamera = SpawnTable.getInstance().getFirstSpawn(LINDVIOR_CAMERA).getLastSpawn(); - _tomaris = SpawnTable.getInstance().getFirstSpawn(TOMARIS).getLastSpawn(); - _artius = SpawnTable.getInstance().getFirstSpawn(ARTIUS).getLastSpawn(); + _lindviorCamera = SpawnTable.getInstance().getAnySpawn(LINDVIOR_CAMERA).getLastSpawn(); + _tomaris = SpawnTable.getInstance().getAnySpawn(TOMARIS).getLastSpawn(); + _artius = SpawnTable.getInstance().getAnySpawn(ARTIUS).getLastSpawn(); startQuestTimer("tomaris_shout1", 1000, _tomaris, null); startQuestTimer("artius_shout", 60000, _artius, null); diff --git a/trunk/dist/game/data/scripts/quests/Q00625_TheFinestIngredientsPart2/Q00625_TheFinestIngredientsPart2.java b/trunk/dist/game/data/scripts/quests/Q00625_TheFinestIngredientsPart2/Q00625_TheFinestIngredientsPart2.java index 10a297831c..66cd22d876 100644 --- a/trunk/dist/game/data/scripts/quests/Q00625_TheFinestIngredientsPart2/Q00625_TheFinestIngredientsPart2.java +++ b/trunk/dist/game/data/scripts/quests/Q00625_TheFinestIngredientsPart2/Q00625_TheFinestIngredientsPart2.java @@ -282,6 +282,6 @@ public final class Q00625_TheFinestIngredientsPart2 extends Quest private static boolean isBumbalumpSpawned() { - return SpawnTable.getInstance().getFirstSpawn(ICICLE_EMPEROR_BUMBALUMP) != null; + return SpawnTable.getInstance().getAnySpawn(ICICLE_EMPEROR_BUMBALUMP) != null; } } diff --git a/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java b/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java index 47efcffb64..ff577ff0c8 100644 --- a/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java +++ b/trunk/java/com/l2jserver/gameserver/datatables/SpawnTable.java @@ -27,7 +27,6 @@ import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.CopyOnWriteArraySet; import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; @@ -355,39 +354,43 @@ public final class SpawnTable implements IXmlReader return addSpawn(spawnInfo, null); } + /** + * Gets the spawn data. + * @return the spawn data + */ public Map> getSpawnTable() { return _spawnTable; } /** - * Get the spawns for the NPC Id. + * Gets the spawns for the NPC Id. * @param npcId the NPC Id * @return the spawn set for the given npcId */ public Set getSpawns(int npcId) { - return _spawnTable.containsKey(npcId) ? _spawnTable.get(npcId) : Collections. emptySet(); + return _spawnTable.getOrDefault(npcId, Collections.emptySet()); } /** - * Get the first NPC spawn. - * @param npcId the NPC Id to search - * @return the first not null spawn, if any + * Gets the spawn count for the given NPC ID. + * @param npcId the NPC Id + * @return the spawn count */ - public L2Spawn getFirstSpawn(int npcId) + public int getSpawnCount(int npcId) { - if (_spawnTable.containsKey(npcId)) - { - for (L2Spawn spawn : _spawnTable.get(npcId)) - { - if (spawn != null) - { - return spawn; - } - } - } - return null; + return getSpawns(npcId).size(); + } + + /** + * Gets a spawn for the given NPC ID. + * @param npcId the NPC Id + * @return a spawn for the given NPC ID or {@code null} + */ + public L2Spawn getAnySpawn(int npcId) + { + return getSpawns(npcId).stream().findFirst().orElse(null); } /** @@ -460,11 +463,7 @@ public final class SpawnTable implements IXmlReader */ private void addSpawn(L2Spawn spawn) { - if (!_spawnTable.containsKey(spawn.getId())) - { - _spawnTable.put(spawn.getId(), new CopyOnWriteArraySet()); - } - _spawnTable.get(spawn.getId()).add(spawn); + _spawnTable.computeIfAbsent(spawn.getId(), k -> ConcurrentHashMap.newKeySet(1)).add(spawn); } /** @@ -474,9 +473,9 @@ public final class SpawnTable implements IXmlReader */ private boolean removeSpawn(L2Spawn spawn) { - if (_spawnTable.containsKey(spawn.getId())) + final Set set = _spawnTable.get(spawn.getId()); + if (set != null) { - final Set set = _spawnTable.get(spawn.getId()); boolean removed = set.remove(spawn); if (set.isEmpty()) {