Use one quest timer for siege guard aggro.

This commit is contained in:
MobiusDevelopment
2019-06-02 21:11:42 +00:00
parent 276888201e
commit 242b6fe756
13 changed files with 502 additions and 169 deletions

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -84,6 +87,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -95,34 +99,49 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(FORT_GUARDS); addSpawnId(FORT_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(FORT_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()))
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()))
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -138,6 +157,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -149,7 +175,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -60,6 +63,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -69,34 +73,48 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(CASTLE_GUARDS); addSpawnId(CASTLE_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -112,6 +130,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -123,7 +148,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -60,6 +63,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -69,34 +73,48 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(CASTLE_GUARDS); addSpawnId(CASTLE_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -112,6 +130,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -123,7 +148,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -60,6 +63,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -69,34 +73,48 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(CASTLE_GUARDS); addSpawnId(CASTLE_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -112,6 +130,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -123,7 +148,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -60,6 +63,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -69,34 +73,48 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(CASTLE_GUARDS); addSpawnId(CASTLE_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -112,6 +130,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -123,7 +148,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }

View File

@@ -16,6 +16,9 @@
*/ */
package ai.others; package ai.others;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.geoengine.GeoEngine; import org.l2jmobius.gameserver.geoengine.GeoEngine;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
@@ -60,6 +63,7 @@ public class SiegeGuards extends AbstractNpcAI
35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546 35134, 35135, 35136, 35176, 35177, 35178, 35218, 35219, 35220, 35261, 35262, 35263, 35264, 35265, 35308, 35309, 35310, 35352, 35353, 35354, 35497, 35498, 35499, 35500, 35501, 35544, 35545, 35546
}; };
//@formatter:on //@formatter:on
private static final List<Npc> SPAWNED_GUARDS = new CopyOnWriteArrayList<>();
public SiegeGuards() public SiegeGuards()
{ {
@@ -69,34 +73,48 @@ public class SiegeGuards extends AbstractNpcAI
addSpawnId(CASTLE_GUARDS); addSpawnId(CASTLE_GUARDS);
addSpawnId(MERCENARIES); addSpawnId(MERCENARIES);
addSpawnId(STATIONARY_MERCENARIES); addSpawnId(STATIONARY_MERCENARIES);
addKillId(CASTLE_GUARDS);
addKillId(MERCENARIES);
addKillId(STATIONARY_MERCENARIES);
startQuestTimer("AGGRO_CHECK", 3000, null, null, true);
} }
@Override @Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player) public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{ {
if ((npc != null) && !npc.isDead()) for (Npc guard : SPAWNED_GUARDS)
{ {
final WorldObject target = npc.getTarget(); if (guard != null)
if (!npc.isInCombat() || (target == null) || (npc.calculateDistance2D(target) > npc.getAggroRange()) || target.isInvul())
{ {
for (Creature nearby : World.getInstance().getVisibleObjectsInRange(npc, Creature.class, npc.getAggroRange())) if (guard.isDead())
{ {
if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(npc, nearby)) SPAWNED_GUARDS.remove(guard);
}
else
{
final WorldObject target = guard.getTarget();
if (!guard.isInCombat() || (target == null) || (guard.calculateDistance2D(target) > guard.getAggroRange()) || target.isInvul())
{ {
final Summon summon = nearby.isSummon() ? (Summon) nearby : null; for (Creature nearby : World.getInstance().getVisibleObjectsInRange(guard, Creature.class, guard.getAggroRange()))
final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(npc.getScriptValue())) && ((pl.getSiegeState() != 0) || (npc.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{ {
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players if (nearby.isPlayable() && GeoEngine.getInstance().canSeeTarget(guard, nearby))
{ {
addAttackPlayerDesire(npc, pl); final Summon summon = nearby.isSummon() ? (Summon) nearby : null;
break; // no need to search more final PlayerInstance pl = summon == null ? (PlayerInstance) nearby : summon.getOwner();
if (((pl.getSiegeState() != 2) || pl.isRegisteredOnThisSiegeField(guard.getScriptValue())) && ((pl.getSiegeState() != 0) || (guard.getAI().getIntention() != CtrlIntention.AI_INTENTION_IDLE)))
{
if (!pl.isInvisible() && !pl.isInvul()) // skip invisible players
{
addAttackPlayerDesire(guard, pl);
break; // no need to search more
}
}
} }
} }
} }
} }
} }
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), 3000, npc, null);
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
@@ -112,6 +130,13 @@ public class SiegeGuards extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override
public String onKill(Npc npc, PlayerInstance killer, boolean isSummon)
{
SPAWNED_GUARDS.remove(npc);
return super.onKill(npc, killer, isSummon);
}
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{ {
@@ -123,7 +148,7 @@ public class SiegeGuards extends AbstractNpcAI
final Castle castle = npc.getCastle(); final Castle castle = npc.getCastle();
final Fort fortress = npc.getFort(); final Fort fortress = npc.getFort();
npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0)); npc.setScriptValue(fortress != null ? fortress.getResidenceId() : (castle != null ? castle.getResidenceId() : 0));
startQuestTimer("AGGRO_CHECK" + npc.getObjectId(), getRandom(1000, 10000), npc, null); SPAWNED_GUARDS.add(npc);
return super.onSpawn(npc); return super.onSpawn(npc);
} }