diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java index 9f0d01fe51..6763e10055 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/handlers/usercommandhandlers/Loc.java @@ -20,6 +20,9 @@ import org.l2jmobius.gameserver.enums.Race; import org.l2jmobius.gameserver.handler.IUserCommandHandler; import org.l2jmobius.gameserver.instancemanager.MapRegionManager; import org.l2jmobius.gameserver.instancemanager.ZoneManager; +import org.l2jmobius.gameserver.model.World; +import org.l2jmobius.gameserver.model.WorldObject; +import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.zone.type.RespawnZone; import org.l2jmobius.gameserver.network.SystemMessageId; @@ -66,6 +69,21 @@ public class Loc implements IUserCommandHandler sm.addString(player.getX() + ", " + player.getY() + ", " + player.getZ()); } player.sendPacket(sm); + + for (WorldObject obj : World.getInstance().getVisibleObjects()) + { + if (obj.isMonster()) + { + ((MonsterInstance) obj).doDie(((MonsterInstance) obj)); + } + } + + // System.out.println(ThreadPool.log.size()); + + // ThreadPool.log.clear(); + + // ThreadPool.LOGOUT(); + return true; } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java index 21f791f832..564e16904d 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/ChristmasTree.java @@ -79,7 +79,7 @@ public class ChristmasTree implements IItemHandler spawn.setX(target.getX()); spawn.setY(target.getY()); spawn.setZ(target.getZ()); - final NpcInstance result = spawn.spawnOne(); + final NpcInstance result = spawn.doSpawn(); player.destroyItem("Consume", item.getObjectId(), 1, null, false); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java index c0d364682f..45b6019abb 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/JackpotSeed.java @@ -72,7 +72,7 @@ public class JackpotSeed implements IItemHandler spawn.setX(player.getX()); spawn.setY(player.getY()); spawn.setZ(player.getZ()); - _gourd = (GourdInstance) spawn.spawnOne(); + _gourd = (GourdInstance) spawn.doSpawn(); World.getInstance().storeObject(_gourd); _gourd.setOwner(player.getName()); player.destroyItem("Consume", item.getObjectId(), 1, null, false); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java index ee53192359..241b6f2709 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/handler/itemhandlers/SummonItems.java @@ -151,7 +151,7 @@ public class SummonItems implements IItemHandler spawn.setX(player.getX()); spawn.setY(player.getY()); spawn.setZ(player.getZ()); - World.getInstance().storeObject(spawn.spawnOne()); + World.getInstance().storeObject(spawn.doSpawn()); player.destroyItem("Summon", item.getObjectId(), 1, null, false); player.sendMessage("Created " + npcTemplate.name + " at x: " + spawn.getX() + " y: " + spawn.getY() + " z: " + spawn.getZ()); } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java index c030248698..e4d570609d 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/instancemanager/ChristmasManager.java @@ -482,7 +482,7 @@ public class ChristmasManager spawn.setY(y); spawn.setZ(z); - NpcInstance tree = spawn.spawnOne(); + NpcInstance tree = spawn.doSpawn(); World.getInstance().storeObject(tree); objectQueue.add(tree); } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java index 69e5dc2053..21e3bab978 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/actor/instance/NpcInstance.java @@ -3185,7 +3185,7 @@ public class NpcInstance extends Creature // Decrease its spawn counter if (_spawn != null) { - _spawn.decreaseCount(); + _spawn.decreaseCount(this); } } diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/DevastatedCastle.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/DevastatedCastle.java index 0648665c1c..825ff39163 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/DevastatedCastle.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/DevastatedCastle.java @@ -222,7 +222,7 @@ public class DevastatedCastle spawn.setY(-13717); spawn.setZ(-2263); spawn.stopRespawn(); - result = spawn.spawnOne(); + result = spawn.doSpawn(); } catch (Exception e) { @@ -289,7 +289,7 @@ public class DevastatedCastle spawn.setY(-17624); spawn.setZ(-2194); spawn.stopRespawn(); - result = spawn.spawnOne(); + result = spawn.doSpawn(); _gustav = ThreadPool.schedule(new DeSpawnTimer(result), 3600000); // 60 * 60 * 1000 template = NpcTable.getInstance().getTemplate(BOSS1_ID); @@ -298,7 +298,7 @@ public class DevastatedCastle spawn.setY(-17535); spawn.setZ(-2195); spawn.stopRespawn(); - _minion1 = spawn.spawnOne(); + _minion1 = spawn.doSpawn(); _dietrich = ThreadPool.schedule(new DeSpawnTimer(_minion1), 3600000); // 60 * 60 * 1000 template = NpcTable.getInstance().getTemplate(BOSS2_ID); @@ -307,7 +307,7 @@ public class DevastatedCastle spawn.setY(-17712); spawn.setZ(-2194); spawn.stopRespawn(); - _minion2 = spawn.spawnOne(); + _minion2 = spawn.doSpawn(); _mikhail = ThreadPool.schedule(new DeSpawnTimer(_minion2), 3600000); // 60 * 60 * 1000 spawnMonsters(); diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/FortressOfResistance.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/FortressOfResistance.java index 5db4e9077f..34868084bf 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/FortressOfResistance.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/entity/siege/clanhalls/FortressOfResistance.java @@ -208,7 +208,7 @@ public class FortressOfResistance spawn.setY(111275); spawn.setZ(-1970); spawn.stopRespawn(); - result = spawn.spawnOne(); + result = spawn.doSpawn(); } catch (Exception e) { @@ -246,7 +246,7 @@ public class FortressOfResistance spawn.setY(108867); spawn.setZ(-2020); spawn.stopRespawn(); - result = spawn.spawnOne(); + result = spawn.doSpawn(); } catch (Exception e) { diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/quest/QuestSpawn.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/quest/QuestSpawn.java index daa88b8d96..9749a1871e 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/quest/QuestSpawn.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/quest/QuestSpawn.java @@ -132,7 +132,7 @@ public final class QuestSpawn spawn.setY(y); spawn.setZ(z + 20); spawn.stopRespawn(); - result = spawn.spawnOne(); + result = spawn.doSpawn(); if (despawnDelay > 0) { diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java index 2441ad892e..8441ede67b 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/model/spawn/Spawn.java @@ -346,8 +346,9 @@ public class Spawn *
  • Create a new SpawnTask to launch after the respawn Delay

  • *
    * Caution : A respawn is possible ONLY if _doRespawn=True and _scheduledCount + _currentCount < _maximumCount
    + * @param oldNpc */ - public void decreaseCount() + public void decreaseCount(NpcInstance oldNpc) { // Decrease the current number of NpcInstance of this Spawn _currentCount--; @@ -359,7 +360,7 @@ public class Spawn _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + _respawnDelay); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + _respawnDelay); } } @@ -379,15 +380,6 @@ public class Spawn return _currentCount; } - /** - * Create a NpcInstance in this Spawn. - * @return - */ - public NpcInstance spawnOne() - { - return doSpawn(); - } - /** * Set _doRespawn to False to stop respawn in this Spawn. */ @@ -429,7 +421,7 @@ public class Spawn */ public NpcInstance doSpawn() { - NpcInstance mob = null; + NpcInstance npc = null; try { // Check if the Spawn is not a Net or Minion spawn @@ -437,7 +429,7 @@ public class Spawn { _currentCount++; - return mob; + return npc; } // Get NpcInstance Init parameters and its generate an Identifier @@ -457,25 +449,25 @@ public class Spawn // Check if the Instance is a NpcInstance if (!(tmp instanceof NpcInstance)) { - return mob; + return npc; } - mob = (NpcInstance) tmp; + npc = (NpcInstance) tmp; - return initializeNpcInstance(mob); + return initializeNpcInstance(npc); } catch (Exception e) { LOGGER.warning("NPC " + _template.npcId + " class not found " + e); } - return mob; + return npc; } /** - * @param mob + * @param npc * @return */ - private NpcInstance initializeNpcInstance(NpcInstance mob) + private NpcInstance initializeNpcInstance(NpcInstance npc) { int newlocx; int newlocy; @@ -486,7 +478,7 @@ public class Spawn { if (_location == 0) { - return mob; + return npc; } // Calculate the random position in the location area @@ -505,45 +497,45 @@ public class Spawn newlocz = _locZ; } - if (mob != null) + if (npc != null) { - mob.stopAllEffects(); + npc.stopAllEffects(); // Set the HP and MP of the NpcInstance to the max - mob.setCurrentHpMp(mob.getMaxHp(), mob.getMaxMp()); + npc.setCurrentHpMp(npc.getMaxHp(), npc.getMaxMp()); // Set the heading of the NpcInstance (random heading if not defined) if (_heading == -1) { - mob.setHeading(Rnd.get(61794)); + npc.setHeading(Rnd.get(61794)); } else { - mob.setHeading(_heading); + npc.setHeading(_heading); } // Reset decay info - mob.setDecayed(false); + npc.setDecayed(false); // Link the NpcInstance to this Spawn - mob.setSpawn(this); + npc.setSpawn(this); // Init other values of the NpcInstance (ex : from its CreatureTemplate for INT, STR, DEX...) and add it in the world as a visible object - mob.spawnMe(newlocx, newlocy, newlocz); + npc.spawnMe(newlocx, newlocy, newlocz); - notifyNpcSpawned(mob); + notifyNpcSpawned(npc); - _lastSpawn = mob; + _lastSpawn = npc; - for (Quest quest : mob.getTemplate().getEventQuests(Quest.QuestEventType.ON_SPAWN)) + for (Quest quest : npc.getTemplate().getEventQuests(Quest.QuestEventType.ON_SPAWN)) { - quest.notifySpawn(mob); + quest.notifySpawn(npc); } // Increase the current number of NpcInstance managed by this Spawn _currentCount++; } - return mob; + return npc; } public static void addSpawnListener(SpawnListener listener) @@ -596,6 +588,15 @@ public class Spawn return _lastSpawn; } + public void respawnNpc(NpcInstance oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index 844d303fd2..941a0846be 100644 --- a/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_C6_Interlude/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; +import org.l2jmobius.gameserver.model.actor.instance.NpcInstance; import org.l2jmobius.gameserver.model.spawn.Spawn; /** @@ -30,16 +31,16 @@ import org.l2jmobius.gameserver.model.spawn.Spawn; */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final NpcInstance npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(NpcInstance npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java index 3139cdf6c0..e776b886bf 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/model/Spawn.java @@ -249,7 +249,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -551,6 +551,15 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_CT_2.6_HighFive/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance() diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java index 408ca7d357..8a211064a9 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/Spawn.java @@ -30,6 +30,7 @@ import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.model.actor.Npc; import org.l2jmobius.gameserver.model.actor.instance.MonsterInstance; import org.l2jmobius.gameserver.model.actor.templates.NpcTemplate; +import org.l2jmobius.gameserver.model.instancezone.Instance; import org.l2jmobius.gameserver.model.interfaces.IIdentifiable; import org.l2jmobius.gameserver.model.interfaces.INamable; import org.l2jmobius.gameserver.model.spawns.NpcSpawnTemplate; @@ -254,7 +255,7 @@ public class Spawn extends Location implements IIdentifiable, INamable _scheduledCount++; // Schedule the next respawn. - RespawnTaskManager.getInstance().add(this, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); + RespawnTaskManager.getInstance().add(oldNpc, System.currentTimeMillis() + (hasRespawnRandom() ? Rnd.get(_respawnMinDelay, _respawnMaxDelay) : _respawnMinDelay)); } } @@ -468,7 +469,6 @@ public class Spawn extends Location implements IIdentifiable, INamable _respawnMinDelay = Math.max(10, minDelay) * 1000; _respawnMaxDelay = Math.max(10, maxDelay) * 1000; } - else { _respawnMinDelay = 0; @@ -511,6 +511,22 @@ public class Spawn extends Location implements IIdentifiable, INamable return _spawnedNpcs; } + public void respawnNpc(Npc oldNpc) + { + if (_doRespawn) + { + oldNpc.refreshID(); + initializeNpcInstance(oldNpc); + + // Register NPC back to instance world. + final Instance instance = oldNpc.getInstanceWorld(); + if (instance != null) + { + instance.addNpc(oldNpc); + } + } + } + public NpcTemplate getTemplate() { return _template; diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java index c6ab044e5a..482574abe3 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/taskmanager/RespawnTaskManager.java @@ -24,22 +24,23 @@ import java.util.concurrent.CopyOnWriteArrayList; import org.l2jmobius.commons.concurrent.ThreadPool; import org.l2jmobius.gameserver.model.Spawn; +import org.l2jmobius.gameserver.model.actor.Npc; /** * @author Mobius */ public class RespawnTaskManager { - private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); + private static final Map> PENDING_RESPAWNS = new ConcurrentHashMap<>(); public RespawnTaskManager() { ThreadPool.scheduleAtFixedRate(() -> { final long time = System.currentTimeMillis(); - for (Entry> entry : PENDING_RESPAWNS.entrySet()) + for (Entry> entry : PENDING_RESPAWNS.entrySet()) { - final Spawn spawn = entry.getKey(); + final Npc npc = entry.getKey(); final List schedules = entry.getValue(); for (Long respawnTime : schedules) { @@ -48,23 +49,27 @@ public class RespawnTaskManager schedules.remove(respawnTime); if (schedules.isEmpty()) { - PENDING_RESPAWNS.remove(spawn); + PENDING_RESPAWNS.remove(npc); + } + final Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + spawn.respawnNpc(npc); + spawn._scheduledCount--; } - spawn.doSpawn(); - spawn._scheduledCount--; } } } }, 0, 1000); } - public void add(Spawn spawn, Long time) + public void add(Npc npc, Long time) { - if (!PENDING_RESPAWNS.containsKey(spawn)) + if (!PENDING_RESPAWNS.containsKey(npc)) { - PENDING_RESPAWNS.put(spawn, new CopyOnWriteArrayList<>()); + PENDING_RESPAWNS.put(npc, new CopyOnWriteArrayList<>()); } - PENDING_RESPAWNS.get(spawn).add(time); + PENDING_RESPAWNS.get(npc).add(time); } public static RespawnTaskManager getInstance()