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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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()
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -3185,7 +3185,7 @@ public class NpcInstance extends Creature
|
||||
// Decrease its spawn counter
|
||||
if (_spawn != null)
|
||||
{
|
||||
_spawn.decreaseCount();
|
||||
_spawn.decreaseCount(this);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -346,8 +346,9 @@ public class Spawn
|
||||
* <li>Create a new SpawnTask to launch after the respawn Delay</li><BR>
|
||||
* <BR>
|
||||
* <FONT COLOR=#FF0000><B> <U>Caution</U> : A respawn is possible ONLY if _doRespawn=True and _scheduledCount + _currentCount < _maximumCount</B></FONT><BR>
|
||||
* @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;
|
||||
|
@ -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<Spawn, List<Long>> PENDING_RESPAWNS = new ConcurrentHashMap<>();
|
||||
private static final Map<NpcInstance, 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<NpcInstance, List<Long>> entry : PENDING_RESPAWNS.entrySet())
|
||||
{
|
||||
final Spawn spawn = entry.getKey();
|
||||
final NpcInstance 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(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()
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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()
|
||||
|
@ -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