From 294e991824e03b4ca93fe106e8daa273a9f4deee Mon Sep 17 00:00:00 2001 From: ZqT Date: Thu, 27 Jun 2024 19:54:50 -0300 Subject: [PATCH 1/5] Fix EmpyreanCrucibleInstance --- .../empyreanCrucible/ArminosDrakyAI.java | 5 +- .../EmpyreanAdministratorArminosAI.java | 10 +- .../empyreanCrucible/EmpyreanArbiterAI.java | 48 +- .../EmpyreanRecordKeeperAI.java | 124 +-- .../empyreanCrucible/KingConsierdAI.java | 89 +- .../empyreanCrucible/MagePreceptorAI.java | 18 +- .../empyreanCrucible/PriestPreceptorAI.java | 37 +- .../empyreanCrucible/QueenAlukinaAI.java | 32 +- .../instance/empyreanCrucible/RM1337AI.java | 101 +- .../empyreanCrucible/SpectralWarriorAI.java | 9 +- .../empyreanCrucible/StrangeCreatureAI.java | 23 +- .../empyreanCrucible/TakunGojiraAI.java | 12 +- .../empyreanCrucible/WarriorPreceptorAI.java | 37 +- .../crucible/EmpyreanCrucibleInstance.java | 963 ++++++++---------- .../data/static_data/npcs/npc_templates.xml | 2 +- .../data/static_data/portals/portal_loc.xml | 4 +- 16 files changed, 600 insertions(+), 914 deletions(-) diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java index 8923dba302..8729b82afa 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java @@ -37,13 +37,14 @@ protected void handleSpawned() { @Override protected void handleMoveArrived() { super.handleMoveArrived(); - if (getOwner().getMoveController().getCurrentStep().isLastStep()) { // circle twice + if (getOwner().getMoveController().getCurrentStep().isLastStep()) { if (!isStart) { getSpawnTemplate().setWalkerId(null); WalkManager.stopWalking(this); AIActions.deleteOwner(this); - } else + } else { isStart = false; + } } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java index 60683c0c82..4e6f0aa090 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java @@ -23,12 +23,12 @@ protected void handleSpawned() { private void startEvent() { switch (getNpcId()) { - case 217744: + case 217744 -> { PacketSendUtility.broadcastMessage(getOwner(), 1500247, 8000); PacketSendUtility.broadcastMessage(getOwner(), 1500250, 20000); PacketSendUtility.broadcastMessage(getOwner(), 1500251, 60000); - break; - case 217749: + } + case 217749 -> { PacketSendUtility.broadcastMessage(getOwner(), 1500252, 8000); PacketSendUtility.broadcastMessage(getOwner(), 1500253, 16000); PacketSendUtility.broadcastToMap(getOwner(), 1400982, 25000); @@ -39,9 +39,7 @@ private void startEvent() { PacketSendUtility.broadcastToMap(getOwner(), 1401014, 113000); PacketSendUtility.broadcastToMap(getOwner(), 1401015, 118000); PacketSendUtility.broadcastMessage(getOwner(), 1500255, 118000); - break; - // case - // despawn after 1min + } } } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java index 6c1b7f362b..2d1c8a4457 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java @@ -2,8 +2,6 @@ import static com.aionemu.gameserver.model.DialogAction.SETPRO1; -import java.util.function.Consumer; - import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.ai.NpcAI; import com.aionemu.gameserver.model.gameobjects.Npc; @@ -27,41 +25,24 @@ public EmpyreanArbiterAI(Npc owner) { @Override protected void handleDialogStart(Player player) { - if (player.getInventory().getFirstItemByItemId(186000124) != null) { + if (player.getInventory().getFirstItemByItemId(186000124) != null) PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 1011)); - } else { - // to do + else PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); - } } @Override public boolean onDialogSelect(Player player, int dialogActionId, int questId, int extendedRewardIndex) { int instanceId = getPosition().getInstanceId(); - if (dialogActionId == SETPRO1 && player.getInventory().decreaseByItemId(186000124, 1)) { switch (getNpcId()) { - case 799573: - TeleportService.teleportTo(player, 300300000, instanceId, 358.2547f, 349.26443f, 96.09108f, (byte) 59); - break; - case 205426: - TeleportService.teleportTo(player, 300300000, instanceId, 1260.15f, 812.34f, 358.6056f, (byte) 90); - break; - case 205427: - TeleportService.teleportTo(player, 300300000, instanceId, 1616.0248f, 154.43837f, 126f, (byte) 10); - break; - case 205428: - TeleportService.teleportTo(player, 300300000, instanceId, 1793.9233f, 796.92f, 469.36542f, (byte) 60); - break; - case 205429: - TeleportService.teleportTo(player, 300300000, instanceId, 1776.4169f, 1749.9952f, 303.69553f, (byte) 0); - break; - case 205430: - TeleportService.teleportTo(player, 300300000, instanceId, 1328.935f, 1742.0771f, 316.74188f, (byte) 0); - break; - case 205431: - TeleportService.teleportTo(player, 300300000, instanceId, 1760.9441f, 1278.033f, 394.23764f, (byte) 0); - break; + case 799573 -> TeleportService.teleportTo(player, 300300000, instanceId, 358.2547f, 349.26443f, 96.09108f, (byte) 59); + case 205426 -> TeleportService.teleportTo(player, 300300000, instanceId, 1260.15f, 812.34f, 358.6056f, (byte) 90); + case 205427 -> TeleportService.teleportTo(player, 300300000, instanceId, 1616.0248f, 154.43837f, 126f, (byte) 10); + case 205428 -> TeleportService.teleportTo(player, 300300000, instanceId, 1793.9233f, 796.92f, 469.36542f, (byte) 60); + case 205429 -> TeleportService.teleportTo(player, 300300000, instanceId, 1776.4169f, 1749.9952f, 303.69553f, (byte) 0); + case 205430 -> TeleportService.teleportTo(player, 300300000, instanceId, 1328.935f, 1742.0771f, 316.74188f, (byte) 0); + case 205431 -> TeleportService.teleportTo(player, 300300000, instanceId, 1760.9441f, 1278.033f, 394.23764f, (byte) 0); } InstanceScore instance = getPosition().getWorldMapInstance().getInstanceHandler().getInstanceScore(); if (instance != null) { @@ -71,15 +52,8 @@ public boolean onDialogSelect(Player player, int dialogActionId, int questId, in } } PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); - - getPosition().getWorldMapInstance().forEachPlayer(new Consumer() { - - @Override - public void accept(Player p) { - PacketSendUtility.sendPacket(p, SM_SYSTEM_MESSAGE.STR_MSG_FRIENDLY_MOVE_COMBATAREA_IDARENA(player.getName())); - } - - }); + getPosition().getWorldMapInstance().forEachPlayer( + p -> PacketSendUtility.sendPacket(p, SM_SYSTEM_MESSAGE.STR_MSG_FRIENDLY_MOVE_COMBATAREA_IDARENA(player.getName()))); } return true; } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java index 8efaba1d43..70562d84e5 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java @@ -13,7 +13,7 @@ import com.aionemu.gameserver.utils.PacketSendUtility; /** - * @author xTz, Luzien + * @author xTz, Luzien, w4terbomb */ @AIName("empyreanrecordkeeper") public class EmpyreanRecordKeeperAI extends NpcAI { @@ -25,41 +25,26 @@ public EmpyreanRecordKeeperAI(Npc owner) { @Override public void handleSpawned() { super.handleSpawned(); - int msg = 0; - switch (getNpcId()) { - case 799568: - msg = 1111460; - break; - case 799569: - msg = 1111461; - break; - case 205331: - msg = 1111462; - break; - case 205338: - msg = 1111463; - break; - case 205339: - msg = 1111464; - break; - case 205340: - msg = 1111465; - break; - case 205341: - msg = 1111466; - break; - case 205342: - msg = 1111467; - break; - case 205343: - msg = 1111468; - break; - case 205344: - msg = 1111469; - } - if (msg != 0) { + int msg = getNpcIdMessage(getNpcId()); + if (msg != 0) PacketSendUtility.broadcastMessage(getOwner(), msg, 1000); - } + } + + private int getNpcIdMessage(int npcId) { + return switch (npcId) { + case 799568 -> 1111460; + case 799569 -> 1111461; + case 205331 -> 1111462; + case 205337 -> 1111459; + case 205338 -> 1111463; + case 205339 -> 1111464; + case 205340 -> 1111465; + case 205341 -> 1111466; + case 205342 -> 1111467; + case 205343 -> 1111468; + case 205344 -> 1111469; + default -> 0; + }; } @Override @@ -73,60 +58,25 @@ public boolean onDialogSelect(Player player, int dialogActionId, int questId, in if (dialogActionId == SETPRO1) { PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); switch (getNpcId()) { - case 799567: - instanceHandler.onChangeStage(StageType.START_STAGE_1_ELEVATOR); - break; - case 799568: - instanceHandler.onChangeStage(StageType.START_STAGE_2_ELEVATOR); - break; - case 799569: - instanceHandler.onChangeStage(StageType.START_STAGE_3_ELEVATOR); - break; - case 205331: - instanceHandler.onChangeStage(StageType.START_STAGE_4_ELEVATOR); - break; - case 205338: // teleport to stage 5 - instanceHandler.onChangeStage(StageType.START_STAGE_5); - break; - case 205332: - instanceHandler.onChangeStage(StageType.START_STAGE_5_ROUND_1); - break; - case 205339: // teleport to stage 6 - instanceHandler.onChangeStage(StageType.START_STAGE_6); - break; - case 205333: - instanceHandler.onChangeStage(StageType.START_STAGE_6_ROUND_1); - break; - case 205340: // teleport to stage 7 - instanceHandler.onChangeStage(StageType.START_STAGE_7); - break; - case 205334: - instanceHandler.onChangeStage(StageType.START_STAGE_7_ROUND_1); - break; - case 205341: // teleport to stage 8 - instanceHandler.onChangeStage(StageType.START_STAGE_8); - break; - case 205335: - instanceHandler.onChangeStage(StageType.START_STAGE_8_ROUND_1); - break; - case 205342: // teleport to stage 9 - instanceHandler.onChangeStage(StageType.START_STAGE_9); - break; - case 205336: - instanceHandler.onChangeStage(StageType.START_STAGE_9_ROUND_1); - break; - case 205343: // teleport to stage 9 - instanceHandler.onChangeStage(StageType.START_STAGE_10); - break; - case 205337: - instanceHandler.onChangeStage(StageType.START_STAGE_10_ROUND_1); - break; - case 205344: // get score - getPosition().getWorldMapInstance().getInstanceHandler().doReward(player); - break; + case 799567 -> instanceHandler.onChangeStage(StageType.START_STAGE_1_ELEVATOR); + case 799568 -> instanceHandler.onChangeStage(StageType.START_STAGE_2_ELEVATOR); + case 799569 -> instanceHandler.onChangeStage(StageType.START_STAGE_3_ELEVATOR); + case 205331 -> instanceHandler.onChangeStage(StageType.START_STAGE_4_ELEVATOR); + case 205338 -> instanceHandler.onChangeStage(StageType.START_STAGE_5); + case 205332 -> instanceHandler.onChangeStage(StageType.START_STAGE_5_ROUND_1); + case 205339 -> instanceHandler.onChangeStage(StageType.START_STAGE_6); + case 205333 -> instanceHandler.onChangeStage(StageType.START_STAGE_6_ROUND_1); + case 205340 -> instanceHandler.onChangeStage(StageType.START_STAGE_7); + case 205334 -> instanceHandler.onChangeStage(StageType.START_STAGE_7_ROUND_1); + case 205341 -> instanceHandler.onChangeStage(StageType.START_STAGE_8); + case 205335 -> instanceHandler.onChangeStage(StageType.START_STAGE_8_ROUND_1); + case 205342 -> instanceHandler.onChangeStage(StageType.START_STAGE_9); + case 205336 -> instanceHandler.onChangeStage(StageType.START_STAGE_9_ROUND_1); + case 205343 -> instanceHandler.onChangeStage(StageType.START_STAGE_10); + case 205337 -> instanceHandler.onChangeStage(StageType.START_STAGE_10_ROUND_1); } AIActions.deleteOwner(this); - } else if (dialogActionId == SETPRO2 && getNpcId() == 799567) { // start with stage 7 + } else if (dialogActionId == SETPRO2 && getNpcId() == 799567) { PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); instanceHandler.onChangeStage(StageType.START_STAGE_7); AIActions.deleteOwner(this); diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java index adb725b067..7e0d521d45 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java @@ -57,22 +57,10 @@ public void handleAttack(Creature creature) { hpPhases.tryEnterNextPhase(this); if (isHome.compareAndSet(true, false)) { startBloodThirstTask(); - - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - SkillEngine.getInstance().getSkill(getOwner(), 19691, 1, getTarget()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - SkillEngine.getInstance().getSkill(getOwner(), 17954, 29, getTarget()).useNoAnimationSkill(); - } - - }, 4000); - - } + ThreadPoolManager.getInstance().schedule(() -> { + SkillEngine.getInstance().getSkill(getOwner(), 19691, 1, getTarget()).useNoAnimationSkill(); + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 17954, 29, getTarget()).useNoAnimationSkill(), + 4000); }, 2000); } } @@ -86,55 +74,32 @@ public void handleHpPhase(int phaseHpPercent) { } private void startBloodThirstTask() { - eventTask = ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - SkillEngine.getInstance().getSkill(getOwner(), 19624, 10, getOwner()).useNoAnimationSkill(); - - } - }, 180 * 1000); // 3min, need confirm + eventTask = ThreadPoolManager.getInstance().schedule( + () -> SkillEngine.getInstance().getSkill(getOwner(), 19624, 10, getOwner()).useNoAnimationSkill(), 180 * 1000); // 3min, need confirm } private void startSkillTask() { - skillTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - if (isDead()) { - cancelTasks(); - } else { - SkillEngine.getInstance().getSkill(getOwner(), 17951, 29, getTarget()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - dropAggro(); - - if (getLifeStats().getHpPercentage() <= 50) { - WorldPosition p = getPosition(); - spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); - spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); - } - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - SkillEngine.getInstance().getSkill(getOwner(), 17952, 29, getTarget()).useNoAnimationSkill(); - } - - }, 2000); - } - - }, 3500); - } + skillTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTasks(); + } else { + SkillEngine.getInstance().getSkill(getOwner(), 17951, 29, getTarget()).useNoAnimationSkill(); + ThreadPoolManager.getInstance().schedule(() -> { + dropAggro(); + if (getLifeStats().getHpPercentage() <= 50) { + WorldPosition p = getPosition(); + spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); + spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); + } + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 17952, 29, getTarget()).useNoAnimationSkill(), + 2000); + }, 3500); } }, 0, 25000); } private void dropAggro() { - if (getTarget() instanceof Creature) { - Creature hated = (Creature) getTarget(); + if (getTarget() instanceof Creature hated) { if (getAggroList().isHating(hated)) { AggroInfo ai = getAggroList().getAggroInfo(hated); ai.setHate(ai.getHate() / 2); @@ -144,17 +109,13 @@ private void dropAggro() { } private void cancelTasks() { - if (eventTask != null && !eventTask.isDone()) { + if (eventTask != null && !eventTask.isDone()) eventTask.cancel(true); - } - if (skillTask != null && !skillTask.isCancelled()) { + if (skillTask != null && !skillTask.isCancelled()) skillTask.cancel(true); - } } private void despawnNpcs(List npcs) { - for (Npc npc : npcs) { - npc.getController().delete(); - } + npcs.forEach(npc -> npc.getController().delete()); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java index d72face258..a588e92b07 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java @@ -56,10 +56,8 @@ public void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 75: - SkillEngine.getInstance().getSkill(getOwner(), 19605, 10, getTargetPlayer()).useNoAnimationSkill(); - break; - case 50: + case 75 -> SkillEngine.getInstance().getSkill(getOwner(), 19605, 10, getTargetPlayer()).useNoAnimationSkill(); + case 50 -> { SkillEngine.getInstance().getSkill(getOwner(), 19606, 10, getTarget()).useNoAnimationSkill(); ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) { @@ -72,21 +70,20 @@ public void handleHpPhase(int phaseHpPercent) { }, 4500); } }, 3000); - break; - case 25: + } + case 25 -> { SkillEngine.getInstance().getSkill(getOwner(), 19606, 10, getTarget()).useNoAnimationSkill(); scheduleSkill(3000); scheduleSkill(9000); scheduleSkill(15000); - break; + } } } private void scheduleSkill(int delay) { ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) { + if (!isDead()) SkillEngine.getInstance().getSkill(getOwner(), 19605, 10, getTargetPlayer()).useNoAnimationSkill(); - } }, delay); } @@ -106,8 +103,7 @@ private void despawnNpcs() { } private void despawnNpc(Npc npc) { - if (npc != null) { + if (npc != null) npc.getController().delete(); - } } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java index 44b3e96dcf..e21b989140 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java @@ -56,24 +56,14 @@ public void handleHpPhase(int phaseHpPercent) { private void startEvent() { SkillEngine.getInstance().getSkill(getOwner(), 19610, 10, getOwner()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - SkillEngine.getInstance().getSkill(getOwner(), 19614, 10, getOwner()).useNoAnimationSkill(); - - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - WorldPosition p = getPosition(); - applySoulSickness((Npc) spawn(282366, p.getX(), p.getY(), p.getZ(), p.getHeading())); - applySoulSickness((Npc) spawn(282367, p.getX(), p.getY(), p.getZ(), p.getHeading())); - applySoulSickness((Npc) spawn(282368, p.getX(), p.getY(), p.getZ(), p.getHeading())); - } - }, 5000); - } - + ThreadPoolManager.getInstance().schedule(() -> { + SkillEngine.getInstance().getSkill(getOwner(), 19614, 10, getOwner()).useNoAnimationSkill(); + ThreadPoolManager.getInstance().schedule(() -> { + WorldPosition p = getPosition(); + applySoulSickness((Npc) spawn(282366, p.getX(), p.getY(), p.getZ(), p.getHeading())); + applySoulSickness((Npc) spawn(282367, p.getX(), p.getY(), p.getZ(), p.getHeading())); + applySoulSickness((Npc) spawn(282368, p.getX(), p.getY(), p.getZ(), p.getHeading())); + }, 5000); }, 2000); } @@ -88,14 +78,9 @@ private Player getTargetPlayer() { } private void applySoulSickness(final Npc npc) { - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - npc.getLifeStats().setCurrentHpPercent(50); // TODO: remove this, fix max hp debuffs not reducing current hp properly - SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(); - } - + ThreadPoolManager.getInstance().schedule(() -> { + npc.getLifeStats().setCurrentHpPercent(50); // TODO: remove this, fix max hp debuffs not reducing current hp properly + SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(); }, 1000); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java index 21b9c64170..e557ce8b57 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java @@ -53,29 +53,26 @@ public void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { SkillEngine.getInstance().getSkill(getOwner(), 17899, 41, getTarget()).useNoAnimationSkill(); - switch (phaseHpPercent) { - case 75: + case 75 -> { scheduleSkill(17900, 4500); PacketSendUtility.broadcastMessage(getOwner(), 340487, 10000); scheduleSkill(17899, 14000); scheduleSkill(17900, 18000); - break; - case 50: + } + case 50 -> { scheduleSkill(17280, 4500); scheduleSkill(17902, 8000); - break; - case 25: - task = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { - if (isDead()) { - cancelTask(); - } else { - SkillEngine.getInstance().getSkill(getOwner(), 17901, 41, getTarget()).useNoAnimationSkill(); - scheduleSkill(17902, 5500); - scheduleSkill(17902, 7500); - } - }, 4500, 20000); - break; + } + case 25 -> task = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTask(); + } else { + SkillEngine.getInstance().getSkill(getOwner(), 17901, 41, getTarget()).useNoAnimationSkill(); + scheduleSkill(17902, 5500); + scheduleSkill(17902, 7500); + } + }, 4500, 20000); } } @@ -86,9 +83,8 @@ private void cancelTask() { private void scheduleSkill(final int skill, int delay) { ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) { + if (!isDead()) SkillEngine.getInstance().getSkill(getOwner(), skill, 41, getTarget()).useNoAnimationSkill(); - } }, delay); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java index 996c389f1c..39f58d2789 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java @@ -59,88 +59,64 @@ public void handleBackHome() { @Override public void handleAttack(Creature creature) { super.handleAttack(creature); - if (isHome.compareAndSet(true, false)) { + if (isHome.compareAndSet(true, false)) startSkillTask1(); - } - if (getLifeStats().getHpPercentage() <= 75) { - if (isEventStarted.compareAndSet(false, true)) { + if (getLifeStats().getHpPercentage() <= 75) + if (isEventStarted.compareAndSet(false, true)) startSkillTask2(); - } - } } private void cancelTask() { - if (task1 != null && !task1.isCancelled()) { + if (task1 != null && !task1.isCancelled()) task1.cancel(true); - } - if (task2 != null && !task2.isCancelled()) { + if (task2 != null && !task2.isCancelled()) task2.cancel(true); - } } private void startSkillTask1() { - task1 = ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - if (isDead()) { - cancelTask(); - } else { - if (getOwner().getCastingSkill() != null) - return; - if (getLifeStats().getHpPercentage() <= 50) { - switch (Rnd.nextInt(2)) { - case 0: - SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); - break; - default: - final Player target = getTargetPlayer(); - SkillEngine.getInstance().getSkill(getOwner(), 19552, 10, target).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - if (!isDead()) { - SkillEngine.getInstance().getSkill(getOwner(), 19553, 10, target).useNoAnimationSkill(); - } - } - }, 4000); + task1 = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTask(); + } else { + if (getOwner().getCastingSkill() != null) + return; + if (getLifeStats().getHpPercentage() <= 50) + switch (Rnd.nextInt(2)) { + case 0 -> SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); + default -> { + final Player target = getTargetPlayer(); + SkillEngine.getInstance().getSkill(getOwner(), 19552, 10, target).useNoAnimationSkill(); + ThreadPoolManager.getInstance().schedule(() -> { + if (!isDead()) + SkillEngine.getInstance().getSkill(getOwner(), 19553, 10, target).useNoAnimationSkill(); + }, 4000); } - } else - SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); - } + } + else + SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); } }, 10000, 23000); } private void startSkillTask2() { - task2 = ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - if (isDead()) { - cancelTask(); - } else { - getOwner().getController().cancelCurrentSkill(null); - PacketSendUtility.broadcastMessage(getOwner(), 1500230); - SkillEngine.getInstance().getSkill(getOwner(), 19551, 10, getTarget()).useNoAnimationSkill(); - spawnSparks(); - } + task2 = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTask(); + } else { + getOwner().getController().cancelCurrentSkill(null); + PacketSendUtility.broadcastMessage(getOwner(), 1500230); + SkillEngine.getInstance().getSkill(getOwner(), 19551, 10, getTarget()).useNoAnimationSkill(); + spawnSparks(); } }, 0, 60000); } private void spawnSparks() { - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - if (!isDead()) { - int count = Rnd.get(8, 12); - for (int i = 0; i < count; i++) { - rndSpawnInRange(282373, 3, 12); - } - } + ThreadPoolManager.getInstance().schedule(() -> { + if (!isDead()) { + int count = Rnd.get(8, 12); + for (int i = 0; i < count; i++) + rndSpawnInRange(282373, 3, 12); } }, 4000); } @@ -148,9 +124,8 @@ public void run() { private Player getTargetPlayer() { List players = new ArrayList<>(); getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 37)) { + if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 37)) players.add(player); - } }); return Rnd.get(players); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java index 45fc050f4c..35bf661800 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java @@ -37,16 +37,15 @@ private void resurrectAllies() { getKnownList().forEachNpc(npc -> { if (npc.isDead()) return; - switch (npc.getNpcId()) { - case 205413: + case 205413 -> { spawn(217576, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); - break; - case 205414: + } + case 205414 -> { spawn(217577, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); - break; + } } }); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java index 8889092190..0f43ad10ca 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java @@ -27,28 +27,15 @@ protected void handleSpawned() { } private void startEventTask() { - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - if (!isDead()) { - PacketSendUtility.broadcastMessage(getOwner(), 341444); - SkillEngine.getInstance().getSkill(getOwner(), 17914, 34, getOwner()).useNoAnimationSkill(); - } - } - + ThreadPoolManager.getInstance().schedule(() -> { + if (!isDead()) + PacketSendUtility.broadcastMessage(getOwner(), 341444); + SkillEngine.getInstance().getSkill(getOwner(), 17914, 34, getOwner()).useNoAnimationSkill(); }, 500); } private void startLifeTask() { - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - AIActions.deleteOwner(StrangeCreatureAI.this); - } - - }, 6500); + ThreadPoolManager.getInstance().schedule(() -> AIActions.deleteOwner(StrangeCreatureAI.this), 6500); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java index 81cf6b17e4..2df67ad018 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java @@ -21,14 +21,10 @@ public TakunGojiraAI(Npc owner) { @Override public void handleSpawned() { super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - counterpart = getPosition().getWorldMapInstance().getNpc(getNpcId() == 217596 ? 217597 : 217596); - if (counterpart != null) - getAggroList().addHate(counterpart, 1000000); - } + ThreadPoolManager.getInstance().schedule(() -> { + counterpart = getPosition().getWorldMapInstance().getNpc(getNpcId() == 217596 ? 217597 : 217596); + if (counterpart != null) + getAggroList().addHate(counterpart, 1000000); }, 500); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java index d0bb613b29..dc1a63c5d0 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java @@ -52,55 +52,40 @@ public void handleBackHome() { @Override public void handleAttack(Creature creature) { - super.handleAttack(creature); - if (isHome.compareAndSet(true, false)) { + if (isHome.compareAndSet(true, false)) startSkillTask(); - } } private void startSkillTask() { - task = ThreadPoolManager.getInstance().scheduleAtFixedRate(new Runnable() { - - @Override - public void run() { - if (isDead()) { - cancelTask(); - } else { - startSkillEvent(); - } + task = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTask(); + } else { + startSkillEvent(); } - }, 30000, 30000); } private void cancelTask() { - if (task != null && !task.isCancelled()) { + if (task != null && !task.isCancelled()) task.cancel(true); - } } private void startSkillEvent() { PacketSendUtility.broadcastMessage(getOwner(), 1500207); SkillEngine.getInstance().getSkill(getOwner(), 19595, 10, getTargetPlayer()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(new Runnable() { - - @Override - public void run() { - if (!isDead()) { - SkillEngine.getInstance().getSkill(getOwner(), 19596, 15, getOwner()).useNoAnimationSkill(); - } - } - + ThreadPoolManager.getInstance().schedule(() -> { + if (!isDead()) + SkillEngine.getInstance().getSkill(getOwner(), 19596, 15, getOwner()).useNoAnimationSkill(); }, 6000); } private Player getTargetPlayer() { List players = new ArrayList<>(); getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 15)) { + if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 15)) players.add(player); - } }); return Rnd.get(players); } diff --git a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java index 604db139dc..8e01607184 100644 --- a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java +++ b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; +import java.util.stream.IntStream; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.instance.handlers.InstanceID; @@ -27,7 +28,7 @@ import com.aionemu.gameserver.world.WorldMapInstance; /** - * @author xTz, Luzien + * @author xTz, Luzien, w4terbomb */ @InstanceID(300300000) public class EmpyreanCrucibleInstance extends CrucibleInstance { @@ -49,14 +50,8 @@ private EmpyreanStage(List npcs) { this.stageNpcs = npcs; } - private boolean containsNpcs() { - for (Npc npc : instance.getNpcs()) { - for (Npc stageNpc : stageNpcs) { - if (npc.equals(stageNpc)) - return true; - } - } - return false; + public boolean containsNpcs() { + return instance.getNpcs().stream().anyMatch(npc -> stageNpcs.stream().anyMatch(npc::equals)); } } @@ -72,11 +67,11 @@ public void onInstanceCreate() { @Override public void onEnterInstance(Player player) { boolean isNew = !instanceScore.containsPlayer(player.getObjectId()); - super.onEnterInstance(player); // creates player reward + super.onEnterInstance(player); if (stage > 0) { CruciblePlayerReward playerReward = getPlayerReward(player.getObjectId()); if (isNew) { - moveToReadyRoom(player); // send player to team and wait for end of the stage + moveToReadyRoom(player); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_ENTERED_BIRTHAREA_IDARENA()); } else if (playerReward.isPlayerLeave()) { leaveInstance(player); @@ -95,15 +90,14 @@ private void addPointsAndSendPacket(int points, Npc npc) { if (player.isOnline()) { CruciblePlayerReward playerReward = getPlayerReward(player.getObjectId()); PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_MSG_GET_SCORE(npc.getObjectTemplate().getL10n(), points)); - if (!playerReward.isRewarded()) { + if (!playerReward.isRewarded()) playerReward.addPoints(points); - } PacketSendUtility.sendPacket(player, new SM_INSTANCE_SCORE(instance.getMapId(), new CrucibleScoreWriter(instanceScore))); } }); } - private void setStage(StageType type, final int time) { + private void setStage(StageType type, int time) { this.stageType = type; ThreadPoolManager.getInstance().schedule( () -> instance.forEachPlayer(player -> PacketSendUtility.sendPacket(player, new SM_INSTANCE_STAGE_INFO(2, type.getId(), type.getType()))), @@ -116,208 +110,85 @@ public void onDie(Npc npc) { npcs.remove(npc); } EmpyreanStage es = getEmpyreanStage(npc); - int point = 0; - switch (npc.getNpcId()) { - case 217511: - case 217512: - case 217513: - case 217514: - point += 55; - break; - case 217518: - point += 110; - break; - case 217515: - case 217516: - case 217517: - point += 120; - break; - case 217522: - point += 250; - break; - case 217560: - case 217561: - point += 260; - break; - case 217557: - case 217559: - case 217558: - point += 280; - break; - case 217519: - case 217520: - case 217521: - case 217504: - case 217507: - case 217508: - case 217547: - case 217548: - case 217549: - case 217550: - case 217545: - case 217569: - point += 300; - break; - case 217565: - point += 350; - break; - case 217562: - point += 360; - break; - case 217502: - case 217505: - case 217563: - case 217566: - point += 400; - break; - case 217654: - point += 455; - break; - case 217523: - case 217524: - case 217525: - case 217526: - point += 475; - break; - case 217568: - point += 480; - break; - case 217503: - case 217489: - case 217653: - point += 500; - break; - case 217486: - case 217564: - point += 600; - break; - case 217652: - point += 685; - break; - case 217570: - point += 700; - break; - case 217492: - point += 1100; - break; - case 217487: - point += 1200; - break; - case 217491: - point += 1300; - break; - case 217509: - point += 1500; - break; - case 217552: - point += 1900; - break; - case 217553: - point += 2000; - break; - case 217567: - point += 2100; - break; - case 217554: - point += 2400; - break; - case 217578: - case 217582: - point += 2900; - break; - case 217579: - case 217583: - point += 3100; - break; - case 217527: - case 217528: - point += 3250; - break; - case 217572: - point += 3370; - break; - case 217585: - point += 3400; - break; - case 217580: - case 217584: - point += 3800; - break; - case 217588: - point += 4000; - break; - case 217590: - point += 4200; - break; - case 217597: // TODO: confirm - case 217596: - point += 4250; - break; - case 217493: - point += 5000; - break; - case 217510: - case 217501: - point += 5500; - break; - case 217591: - point += 6000; - break; - case 217594: - point += 6200; - break; - case 217595: - point += 7300; - break; - case 217556: - point += 7800; - break; - case 217573: - point += 8900; - break; - case 217587: - point += 11500; - break; - case 217593: - point += 17000; - break; - } - + int point = switch (npc.getNpcId()) { + case 217511, 217512, 217513, 217514 -> 55; + case 217515, 217516, 217517, 217518 -> 110; + case 217520, 217522, 217567 -> 210; + case 217560, 217561 -> 260; + case 217557, 217558, 217559 -> 280; + case 217504, 217507, 217508, 217569, 217545, 217547, 217548, 217549, 217550 -> 300; + case 217502, 217505, 217506 -> 400; + case 217568 -> 480; + case 217519, 217521, 217523, 217524, 217525, 217526 -> 475; + case 217652, 217653 -> 590; + case 205396, 217477, 205405, 217486 -> 600; + case 217651 -> 695; + case 205399, 217480, 205408, 217489, 217503, 217529, 217484, 217493 -> 500; + case 205402, 205411, 217483, 217492 -> 1100; + case 205397, 205406, 217478, 217487 -> 1200; + case 205401, 205410, 217482, 217491 -> 1300; + case 217500, 217509, 217531, 217532, 217533, 217534, 217535, 217536, 217570, 217600, 217601, 217602 -> 1000; + case 217530 -> 1000; + case 217603, 217604, 217605, 217606 -> 2100; + case 217578 -> 2900; + case 217579 -> 3100; + case 217581 -> 3400; + case 217572 -> 3370; + case 217527, 217528 -> 3250; + case 217580 -> 3800; + case 217588, 217589 -> 4000; + case 217596, 217597 -> 4250; + case 217590 -> 4200; + case 217591 -> 5000; + case 217501, 217510 -> 5500; + case 217582, 217583, 217584, 217585, 217587 -> 4800; + case 217592 -> 6000; + case 217594 -> 6200; + case 217595 -> 7300; + case 217553, 217554, 217555 -> 2000; + case 217552 -> 1900; + case 217543, 217544 -> 2500; + case 217556 -> 7800; + case 217573 -> 8900; + case 217598 -> 9400; + case 217586 -> 12000; + case 217593 -> 17000; + case 217607 -> 17800; + case 217599 -> 25900; + case 217608 -> 192500; + case 217609 -> 204400; + default -> 0; + }; if (point != 0) { addPointsAndSendPacket(point, npc); } switch (npc.getNpcId()) { - case 217486: + case 205396, 205405, 217477, 217486, 205399, 205408, 217480, 217489 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_1 && getNpc(217489) == null) { + if (stageType == StageType.START_STAGE_1_ROUND_1 && IntStream.of(205396, 205405, 217477, 217486, 205399, 205408, 217480, 217489).allMatch( + i -> getNpcs(i).isEmpty())) { startStage1Round2(); } - break; - case 217489: - npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_1 && getNpc(217486) == null) { - startStage1Round2(); - } - break; - case 217492: + } + case 217483, 217492 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_2) { + if (stageType == StageType.START_STAGE_1_ROUND_2 && IntStream.of(217483, 217492).allMatch(i -> getNpcs(i).isEmpty())) { startStage1Round3(); } - break; - case 217487: + } + case 217478, 217487 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_3) { + if (stageType == StageType.START_STAGE_1_ROUND_3 && IntStream.of(217478, 217487).allMatch(i -> getNpcs(i).isEmpty())) { startStage1Round4(); } - break; - case 217491: + } + case 217482, 217491 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_4) { + if (stageType == StageType.START_STAGE_1_ROUND_4 && IntStream.of(217482, 217491).allMatch(i -> getNpcs(i).isEmpty())) { startStage1Round5(); } - break; - case 217493: + } + case 217484, 217493 -> { setStage(StageType.PASS_GROUP_STAGE_1, 0); sp(217756, 342.65106f, 357.4013f, 96.09094f, (byte) 0); sp(217756, 349.07376f, 357.5898f, 96.090965f, (byte) 0); @@ -327,100 +198,89 @@ public void onDie(Npc npc) { sp(217756, 345.69318f, 355.56677f, 96.09094f, (byte) 0); sp(799568, 345.25f, 349.24f, 96.09097f, (byte) 0); npc.getController().delete(); - break; - case 217502: + sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_COMPLETE_ROUND_IDARENA()); + } + case 217502 -> { npc.getController().delete(); switch (stageType) { - case START_STAGE_2_ROUND_1: - if (getNpc(217503) == null && getNpc(217504) == null) { + case START_STAGE_2_ROUND_1 -> { + if (IntStream.of(217503, 217504).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round2(); - } - break; - case START_STAGE_2_ROUND_2: - if (getNpc(217508) == null && getNpc(217507) == null && getNpc(217504) == null) { + } + case START_STAGE_2_ROUND_2 -> { + if (IntStream.of(217508, 217507, 217504).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round3(); - } - break; + } } - break; - case 217503: + } + case 217503 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_2_ROUND_1 && getNpc(217502) == null && getNpc(217504) == null) { + if (stageType == StageType.START_STAGE_2_ROUND_1 && IntStream.of(217502, 217504).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round2(); - } - break; - case 217504: + } + case 217504 -> { npc.getController().delete(); switch (stageType) { - case START_STAGE_2_ROUND_1: - if (getNpc(217502) == null && getNpc(217503) == null) { + case START_STAGE_2_ROUND_1 -> { + if (IntStream.of(217502, 217503).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round2(); - } - break; - case START_STAGE_2_ROUND_2: - if (getNpc(217502) == null && getNpc(217507) == null && getNpc(217508) == null) { + } + case START_STAGE_2_ROUND_2 -> { + if (IntStream.of(217502, 217507, 217508).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round3(); - } - break; + } } - break; - case 217507: + } + case 217507 -> { npc.getController().delete(); switch (stageType) { - case START_STAGE_2_ROUND_2: - if (getNpc(217502) == null && getNpc(217504) == null && getNpc(217508) == null) { + case START_STAGE_2_ROUND_2 -> { + if (IntStream.of(217502, 217504, 217508).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round3(); - } - break; + } } if (es != null && !es.containsNpcs()) { startStage2Round5(); } - break; - case 217508: + } + case 217508 -> { npc.getController().delete(); if (es != null) { return; } switch (stageType) { - case START_STAGE_2_ROUND_2: - if (getNpc(217502) == null && getNpc(217504) == null && getNpc(217507) == null) { + case START_STAGE_2_ROUND_2 -> { + if (IntStream.of(217502, 217504, 217507).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round3(); - } - break; - case START_STAGE_2_ROUND_4: - if (getNpc(217505) == null) { + } + case START_STAGE_2_ROUND_4 -> { + if (getNpc(217505) == null) startStage4Round4_1(); - } - break; + } } - break; - case 217509: + } + case 217500, 217509 -> { npc.getController().delete(); setStage(StageType.START_STAGE_2_ROUND_4, 2000); sp(217505, 341.95056f, 334.77692f, 96.09093f, (byte) 0, 6000); sp(217508, 344.17813f, 334.42462f, 96.090935f, (byte) 0, 6000); - break; - case 217505: + } + case 217505 -> { npc.getController().delete(); - if (getNpc(217508) == null) { + if (getNpc(217508) == null) startStage4Round4_1(); - } - break; - case 217506: + } + case 217506 -> { npc.getController().delete(); - if (es != null && !es.containsNpcs()) { + if (es != null && !es.containsNpcs()) startStage2Round5(); - } - break; - case 217510: - case 217501: + } + case 217510, 217501 -> { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_2, 0); ThreadPoolManager.getInstance().schedule(() -> { sp(217737, 334.49496f, 349.2322f, 96.090935f, (byte) 0); setStage(StageType.START_BONUS_STAGE_2, 0); - ThreadPoolManager.getInstance().schedule(() -> { if (getNpc(217737) != null) { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S2_Saam1_01()); @@ -433,17 +293,14 @@ public void onDie(Npc npc) { } }, 30000); }, 8000); - break; - case 217737: + } + case 217737 -> { npc.getController().delete(); sp(799569, 345.25f, 349.24f, 96.09097f, (byte) 0); - break; - case 217511: - case 217512: - case 217513: - case 217514: + } + case 217511, 217512, 217513, 217514 -> { npc.getController().delete(); - if (getNpcs(217511).isEmpty() && getNpcs(217512).isEmpty() && getNpcs(217513).isEmpty() && getNpcs(217514).isEmpty()) { + if (IntStream.of(217511, 217512, 217513, 217514).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_2, 2000); sp(217515, 336.32092f, 345.0251f, 96.090935f, (byte) 0, 6000); sp(217516, 347.16144f, 361.89084f, 96.09093f, (byte) 0, 6000); @@ -458,13 +315,10 @@ public void onDie(Npc npc) { sp(217516, 334.60898f, 352.01447f, 96.09095f, (byte) 0, 6000); sp(217515, 348.87338f, 354.90146f, 96.09096f, (byte) 0, 6000); } - break; - case 217515: - case 217516: - case 217517: - case 217518: + } + case 217515, 217516, 217517, 217518 -> { npc.getController().delete(); - if (getNpcs(217515).isEmpty() && getNpcs(217516).isEmpty() && getNpcs(217517).isEmpty() && getNpcs(217518).isEmpty()) { + if (IntStream.of(217515, 217516, 217517, 217518).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_3, 2000); sp(217519, 351.08026f, 341.61298f, 96.090935f, (byte) 0, 6000); sp(217521, 333.4532f, 354.7357f, 96.09094f, (byte) 0, 6000); @@ -473,63 +327,53 @@ public void onDie(Npc npc) { sp(217522, 350.34537f, 356.18558f, 96.09094f, (byte) 0, 6000); sp(217520, 343.7485f, 336.2869f, 96.09092f, (byte) 0, 6000); } - break; - case 217519: - case 217520: - case 217521: - case 217522: + } + case 217519, 217520, 217521, 217522 -> { npc.getController().delete(); - if (getNpcs(217519).isEmpty() && getNpcs(217520).isEmpty() && getNpcs(217521).isEmpty() && getNpcs(217522).isEmpty()) { + if (IntStream.of(217519, 217520, 217521, 217522).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_4, 2000); sp(217524, 349.66446f, 341.4752f, 96.090965f, (byte) 0, 6000); sp(217525, 338.32742f, 356.29636f, 96.090935f, (byte) 0, 6000); sp(217526, 349.31473f, 358.43762f, 96.09096f, (byte) 0, 6000); sp(217523, 338.73138f, 342.35876f, 96.09094f, (byte) 0, 6000); } - break; - case 217523: - case 217524: - case 217525: - case 217526: + } + case 217523, 217524, 217525, 217526 -> { npc.getController().delete(); - if (getNpcs(217523).isEmpty() && getNpcs(217524).isEmpty() && getNpcs(217525).isEmpty() && getNpcs(217526).isEmpty()) { + if (IntStream.of(217523, 217524, 217525, 217526).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_5, 2000); sp(217527, 335.37524f, 346.34567f, 96.09094f, (byte) 0, 6000); sp(217528, 335.36105f, 353.16922f, 96.09094f, (byte) 0, 6000); } - break; - case 217527: - case 217528: + } + case 217527, 217528 -> { npc.getController().delete(); - if (getNpcs(217527).isEmpty() && getNpcs(217528).isEmpty()) { + if (IntStream.of(217527, 217528).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_BONUS_STAGE_3, 7000); sp(217744, 342.45215f, 349.339f, 96.09096f, (byte) 0, 7000); ThreadPoolManager.getInstance().schedule(this::startBonusStage3, 39000); } - break; - case 217557: - case 217559: - case 217562: + } + case 217557, 217559, 217562 -> { npc.getController().delete(); switch (stageType) { - case START_STAGE_4_ROUND_1: - if (getNpcs(217557).isEmpty() && getNpcs(217559).isEmpty()) { + case START_STAGE_4_ROUND_1 -> { + if (IntStream.of(217557, 217559, 217562).allMatch(id -> getNpcs(id).isEmpty())) { sp(217558, 330.27792f, 339.2779f, 96.09093f, (byte) 6); sp(217558, 328.08972f, 346.3553f, 96.090904f, (byte) 1); } - break; - case START_STAGE_4_ROUND_2: + } + case START_STAGE_4_ROUND_2 -> { if (es != null && !es.containsNpcs()) { startStage4Round3(); } - break; + } } - break; - case 217558: - case 217561: + } + case 217558, 217561 -> { npc.getController().delete(); switch (stageType) { - case START_STAGE_4_ROUND_1: + case START_STAGE_4_ROUND_1 -> { if (getNpcs(217558).isEmpty()) { setStage(StageType.START_STAGE_4_ROUND_2, 2000); sp(217559, 330.53665f, 349.23523f, 96.09093f, (byte) 0, 6000); @@ -543,36 +387,22 @@ public void onDie(Npc npc) { empyreanStage.add(new EmpyreanStage(round)); }, 47000); } - break; - case START_STAGE_4_ROUND_2: - if (es != null && !es.containsNpcs()) { + } + case START_STAGE_4_ROUND_2 -> { + if (es != null && !es.containsNpcs()) startStage4Round3(); - } - break; + } } - break; - case 217563: - case 217566: + } + case 217563, 217566 -> { npc.getController().delete(); if (es != null && !es.containsNpcs()) { setStage(StageType.START_STAGE_4_ROUND_4, 2000); sp(217567, 345.73895f, 349.49786f, 96.09097f, (byte) 0, 6000); } - break; - case 217564: - case 217565: - case 217560: - case 217745: - case 217746: - case 217747: - case 217748: - case 205413: - case 205414: - case 217576: - case 217577: - npc.getController().delete(); - break; - case 217567: + } + case 217564, 217565, 217560, 217745, 217746, 217747, 217748, 205413, 205414, 217576, 217577 -> npc.getController().delete(); + case 217567 -> { npc.getController().delete(); setStage(StageType.START_STAGE_4_ROUND_5, 2000); sp(217653, 327.76917f, 349.26215f, 96.09092f, (byte) 0, 6000); @@ -589,43 +419,38 @@ public void onDie(Npc npc) { sp(217653, 331.53894f, 339.8832f, 96.09091f, (byte) 10); isDoneStage4 = true; }, 174000); - break; - case 217651: - case 217652: - case 217653: + } + case 217651, 217652, 217653 -> { npc.getController().delete(); - if (isDoneStage4 && getNpcs(217651).isEmpty() && getNpcs(217652).isEmpty() && getNpcs(217653).isEmpty()) { + if (isDoneStage4 && IntStream.of(217651, 217652, 217653).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.PASS_GROUP_STAGE_4, 0); sp(217749, 340.59f, 349.32166f, 96.09096f, (byte) 0, 6000); setStage(StageType.START_BONUS_STAGE_4, 6000); ThreadPoolManager.getInstance().schedule(this::startBonusStage4, 33000); } - break; - case 217547: - case 217548: - case 217549: + } + case 217547, 217548, 217549 -> { npc.getController().delete(); - if (getNpcs(217547).isEmpty() && getNpcs(217548).isEmpty() && getNpcs(217549).isEmpty()) { + if (IntStream.of(217547, 217548, 217549).allMatch(i -> getNpcs(i).isEmpty())) { sp(217550, 1266.293f, 778.3254f, 358.60574f, (byte) 30, 4000); sp(217545, 1254.261f, 778.3817f, 358.6056f, (byte) 30, 4000); } - break; - case 217550: - case 217545: + } + case 217545, 217550 -> { npc.getController().delete(); - if (getNpcs(217550).isEmpty() && getNpcs(217545).isEmpty()) { + if (IntStream.of(217545, 217550).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_5_ROUND_2, 2000); sp(217552, 1246.0197f, 788.8341f, 358.60556f, (byte) 11, 6000); } - break; - case 217552: + } + case 217552 -> { npc.getController().delete(); setStage(StageType.START_STAGE_5_ROUND_3, 2000); sp(700527, 1253.3123f, 789.38385f, 358.60562f, (byte) 119); sp(700528, 1260.2015f, 800.14886f, 358.6056f, (byte) 16); sp(217553, 1259.4706f, 812.30505f, 358.6056f, (byte) 30, 6000); - break; - case 217553: + } + case 217553 -> { npc.getController().delete(); deleteAliveNpcs(700527, 700528); sp(281111, 1246.4855f, 796.90735f, 358.6056f, (byte) 0); @@ -638,8 +463,8 @@ public void onDie(Npc npc) { sp(281114, 1244.3293f, 780.4284f, 358.60562f, (byte) 0); setStage(StageType.START_STAGE_5_ROUND_4, 2000); sp(217554, 1243.1877f, 796.79553f, 358.6056f, (byte) 0, 6000); - break; - case 217554: + } + case 217554 -> { npc.getController().delete(); deleteAliveNpcs(281108, 281109, 281110, 281111, 281112, 281113, 281114, 281322); setStage(StageType.START_STAGE_5_ROUND_5, 2000); @@ -648,14 +473,14 @@ public void onDie(Npc npc) { sp(281192, 1267.6f, 793.9f, 358.7f, (byte) 0, 6000); sp(281193, 1257.4f, 787.9f, 358.7f, (byte) 0, 6000); sp(281194, 1251.3f, 798.6f, 358.7f, (byte) 0, 6000); - break; - case 217556: + } + case 217556 -> { npc.getController().delete(); deleteAliveNpcs(281191, 281192, 281193, 281194); setStage(StageType.PASS_GROUP_STAGE_5, 0); sp(205339, 1260.1465f, 795.07495f, 358.60562f, (byte) 30); - break; - case 217568: + } + case 217568 -> { sp(205413, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); if (isDoneStage6Round1 && getNpcs(217568).isEmpty()) { @@ -669,109 +494,152 @@ public void onDie(Npc npc) { isDoneStage6Round2 = true; }, 12000); } - break; - case 217570: + } + case 217570 -> { for (int i = 0; i < 5; i++) sp(211984, npc.getX() + Rnd.get(-2, 2), npc.getY() + Rnd.get(-2, 2), npc.getZ(), npc.getHeading()); - break; - case 217569: + } + case 217569 -> { sp(205414, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); - if (stageType == StageType.START_STAGE_6_ROUND_2 && isDoneStage6Round2 && getNpcs(217569).isEmpty() && getNpcs(217570).isEmpty()) { + if (stageType == StageType.START_STAGE_6_ROUND_2 && isDoneStage6Round2 && IntStream.of(217569, 217570).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_6_ROUND_3, 2000); sp(217572, 1629.5837f, 138.38435f, 126f, (byte) 30, 9000); sp(217569, 1635.01535f, 150.01535f, 126f, (byte) 45, 6000); sp(217569, 1638.3817f, 152.84074f, 126f, (byte) 45, 6000); } - break; - case 217572: + } + case 217572 -> { npc.getController().delete(); - sp(217573, 1634.7891f, 141.99077f, 126f, (byte) 0); setStage(StageType.START_STAGE_6_ROUND_4, 2000); - break; - case 217573: + sp(217573, 1634.7891f, 141.99077f, 126f, (byte) 0); + } + case 217573 -> { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_6, 0); - // sendMsg(1400977); - // TODO: 2 boxes ready room! sp(217750, 1624.1908f, 155.16148f, 126f, (byte) 0, 8000); setStage(StageType.START_BONUS_STAGE_6, 8000); - break; - case 217750: - sp(205340, 1625.08f, 159.15f, 126f, (byte) 0); - break; - case 217582: - case 217578: + } + case 217750 -> sp(205340, 1625.08f, 159.15f, 126f, (byte) 0); + case 217582, 217578 -> { setStage(StageType.START_STAGE_7_ROUND_2, 2000); sp(217579, 1794.81f, 779.53925f, 469.35016f, (byte) 40, 6000); - // sp(217583, 1794.81f, 779.53925f, 469.35016f, (byte) 40, 6000); - break; - case 217579: - case 217583: + } + case 217579, 217583 -> { setStage(StageType.START_STAGE_7_ROUND_3, 2000); - sp(217580, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); - // sp(217584, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); - break; - case 217580: - case 217584: + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> sp(217580, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); + case ELYOS -> sp(217584, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); + } + } + case 217580, 217584 -> { setStage(StageType.START_STAGE_7_ROUND_4, 2000); - sp(217581, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); - // sp(217585, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); - break; - case 217581: - case 217585: + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> sp(217581, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); + case ELYOS -> sp(217585, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); + } + } + case 217581, 217585 -> { setStage(StageType.START_STAGE_7_ROUND_5, 2000); - sp(217586, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); - // sp(217587, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); - break; - case 217586: - case 217587: + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> sp(217586, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); + case ELYOS -> sp(217587, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); + } + } + case 217586, 217587 -> { setStage(StageType.PASS_GROUP_STAGE_7, 0); sp(217753, 1782.881f, 800.114f, 469.420f, (byte) 0, 2000); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S7_BookBox_01()); sp(205341, 1781.610f, 796.920f, 469.350f, (byte) 0, 2000); - break; - case 217588: + } + case 217588, 217589 -> { setStage(StageType.START_STAGE_8_ROUND_2, 2000); sp(217590, 1764.377f, 1761.510f, 303.695f, (byte) 0, 6000); - break; - case 217590: + } + case 217590 -> { setStage(StageType.START_STAGE_8_ROUND_3, 2000); sp(217591, 1776.946f, 1749.255f, 303.696f, (byte) 30, 6000); - break; - case 217591: + } + case 217591 -> { setStage(StageType.START_STAGE_8_ROUND_4, 2000); sp(217592, 1790.693f, 1761.911f, 303.877f, (byte) 60, 6000); - break; - case 217592: + } + case 217592 -> { setStage(StageType.START_STAGE_8_ROUND_5, 2000); sp(280790, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); sp(217593, 1777.065f, 1763.706f, 303.695f, (byte) 90, 6000); - break; - case 217593: + } + case 217593 -> { setStage(StageType.PASS_GROUP_STAGE_8, 0); sp(205342, 1776.757f, 1764.624f, 303.695f, (byte) 90); - break; - case 217594: + } + case 217594 -> { setStage(StageType.START_STAGE_9_ROUND_2, 2000); sp(217595, 1322.311f, 1741.508f, 316.349f, (byte) 65, 6000); - break; - case 217595: + } + case 217595 -> { setStage(StageType.START_STAGE_9_ROUND_3, 2000); sp(217596, 1308.038f, 1729.718f, 315.996f, (byte) 36, 6000); sp(217597, 1302.290f, 1745.471f, 316.092f, (byte) 96, 6000); - break; - case 217596: - case 217597: + } + case 217596, 217597 -> { Npc counterpart = getNpc(npc.getNpcId() == 217596 ? 217597 : 217596); - if (counterpart != null && !counterpart.isDead()) { + if (counterpart != null && !counterpart.isDead()) SkillEngine.getInstance().getSkill(counterpart, 19624, 10, counterpart).useNoAnimationSkill(); + npc.getController().delete(); + if (IntStream.of(217596, 217597).allMatch(i -> getNpcs(i).isEmpty())) { + setStage(StageType.START_STAGE_9_ROUND_4, 2000); + sp(217598, 1311.5238f, 1755.2079f, 317.1f, (byte) 97, 2000); + } + } + case 217598 -> { + npc.getController().delete(); + setStage(StageType.START_STAGE_9_ROUND_5, 2000); + sp(217599, 1304.2659f, 1722.2467f, 316.5f, (byte) 23, 2000); + } + case 217599 -> { + npc.getController().delete(); + setStage(StageType.PASS_GROUP_STAGE_9, 0); + sp(205343, 1304.2659f, 1722.2467f, 316.5f, (byte) 8, 2000); + } + case 217600, 217601, 217602 -> { + npc.getController().delete(); + if (IntStream.of(217600, 217601, 217602).allMatch(i -> getNpcs(i).isEmpty())) { + setStage(StageType.START_STAGE_10_ROUND_2, 2000); + sp(217603, 1744.6332f, 1280.0349f, 394.3f, (byte) 9, 2000); + sp(217604, 1756.2661f, 1305.561f, 394.3f, (byte) 97, 6000); + sp(217605, 1763.1177f, 1268.2404f, 394.3f, (byte) 22, 10000); + sp(217606, 1765.2681f, 1306.5621f, 394.3f, (byte) 89, 14000); } + } + case 217603, 217604, 217605, 217606 -> { npc.getController().delete(); - if (getNpcs(217596).isEmpty() && getNpcs(217597).isEmpty()) { - // sendEventPacket(StageType.START_STAGE_9_ROUND_4, 2000); - rewardGroup();// Finish for now, TODO: continue + if (IntStream.of(217603, 217604, 217605, 217606).allMatch(i -> getNpcs(i).isEmpty())) { + setStage(StageType.START_STAGE_10_ROUND_3, 2000); + sp(700441, 1742.39f, 1289.59f, 394.237f, (byte) 68, 2000); + sp(700441, 1782.32f, 1272.74f, 394.237f, (byte) 94, 2000); + sp(217607, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); } + } + case 217607 -> { + npc.getController().delete(); + deleteAliveNpcs(700441); + setStage(StageType.START_STAGE_10_ROUND_4, 2000); + sp(217608, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); + } + case 217608 -> { + npc.getController().delete(); + setStage(StageType.START_STAGE_10_ROUND_5, 2000); + sp(217609, 1765.6692f, 1288.092f, 394.3f, (byte) 82, 2000); + } + case 217609 -> { + npc.getController().delete(); + setStage(StageType.PASS_GROUP_STAGE_10, 0); + sp(205344, 1764.6368f, 1288.831f, 394.23755f, (byte) 77); + } } } @@ -780,18 +648,17 @@ private void startBonusStage3() { sp(217743, 346.27f, 363.35f, 96.1f, (byte) 11); sp(217740, 332.12f, 349.22f, 96.1f, (byte) 0); sp(217741, 346.42f, 335.1f, 96.1f, (byte) 87); - ThreadPoolManager.getInstance().schedule(() -> { - sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_01()); // 30 sec + sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_01()); ThreadPoolManager.getInstance().schedule(() -> { - sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_02()); // 10 sec + sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_02()); ThreadPoolManager.getInstance().schedule(() -> { - sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_03()); // 5 sec + sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_03()); ThreadPoolManager.getInstance().schedule(() -> { deleteAliveNpcs(217740, 217741, 217742, 217743, 217744); sp(205331, 345.25f, 349.24f, 96.09097f, (byte) 0); sp(217735, 378.9331f, 346.74878f, 96.74762f, (byte) 0); - sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S3_ResurBox1_01()); // A Ticket Box appeared + sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S3_ResurBox1_01()); }, 5000); }, 5000); }, 20000); @@ -820,7 +687,6 @@ private void startBonusStage4() { sp(217747, 346.5176f, 365.8592f, 96.09092f, (byte) 60, 54000); sp(217745, 345.8434f, 367.8082f, 96.090904f, (byte) 60, 57000); sp(217747, 345.297f, 366.3014f, 96.09093f, (byte) 60, 60000); - // 30 sec sp(217747, 346.0346f, 367.2426f, 96.090904f, (byte) 60, 63000); sp(217747, 345.52863f, 366.62622f, 96.09092f, (byte) 60, 66000); sp(217745, 345.80862f, 366.9388f, 96.09092f, (byte) 60, 69000); @@ -829,11 +695,9 @@ private void startBonusStage4() { sp(217745, 345.2004f, 366.36902f, 96.09092f, (byte) 60, 78000); sp(217746, 346.2528f, 365.9208f, 96.09093f, (byte) 60, 81000); sp(217747, 346.0686f, 366.9096f, 96.090904f, (byte) 60, 84000); - // 10 sec sp(217746, 345.4606f, 367.14862f, 96.090904f, (byte) 60, 87000); sp(217747, 345.8016f, 367.7212f, 96.090904f, (byte) 60, 90000); sp(217747, 347.1144f, 365.875f, 96.09092f, (byte) 60, 93000); - // 5 sec sp(217747, 345.3226f, 367.7414f, 96.0909f, (byte) 60, 96000); sp(217747, 345.4836f, 367.3886f, 96.090904f, (byte) 60, 99000); sp(217747, 345.80862f, 366.0682f, 96.09092f, (byte) 60, 102000); @@ -859,7 +723,7 @@ private void startStage4Round3() { setStage(StageType.START_STAGE_4_ROUND_3, 2000); sp(217563, 339.70975f, 333.54272f, 96.090904f, (byte) 20, 6000); sp(217564, 342.92892f, 333.43994f, 96.09092f, (byte) 18, 6000); - sp(217565, 341.55396f, 330.70847f, 96.09093f, (byte) 23, 16000); + sp(217565, 341.55396f, 330.70847f, 96.09093f, (byte) 23, 12000); ThreadPoolManager.getInstance().schedule(() -> { List round = new ArrayList<>(); round.add(sp(217566, 362.87164f, 357.87164f, 96.091125f, (byte) 73)); @@ -878,7 +742,7 @@ private void startStage2Round2() { private void startStage2Round3() { setStage(StageType.START_STAGE_2_ROUND_3, 2000); - sp(217509, 332.24298f, 349.49286f, 96.090935f, (byte) 0, 6000); + sp(Rnd.get(1, 2) == 1 ? 217500 : 217509, 332.0035f, 349.55893f, 96.09093f, (byte) 0, 6000); } private void startStage2Round5() { @@ -887,17 +751,14 @@ private void startStage2Round5() { } private void rewardGroup() { - for (Player p : instance.getPlayersInside()) { - doReward(p); - } + instance.getPlayersInside().forEach(this::doReward); } @Override public void doReward(Player player) { CruciblePlayerReward playerReward = getPlayerReward(player.getObjectId()); - if (playerReward == null) { + if (playerReward == null) return; - } float reward = 0.01f * playerReward.getPoints() + 350; if (!playerReward.isRewarded()) { playerReward.setRewarded(); @@ -918,75 +779,74 @@ public void onInstanceDestroy() { } @Override - public boolean onDie(final Player player, Creature lastAttacker) { + public boolean onDie(Player player, Creature lastAttacker) { super.onDie(player, lastAttacker); getPlayerReward(player.getObjectId()).setPlayerDefeated(true); - boolean defeat = true; - for (Player p : instance.getPlayersInside()) { + for (Player p : instance.getPlayersInside()) if (!getPlayerReward(p.getObjectId()).isPlayerDefeated()) { defeat = false; break; } - } - if (defeat) rewardGroup(); - return true; } @Override - public boolean onReviveEvent(final Player player) { + public boolean onReviveEvent(Player player) { super.onReviveEvent(player); moveToReadyRoom(player); instance.forEachPlayer(p -> { - if (player.equals(p)) { - PacketSendUtility.sendPacket(p, SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_MOVE_BIRTHAREA_ME_IDARENA()); - } else - PacketSendUtility.sendPacket(p, SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_MOVE_BIRTHAREA_FRIENDLY_IDARENA(player.getName())); + PacketSendUtility.sendPacket(p, player.equals(p) ? SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_MOVE_BIRTHAREA_ME_IDARENA() + : SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_MOVE_BIRTHAREA_FRIENDLY_IDARENA(player.getName())); }); return true; } private EmpyreanStage getEmpyreanStage(Npc npc) { - for (EmpyreanStage es : empyreanStage) { - if (es.stageNpcs.contains(npc)) { - return es; - } - } - return null; + return empyreanStage.stream().filter(es -> es.stageNpcs.contains(npc)).findFirst().orElse(null); } private boolean isSpawn(List round) { - for (Npc n : npcs) { - if (round.contains(n.getNpcId())) { - return false; - } - } - return true; + return npcs.stream().noneMatch(n -> round.contains(n.getNpcId())); + } + + private Race getRegisteredTeamRace() { + return instance.getRegisteredTeam().getRace(); } @Override - public void onChangeStage(final StageType type) { + public void onChangeStage(StageType type) { switch (type) { - case START_STAGE_1_ELEVATOR: + case START_STAGE_1_ELEVATOR -> { setStage(type, 0); setStage(StageType.START_STAGE_1_ROUND_1, 5000); stage = 1; - final List round = new ArrayList<>(); - round.add(217486); - round.add(217489); - sp(217486, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); - sp(217489, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); + Race race = getRegisteredTeamRace(); + List round = new ArrayList<>(); + switch (race) { + case ASMODIANS -> { + round.add(217486); + round.add(217489); + sp(217486, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); + sp(217489, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); + } + case ELYOS -> { + round.add(217477); + round.add(217480); + sp(217477, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); + sp(217480, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); + } + } ThreadPoolManager.getInstance().schedule(() -> { if (!isSpawn(round)) { startStage1Round2(); } round.clear(); }, 62000); - break; - case START_STAGE_2_ELEVATOR: + } + case START_STAGE_2_ELEVATOR -> { setStage(type, 0); deleteAliveNpcs(217756); stage = 2; @@ -994,8 +854,8 @@ public void onChangeStage(final StageType type) { sp(217503, 325.71194f, 352.81027f, 96.09092f, (byte) 0, 9000); sp(217502, 325.78696f, 346.07263f, 96.090904f, (byte) 0, 9000); sp(217504, 325.06122f, 349.4784f, 96.090904f, (byte) 0, 9000); - break; - case START_STAGE_3_ELEVATOR: + } + case START_STAGE_3_ELEVATOR -> { setStage(type, 0); setStage(StageType.START_STAGE_3_ROUND_1, 5000); stage = 3; @@ -1023,8 +883,8 @@ public void onChangeStage(final StageType type) { sp(217513, 353.5887f, 339.10763f, 96.09092f, (byte) 0, 9000); sp(217511, 345.4889f, 361.17224f, 96.090935f, (byte) 0, 9000); sp(217513, 330.90952f, 350.7164f, 96.09093f, (byte) 0, 9000); - break; - case START_STAGE_4_ELEVATOR: + } + case START_STAGE_4_ELEVATOR -> { setStage(type, 0); deleteAliveNpcs(217735); setStage(StageType.START_STAGE_4_ROUND_1, 5000); @@ -1032,14 +892,14 @@ public void onChangeStage(final StageType type) { sp(217557, 328.88104f, 349.55392f, 96.090904f, (byte) 0, 9000); sp(217559, 328.38922f, 342.39066f, 96.09091f, (byte) 5, 9000); sp(217557, 333.17947f, 336.4504f, 96.090904f, (byte) 8, 9000); - break; - case START_STAGE_5_ROUND_1: + } + case START_STAGE_5_ROUND_1 -> { setStage(type, 2000); sp(217549, 1263.1987f, 778.4129f, 358.6056f, (byte) 30, 6000); sp(217548, 1260.1381f, 778.84644f, 358.60562f, (byte) 30, 6000); sp(217547, 1257.3065f, 778.35016f, 358.60562f, (byte) 30, 6000); - break; - case START_STAGE_6_ROUND_1: + } + case START_STAGE_6_ROUND_1 -> { setStage(type, 2000); sp(217568, 1636.7102f, 166.87984f, 126f, (byte) 60, 6000); sp(217568, 1619.4432f, 153.83188f, 126f, (byte) 60, 6000); @@ -1049,142 +909,169 @@ public void onChangeStage(final StageType type) { sp(217568, 1638.6783f, 162.67389f, 126f, (byte) 60); isDoneStage6Round1 = true; }, 12000); - break; - case START_STAGE_6_ROUND_5: - setStage(type, 0); - break; - case START_STAGE_7_ROUND_1: - setStage(type, 2000); - sp(217578, 1784.848f, 806.7728f, 469.82202f, (byte) 0, 6000); // elyos - // sp(217582, 1794.908f, 811.9936f, 469.3501f, (byte) 80, 6000); //asmo, need sniff - break; - case START_STAGE_8_ROUND_1: + } + case START_STAGE_6_ROUND_5 -> setStage(type, 0); + case START_STAGE_7_ROUND_1 -> { + setStage(type, 5000); + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> sp(217578, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); + case ELYOS -> sp(217582, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); + } + } + case START_STAGE_8_ROUND_1 -> { setStage(type, 2000); - sp(217588, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); - break; - case START_STAGE_9_ROUND_1: + sp(Rnd.get(1, 2) == 1 ? 217588 : 217589, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); + } + case START_STAGE_9_ROUND_1 -> { setStage(type, 2000); sp(217594, 1274.890f, 1730.676f, 318.194f, (byte) 3, 6000); - break; - case START_STAGE_5: + } + case START_STAGE_10_ROUND_1 -> { + setStage(type, 2000); + sp(217600, 1765.1488f, 1305.1216f, 394.3f, (byte) 84, 2000); + sp(217601, 1776.6201f, 1296.9429f, 394.2375f, (byte) 74, 2000); + sp(217602, 1771.5571f, 1302.0781f, 394.3f, (byte) 82, 2000); + } + case START_STAGE_5 -> { stage = 5; sp(205426, 1256.2872f, 834.28986f, 358.60565f, (byte) 103); sp(205332, 1260.1292f, 795.06964f, 358.60562f, (byte) 30); teleport(1260.15f, 812.34f, 358.6056f, (byte) 90); setStage(type, 1000); - break; - case START_STAGE_6: + } + case START_STAGE_6 -> { stage = 6; sp(205427, 1594.4756f, 145.26898f, 128.67778f, (byte) 16); sp(205333, 1625.1771f, 159.15244f, 126f, (byte) 70); teleport(1616.0248f, 154.43837f, 126f, (byte) 10); setStage(type, 1000); - break; - case START_STAGE_7: + } + case START_STAGE_7 -> { stage = 7; sp(205428, 1820.39f, 800.81805f, 470.1394f, (byte) 86); sp(205334, 1781.6106f, 796.9224f, 469.35016f, (byte) 0); teleport(1793.9233f, 796.92f, 469.36542f, (byte) 60); setStage(type, 1000); - break; - case START_STAGE_8: + } + case START_STAGE_8 -> { stage = 8; sp(205335, 1776.759f, 1764.705f, 303.695f, (byte) 90); sp(205429, 1780.103f, 1723.458f, 304.039f, (byte) 53); teleport(1776.4169f, 1749.9952f, 303.69553f, (byte) 0); // get retail setStage(type, 1000); - break; - case START_STAGE_9: + } + case START_STAGE_9 -> { stage = 9; sp(205430, 1359.375f, 1758.057f, 319.625f, (byte) 90); sp(205336, 1309.309f, 1732.540f, 315.782f, (byte) 7); teleport(1320.4513f, 1738.4838f, 316.1746f, (byte) 66); setStage(type, 1000); - break; + } + case START_STAGE_10 -> { + stage = 10; + sp(205431, 1755.709f, 1253.4136f, 394.2378f, (byte) 33); + sp(205337, 1766.5986f, 1291.2572f, 394.23755f, (byte) 82, 10000); + teleport(1760.9441f, 1278.033f, 394.23764f, (byte) 0); + setStage(type, 2000); + } } } private void startStage1Round2() { setStage(StageType.START_STAGE_1_ROUND_2, 2000); - final List round = new ArrayList<>(); - round.add(217492); - sp(217492, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); + Race race = getRegisteredTeamRace(); + List round = new ArrayList<>(); + switch (race) { + case ASMODIANS -> { + round.add(217492); + sp(217492, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); + } + case ELYOS -> { + round.add(217483); + sp(217483, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); + } + } ThreadPoolManager.getInstance().schedule(() -> { - if (!isSpawn(round)) { + if (!isSpawn(round)) startStage1Round3(); - } round.clear(); }, 59000); } private void startStage1Round3() { setStage(StageType.START_STAGE_1_ROUND_3, 2000); - final List round = new ArrayList<>(); - round.add(217487); - sp(217487, 334.844f, 339.92618f, 96.09094f, (byte) 18, 6000); + List round = new ArrayList<>(); + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> { + round.add(217487); + sp(217487, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); + } + case ELYOS -> { + round.add(217478); + sp(217478, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); + } + } ThreadPoolManager.getInstance().schedule(() -> { - if (!isSpawn(round)) { + if (!isSpawn(round)) startStage1Round4(); - } round.clear(); }, 63000); } private void startStage1Round4() { setStage(StageType.START_STAGE_1_ROUND_4, 2000); - final List round = new ArrayList<>(); - round.add(217491); - sp(217491, 341.03156f, 361.04315f, 96.09093f, (byte) 90, 6000); + List round = new ArrayList<>(); + Race race = getRegisteredTeamRace(); + switch (race) { + case ASMODIANS -> { + round.add(217491); + sp(217491, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); + } + case ELYOS -> { + round.add(217482); + sp(217482, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); + } + } ThreadPoolManager.getInstance().schedule(() -> { - if (!isSpawn(round)) { + if (!isSpawn(round)) startStage1Round5(); - } round.clear(); }, 167000); } private void startStage1Round5() { setStage(StageType.START_STAGE_1_ROUND_5, 2000); - sp(217493, 332.093f, 349.36847f, 96.090935f, (byte) 0, 8000); + Race race = instance.getRegisteredTeam().getRace(); + switch (race) { + case ASMODIANS -> { + sp(217493, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); + } + case ELYOS -> { + sp(217484, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); + } + } } private void teleport(float x, float y, float z, byte h) { - for (Player playerInside : instance.getPlayersInside()) { - if (playerInside.isOnline()) { - if (!getPlayerReward(playerInside.getObjectId()).isPlayerDefeated()) { + for (Player playerInside : instance.getPlayersInside()) + if (playerInside.isOnline()) + if (!getPlayerReward(playerInside.getObjectId()).isPlayerDefeated()) teleport(playerInside, x, y, z, h); - } else + else moveToReadyRoom(playerInside); - } - } } private void moveToReadyRoom(Player player) { switch (stage) { - case 1: - case 2: - case 3: - case 4: - teleport(player, 381.41684f, 346.78162f, 96.74763f, (byte) 43); - break; - case 5: - teleport(player, 1260.9495f, 832.87317f, 358.60562f, (byte) 92); - break; - case 6: - teleport(player, 1592.8813f, 149.78166f, 128.81355f, (byte) 117); - break; - case 7: - teleport(player, 1820.8805f, 795.80914f, 470.18304f, (byte) 51); - break; - case 8: - teleport(player, 1780.103f, 1723.458f, 304.039f, (byte) 53); // get retail - break; - case 9: - teleport(player, 1359.5046f, 1751.7952f, 319.59406f, (byte) 30); - break; - case 10: - // todo - break; + case 1, 2, 3, 4 -> teleport(player, 381.41684f, 346.78162f, 96.74763f, (byte) 43); + case 5 -> teleport(player, 1260.9495f, 832.87317f, 358.60562f, (byte) 92); + case 6 -> teleport(player, 1592.8813f, 149.78166f, 128.81355f, (byte) 117); + case 7 -> teleport(player, 1820.8805f, 795.80914f, 470.18304f, (byte) 51); + case 8 -> teleport(player, 1780.103f, 1723.458f, 304.039f, (byte) 53); + case 9 -> teleport(player, 1359.5046f, 1751.7952f, 319.59406f, (byte) 30); + case 10 -> teleport(player, 1755.709f, 1253.4136f, 394.2378f, (byte) 33); } } @@ -1196,9 +1083,8 @@ public void leaveInstance(Player player) { @Override public void onLeaveInstance(Player player) { CruciblePlayerReward reward = getPlayerReward(player.getObjectId()); - if (reward != null) { + if (reward != null) reward.setPlayerLeave(); - } } @Override @@ -1206,7 +1092,7 @@ public void onStopTraining(Player player) { doReward(player); } - private void sp(final int npcId, final float x, final float y, final float z, final byte h, final int time) { + private void sp(int npcId, float x, float y, float z, byte h, int time) { ThreadPoolManager.getInstance().schedule(() -> { if (!isInstanceDestroyed) { synchronized (npcs) { @@ -1244,10 +1130,7 @@ public void onDropRegistered(Npc npc, int winnerObj) { int npcId = npc.getNpcId(); int itemId = 0; switch (npcId) { - case 217740: - case 217741: - case 217743: - case 217742: + case 217740, 217741, 217743, 217742 -> { dropItems.clear(); itemId = 162000108; if (Rnd.chance() < 6) { @@ -1259,8 +1142,8 @@ public void onDropRegistered(Npc npc, int winnerObj) { default -> itemId; }; } - break; - case 217750: + } + case 217750 -> { dropItems.clear(); itemId = 162000109; if (Rnd.chance() < 6) { @@ -1277,8 +1160,8 @@ public void onDropRegistered(Npc npc, int winnerObj) { default -> itemId; }; } - break; - case 217753: // skillbooks + } + case 217753 -> { if (Rnd.chance() < 51) { Race race = instance.getRegisteredTeam().getRace(); itemId = switch (Rnd.get(1, 4)) { @@ -1289,9 +1172,9 @@ public void onDropRegistered(Npc npc, int winnerObj) { default -> itemId; }; } - break; + } } if (itemId != 0) dropItems.add(DropRegistrationService.getInstance().regDropItem(1, 0, npcId, itemId, 1)); } -} +} \ No newline at end of file diff --git a/game-server/data/static_data/npcs/npc_templates.xml b/game-server/data/static_data/npcs/npc_templates.xml index d5ac49a67c..9a0f596ffb 100644 --- a/game-server/data/static_data/npcs/npc_templates.xml +++ b/game-server/data/static_data/npcs/npc_templates.xml @@ -26680,7 +26680,7 @@ - + diff --git a/game-server/data/static_data/portals/portal_loc.xml b/game-server/data/static_data/portals/portal_loc.xml index bb0f876b07..b07d94ea39 100644 --- a/game-server/data/static_data/portals/portal_loc.xml +++ b/game-server/data/static_data/portals/portal_loc.xml @@ -84,7 +84,7 @@ - + @@ -328,7 +328,7 @@ - + From 03b3931262700438e0e8855f4e788fdf99a8c4e3 Mon Sep 17 00:00:00 2001 From: ZqT Date: Thu, 11 Jul 2024 13:44:36 -0300 Subject: [PATCH 2/5] refactory EmoteManager --- .../gameserver/ai/manager/EmoteManager.java | 57 ++++--------------- 1 file changed, 10 insertions(+), 47 deletions(-) diff --git a/game-server/src/com/aionemu/gameserver/ai/manager/EmoteManager.java b/game-server/src/com/aionemu/gameserver/ai/manager/EmoteManager.java index e3bf4a3563..6ff2f1396a 100644 --- a/game-server/src/com/aionemu/gameserver/ai/manager/EmoteManager.java +++ b/game-server/src/com/aionemu/gameserver/ai/manager/EmoteManager.java @@ -11,16 +11,11 @@ import com.aionemu.gameserver.utils.PacketSendUtility; /** - * @author ATracer + * @author ATracer, w4terbomb */ public class EmoteManager { - /** - * Npc starts attacking from idle state - * - * @param owner - */ - public static final void emoteStartAttacking(Npc owner, Creature target) { + public static void emoteStartAttacking(Npc owner, Creature target) { owner.unsetState(CreatureState.WALK_MODE); if (!owner.isInState(CreatureState.WEAPON_EQUIPPED)) { owner.setState(CreatureState.WEAPON_EQUIPPED); @@ -29,12 +24,7 @@ public static final void emoteStartAttacking(Npc owner, Creature target) { } } - /** - * Npc stops attacking - * - * @param owner - */ - public static final void emoteStopAttacking(Npc owner) { + public static void emoteStopAttacking(Npc owner) { owner.unsetState(CreatureState.WEAPON_EQUIPPED); VisibleObject target = owner.getTarget(); if (target instanceof Player) { @@ -42,54 +32,27 @@ public static final void emoteStopAttacking(Npc owner) { } } - /** - * Npc starts following other creature - * - * @param owner - */ - public static final void emoteStartFollowing(Npc owner) { + public static void emoteStartFollowing(Npc owner) { owner.unsetState(CreatureState.WALK_MODE); - PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.CHANGE_SPEED, 0, 0)); - PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.NEUTRALMODE_IN_MOVE, 0, 0)); + emoteStartReturning(owner); } - /** - * Npc starts walking (either random or path) - * - * @param owner - */ - public static final void emoteStartWalking(Npc owner) { + public static void emoteStartWalking(Npc owner) { owner.setState(CreatureState.WALK_MODE); PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.WALK)); } - /** - * Npc stops walking - * - * @param owner - */ - public static final void emoteStopWalking(Npc owner) { + public static void emoteStopWalking(Npc owner) { owner.unsetState(CreatureState.WALK_MODE); } - /** - * Npc starts returning to spawn location - * - * @param owner - */ - public static final void emoteStartReturning(Npc owner) { + public static void emoteStartReturning(Npc owner) { PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.CHANGE_SPEED, 0, 0)); PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.NEUTRALMODE_IN_MOVE, 0, 0)); } - /** - * Npc starts idling - * - * @param owner - */ - public static final void emoteStartIdling(Npc owner) { + public static void emoteStartIdling(Npc owner) { owner.setState(CreatureState.WALK_MODE); - PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.CHANGE_SPEED, 0, 0)); - PacketSendUtility.broadcastPacket(owner, new SM_EMOTION(owner, EmotionType.NEUTRALMODE_IN_MOVE, 0, 0)); + emoteStartReturning(owner); } } From 1763269e52f07df3f4ed06c37c3723a6c912e8de Mon Sep 17 00:00:00 2001 From: w4terbomb Date: Thu, 25 Jul 2024 22:35:24 -0300 Subject: [PATCH 3/5] Fix EmpyreanCrucibleInstance --- .../empyreanCrucible/ArminosDrakyAI.java | 3 +- .../EmpyreanAdministratorArminosAI.java | 46 +- .../empyreanCrucible/EmpyreanArbiterAI.java | 6 +- .../EmpyreanRecordKeeperAI.java | 1 + .../empyreanCrucible/KingConsierdAI.java | 75 +-- .../empyreanCrucible/MagePreceptorAI.java | 90 ++- .../empyreanCrucible/PriestPreceptorAI.java | 87 --- .../PriestPreceptorAsmodiansAI.java | 88 +++ .../PriestPreceptorElyosAI.java | 90 +++ .../empyreanCrucible/QueenAlukinaAI.java | 9 +- .../instance/empyreanCrucible/RM1337AI.java | 60 +- .../empyreanCrucible/SparkOfDarknessAI.java | 10 +- .../empyreanCrucible/SpectralWarriorAI.java | 4 +- .../empyreanCrucible/StrangeCreatureAI.java | 5 +- .../empyreanCrucible/TakunGojiraAI.java | 3 +- .../empyreanCrucible/VanktristAI.java | 144 +++++ .../empyreanCrucible/WarriorPreceptorAI.java | 22 +- .../crucible/EmpyreanCrucibleInstance.java | 517 +++++++++--------- .../data/static_data/npcs/npc_templates.xml | 18 +- 19 files changed, 755 insertions(+), 523 deletions(-) delete mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java create mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java create mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java create mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java index 8729b82afa..8235f2458c 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java @@ -37,7 +37,7 @@ protected void handleSpawned() { @Override protected void handleMoveArrived() { super.handleMoveArrived(); - if (getOwner().getMoveController().getCurrentStep().isLastStep()) { + if (getOwner().getMoveController().getCurrentStep().isLastStep()) if (!isStart) { getSpawnTemplate().setWalkerId(null); WalkManager.stopWalking(this); @@ -45,7 +45,6 @@ protected void handleMoveArrived() { } else { isStart = false; } - } } @Override diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java index 4e6f0aa090..749a801801 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java @@ -6,7 +6,7 @@ import com.aionemu.gameserver.utils.PacketSendUtility; /** - * @author xTz + * @author xTz, w4terbomb */ @AIName("empadministratorarminos") public class EmpyreanAdministratorArminosAI extends NpcAI { @@ -23,23 +23,33 @@ protected void handleSpawned() { private void startEvent() { switch (getNpcId()) { - case 217744 -> { - PacketSendUtility.broadcastMessage(getOwner(), 1500247, 8000); - PacketSendUtility.broadcastMessage(getOwner(), 1500250, 20000); - PacketSendUtility.broadcastMessage(getOwner(), 1500251, 60000); - } - case 217749 -> { - PacketSendUtility.broadcastMessage(getOwner(), 1500252, 8000); - PacketSendUtility.broadcastMessage(getOwner(), 1500253, 16000); - PacketSendUtility.broadcastToMap(getOwner(), 1400982, 25000); - PacketSendUtility.broadcastToMap(getOwner(), 1400988, 27000); - PacketSendUtility.broadcastToMap(getOwner(), 1400989, 29000); - PacketSendUtility.broadcastToMap(getOwner(), 1400990, 31000); - PacketSendUtility.broadcastToMap(getOwner(), 1401013, 93000); - PacketSendUtility.broadcastToMap(getOwner(), 1401014, 113000); - PacketSendUtility.broadcastToMap(getOwner(), 1401015, 118000); - PacketSendUtility.broadcastMessage(getOwner(), 1500255, 118000); + case 217744 -> handleEventForNpcId217744(); + case 217749 -> handleEventForNpcId217749(); + default -> { } } } -} + + private void handleEventForNpcId217744() { + sendBroadcastMessages(new int[] { 1500247, 1500250, 1500251 }, new int[] { 8000, 20000, 60000 }); + } + + private void handleEventForNpcId217749() { + sendBroadcastMessages(new int[] { 1500252, 1500253, 1500255 }, new int[] { 8000, 16000, 118000 }); + + broadcastToMap(new int[] { 1400982, 1400988, 1400989, 1400990, 1401013, 1401014, 1401015 }, + new int[] { 25000, 27000, 29000, 31000, 93000, 113000, 118000 }); + } + + private void sendBroadcastMessages(int[] messageIds, int[] delays) { + for (int i = 0; i < messageIds.length; i++) { + PacketSendUtility.broadcastMessage(getOwner(), messageIds[i], delays[i]); + } + } + + private void broadcastToMap(int[] mapMessageIds, int[] delays) { + for (int i = 0; i < mapMessageIds.length; i++) { + PacketSendUtility.broadcastToMap(getOwner(), mapMessageIds[i], delays[i]); + } + } +} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java index 2d1c8a4457..44622d0d28 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java @@ -25,10 +25,8 @@ public EmpyreanArbiterAI(Npc owner) { @Override protected void handleDialogStart(Player player) { - if (player.getInventory().getFirstItemByItemId(186000124) != null) - PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 1011)); - else - PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); + PacketSendUtility.sendPacket(player, player.getInventory().getFirstItemByItemId(186000124) != null ? new SM_DIALOG_WINDOW(getObjectId(), 1011) + : new SM_DIALOG_WINDOW(getObjectId(), 0)); } @Override diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java index 70562d84e5..dd6df365a7 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java @@ -74,6 +74,7 @@ public boolean onDialogSelect(Player player, int dialogActionId, int questId, in case 205336 -> instanceHandler.onChangeStage(StageType.START_STAGE_9_ROUND_1); case 205343 -> instanceHandler.onChangeStage(StageType.START_STAGE_10); case 205337 -> instanceHandler.onChangeStage(StageType.START_STAGE_10_ROUND_1); + case 205344 -> getPosition().getWorldMapInstance().getInstanceHandler().doReward(player); } AIActions.deleteOwner(this); } else if (dialogActionId == SETPRO2 && getNpcId() == 799567) { diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java index 7e0d521d45..a0cc2ed43a 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java @@ -1,5 +1,7 @@ package ai.instance.empyreanCrucible; +import com.aionemu.gameserver.utils.ThreadPoolManager; + import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; @@ -9,20 +11,17 @@ import com.aionemu.gameserver.controllers.attack.AggroInfo; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.skillengine.SkillEngine; -import com.aionemu.gameserver.utils.ThreadPoolManager; -import com.aionemu.gameserver.world.WorldPosition; import ai.AggressiveNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("king_consierd") public class KingConsierdAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { private final HpPhases hpPhases = new HpPhases(75, 25); - private AtomicBoolean isHome = new AtomicBoolean(true); + private final AtomicBoolean isHome = new AtomicBoolean(true); private Future eventTask; private Future skillTask; @@ -57,54 +56,58 @@ public void handleAttack(Creature creature) { hpPhases.tryEnterNextPhase(this); if (isHome.compareAndSet(true, false)) { startBloodThirstTask(); - ThreadPoolManager.getInstance().schedule(() -> { - SkillEngine.getInstance().getSkill(getOwner(), 19691, 1, getTarget()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 17954, 29, getTarget()).useNoAnimationSkill(), - 4000); - }, 2000); + scheduleInitialSkills(); } } + private void scheduleInitialSkills() { + ThreadPoolManager.getInstance().schedule(() -> { + getOwner().queueSkill(19691, 1, 0); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(17954, 29, 0), 4000); + }, 2000); + } + @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { case 75 -> startSkillTask(); - case 25 -> SkillEngine.getInstance().getSkill(getOwner(), 19690, 1, getTarget()).useNoAnimationSkill(); + case 25 -> getOwner().queueSkill(19690, 1, 0); } } private void startBloodThirstTask() { - eventTask = ThreadPoolManager.getInstance().schedule( - () -> SkillEngine.getInstance().getSkill(getOwner(), 19624, 10, getOwner()).useNoAnimationSkill(), 180 * 1000); // 3min, need confirm + eventTask = ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19624, 10, 0), 180000); // 3min, need confirm } private void startSkillTask() { - skillTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { - if (isDead()) { - cancelTasks(); - } else { - SkillEngine.getInstance().getSkill(getOwner(), 17951, 29, getTarget()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - dropAggro(); - if (getLifeStats().getHpPercentage() <= 50) { - WorldPosition p = getPosition(); - spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); - spawn(282378, p.getX(), p.getY(), p.getZ(), p.getHeading()); - } - ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 17952, 29, getTarget()).useNoAnimationSkill(), - 2000); - }, 3500); - } - }, 0, 25000); + skillTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(this::executeSkillTask, 0, 25000); + } + + private void executeSkillTask() { + if (isDead()) { + cancelTasks(); + } else { + getOwner().queueSkill(17951, 29, 0); + ThreadPoolManager.getInstance().schedule(() -> { + dropAggro(); + if (getLifeStats().getHpPercentage() <= 50) + spawnBabyConsierd(); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(17952, 29, 0), 2000); + }, 3500); + } + } + + private void spawnBabyConsierd() { + var position = getPosition(); + spawn(282378, position.getX(), position.getY(), position.getZ(), position.getHeading()); + spawn(282378, position.getX(), position.getY(), position.getZ(), position.getHeading()); } private void dropAggro() { - if (getTarget() instanceof Creature hated) { - if (getAggroList().isHating(hated)) { - AggroInfo ai = getAggroList().getAggroInfo(hated); - ai.setHate(ai.getHate() / 2); - think(); - } + if (getTarget() instanceof Creature hated && getAggroList().isHating(hated)) { + AggroInfo ai = getAggroList().getAggroInfo(hated); + ai.setHate(ai.getHate() / 2); + think(); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java index a588e92b07..0208719b73 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java @@ -1,23 +1,18 @@ package ai.instance.empyreanCrucible; -import java.util.ArrayList; -import java.util.List; - -import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.ai.HpPhases; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.gameobjects.player.Player; -import com.aionemu.gameserver.skillengine.SkillEngine; -import com.aionemu.gameserver.utils.PositionUtil; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; import com.aionemu.gameserver.utils.ThreadPoolManager; import com.aionemu.gameserver.world.WorldPosition; import ai.AggressiveNpcAI; /** - * @author Luzien + * AI for Mage Preceptor in Empyrean Crucible + * @author Luzien, w4terbomb */ @AIName("mage_preceptor") public class MagePreceptorAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { @@ -56,54 +51,57 @@ public void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 75 -> SkillEngine.getInstance().getSkill(getOwner(), 19605, 10, getTargetPlayer()).useNoAnimationSkill(); - case 50 -> { - SkillEngine.getInstance().getSkill(getOwner(), 19606, 10, getTarget()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) { - SkillEngine.getInstance().getSkill(getOwner(), 19609, 10, getOwner()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - WorldPosition p = getPosition(); - spawn(282364, p.getX(), p.getY(), p.getZ(), p.getHeading()); - spawn(282363, p.getX(), p.getY(), p.getZ(), p.getHeading()); - scheduleSkill(2000); - }, 4500); - } - }, 3000); - } - case 25 -> { - SkillEngine.getInstance().getSkill(getOwner(), 19606, 10, getTarget()).useNoAnimationSkill(); - scheduleSkill(3000); - scheduleSkill(9000); - scheduleSkill(15000); - } + case 75 -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM); + case 50 -> handle50PercentPhase(); + case 25 -> handle25PercentPhase(); } } - private void scheduleSkill(int delay) { - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) - SkillEngine.getInstance().getSkill(getOwner(), 19605, 10, getTargetPlayer()).useNoAnimationSkill(); - }, delay); + private void handle50PercentPhase() { + queueSkill(19609, NpcSkillTargetAttribute.MOST_HATED); + scheduleTask(() -> { + if (!isDead()) { + queueSkill(19609, NpcSkillTargetAttribute.MOST_HATED); + scheduleTask(this::spawnNpcs, 4500); + } + }, 3000); + } + + private void handle25PercentPhase() { + queueSkill(19605, NpcSkillTargetAttribute.RANDOM); + scheduleRepeatedSkills(3000, 9000, 15000); } - private Player getTargetPlayer() { - List players = new ArrayList<>(); - getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 37)) { - players.add(player); - } - }); - return Rnd.get(players); + private void queueSkill(int skillId, NpcSkillTargetAttribute targetAttribute) { + getOwner().queueSkill(skillId, 10, 0, targetAttribute); + } + + private void scheduleTask(Runnable task, int delay) { + ThreadPoolManager.getInstance().schedule(task, delay); + } + + private void scheduleRepeatedSkills(int... delays) { + for (int delay : delays) { + scheduleTask(() -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM), delay); + } + } + + private void spawnNpcs() { + WorldPosition p = getPosition(); + spawn(282364, p.getX(), p.getY(), p.getZ(), p.getHeading()); + spawn(282363, p.getX(), p.getY(), p.getZ(), p.getHeading()); + scheduleTask(() -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM), 2000); } private void despawnNpcs() { - despawnNpc(getPosition().getWorldMapInstance().getNpc(282364)); - despawnNpc(getPosition().getWorldMapInstance().getNpc(282363)); + despawnNpc(282364); + despawnNpc(282363); } - private void despawnNpc(Npc npc) { - if (npc != null) + private void despawnNpc(int npcId) { + Npc npc = getPosition().getWorldMapInstance().getNpc(npcId); + if (npc != null) { npc.getController().delete(); + } } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java deleted file mode 100644 index e21b989140..0000000000 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java +++ /dev/null @@ -1,87 +0,0 @@ -package ai.instance.empyreanCrucible; - -import java.util.ArrayList; -import java.util.List; - -import com.aionemu.commons.utils.Rnd; -import com.aionemu.gameserver.ai.AIName; -import com.aionemu.gameserver.ai.HpPhases; -import com.aionemu.gameserver.model.gameobjects.Creature; -import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.gameobjects.player.Player; -import com.aionemu.gameserver.skillengine.SkillEngine; -import com.aionemu.gameserver.utils.PositionUtil; -import com.aionemu.gameserver.utils.ThreadPoolManager; -import com.aionemu.gameserver.world.WorldPosition; - -import ai.AggressiveNpcAI; - -/** - * @author Luzien - */ -@AIName("priest_preceptor") -public class PriestPreceptorAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { - - private final HpPhases hpPhases = new HpPhases(75, 25); - - public PriestPreceptorAI(Npc owner) { - super(owner); - } - - @Override - public void handleSpawned() { - super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 19612, 15, getOwner()).useNoAnimationSkill(), 1000); - } - - @Override - public void handleBackHome() { - super.handleBackHome(); - hpPhases.reset(); - } - - @Override - public void handleAttack(Creature creature) { - super.handleAttack(creature); - hpPhases.tryEnterNextPhase(this); - } - - @Override - public void handleHpPhase(int phaseHpPercent) { - switch (phaseHpPercent) { - case 75 -> SkillEngine.getInstance().getSkill(getOwner(), 19611, 10, getTargetPlayer()).useNoAnimationSkill(); - case 25 -> startEvent(); - } - } - - private void startEvent() { - SkillEngine.getInstance().getSkill(getOwner(), 19610, 10, getOwner()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - SkillEngine.getInstance().getSkill(getOwner(), 19614, 10, getOwner()).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - WorldPosition p = getPosition(); - applySoulSickness((Npc) spawn(282366, p.getX(), p.getY(), p.getZ(), p.getHeading())); - applySoulSickness((Npc) spawn(282367, p.getX(), p.getY(), p.getZ(), p.getHeading())); - applySoulSickness((Npc) spawn(282368, p.getX(), p.getY(), p.getZ(), p.getHeading())); - }, 5000); - }, 2000); - } - - private Player getTargetPlayer() { - List players = new ArrayList<>(); - getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 25)) { - players.add(player); - } - }); - return Rnd.get(players); - } - - private void applySoulSickness(final Npc npc) { - ThreadPoolManager.getInstance().schedule(() -> { - npc.getLifeStats().setCurrentHpPercent(50); // TODO: remove this, fix max hp debuffs not reducing current hp properly - SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(); - }, 1000); - } - -} diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java new file mode 100644 index 0000000000..aa83665edb --- /dev/null +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java @@ -0,0 +1,88 @@ +package ai.instance.empyreanCrucible; + +import java.util.concurrent.atomic.AtomicBoolean; + +import com.aionemu.gameserver.ai.AIName; +import com.aionemu.gameserver.model.gameobjects.Creature; +import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; +import com.aionemu.gameserver.skillengine.SkillEngine; +import com.aionemu.gameserver.utils.ThreadPoolManager; +import com.aionemu.gameserver.world.WorldPosition; + +import ai.AggressiveNoLootNpcAI; + +/** + * AI for Priest Preceptor (Asmodians) in Empyrean Crucible + * + * @author w4terbomb + */ +@AIName("priest_preceptor_asmodians") +public class PriestPreceptorAsmodiansAI extends AggressiveNoLootNpcAI { + + private final AtomicBoolean startTask1 = new AtomicBoolean(); + private final AtomicBoolean startTask2 = new AtomicBoolean(); + + public PriestPreceptorAsmodiansAI(Npc owner) { + super(owner); + } + + @Override + public void handleSpawned() { + super.handleSpawned(); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46, 0), 1000); + } + + @Override + public void handleAttack(Creature creature) { + super.handleAttack(creature); + checkPercentage(getLifeStats().getHpPercentage()); + } + + private void checkPercentage(int percentage) { + if (percentage <= 75 && startTask1.compareAndSet(false, true)) + getOwner().queueSkill(19611, 46, 0, NpcSkillTargetAttribute.RANDOM); + if (percentage <= 25 && startTask2.compareAndSet(false, true)) + startTask(); + } + + private void startTask() { + getOwner().queueSkill(19610, 46, 0); + ThreadPoolManager.getInstance().schedule(() -> { + getOwner().queueSkill(19614, 46, 0, NpcSkillTargetAttribute.ME); + ThreadPoolManager.getInstance().schedule(() -> { + WorldPosition p = getPosition(); + applySoulSickness((Npc) spawn(282369, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Traufnir. + applySoulSickness((Npc) spawn(282370, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Sigyn. + applySoulSickness((Npc) spawn(282371, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Sif. + }, 5000); + }, 2000); + } + + private void applySoulSickness(Npc npc) { + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); + } + + @Override + protected void handleDied() { + despawnNpcsById(282369, 282370, 282371); // Traufnir, Sigyn, Sif. + super.handleDied(); + } + + @Override + protected void handleBackHome() { + despawnNpcsById(282369, 282370, 282371); // Traufnir, Sigyn, Sif. + stopTask(); + super.handleDied(); + } + + private void stopTask() { + startTask1.set(false); + startTask2.set(false); + } + + private void despawnNpcsById(int... npcIds) { + getPosition().getWorldMapInstance().getNpcs(npcIds).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); + } + +} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java new file mode 100644 index 0000000000..21bd8d699b --- /dev/null +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java @@ -0,0 +1,90 @@ +package ai.instance.empyreanCrucible; + +import java.util.concurrent.atomic.AtomicBoolean; + +import com.aionemu.gameserver.ai.AIName; +import com.aionemu.gameserver.model.gameobjects.Creature; +import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; +import com.aionemu.gameserver.skillengine.SkillEngine; +import com.aionemu.gameserver.utils.ThreadPoolManager; +import com.aionemu.gameserver.world.WorldPosition; + +import ai.AggressiveNoLootNpcAI; + +/** + * AI for Priest Preceptor (Elyos) in Empyrean Crucible + * + * @author w4terbomb + */ +@AIName("priest_preceptor_elyos") +public class PriestPreceptorElyosAI extends AggressiveNoLootNpcAI { + + private final AtomicBoolean startTask1 = new AtomicBoolean(); + private final AtomicBoolean startTask2 = new AtomicBoolean(); + + public PriestPreceptorElyosAI(Npc owner) { + super(owner); + } + + @Override + public void handleSpawned() { + super.handleSpawned(); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46, 0), 1000); + } + + @Override + public void handleAttack(Creature creature) { + super.handleAttack(creature); + checkPercentage(getLifeStats().getHpPercentage()); + } + + private void checkPercentage(int percentage) { + if (percentage <= 75 && startTask1.compareAndSet(false, true)) + getOwner().queueSkill(19611, 46, 0, NpcSkillTargetAttribute.RANDOM); + if (percentage <= 25 && startTask2.compareAndSet(false, true)) + startTask(); + } + + private void startTask() { + getOwner().queueSkill(19610, 46, 0); + ThreadPoolManager.getInstance().schedule(new Runnable() { + @Override + public void run() { + getOwner().queueSkill(19614, 46, 0, NpcSkillTargetAttribute.ME); + ThreadPoolManager.getInstance().schedule(() -> { + WorldPosition p = getPosition(); + applySoulSickness((Npc) spawn(282366, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Boreas. + applySoulSickness((Npc) spawn(282367, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Jumentis. + applySoulSickness((Npc) spawn(282368, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Charna. + }, 5000); + } + }, 2000); + } + + private void applySoulSickness(final Npc npc) { + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); + } + + @Override + protected void handleDied() { + despawnNpcsById(282366, 282367, 282368); // Boreas, Jumentis, Charna. + super.handleDied(); + } + + @Override + protected void handleBackHome() { + despawnNpcsById(282366, 282367, 282368); // Boreas, Jumentis, Charna. + stopTask(); + super.handleDied(); + } + + private void stopTask() { + startTask1.set(false); + startTask2.set(false); + } + + private void despawnNpcsById(int... npcIds) { + getPosition().getWorldMapInstance().getNpcs(npcIds).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); + } +} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java index e557ce8b57..f20db14ec4 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java @@ -6,14 +6,13 @@ import com.aionemu.gameserver.ai.HpPhases; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("alukina_emp") public class QueenAlukinaAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { @@ -52,7 +51,7 @@ public void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { - SkillEngine.getInstance().getSkill(getOwner(), 17899, 41, getTarget()).useNoAnimationSkill(); + getOwner().queueSkill(17899, 41, 0); switch (phaseHpPercent) { case 75 -> { scheduleSkill(17900, 4500); @@ -68,7 +67,7 @@ public void handleHpPhase(int phaseHpPercent) { if (isDead()) { cancelTask(); } else { - SkillEngine.getInstance().getSkill(getOwner(), 17901, 41, getTarget()).useNoAnimationSkill(); + getOwner().queueSkill(17901, 41, 0); scheduleSkill(17902, 5500); scheduleSkill(17902, 7500); } @@ -84,7 +83,7 @@ private void cancelTask() { private void scheduleSkill(final int skill, int delay) { ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) - SkillEngine.getInstance().getSkill(getOwner(), skill, 41, getTarget()).useNoAnimationSkill(); + getOwner().queueSkill(skill, 41, 0); }, delay); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java index 39f58d2789..05b6c9d3e8 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java @@ -1,30 +1,30 @@ package ai.instance.empyreanCrucible; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.IntStream; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.ai.AIName; +import com.aionemu.gameserver.ai.HpPhases; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.gameobjects.player.Player; -import com.aionemu.gameserver.skillengine.SkillEngine; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; import com.aionemu.gameserver.utils.PacketSendUtility; -import com.aionemu.gameserver.utils.PositionUtil; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("rm_1337") -public class RM1337AI extends AggressiveNpcAI { +public class RM1337AI extends AggressiveNpcAI implements HpPhases.PhaseHandler { - private AtomicBoolean isHome = new AtomicBoolean(true); - private AtomicBoolean isEventStarted = new AtomicBoolean(false); + private final HpPhases hpPhases = new HpPhases(15, 35, 55, 75, 95); + + private final AtomicBoolean isHome = new AtomicBoolean(true); + private final AtomicBoolean isEventStarted = new AtomicBoolean(false); private Future task1, task2; public RM1337AI(Npc owner) { @@ -61,9 +61,17 @@ public void handleAttack(Creature creature) { super.handleAttack(creature); if (isHome.compareAndSet(true, false)) startSkillTask1(); - if (getLifeStats().getHpPercentage() <= 75) - if (isEventStarted.compareAndSet(false, true)) - startSkillTask2(); + handleHpPhase(getLifeStats().getHpPercentage()); + } + + @Override + public void handleHpPhase(int phaseHpPercent) { + switch (phaseHpPercent) { + case 15, 35, 55, 75, 95 -> { + if (isEventStarted.compareAndSet(false, true)) + startSkillTask2(); + } + } } private void cancelTask() { @@ -82,18 +90,11 @@ private void startSkillTask1() { return; if (getLifeStats().getHpPercentage() <= 50) switch (Rnd.nextInt(2)) { - case 0 -> SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); - default -> { - final Player target = getTargetPlayer(); - SkillEngine.getInstance().getSkill(getOwner(), 19552, 10, target).useNoAnimationSkill(); - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) - SkillEngine.getInstance().getSkill(getOwner(), 19553, 10, target).useNoAnimationSkill(); - }, 4000); - } + case 0 -> getOwner().queueSkill(19550, 10, 0, NpcSkillTargetAttribute.RANDOM); + default -> getOwner().queueSkill(19552, 10, 0, NpcSkillTargetAttribute.RANDOM); } else - SkillEngine.getInstance().getSkill(getOwner(), 19550, 10, getTargetPlayer()).useNoAnimationSkill(); + getOwner().queueSkill(19550, 10, 0, NpcSkillTargetAttribute.RANDOM); } }, 10000, 23000); } @@ -105,7 +106,7 @@ private void startSkillTask2() { } else { getOwner().getController().cancelCurrentSkill(null); PacketSendUtility.broadcastMessage(getOwner(), 1500230); - SkillEngine.getInstance().getSkill(getOwner(), 19551, 10, getTarget()).useNoAnimationSkill(); + getOwner().queueSkill(19551, 10, 0); spawnSparks(); } }, 0, 60000); @@ -114,19 +115,8 @@ private void startSkillTask2() { private void spawnSparks() { ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) { - int count = Rnd.get(8, 12); - for (int i = 0; i < count; i++) - rndSpawnInRange(282373, 3, 12); + IntStream.range(0, Rnd.get(8, 12)).forEach(i -> rndSpawnInRange(282373, 3, 12)); } }, 4000); } - - private Player getTargetPlayer() { - List players = new ArrayList<>(); - getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 37)) - players.add(player); - }); - return Rnd.get(players); - } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java index 1e3c127115..8aff9dc998 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java @@ -3,13 +3,12 @@ import com.aionemu.gameserver.ai.AIActions; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.GeneralNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("spark_of_darkness") public class SparkOfDarknessAI extends GeneralNpcAI { @@ -28,11 +27,16 @@ protected void handleSpawned() { private void startEventTask() { ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) - SkillEngine.getInstance().getSkill(getOwner(), 19554, 1, getOwner()).useNoAnimationSkill(); + getOwner().queueSkill(19554, 1, 0); }, 500); } private void startLifeTask() { ThreadPoolManager.getInstance().schedule(() -> AIActions.deleteOwner(SparkOfDarknessAI.this), 6500); } + + @Override + public boolean isMoveSupported() { + return false; + } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java index 35bf661800..a13936eb9a 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java @@ -10,7 +10,7 @@ import ai.AggressiveNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("spectral_warrior") public class SpectralWarriorAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { @@ -30,7 +30,7 @@ protected void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { getPosition().getWorldMapInstance().getInstanceHandler().onChangeStage(StageType.START_STAGE_6_ROUND_5); - ThreadPoolManager.getInstance().schedule(this::resurrectAllies, 2000); + ThreadPoolManager.getInstance().scheduleAtFixedRate(this::resurrectAllies, 0, 2000); } private void resurrectAllies() { diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java index 0f43ad10ca..fed7ab7dc1 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java @@ -3,14 +3,13 @@ import com.aionemu.gameserver.ai.AIActions; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.GeneralNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("strange_creature") public class StrangeCreatureAI extends GeneralNpcAI { @@ -30,7 +29,7 @@ private void startEventTask() { ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) PacketSendUtility.broadcastMessage(getOwner(), 341444); - SkillEngine.getInstance().getSkill(getOwner(), 17914, 34, getOwner()).useNoAnimationSkill(); + getOwner().queueSkill(17914, 34, 0); }, 500); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java index 2df67ad018..d226efe7f0 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java @@ -1,8 +1,9 @@ package ai.instance.empyreanCrucible; +import com.aionemu.gameserver.utils.ThreadPoolManager; + import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java new file mode 100644 index 0000000000..4e1cd9f0aa --- /dev/null +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java @@ -0,0 +1,144 @@ +package ai.instance.empyreanCrucible; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Future; +import java.util.concurrent.atomic.AtomicBoolean; + +import com.aionemu.commons.utils.Rnd; +import com.aionemu.gameserver.ai.AIName; +import com.aionemu.gameserver.ai.HpPhases; +import com.aionemu.gameserver.model.gameobjects.Creature; +import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.model.gameobjects.player.Player; +import com.aionemu.gameserver.utils.PacketSendUtility; +import com.aionemu.gameserver.utils.ThreadPoolManager; +import com.aionemu.gameserver.world.WorldPosition; + +import ai.AggressiveNoLootNpcAI; + +/** + * @author w4terbomb + */ +@AIName("vanktrist") +public class VanktristAI extends AggressiveNoLootNpcAI implements HpPhases.PhaseHandler { + + private final HpPhases hpPhases = new HpPhases(75, 50); + + private Future phaseTask; + private final AtomicBoolean isAggred = new AtomicBoolean(false); + private final AtomicBoolean isStartedEvent = new AtomicBoolean(false); + + private VanktristAI(Npc owner) { + super(owner); + } + + @Override + protected void handleAttack(Creature creature) { + super.handleAttack(creature); + if (isAggred.compareAndSet(false, true)) { + PacketSendUtility.broadcastMessage(getOwner(), 0); + } + checkPercentage(getLifeStats().getHpPercentage()); + } + + public void checkPercentage(int hpPercentage) { + switch (hpPercentage) { + case 50, 75 -> { + if (isStartedEvent.compareAndSet(false, true)) + startPhaseTask(); + } + } + } + + @Override + public void handleHpPhase(int phaseHpPercent) { + switch (phaseHpPercent) { + case 75 -> PacketSendUtility.broadcastMessage(getOwner(), 1500210, 0, 0); + case 50 -> PacketSendUtility.broadcastMessage(getOwner(), 1500211, 0, 0); + } + } + + private void startPhaseTask() { + phaseTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelPhaseTask(); + } else { + getOwner().queueSkill(19567, 46, 0); //Gravitational Shift. + List players = getLifedPlayers(); + if (!players.isEmpty()) { + int size = players.size(); + int count = Rnd.get(1, size); + for (int i = 0; i < count; i++) { + spawnWeakenedDimensionalVortex(players.get(Rnd.get(players.getFirst().getObjectId(), players.size()))); + } + } + } + }, 3000, 15000); + } + + private void spawnWeakenedDimensionalVortex(Player player) { + final float x = player.getX(); + final float y = player.getY(); + final float z = player.getZ(); + if (x > 0 && y > 0 && z > 0) { + ThreadPoolManager.getInstance().schedule(new Runnable() { + @Override + public void run() { + if (!isDead()) { + spawn(217804, x, y, z, (byte) 0); //Weakened Dimensional Vortex. + } + } + }, 3000); + } + } + + private List getLifedPlayers() { + List players = new ArrayList(); + for (Player player : getKnownList().getKnownPlayers().values()) { + if (!isDead()) { + players.add(player); + } + } + return players; + } + + private void cancelPhaseTask() { + if (phaseTask != null && !phaseTask.isDone()) { + phaseTask.cancel(true); + } + } + + @Override + protected void handleDespawned() { + cancelPhaseTask(); + super.handleDespawned(); + } + + @Override + protected void handleBackHome() { + cancelPhaseTask(); + isStartedEvent.set(false); + isAggred.set(false); + super.handleBackHome(); + } + + @Override + protected void handleDied() { + final WorldPosition p = getPosition(); + if (p != null) { + deleteNpcs(p.getWorldMapInstance().getNpcs(217804)); //Vortex. + } + cancelPhaseTask(); + super.handleDied(); + } + + private void deleteNpcs(List npcs) { + for (Npc npc : npcs) { + if (npc != null) { + npc.getController().onDelete(); + } + } + } + +} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java index dc1a63c5d0..251b3bda96 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java @@ -1,24 +1,19 @@ package ai.instance.empyreanCrucible; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; -import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.gameobjects.player.Player; -import com.aionemu.gameserver.skillengine.SkillEngine; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; import com.aionemu.gameserver.utils.PacketSendUtility; -import com.aionemu.gameserver.utils.PositionUtil; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; /** - * @author Luzien + * @author Luzien, w4terbomb */ @AIName("warrior_preceptor") public class WarriorPreceptorAI extends AggressiveNpcAI { @@ -74,19 +69,10 @@ private void cancelTask() { private void startSkillEvent() { PacketSendUtility.broadcastMessage(getOwner(), 1500207); - SkillEngine.getInstance().getSkill(getOwner(), 19595, 10, getTargetPlayer()).useNoAnimationSkill(); + getOwner().queueSkill(19596, 15, 0, NpcSkillTargetAttribute.RANDOM); ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) - SkillEngine.getInstance().getSkill(getOwner(), 19596, 15, getOwner()).useNoAnimationSkill(); + getOwner().queueSkill(19596, 15, 0); }, 6000); } - - private Player getTargetPlayer() { - List players = new ArrayList<>(); - getKnownList().forEachPlayer(player -> { - if (!player.isDead() && PositionUtil.isInRange(player, getOwner(), 15)) - players.add(player); - }); - return Rnd.get(players); - } } diff --git a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java index 8e01607184..bcd166cd28 100644 --- a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java +++ b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java @@ -34,7 +34,7 @@ public class EmpyreanCrucibleInstance extends CrucibleInstance { private final List npcs = new ArrayList<>(); - private final List empyreanStage = new ArrayList<>(); + private List empyreanStage = new ArrayList<>(); private byte stage; private boolean isDoneStage4, isDoneStage6Round2, isDoneStage6Round1; @@ -44,7 +44,7 @@ public EmpyreanCrucibleInstance(WorldMapInstance instance) { private class EmpyreanStage { - private final List stageNpcs; + private List stageNpcs; private EmpyreanStage(List npcs) { this.stageNpcs = npcs; @@ -190,13 +190,13 @@ public void onDie(Npc npc) { } case 217484, 217493 -> { setStage(StageType.PASS_GROUP_STAGE_1, 0); - sp(217756, 342.65106f, 357.4013f, 96.09094f, (byte) 0); - sp(217756, 349.07376f, 357.5898f, 96.090965f, (byte) 0); - sp(217756, 345.69272f, 359.40958f, 96.09094f, (byte) 0); - sp(217756, 342.59192f, 353.73386f, 96.090965f, (byte) 0); - sp(217756, 342.6043f, 360.8932f, 96.09093f, (byte) 0); - sp(217756, 345.69318f, 355.56677f, 96.09094f, (byte) 0); - sp(799568, 345.25f, 349.24f, 96.09097f, (byte) 0); + sp(217756, 342.65106f, 357.4013f, 96.09094f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(217756, 349.07376f, 357.5898f, 96.090965f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(217756, 345.69272f, 359.40958f, 96.09094f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(217756, 342.59192f, 353.73386f, 96.090965f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(217756, 342.6043f, 360.8932f, 96.09093f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(217756, 345.69318f, 355.56677f, 96.09094f, (byte) 0); // S1_ResurBox1Dark_55_n + sp(799568, 345.25f, 349.24f, 96.09097f, (byte) 0); // IDArena_2nd_MC_Start npc.getController().delete(); sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_INSTANCE_COMPLETE_ROUND_IDARENA()); } @@ -218,7 +218,7 @@ public void onDie(Npc npc) { if (stageType == StageType.START_STAGE_2_ROUND_1 && IntStream.of(217502, 217504).allMatch(i -> getNpcs(i).isEmpty())) startStage2Round2(); } - case 217504 -> { + case 217504 -> { // S2_RatmanScout_55_Ae npc.getController().delete(); switch (stageType) { case START_STAGE_2_ROUND_1 -> { @@ -262,8 +262,8 @@ public void onDie(Npc npc) { case 217500, 217509 -> { npc.getController().delete(); setStage(StageType.START_STAGE_2_ROUND_4, 2000); - sp(217505, 341.95056f, 334.77692f, 96.09093f, (byte) 0, 6000); - sp(217508, 344.17813f, 334.42462f, 96.090935f, (byte) 0, 6000); + sp(217505, 341.95056f, 334.77692f, 96.09093f, (byte) 0, 6000); // S2_LycanShaman_55_Ae + sp(217508, 344.17813f, 334.42462f, 96.090935f, (byte) 0, 6000); // S2_LycanFighter_55_Ae } case 217505 -> { npc.getController().delete(); @@ -279,7 +279,7 @@ public void onDie(Npc npc) { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_2, 0); ThreadPoolManager.getInstance().schedule(() -> { - sp(217737, 334.49496f, 349.2322f, 96.090935f, (byte) 0); + sp(217737, 334.49496f, 349.2322f, 96.090935f, (byte) 0); // S2_SAAM1_55_n setStage(StageType.START_BONUS_STAGE_2, 0); ThreadPoolManager.getInstance().schedule(() -> { if (getNpc(217737) != null) { @@ -287,7 +287,7 @@ public void onDie(Npc npc) { ThreadPoolManager.getInstance().schedule(() -> { if (getNpc(217737) != null) { deleteAliveNpcs(217737); - sp(799569, 345.25f, 349.24f, 96.09097f, (byte) 0); + sp(799569, 345.25f, 349.24f, 96.09097f, (byte) 0); // IDArena_3rd_MC_Start } }, 30000); } @@ -302,55 +302,55 @@ public void onDie(Npc npc) { npc.getController().delete(); if (IntStream.of(217511, 217512, 217513, 217514).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_2, 2000); - sp(217515, 336.32092f, 345.0251f, 96.090935f, (byte) 0, 6000); - sp(217516, 347.16144f, 361.89084f, 96.09093f, (byte) 0, 6000); - sp(217518, 352.77557f, 360.97845f, 96.09091f, (byte) 0, 6000); - sp(217518, 340.2231f, 351.10208f, 96.09098f, (byte) 0, 6000); - sp(217517, 354.132f, 337.14255f, 96.09089f, (byte) 0, 6000); - sp(217517, 353.7888f, 354.4324f, 96.091064f, (byte) 0, 6000); - sp(217516, 350.0108f, 342.09482f, 96.090935f, (byte) 0, 6000); - sp(217515, 349.16327f, 335.63864f, 96.09095f, (byte) 0, 6000); - sp(217517, 341.23633f, 344.55603f, 96.09096f, (byte) 0, 6000); - sp(217518, 354.66513f, 343.31537f, 96.091095f, (byte) 0, 6000); - sp(217516, 334.60898f, 352.01447f, 96.09095f, (byte) 0, 6000); - sp(217515, 348.87338f, 354.90146f, 96.09096f, (byte) 0, 6000); + sp(217515, 336.32092f, 345.0251f, 96.090935f, (byte) 0, 6000); // S3_ElementalEarth_2nd_55_Ae + sp(217516, 347.16144f, 361.89084f, 96.09093f, (byte) 0, 6000); // S3_ElementalFire_2nd_55_Ae + sp(217517, 354.132f, 337.14255f, 96.09089f, (byte) 0, 6000); // S3_ElementalWater_2nd_55_Ae + sp(217518, 352.77557f, 360.97845f, 96.09091f, (byte) 0, 6000); // S3_ElementalAir_2nd_55_Ae + sp(217515, 349.16327f, 335.63864f, 96.09095f, (byte) 0, 6000); // S3_ElementalEarth_2nd_55_Ae + sp(217516, 350.0108f, 342.09482f, 96.090935f, (byte) 0, 6000); // S3_ElementalFire_2nd_55_Ae + sp(217517, 353.7888f, 354.4324f, 96.091064f, (byte) 0, 6000); // S3_ElementalWater_2nd_55_Ae + sp(217518, 340.2231f, 351.10208f, 96.09098f, (byte) 0, 6000); // S3_ElementalAir_2nd_55_Ae + sp(217515, 348.87338f, 354.90146f, 96.09096f, (byte) 0, 6000); // S3_ElementalEarth_2nd_55_Ae + sp(217516, 334.60898f, 352.01447f, 96.09095f, (byte) 0, 6000); // S3_ElementalFire_2nd_55_Ae + sp(217517, 341.23633f, 344.55603f, 96.09096f, (byte) 0, 6000); // S3_ElementalWater_2nd_55_Ae + sp(217518, 354.66513f, 343.31537f, 96.091095f, (byte) 0, 6000); // S3_ElementalAir_2nd_55_Ae } } case 217515, 217516, 217517, 217518 -> { npc.getController().delete(); if (IntStream.of(217515, 217516, 217517, 217518).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_3, 2000); - sp(217519, 351.08026f, 341.61298f, 96.090935f, (byte) 0, 6000); - sp(217521, 333.4532f, 354.7357f, 96.09094f, (byte) 0, 6000); - sp(217522, 342.1805f, 360.534f, 96.09092f, (byte) 0, 6000); - sp(217520, 334.2686f, 342.60797f, 96.09091f, (byte) 0, 6000); - sp(217522, 350.34537f, 356.18558f, 96.09094f, (byte) 0, 6000); - sp(217520, 343.7485f, 336.2869f, 96.09092f, (byte) 0, 6000); + sp(217519, 351.08026f, 341.61298f, 96.090935f, (byte) 0, 6000); // S3_ElementalEarth_3rd_55_Ae + sp(217521, 333.4532f, 354.7357f, 96.09094f, (byte) 0, 6000); // S3_ElementalWater_3rd_55_Ae + sp(217522, 342.1805f, 360.534f, 96.09092f, (byte) 0, 6000); // S3_ElementalAir_3rd_55_Ae + sp(217520, 334.2686f, 342.60797f, 96.09091f, (byte) 0, 6000); // S3_ElementalFire_3rd_55_Ae + sp(217522, 350.34537f, 356.18558f, 96.09094f, (byte) 0, 6000); // S3_ElementalAir_3rd_55_Ae + sp(217520, 343.7485f, 336.2869f, 96.09092f, (byte) 0, 6000); // S3_ElementalFire_3rd_55_Ae } } case 217519, 217520, 217521, 217522 -> { npc.getController().delete(); if (IntStream.of(217519, 217520, 217521, 217522).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_4, 2000); - sp(217524, 349.66446f, 341.4752f, 96.090965f, (byte) 0, 6000); - sp(217525, 338.32742f, 356.29636f, 96.090935f, (byte) 0, 6000); - sp(217526, 349.31473f, 358.43762f, 96.09096f, (byte) 0, 6000); - sp(217523, 338.73138f, 342.35876f, 96.09094f, (byte) 0, 6000); + sp(217524, 349.66446f, 341.4752f, 96.090965f, (byte) 0, 6000); // S3_ElementalFire_4th_55_Ae + sp(217525, 338.32742f, 356.29636f, 96.090935f, (byte) 0, 6000); // S3_ElementalWater_4th_55_Ae + sp(217526, 349.31473f, 358.43762f, 96.09096f, (byte) 0, 6000); // S3_ElementalAir_4th_55_Ae + sp(217523, 338.73138f, 342.35876f, 96.09094f, (byte) 0, 6000); // S3_ElementalEarth_4th_55_Ae } } case 217523, 217524, 217525, 217526 -> { npc.getController().delete(); if (IntStream.of(217523, 217524, 217525, 217526).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_5, 2000); - sp(217527, 335.37524f, 346.34567f, 96.09094f, (byte) 0, 6000); - sp(217528, 335.36105f, 353.16922f, 96.09094f, (byte) 0, 6000); + sp(217527, 335.37524f, 346.34567f, 96.09094f, (byte) 0, 6000); // S3_MagmaElemental_Boss_55_Ah + sp(217528, 335.36105f, 353.16922f, 96.09094f, (byte) 0, 6000); // S3_TempestElemental_Boss_55_Ah } } case 217527, 217528 -> { npc.getController().delete(); if (IntStream.of(217527, 217528).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_BONUS_STAGE_3, 7000); - sp(217744, 342.45215f, 349.339f, 96.09096f, (byte) 0, 7000); + sp(217744, 342.45215f, 349.339f, 96.09096f, (byte) 0, 7000); // S3_Elemeltal_CTRL ThreadPoolManager.getInstance().schedule(this::startBonusStage3, 39000); } } @@ -359,8 +359,8 @@ public void onDie(Npc npc) { switch (stageType) { case START_STAGE_4_ROUND_1 -> { if (IntStream.of(217557, 217559, 217562).allMatch(id -> getNpcs(id).isEmpty())) { - sp(217558, 330.27792f, 339.2779f, 96.09093f, (byte) 6); - sp(217558, 328.08972f, 346.3553f, 96.090904f, (byte) 1); + sp(217558, 330.27792f, 339.2779f, 96.09093f, (byte) 6); // S5_Lizard_As_55_Ae + sp(217558, 328.08972f, 346.3553f, 96.090904f, (byte) 1); // S5_Lizard_As_55_Ae } } case START_STAGE_4_ROUND_2 -> { @@ -376,14 +376,14 @@ public void onDie(Npc npc) { case START_STAGE_4_ROUND_1 -> { if (getNpcs(217558).isEmpty()) { setStage(StageType.START_STAGE_4_ROUND_2, 2000); - sp(217559, 330.53665f, 349.23523f, 96.09093f, (byte) 0, 6000); - sp(217562, 334.89508f, 363.78442f, 96.090904f, (byte) 105, 6000); - sp(217560, 334.61942f, 334.80353f, 96.090904f, (byte) 15, 6000); + sp(217559, 330.53665f, 349.23523f, 96.09093f, (byte) 0, 6000); // S5_Lizard_Pr_55_Ae + sp(217562, 334.89508f, 363.78442f, 96.090904f, (byte) 105, 6000); // S5_Naga_Wi_55_Ae + sp(217560, 334.61942f, 334.80353f, 96.090904f, (byte) 15, 6000); // S5_Naga_Fi_55_Ae ThreadPoolManager.getInstance().schedule(() -> { List round = new ArrayList<>(); - round.add(sp(217557, 357.24625f, 338.30093f, 96.09104f, (byte) 65)); - round.add(sp(217558, 357.20663f, 359.28714f, 96.091064f, (byte) 75)); - round.add(sp(217561, 365.109f, 349.1218f, 96.09114f, (byte) 60)); + round.add(sp(217557, 357.24625f, 338.30093f, 96.09104f, (byte) 65)); // S5_Lizard_Fi_55_Ae + round.add(sp(217558, 357.20663f, 359.28714f, 96.091064f, (byte) 75)); // S5_Lizard_As_55_Ae + round.add(sp(217561, 365.109f, 349.1218f, 96.09114f, (byte) 60)); // S5_Naga_Ch_55_Ae empyreanStage.add(new EmpyreanStage(round)); }, 47000); } @@ -398,25 +398,25 @@ public void onDie(Npc npc) { npc.getController().delete(); if (es != null && !es.containsNpcs()) { setStage(StageType.START_STAGE_4_ROUND_4, 2000); - sp(217567, 345.73895f, 349.49786f, 96.09097f, (byte) 0, 6000); + sp(217567, 345.73895f, 349.49786f, 96.09097f, (byte) 0, 6000); // S5_Drakan_Fi_Boss_55_Ah } } case 217564, 217565, 217560, 217745, 217746, 217747, 217748, 205413, 205414, 217576, 217577 -> npc.getController().delete(); case 217567 -> { npc.getController().delete(); setStage(StageType.START_STAGE_4_ROUND_5, 2000); - sp(217653, 327.76917f, 349.26215f, 96.09092f, (byte) 0, 6000); - sp(217651, 364.8972f, 349.25653f, 96.09114f, (byte) 60, 18000); - sp(217652, 361.1795f, 339.99252f, 96.09112f, (byte) 50, 35000); - sp(217653, 354.4119f, 333.6749f, 96.09091f, (byte) 40, 54000); - sp(217651, 331.61502f, 358.4374f, 96.09091f, (byte) 110, 69000); - sp(217652, 338.38858f, 364.91507f, 96.090904f, (byte) 100, 83000); - sp(217651, 346.39847f, 368.19427f, 96.090904f, (byte) 90, 99000); - sp(217652, 353.92606f, 364.92636f, 96.090904f, (byte) 80, 110000); - sp(217653, 361.13452f, 358.90424f, 96.091156f, (byte) 65, 130000); - sp(217652, 346.34402f, 329.9449f, 96.09091f, (byte) 30, 142000); + sp(217653, 327.76917f, 349.26215f, 96.09092f, (byte) 0, 6000); // S5_Drop_Drakan_Wi_55_Ae + sp(217651, 364.8972f, 349.25653f, 96.09114f, (byte) 60, 18000); // S5_Drop_Drakan_Fi_55_Ae + sp(217652, 361.1795f, 339.99252f, 96.09112f, (byte) 50, 35000); // S5_Drop_Drakan_As_55_Ae + sp(217653, 354.4119f, 333.6749f, 96.09091f, (byte) 40, 54000); // S5_Drop_Drakan_Wi_55_Ae + sp(217651, 331.61502f, 358.4374f, 96.09091f, (byte) 110, 69000); // S5_Drop_Drakan_Fi_55_Ae + sp(217652, 338.38858f, 364.91507f, 96.090904f, (byte) 100, 83000); // S5_Drop_Drakan_As_55_Ae + sp(217651, 346.39847f, 368.19427f, 96.090904f, (byte) 90, 99000); // S5_Drop_Drakan_Fi_55_Ae + sp(217652, 353.92606f, 364.92636f, 96.090904f, (byte) 80, 110000); // S5_Drop_Drakan_As_55_Ae + sp(217653, 361.13452f, 358.90424f, 96.091156f, (byte) 65, 130000); // S5_Drop_Drakan_Wi_55_Ae + sp(217652, 346.34402f, 329.9449f, 96.09091f, (byte) 30, 142000); // S5_Drop_Drakan_As_55_Ae ThreadPoolManager.getInstance().schedule(() -> { - sp(217653, 331.53894f, 339.8832f, 96.09091f, (byte) 10); + sp(217653, 331.53894f, 339.8832f, 96.09091f, (byte) 10); // S5_Drop_Drakan_Wi_55_Ae isDoneStage4 = true; }, 174000); } @@ -424,7 +424,7 @@ public void onDie(Npc npc) { npc.getController().delete(); if (isDoneStage4 && IntStream.of(217651, 217652, 217653).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.PASS_GROUP_STAGE_4, 0); - sp(217749, 340.59f, 349.32166f, 96.09096f, (byte) 0, 6000); + sp(217749, 340.59f, 349.32166f, 96.09096f, (byte) 0, 6000); // S4_Draky_CTRL setStage(StageType.START_BONUS_STAGE_4, 6000); ThreadPoolManager.getInstance().schedule(this::startBonusStage4, 33000); } @@ -432,158 +432,158 @@ public void onDie(Npc npc) { case 217547, 217548, 217549 -> { npc.getController().delete(); if (IntStream.of(217547, 217548, 217549).allMatch(i -> getNpcs(i).isEmpty())) { - sp(217550, 1266.293f, 778.3254f, 358.60574f, (byte) 30, 4000); - sp(217545, 1254.261f, 778.3817f, 358.6056f, (byte) 30, 4000); + sp(217550, 1266.293f, 778.3254f, 358.60574f, (byte) 30, 4000); // S4_ShulackPr_55_Ae + sp(217545, 1254.261f, 778.3817f, 358.6056f, (byte) 30, 4000); // S4_ShulackFi_55_Ae } } case 217545, 217550 -> { npc.getController().delete(); if (IntStream.of(217545, 217550).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_5_ROUND_2, 2000); - sp(217552, 1246.0197f, 788.8341f, 358.60556f, (byte) 11, 6000); + sp(217552, 1246.0197f, 788.8341f, 358.60556f, (byte) 11, 6000); // S4_ShulackBartenderNmd_55_Ah } } case 217552 -> { npc.getController().delete(); setStage(StageType.START_STAGE_5_ROUND_3, 2000); - sp(700527, 1253.3123f, 789.38385f, 358.60562f, (byte) 119); - sp(700528, 1260.2015f, 800.14886f, 358.6056f, (byte) 16); - sp(217553, 1259.4706f, 812.30505f, 358.6056f, (byte) 30, 6000); + sp(700527, 1253.3123f, 789.38385f, 358.60562f, (byte) 119); // IDshulackship_Lever_A + sp(700528, 1260.2015f, 800.14886f, 358.6056f, (byte) 16); // IDshulackship_Lever_B + sp(217553, 1259.4706f, 812.30505f, 358.6056f, (byte) 30, 6000); // S4_ManduriGiantNmd_55_Ah } case 217553 -> { npc.getController().delete(); deleteAliveNpcs(700527, 700528); - sp(281111, 1246.4855f, 796.90735f, 358.6056f, (byte) 0); - sp(281110, 1259.5508f, 784.5548f, 358.60562f, (byte) 0); - sp(281112, 1276.6561f, 812.5499f, 358.60565f, (byte) 0); - sp(281322, 1243.2113f, 813.0927f, 358.60565f, (byte) 0); - sp(281109, 1272.9266f, 797.1055f, 358.60562f, (byte) 0); - sp(281113, 1275.894f, 780.51544f, 358.60565f, (byte) 0); - sp(281108, 1260.003f, 810.555f, 358.6056f, (byte) 0); - sp(281114, 1244.3293f, 780.4284f, 358.60562f, (byte) 0); + sp(281111, 1246.4855f, 796.90735f, 358.6056f, (byte) 0); // BIDShulack_EngineerNozzleD_45_An + sp(281110, 1259.5508f, 784.5548f, 358.60562f, (byte) 0); // BIDShulack_EngineerNozzleC_45_An + sp(281112, 1276.6561f, 812.5499f, 358.60565f, (byte) 0); // BIDShulack_EngineerNozzleE_45_An + sp(281322, 1243.2113f, 813.0927f, 358.60565f, (byte) 0); // BIDShulack_EngineerNozzleH_45_An + sp(281109, 1272.9266f, 797.1055f, 358.60562f, (byte) 0); // BIDShulack_EngineerNozzleB_45_An + sp(281113, 1275.894f, 780.51544f, 358.60565f, (byte) 0); // BIDShulack_EngineerNozzleF_45_An + sp(281108, 1260.003f, 810.555f, 358.6056f, (byte) 0); // BIDShulack_EngineerNozzleA_45_An + sp(281114, 1244.3293f, 780.4284f, 358.60562f, (byte) 0); // BIDShulack_EngineerNozzleG_45_An setStage(StageType.START_STAGE_5_ROUND_4, 2000); - sp(217554, 1243.1877f, 796.79553f, 358.6056f, (byte) 0, 6000); + sp(217554, 1243.1877f, 796.79553f, 358.6056f, (byte) 0, 6000); // S4_ShulackEngineerNmd_55_Ah } case 217554 -> { npc.getController().delete(); deleteAliveNpcs(281108, 281109, 281110, 281111, 281112, 281113, 281114, 281322); setStage(StageType.START_STAGE_5_ROUND_5, 2000); - sp(217556, 1259.8387f, 785.6266f, 358.60562f, (byte) 30, 6000); - sp(281191, 1261.8f, 804.5f, 358.7f, (byte) 0, 6000); - sp(281192, 1267.6f, 793.9f, 358.7f, (byte) 0, 6000); - sp(281193, 1257.4f, 787.9f, 358.7f, (byte) 0, 6000); - sp(281194, 1251.3f, 798.6f, 358.7f, (byte) 0, 6000); + sp(217556, 1259.8387f, 785.6266f, 358.60562f, (byte) 30, 6000); // S4_ShulackCaptainNmd_55_Ah + sp(281191, 1261.8f, 804.5f, 358.7f, (byte) 0, 6000); // BIDShulack_CaptainStigmaStoneA_45_n + sp(281192, 1267.6f, 793.9f, 358.7f, (byte) 0, 6000); // BIDShulack_CaptainStigmaStoneB_45_n + sp(281193, 1257.4f, 787.9f, 358.7f, (byte) 0, 6000); // BIDShulack_CaptainStigmaStoneC_45_n + sp(281194, 1251.3f, 798.6f, 358.7f, (byte) 0, 6000); // BIDShulack_CaptainStigmaStoneD_45_n } case 217556 -> { npc.getController().delete(); deleteAliveNpcs(281191, 281192, 281193, 281194); setStage(StageType.PASS_GROUP_STAGE_5, 0); - sp(205339, 1260.1465f, 795.07495f, 358.60562f, (byte) 30); + sp(205339, 1260.1465f, 795.07495f, 358.60562f, (byte) 30); // IDArena_5th_MC_End } case 217568 -> { - sp(205413, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); + sp(205413, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); // S6_NPC_Graveknight_55_Ae npc.getController().delete(); if (isDoneStage6Round1 && getNpcs(217568).isEmpty()) { setStage(StageType.START_STAGE_6_ROUND_2, 2000); - sp(217570, 1629.4642f, 154.8044f, 126f, (byte) 30, 6000); - sp(217569, 1643.7776f, 161.63562f, 126f, (byte) 46, 6000); - sp(217569, 1639.7843f, 142.09268f, 126f, (byte) 40, 6000); + sp(217570, 1629.4642f, 154.8044f, 126f, (byte) 30, 6000); // S6_Zombie_55_Ae + sp(217569, 1643.7776f, 161.63562f, 126f, (byte) 46, 6000); // S6_LichEquip_55_Ae + sp(217569, 1639.7843f, 142.09268f, 126f, (byte) 40, 6000); // S6_LichEquip_55_Ae ThreadPoolManager.getInstance().schedule(() -> { - sp(217569, 1614.6377f, 164.04999f, 126.00113f, (byte) 3); - sp(217569, 1625.8965f, 135.62509f, 126f, (byte) 30); + sp(217569, 1614.6377f, 164.04999f, 126.00113f, (byte) 3); // S6_LichEquip_55_Ae + sp(217569, 1625.8965f, 135.62509f, 126f, (byte) 30); // S6_LichEquip_55_Ae isDoneStage6Round2 = true; }, 12000); } } case 217570 -> { for (int i = 0; i < 5; i++) - sp(211984, npc.getX() + Rnd.get(-2, 2), npc.getY() + Rnd.get(-2, 2), npc.getZ(), npc.getHeading()); + sp(211984, npc.getX() + Rnd.get(-2, 2), npc.getY() + Rnd.get(-2, 2), npc.getZ(), npc.getHeading()); // Clodworm_41_An } case 217569 -> { sp(205414, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); if (stageType == StageType.START_STAGE_6_ROUND_2 && isDoneStage6Round2 && IntStream.of(217569, 217570).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_6_ROUND_3, 2000); - sp(217572, 1629.5837f, 138.38435f, 126f, (byte) 30, 9000); - sp(217569, 1635.01535f, 150.01535f, 126f, (byte) 45, 6000); - sp(217569, 1638.3817f, 152.84074f, 126f, (byte) 45, 6000); + sp(217572, 1629.5837f, 138.38435f, 126f, (byte) 30, 9000); // S6_DeathNight_Live_55_Ah + sp(217569, 1635.01535f, 150.01535f, 126f, (byte) 45, 6000); // S6_LichEquip_55_Ae + sp(217569, 1638.3817f, 152.84074f, 126f, (byte) 45, 6000); // S6_LichEquip_55_Ae } } case 217572 -> { npc.getController().delete(); setStage(StageType.START_STAGE_6_ROUND_4, 2000); - sp(217573, 1634.7891f, 141.99077f, 126f, (byte) 0); + sp(217573, 1634.7891f, 141.99077f, 126f, (byte) 0); // S6_Deathknight_Ghost_55_Ah_01 } case 217573 -> { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_6, 0); - sp(217750, 1624.1908f, 155.16148f, 126f, (byte) 0, 8000); + sp(217750, 1624.1908f, 155.16148f, 126f, (byte) 0, 8000); // S6_Ghost_55_Ah setStage(StageType.START_BONUS_STAGE_6, 8000); } - case 217750 -> sp(205340, 1625.08f, 159.15f, 126f, (byte) 0); + case 217750 -> sp(205340, 1625.08f, 159.15f, 126f, (byte) 0); // IDArena_6th_MC_End case 217582, 217578 -> { setStage(StageType.START_STAGE_7_ROUND_2, 2000); - sp(217579, 1794.81f, 779.53925f, 469.35016f, (byte) 40, 6000); + sp(217579, 1794.81f, 779.53925f, 469.35016f, (byte) 40, 6000); // S7_MasterL_Sc_55_Ah } case 217579, 217583 -> { setStage(StageType.START_STAGE_7_ROUND_3, 2000); Race race = getRegisteredTeamRace(); switch (race) { - case ASMODIANS -> sp(217580, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); - case ELYOS -> sp(217584, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); + case ASMODIANS -> sp(217584, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); // S7_MasterD_Ma_55_Ah + case ELYOS -> sp(217580, 1775.6254f, 811.43225f, 469.35022f, (byte) 100, 6000); // S7_MasterL_Ma_55_Ah } } case 217580, 217584 -> { setStage(StageType.START_STAGE_7_ROUND_4, 2000); Race race = getRegisteredTeamRace(); switch (race) { - case ASMODIANS -> sp(217581, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); - case ELYOS -> sp(217585, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); + case ASMODIANS -> sp(217585, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); // S7_MasterD_Pr_55_Ah + case ELYOS -> sp(217581, 1775.716f, 779.630f, 469.564f, (byte) 20, 6000); // S7_MasterL_Pr_55_Ah } } case 217581, 217585 -> { setStage(StageType.START_STAGE_7_ROUND_5, 2000); Race race = getRegisteredTeamRace(); switch (race) { - case ASMODIANS -> sp(217586, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); - case ELYOS -> sp(217587, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); + case ASMODIANS -> sp(217587, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); // S7_Stigma_MasterD_Boss_55_Ah + case ELYOS -> sp(217586, 1773.194f, 796.537f, 469.350f, (byte) 0, 6000); // S7_Stigma_MasterL_Boss_55_Ah } } case 217586, 217587 -> { setStage(StageType.PASS_GROUP_STAGE_7, 0); - sp(217753, 1782.881f, 800.114f, 469.420f, (byte) 0, 2000); + sp(217753, 1782.881f, 800.114f, 469.420f, (byte) 0, 2000); // S7_BookBox_55_n sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S7_BookBox_01()); - sp(205341, 1781.610f, 796.920f, 469.350f, (byte) 0, 2000); + sp(205341, 1781.610f, 796.920f, 469.350f, (byte) 0, 2000); // IDArena_7th_MC_End } case 217588, 217589 -> { setStage(StageType.START_STAGE_8_ROUND_2, 2000); - sp(217590, 1764.377f, 1761.510f, 303.695f, (byte) 0, 6000); + sp(217590, 1764.377f, 1761.510f, 303.695f, (byte) 0, 6000); // S8_Seiren_Queen_55_Ah } case 217590 -> { setStage(StageType.START_STAGE_8_ROUND_3, 2000); - sp(217591, 1776.946f, 1749.255f, 303.696f, (byte) 30, 6000); + sp(217591, 1776.946f, 1749.255f, 303.696f, (byte) 30, 6000); // S8_AkanNamed_50_Ah } case 217591 -> { setStage(StageType.START_STAGE_8_ROUND_4, 2000); - sp(217592, 1790.693f, 1761.911f, 303.877f, (byte) 60, 6000); + sp(217592, 1790.693f, 1761.911f, 303.877f, (byte) 60, 6000); // S8_TestResult_55_Ah } case 217592 -> { setStage(StageType.START_STAGE_8_ROUND_5, 2000); - sp(280790, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); - sp(217593, 1777.065f, 1763.706f, 303.695f, (byte) 90, 6000); + sp(280790, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); // BLF3_NM_PerfectManSum_45_Ae + sp(217593, 1777.065f, 1763.706f, 303.695f, (byte) 90, 6000); // S8_TestResult_Boss_55_Ah } case 217593 -> { setStage(StageType.PASS_GROUP_STAGE_8, 0); - sp(205342, 1776.757f, 1764.624f, 303.695f, (byte) 90); + sp(205342, 1776.757f, 1764.624f, 303.695f, (byte) 90); // IDArena_8th_MC_End } case 217594 -> { setStage(StageType.START_STAGE_9_ROUND_2, 2000); - sp(217595, 1322.311f, 1741.508f, 316.349f, (byte) 65, 6000); + sp(217595, 1322.311f, 1741.508f, 316.349f, (byte) 65, 6000); // S9_Condor_Gi_55_Ah } case 217595 -> { setStage(StageType.START_STAGE_9_ROUND_3, 2000); - sp(217596, 1308.038f, 1729.718f, 315.996f, (byte) 36, 6000); - sp(217597, 1302.290f, 1745.471f, 316.092f, (byte) 96, 6000); + sp(217596, 1308.038f, 1729.718f, 315.996f, (byte) 36, 6000); // S9_Manduri_Gi_55_Ah + sp(217597, 1302.290f, 1745.471f, 316.092f, (byte) 96, 6000); // S9_Frillfaimam_Gi_55_Ah } case 217596, 217597 -> { Npc counterpart = getNpc(npc.getNpcId() == 217596 ? 217597 : 217596); @@ -592,62 +592,62 @@ public void onDie(Npc npc) { npc.getController().delete(); if (IntStream.of(217596, 217597).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_9_ROUND_4, 2000); - sp(217598, 1311.5238f, 1755.2079f, 317.1f, (byte) 97, 2000); + sp(217598, 1311.5238f, 1755.2079f, 317.1f, (byte) 97, 2000); // S9_Shellizard_Gi_55_Ah } } case 217598 -> { npc.getController().delete(); setStage(StageType.START_STAGE_9_ROUND_5, 2000); - sp(217599, 1304.2659f, 1722.2467f, 316.5f, (byte) 23, 2000); + sp(217599, 1304.2659f, 1722.2467f, 316.5f, (byte) 23, 2000); // S9_Chimera_Boss_55_Ah } case 217599 -> { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_9, 0); - sp(205343, 1304.2659f, 1722.2467f, 316.5f, (byte) 8, 2000); + sp(205343, 1304.2659f, 1722.2467f, 316.5f, (byte) 8, 2000); // IDArena_9th_MC_End } case 217600, 217601, 217602 -> { npc.getController().delete(); if (IntStream.of(217600, 217601, 217602).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_10_ROUND_2, 2000); - sp(217603, 1744.6332f, 1280.0349f, 394.3f, (byte) 9, 2000); - sp(217604, 1756.2661f, 1305.561f, 394.3f, (byte) 97, 6000); - sp(217605, 1763.1177f, 1268.2404f, 394.3f, (byte) 22, 10000); - sp(217606, 1765.2681f, 1306.5621f, 394.3f, (byte) 89, 14000); + sp(217603, 1744.6332f, 1280.0349f, 394.3f, (byte) 9, 2000); // S10_Drakan_Fi_High_55_Ae + sp(217604, 1756.2661f, 1305.561f, 394.3f, (byte) 97, 6000); // S10_Drakan_Sc_High_55_Ae + sp(217605, 1763.1177f, 1268.2404f, 394.3f, (byte) 22, 10000); // S10_Drakan_Ma_High_55_Ae + sp(217606, 1765.2681f, 1306.5621f, 394.3f, (byte) 89, 14000); // S10_Drakan_Cl_High_55_Ae } } case 217603, 217604, 217605, 217606 -> { npc.getController().delete(); if (IntStream.of(217603, 217604, 217605, 217606).allMatch(i -> getNpcs(i).isEmpty())) { setStage(StageType.START_STAGE_10_ROUND_3, 2000); - sp(700441, 1742.39f, 1289.59f, 394.237f, (byte) 68, 2000); - sp(700441, 1782.32f, 1272.74f, 394.237f, (byte) 94, 2000); - sp(217607, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); + sp(700441, 1742.39f, 1289.59f, 394.237f, (byte) 68, 2000); // BIDLF1_WaterGolem1_Switch3_50_n + sp(700441, 1782.32f, 1272.74f, 394.237f, (byte) 94, 2000); // BIDLF1_WaterGolem1_Switch3_50_n + sp(217607, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); // S10_WaterGolem_55_Ah } } case 217607 -> { npc.getController().delete(); deleteAliveNpcs(700441); setStage(StageType.START_STAGE_10_ROUND_4, 2000); - sp(217608, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); + sp(217608, 1769.9637f, 1297.393f, 394.237f, (byte) 82, 2000); // S10_Dragon_55_Ah } case 217608 -> { npc.getController().delete(); setStage(StageType.START_STAGE_10_ROUND_5, 2000); - sp(217609, 1765.6692f, 1288.092f, 394.3f, (byte) 82, 2000); + sp(217609, 1765.6692f, 1288.092f, 394.3f, (byte) 82, 2000); // SFinal_Immotal_Boss_55_Ah } case 217609 -> { npc.getController().delete(); setStage(StageType.PASS_GROUP_STAGE_10, 0); - sp(205344, 1764.6368f, 1288.831f, 394.23755f, (byte) 77); + sp(205344, 1764.6368f, 1288.831f, 394.23755f, (byte) 77); // IDArena_10th_MC_End } } } private void startBonusStage3() { - sp(217742, 360.76f, 349.42f, 96.1f, (byte) 0); - sp(217743, 346.27f, 363.35f, 96.1f, (byte) 11); - sp(217740, 332.12f, 349.22f, 96.1f, (byte) 0); - sp(217741, 346.42f, 335.1f, 96.1f, (byte) 87); + sp(217742, 360.76f, 349.42f, 96.1f, (byte) 0); // S3_Elemeltal_Fire_55_Ah + sp(217743, 346.27f, 363.35f, 96.1f, (byte) 11); // S3_Elemeltal_Wind_55_Ah + sp(217740, 332.12f, 349.22f, 96.1f, (byte) 0); // S3_Elemeltal_Earth_55_Ah + sp(217741, 346.42f, 335.1f, 96.1f, (byte) 87); // S3_Elemeltal_Warter_55_Ah ThreadPoolManager.getInstance().schedule(() -> { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_01()); ThreadPoolManager.getInstance().schedule(() -> { @@ -656,8 +656,8 @@ private void startBonusStage3() { sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_IDArena_S3_Bonus_03()); ThreadPoolManager.getInstance().schedule(() -> { deleteAliveNpcs(217740, 217741, 217742, 217743, 217744); - sp(205331, 345.25f, 349.24f, 96.09097f, (byte) 0); - sp(217735, 378.9331f, 346.74878f, 96.74762f, (byte) 0); + sp(205331, 345.25f, 349.24f, 96.09097f, (byte) 0); // IDArena_4th_MC_Start + sp(217735, 378.9331f, 346.74878f, 96.74762f, (byte) 0); // S3_ResurBox1_55_n sendMsg(SM_SYSTEM_MESSAGE.STR_MSG_S3_ResurBox1_01()); }, 5000); }, 5000); @@ -666,88 +666,89 @@ private void startBonusStage3() { } private void startBonusStage4() { - sp(217778, 346.2f, 366.85f, 96.55f, (byte) 1); - sp(217747, 346.2204f, 367.52002f, 96.090904f, (byte) 60, 3000); - sp(217747, 346.2204f, 367.52002f, 96.090904f, (byte) 60, 6000); - sp(217748, 346.65222f, 366.3634f, 96.09092f, (byte) 60, 9000); - sp(217748, 346.65222f, 366.3634f, 96.09092f, (byte) 60, 12000); - sp(217748, 345.7578f, 366.7986f, 96.09094f, (byte) 60, 15000); - sp(217748, 345.863f, 367.471f, 96.09094f, (byte) 60, 18000); - sp(217747, 346.9996f, 366.3978f, 96.09092f, (byte) 60, 21000); - sp(217746, 345.7872f, 366.3056f, 96.09092f, (byte) 60, 24000); - sp(217745, 346.4504f, 367.8004f, 96.09094f, (byte) 60, 27000); - sp(217747, 346.75043f, 367.467f, 96.09094f, (byte) 60, 30000); - sp(217747, 346.535f, 367.3128f, 96.090904f, (byte) 60, 33000); - sp(217747, 345.8452f, 367.2468f, 96.09092f, (byte) 60, 36000); - sp(217746, 345.428f, 366.2954f, 96.09093f, (byte) 60, 39000); - sp(217747, 346.71082f, 366.7156f, 96.090904f, (byte) 60, 42000); - sp(217747, 346.38782f, 366.1606f, 96.09093f, (byte) 60, 45000); - sp(217747, 345.36002f, 366.0284f, 96.09093f, (byte) 60, 48000); - sp(217747, 345.5378f, 366.1876f, 96.09092f, (byte) 60, 51000); - sp(217747, 346.5176f, 365.8592f, 96.09092f, (byte) 60, 54000); - sp(217745, 345.8434f, 367.8082f, 96.090904f, (byte) 60, 57000); - sp(217747, 345.297f, 366.3014f, 96.09093f, (byte) 60, 60000); - sp(217747, 346.0346f, 367.2426f, 96.090904f, (byte) 60, 63000); - sp(217747, 345.52863f, 366.62622f, 96.09092f, (byte) 60, 66000); - sp(217745, 345.80862f, 366.9388f, 96.09092f, (byte) 60, 69000); - sp(217747, 346.393f, 366.9766f, 96.090904f, (byte) 60, 72000); - sp(217746, 345.5726f, 366.3462f, 96.09092f, (byte) 60, 75000); - sp(217745, 345.2004f, 366.36902f, 96.09092f, (byte) 60, 78000); - sp(217746, 346.2528f, 365.9208f, 96.09093f, (byte) 60, 81000); - sp(217747, 346.0686f, 366.9096f, 96.090904f, (byte) 60, 84000); - sp(217746, 345.4606f, 367.14862f, 96.090904f, (byte) 60, 87000); - sp(217747, 345.8016f, 367.7212f, 96.090904f, (byte) 60, 90000); - sp(217747, 347.1144f, 365.875f, 96.09092f, (byte) 60, 93000); - sp(217747, 345.3226f, 367.7414f, 96.0909f, (byte) 60, 96000); - sp(217747, 345.4836f, 367.3886f, 96.090904f, (byte) 60, 99000); - sp(217747, 345.80862f, 366.0682f, 96.09092f, (byte) 60, 102000); + sp(217778, 346.2f, 366.85f, 96.55f, (byte) 1); // S4_Draky_CTRL_Gate + sp(217747, 346.2204f, 367.52002f, 96.090904f, (byte) 60, 3000); // S4_Draky_slow_55_An + sp(217747, 346.2204f, 367.52002f, 96.090904f, (byte) 60, 6000); // S4_Draky_slow_55_An + sp(217748, 346.65222f, 366.3634f, 96.09092f, (byte) 60, 9000); // S4_Draky_Epic_55_Ae + sp(217748, 346.65222f, 366.3634f, 96.09092f, (byte) 60, 12000); // S4_Draky_Epic_55_Ae + sp(217748, 345.7578f, 366.7986f, 96.09094f, (byte) 60, 15000); // S4_Draky_Epic_55_Ae + sp(217748, 345.863f, 367.471f, 96.09094f, (byte) 60, 18000); // S4_Draky_Epic_55_Ae + sp(217747, 346.9996f, 366.3978f, 96.09092f, (byte) 60, 21000); // S4_Draky_slow_55_An + sp(217746, 345.7872f, 366.3056f, 96.09092f, (byte) 60, 24000); // S4_Draky_Mid_55_An + sp(217745, 346.4504f, 367.8004f, 96.09094f, (byte) 60, 27000); // S4_Draky_Fast_55_An + sp(217747, 346.75043f, 367.467f, 96.09094f, (byte) 60, 30000); // S4_Draky_slow_55_An + sp(217747, 346.535f, 367.3128f, 96.090904f, (byte) 60, 33000); // S4_Draky_slow_55_An + sp(217747, 345.8452f, 367.2468f, 96.09092f, (byte) 60, 36000); // S4_Draky_slow_55_An + sp(217746, 345.428f, 366.2954f, 96.09093f, (byte) 60, 39000); // S4_Draky_Mid_55_An + sp(217747, 346.71082f, 366.7156f, 96.090904f, (byte) 60, 42000); // S4_Draky_slow_55_An + sp(217747, 346.38782f, 366.1606f, 96.09093f, (byte) 60, 45000); // S4_Draky_slow_55_An + sp(217747, 345.36002f, 366.0284f, 96.09093f, (byte) 60, 48000); // S4_Draky_slow_55_An + sp(217747, 345.5378f, 366.1876f, 96.09092f, (byte) 60, 51000); // S4_Draky_slow_55_An + sp(217747, 346.5176f, 365.8592f, 96.09092f, (byte) 60, 54000); // S4_Draky_slow_55_An + sp(217745, 345.8434f, 367.8082f, 96.090904f, (byte) 60, 57000); // S4_Draky_Fast_55_An + sp(217747, 345.297f, 366.3014f, 96.09093f, (byte) 60, 60000); // S4_Draky_slow_55_An + sp(217747, 346.0346f, 367.2426f, 96.090904f, (byte) 60, 63000); // S4_Draky_slow_55_An + sp(217747, 345.52863f, 366.62622f, 96.09092f, (byte) 60, 66000); // S4_Draky_slow_55_An + sp(217745, 345.80862f, 366.9388f, 96.09092f, (byte) 60, 69000); // S4_Draky_Fast_55_An + sp(217747, 346.393f, 366.9766f, 96.090904f, (byte) 60, 72000); // S4_Draky_slow_55_An + sp(217746, 345.5726f, 366.3462f, 96.09092f, (byte) 60, 75000); // S4_Draky_Mid_55_An + sp(217745, 345.2004f, 366.36902f, 96.09092f, (byte) 60, 78000); // S4_Draky_Fast_55_An + sp(217746, 346.2528f, 365.9208f, 96.09093f, (byte) 60, 81000); // S4_Draky_Mid_55_An + sp(217747, 346.0686f, 366.9096f, 96.090904f, (byte) 60, 84000); // S4_Draky_slow_55_An + sp(217746, 345.4606f, 367.14862f, 96.090904f, (byte) 60, 87000); // S4_Draky_Mid_55_An + sp(217747, 345.8016f, 367.7212f, 96.090904f, (byte) 60, 90000); // S4_Draky_slow_55_An + sp(217747, 347.1144f, 365.875f, 96.09092f, (byte) 60, 93000); // S4_Draky_slow_55_An + sp(217747, 345.3226f, 367.7414f, 96.0909f, (byte) 60, 96000); // S4_Draky_slow_55_An + sp(217747, 345.4836f, 367.3886f, 96.090904f, (byte) 60, 99000); // S4_Draky_slow_55_An ThreadPoolManager.getInstance().schedule(() -> { deleteAliveNpcs(217745, 217746, 217747, 217748, 217749, 217778); - sp(205338, 345.25f, 349.24f, 96.09097f, (byte) 0); + sp(205338, 345.25f, 349.24f, 96.09097f, (byte) 0); // IDArena_4th_MC_End }, 102000); } private void startStage4Round4_1() { List round = new ArrayList<>(); - round.add(sp(217508, 334.06754f, 339.84393f, 96.09091f, (byte) 0)); + round.add(sp(217508, 334.06754f, 339.84393f, 96.09091f, (byte) 0)); // S2_LycanFighter_55_Ae empyreanStage.add(new EmpyreanStage(round)); ThreadPoolManager.getInstance().schedule(() -> { List round1 = new ArrayList<>(); - round1.add(sp(217506, 342.12405f, 364.4922f, 96.09093f, (byte) 0)); - round1.add(sp(217507, 344.4953f, 365.14444f, 96.09092f, (byte) 0)); + round1.add(sp(217506, 342.12405f, 364.4922f, 96.09093f, (byte) 0)); // S2_LycanPriest_55_Ae + round1.add(sp(217507, 344.4953f, 365.14444f, 96.09092f, (byte) 0)); // S2_LycanRanger_55_Ae empyreanStage.add(new EmpyreanStage(round1)); }, 5000); } private void startStage4Round3() { setStage(StageType.START_STAGE_4_ROUND_3, 2000); - sp(217563, 339.70975f, 333.54272f, 96.090904f, (byte) 20, 6000); - sp(217564, 342.92892f, 333.43994f, 96.09092f, (byte) 18, 6000); - sp(217565, 341.55396f, 330.70847f, 96.09093f, (byte) 23, 12000); + sp(217563, 339.70975f, 333.54272f, 96.090904f, (byte) 20, 6000); // S5_Drakan_Fi_55_Ae + sp(217564, 342.92892f, 333.43994f, 96.09092f, (byte) 18, 6000); // S5_Drakan_As_55_Ae + sp(217565, 341.55396f, 330.70847f, 96.09093f, (byte) 23, 12000); // S5_Drakan_Wi_55_Ae ThreadPoolManager.getInstance().schedule(() -> { List round = new ArrayList<>(); - round.add(sp(217566, 362.87164f, 357.87164f, 96.091125f, (byte) 73)); - round.add(sp(217563, 359.1135f, 359.6953f, 96.091125f, (byte) 80)); + round.add(sp(217566, 362.87164f, 357.87164f, 96.091125f, (byte) 73)); // S5_Drakan_Pr_55_Ae + round.add(sp(217563, 359.1135f, 359.6953f, 96.091125f, (byte) 80)); // S5_Drakan_Fi_55_Ae empyreanStage.add(new EmpyreanStage(round)); }, 43000); } private void startStage2Round2() { setStage(StageType.START_STAGE_2_ROUND_2, 2000); - sp(217502, 328.78433f, 348.77353f, 96.09092f, (byte) 0, 6000); - sp(217508, 329.01874f, 343.79257f, 96.09092f, (byte) 0, 6000); - sp(217507, 329.2849f, 355.2314f, 96.090935f, (byte) 0, 6000); - sp(217504, 328.90808f, 351.6184f, 96.09092f, (byte) 0, 6000); + sp(217502, 328.78433f, 348.77353f, 96.09092f, (byte) 0, 6000); // S2_RatmanWarrior_55_Ae + sp(217508, 329.01874f, 343.79257f, 96.09092f, (byte) 0, 6000); // S2_LycanFighter_55_Ae + sp(217507, 329.2849f, 355.2314f, 96.090935f, (byte) 0, 6000); // S2_LycanRanger_55_Ae + sp(217504, 328.90808f, 351.6184f, 96.09092f, (byte) 0, 6000); // S2_RatmanScout_55_Ae } private void startStage2Round3() { setStage(StageType.START_STAGE_2_ROUND_3, 2000); - sp(Rnd.get(1, 2) == 1 ? 217500 : 217509, 332.0035f, 349.55893f, 96.09093f, (byte) 0, 6000); + sp(Rnd.get(1, 2) == 1 ? 217500 : 217509, 332.0035f, 349.55893f, 96.09093f, (byte) 0, + 6000); // S2_KrallScout_MidBoss_55_Ah, S2_LycanRanger_Named_55_Ah } private void startStage2Round5() { setStage(StageType.START_STAGE_2_ROUND_5, 2000); - sp(Rnd.get(1, 2) == 1 ? 217510 : 217501, 332.0035f, 349.55893f, 96.09093f, (byte) 0, 6000); + sp(Rnd.get(1, 2) == 1 ? 217510 : 217501, 332.0035f, 349.55893f, 96.09093f, (byte) 0, + 6000); // S2_LycanWizard_Boss_55_Ah, S2_KrallWarrior_Boss_55_Ah } private void rewardGroup() { @@ -829,14 +830,16 @@ public void onChangeStage(StageType type) { case ASMODIANS -> { round.add(217486); round.add(217489); - sp(217486, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); - sp(217489, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); + sp(217486, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); // S1_TempleD_Kn_55_Ae + sp(217489, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); // S1_TempleD_Wi_55_Ae } case ELYOS -> { round.add(217477); round.add(217480); - sp(217477, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); - sp(217480, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); + sp(217477, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); // S1_TempleL_Kn_55_Ae + sp(217480, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); // S1_TempleL_Wi_55_Ae + } + default -> { } } ThreadPoolManager.getInstance().schedule(() -> { @@ -851,62 +854,62 @@ public void onChangeStage(StageType type) { deleteAliveNpcs(217756); stage = 2; setStage(StageType.START_STAGE_2_ROUND_1, 5000); - sp(217503, 325.71194f, 352.81027f, 96.09092f, (byte) 0, 9000); - sp(217502, 325.78696f, 346.07263f, 96.090904f, (byte) 0, 9000); - sp(217504, 325.06122f, 349.4784f, 96.090904f, (byte) 0, 9000); + sp(217503, 325.71194f, 352.81027f, 96.09092f, (byte) 0, 9000); // S2_RatmanGatherer_55_Ae + sp(217502, 325.78696f, 346.07263f, 96.090904f, (byte) 0, 9000); // S2_RatmanWarrior_55_Ae + sp(217504, 325.06122f, 349.4784f, 96.090904f, (byte) 0, 9000); // S2_RatmanScout_55_Ae } case START_STAGE_3_ELEVATOR -> { setStage(type, 0); setStage(StageType.START_STAGE_3_ROUND_1, 5000); stage = 3; - sp(217512, 344.23056f, 347.89594f, 96.09096f, (byte) 0, 9000); - sp(217513, 341.09082f, 337.95187f, 96.09097f, (byte) 0, 9000); - sp(217512, 342.06656f, 361.16135f, 96.090935f, (byte) 0, 9000); - sp(217511, 356.75006f, 335.27487f, 96.09096f, (byte) 0, 9000); - sp(217514, 345.4355f, 365.05215f, 96.09093f, (byte) 0, 9000); - sp(217512, 352.8222f, 358.33463f, 96.09092f, (byte) 0, 9000); - sp(217513, 342.32755f, 365.00473f, 96.09093f, (byte) 0, 9000); - sp(217514, 356.19113f, 362.22543f, 96.090965f, (byte) 0, 9000); - sp(217511, 344.25127f, 334.1194f, 96.090935f, (byte) 0, 9000); - sp(217511, 344.07086f, 346.8839f, 96.09092f, (byte) 0, 9000); - sp(217514, 334.01746f, 350.76382f, 96.090935f, (byte) 0, 9000); - sp(217513, 344.49155f, 351.73932f, 96.09093f, (byte) 0, 9000); - sp(217513, 353.0832f, 362.178f, 96.09092f, (byte) 0, 9000); - sp(217511, 356.24454f, 358.34552f, 96.09103f, (byte) 0, 9000); - sp(217512, 330.64853f, 346.87302f, 96.09091f, (byte) 0, 9000); - sp(217512, 353.32773f, 335.26398f, 96.09092f, (byte) 0, 9000); - sp(217514, 356.69666f, 339.1548f, 96.09103f, (byte) 0, 9000); - sp(217511, 347.6529f, 347.90683f, 96.09098f, (byte) 0, 9000); - sp(217514, 347.5995f, 351.78674f, 96.09099f, (byte) 0, 9000); - sp(217512, 340.82983f, 334.1085f, 96.09093f, (byte) 0, 9000); - sp(217514, 344.19876f, 337.9993f, 96.09094f, (byte) 0, 9000); - sp(217513, 353.5887f, 339.10763f, 96.09092f, (byte) 0, 9000); - sp(217511, 345.4889f, 361.17224f, 96.090935f, (byte) 0, 9000); - sp(217513, 330.90952f, 350.7164f, 96.09093f, (byte) 0, 9000); + sp(217512, 344.23056f, 347.89594f, 96.09096f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217513, 341.09082f, 337.95187f, 96.09097f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae + sp(217512, 342.06656f, 361.16135f, 96.090935f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217511, 356.75006f, 335.27487f, 96.09096f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217514, 345.4355f, 365.05215f, 96.09093f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217512, 352.8222f, 358.33463f, 96.09092f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217513, 342.32755f, 365.00473f, 96.09093f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae + sp(217514, 356.19113f, 362.22543f, 96.090965f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217511, 344.25127f, 334.1194f, 96.090935f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217511, 344.07086f, 346.8839f, 96.09092f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217514, 334.01746f, 350.76382f, 96.090935f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217513, 344.49155f, 351.73932f, 96.09093f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae + sp(217513, 353.0832f, 362.178f, 96.09092f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae + sp(217511, 356.24454f, 358.34552f, 96.09103f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217512, 330.64853f, 346.87302f, 96.09091f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217512, 353.32773f, 335.26398f, 96.09092f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217514, 356.69666f, 339.1548f, 96.09103f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217511, 347.6529f, 347.90683f, 96.09098f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217514, 347.5995f, 351.78674f, 96.09099f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217512, 340.82983f, 334.1085f, 96.09093f, (byte) 0, 9000); // S3_ElementalFire_1st_55_Ae + sp(217514, 344.19876f, 337.9993f, 96.09094f, (byte) 0, 9000); // S3_ElementalAir_1st_55_Ae + sp(217513, 353.5887f, 339.10763f, 96.09092f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae + sp(217511, 345.4889f, 361.17224f, 96.090935f, (byte) 0, 9000); // S3_ElementalEarth_1st_55_Ae + sp(217513, 330.90952f, 350.7164f, 96.09093f, (byte) 0, 9000); // S3_ElementalWater_1st_55_Ae } case START_STAGE_4_ELEVATOR -> { setStage(type, 0); deleteAliveNpcs(217735); setStage(StageType.START_STAGE_4_ROUND_1, 5000); stage = 4; - sp(217557, 328.88104f, 349.55392f, 96.090904f, (byte) 0, 9000); - sp(217559, 328.38922f, 342.39066f, 96.09091f, (byte) 5, 9000); - sp(217557, 333.17947f, 336.4504f, 96.090904f, (byte) 8, 9000); + sp(217557, 328.88104f, 349.55392f, 96.090904f, (byte) 0, 9000); // S5_Lizard_Fi_55_Ae + sp(217559, 328.38922f, 342.39066f, 96.09091f, (byte) 5, 9000); // S5_Lizard_Pr_55_Ae + sp(217557, 333.17947f, 336.4504f, 96.090904f, (byte) 8, 9000); // S5_Lizard_Fi_55_Ae } case START_STAGE_5_ROUND_1 -> { setStage(type, 2000); - sp(217549, 1263.1987f, 778.4129f, 358.6056f, (byte) 30, 6000); - sp(217548, 1260.1381f, 778.84644f, 358.60562f, (byte) 30, 6000); - sp(217547, 1257.3065f, 778.35016f, 358.60562f, (byte) 30, 6000); + sp(217549, 1263.1987f, 778.4129f, 358.6056f, (byte) 30, 6000); // S4_ShulackWi_55_Ae + sp(217548, 1260.1381f, 778.84644f, 358.60562f, (byte) 30, 6000); // S4_ShulackRa_55_Ae + sp(217547, 1257.3065f, 778.35016f, 358.60562f, (byte) 30, 6000); // S4_ShulackAs_55_Ae } case START_STAGE_6_ROUND_1 -> { setStage(type, 2000); - sp(217568, 1636.7102f, 166.87984f, 126f, (byte) 60, 6000); - sp(217568, 1619.4432f, 153.83188f, 126f, (byte) 60, 6000); - sp(217568, 1636.6416f, 164.15344f, 126f, (byte) 60, 6000); + sp(217568, 1636.7102f, 166.87984f, 126f, (byte) 60, 6000); // S5_Graveknight_55_Ae + sp(217568, 1619.4432f, 153.83188f, 126f, (byte) 60, 6000); // S5_Graveknight_55_Ae + sp(217568, 1636.6416f, 164.15344f, 126f, (byte) 60, 6000); // S5_Graveknight_55_Ae ThreadPoolManager.getInstance().schedule(() -> { - sp(217568, 1638.7107f, 165.40533f, 126f, (byte) 60); - sp(217568, 1638.6783f, 162.67389f, 126f, (byte) 60); + sp(217568, 1638.7107f, 165.40533f, 126f, (byte) 60); // S5_Graveknight_55_Ae + sp(217568, 1638.6783f, 162.67389f, 126f, (byte) 60); // S5_Graveknight_55_Ae isDoneStage6Round1 = true; }, 12000); } @@ -915,63 +918,65 @@ public void onChangeStage(StageType type) { setStage(type, 5000); Race race = getRegisteredTeamRace(); switch (race) { - case ASMODIANS -> sp(217578, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); - case ELYOS -> sp(217582, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); + case ASMODIANS -> sp(217582, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); // S7_MasterD_Wa_55_Ah + case ELYOS -> sp(217578, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); // S7_MasterL_Wa_55_Ah + default -> { + } } } case START_STAGE_8_ROUND_1 -> { setStage(type, 2000); - sp(Rnd.get(1, 2) == 1 ? 217588 : 217589, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); + sp(Rnd.get(1, 2) == 1 ? 217588 : 217589, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); // S8_Cromede_55_Ah, S8_Cromede_Hard_55_Ah } case START_STAGE_9_ROUND_1 -> { setStage(type, 2000); - sp(217594, 1274.890f, 1730.676f, 318.194f, (byte) 3, 6000); + sp(217594, 1274.890f, 1730.676f, 318.194f, (byte) 3, 6000); // S9_Potcrab_Gi_55_Ah } case START_STAGE_10_ROUND_1 -> { setStage(type, 2000); - sp(217600, 1765.1488f, 1305.1216f, 394.3f, (byte) 84, 2000); - sp(217601, 1776.6201f, 1296.9429f, 394.2375f, (byte) 74, 2000); - sp(217602, 1771.5571f, 1302.0781f, 394.3f, (byte) 82, 2000); + sp(217600, 1765.1488f, 1305.1216f, 394.3f, (byte) 84, 2000); // S10_Naga_Fi_High_55_Ae + sp(217601, 1776.6201f, 1296.9429f, 394.2375f, (byte) 74, 2000); // S10_Naga_Ma_High_55_Ae + sp(217602, 1771.5571f, 1302.0781f, 394.3f, (byte) 82, 2000); // S10_Naga_Pr_High_55_Ae } case START_STAGE_5 -> { stage = 5; - sp(205426, 1256.2872f, 834.28986f, 358.60565f, (byte) 103); - sp(205332, 1260.1292f, 795.06964f, 358.60562f, (byte) 30); + sp(205426, 1256.2872f, 834.28986f, 358.60565f, (byte) 103); // IDArena_5th_Resurrect_NPC + sp(205332, 1260.1292f, 795.06964f, 358.60562f, (byte) 30); // IDArena_5th_MC_Start teleport(1260.15f, 812.34f, 358.6056f, (byte) 90); setStage(type, 1000); } case START_STAGE_6 -> { stage = 6; - sp(205427, 1594.4756f, 145.26898f, 128.67778f, (byte) 16); - sp(205333, 1625.1771f, 159.15244f, 126f, (byte) 70); + sp(205427, 1594.4756f, 145.26898f, 128.67778f, (byte) 16); // IDArena_6th_Resurrect_NPC + sp(205333, 1625.1771f, 159.15244f, 126f, (byte) 70); // IDArena_6th_MC_Start teleport(1616.0248f, 154.43837f, 126f, (byte) 10); setStage(type, 1000); } case START_STAGE_7 -> { stage = 7; - sp(205428, 1820.39f, 800.81805f, 470.1394f, (byte) 86); - sp(205334, 1781.6106f, 796.9224f, 469.35016f, (byte) 0); + sp(205428, 1820.39f, 800.81805f, 470.1394f, (byte) 86); // IDArena_7th_Resurrect_NPC + sp(205334, 1781.6106f, 796.9224f, 469.35016f, (byte) 0); // IDArena_7th_MC_Start teleport(1793.9233f, 796.92f, 469.36542f, (byte) 60); setStage(type, 1000); } case START_STAGE_8 -> { stage = 8; - sp(205335, 1776.759f, 1764.705f, 303.695f, (byte) 90); - sp(205429, 1780.103f, 1723.458f, 304.039f, (byte) 53); - teleport(1776.4169f, 1749.9952f, 303.69553f, (byte) 0); // get retail + sp(205429, 1780.103f, 1723.458f, 304.039f, (byte) 53); // IDArena_8th_Resurrect_NPC + sp(205335, 1776.759f, 1764.705f, 303.695f, (byte) 90); // IDArena_8th_MC_Start + teleport(1776.4169f, 1749.9952f, 303.69553f, (byte) 0); setStage(type, 1000); } case START_STAGE_9 -> { stage = 9; - sp(205430, 1359.375f, 1758.057f, 319.625f, (byte) 90); - sp(205336, 1309.309f, 1732.540f, 315.782f, (byte) 7); + sp(205430, 1359.375f, 1758.057f, 319.625f, (byte) 90); // IDArena_9th_Resurrect_NPC + sp(205336, 1309.309f, 1732.540f, 315.782f, (byte) 7); // IDArena_9th_MC_Start teleport(1320.4513f, 1738.4838f, 316.1746f, (byte) 66); setStage(type, 1000); } case START_STAGE_10 -> { stage = 10; - sp(205431, 1755.709f, 1253.4136f, 394.2378f, (byte) 33); - sp(205337, 1766.5986f, 1291.2572f, 394.23755f, (byte) 82, 10000); + sp(205431, 1755.709f, 1253.4136f, 394.2378f, (byte) 33); // IDArena_10th_Resurrect_NPC + sp(205337, 1766.5986f, 1291.2572f, 394.23755f, (byte) 82, 10000); // IDArena_10th_MC_Start teleport(1760.9441f, 1278.033f, 394.23764f, (byte) 0); setStage(type, 2000); } @@ -985,11 +990,13 @@ private void startStage1Round2() { switch (race) { case ASMODIANS -> { round.add(217492); - sp(217492, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); + sp(217492, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); // S1_TempleD_Ch_55_Ae } case ELYOS -> { round.add(217483); - sp(217483, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); + sp(217483, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); // S1_TempleL_Ch_55_Ae + } + default -> { } } ThreadPoolManager.getInstance().schedule(() -> { @@ -1006,11 +1013,13 @@ private void startStage1Round3() { switch (race) { case ASMODIANS -> { round.add(217487); - sp(217487, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); + sp(217487, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); // S1_TempleD_As_55_Ae } case ELYOS -> { round.add(217478); - sp(217478, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); + sp(217478, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); // S1_TempleL_As_55_Ae + } + default -> { } } ThreadPoolManager.getInstance().schedule(() -> { @@ -1027,11 +1036,13 @@ private void startStage1Round4() { switch (race) { case ASMODIANS -> { round.add(217491); - sp(217491, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); + sp(217491, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); // S1_TempleD_Pr_55_Ae } case ELYOS -> { round.add(217482); - sp(217482, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); + sp(217482, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); // S1_TempleL_Pr_55_Ae + } + default -> { } } ThreadPoolManager.getInstance().schedule(() -> { @@ -1045,11 +1056,9 @@ private void startStage1Round5() { setStage(StageType.START_STAGE_1_ROUND_5, 2000); Race race = instance.getRegisteredTeam().getRace(); switch (race) { - case ASMODIANS -> { - sp(217493, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); - } - case ELYOS -> { - sp(217484, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); + case ASMODIANS -> sp(217493, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); // S1_TempleD_Fi_Boss_55_Ah + case ELYOS -> sp(217484, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); // S1_TempleL_Fi_Boss_55_Ah + default -> { } } } diff --git a/game-server/data/static_data/npcs/npc_templates.xml b/game-server/data/static_data/npcs/npc_templates.xml index 9a0f596ffb..deb7928881 100644 --- a/game-server/data/static_data/npcs/npc_templates.xml +++ b/game-server/data/static_data/npcs/npc_templates.xml @@ -90052,15 +90052,15 @@ - + - + - + @@ -113467,7 +113467,7 @@ - + @@ -113525,7 +113525,7 @@ - + @@ -327720,7 +327720,7 @@ - + @@ -360107,15 +360107,15 @@ - + - + - + From 201d9af8773d43f0f3759d394f189f47c06b30e7 Mon Sep 17 00:00:00 2001 From: Neon Date: Mon, 5 Aug 2024 01:06:30 +0200 Subject: [PATCH 4/5] Resolved most points from the review --- .../empyreanCrucible/ArminosDrakyAI.java | 6 +- .../EmpyreanAdministratorArminosAI.java | 50 +++++------ .../empyreanCrucible/EmpyreanArbiterAI.java | 7 +- .../EmpyreanRecordKeeperAI.java | 10 +-- .../empyreanCrucible/KingConsierdAI.java | 23 +++-- .../empyreanCrucible/MagePreceptorAI.java | 64 ++++--------- .../empyreanCrucible/PriestPreceptorAI.java | 81 +++++++++++++++++ .../PriestPreceptorAsmodiansAI.java | 88 ------------------ .../PriestPreceptorElyosAI.java | 90 ------------------- .../empyreanCrucible/QueenAlukinaAI.java | 51 ++++++----- .../instance/empyreanCrucible/RM1337AI.java | 38 +++----- .../empyreanCrucible/SparkOfDarknessAI.java | 2 +- .../empyreanCrucible/SpectralWarriorAI.java | 30 ++++++- .../empyreanCrucible/StrangeCreatureAI.java | 26 ++++-- .../empyreanCrucible/TakunGojiraAI.java | 15 ++-- .../empyreanCrucible/VanktristAI.java | 88 ++++++------------ .../empyreanCrucible/WarriorPreceptorAI.java | 15 ++-- .../crucible/EmpyreanCrucibleInstance.java | 76 +++++++--------- .../data/static_data/npcs/npc_templates.xml | 4 +- 19 files changed, 305 insertions(+), 459 deletions(-) create mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java delete mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java delete mode 100644 game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java index 8235f2458c..8923dba302 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/ArminosDrakyAI.java @@ -37,14 +37,14 @@ protected void handleSpawned() { @Override protected void handleMoveArrived() { super.handleMoveArrived(); - if (getOwner().getMoveController().getCurrentStep().isLastStep()) + if (getOwner().getMoveController().getCurrentStep().isLastStep()) { // circle twice if (!isStart) { getSpawnTemplate().setWalkerId(null); WalkManager.stopWalking(this); AIActions.deleteOwner(this); - } else { + } else isStart = false; - } + } } @Override diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java index 749a801801..60683c0c82 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanAdministratorArminosAI.java @@ -6,7 +6,7 @@ import com.aionemu.gameserver.utils.PacketSendUtility; /** - * @author xTz, w4terbomb + * @author xTz */ @AIName("empadministratorarminos") public class EmpyreanAdministratorArminosAI extends NpcAI { @@ -23,33 +23,25 @@ protected void handleSpawned() { private void startEvent() { switch (getNpcId()) { - case 217744 -> handleEventForNpcId217744(); - case 217749 -> handleEventForNpcId217749(); - default -> { - } + case 217744: + PacketSendUtility.broadcastMessage(getOwner(), 1500247, 8000); + PacketSendUtility.broadcastMessage(getOwner(), 1500250, 20000); + PacketSendUtility.broadcastMessage(getOwner(), 1500251, 60000); + break; + case 217749: + PacketSendUtility.broadcastMessage(getOwner(), 1500252, 8000); + PacketSendUtility.broadcastMessage(getOwner(), 1500253, 16000); + PacketSendUtility.broadcastToMap(getOwner(), 1400982, 25000); + PacketSendUtility.broadcastToMap(getOwner(), 1400988, 27000); + PacketSendUtility.broadcastToMap(getOwner(), 1400989, 29000); + PacketSendUtility.broadcastToMap(getOwner(), 1400990, 31000); + PacketSendUtility.broadcastToMap(getOwner(), 1401013, 93000); + PacketSendUtility.broadcastToMap(getOwner(), 1401014, 113000); + PacketSendUtility.broadcastToMap(getOwner(), 1401015, 118000); + PacketSendUtility.broadcastMessage(getOwner(), 1500255, 118000); + break; + // case + // despawn after 1min } } - - private void handleEventForNpcId217744() { - sendBroadcastMessages(new int[] { 1500247, 1500250, 1500251 }, new int[] { 8000, 20000, 60000 }); - } - - private void handleEventForNpcId217749() { - sendBroadcastMessages(new int[] { 1500252, 1500253, 1500255 }, new int[] { 8000, 16000, 118000 }); - - broadcastToMap(new int[] { 1400982, 1400988, 1400989, 1400990, 1401013, 1401014, 1401015 }, - new int[] { 25000, 27000, 29000, 31000, 93000, 113000, 118000 }); - } - - private void sendBroadcastMessages(int[] messageIds, int[] delays) { - for (int i = 0; i < messageIds.length; i++) { - PacketSendUtility.broadcastMessage(getOwner(), messageIds[i], delays[i]); - } - } - - private void broadcastToMap(int[] mapMessageIds, int[] delays) { - for (int i = 0; i < mapMessageIds.length; i++) { - PacketSendUtility.broadcastToMap(getOwner(), mapMessageIds[i], delays[i]); - } - } -} \ No newline at end of file +} diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java index 44622d0d28..2c85d18c93 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanArbiterAI.java @@ -25,8 +25,8 @@ public EmpyreanArbiterAI(Npc owner) { @Override protected void handleDialogStart(Player player) { - PacketSendUtility.sendPacket(player, player.getInventory().getFirstItemByItemId(186000124) != null ? new SM_DIALOG_WINDOW(getObjectId(), 1011) - : new SM_DIALOG_WINDOW(getObjectId(), 0)); + int dialogId = player.getInventory().getFirstItemByItemId(186000124) == null ? 0 : 1011; + PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), dialogId)); } @Override @@ -50,8 +50,7 @@ public boolean onDialogSelect(Player player, int dialogActionId, int questId, in } } PacketSendUtility.sendPacket(player, new SM_DIALOG_WINDOW(getObjectId(), 0)); - getPosition().getWorldMapInstance().forEachPlayer( - p -> PacketSendUtility.sendPacket(p, SM_SYSTEM_MESSAGE.STR_MSG_FRIENDLY_MOVE_COMBATAREA_IDARENA(player.getName()))); + PacketSendUtility.broadcastToMap(getOwner(), SM_SYSTEM_MESSAGE.STR_MSG_FRIENDLY_MOVE_COMBATAREA_IDARENA(player.getName())); } return true; } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java index dd6df365a7..5a64e1ec65 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/EmpyreanRecordKeeperAI.java @@ -25,13 +25,7 @@ public EmpyreanRecordKeeperAI(Npc owner) { @Override public void handleSpawned() { super.handleSpawned(); - int msg = getNpcIdMessage(getNpcId()); - if (msg != 0) - PacketSendUtility.broadcastMessage(getOwner(), msg, 1000); - } - - private int getNpcIdMessage(int npcId) { - return switch (npcId) { + int msg = switch (getNpcId()) { case 799568 -> 1111460; case 799569 -> 1111461; case 205331 -> 1111462; @@ -45,6 +39,8 @@ private int getNpcIdMessage(int npcId) { case 205344 -> 1111469; default -> 0; }; + if (msg != 0) + PacketSendUtility.broadcastMessage(getOwner(), msg, 1000); } @Override diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java index a0cc2ed43a..c3e9ff7b5d 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/KingConsierdAI.java @@ -1,7 +1,5 @@ package ai.instance.empyreanCrucible; -import com.aionemu.gameserver.utils.ThreadPoolManager; - import java.util.List; import java.util.concurrent.Future; import java.util.concurrent.atomic.AtomicBoolean; @@ -11,6 +9,7 @@ import com.aionemu.gameserver.controllers.attack.AggroInfo; import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; @@ -30,20 +29,20 @@ public KingConsierdAI(Npc owner) { } @Override - public void handleDespawned() { + protected void handleDespawned() { cancelTasks(); super.handleDespawned(); } @Override - public void handleDied() { + protected void handleDied() { cancelTasks(); despawnNpcs(getPosition().getWorldMapInstance().getNpcs(282378)); super.handleDied(); } @Override - public void handleBackHome() { + protected void handleBackHome() { cancelTasks(); despawnNpcs(getPosition().getWorldMapInstance().getNpcs(282378)); super.handleBackHome(); @@ -51,7 +50,7 @@ public void handleBackHome() { } @Override - public void handleAttack(Creature creature) { + protected void handleAttack(Creature creature) { super.handleAttack(creature); hpPhases.tryEnterNextPhase(this); if (isHome.compareAndSet(true, false)) { @@ -62,8 +61,8 @@ public void handleAttack(Creature creature) { private void scheduleInitialSkills() { ThreadPoolManager.getInstance().schedule(() -> { - getOwner().queueSkill(19691, 1, 0); - ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(17954, 29, 0), 4000); + getOwner().queueSkill(19691, 1, 4000); + getOwner().queueSkill(17954, 29); }, 2000); } @@ -71,12 +70,12 @@ private void scheduleInitialSkills() { public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { case 75 -> startSkillTask(); - case 25 -> getOwner().queueSkill(19690, 1, 0); + case 25 -> getOwner().queueSkill(19690, 1); } } private void startBloodThirstTask() { - eventTask = ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19624, 10, 0), 180000); // 3min, need confirm + eventTask = ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19624, 10), 180000); // 3min, need confirm } private void startSkillTask() { @@ -87,12 +86,12 @@ private void executeSkillTask() { if (isDead()) { cancelTasks(); } else { - getOwner().queueSkill(17951, 29, 0); + getOwner().queueSkill(17951, 29); ThreadPoolManager.getInstance().schedule(() -> { dropAggro(); if (getLifeStats().getHpPercentage() <= 50) spawnBabyConsierd(); - ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(17952, 29, 0), 2000); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(17952, 29), 2000); }, 3500); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java index 0208719b73..9ac0f0b90c 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/MagePreceptorAI.java @@ -11,7 +11,6 @@ import ai.AggressiveNpcAI; /** - * AI for Mage Preceptor in Empyrean Crucible * @author Luzien, w4terbomb */ @AIName("mage_preceptor") @@ -24,26 +23,26 @@ public MagePreceptorAI(Npc owner) { } @Override - public void handleDespawned() { + protected void handleDespawned() { despawnNpcs(); super.handleDespawned(); } @Override - public void handleDied() { + protected void handleDied() { despawnNpcs(); super.handleDied(); } @Override - public void handleBackHome() { + protected void handleBackHome() { despawnNpcs(); super.handleBackHome(); hpPhases.reset(); } @Override - public void handleAttack(Creature creature) { + protected void handleAttack(Creature creature) { super.handleAttack(creature); hpPhases.tryEnterNextPhase(this); } @@ -51,57 +50,32 @@ public void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 75 -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM); - case 50 -> handle50PercentPhase(); - case 25 -> handle25PercentPhase(); - } - } - - private void handle50PercentPhase() { - queueSkill(19609, NpcSkillTargetAttribute.MOST_HATED); - scheduleTask(() -> { - if (!isDead()) { - queueSkill(19609, NpcSkillTargetAttribute.MOST_HATED); - scheduleTask(this::spawnNpcs, 4500); + case 75 -> getOwner().queueSkill(19605, 10, -1, NpcSkillTargetAttribute.RANDOM); + case 50 -> { + getOwner().queueSkill(19606, 10, 3000); + getOwner().queueSkill(19609, 10); + ThreadPoolManager.getInstance().schedule(this::spawnNpcs, 7500); + } + case 25 -> { + getOwner().queueSkill(19606, 10, 3000); + getOwner().queueSkill(19605, 10, 6000, NpcSkillTargetAttribute.RANDOM); + getOwner().queueSkill(19605, 10, 6000, NpcSkillTargetAttribute.RANDOM); + getOwner().queueSkill(19605, 10, -1, NpcSkillTargetAttribute.RANDOM); } - }, 3000); - } - - private void handle25PercentPhase() { - queueSkill(19605, NpcSkillTargetAttribute.RANDOM); - scheduleRepeatedSkills(3000, 9000, 15000); - } - - private void queueSkill(int skillId, NpcSkillTargetAttribute targetAttribute) { - getOwner().queueSkill(skillId, 10, 0, targetAttribute); - } - - private void scheduleTask(Runnable task, int delay) { - ThreadPoolManager.getInstance().schedule(task, delay); - } - - private void scheduleRepeatedSkills(int... delays) { - for (int delay : delays) { - scheduleTask(() -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM), delay); } } private void spawnNpcs() { + if (isDead()) + return; WorldPosition p = getPosition(); spawn(282364, p.getX(), p.getY(), p.getZ(), p.getHeading()); spawn(282363, p.getX(), p.getY(), p.getZ(), p.getHeading()); - scheduleTask(() -> queueSkill(19605, NpcSkillTargetAttribute.RANDOM), 2000); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19605, 10, -1, NpcSkillTargetAttribute.RANDOM), 2000); } private void despawnNpcs() { - despawnNpc(282364); - despawnNpc(282363); - } - - private void despawnNpc(int npcId) { - Npc npc = getPosition().getWorldMapInstance().getNpc(npcId); - if (npc != null) { + for (Npc npc : getPosition().getWorldMapInstance().getNpcs(282363, 282364)) npc.getController().delete(); - } } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java new file mode 100644 index 0000000000..165b790c55 --- /dev/null +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java @@ -0,0 +1,81 @@ +package ai.instance.empyreanCrucible; + +import com.aionemu.gameserver.ai.AIName; +import com.aionemu.gameserver.ai.HpPhases; +import com.aionemu.gameserver.model.gameobjects.Creature; +import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; +import com.aionemu.gameserver.skillengine.SkillEngine; +import com.aionemu.gameserver.utils.ThreadPoolManager; +import com.aionemu.gameserver.world.WorldPosition; + +import ai.AggressiveNoLootNpcAI; + +/** + * @author Luzien, w4terbomb + */ +@AIName("priest_preceptor") +public class PriestPreceptorAI extends AggressiveNoLootNpcAI implements HpPhases.PhaseHandler { + + private final HpPhases hpPhases = new HpPhases(75, 25); + private final int[] helpers; + + public PriestPreceptorAI(Npc owner) { + super(owner); + if (owner.getNpcId() == 217581) // Thrasymedes + helpers = new int[] { 282366, 282367, 282368 }; // Boreas, Jumentis, Charna + else // Freyr + helpers = new int[] { 282369, 282370, 282371 }; // Traufnir, Sigyn, Sif + } + + @Override + protected void handleSpawned() { + super.handleSpawned(); + ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46), 1000); + } + + @Override + protected void handleAttack(Creature creature) { + super.handleAttack(creature); + hpPhases.tryEnterNextPhase(this); + } + + @Override + public void handleHpPhase(int phaseHpPercent) { + switch (phaseHpPercent) { + case 75 -> getOwner().queueSkill(19611, 46, -1, NpcSkillTargetAttribute.RANDOM); + case 25 -> startTask(); + } + } + + private void startTask() { + getOwner().queueSkill(19610, 46, 2000); + getOwner().queueSkill(19614, 46, -1, NpcSkillTargetAttribute.ME); + ThreadPoolManager.getInstance().schedule(() -> { + WorldPosition p = getPosition(); + for (int helperNpcId : helpers) + applySoulSickness((Npc) spawn(helperNpcId, p.getX(), p.getY(), p.getZ(), p.getHeading())); + }, 7000); + } + + private void applySoulSickness(Npc npc) { + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); + } + + @Override + protected void handleDied() { + despawnHelpers(); + super.handleDied(); + } + + @Override + protected void handleBackHome() { + despawnHelpers(); + super.handleDied(); + hpPhases.reset(); + } + + private void despawnHelpers() { + getPosition().getWorldMapInstance().getNpcs(helpers).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); + } +} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java deleted file mode 100644 index aa83665edb..0000000000 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAsmodiansAI.java +++ /dev/null @@ -1,88 +0,0 @@ -package ai.instance.empyreanCrucible; - -import java.util.concurrent.atomic.AtomicBoolean; - -import com.aionemu.gameserver.ai.AIName; -import com.aionemu.gameserver.model.gameobjects.Creature; -import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; -import com.aionemu.gameserver.skillengine.SkillEngine; -import com.aionemu.gameserver.utils.ThreadPoolManager; -import com.aionemu.gameserver.world.WorldPosition; - -import ai.AggressiveNoLootNpcAI; - -/** - * AI for Priest Preceptor (Asmodians) in Empyrean Crucible - * - * @author w4terbomb - */ -@AIName("priest_preceptor_asmodians") -public class PriestPreceptorAsmodiansAI extends AggressiveNoLootNpcAI { - - private final AtomicBoolean startTask1 = new AtomicBoolean(); - private final AtomicBoolean startTask2 = new AtomicBoolean(); - - public PriestPreceptorAsmodiansAI(Npc owner) { - super(owner); - } - - @Override - public void handleSpawned() { - super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46, 0), 1000); - } - - @Override - public void handleAttack(Creature creature) { - super.handleAttack(creature); - checkPercentage(getLifeStats().getHpPercentage()); - } - - private void checkPercentage(int percentage) { - if (percentage <= 75 && startTask1.compareAndSet(false, true)) - getOwner().queueSkill(19611, 46, 0, NpcSkillTargetAttribute.RANDOM); - if (percentage <= 25 && startTask2.compareAndSet(false, true)) - startTask(); - } - - private void startTask() { - getOwner().queueSkill(19610, 46, 0); - ThreadPoolManager.getInstance().schedule(() -> { - getOwner().queueSkill(19614, 46, 0, NpcSkillTargetAttribute.ME); - ThreadPoolManager.getInstance().schedule(() -> { - WorldPosition p = getPosition(); - applySoulSickness((Npc) spawn(282369, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Traufnir. - applySoulSickness((Npc) spawn(282370, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Sigyn. - applySoulSickness((Npc) spawn(282371, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Sif. - }, 5000); - }, 2000); - } - - private void applySoulSickness(Npc npc) { - ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); - } - - @Override - protected void handleDied() { - despawnNpcsById(282369, 282370, 282371); // Traufnir, Sigyn, Sif. - super.handleDied(); - } - - @Override - protected void handleBackHome() { - despawnNpcsById(282369, 282370, 282371); // Traufnir, Sigyn, Sif. - stopTask(); - super.handleDied(); - } - - private void stopTask() { - startTask1.set(false); - startTask2.set(false); - } - - private void despawnNpcsById(int... npcIds) { - getPosition().getWorldMapInstance().getNpcs(npcIds).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); - } - -} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java deleted file mode 100644 index 21bd8d699b..0000000000 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorElyosAI.java +++ /dev/null @@ -1,90 +0,0 @@ -package ai.instance.empyreanCrucible; - -import java.util.concurrent.atomic.AtomicBoolean; - -import com.aionemu.gameserver.ai.AIName; -import com.aionemu.gameserver.model.gameobjects.Creature; -import com.aionemu.gameserver.model.gameobjects.Npc; -import com.aionemu.gameserver.model.templates.npcskill.NpcSkillTargetAttribute; -import com.aionemu.gameserver.skillengine.SkillEngine; -import com.aionemu.gameserver.utils.ThreadPoolManager; -import com.aionemu.gameserver.world.WorldPosition; - -import ai.AggressiveNoLootNpcAI; - -/** - * AI for Priest Preceptor (Elyos) in Empyrean Crucible - * - * @author w4terbomb - */ -@AIName("priest_preceptor_elyos") -public class PriestPreceptorElyosAI extends AggressiveNoLootNpcAI { - - private final AtomicBoolean startTask1 = new AtomicBoolean(); - private final AtomicBoolean startTask2 = new AtomicBoolean(); - - public PriestPreceptorElyosAI(Npc owner) { - super(owner); - } - - @Override - public void handleSpawned() { - super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46, 0), 1000); - } - - @Override - public void handleAttack(Creature creature) { - super.handleAttack(creature); - checkPercentage(getLifeStats().getHpPercentage()); - } - - private void checkPercentage(int percentage) { - if (percentage <= 75 && startTask1.compareAndSet(false, true)) - getOwner().queueSkill(19611, 46, 0, NpcSkillTargetAttribute.RANDOM); - if (percentage <= 25 && startTask2.compareAndSet(false, true)) - startTask(); - } - - private void startTask() { - getOwner().queueSkill(19610, 46, 0); - ThreadPoolManager.getInstance().schedule(new Runnable() { - @Override - public void run() { - getOwner().queueSkill(19614, 46, 0, NpcSkillTargetAttribute.ME); - ThreadPoolManager.getInstance().schedule(() -> { - WorldPosition p = getPosition(); - applySoulSickness((Npc) spawn(282366, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Boreas. - applySoulSickness((Npc) spawn(282367, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Jumentis. - applySoulSickness((Npc) spawn(282368, p.getX(), p.getY(), p.getZ(), p.getHeading())); //Charna. - }, 5000); - } - }, 2000); - } - - private void applySoulSickness(final Npc npc) { - ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); - } - - @Override - protected void handleDied() { - despawnNpcsById(282366, 282367, 282368); // Boreas, Jumentis, Charna. - super.handleDied(); - } - - @Override - protected void handleBackHome() { - despawnNpcsById(282366, 282367, 282368); // Boreas, Jumentis, Charna. - stopTask(); - super.handleDied(); - } - - private void stopTask() { - startTask1.set(false); - startTask2.set(false); - } - - private void despawnNpcsById(int... npcIds) { - getPosition().getWorldMapInstance().getNpcs(npcIds).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); - } -} \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java index f20db14ec4..e7b23ed80a 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/QueenAlukinaAI.java @@ -25,53 +25,59 @@ public QueenAlukinaAI(Npc owner) { } @Override - public void handleDespawned() { + protected void handleDespawned() { cancelTask(); super.handleDespawned(); } @Override - public void handleDied() { + protected void handleDied() { cancelTask(); super.handleDied(); } @Override - public void handleBackHome() { + protected void handleBackHome() { cancelTask(); super.handleBackHome(); hpPhases.reset(); } @Override - public void handleAttack(Creature creature) { + protected void handleAttack(Creature creature) { super.handleAttack(creature); hpPhases.tryEnterNextPhase(this); } @Override public void handleHpPhase(int phaseHpPercent) { - getOwner().queueSkill(17899, 41, 0); + getOwner().queueSkill(17899, 41, 4500); switch (phaseHpPercent) { case 75 -> { - scheduleSkill(17900, 4500); + getOwner().queueSkill(17900, 41); PacketSendUtility.broadcastMessage(getOwner(), 340487, 10000); - scheduleSkill(17899, 14000); - scheduleSkill(17900, 18000); + ThreadPoolManager.getInstance().schedule(() -> { + if (getLifeStats().getHpPercentage() > 50) { + getOwner().queueSkill(17899, 41, 4000); + getOwner().queueSkill(17900, 41); + } + }, 14000); } case 50 -> { - scheduleSkill(17280, 4500); - scheduleSkill(17902, 8000); + getOwner().queueSkill(17280, 41, 3500); + getOwner().queueSkill(17902, 41); + } + case 25 -> { + task = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { + if (isDead()) { + cancelTask(); + } else { + getOwner().queueSkill(17901, 41, 5500); + getOwner().queueSkill(17902, 41, 2000); + getOwner().queueSkill(17902, 41); + } + }, 4500, 20000); } - case 25 -> task = ThreadPoolManager.getInstance().scheduleAtFixedRate(() -> { - if (isDead()) { - cancelTask(); - } else { - getOwner().queueSkill(17901, 41, 0); - scheduleSkill(17902, 5500); - scheduleSkill(17902, 7500); - } - }, 4500, 20000); } } @@ -79,11 +85,4 @@ private void cancelTask() { if (task != null && !task.isCancelled()) task.cancel(true); } - - private void scheduleSkill(final int skill, int delay) { - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) - getOwner().queueSkill(skill, 41, 0); - }, delay); - } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java index 05b6c9d3e8..9661bec889 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java @@ -1,7 +1,6 @@ package ai.instance.empyreanCrucible; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.IntStream; import com.aionemu.commons.utils.Rnd; @@ -21,10 +20,7 @@ @AIName("rm_1337") public class RM1337AI extends AggressiveNpcAI implements HpPhases.PhaseHandler { - private final HpPhases hpPhases = new HpPhases(15, 35, 55, 75, 95); - - private final AtomicBoolean isHome = new AtomicBoolean(true); - private final AtomicBoolean isEventStarted = new AtomicBoolean(false); + private final HpPhases hpPhases = new HpPhases(100, 75); private Future task1, task2; public RM1337AI(Npc owner) { @@ -32,45 +28,42 @@ public RM1337AI(Npc owner) { } @Override - public void handleSpawned() { + protected void handleSpawned() { super.handleSpawned(); PacketSendUtility.broadcastMessage(getOwner(), 1500229, 2000); } @Override - public void handleDespawned() { + protected void handleDespawned() { cancelTask(); super.handleDespawned(); } @Override - public void handleDied() { + protected void handleDied() { cancelTask(); PacketSendUtility.broadcastMessage(getOwner(), 1500231); super.handleDied(); } @Override - public void handleBackHome() { + protected void handleBackHome() { cancelTask(); super.handleBackHome(); + hpPhases.reset(); } @Override - public void handleAttack(Creature creature) { + protected void handleAttack(Creature creature) { super.handleAttack(creature); - if (isHome.compareAndSet(true, false)) - startSkillTask1(); - handleHpPhase(getLifeStats().getHpPercentage()); + hpPhases.tryEnterNextPhase(this); } @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 15, 35, 55, 75, 95 -> { - if (isEventStarted.compareAndSet(false, true)) - startSkillTask2(); - } + case 100 -> startSkillTask1(); + case 95 -> startSkillTask2(); } } @@ -88,13 +81,8 @@ private void startSkillTask1() { } else { if (getOwner().getCastingSkill() != null) return; - if (getLifeStats().getHpPercentage() <= 50) - switch (Rnd.nextInt(2)) { - case 0 -> getOwner().queueSkill(19550, 10, 0, NpcSkillTargetAttribute.RANDOM); - default -> getOwner().queueSkill(19552, 10, 0, NpcSkillTargetAttribute.RANDOM); - } - else - getOwner().queueSkill(19550, 10, 0, NpcSkillTargetAttribute.RANDOM); + int skillId = getLifeStats().getHpPercentage() > 50 || Rnd.nextBoolean() ? 19550 : 19552; + getOwner().queueSkill(skillId, 10, -1, NpcSkillTargetAttribute.RANDOM); } }, 10000, 23000); } @@ -106,7 +94,7 @@ private void startSkillTask2() { } else { getOwner().getController().cancelCurrentSkill(null); PacketSendUtility.broadcastMessage(getOwner(), 1500230); - getOwner().queueSkill(19551, 10, 0); + getOwner().queueSkill(19551, 10); spawnSparks(); } }, 0, 60000); diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java index 8aff9dc998..114dd6ed6a 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/SparkOfDarknessAI.java @@ -27,7 +27,7 @@ protected void handleSpawned() { private void startEventTask() { ThreadPoolManager.getInstance().schedule(() -> { if (!isDead()) - getOwner().queueSkill(19554, 1, 0); + getOwner().queueSkill(19554, 1); }, 500); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java index a13936eb9a..101a5a7f89 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/SpectralWarriorAI.java @@ -1,5 +1,7 @@ package ai.instance.empyreanCrucible; +import java.util.concurrent.ScheduledFuture; + import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.ai.HpPhases; import com.aionemu.gameserver.model.gameobjects.Creature; @@ -16,11 +18,31 @@ public class SpectralWarriorAI extends AggressiveNpcAI implements HpPhases.PhaseHandler { private final HpPhases hpPhases = new HpPhases(50); + private ScheduledFuture replaceSpawnsTask; public SpectralWarriorAI(Npc owner) { super(owner); } + @Override + protected void handleDespawned() { + cancelTask(); + super.handleDespawned(); + } + + @Override + protected void handleDied() { + cancelTask(); + super.handleDied(); + } + + @Override + protected void handleBackHome() { + cancelTask(); + super.handleBackHome(); + hpPhases.reset(); + } + @Override protected void handleAttack(Creature creature) { super.handleAttack(creature); @@ -30,7 +52,7 @@ protected void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { getPosition().getWorldMapInstance().getInstanceHandler().onChangeStage(StageType.START_STAGE_6_ROUND_5); - ThreadPoolManager.getInstance().scheduleAtFixedRate(this::resurrectAllies, 0, 2000); + replaceSpawnsTask = ThreadPoolManager.getInstance().scheduleAtFixedRate(this::resurrectAllies, 0, 2000); } private void resurrectAllies() { @@ -49,4 +71,10 @@ private void resurrectAllies() { } }); } + + private void cancelTask() { + if (replaceSpawnsTask != null && !replaceSpawnsTask.isDone()) { + replaceSpawnsTask.cancel(true); + } + } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java index fed7ab7dc1..8889092190 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/StrangeCreatureAI.java @@ -3,13 +3,14 @@ import com.aionemu.gameserver.ai.AIActions; import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.skillengine.SkillEngine; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.GeneralNpcAI; /** - * @author Luzien, w4terbomb + * @author Luzien */ @AIName("strange_creature") public class StrangeCreatureAI extends GeneralNpcAI { @@ -26,15 +27,28 @@ protected void handleSpawned() { } private void startEventTask() { - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) - PacketSendUtility.broadcastMessage(getOwner(), 341444); - getOwner().queueSkill(17914, 34, 0); + ThreadPoolManager.getInstance().schedule(new Runnable() { + + @Override + public void run() { + if (!isDead()) { + PacketSendUtility.broadcastMessage(getOwner(), 341444); + SkillEngine.getInstance().getSkill(getOwner(), 17914, 34, getOwner()).useNoAnimationSkill(); + } + } + }, 500); } private void startLifeTask() { - ThreadPoolManager.getInstance().schedule(() -> AIActions.deleteOwner(StrangeCreatureAI.this), 6500); + ThreadPoolManager.getInstance().schedule(new Runnable() { + + @Override + public void run() { + AIActions.deleteOwner(StrangeCreatureAI.this); + } + + }, 6500); } } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java index d226efe7f0..81cf6b17e4 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/TakunGojiraAI.java @@ -1,9 +1,8 @@ package ai.instance.empyreanCrucible; -import com.aionemu.gameserver.utils.ThreadPoolManager; - import com.aionemu.gameserver.ai.AIName; import com.aionemu.gameserver.model.gameobjects.Npc; +import com.aionemu.gameserver.utils.ThreadPoolManager; import ai.AggressiveNpcAI; @@ -22,10 +21,14 @@ public TakunGojiraAI(Npc owner) { @Override public void handleSpawned() { super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(() -> { - counterpart = getPosition().getWorldMapInstance().getNpc(getNpcId() == 217596 ? 217597 : 217596); - if (counterpart != null) - getAggroList().addHate(counterpart, 1000000); + ThreadPoolManager.getInstance().schedule(new Runnable() { + + @Override + public void run() { + counterpart = getPosition().getWorldMapInstance().getNpc(getNpcId() == 217596 ? 217597 : 217596); + if (counterpart != null) + getAggroList().addHate(counterpart, 1000000); + } }, 500); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java index 4e1cd9f0aa..31641ad0cb 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/VanktristAI.java @@ -1,9 +1,9 @@ package ai.instance.empyreanCrucible; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.concurrent.Future; -import java.util.concurrent.atomic.AtomicBoolean; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.ai.AIName; @@ -11,9 +11,10 @@ import com.aionemu.gameserver.model.gameobjects.Creature; import com.aionemu.gameserver.model.gameobjects.Npc; import com.aionemu.gameserver.model.gameobjects.player.Player; +import com.aionemu.gameserver.skillengine.model.SkillTemplate; import com.aionemu.gameserver.utils.PacketSendUtility; import com.aionemu.gameserver.utils.ThreadPoolManager; -import com.aionemu.gameserver.world.WorldPosition; +import com.aionemu.gameserver.world.geo.GeoService; import ai.AggressiveNoLootNpcAI; @@ -23,11 +24,9 @@ @AIName("vanktrist") public class VanktristAI extends AggressiveNoLootNpcAI implements HpPhases.PhaseHandler { - private final HpPhases hpPhases = new HpPhases(75, 50); + private final HpPhases hpPhases = new HpPhases(100, 75, 50); private Future phaseTask; - private final AtomicBoolean isAggred = new AtomicBoolean(false); - private final AtomicBoolean isStartedEvent = new AtomicBoolean(false); private VanktristAI(Npc owner) { super(owner); @@ -36,26 +35,18 @@ private VanktristAI(Npc owner) { @Override protected void handleAttack(Creature creature) { super.handleAttack(creature); - if (isAggred.compareAndSet(false, true)) { - PacketSendUtility.broadcastMessage(getOwner(), 0); - } - checkPercentage(getLifeStats().getHpPercentage()); - } - - public void checkPercentage(int hpPercentage) { - switch (hpPercentage) { - case 50, 75 -> { - if (isStartedEvent.compareAndSet(false, true)) - startPhaseTask(); - } - } + hpPhases.tryEnterNextPhase(this); } @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 75 -> PacketSendUtility.broadcastMessage(getOwner(), 1500210, 0, 0); - case 50 -> PacketSendUtility.broadcastMessage(getOwner(), 1500211, 0, 0); + case 100 -> PacketSendUtility.broadcastMessage(getOwner(), 0); // FIXME + case 75 -> { + PacketSendUtility.broadcastMessage(getOwner(), 1500210); // STR_CHAT_IDArena_STAGE7_D_R1_Die TODO correct msg + startPhaseTask(); + } + case 50 -> PacketSendUtility.broadcastMessage(getOwner(), 1500211); // STR_CHAT_IDArena_STAGE7_L_R2_Skill1 TODO different msg for L/D } } @@ -64,41 +55,31 @@ private void startPhaseTask() { if (isDead()) { cancelPhaseTask(); } else { - getOwner().queueSkill(19567, 46, 0); //Gravitational Shift. - List players = getLifedPlayers(); - if (!players.isEmpty()) { - int size = players.size(); - int count = Rnd.get(1, size); - for (int i = 0; i < count; i++) { - spawnWeakenedDimensionalVortex(players.get(Rnd.get(players.getFirst().getObjectId(), players.size()))); - } - } + getOwner().queueSkill(19567, 46); // Gravitational Shift } }, 3000, 15000); } - private void spawnWeakenedDimensionalVortex(Player player) { - final float x = player.getX(); - final float y = player.getY(); - final float z = player.getZ(); - if (x > 0 && y > 0 && z > 0) { - ThreadPoolManager.getInstance().schedule(new Runnable() { - @Override - public void run() { - if (!isDead()) { - spawn(217804, x, y, z, (byte) 0); //Weakened Dimensional Vortex. - } + @Override + public void onEndUseSkill(SkillTemplate skillTemplate, int skillLevel) { + if (skillTemplate.getSkillId() == 19567 && !isDead()) { + List players = getAttackablePlayers(); + if (!players.isEmpty()) { + Collections.shuffle(players); + int count = Rnd.get(1, players.size()); + for (int i = 0; i < count; i++) { + Player player = players.get(i); + spawn(217804, player.getX(), player.getY(), player.getZ(), (byte) 0); // Weakened Dimensional Vortex } - }, 3000); + } } } - private List getLifedPlayers() { - List players = new ArrayList(); + private List getAttackablePlayers() { + List players = new ArrayList<>(); for (Player player : getKnownList().getKnownPlayers().values()) { - if (!isDead()) { + if (!player.isDead() && GeoService.getInstance().canSee(getOwner(), player)) players.add(player); - } } return players; } @@ -118,27 +99,14 @@ protected void handleDespawned() { @Override protected void handleBackHome() { cancelPhaseTask(); - isStartedEvent.set(false); - isAggred.set(false); super.handleBackHome(); + hpPhases.reset(); } @Override protected void handleDied() { - final WorldPosition p = getPosition(); - if (p != null) { - deleteNpcs(p.getWorldMapInstance().getNpcs(217804)); //Vortex. - } + getPosition().getWorldMapInstance().getNpcs(217804).forEach(npc -> npc.getController().onDelete()); // Weakened Dimensional Vortex cancelPhaseTask(); super.handleDied(); } - - private void deleteNpcs(List npcs) { - for (Npc npc : npcs) { - if (npc != null) { - npc.getController().onDelete(); - } - } - } - } \ No newline at end of file diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java index 251b3bda96..56d1e4a0b3 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/WarriorPreceptorAI.java @@ -26,27 +26,27 @@ public WarriorPreceptorAI(Npc owner) { } @Override - public void handleDespawned() { + protected void handleDespawned() { cancelTask(); super.handleDespawned(); } @Override - public void handleDied() { + protected void handleDied() { cancelTask(); PacketSendUtility.broadcastMessage(getOwner(), 1500208); super.handleDied(); } @Override - public void handleBackHome() { + protected void handleBackHome() { cancelTask(); isHome.set(true); super.handleBackHome(); } @Override - public void handleAttack(Creature creature) { + protected void handleAttack(Creature creature) { super.handleAttack(creature); if (isHome.compareAndSet(true, false)) startSkillTask(); @@ -69,10 +69,7 @@ private void cancelTask() { private void startSkillEvent() { PacketSendUtility.broadcastMessage(getOwner(), 1500207); - getOwner().queueSkill(19596, 15, 0, NpcSkillTargetAttribute.RANDOM); - ThreadPoolManager.getInstance().schedule(() -> { - if (!isDead()) - getOwner().queueSkill(19596, 15, 0); - }, 6000); + getOwner().queueSkill(19595, 15, 6000, NpcSkillTargetAttribute.RANDOM); + getOwner().queueSkill(19596, 15); } } diff --git a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java index bcd166cd28..aee0425d4b 100644 --- a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java +++ b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java @@ -3,7 +3,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Set; -import java.util.stream.IntStream; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.instance.handlers.InstanceID; @@ -34,7 +33,7 @@ public class EmpyreanCrucibleInstance extends CrucibleInstance { private final List npcs = new ArrayList<>(); - private List empyreanStage = new ArrayList<>(); + private final List empyreanStage = new ArrayList<>(); private byte stage; private boolean isDoneStage4, isDoneStage6Round2, isDoneStage6Round1; @@ -110,7 +109,7 @@ public void onDie(Npc npc) { npcs.remove(npc); } EmpyreanStage es = getEmpyreanStage(npc); - int point = switch (npc.getNpcId()) { + int points = switch (npc.getNpcId()) { case 217511, 217512, 217513, 217514 -> 55; case 217515, 217516, 217517, 217518 -> 110; case 217520, 217522, 217567 -> 210; @@ -159,32 +158,31 @@ public void onDie(Npc npc) { case 217609 -> 204400; default -> 0; }; - if (point != 0) { - addPointsAndSendPacket(point, npc); + if (points != 0) { + addPointsAndSendPacket(points, npc); } switch (npc.getNpcId()) { case 205396, 205405, 217477, 217486, 205399, 205408, 217480, 217489 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_1 && IntStream.of(205396, 205405, 217477, 217486, 205399, 205408, 217480, 217489).allMatch( - i -> getNpcs(i).isEmpty())) { + if (stageType == StageType.START_STAGE_1_ROUND_1 && instance.getNpcs(205396, 205405, 217477, 217486, 205399, 205408, 217480, 217489).isEmpty()) { startStage1Round2(); } } case 217483, 217492 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_2 && IntStream.of(217483, 217492).allMatch(i -> getNpcs(i).isEmpty())) { + if (stageType == StageType.START_STAGE_1_ROUND_2 && instance.getNpcs(217483, 217492).isEmpty()) { startStage1Round3(); } } case 217478, 217487 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_3 && IntStream.of(217478, 217487).allMatch(i -> getNpcs(i).isEmpty())) { + if (stageType == StageType.START_STAGE_1_ROUND_3 && instance.getNpcs(217478, 217487).isEmpty()) { startStage1Round4(); } } case 217482, 217491 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_1_ROUND_4 && IntStream.of(217482, 217491).allMatch(i -> getNpcs(i).isEmpty())) { + if (stageType == StageType.START_STAGE_1_ROUND_4 && instance.getNpcs(217482, 217491).isEmpty()) { startStage1Round5(); } } @@ -204,29 +202,29 @@ public void onDie(Npc npc) { npc.getController().delete(); switch (stageType) { case START_STAGE_2_ROUND_1 -> { - if (IntStream.of(217503, 217504).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217503, 217504).isEmpty()) startStage2Round2(); } case START_STAGE_2_ROUND_2 -> { - if (IntStream.of(217508, 217507, 217504).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217508, 217507, 217504).isEmpty()) startStage2Round3(); } } } case 217503 -> { npc.getController().delete(); - if (stageType == StageType.START_STAGE_2_ROUND_1 && IntStream.of(217502, 217504).allMatch(i -> getNpcs(i).isEmpty())) + if (stageType == StageType.START_STAGE_2_ROUND_1 && instance.getNpcs(217502, 217504).isEmpty()) startStage2Round2(); } case 217504 -> { // S2_RatmanScout_55_Ae npc.getController().delete(); switch (stageType) { case START_STAGE_2_ROUND_1 -> { - if (IntStream.of(217502, 217503).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217502, 217503).isEmpty()) startStage2Round2(); } case START_STAGE_2_ROUND_2 -> { - if (IntStream.of(217502, 217507, 217508).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217502, 217507, 217508).isEmpty()) startStage2Round3(); } } @@ -235,7 +233,7 @@ public void onDie(Npc npc) { npc.getController().delete(); switch (stageType) { case START_STAGE_2_ROUND_2 -> { - if (IntStream.of(217502, 217504, 217508).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217502, 217504, 217508).isEmpty()) startStage2Round3(); } } @@ -250,7 +248,7 @@ public void onDie(Npc npc) { } switch (stageType) { case START_STAGE_2_ROUND_2 -> { - if (IntStream.of(217502, 217504, 217507).allMatch(i -> getNpcs(i).isEmpty())) + if (instance.getNpcs(217502, 217504, 217507).isEmpty()) startStage2Round3(); } case START_STAGE_2_ROUND_4 -> { @@ -300,7 +298,7 @@ public void onDie(Npc npc) { } case 217511, 217512, 217513, 217514 -> { npc.getController().delete(); - if (IntStream.of(217511, 217512, 217513, 217514).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217511, 217512, 217513, 217514).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_STAGE_3_ROUND_2, 2000); sp(217515, 336.32092f, 345.0251f, 96.090935f, (byte) 0, 6000); // S3_ElementalEarth_2nd_55_Ae sp(217516, 347.16144f, 361.89084f, 96.09093f, (byte) 0, 6000); // S3_ElementalFire_2nd_55_Ae @@ -318,7 +316,7 @@ public void onDie(Npc npc) { } case 217515, 217516, 217517, 217518 -> { npc.getController().delete(); - if (IntStream.of(217515, 217516, 217517, 217518).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217515, 217516, 217517, 217518).isEmpty()) { setStage(StageType.START_STAGE_3_ROUND_3, 2000); sp(217519, 351.08026f, 341.61298f, 96.090935f, (byte) 0, 6000); // S3_ElementalEarth_3rd_55_Ae sp(217521, 333.4532f, 354.7357f, 96.09094f, (byte) 0, 6000); // S3_ElementalWater_3rd_55_Ae @@ -330,7 +328,7 @@ public void onDie(Npc npc) { } case 217519, 217520, 217521, 217522 -> { npc.getController().delete(); - if (IntStream.of(217519, 217520, 217521, 217522).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217519, 217520, 217521, 217522).isEmpty()) { setStage(StageType.START_STAGE_3_ROUND_4, 2000); sp(217524, 349.66446f, 341.4752f, 96.090965f, (byte) 0, 6000); // S3_ElementalFire_4th_55_Ae sp(217525, 338.32742f, 356.29636f, 96.090935f, (byte) 0, 6000); // S3_ElementalWater_4th_55_Ae @@ -340,7 +338,7 @@ public void onDie(Npc npc) { } case 217523, 217524, 217525, 217526 -> { npc.getController().delete(); - if (IntStream.of(217523, 217524, 217525, 217526).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217523, 217524, 217525, 217526).isEmpty()) { setStage(StageType.START_STAGE_3_ROUND_5, 2000); sp(217527, 335.37524f, 346.34567f, 96.09094f, (byte) 0, 6000); // S3_MagmaElemental_Boss_55_Ah sp(217528, 335.36105f, 353.16922f, 96.09094f, (byte) 0, 6000); // S3_TempestElemental_Boss_55_Ah @@ -348,7 +346,7 @@ public void onDie(Npc npc) { } case 217527, 217528 -> { npc.getController().delete(); - if (IntStream.of(217527, 217528).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217527, 217528).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.START_BONUS_STAGE_3, 7000); sp(217744, 342.45215f, 349.339f, 96.09096f, (byte) 0, 7000); // S3_Elemeltal_CTRL ThreadPoolManager.getInstance().schedule(this::startBonusStage3, 39000); @@ -358,7 +356,7 @@ public void onDie(Npc npc) { npc.getController().delete(); switch (stageType) { case START_STAGE_4_ROUND_1 -> { - if (IntStream.of(217557, 217559, 217562).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217557, 217559, 217562).allMatch(id -> getNpcs(id).isEmpty())) { sp(217558, 330.27792f, 339.2779f, 96.09093f, (byte) 6); // S5_Lizard_As_55_Ae sp(217558, 328.08972f, 346.3553f, 96.090904f, (byte) 1); // S5_Lizard_As_55_Ae } @@ -422,7 +420,7 @@ public void onDie(Npc npc) { } case 217651, 217652, 217653 -> { npc.getController().delete(); - if (isDoneStage4 && IntStream.of(217651, 217652, 217653).allMatch(id -> getNpcs(id).isEmpty())) { + if (isDoneStage4 && instance.getNpcs(217651, 217652, 217653).allMatch(id -> getNpcs(id).isEmpty())) { setStage(StageType.PASS_GROUP_STAGE_4, 0); sp(217749, 340.59f, 349.32166f, 96.09096f, (byte) 0, 6000); // S4_Draky_CTRL setStage(StageType.START_BONUS_STAGE_4, 6000); @@ -431,14 +429,14 @@ public void onDie(Npc npc) { } case 217547, 217548, 217549 -> { npc.getController().delete(); - if (IntStream.of(217547, 217548, 217549).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217547, 217548, 217549).isEmpty()) { sp(217550, 1266.293f, 778.3254f, 358.60574f, (byte) 30, 4000); // S4_ShulackPr_55_Ae sp(217545, 1254.261f, 778.3817f, 358.6056f, (byte) 30, 4000); // S4_ShulackFi_55_Ae } } case 217545, 217550 -> { npc.getController().delete(); - if (IntStream.of(217545, 217550).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217545, 217550).isEmpty()) { setStage(StageType.START_STAGE_5_ROUND_2, 2000); sp(217552, 1246.0197f, 788.8341f, 358.60556f, (byte) 11, 6000); // S4_ShulackBartenderNmd_55_Ah } @@ -502,7 +500,7 @@ public void onDie(Npc npc) { case 217569 -> { sp(205414, npc.getX(), npc.getY(), npc.getZ(), npc.getHeading()); npc.getController().delete(); - if (stageType == StageType.START_STAGE_6_ROUND_2 && isDoneStage6Round2 && IntStream.of(217569, 217570).allMatch(i -> getNpcs(i).isEmpty())) { + if (stageType == StageType.START_STAGE_6_ROUND_2 && isDoneStage6Round2 && instance.getNpcs(217569, 217570).isEmpty()) { setStage(StageType.START_STAGE_6_ROUND_3, 2000); sp(217572, 1629.5837f, 138.38435f, 126f, (byte) 30, 9000); // S6_DeathNight_Live_55_Ah sp(217569, 1635.01535f, 150.01535f, 126f, (byte) 45, 6000); // S6_LichEquip_55_Ae @@ -590,7 +588,7 @@ public void onDie(Npc npc) { if (counterpart != null && !counterpart.isDead()) SkillEngine.getInstance().getSkill(counterpart, 19624, 10, counterpart).useNoAnimationSkill(); npc.getController().delete(); - if (IntStream.of(217596, 217597).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217596, 217597).isEmpty()) { setStage(StageType.START_STAGE_9_ROUND_4, 2000); sp(217598, 1311.5238f, 1755.2079f, 317.1f, (byte) 97, 2000); // S9_Shellizard_Gi_55_Ah } @@ -607,7 +605,7 @@ public void onDie(Npc npc) { } case 217600, 217601, 217602 -> { npc.getController().delete(); - if (IntStream.of(217600, 217601, 217602).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217600, 217601, 217602).isEmpty()) { setStage(StageType.START_STAGE_10_ROUND_2, 2000); sp(217603, 1744.6332f, 1280.0349f, 394.3f, (byte) 9, 2000); // S10_Drakan_Fi_High_55_Ae sp(217604, 1756.2661f, 1305.561f, 394.3f, (byte) 97, 6000); // S10_Drakan_Sc_High_55_Ae @@ -617,7 +615,7 @@ public void onDie(Npc npc) { } case 217603, 217604, 217605, 217606 -> { npc.getController().delete(); - if (IntStream.of(217603, 217604, 217605, 217606).allMatch(i -> getNpcs(i).isEmpty())) { + if (instance.getNpcs(217603, 217604, 217605, 217606).isEmpty()) { setStage(StageType.START_STAGE_10_ROUND_3, 2000); sp(700441, 1742.39f, 1289.59f, 394.237f, (byte) 68, 2000); // BIDLF1_WaterGolem1_Switch3_50_n sp(700441, 1782.32f, 1272.74f, 394.237f, (byte) 94, 2000); // BIDLF1_WaterGolem1_Switch3_50_n @@ -741,13 +739,13 @@ private void startStage2Round2() { private void startStage2Round3() { setStage(StageType.START_STAGE_2_ROUND_3, 2000); - sp(Rnd.get(1, 2) == 1 ? 217500 : 217509, 332.0035f, 349.55893f, 96.09093f, (byte) 0, + sp(Rnd.nextBoolean() ? 217500 : 217509, 332.0035f, 349.55893f, 96.09093f, (byte) 0, 6000); // S2_KrallScout_MidBoss_55_Ah, S2_LycanRanger_Named_55_Ah } private void startStage2Round5() { setStage(StageType.START_STAGE_2_ROUND_5, 2000); - sp(Rnd.get(1, 2) == 1 ? 217510 : 217501, 332.0035f, 349.55893f, 96.09093f, (byte) 0, + sp(Rnd.nextBoolean() ? 217510 : 217501, 332.0035f, 349.55893f, 96.09093f, (byte) 0, 6000); // S2_LycanWizard_Boss_55_Ah, S2_KrallWarrior_Boss_55_Ah } @@ -839,8 +837,6 @@ public void onChangeStage(StageType type) { sp(217477, 327.73657f, 347.96228f, 96.09092f, (byte) 0, 9000); // S1_TempleL_Kn_55_Ae sp(217480, 327.81943f, 350.948f, 96.09093f, (byte) 0, 9000); // S1_TempleL_Wi_55_Ae } - default -> { - } } ThreadPoolManager.getInstance().schedule(() -> { if (!isSpawn(round)) { @@ -920,13 +916,11 @@ public void onChangeStage(StageType type) { switch (race) { case ASMODIANS -> sp(217582, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); // S7_MasterD_Wa_55_Ah case ELYOS -> sp(217578, 1783.0873f, 796.8426f, 469.35013f, (byte) 0, 6000); // S7_MasterL_Wa_55_Ah - default -> { - } } } case START_STAGE_8_ROUND_1 -> { setStage(type, 2000); - sp(Rnd.get(1, 2) == 1 ? 217588 : 217589, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); // S8_Cromede_55_Ah, S8_Cromede_Hard_55_Ah + sp(Rnd.nextBoolean() ? 217588 : 217589, 1776.578f, 1773.231f, 303.695f, (byte) 90, 6000); // S8_Cromede_55_Ah, S8_Cromede_Hard_55_Ah } case START_STAGE_9_ROUND_1 -> { setStage(type, 2000); @@ -996,8 +990,6 @@ private void startStage1Round2() { round.add(217483); sp(217483, 332.7714f, 358.48206f, 96.09092f, (byte) 106, 6000); // S1_TempleL_Ch_55_Ae } - default -> { - } } ThreadPoolManager.getInstance().schedule(() -> { if (!isSpawn(round)) @@ -1019,8 +1011,6 @@ private void startStage1Round3() { round.add(217478); sp(217478, 334.844f, 339.92618f, 96.09094f, (byte) 106, 6000); // S1_TempleL_As_55_Ae } - default -> { - } } ThreadPoolManager.getInstance().schedule(() -> { if (!isSpawn(round)) @@ -1042,8 +1032,6 @@ private void startStage1Round4() { round.add(217482); sp(217482, 341.03156f, 361.04315f, 96.09093f, (byte) 106, 6000); // S1_TempleL_Pr_55_Ae } - default -> { - } } ThreadPoolManager.getInstance().schedule(() -> { if (!isSpawn(round)) @@ -1058,8 +1046,6 @@ private void startStage1Round5() { switch (race) { case ASMODIANS -> sp(217493, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); // S1_TempleD_Fi_Boss_55_Ah case ELYOS -> sp(217484, 332.093f, 349.36847f, 96.090935f, (byte) 119, 6000); // S1_TempleL_Fi_Boss_55_Ah - default -> { - } } } diff --git a/game-server/data/static_data/npcs/npc_templates.xml b/game-server/data/static_data/npcs/npc_templates.xml index deb7928881..d8ed049c53 100644 --- a/game-server/data/static_data/npcs/npc_templates.xml +++ b/game-server/data/static_data/npcs/npc_templates.xml @@ -113467,7 +113467,7 @@ - + @@ -113525,7 +113525,7 @@ - + From ec1b3a95ec7fa99c94ab3f48b577768893fdf71b Mon Sep 17 00:00:00 2001 From: Neon Date: Mon, 5 Aug 2024 02:13:12 +0200 Subject: [PATCH 5/5] Fixup --- .../empyreanCrucible/PriestPreceptorAI.java | 31 +++++++++---------- .../instance/empyreanCrucible/RM1337AI.java | 2 +- .../crucible/EmpyreanCrucibleInstance.java | 8 ++--- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java index 165b790c55..b6fcc3ee65 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/PriestPreceptorAI.java @@ -28,10 +28,22 @@ public PriestPreceptorAI(Npc owner) { helpers = new int[] { 282369, 282370, 282371 }; // Traufnir, Sigyn, Sif } - @Override protected void handleSpawned() { super.handleSpawned(); - ThreadPoolManager.getInstance().schedule(() -> getOwner().queueSkill(19612, 46), 1000); + ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(getOwner(), 19612, 15, getOwner()).useNoAnimationSkill(), 1000); + } + + @Override + protected void handleDied() { + despawnHelpers(); + super.handleDied(); + } + + @Override + protected void handleBackHome() { + despawnHelpers(); + super.handleBackHome(); + hpPhases.reset(); } @Override @@ -43,7 +55,7 @@ protected void handleAttack(Creature creature) { @Override public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { - case 75 -> getOwner().queueSkill(19611, 46, -1, NpcSkillTargetAttribute.RANDOM); + case 75 -> getOwner().queueSkill(19611, 46, -1, NpcSkillTargetAttribute.RANDOM); // Word of Destruction II case 25 -> startTask(); } } @@ -62,19 +74,6 @@ private void applySoulSickness(Npc npc) { ThreadPoolManager.getInstance().schedule(() -> SkillEngine.getInstance().getSkill(npc, 19594, 4, npc).useNoAnimationSkill(), 1000); } - @Override - protected void handleDied() { - despawnHelpers(); - super.handleDied(); - } - - @Override - protected void handleBackHome() { - despawnHelpers(); - super.handleDied(); - hpPhases.reset(); - } - private void despawnHelpers() { getPosition().getWorldMapInstance().getNpcs(helpers).forEach(npc -> npc.getController().deleteIfAliveOrCancelRespawn()); } diff --git a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java index 9661bec889..cec5bf7c60 100644 --- a/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java +++ b/game-server/data/handlers/ai/instance/empyreanCrucible/RM1337AI.java @@ -63,7 +63,7 @@ protected void handleAttack(Creature creature) { public void handleHpPhase(int phaseHpPercent) { switch (phaseHpPercent) { case 100 -> startSkillTask1(); - case 95 -> startSkillTask2(); + case 75 -> startSkillTask2(); } } diff --git a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java index aee0425d4b..df38bd0196 100644 --- a/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java +++ b/game-server/data/handlers/instance/crucible/EmpyreanCrucibleInstance.java @@ -298,7 +298,7 @@ public void onDie(Npc npc) { } case 217511, 217512, 217513, 217514 -> { npc.getController().delete(); - if (instance.getNpcs(217511, 217512, 217513, 217514).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217511, 217512, 217513, 217514).isEmpty()) { setStage(StageType.START_STAGE_3_ROUND_2, 2000); sp(217515, 336.32092f, 345.0251f, 96.090935f, (byte) 0, 6000); // S3_ElementalEarth_2nd_55_Ae sp(217516, 347.16144f, 361.89084f, 96.09093f, (byte) 0, 6000); // S3_ElementalFire_2nd_55_Ae @@ -346,7 +346,7 @@ public void onDie(Npc npc) { } case 217527, 217528 -> { npc.getController().delete(); - if (instance.getNpcs(217527, 217528).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217527, 217528).isEmpty()) { setStage(StageType.START_BONUS_STAGE_3, 7000); sp(217744, 342.45215f, 349.339f, 96.09096f, (byte) 0, 7000); // S3_Elemeltal_CTRL ThreadPoolManager.getInstance().schedule(this::startBonusStage3, 39000); @@ -356,7 +356,7 @@ public void onDie(Npc npc) { npc.getController().delete(); switch (stageType) { case START_STAGE_4_ROUND_1 -> { - if (instance.getNpcs(217557, 217559, 217562).allMatch(id -> getNpcs(id).isEmpty())) { + if (instance.getNpcs(217557, 217559, 217562).isEmpty()) { sp(217558, 330.27792f, 339.2779f, 96.09093f, (byte) 6); // S5_Lizard_As_55_Ae sp(217558, 328.08972f, 346.3553f, 96.090904f, (byte) 1); // S5_Lizard_As_55_Ae } @@ -420,7 +420,7 @@ public void onDie(Npc npc) { } case 217651, 217652, 217653 -> { npc.getController().delete(); - if (isDoneStage4 && instance.getNpcs(217651, 217652, 217653).allMatch(id -> getNpcs(id).isEmpty())) { + if (isDoneStage4 && instance.getNpcs(217651, 217652, 217653).isEmpty()) { setStage(StageType.PASS_GROUP_STAGE_4, 0); sp(217749, 340.59f, 349.32166f, 96.09096f, (byte) 0, 6000); // S4_Draky_CTRL setStage(StageType.START_BONUS_STAGE_4, 6000);