Script adjustments.
This commit is contained in:
@@ -223,6 +223,7 @@ public final class Alarm extends AbstractNpcAI
|
||||
@Override
|
||||
public String onSpawn(Npc npc)
|
||||
{
|
||||
cancelQuestTimer("SELF_DESTRUCT_IN_60", npc, null);
|
||||
startQuestTimer("SELF_DESTRUCT_IN_60", 60000, npc, null);
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.INTRUDER_ALERT_THE_ALARM_WILL_SELF_DESTRUCT_IN_2_MINUTES);
|
||||
final PlayerInstance player = npc.getVariables().getObject("player0", PlayerInstance.class);
|
||||
|
@@ -28,6 +28,7 @@ import org.l2jmobius.gameserver.model.skills.Skill;
|
||||
import org.l2jmobius.gameserver.model.zone.type.EffectZone;
|
||||
import org.l2jmobius.gameserver.network.SystemMessageId;
|
||||
import org.l2jmobius.gameserver.network.serverpackets.SystemMessage;
|
||||
import org.l2jmobius.gameserver.scripting.annotations.Disabled;
|
||||
|
||||
import ai.AbstractNpcAI;
|
||||
|
||||
@@ -35,6 +36,7 @@ import ai.AbstractNpcAI;
|
||||
* Dummy AI for spawns/respawns only for testing.
|
||||
* @author Gnacik
|
||||
*/
|
||||
@Disabled // Mobius: this needs to be rewritten.
|
||||
public final class DenOfEvil extends AbstractNpcAI
|
||||
{
|
||||
// private static final int _buffer_id = 32656;
|
||||
|
@@ -54,8 +54,7 @@ public final class ZealotOfShilen extends AbstractNpcAI
|
||||
return null;
|
||||
}
|
||||
|
||||
startQuestTimer("WATCHING", 10000, npc, null, true);
|
||||
if (event.equalsIgnoreCase("WATCHING") && !npc.isAttackingNow())
|
||||
if (event.equals("WATCHING") && !npc.isAttackingNow() && !npc.isAlikeDead())
|
||||
{
|
||||
World.getInstance().forEachVisibleObject(npc, MonsterInstance.class, character ->
|
||||
{
|
||||
@@ -66,6 +65,7 @@ public final class ZealotOfShilen extends AbstractNpcAI
|
||||
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, character, null);
|
||||
}
|
||||
});
|
||||
startQuestTimer("WATCHING", 10000, npc, null);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
@@ -87,7 +87,8 @@ public final class ZealotOfShilen extends AbstractNpcAI
|
||||
{
|
||||
npc.setIsInvul(true);
|
||||
((Attackable) npc).setCanReturnToSpawnPoint(false);
|
||||
startQuestTimer("WATCHING", 10000, npc, null, true);
|
||||
cancelQuestTimer("WATCHING", npc, null);
|
||||
startQuestTimer("WATCHING", 10000, npc, null);
|
||||
}
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
@@ -281,6 +281,7 @@ public final class MonasteryOfSilence extends AbstractNpcAI
|
||||
{
|
||||
npc.setIsInvul(true);
|
||||
npc.disableCoreAI(true);
|
||||
cancelQuestTimer("TRAINING", npc, null);
|
||||
startQuestTimer("TRAINING", 30000, npc, null, true);
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
@@ -486,6 +486,7 @@ public final class PrimevalIsle extends AbstractNpcAI
|
||||
{
|
||||
if (CommonUtil.contains(SPRIGNANT, npc.getId()))
|
||||
{
|
||||
cancelQuestTimer("USE_SKILL", npc, null);
|
||||
startQuestTimer("USE_SKILL", 15000, npc, null);
|
||||
}
|
||||
else if (CommonUtil.contains(TREX, npc.getId()))
|
||||
@@ -495,6 +496,7 @@ public final class PrimevalIsle extends AbstractNpcAI
|
||||
|
||||
if (collectGhost == 1)
|
||||
{
|
||||
cancelQuestTimer("GHOST_DESPAWN", npc, null);
|
||||
startQuestTimer("GHOST_DESPAWN", collectDespawn * 60000, npc, null);
|
||||
}
|
||||
}
|
||||
|
@@ -263,6 +263,7 @@ public final class SelMahumDrill extends AbstractNpcAI
|
||||
{
|
||||
if (CommonUtil.contains(MAHUM_CHIEFS, npc.getId()))
|
||||
{
|
||||
cancelQuestTimer("do_social_action", npc, null);
|
||||
startQuestTimer("do_social_action", 15000, npc, null);
|
||||
}
|
||||
|
||||
|
@@ -345,6 +345,7 @@ public final class SelMahumSquad extends AbstractNpcAI
|
||||
}
|
||||
else if (npc.getId() == FIRE)
|
||||
{
|
||||
cancelQuestTimer("fire", npc, null);
|
||||
startQuestTimer("fire", 1000, npc, null);
|
||||
}
|
||||
else if (CommonUtil.contains(SQUAD_LEADERS, npc.getId()))
|
||||
|
@@ -18,10 +18,8 @@ package ai.bosses.QueenAnt;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
import java.util.concurrent.ScheduledFuture;
|
||||
|
||||
import org.l2jmobius.Config;
|
||||
import org.l2jmobius.commons.concurrent.ThreadPool;
|
||||
import org.l2jmobius.gameserver.ai.CtrlIntention;
|
||||
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
|
||||
import org.l2jmobius.gameserver.model.Location;
|
||||
@@ -82,7 +80,6 @@ public final class QueenAnt extends AbstractNpcAI
|
||||
MonsterInstance _queen = null;
|
||||
private MonsterInstance _larva = null;
|
||||
private final List<MonsterInstance> _nurses = new CopyOnWriteArrayList<>();
|
||||
ScheduledFuture<?> _task = null;
|
||||
|
||||
private QueenAnt()
|
||||
{
|
||||
@@ -151,68 +148,87 @@ public final class QueenAnt extends AbstractNpcAI
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
|
||||
{
|
||||
if (event.equalsIgnoreCase("heal"))
|
||||
switch (event)
|
||||
{
|
||||
boolean notCasting;
|
||||
final boolean larvaNeedHeal = (_larva != null) && (_larva.getCurrentHp() < _larva.getMaxHp());
|
||||
final boolean queenNeedHeal = (_queen != null) && (_queen.getCurrentHp() < _queen.getMaxHp());
|
||||
for (MonsterInstance nurse : _nurses)
|
||||
case "heal":
|
||||
{
|
||||
if ((nurse == null) || nurse.isDead() || nurse.isCastingNow())
|
||||
boolean notCasting;
|
||||
final boolean larvaNeedHeal = (_larva != null) && (_larva.getCurrentHp() < _larva.getMaxHp());
|
||||
final boolean queenNeedHeal = (_queen != null) && (_queen.getCurrentHp() < _queen.getMaxHp());
|
||||
for (MonsterInstance nurse : _nurses)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
notCasting = nurse.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST;
|
||||
if (larvaNeedHeal)
|
||||
{
|
||||
if ((nurse.getTarget() != _larva) || notCasting)
|
||||
{
|
||||
nurse.setTarget(_larva);
|
||||
nurse.useMagic(getRandomBoolean() ? HEAL1.getSkill() : HEAL2.getSkill());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (queenNeedHeal)
|
||||
{
|
||||
if (nurse.getLeader() == _larva)
|
||||
if ((nurse == null) || nurse.isDead() || nurse.isCastingNow())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((nurse.getTarget() != _queen) || notCasting)
|
||||
notCasting = nurse.getAI().getIntention() != CtrlIntention.AI_INTENTION_CAST;
|
||||
if (larvaNeedHeal)
|
||||
{
|
||||
nurse.setTarget(_queen);
|
||||
nurse.useMagic(HEAL1.getSkill());
|
||||
if ((nurse.getTarget() != _larva) || notCasting)
|
||||
{
|
||||
nurse.setTarget(_larva);
|
||||
nurse.useMagic(getRandomBoolean() ? HEAL1.getSkill() : HEAL2.getSkill());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (queenNeedHeal)
|
||||
{
|
||||
if (nurse.getLeader() == _larva)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((nurse.getTarget() != _queen) || notCasting)
|
||||
{
|
||||
nurse.setTarget(_queen);
|
||||
nurse.useMagic(HEAL1.getSkill());
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// if nurse not casting - remove target
|
||||
if (notCasting && (nurse.getTarget() != null))
|
||||
{
|
||||
nurse.setTarget(null);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
// if nurse not casting - remove target
|
||||
if (notCasting && (nurse.getTarget() != null))
|
||||
{
|
||||
nurse.setTarget(null);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("action") && (npc != null))
|
||||
{
|
||||
if (getRandom(3) == 0)
|
||||
case "action":
|
||||
{
|
||||
if (getRandom(2) == 0)
|
||||
if ((npc != null) && (getRandom(3) == 0))
|
||||
{
|
||||
npc.broadcastSocialAction(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.broadcastSocialAction(4);
|
||||
if (getRandom(2) == 0)
|
||||
{
|
||||
npc.broadcastSocialAction(3);
|
||||
}
|
||||
else
|
||||
{
|
||||
npc.broadcastSocialAction(4);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "queen_unlock":
|
||||
{
|
||||
final GrandBossInstance queen = (GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0);
|
||||
GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE);
|
||||
spawnBoss(queen);
|
||||
break;
|
||||
}
|
||||
case "ANT_QUEEN_TASK":
|
||||
{
|
||||
if ((_queen == null) || _queen.isDead())
|
||||
{
|
||||
cancelQuestTimers("ANT_QUEEN_TASK");
|
||||
}
|
||||
else if (_queen.calculateDistance2D(QUEEN_X, QUEEN_Y, QUEEN_Z) > 2000)
|
||||
{
|
||||
_queen.clearAggroList();
|
||||
_queen.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(QUEEN_X, QUEEN_Y, QUEEN_Z, 0));
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (event.equalsIgnoreCase("queen_unlock"))
|
||||
{
|
||||
final GrandBossInstance queen = (GrandBossInstance) addSpawn(QUEEN, QUEEN_X, QUEEN_Y, QUEEN_Z, 0, false, 0);
|
||||
GrandBossManager.getInstance().setBossStatus(QUEEN, ALIVE);
|
||||
spawnBoss(queen);
|
||||
}
|
||||
return super.onAdvEvent(event, npc, player);
|
||||
}
|
||||
@@ -245,7 +261,8 @@ public final class QueenAnt extends AbstractNpcAI
|
||||
}
|
||||
case QUEEN:
|
||||
{
|
||||
_task = ThreadPool.scheduleAtFixedRate(new QueenAntTask(), 5 * 1000, 5 * 1000);
|
||||
cancelQuestTimer("ANT_QUEEN_TASK", npc, null);
|
||||
startQuestTimer("ANT_QUEEN_TASK", 5000, npc, null, true);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -344,11 +361,7 @@ public final class QueenAnt extends AbstractNpcAI
|
||||
_larva.deleteMe();
|
||||
_larva = null;
|
||||
_queen = null;
|
||||
if (_task != null)
|
||||
{
|
||||
_task.cancel(false);
|
||||
_task = null;
|
||||
}
|
||||
cancelQuestTimers("ANT_QUEEN_TASK");
|
||||
}
|
||||
else if ((_queen != null) && !_queen.isAlikeDead())
|
||||
{
|
||||
@@ -372,29 +385,6 @@ public final class QueenAnt extends AbstractNpcAI
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
private class QueenAntTask implements Runnable
|
||||
{
|
||||
public QueenAntTask()
|
||||
{
|
||||
// Constructor stub
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
if ((_queen == null) || _queen.isDead())
|
||||
{
|
||||
_task.cancel(false);
|
||||
_task = null;
|
||||
}
|
||||
else if (_queen.calculateDistance2D(QUEEN_X, QUEEN_Y, QUEEN_Z) > 2000.)
|
||||
{
|
||||
_queen.clearAggroList();
|
||||
_queen.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, new Location(QUEEN_X, QUEEN_Y, QUEEN_Z, 0));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void main(String[] args)
|
||||
{
|
||||
new QueenAnt();
|
||||
|
@@ -246,6 +246,7 @@ public final class Minigame extends AbstractNpcAI
|
||||
case TREASURE_BOX:
|
||||
{
|
||||
npc.disableCoreAI(true);
|
||||
cancelQuestTimer("afterthat", npc, null);
|
||||
startQuestTimer("afterthat", 180000, npc, null);
|
||||
break;
|
||||
}
|
||||
|
@@ -128,6 +128,8 @@ public final class WarriorFishingBlock extends AbstractNpcAI
|
||||
@Override
|
||||
public String onSpawn(Npc npc)
|
||||
{
|
||||
cancelQuestTimer("SPAWN", npc, null);
|
||||
cancelQuestTimer("DESPAWN", npc, null);
|
||||
startQuestTimer("SPAWN", 2000, npc, null);
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
@@ -271,8 +271,7 @@ public class Quest extends AbstractScript implements IIdentifiable
|
||||
public void startQuestTimer(String name, long time, Npc npc, PlayerInstance player, boolean repeating)
|
||||
{
|
||||
final List<QuestTimer> timers = getQuestTimers().computeIfAbsent(name, k -> new ArrayList<>(1));
|
||||
// if there exists a timer with this name, allow the timer only if the [npc, player] set is unique
|
||||
// nulls act as wildcards
|
||||
// If there exists a timer with this name, allow the timer only if the [npc, player] set is unique nulls act as wildcards.
|
||||
if (getQuestTimer(name, npc, player) == null)
|
||||
{
|
||||
_writeLock.lock();
|
||||
|
Reference in New Issue
Block a user