Boss related script cleanups.

This commit is contained in:
MobiusDevelopment
2022-01-31 05:43:13 +00:00
parent 3bf00c88bf
commit f43491f64f
179 changed files with 3171 additions and 3794 deletions
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
// private static final int RIBA = 29017; // private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018; private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType ZONE;
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder BLOW = new SkillHolder(4067, 4); private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private static boolean _isTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType _zone;
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
RIBA_IREN RIBA_IREN
}; };
registerMobs(mobs); registerMobs(mobs);
_IsTeleported = false; _isTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013); _zone = ZoneManager.getInstance().getZoneById(12013);
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN); final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD) if (status == DEAD)
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
} }
else if (event.equalsIgnoreCase("check_orfen_pos")) else if (event.equalsIgnoreCase("check_orfen_pos"))
{ {
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
{ {
setSpawnPoint(npc, getRandom(3) + 1); setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false; _isTeleported = false;
} }
else if (_IsTeleported && !ZONE.isInsideZone(npc)) else if (_isTeleported && !_zone.isInsideZone(npc))
{ {
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
final int npcId = npc.getId(); final int npcId = npc.getId();
if (npcId == ORFEN) if (npcId == ORFEN)
{ {
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{ {
_IsTeleported = true; _isTeleported = true;
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
// private static final int RIBA = 29017; // private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018; private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType ZONE;
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder BLOW = new SkillHolder(4067, 4); private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private static boolean _isTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType _zone;
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
RIBA_IREN RIBA_IREN
}; };
registerMobs(mobs); registerMobs(mobs);
_IsTeleported = false; _isTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013); _zone = ZoneManager.getInstance().getZoneById(12013);
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN); final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD) if (status == DEAD)
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
} }
else if (event.equalsIgnoreCase("check_orfen_pos")) else if (event.equalsIgnoreCase("check_orfen_pos"))
{ {
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
{ {
setSpawnPoint(npc, getRandom(3) + 1); setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false; _isTeleported = false;
} }
else if (_IsTeleported && !ZONE.isInsideZone(npc)) else if (_isTeleported && !_zone.isInsideZone(npc))
{ {
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
final int npcId = npc.getId(); final int npcId = npc.getId();
if (npcId == ORFEN) if (npcId == ORFEN)
{ {
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{ {
_IsTeleported = true; _isTeleported = true;
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
// private static final int RIBA = 29017; // private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018; private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType ZONE;
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder BLOW = new SkillHolder(4067, 4); private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private static boolean _isTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType _zone;
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
RIBA_IREN RIBA_IREN
}; };
registerMobs(mobs); registerMobs(mobs);
_IsTeleported = false; _isTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013); _zone = ZoneManager.getInstance().getZoneById(12013);
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN); final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD) if (status == DEAD)
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
} }
else if (event.equalsIgnoreCase("check_orfen_pos")) else if (event.equalsIgnoreCase("check_orfen_pos"))
{ {
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
{ {
setSpawnPoint(npc, getRandom(3) + 1); setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false; _isTeleported = false;
} }
else if (_IsTeleported && !ZONE.isInsideZone(npc)) else if (_isTeleported && !_zone.isInsideZone(npc))
{ {
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
final int npcId = npc.getId(); final int npcId = npc.getId();
if (npcId == ORFEN) if (npcId == ORFEN)
{ {
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{ {
_IsTeleported = true; _isTeleported = true;
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
// private static final int RIBA = 29017; // private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018; private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType ZONE;
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder BLOW = new SkillHolder(4067, 4); private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private static boolean _isTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType _zone;
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
RIBA_IREN RIBA_IREN
}; };
registerMobs(mobs); registerMobs(mobs);
_IsTeleported = false; _isTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013); _zone = ZoneManager.getInstance().getZoneById(12013);
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN); final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD) if (status == DEAD)
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
} }
else if (event.equalsIgnoreCase("check_orfen_pos")) else if (event.equalsIgnoreCase("check_orfen_pos"))
{ {
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
{ {
setSpawnPoint(npc, getRandom(3) + 1); setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false; _isTeleported = false;
} }
else if (_IsTeleported && !ZONE.isInsideZone(npc)) else if (_isTeleported && !_zone.isInsideZone(npc))
{ {
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
final int npcId = npc.getId(); final int npcId = npc.getId();
if (npcId == ORFEN) if (npcId == ORFEN)
{ {
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{ {
_IsTeleported = true; _isTeleported = true;
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
// private static final int RIBA = 29017; // private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018; private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType ZONE;
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder BLOW = new SkillHolder(4067, 4); private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private static boolean _isTeleported;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static ZoneType _zone;
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
RIBA_IREN RIBA_IREN
}; };
registerMobs(mobs); registerMobs(mobs);
_IsTeleported = false; _isTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013); _zone = ZoneManager.getInstance().getZoneById(12013);
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN); final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD) if (status == DEAD)
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
} }
else if (event.equalsIgnoreCase("check_orfen_pos")) else if (event.equalsIgnoreCase("check_orfen_pos"))
{ {
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) if ((_isTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!_zone.isInsideZone(npc) && !_isTeleported))
{ {
setSpawnPoint(npc, getRandom(3) + 1); setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false; _isTeleported = false;
} }
else if (_IsTeleported && !ZONE.isInsideZone(npc)) else if (_isTeleported && !_zone.isInsideZone(npc))
{ {
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
final int npcId = npc.getId(); final int npcId = npc.getId();
if (npcId == ORFEN) if (npcId == ORFEN)
{ {
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) if (!_isTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{ {
_IsTeleported = true; _isTeleported = true;
setSpawnPoint(npc, 0); setSpawnPoint(npc, 0);
} }
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -444,14 +444,14 @@ public class EtisVanEtina extends AbstractNpcAI
} }
case "end_etina": case "end_etina":
{ {
Clean(); clean();
break; break;
} }
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
protected void Clean() private void clean()
{ {
BOSS_ZONE.getCharactersInside().forEach(mob -> BOSS_ZONE.getCharactersInside().forEach(mob ->
{ {
@@ -708,12 +708,9 @@ public class EtisVanEtina extends AbstractNpcAI
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{ {
if (zone.getId() == ZONE_ID) if ((zone.getId() == ZONE_ID) && zone.getPlayersInside().isEmpty())
{ {
if (zone.getPlayersInside().isEmpty()) _collapseTask = ThreadPool.schedule(this::clean, 900000);
{
_collapseTask = ThreadPool.schedule(() -> Clean(), 900000);
}
} }
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@@ -723,25 +720,18 @@ public class EtisVanEtina extends AbstractNpcAI
{ {
if (npc.getId() == ETIS_VAN_ETINA1) if (npc.getId() == ETIS_VAN_ETINA1)
{ {
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS);
});
startQuestTimer("spawnTransformedEtina", 15000, null, null); startQuestTimer("spawnTransformedEtina", 15000, null, null);
} }
else if (npc.getId() == ETIS_VAN_ETINA2) else if (npc.getId() == ETIS_VAN_ETINA2)
{ {
notifyEvent("cancel_timers", null, null); notifyEvent("cancel_timers", null, null);
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING);
});
GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD); GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD);
final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1); final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1);
info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime); info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info); GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info);
startQuestTimer("unlock_etina", respawnTime, null, null); startQuestTimer("unlock_etina", respawnTime, null, null);
startQuestTimer("end_etina", 900000, null, null); startQuestTimer("end_etina", 900000, null, null);
} }
@@ -774,10 +764,7 @@ public class EtisVanEtina extends AbstractNpcAI
_etina.setTargetable(true); _etina.setTargetable(true);
BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true))); BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true)));
_kain.deleteMe(); _kain.deleteMe();
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_KAIN_BOSS_ENDING));
{
playMovie(player, Movie.SC_KAIN_BOSS_ENDING);
});
} }
return super.onKill(npc, killer, isPet); return super.onKill(npc, killer, isPet);
} }
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -57,8 +57,6 @@ public class Orfen extends AbstractNpcAI
private static final int ARIMA = 29326; private static final int ARIMA = 29326;
private static final int ARIMUS = 29327; private static final int ARIMUS = 29327;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -75,6 +73,8 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder HALLUCINATING_DUST = new SkillHolder(32494, 1); private static final SkillHolder HALLUCINATING_DUST = new SkillHolder(32494, 1);
private static final SkillHolder ORFEN_RAGE = new SkillHolder(32495, 1); private static final SkillHolder ORFEN_RAGE = new SkillHolder(32495, 1);
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -444,14 +444,14 @@ public class EtisVanEtina extends AbstractNpcAI
} }
case "end_etina": case "end_etina":
{ {
Clean(); clean();
break; break;
} }
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
protected void Clean() private void clean()
{ {
BOSS_ZONE.getCharactersInside().forEach(mob -> BOSS_ZONE.getCharactersInside().forEach(mob ->
{ {
@@ -708,12 +708,9 @@ public class EtisVanEtina extends AbstractNpcAI
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{ {
if (zone.getId() == ZONE_ID) if ((zone.getId() == ZONE_ID) && zone.getPlayersInside().isEmpty())
{ {
if (zone.getPlayersInside().isEmpty()) _collapseTask = ThreadPool.schedule(this::clean, 900000);
{
_collapseTask = ThreadPool.schedule(() -> Clean(), 900000);
}
} }
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@@ -723,25 +720,18 @@ public class EtisVanEtina extends AbstractNpcAI
{ {
if (npc.getId() == ETIS_VAN_ETINA1) if (npc.getId() == ETIS_VAN_ETINA1)
{ {
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS);
});
startQuestTimer("spawnTransformedEtina", 15000, null, null); startQuestTimer("spawnTransformedEtina", 15000, null, null);
} }
else if (npc.getId() == ETIS_VAN_ETINA2) else if (npc.getId() == ETIS_VAN_ETINA2)
{ {
notifyEvent("cancel_timers", null, null); notifyEvent("cancel_timers", null, null);
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING);
});
GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD); GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD);
final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1); final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1);
info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime); info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info); GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info);
startQuestTimer("unlock_etina", respawnTime, null, null); startQuestTimer("unlock_etina", respawnTime, null, null);
startQuestTimer("end_etina", 900000, null, null); startQuestTimer("end_etina", 900000, null, null);
} }
@@ -774,10 +764,7 @@ public class EtisVanEtina extends AbstractNpcAI
_etina.setTargetable(true); _etina.setTargetable(true);
BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true))); BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true)));
_kain.deleteMe(); _kain.deleteMe();
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_KAIN_BOSS_ENDING));
{
playMovie(player, Movie.SC_KAIN_BOSS_ENDING);
});
} }
return super.onKill(npc, killer, isPet); return super.onKill(npc, killer, isPet);
} }
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {
@@ -134,41 +134,26 @@ public class Vortex extends AbstractNpcAI
@Override @Override
public String onSpawn(Npc npc) public String onSpawn(Npc npc)
{
switch (npc.getId())
{
case SMALL_VORTEX:
{ {
attackRandomTarget(npc); attackRandomTarget(npc);
npc.setRandomWalking(true); npc.setRandomWalking(true);
npc.setRunning(); npc.setRunning();
break;
}
case BIG_VORTEX:
{
attackRandomTarget(npc);
npc.setRandomWalking(true);
npc.setRunning();
break;
}
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
private void attackRandomTarget(Npc npc) private void attackRandomTarget(Npc npc)
{ {
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class); final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
{
if ((players == null) || players.isEmpty()) if ((players == null) || players.isEmpty())
{ {
return; return;
} }
if (!players.isEmpty()) if (!players.isEmpty())
{ {
addAttackPlayerDesire(npc, players.stream().findAny().get()); addAttackPlayerDesire(npc, players.stream().findAny().get());
} }
} }
}
public static void main(String[] args) public static void main(String[] args)
{ {
@@ -530,14 +530,11 @@ public class OctavisWarzone extends AbstractInstance
{ {
final Instance world = npc.getInstanceWorld(); final Instance world = npc.getInstanceWorld();
if (isInInstance(world)) if (isInInstance(world))
{
if (CommonUtil.contains(GLADIATORS, npc.getId()))
{ {
npc.setRandomWalking(false); npc.setRandomWalking(false);
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true); world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null); getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
} }
}
return super.onSpawn(npc); return super.onSpawn(npc);
} }
@@ -57,8 +57,6 @@ public class Orfen extends AbstractNpcAI
private static final int ARIMA = 29326; private static final int ARIMA = 29326;
private static final int ARIMUS = 29327; private static final int ARIMUS = 29327;
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
@@ -75,6 +73,8 @@ public class Orfen extends AbstractNpcAI
private static final SkillHolder HALLUCINATING_DUST = new SkillHolder(32494, 1); private static final SkillHolder HALLUCINATING_DUST = new SkillHolder(32494, 1);
private static final SkillHolder ORFEN_RAGE = new SkillHolder(32495, 1); private static final SkillHolder ORFEN_RAGE = new SkillHolder(32495, 1);
private static Set<Attackable> _minions = ConcurrentHashMap.newKeySet();
private Orfen() private Orfen()
{ {
final int[] mobs = final int[] mobs =
@@ -47,6 +47,12 @@ public class QueenShyeed extends AbstractNpcAI
private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class); private static final EffectZone MOB_BUFF_DISPLAY_ZONE = ZoneManager.getInstance().getZoneById(200104, EffectZone.class);
private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class); private static final EffectZone PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
@Override @Override
public String onAdvEvent(String event, Npc npc, Player player) public String onAdvEvent(String event, Npc npc, Player player)
{ {
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
private QueenShyeed()
{
addKillId(SHYEED);
spawnShyeed();
}
private void spawnShyeed() private void spawnShyeed()
{ {
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0); final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int DEAD = 3; private static final int DEAD = 3;
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
// Spawns // Spawns
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965); private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
private static final Location[] TIE_SPAWN = new Location[] private static final Location[] TIE_SPAWN = new Location[]
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
{81208, -182095, -9896} {81208, -182095, -9896}
}; };
// @formatter:on // @formatter:on
// Others
protected double _hpTail;
protected double _hpTrasken;
private static Npc _tieTrasken;
private static Npc _trasken;
private static NoSummonFriendZone _zoneLair;
private static NoSummonFriendZone _zoneLair2;
private int _playersToEnter;
protected int _statusZone = 0;
protected ScheduledFuture<?> _collapseTask;
protected AtomicInteger _killsTie = new AtomicInteger(0);
protected AtomicInteger _killsTradjan = new AtomicInteger(0);
public Trasken() public Trasken()
{ {
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
protected void Clean() protected void clean()
{ {
_statusZone = 0; _statusZone = 0;
if (_collapseTask != null) if (_collapseTask != null)
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
}); });
} }
private void Fail(boolean clean) private void fail(boolean clean)
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair2.oustAllPlayers(); _zoneLair2.oustAllPlayers();
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0; final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
if ((percent <= 30) && (_statusZone == 4)) if ((percent <= 30) && (_statusZone == 4))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 5; _statusZone = 5;
} }
if ((percent <= 40) && (_statusZone == 3)) if ((percent <= 40) && (_statusZone == 3))
{ {
TraskenStay(npc); traskenStay(npc);
_statusZone = 4; _statusZone = 4;
} }
if (getRandom(100) < 50) if (getRandom(100) < 50)
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
} }
final int time = 540000; final int time = 540000;
zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME))); zone.getPlayersInside().forEach(temp -> temp.sendPacket(new ExSendUIEvent(temp, false, false, 540, 0, NpcStringId.REMAINING_TIME)));
_collapseTask = ThreadPool.schedule(() -> Fail(true), time); _collapseTask = ThreadPool.schedule(() -> fail(true), time);
} }
return super.onEnterZone(creature, zone); return super.onEnterZone(creature, zone);
} }
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
{ {
_collapseTask = ThreadPool.schedule(() -> _collapseTask = ThreadPool.schedule(() ->
{ {
Fail(true); fail(true);
for (int info : EVENT_TRIGGERS) for (int info : EVENT_TRIGGERS)
{ {
creature.broadcastPacket(new OnEventTrigger(info, false)); creature.broadcastPacket(new OnEventTrigger(info, false));
@@ -864,7 +864,7 @@ public class Trasken extends AbstractNpcAI
} }
} }
private void TraskenStay(Creature creature) private void traskenStay(Creature creature)
{ {
creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true)); creature.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_EARTH_WYRM_HAS_LOST_CONSCIOUSNESS, 5, 4600, true));
creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo creature.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
private static final int DIVINE_BURNER = 18915; private static final int DIVINE_BURNER = 18915;
private static final int GRAIL_WARD = 18929; private static final int GRAIL_WARD = 18929;
// Skill // Skill
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1); private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
// Instances // Instances
ArrayList<Npc> _divineBurners = new ArrayList<>(4); private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
private Player _nextTarget = null; private Player _nextTarget = null;
private Npc _current = null; private Npc _current = null;
private int _pot = 0; private int _pot = 0;
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
// Misc // Misc
private static final byte ALIVE = 0; private static final byte ALIVE = 0;
private static final byte DEAD = 1; private static final byte DEAD = 1;
private static boolean _firstAttacked;
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet(); private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
private static boolean _firstAttacked;
private Core() private Core()
{ {
@@ -444,14 +444,14 @@ public class EtisVanEtina extends AbstractNpcAI
} }
case "end_etina": case "end_etina":
{ {
Clean(); clean();
break; break;
} }
} }
return super.onAdvEvent(event, npc, player); return super.onAdvEvent(event, npc, player);
} }
protected void Clean() private void clean()
{ {
BOSS_ZONE.getCharactersInside().forEach(mob -> BOSS_ZONE.getCharactersInside().forEach(mob ->
{ {
@@ -708,12 +708,9 @@ public class EtisVanEtina extends AbstractNpcAI
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{ {
if (zone.getId() == ZONE_ID) if ((zone.getId() == ZONE_ID) && zone.getPlayersInside().isEmpty())
{ {
if (zone.getPlayersInside().isEmpty()) _collapseTask = ThreadPool.schedule(this::clean, 900000);
{
_collapseTask = ThreadPool.schedule(() -> Clean(), 900000);
}
} }
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@@ -723,25 +720,18 @@ public class EtisVanEtina extends AbstractNpcAI
{ {
if (npc.getId() == ETIS_VAN_ETINA1) if (npc.getId() == ETIS_VAN_ETINA1)
{ {
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_TRANS);
});
startQuestTimer("spawnTransformedEtina", 15000, null, null); startQuestTimer("spawnTransformedEtina", 15000, null, null);
} }
else if (npc.getId() == ETIS_VAN_ETINA2) else if (npc.getId() == ETIS_VAN_ETINA2)
{ {
notifyEvent("cancel_timers", null, null); notifyEvent("cancel_timers", null, null);
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING));
{
playMovie(player, Movie.SC_ETIS_VAN_ETINA_ENDING);
});
GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD); GrandBossManager.getInstance().setBossStatus(ETIS_VAN_ETINA1, DEAD);
final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.ETINA_SPAWN_INTERVAL + getRandom(-Config.ETINA_SPAWN_RANDOM, Config.ETINA_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1); final StatSet info = GrandBossManager.getInstance().getStatSet(ETIS_VAN_ETINA1);
info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime); info.set("respawn_time", Chronos.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info); GrandBossManager.getInstance().setStatSet(ETIS_VAN_ETINA1, info);
startQuestTimer("unlock_etina", respawnTime, null, null); startQuestTimer("unlock_etina", respawnTime, null, null);
startQuestTimer("end_etina", 900000, null, null); startQuestTimer("end_etina", 900000, null, null);
} }
@@ -774,10 +764,7 @@ public class EtisVanEtina extends AbstractNpcAI
_etina.setTargetable(true); _etina.setTargetable(true);
BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true))); BOSS_ZONE.getPlayersInside().forEach(player -> player.sendPacket(new ExShowScreenMessage(NpcStringId.ETIS_VAN_ETINA_APPROACHES, ExShowScreenMessage.TOP_CENTER, 7000, true)));
_kain.deleteMe(); _kain.deleteMe();
BOSS_ZONE.getPlayersInside().forEach(player -> BOSS_ZONE.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_KAIN_BOSS_ENDING));
{
playMovie(player, Movie.SC_KAIN_BOSS_ENDING);
});
} }
return super.onKill(npc, killer, isPet); return super.onKill(npc, killer, isPet);
} }
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
// Locations // Locations
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50); private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
// Skill // Skill
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1); private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
// Misc // Misc
private static final int TEMPLATE_ID = 137; private static final int TEMPLATE_ID = 137;
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
case KNIGHT_HARD: case KNIGHT_HARD:
{ {
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class); final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
final NpcVariables var = controller.getVariables(); final NpcVariables vars = controller.getVariables();
int knightCount = var.getInt("KNIGHT_COUNT"); int knightCount = vars.getInt("KNIGHT_COUNT");
if ((var.getInt("FREYA_MOVE") == 0) && world.isStatus(1)) if ((vars.getInt("FREYA_MOVE") == 0) && world.isStatus(1))
{ {
var.set("FREYA_MOVE", 1); vars.set("FREYA_MOVE", 1);
final Npc freya = params.getObject("freya", Npc.class); final Npc freya = params.getObject("freya", Npc.class);
if (!freya.isInCombat()) if (!freya.isInCombat())
{ {
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
if ((knightCount < 10) && (world.isStatus(2))) if ((knightCount < 10) && (world.isStatus(2)))
{ {
knightCount++; knightCount++;
var.set("KNIGHT_COUNT", knightCount); vars.set("KNIGHT_COUNT", knightCount);
if (knightCount == 10) if (knightCount == 10)
{ {
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
private void playRandomSong(Instance world) private void playRandomSong(Instance world)
{ {
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong"); final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
if (isPlayingSong) if (isPlayingSong)
{ {
return; return;
} }
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
world.setParameter("isPlayingSong", true); world.setParameter("isPlayingSong", true);
final int random = getRandom(1, 5); final int random = getRandom(1, 5);
final SkillHolder skill = new SkillHolder(5007, random); final SkillHolder skill = new SkillHolder(5007, random);
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
switch (event) switch (event)
{ {
case "attack": case "ATTACK":
{ {
if (npc != null) if (npc != null)
{ {
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
break; break;
} }
case "random_target": case "RANDOM_TARGET":
{ {
_target = getRandomTarget(npc, null); _target = getRandomTarget(npc, null);
break; break;
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
@Override @Override
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon) public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
{ {
startQuestTimer("random_Target", 5000, npc, null, true); startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
startQuestTimer("attack", 500, npc, null, true); startQuestTimer("ATTACK", 500, npc, null, true);
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@Override @Override
public String onKill(Npc npc, Player killer, boolean isSummon) public String onKill(Npc npc, Player killer, boolean isSummon)
{ {
cancelQuestTimer("attack", npc, null); cancelQuestTimers("ATTACK");
cancelQuestTimer("random_Target", npc, null); cancelQuestTimers("RANDOM_TARGET");
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
} }
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
{ {
return; return;
} }
if ((getRandom(100) < 30) || (_target == null) || _target.isDead()) if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
{ {
_skill = getRndSkills(npc); _skill = getRndSkills(npc);
_target = getRandomTarget(npc, _skill); _target = getRandomTarget(npc, _skill);
} }
final Creature target = _target;
Skill skill = _skill; Skill skill = _skill;
if (skill == null) if (skill == null)
{ {
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
return; return;
} }
final Creature target = _target;
if ((target == null) || target.isDead()) if ((target == null) || target.isDead())
{ {
// npc.setCastingNow(false); // npc.setCastingNow(false);
@@ -213,7 +214,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
private Creature getRandomTarget(Npc npc, Skill skill) private Creature getRandomTarget(Npc npc, Skill skill)
{ {
final List<Creature> result = new ArrayList<>(); final List<Creature> result = new ArrayList<>();
{
for (Player obj : npc.getInstanceWorld().getPlayers()) for (Player obj : npc.getInstanceWorld().getPlayers())
{ {
if (obj.isPlayer() && obj.getActingPlayer().isInvisible()) if (obj.isPlayer() && obj.getActingPlayer().isInvisible())
@@ -261,7 +261,6 @@ public class ScarletVanHalisha extends AbstractNpcAI
} }
} }
} }
}
return getRandomEntry(result); return getRandomEntry(result);
} }
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
} }
// Misc // Misc
private static final int HELIOS_RAID_DURATION = 5; // hours private static final int HELIOS_RAID_DURATION = 5; // hours
private static Npc bossInstance; private static Npc _bossInstance;
private final NoSummonFriendZone bossZone; private final NoSummonFriendZone _bossZone;
private GrandBoss _tempHelios; private GrandBoss _tempHelios;
private static List<Npc> _minionSpawns = new ArrayList<>(); private static List<Npc> _minionSpawns = new ArrayList<>();
private static Npc blueLightning; private static Npc _blueLightning;
private static Npc redLightning; private static Npc _redLightning;
private static Npc leopold; private static Npc _leopold;
private boolean activated = false; private boolean _activated = false;
private boolean stage1_50 = false; private boolean _stage1 = false;
private boolean stage2_50 = false; private boolean _stage2 = false;
private boolean helios80 = false; private boolean _helios80 = false;
private boolean helios50 = false; private boolean _helios50 = false;
private boolean _announce = false; private boolean _announce = false;
protected ScheduledFuture<?> _blueSpearTask; protected ScheduledFuture<?> _blueSpearTask;
protected ScheduledFuture<?> _redSpearTask; protected ScheduledFuture<?> _redSpearTask;
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
addAttackId(HELIOS1, HELIOS2, HELIOS3); addAttackId(HELIOS1, HELIOS2, HELIOS3);
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS); addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
// Zone // Zone
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class); _bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
// Unlock // Unlock
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
if ((npc.getId() == HELIOS1) && !_announce) if ((npc.getId() == HELIOS1) && !_announce)
{ {
_announce = true; _announce = true;
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _debuffTask = ThreadPool.scheduleAtFixedRate(() -> _bossZone.getPlayersInside().forEach(player -> AUDIENCE_DEBUFF.getSkill().applyEffects(player, player)), 5000, 20000);
{
bossZone.getPlayersInside().forEach(player ->
{
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
});
}, 5000, 20000);
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_ADEN_WARRIORS_BEGIN_BATTLE_WITH_THE_GIANT_EMPEROR_HELIOS, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
if ((npc.getId() == HELIOS1) && !stage1_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS1) && !_stage1 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage1_50 = true; _stage1 = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS2) && !activated) if ((npc.getId() == HELIOS2) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() -> _blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.setTarget(randomPlayer); _blueLightning.setTarget(randomPlayer);
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill()); _blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_BLUE_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 10000, 120000); }, 10000, 120000);
_redSpearTask = ThreadPool.scheduleAtFixedRate(() -> _redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.setTarget(randomPlayer); _redLightning.setTarget(randomPlayer);
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill()); _redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
} }
} }
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_PICKS_UP_THE_RED_LIGHTNING_SPEAR_AND_BEGINS_GATHERING_HIS_POWER, ExShowScreenMessage.TOP_CENTER, 10000, true));
}, 30000, 120000); }, 30000, 120000);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS2) && !stage2_50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) if ((npc.getId() == HELIOS2) && !_stage2 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
stage2_50 = true; _stage2 = true;
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
} }
if ((npc.getId() == HELIOS3) && !activated) if ((npc.getId() == HELIOS3) && !_activated)
{ {
activated = true; _activated = true;
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
_leopoldTask = ThreadPool.scheduleAtFixedRate(() -> _leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
{ {
int count = bossZone.getPlayersInside().size(); int count = _bossZone.getPlayersInside().size();
if (count > 0) if (count > 0)
{ {
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count)); Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
if (leopold != null) if (_leopold != null)
{ {
leopold.setTarget(randomPlayer); _leopold.setTarget(randomPlayer);
int rnd = getRandom(100); int rnd = getRandom(100);
if (rnd < 16) if (rnd < 16)
{ {
leopold.doCast(LEOPOLD_BOMB.getSkill()); _leopold.doCast(LEOPOLD_BOMB.getSkill());
} }
else if (rnd < 32) else if (rnd < 32)
{ {
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill()); _leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
} }
else if (rnd < 48) else if (rnd < 48)
{ {
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill()); _leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
} }
else if (rnd < 64) else if (rnd < 64)
{ {
leopold.doCast(LEOPOLD_MINI_GUN.getSkill()); _leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
} }
else if (rnd < 80) else if (rnd < 80)
{ {
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill()); _leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
} }
else else
{ {
leopold.doCast(LEOPOLD_HARPOON.getSkill()); _leopold.doCast(LEOPOLD_HARPOON.getSkill());
} }
} }
} }
}, 5000, 10000); }, 5000, 10000);
} }
if ((npc.getId() == HELIOS3) && !helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8))) if ((npc.getId() == HELIOS3) && !_helios80 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.8)))
{ {
helios80 = true; _helios80 = true;
addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0); addSpawn(LEOPOLD_ORIGIN, LEOPOLD_ORIGIN_LOC, false, 0);
addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0); addSpawn(ENUMA_ELISH_ORIGIN, ENUMA_ELISH_ORIGIN_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_KAMAEL_ORIGINS_ABOVE_THE_THRONE_OF_HELIOS_BEGIN_TO_SOAR, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
else if ((npc.getId() == HELIOS3) && !helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5))) else if ((npc.getId() == HELIOS3) && !_helios50 && (npc.getCurrentHp() <= (npc.getMaxHp() * 0.5)))
{ {
helios50 = true; _helios50 = true;
HELIOS_RAGE4.getSkill().applyEffects(bossInstance, bossInstance); HELIOS_RAGE4.getSkill().applyEffects(_bossInstance, _bossInstance);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_USES_THE_PRANARACH_SHIELD_OF_LIGHT_TO_MINIMIZE_DAMAGE, ExShowScreenMessage.TOP_CENTER, 10000, true));
bossInstance.abortCast(); _bossInstance.abortCast();
bossInstance.doCast(PRANARACH.getSkill()); _bossInstance.doCast(PRANARACH.getSkill());
} }
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING) if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
{ {
GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING); GrandBossManager.getInstance().setBossStatus(HELIOS3, FIGHTING);
bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS1, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
} }
startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, bossInstance, null); startQuestTimer("resetRaid", HELIOS_RAID_DURATION * 60 * 60 * 1000, _bossInstance, null);
} }
break; break;
} }
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3); final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
if ((status > ALIVE) && (status < DEAD)) if ((status > ALIVE) && (status < DEAD))
{ {
bossZone.oustAllPlayers(); _bossZone.oustAllPlayers();
Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true)); Broadcast.toAllOnlinePlayers(new ExShowScreenMessage(NpcStringId.THE_HEROES_DRAINED_OF_THEIR_POWERS_HAVE_BEEN_BANISHED_FROM_THE_THRONE_OF_HELIOS_BY_HELIOS_POWERS, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE); GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
Clean(); clean();
} }
break; break;
} }
case "stage2": case "stage2":
{ {
bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS2, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
for (SpawnHolder spawn : SPAWNS_MINIONS) for (SpawnHolder spawn : SPAWNS_MINIONS)
{ {
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); _minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
} }
case "stage3": case "stage3":
{ {
activated = false; _activated = false;
bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false); _bossInstance = addSpawn(HELIOS3, HELIOS_SPAWN_LOC.getX(), HELIOS_SPAWN_LOC.getY(), HELIOS_SPAWN_LOC.getZ(), HELIOS_SPAWN_LOC.getHeading(), false, 0, false);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_APPEARANCE_CHANGES_AND_HE_BEGINS_TO_GROW_STRONGER, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
break; break;
} }
case "spheresSpawn": case "spheresSpawn":
{ {
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0); _blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0); _redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
blueLightning.setInvul(true); _blueLightning.setInvul(true);
redLightning.setInvul(true); _redLightning.setInvul(true);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_ENUMA_ELISH_SPEAR_ON_THE_THRONE_OF_HELIOS_IS_PREPARED_AND_PLACED_IN_POSITION, ExShowScreenMessage.TOP_CENTER, 10000, true));
startQuestTimer("protectorsSpawn", 10000, null, null); startQuestTimer("protectorsSpawn", 10000, null, null);
break; break;
} }
case "protectorsSpawn": case "protectorsSpawn":
{ {
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_AND_MIMILLUS_APPEAR_IN_ORDER_TO_PROTECT_THE_ENUMA_ELISH_OF_RED_LIGHTNING_AND_THE_ENUMA_ELISH_OF_BLUE_LIGHTNING, ExShowScreenMessage.TOP_CENTER, 10000, true));
addSpawn(MIMILLION, MIMILLION_LOC, false, 0); addSpawn(MIMILLION, MIMILLION_LOC, false, 0);
addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0); addSpawn(MIMILLUS, MIMILLUS_LOC, false, 0);
startQuestTimer("leopoldSpawn", 10000, null, null); startQuestTimer("leopoldSpawn", 10000, null, null);
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
} }
case "leopoldSpawn": case "leopoldSpawn":
{ {
leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0); _leopold = addSpawn(LEOPOLD, LEOPOLD_LOC, false, 0);
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_SIEGE_CANNON_LEOPOLD_ON_THE_THRONE_OF_HELIOS_BEGINS_TO_PREPARE_TO_FIRE, ExShowScreenMessage.TOP_CENTER, 10000, true));
break; break;
} }
} }
return htmltext; return htmltext;
} }
private void Clean() private void clean()
{ {
bossZone.getCharactersInside().forEach(mob -> _bossZone.getCharactersInside().forEach(mob ->
{ {
if (mob.isNpc()) if (mob.isNpc())
{ {
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
{ {
case MIMILLION: case MIMILLION:
{ {
if (redLightning != null) if (_redLightning != null)
{ {
redLightning.deleteMe(); _redLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case MIMILLUS: case MIMILLUS:
{ {
if (blueLightning != null) if (_blueLightning != null)
{ {
blueLightning.deleteMe(); _blueLightning.deleteMe();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
} }
break; break;
} }
case HELIOS1: case HELIOS1:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
{
playMovie(player, Movie.SC_HELIOS_TRANS_A);
});
startQuestTimer("stage2", 15000, null, null); startQuestTimer("stage2", 15000, null, null);
break; break;
} }
case HELIOS2: case HELIOS2:
{ {
bossInstance.deleteMe(); _bossInstance.deleteMe();
if (leopold != null) if (_leopold != null)
{ {
leopold.deleteMe(); _leopold.deleteMe();
} }
bossZone.getPlayersInside().forEach(player -> _bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
{
playMovie(player, Movie.SC_HELIOS_TRANS_B);
});
startQuestTimer("stage3", 15000, null, null); startQuestTimer("stage3", 15000, null, null);
break; break;
} }
case HELIOS3: case HELIOS3:
{ {
Clean(); clean();
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true)); _bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.HELIOS_DEFEATED_TAKES_FLIGHT_DEEP_IN_TO_THE_SUPERION_FORT_HIS_THRONE_IS_RENDERED_INACTIVE, ExShowScreenMessage.TOP_CENTER, 10000, true));
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD); GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000; final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3); final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
private static final int LINDVIOR_CAMERA = 19428; private static final int LINDVIOR_CAMERA = 19428;
// Zone // Zone
private static final int ZONE_ID = 12107; private static final int ZONE_ID = 12107;
static final Location CENTER_LOCATION = new Location(46424, -26200, -1400); private static final Location CENTER_LOCATION = new Location(46424, -26200, -1400);
// Skills // Skills
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1); private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 1);
private static final SkillHolder RECHARGE = new SkillHolder(15606, 1); private static final SkillHolder RECHARGE = new SkillHolder(15606, 1);
@@ -103,32 +103,7 @@ public class Lindvior extends AbstractNpcAI
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int FIGHTING = 2; private static final int FIGHTING = 2;
private static final int DEAD = 3; private static final int DEAD = 3;
// Tasks // Others
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
private static final Location[] CONTROL_GENERATOR_SPAWNS = private static final Location[] CONTROL_GENERATOR_SPAWNS =
{ {
new Location(45288, -30360, -1432, 0), new Location(45288, -30360, -1432, 0),
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
{21170106, 21170107}, {21170106, 21170107},
{21170108, 21170109} {21170108, 21170109}
}; };
protected final int[] _chargedValues = new int[] {0, 0, 0, 0};
private static final int[] LINDVIOR_SERVITOR = {25895, 25896, 25897, 29242, 29241, 29243};
// @formatter:on // @formatter:on
private static final int[] LINDVIOR_SERVITOR =
{
25895,
25896,
25897,
29242,
29241,
29243
};
private static final NpcStringId[] GUARD_MSG = private static final NpcStringId[] GUARD_MSG =
{ {
NpcStringId.ACTIVATE_THE_GENERATOR_HURRY, NpcStringId.ACTIVATE_THE_GENERATOR_HURRY,
@@ -194,6 +176,38 @@ public class Lindvior extends AbstractNpcAI
NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL, NpcStringId.HOLD_ONTO_THE_GENERATOR_TO_ACTIVATE_THE_CHARGE_SKILL,
NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON,
}; };
// Tasks
protected ScheduledFuture<?> _socialTask;
protected ScheduledFuture<?> _mobsSpawnTask;
protected ScheduledFuture<?> _collapseTask;
protected ScheduledFuture<?> _announceTask;
protected ScheduledFuture<?> _announceProtect;
protected ScheduledFuture<?> _skillCastTask;
protected ScheduledFuture<?> _LynDracoTask;
protected ScheduledFuture<?> _smallVortexesTask;
protected ScheduledFuture<?> _bigVortexesTask;
protected NoSummonFriendZone _zoneLair;
protected GrandBoss _lindvior = null;
private GrandBoss _lindviorForSpawn = null;
protected Npc _lindviorfake = null;
protected Npc _dummyLindvior;
protected Npc _vortex = null;
protected Npc _lionel = null;
protected List<Npc> _guardSpawn = new ArrayList<>();
protected List<FriendlyNpc> _generatorSpawn = new ArrayList<>();
protected List<Npc> _monsterSpawn = new ArrayList<>();
protected List<Npc> _LinDracoSpawn = new ArrayList<>();
protected int _activeMask = 0;
protected int _chargedMask = 0;
protected int _status = 0;
protected int _stage = 0;
protected final int[] _chargedValues = new int[]
{
0,
0,
0,
0
};
public Lindvior() public Lindvior()
{ {
@@ -331,14 +345,11 @@ public class Lindvior extends AbstractNpcAI
} }
else if (percent <= 20) else if (percent <= 20)
{ {
if (_status == 5) if ((_status == 5) && (_smallVortexesTask != null))
{
if (_smallVortexesTask != null)
{ {
_smallVortexesTask.cancel(true); _smallVortexesTask.cancel(true);
_smallVortexesTask = null; _smallVortexesTask = null;
} }
}
if (_lindvior != null) if (_lindvior != null)
{ {
_lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1)); _lindvior.broadcastPacket(new SocialAction(_lindvior.getObjectId(), 1));
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
return super.onAttack(npc, attacker, damage, isSummon); return super.onAttack(npc, attacker, damage, isSummon);
} }
protected void Clean() protected void clean()
{ {
_status = 0; _status = 0;
if (_socialTask != null) if (_socialTask != null)
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
{ {
if (clean) if (clean)
{ {
Clean(); clean();
} }
_zoneLair.oustAllPlayers(); _zoneLair.oustAllPlayers();
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
@@ -579,10 +590,7 @@ public class Lindvior extends AbstractNpcAI
{ {
player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false)); player.sendPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, false));
cancelQuestTimers("NPC_SHOUT"); cancelQuestTimers("NPC_SHOUT");
_guardSpawn.stream().forEach(guard -> _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED));
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
});
_announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000); _announceProtect = ThreadPool.scheduleAtFixedRate(() -> _zoneLair.getPlayersInside().forEach(p -> player.sendPacket(new ExShowScreenMessage(NpcStringId.PROTECT_THE_GENERATOR, ExShowScreenMessage.TOP_CENTER, 7000, true))), 10000, 18000);
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0)); _zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
_dummyLindvior.setInvisible(true); _dummyLindvior.setInvisible(true);
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
} }
case "show_shield_animation": // zone broadcast shield event triger case "show_shield_animation": // zone broadcast shield event triger
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true)));
{ _guardSpawn.stream().forEach(guard -> guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON));
p.sendPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, true));
});
_guardSpawn.stream().forEach(guard ->
{
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.THE_GENERATOR_IS_CONNECTED_TO_THE_CANNON);
});
break; break;
} }
case "show_movie": // zone broadcast Lindvior scene movie case "show_movie": // zone broadcast Lindvior scene movie
{ {
_zoneLair.getPlayersInside().forEach(p -> _zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
{
playMovie(p, Movie.SC_LIND_OPENING);
});
startQuestTimer("spawnDummyLindvior", 23200, null, null); startQuestTimer("spawnDummyLindvior", 23200, null, null);
break; break;
} }
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior2": case "lindvior2":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true); addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
case "lindvior3": case "lindvior3":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR); spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -750,22 +747,17 @@ public class Lindvior extends AbstractNpcAI
case "lindvior4": case "lindvior4":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
{
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
{ {
_vortex.getSpawn().stopRespawn(); _vortex.getSpawn().stopRespawn();
_vortex.deleteMe(); _vortex.deleteMe();
} }
}
_status = 4; _status = 4;
break; break;
} }
case "lindvior5": case "lindvior5":
{ {
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000); _mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
_bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000); _bigVortexesTask = ThreadPool.schedule(() -> spawnServitor(1, 300, _lindvior.getLocation(), NPC_ATTACKER_BIG_VORTEX), 1000);
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS) for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
{ {
@@ -773,7 +765,7 @@ public class Lindvior extends AbstractNpcAI
addSpawn(LINDVIOR_SERVITOR[4], loc, true); addSpawn(LINDVIOR_SERVITOR[4], loc, true);
addSpawn(LINDVIOR_SERVITOR[3], loc, true); addSpawn(LINDVIOR_SERVITOR[3], loc, true);
} }
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000); _collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
_status = 6; _status = 6;
break; break;
} }
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
_mobsSpawnTask.cancel(true); _mobsSpawnTask.cancel(true);
_mobsSpawnTask = null; _mobsSpawnTask = null;
} }
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe()); _zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
ThreadPool.schedule(() -> npc.decayMe(), 10000); ThreadPool.schedule(npc::decayMe, 10000);
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false)); _zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true)); _zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
_lionel.deleteMe(); _lionel.deleteMe();
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
else if (npc.getId() == NPC_GENERATOR) else if (npc.getId() == NPC_GENERATOR)
{ {
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true)); _zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
Clean(); clean();
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000); _collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
} }
return super.onKill(npc, killer, isSummon); return super.onKill(npc, killer, isSummon);
@@ -888,43 +880,34 @@ public class Lindvior extends AbstractNpcAI
@Override @Override
public String onEnterZone(Creature character, ZoneType zone) public String onEnterZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (_collapseTask != null) if (_collapseTask != null)
{ {
_collapseTask.cancel(true); _collapseTask.cancel(true);
_collapseTask = null; _collapseTask = null;
} }
}
return super.onEnterZone(character, zone); return super.onEnterZone(character, zone);
} }
@Override @Override
public String onExitZone(Creature character, ZoneType zone) public String onExitZone(Creature character, ZoneType zone)
{
if (zone.getId() == ZONE_ID)
{ {
if (zone.getPlayersInside().isEmpty()) if (zone.getPlayersInside().isEmpty())
{ {
_collapseTask = ThreadPool.schedule(() -> Fail(true), 900000); _collapseTask = ThreadPool.schedule(() -> Fail(true), 900000);
} }
}
return super.onExitZone(character, zone); return super.onExitZone(character, zone);
} }
@Override @Override
public void onTimerEvent(String event, StatSet params, Npc npc, Player player) public void onTimerEvent(String event, StatSet params, Npc npc, Player player)
{ {
if (event.equals("NPC_SHOUT")) if (event.equals("NPC_SHOUT") && (npc != null) && !npc.isDead())
{
if ((npc != null) && !npc.isDead())
{ {
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]); npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null); getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
} }
} }
}
private void sendEventTrigger(boolean status, int... triggers) private void sendEventTrigger(boolean status, int... triggers)
{ {

Some files were not shown because too many files have changed in this diff Show More