Boss related script cleanups.
This commit is contained in:
@@ -40,9 +40,9 @@ public class Anais extends AbstractNpcAI
|
||||
private static final int DIVINE_BURNER = 18915;
|
||||
private static final int GRAIL_WARD = 18929;
|
||||
// Skill
|
||||
private static SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
|
||||
private static final SkillHolder DIVINE_NOVA = new SkillHolder(6326, 1);
|
||||
// Instances
|
||||
ArrayList<Npc> _divineBurners = new ArrayList<>(4);
|
||||
private final ArrayList<Npc> _divineBurners = new ArrayList<>(4);
|
||||
private Player _nextTarget = null;
|
||||
private Npc _current = null;
|
||||
private int _pot = 0;
|
||||
|
@@ -76,10 +76,8 @@ public class Core extends AbstractNpcAI
|
||||
// Misc
|
||||
private static final byte ALIVE = 0;
|
||||
private static final byte DEAD = 1;
|
||||
|
||||
private static boolean _firstAttacked;
|
||||
|
||||
private static final Collection<Attackable> _minions = ConcurrentHashMap.newKeySet();
|
||||
private static boolean _firstAttacked;
|
||||
|
||||
private Core()
|
||||
{
|
||||
|
@@ -50,7 +50,7 @@ public class IceQueensCastle extends AbstractInstance
|
||||
// Locations
|
||||
private static final Location FREYA_LOC = new Location(114730, -114805, -11200, 50);
|
||||
// Skill
|
||||
private static SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
|
||||
private static final SkillHolder ETHERNAL_BLIZZARD = new SkillHolder(6276, 1);
|
||||
// Misc
|
||||
private static final int TEMPLATE_ID = 137;
|
||||
|
||||
|
@@ -1112,12 +1112,12 @@ public class IceQueensCastleBattle extends AbstractInstance
|
||||
case KNIGHT_HARD:
|
||||
{
|
||||
final Npc spawnedBy = npc.getVariables().getObject("SPAWNED_NPC", Npc.class);
|
||||
final NpcVariables var = controller.getVariables();
|
||||
int knightCount = var.getInt("KNIGHT_COUNT");
|
||||
final NpcVariables vars = controller.getVariables();
|
||||
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);
|
||||
if (!freya.isInCombat())
|
||||
{
|
||||
@@ -1130,7 +1130,7 @@ public class IceQueensCastleBattle extends AbstractInstance
|
||||
if ((knightCount < 10) && (world.isStatus(2)))
|
||||
{
|
||||
knightCount++;
|
||||
var.set("KNIGHT_COUNT", knightCount);
|
||||
vars.set("KNIGHT_COUNT", knightCount);
|
||||
|
||||
if (knightCount == 10)
|
||||
{
|
||||
|
@@ -825,12 +825,13 @@ public class LastImperialTomb extends AbstractInstance
|
||||
|
||||
private void playRandomSong(Instance world)
|
||||
{
|
||||
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
|
||||
final boolean isPlayingSong = world.getParameters().getBoolean("isPlayingSong");
|
||||
if (isPlayingSong)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Npc frintezza = world.getParameters().getObject("frintezza", Npc.class);
|
||||
world.setParameter("isPlayingSong", true);
|
||||
final int random = getRandom(1, 5);
|
||||
final SkillHolder skill = new SkillHolder(5007, random);
|
||||
|
@@ -67,7 +67,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
{
|
||||
switch (event)
|
||||
{
|
||||
case "attack":
|
||||
case "ATTACK":
|
||||
{
|
||||
if (npc != null)
|
||||
{
|
||||
@@ -75,7 +75,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "random_target":
|
||||
case "RANDOM_TARGET":
|
||||
{
|
||||
_target = getRandomTarget(npc, null);
|
||||
break;
|
||||
@@ -94,16 +94,16 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
@Override
|
||||
public String onAttack(Npc npc, Player attacker, int damage, boolean isSummon)
|
||||
{
|
||||
startQuestTimer("random_Target", 5000, npc, null, true);
|
||||
startQuestTimer("attack", 500, npc, null, true);
|
||||
startQuestTimer("RANDOM_TARGET", 5000, npc, null, true);
|
||||
startQuestTimer("ATTACK", 500, npc, null, true);
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onKill(Npc npc, Player killer, boolean isSummon)
|
||||
{
|
||||
cancelQuestTimer("attack", npc, null);
|
||||
cancelQuestTimer("random_Target", npc, null);
|
||||
cancelQuestTimers("ATTACK");
|
||||
cancelQuestTimers("RANDOM_TARGET");
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
@@ -171,12 +171,12 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if ((getRandom(100) < 30) || (_target == null) || _target.isDead())
|
||||
{
|
||||
_skill = getRndSkills(npc);
|
||||
_target = getRandomTarget(npc, _skill);
|
||||
}
|
||||
final Creature target = _target;
|
||||
Skill skill = _skill;
|
||||
if (skill == null)
|
||||
{
|
||||
@@ -188,6 +188,7 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
return;
|
||||
}
|
||||
|
||||
final Creature target = _target;
|
||||
if ((target == null) || target.isDead())
|
||||
{
|
||||
// npc.setCastingNow(false);
|
||||
@@ -213,52 +214,50 @@ public class ScarletVanHalisha extends AbstractNpcAI
|
||||
private Creature getRandomTarget(Npc npc, Skill skill)
|
||||
{
|
||||
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())
|
||||
continue;
|
||||
}
|
||||
|
||||
if (((obj.getZ() < (npc.getZ() - 100)) && (obj.getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int skillRange = 150;
|
||||
if (skill != null)
|
||||
{
|
||||
switch (skill.getId())
|
||||
{
|
||||
continue;
|
||||
case FRINTEZZA_DAEMON_ATTACK:
|
||||
{
|
||||
skillRange = 150;
|
||||
break;
|
||||
}
|
||||
case FRINTEZZA_DAEMON_CHARGE:
|
||||
{
|
||||
skillRange = 400;
|
||||
break;
|
||||
}
|
||||
case YOKE_OF_SCARLET:
|
||||
{
|
||||
skillRange = 200;
|
||||
break;
|
||||
}
|
||||
case FRINTEZZA_DAEMON_MORPH:
|
||||
case FRINTEZZA_DAEMON_FIELD:
|
||||
{
|
||||
_lastRangedSkillTime = Chronos.currentTimeMillis();
|
||||
skillRange = 550;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (((obj.getZ() < (npc.getZ() - 100)) && (obj.getZ() > (npc.getZ() + 100))) || !GeoEngine.getInstance().canSeeTarget(obj, npc))
|
||||
if (Util.checkIfInRange(skillRange, npc, obj, true) && !((Creature) obj).isDead())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
int skillRange = 150;
|
||||
if (skill != null)
|
||||
{
|
||||
switch (skill.getId())
|
||||
{
|
||||
case FRINTEZZA_DAEMON_ATTACK:
|
||||
{
|
||||
skillRange = 150;
|
||||
break;
|
||||
}
|
||||
case FRINTEZZA_DAEMON_CHARGE:
|
||||
{
|
||||
skillRange = 400;
|
||||
break;
|
||||
}
|
||||
case YOKE_OF_SCARLET:
|
||||
{
|
||||
skillRange = 200;
|
||||
break;
|
||||
}
|
||||
case FRINTEZZA_DAEMON_MORPH:
|
||||
case FRINTEZZA_DAEMON_FIELD:
|
||||
{
|
||||
_lastRangedSkillTime = Chronos.currentTimeMillis();
|
||||
skillRange = 550;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Util.checkIfInRange(skillRange, npc, obj, true) && !((Creature) obj).isDead())
|
||||
{
|
||||
result.add(obj);
|
||||
}
|
||||
result.add(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -122,18 +122,18 @@ public class Helios extends AbstractNpcAI
|
||||
}
|
||||
// Misc
|
||||
private static final int HELIOS_RAID_DURATION = 5; // hours
|
||||
private static Npc bossInstance;
|
||||
private final NoSummonFriendZone bossZone;
|
||||
private static Npc _bossInstance;
|
||||
private final NoSummonFriendZone _bossZone;
|
||||
private GrandBoss _tempHelios;
|
||||
private static List<Npc> _minionSpawns = new ArrayList<>();
|
||||
private static Npc blueLightning;
|
||||
private static Npc redLightning;
|
||||
private static Npc leopold;
|
||||
private boolean activated = false;
|
||||
private boolean stage1_50 = false;
|
||||
private boolean stage2_50 = false;
|
||||
private boolean helios80 = false;
|
||||
private boolean helios50 = false;
|
||||
private static Npc _blueLightning;
|
||||
private static Npc _redLightning;
|
||||
private static Npc _leopold;
|
||||
private boolean _activated = false;
|
||||
private boolean _stage1 = false;
|
||||
private boolean _stage2 = false;
|
||||
private boolean _helios80 = false;
|
||||
private boolean _helios50 = false;
|
||||
private boolean _announce = false;
|
||||
protected ScheduledFuture<?> _blueSpearTask;
|
||||
protected ScheduledFuture<?> _redSpearTask;
|
||||
@@ -145,7 +145,7 @@ public class Helios extends AbstractNpcAI
|
||||
addAttackId(HELIOS1, HELIOS2, HELIOS3);
|
||||
addKillId(HELIOS1, HELIOS2, HELIOS3, MIMILLION, MIMILLUS);
|
||||
// Zone
|
||||
bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
|
||||
_bossZone = ZoneManager.getInstance().getZoneById(ZONE_ID, NoSummonFriendZone.class);
|
||||
// Unlock
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
|
||||
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
|
||||
@@ -177,151 +177,145 @@ public class Helios extends AbstractNpcAI
|
||||
if ((npc.getId() == HELIOS1) && !_announce)
|
||||
{
|
||||
_announce = true;
|
||||
_debuffTask = ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
bossZone.getPlayersInside().forEach(player ->
|
||||
{
|
||||
AUDIENCE_DEBUFF.getSkill().applyEffects(player, player);
|
||||
});
|
||||
}, 5000, 20000);
|
||||
_debuffTask = ThreadPool.scheduleAtFixedRate(() -> _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));
|
||||
}
|
||||
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;
|
||||
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance);
|
||||
_stage1 = true;
|
||||
HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
|
||||
}
|
||||
if ((npc.getId() == HELIOS2) && !activated)
|
||||
if ((npc.getId() == HELIOS2) && !_activated)
|
||||
{
|
||||
activated = true;
|
||||
HELIOS_RAGE1.getSkill().applyEffects(bossInstance, bossInstance);
|
||||
_activated = true;
|
||||
HELIOS_RAGE1.getSkill().applyEffects(_bossInstance, _bossInstance);
|
||||
_blueSpearTask = ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
int count = bossZone.getPlayersInside().size();
|
||||
int count = _bossZone.getPlayersInside().size();
|
||||
if (count > 0)
|
||||
{
|
||||
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (blueLightning != null)
|
||||
Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (_blueLightning != null)
|
||||
{
|
||||
blueLightning.setTarget(randomPlayer);
|
||||
blueLightning.doCast(BLUE_LIGHTNING_SPEAR.getSkill());
|
||||
_blueLightning.setTarget(randomPlayer);
|
||||
_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);
|
||||
_redSpearTask = ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
int count = bossZone.getPlayersInside().size();
|
||||
int count = _bossZone.getPlayersInside().size();
|
||||
if (count > 0)
|
||||
{
|
||||
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (redLightning != null)
|
||||
Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (_redLightning != null)
|
||||
{
|
||||
redLightning.setTarget(randomPlayer);
|
||||
redLightning.doCast(RED_LIGHTNING_SPEAR.getSkill());
|
||||
_redLightning.setTarget(randomPlayer);
|
||||
_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);
|
||||
_leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
int count = bossZone.getPlayersInside().size();
|
||||
int count = _bossZone.getPlayersInside().size();
|
||||
if (count > 0)
|
||||
{
|
||||
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (leopold != null)
|
||||
Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (_leopold != null)
|
||||
{
|
||||
leopold.setTarget(randomPlayer);
|
||||
_leopold.setTarget(randomPlayer);
|
||||
int rnd = getRandom(100);
|
||||
if (rnd < 16)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 32)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 48)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 64)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
|
||||
_leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
|
||||
}
|
||||
else if (rnd < 80)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
|
||||
_leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
|
||||
}
|
||||
else
|
||||
{
|
||||
leopold.doCast(LEOPOLD_HARPOON.getSkill());
|
||||
_leopold.doCast(LEOPOLD_HARPOON.getSkill());
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 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;
|
||||
HELIOS_RAGE2.getSkill().applyEffects(bossInstance, bossInstance);
|
||||
_stage2 = true;
|
||||
HELIOS_RAGE2.getSkill().applyEffects(_bossInstance, _bossInstance);
|
||||
}
|
||||
if ((npc.getId() == HELIOS3) && !activated)
|
||||
if ((npc.getId() == HELIOS3) && !_activated)
|
||||
{
|
||||
activated = true;
|
||||
HELIOS_RAGE3.getSkill().applyEffects(bossInstance, bossInstance);
|
||||
_activated = true;
|
||||
HELIOS_RAGE3.getSkill().applyEffects(_bossInstance, _bossInstance);
|
||||
_leopoldTask = ThreadPool.scheduleAtFixedRate(() ->
|
||||
{
|
||||
int count = bossZone.getPlayersInside().size();
|
||||
int count = _bossZone.getPlayersInside().size();
|
||||
if (count > 0)
|
||||
{
|
||||
Player randomPlayer = bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (leopold != null)
|
||||
Player randomPlayer = _bossZone.getPlayersInside().get(getRandom(count));
|
||||
if (_leopold != null)
|
||||
{
|
||||
leopold.setTarget(randomPlayer);
|
||||
_leopold.setTarget(randomPlayer);
|
||||
int rnd = getRandom(100);
|
||||
if (rnd < 16)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 32)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_PLASMA_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 48)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
|
||||
_leopold.doCast(LEOPOLD_ENERGY_BOMB.getSkill());
|
||||
}
|
||||
else if (rnd < 64)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
|
||||
_leopold.doCast(LEOPOLD_MINI_GUN.getSkill());
|
||||
}
|
||||
else if (rnd < 80)
|
||||
{
|
||||
leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
|
||||
_leopold.doCast(LEOPOLD_SPRAY_SHOT.getSkill());
|
||||
}
|
||||
else
|
||||
{
|
||||
leopold.doCast(LEOPOLD_HARPOON.getSkill());
|
||||
_leopold.doCast(LEOPOLD_HARPOON.getSkill());
|
||||
}
|
||||
}
|
||||
}
|
||||
}, 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(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;
|
||||
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));
|
||||
bossInstance.abortCast();
|
||||
bossInstance.doCast(PRANARACH.getSkill());
|
||||
_helios50 = true;
|
||||
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));
|
||||
_bossInstance.abortCast();
|
||||
_bossInstance.doCast(PRANARACH.getSkill());
|
||||
}
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
@@ -344,12 +338,12 @@ public class Helios extends AbstractNpcAI
|
||||
if (GrandBossManager.getInstance().getBossStatus(HELIOS3) == WAITING)
|
||||
{
|
||||
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)
|
||||
{
|
||||
_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;
|
||||
}
|
||||
@@ -358,17 +352,17 @@ public class Helios extends AbstractNpcAI
|
||||
final int status = GrandBossManager.getInstance().getBossStatus(HELIOS3);
|
||||
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));
|
||||
GrandBossManager.getInstance().setBossStatus(HELIOS3, ALIVE);
|
||||
Clean();
|
||||
clean();
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "stage2":
|
||||
{
|
||||
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));
|
||||
_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));
|
||||
for (SpawnHolder spawn : SPAWNS_MINIONS)
|
||||
{
|
||||
_minionSpawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
|
||||
@@ -378,25 +372,25 @@ public class Helios extends AbstractNpcAI
|
||||
}
|
||||
case "stage3":
|
||||
{
|
||||
activated = 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));
|
||||
_activated = 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));
|
||||
startQuestTimer("leopoldSpawn", 10000, null, null);
|
||||
break;
|
||||
}
|
||||
case "spheresSpawn":
|
||||
{
|
||||
blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
|
||||
redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
|
||||
blueLightning.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));
|
||||
_blueLightning = addSpawn(HELIOS_BLUE_LIGHTNING, BLUE_LIGHTNING_SPEAR_LOC, false, 0);
|
||||
_redLightning = addSpawn(HELIOS_RED_LIGHTNING, RED_LIGHTNING_SPEAR_LOC, false, 0);
|
||||
_blueLightning.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));
|
||||
startQuestTimer("protectorsSpawn", 10000, null, null);
|
||||
break;
|
||||
}
|
||||
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(MIMILLUS, MIMILLUS_LOC, false, 0);
|
||||
startQuestTimer("leopoldSpawn", 10000, null, null);
|
||||
@@ -404,17 +398,17 @@ public class Helios extends AbstractNpcAI
|
||||
}
|
||||
case "leopoldSpawn":
|
||||
{
|
||||
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));
|
||||
_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));
|
||||
break;
|
||||
}
|
||||
}
|
||||
return htmltext;
|
||||
}
|
||||
|
||||
private void Clean()
|
||||
private void clean()
|
||||
{
|
||||
bossZone.getCharactersInside().forEach(mob ->
|
||||
_bossZone.getCharactersInside().forEach(mob ->
|
||||
{
|
||||
if (mob.isNpc())
|
||||
{
|
||||
@@ -450,50 +444,44 @@ public class Helios extends AbstractNpcAI
|
||||
{
|
||||
case MIMILLION:
|
||||
{
|
||||
if (redLightning != null)
|
||||
if (_redLightning != null)
|
||||
{
|
||||
redLightning.deleteMe();
|
||||
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
|
||||
_redLightning.deleteMe();
|
||||
_bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLION_FALLS_AND_THE_RED_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case MIMILLUS:
|
||||
{
|
||||
if (blueLightning != null)
|
||||
if (_blueLightning != null)
|
||||
{
|
||||
blueLightning.deleteMe();
|
||||
bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
|
||||
_blueLightning.deleteMe();
|
||||
_bossZone.broadcastPacket(new ExShowScreenMessage(NpcStringId.MIMILLUS_FALLS_AND_THE_BLUE_LIGHTNING_SPEAR_VANISHES, ExShowScreenMessage.TOP_CENTER, 10000, true));
|
||||
}
|
||||
break;
|
||||
}
|
||||
case HELIOS1:
|
||||
{
|
||||
bossInstance.deleteMe();
|
||||
bossZone.getPlayersInside().forEach(player ->
|
||||
{
|
||||
playMovie(player, Movie.SC_HELIOS_TRANS_A);
|
||||
});
|
||||
_bossInstance.deleteMe();
|
||||
_bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_A));
|
||||
startQuestTimer("stage2", 15000, null, null);
|
||||
break;
|
||||
}
|
||||
case HELIOS2:
|
||||
{
|
||||
bossInstance.deleteMe();
|
||||
if (leopold != null)
|
||||
_bossInstance.deleteMe();
|
||||
if (_leopold != null)
|
||||
{
|
||||
leopold.deleteMe();
|
||||
_leopold.deleteMe();
|
||||
}
|
||||
bossZone.getPlayersInside().forEach(player ->
|
||||
{
|
||||
playMovie(player, Movie.SC_HELIOS_TRANS_B);
|
||||
});
|
||||
_bossZone.getPlayersInside().forEach(player -> playMovie(player, Movie.SC_HELIOS_TRANS_B));
|
||||
startQuestTimer("stage3", 15000, null, null);
|
||||
break;
|
||||
}
|
||||
case HELIOS3:
|
||||
{
|
||||
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));
|
||||
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));
|
||||
GrandBossManager.getInstance().setBossStatus(HELIOS3, DEAD);
|
||||
final long respawnTime = (Config.HELIOS_SPAWN_INTERVAL + getRandom(-Config.HELIOS_SPAWN_RANDOM, Config.HELIOS_SPAWN_RANDOM)) * 3600000;
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(HELIOS3);
|
||||
|
@@ -87,7 +87,7 @@ public class Lindvior extends AbstractNpcAI
|
||||
private static final int LINDVIOR_CAMERA = 19428;
|
||||
// Zone
|
||||
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
|
||||
private static final SkillHolder SKILL_RECHARGE_POSIBLE = new SkillHolder(15605, 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 FIGHTING = 2;
|
||||
private static final int DEAD = 3;
|
||||
// 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;
|
||||
|
||||
// Others
|
||||
private static final Location[] CONTROL_GENERATOR_SPAWNS =
|
||||
{
|
||||
new Location(45288, -30360, -1432, 0),
|
||||
@@ -181,9 +156,16 @@ public class Lindvior extends AbstractNpcAI
|
||||
{21170106, 21170107},
|
||||
{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
|
||||
private static final int[] LINDVIOR_SERVITOR =
|
||||
{
|
||||
25895,
|
||||
25896,
|
||||
25897,
|
||||
29242,
|
||||
29241,
|
||||
29243
|
||||
};
|
||||
private static final NpcStringId[] GUARD_MSG =
|
||||
{
|
||||
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.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()
|
||||
{
|
||||
@@ -331,13 +345,10 @@ public class Lindvior extends AbstractNpcAI
|
||||
}
|
||||
else if (percent <= 20)
|
||||
{
|
||||
if (_status == 5)
|
||||
if ((_status == 5) && (_smallVortexesTask != null))
|
||||
{
|
||||
if (_smallVortexesTask != null)
|
||||
{
|
||||
_smallVortexesTask.cancel(true);
|
||||
_smallVortexesTask = null;
|
||||
}
|
||||
_smallVortexesTask.cancel(true);
|
||||
_smallVortexesTask = null;
|
||||
}
|
||||
if (_lindvior != null)
|
||||
{
|
||||
@@ -347,7 +358,7 @@ public class Lindvior extends AbstractNpcAI
|
||||
return super.onAttack(npc, attacker, damage, isSummon);
|
||||
}
|
||||
|
||||
protected void Clean()
|
||||
protected void clean()
|
||||
{
|
||||
_status = 0;
|
||||
if (_socialTask != null)
|
||||
@@ -413,7 +424,7 @@ public class Lindvior extends AbstractNpcAI
|
||||
{
|
||||
if (clean)
|
||||
{
|
||||
Clean();
|
||||
clean();
|
||||
}
|
||||
_zoneLair.oustAllPlayers();
|
||||
_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));
|
||||
cancelQuestTimers("NPC_SHOUT");
|
||||
_guardSpawn.stream().forEach(guard ->
|
||||
{
|
||||
guard.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.ALL_4_GENERATORS_MUST_BE_ACTIVATED);
|
||||
});
|
||||
_guardSpawn.stream().forEach(guard -> 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);
|
||||
_zoneLair.broadcastPacket(new SpecialCamera(_dummyLindvior, 3300, 200, 20, 11000, 10500, 0, 8, 1, 0, 0));
|
||||
_dummyLindvior.setInvisible(true);
|
||||
@@ -696,22 +704,13 @@ public class Lindvior extends AbstractNpcAI
|
||||
}
|
||||
case "show_shield_animation": // zone broadcast shield event triger
|
||||
{
|
||||
_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);
|
||||
});
|
||||
_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));
|
||||
break;
|
||||
}
|
||||
case "show_movie": // zone broadcast Lindvior scene movie
|
||||
{
|
||||
_zoneLair.getPlayersInside().forEach(p ->
|
||||
{
|
||||
playMovie(p, Movie.SC_LIND_OPENING);
|
||||
});
|
||||
_zoneLair.getPlayersInside().forEach(p -> playMovie(p, Movie.SC_LIND_OPENING));
|
||||
startQuestTimer("spawnDummyLindvior", 23200, null, null);
|
||||
break;
|
||||
}
|
||||
@@ -725,7 +724,6 @@ public class Lindvior extends AbstractNpcAI
|
||||
case "lindvior2":
|
||||
{
|
||||
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
|
||||
|
||||
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
|
||||
{
|
||||
addSpawn(NPC_ATTACKER_SMALL_VORTEX, loc, true);
|
||||
@@ -737,7 +735,6 @@ public class Lindvior extends AbstractNpcAI
|
||||
case "lindvior3":
|
||||
{
|
||||
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
|
||||
|
||||
spawnServitor(5, 2000, _lindvior.getLocation(), LINDVIOR_SERVITOR);
|
||||
for (Location loc : ATTACKER_SMALL_VORTEX_SPAWNS)
|
||||
{
|
||||
@@ -750,14 +747,10 @@ public class Lindvior extends AbstractNpcAI
|
||||
case "lindvior4":
|
||||
{
|
||||
_mobsSpawnTask = ThreadPool.scheduleAtFixedRate(() -> spawnServitor(2, 1000, _lindvior.getLocation(), LINDVIOR_SERVITOR), 60000, 180000);
|
||||
|
||||
if (SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null)
|
||||
if ((SpawnTable.getInstance().getSpawns(NPC_ATTACKER_BIG_VORTEX) != null) && (_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
|
||||
{
|
||||
if ((_vortex != null) && (_vortex.getId() == NPC_ATTACKER_SMALL_VORTEX))
|
||||
{
|
||||
_vortex.getSpawn().stopRespawn();
|
||||
_vortex.deleteMe();
|
||||
}
|
||||
_vortex.getSpawn().stopRespawn();
|
||||
_vortex.deleteMe();
|
||||
}
|
||||
_status = 4;
|
||||
break;
|
||||
@@ -765,7 +758,6 @@ public class Lindvior extends AbstractNpcAI
|
||||
case "lindvior5":
|
||||
{
|
||||
_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);
|
||||
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[3], loc, true);
|
||||
}
|
||||
_collapseTask = ThreadPool.schedule(Lindvior.this::Clean, 600000);
|
||||
_collapseTask = ThreadPool.schedule(Lindvior.this::clean, 600000);
|
||||
_status = 6;
|
||||
break;
|
||||
}
|
||||
@@ -854,8 +846,8 @@ public class Lindvior extends AbstractNpcAI
|
||||
_mobsSpawnTask.cancel(true);
|
||||
_mobsSpawnTask = null;
|
||||
}
|
||||
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(mob -> mob.deleteMe());
|
||||
ThreadPool.schedule(() -> npc.decayMe(), 10000);
|
||||
_zoneLair.getCharactersInside().stream().filter(Creature::isNpc).forEach(Creature::deleteMe);
|
||||
ThreadPool.schedule(npc::decayMe, 10000);
|
||||
_zoneLair.broadcastPacket(new OnEventTrigger(SECOND_STAGE_EVENT_TRIGGER, false));
|
||||
_zoneLair.broadcastPacket(new OnEventTrigger(FIRST_STAGE_EVENT_TRIGGER, true));
|
||||
_lionel.deleteMe();
|
||||
@@ -870,7 +862,7 @@ public class Lindvior extends AbstractNpcAI
|
||||
else if (npc.getId() == NPC_GENERATOR)
|
||||
{
|
||||
_zoneLair.broadcastPacket(new ExShowScreenMessage(NpcStringId.THE_GENERATOR_HAS_BEEN_DESTROYED, ExShowScreenMessage.TOP_CENTER, 5000, true));
|
||||
Clean();
|
||||
clean();
|
||||
_collapseTask = ThreadPool.schedule(() -> Fail(false), 20000);
|
||||
}
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
@@ -889,13 +881,10 @@ public class Lindvior extends AbstractNpcAI
|
||||
@Override
|
||||
public String onEnterZone(Creature character, ZoneType zone)
|
||||
{
|
||||
if (zone.getId() == ZONE_ID)
|
||||
if (_collapseTask != null)
|
||||
{
|
||||
if (_collapseTask != null)
|
||||
{
|
||||
_collapseTask.cancel(true);
|
||||
_collapseTask = null;
|
||||
}
|
||||
_collapseTask.cancel(true);
|
||||
_collapseTask = null;
|
||||
}
|
||||
return super.onEnterZone(character, zone);
|
||||
}
|
||||
@@ -903,12 +892,9 @@ public class Lindvior extends AbstractNpcAI
|
||||
@Override
|
||||
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);
|
||||
}
|
||||
@@ -916,13 +902,10 @@ public class Lindvior extends AbstractNpcAI
|
||||
@Override
|
||||
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)]);
|
||||
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
|
||||
}
|
||||
npc.broadcastSay(ChatType.NPC_GENERAL, GUARD_MSG[getRandom(GUARD_MSG.length)]);
|
||||
getTimers().addTimer("NPC_SHOUT", (10 + getRandom(5)) * 1000, npc, null);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -135,38 +135,23 @@ public class Vortex extends AbstractNpcAI
|
||||
@Override
|
||||
public String onSpawn(Npc npc)
|
||||
{
|
||||
switch (npc.getId())
|
||||
{
|
||||
case SMALL_VORTEX:
|
||||
{
|
||||
attackRandomTarget(npc);
|
||||
npc.setRandomWalking(true);
|
||||
npc.setRunning();
|
||||
break;
|
||||
}
|
||||
case BIG_VORTEX:
|
||||
{
|
||||
attackRandomTarget(npc);
|
||||
npc.setRandomWalking(true);
|
||||
npc.setRunning();
|
||||
break;
|
||||
}
|
||||
}
|
||||
attackRandomTarget(npc);
|
||||
npc.setRandomWalking(true);
|
||||
npc.setRunning();
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
||||
private void attackRandomTarget(Npc npc)
|
||||
{
|
||||
final Collection<Player> players = World.getInstance().getVisibleObjects(npc, Player.class);
|
||||
if ((players == null) || players.isEmpty())
|
||||
{
|
||||
if ((players == null) || players.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
addAttackPlayerDesire(npc, players.stream().findAny().get());
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (!players.isEmpty())
|
||||
{
|
||||
addAttackPlayerDesire(npc, players.stream().findAny().get());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -531,12 +531,9 @@ public class OctavisWarzone extends AbstractInstance
|
||||
final Instance world = npc.getInstanceWorld();
|
||||
if (isInInstance(world))
|
||||
{
|
||||
if (CommonUtil.contains(GLADIATORS, npc.getId()))
|
||||
{
|
||||
npc.setRandomWalking(false);
|
||||
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
|
||||
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
|
||||
}
|
||||
npc.setRandomWalking(false);
|
||||
world.openCloseDoor(npc.getParameters().getInt("My_DoorName", -1), true);
|
||||
getTimers().addTimer("GLADIATOR_MOVING", 3000, npc, null);
|
||||
}
|
||||
return super.onSpawn(npc);
|
||||
}
|
||||
|
@@ -71,10 +71,6 @@ public class Orfen extends AbstractNpcAI
|
||||
// private static final int RIBA = 29017;
|
||||
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 DEAD = 1;
|
||||
|
||||
@@ -82,6 +78,10 @@ public class Orfen extends AbstractNpcAI
|
||||
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
|
||||
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()
|
||||
{
|
||||
final int[] mobs =
|
||||
@@ -91,8 +91,8 @@ public class Orfen extends AbstractNpcAI
|
||||
RIBA_IREN
|
||||
};
|
||||
registerMobs(mobs);
|
||||
_IsTeleported = false;
|
||||
ZONE = ZoneManager.getInstance().getZoneById(12013);
|
||||
_isTeleported = false;
|
||||
_zone = ZoneManager.getInstance().getZoneById(12013);
|
||||
final StatSet info = GrandBossManager.getInstance().getStatSet(ORFEN);
|
||||
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
|
||||
if (status == DEAD)
|
||||
@@ -199,12 +199,12 @@ public class Orfen extends AbstractNpcAI
|
||||
}
|
||||
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);
|
||||
_IsTeleported = false;
|
||||
_isTeleported = false;
|
||||
}
|
||||
else if (_IsTeleported && !ZONE.isInsideZone(npc))
|
||||
else if (_isTeleported && !_zone.isInsideZone(npc))
|
||||
{
|
||||
setSpawnPoint(npc, 0);
|
||||
}
|
||||
@@ -292,9 +292,9 @@ public class Orfen extends AbstractNpcAI
|
||||
final int npcId = npc.getId();
|
||||
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);
|
||||
}
|
||||
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 PC_BUFF_ZONE = ZoneManager.getInstance().getZoneById(200105, EffectZone.class);
|
||||
|
||||
private QueenShyeed()
|
||||
{
|
||||
addKillId(SHYEED);
|
||||
spawnShyeed();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String onAdvEvent(String event, Npc npc, Player player)
|
||||
{
|
||||
@@ -79,12 +85,6 @@ public class QueenShyeed extends AbstractNpcAI
|
||||
return super.onKill(npc, killer, isSummon);
|
||||
}
|
||||
|
||||
private QueenShyeed()
|
||||
{
|
||||
addKillId(SHYEED);
|
||||
spawnShyeed();
|
||||
}
|
||||
|
||||
private void spawnShyeed()
|
||||
{
|
||||
final long respawn = GlobalVariablesManager.getInstance().getLong("QueenShyeedRespawn", 0);
|
||||
|
@@ -101,18 +101,6 @@ public class Trasken extends AbstractNpcAI
|
||||
// Status
|
||||
private static final int ALIVE = 0;
|
||||
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
|
||||
private static final Location HEART_SPAWN = new Location(88292, -173758, -15965);
|
||||
private static final Location[] TIE_SPAWN = new Location[]
|
||||
@@ -291,6 +279,18 @@ public class Trasken extends AbstractNpcAI
|
||||
{81208, -182095, -9896}
|
||||
};
|
||||
// @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()
|
||||
{
|
||||
@@ -365,7 +365,7 @@ public class Trasken extends AbstractNpcAI
|
||||
}
|
||||
}
|
||||
|
||||
protected void Clean()
|
||||
protected void clean()
|
||||
{
|
||||
_statusZone = 0;
|
||||
if (_collapseTask != null)
|
||||
@@ -391,11 +391,11 @@ public class Trasken extends AbstractNpcAI
|
||||
});
|
||||
}
|
||||
|
||||
private void Fail(boolean clean)
|
||||
private void fail(boolean clean)
|
||||
{
|
||||
if (clean)
|
||||
{
|
||||
Clean();
|
||||
clean();
|
||||
}
|
||||
_zoneLair.oustAllPlayers();
|
||||
_zoneLair2.oustAllPlayers();
|
||||
@@ -436,12 +436,12 @@ public class Trasken extends AbstractNpcAI
|
||||
final double percent = ((npc.getCurrentHp() - damage) / npc.getMaxHp()) * 100.0;
|
||||
if ((percent <= 30) && (_statusZone == 4))
|
||||
{
|
||||
TraskenStay(npc);
|
||||
traskenStay(npc);
|
||||
_statusZone = 5;
|
||||
}
|
||||
if ((percent <= 40) && (_statusZone == 3))
|
||||
{
|
||||
TraskenStay(npc);
|
||||
traskenStay(npc);
|
||||
_statusZone = 4;
|
||||
}
|
||||
if (getRandom(100) < 50)
|
||||
@@ -760,7 +760,7 @@ public class Trasken extends AbstractNpcAI
|
||||
}
|
||||
final int time = 540000;
|
||||
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);
|
||||
}
|
||||
@@ -772,7 +772,7 @@ public class Trasken extends AbstractNpcAI
|
||||
{
|
||||
_collapseTask = ThreadPool.schedule(() ->
|
||||
{
|
||||
Fail(true);
|
||||
fail(true);
|
||||
for (int info : EVENT_TRIGGERS)
|
||||
{
|
||||
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.doCast(SKILL_TRASKEN_BUFF.getSkill()); // 12 sec combo
|
||||
|
Reference in New Issue
Block a user