Reuse dead NPC objects.
This commit is contained in:
@@ -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()
|
||||
|
Reference in New Issue
Block a user