Reuse dead NPC objects.
This commit is contained in:
@ -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;
|
||||
|
@ -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<Spawn, List<Long>> PENDING_RESPAWNS = new ConcurrentHashMap<>();
|
||||
private static final Map<Npc, List<Long>> PENDING_RESPAWNS = new ConcurrentHashMap<>();
|
||||
|
||||
public RespawnTaskManager()
|
||||
{
|
||||
ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
final long time = System.currentTimeMillis();
|
||||
for (Entry<Spawn, List<Long>> entry : PENDING_RESPAWNS.entrySet())
|
||||
for (Entry<Npc, List<Long>> entry : PENDING_RESPAWNS.entrySet())
|
||||
{
|
||||
final Spawn spawn = entry.getKey();
|
||||
final Npc npc = entry.getKey();
|
||||
final List<Long> 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()
|
||||
|
Reference in New Issue
Block a user