From 049e439053f48c98613c8632cb26a75a7ee3b151 Mon Sep 17 00:00:00 2001 From: MobiusDev <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sat, 2 Mar 2019 23:46:27 +0000 Subject: [PATCH] Re-addition of Anakim, Lilith and Orfen. --- .../db_installer/sql/game/grandboss_data.sql | 6 +- .../scripts/ai/bosses/Anakim/31101-01.html | 4 + .../scripts/ai/bosses/Anakim/31101-02.html | 3 + .../scripts/ai/bosses/Anakim/31101-03.html | 4 + .../scripts/ai/bosses/Anakim/31101-04.html | 3 + .../data/scripts/ai/bosses/Anakim/31101.html | 7 + .../data/scripts/ai/bosses/Anakim/31109.html | 5 + .../data/scripts/ai/bosses/Anakim/31111.html | 4 + .../data/scripts/ai/bosses/Anakim/Anakim.java | 685 ++++++ .../data/scripts/ai/bosses/Lilith/31110.html | 4 + .../scripts/ai/bosses/Lilith/31118-01.html | 4 + .../scripts/ai/bosses/Lilith/31118-02.html | 3 + .../scripts/ai/bosses/Lilith/31118-03.html | 4 + .../scripts/ai/bosses/Lilith/31118-04.html | 3 + .../data/scripts/ai/bosses/Lilith/31118.html | 7 + .../data/scripts/ai/bosses/Lilith/31124.html | 5 + .../data/scripts/ai/bosses/Lilith/Lilith.java | 703 ++++++ .../data/scripts/ai/bosses/Orfen/Orfen.java | 348 +++ .../dist/game/data/stats/npcs/19400-19499.xml | 19 + .../dist/game/data/stats/npcs/29300-29399.xml | 1895 ++++++++++++++++- 20 files changed, 3706 insertions(+), 10 deletions(-) create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-01.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-02.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-03.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-04.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31109.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31111.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/Anakim.java create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31110.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-01.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-02.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-03.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-04.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31124.html create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/Lilith.java create mode 100644 L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Orfen/Orfen.java diff --git a/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql b/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql index 9f43700f04..f781f20e7e 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql +++ b/L2J_Mobius_6.0_Fafurion/dist/db_installer/sql/game/grandboss_data.sql @@ -15,14 +15,14 @@ CREATE TABLE IF NOT EXISTS `grandboss_data` ( INSERT IGNORE INTO `grandboss_data` (`boss_id`,`loc_x`,`loc_y`,`loc_z`,`heading`,`currentHP`,`currentMP`) VALUES (29001, -21610, 181594, -5734, 0, 229898.48, 667.776), -- Queen Ant (29006, 17726, 108915, -6480, 0, 622493.58388, 3793.536), -- Core -(29014, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen +(29325, 55024, 17368, -5412, 10126, 622493.58388, 3793.536), -- Orfen (29020, 116033, 17447, 10107, -25348, 4068372, 39960), -- Baium (29068, 185708, 114298, -8221,32768, 62802301, 1998000), -- Antharas (29028, -105200, -253104, -15264, 0, 62041918, 2248572), -- Valakas (29240, 0, 0, 0, 0, 288282589, 47100), -- Lindvior (29197, 81208, -182095, -9895, 0, 512402016, 47100), -- Trasken (29118, 0, 0, 0, 0, 4109288, 1220547), -- Beleth -(25286, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim -(25283, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith +(29336, 185080, -12613, -5499, 16550, 556345880, 86847), -- Anakim +(29348, 185062, -9605, -5499, 15640, 486021997, 79600), -- Lilith (26124, 0, 0, 0, 0, 13945521, 50920), -- Kelbim (29305, 0, 0, 0, 0, 589355368, 51696); -- Helios diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-01.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-01.html new file mode 100644 index 0000000000..598b3a9284 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-01.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
+A human-like voice comes from a glowing blue orb:
+Someone went in already, and Anakim has disappeared soon after. There is no point in entering right now. + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-02.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-02.html new file mode 100644 index 0000000000..c8bbfb12fe --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-02.html @@ -0,0 +1,3 @@ +Gatekeeper Ziggurat:
+(A command channel needs at least %min% members to challenge Anakim.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-03.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-03.html new file mode 100644 index 0000000000..3a6589712f --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-03.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:
+(The players who belong to an association can only enter through the Association Leader.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-04.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-04.html new file mode 100644 index 0000000000..987062b32c --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101-04.html @@ -0,0 +1,3 @@ +Gatekeeper Ziggurat:
+(A command channel members level must be %minlvl% - %maxlvl% to challenge Anakim.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101.html new file mode 100644 index 0000000000..f9efd0bcf5 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31101.html @@ -0,0 +1,7 @@ +Gatekeeper Ziggurat:
+A Human voice seems to emanate from a shining, blue globe:
+Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.
+ + + + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31109.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31109.html new file mode 100644 index 0000000000..0f02e41872 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31109.html @@ -0,0 +1,5 @@ +Gatekeeper Spirit:
+Behold, the sphere speaks...
+You must leave this place!
+ + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31111.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31111.html new file mode 100644 index 0000000000..d219356c29 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/31111.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
A human-like voice comes from a glowing blue orb:
+ + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/Anakim.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/Anakim.java new file mode 100644 index 0000000000..bb7e533836 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Anakim/Anakim.java @@ -0,0 +1,685 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ai.bosses.Anakim; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.CommonUtil; +import com.l2jmobius.commons.util.Rnd; +import com.l2jmobius.gameserver.ai.CtrlIntention; +import com.l2jmobius.gameserver.data.xml.impl.SkillData; +import com.l2jmobius.gameserver.instancemanager.GrandBossManager; +import com.l2jmobius.gameserver.instancemanager.MapRegionManager; +import com.l2jmobius.gameserver.instancemanager.ZoneManager; +import com.l2jmobius.gameserver.model.L2Object; +import com.l2jmobius.gameserver.model.L2Party; +import com.l2jmobius.gameserver.model.L2Spawn; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.TeleportWhereType; +import com.l2jmobius.gameserver.model.actor.L2Attackable; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Npc; +import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.holders.SpawnHolder; +import com.l2jmobius.gameserver.model.quest.QuestTimer; +import com.l2jmobius.gameserver.model.skills.AbnormalType; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.model.zone.L2ZoneType; +import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage; + +import ai.AbstractNpcAI; + +/** + * Anakim AI
+ * @author LasTravel
+ * @URL http://boards.lineage2.com/showpost.php?p=3386784&postcount=6
+ * @video http://www.youtube.com/watch?v=LecymFTJQzQ + */ +public class Anakim extends AbstractNpcAI +{ + // Status + private static final int ALIVE = 0; + private static final int WAITING = 1; + private static final int FIGHTING = 2; + private static final int DEAD = 3; + // NPCs + private static final int ANAKIM = 29348; + private static final int REMNANT = 19490; // Using custom NPC. + private static final int ENTER_CUBIC = 31101; + private static final int EXIST_CUBIC = 31109; + private static final int ANAKIM_CUBIC = 31111; + //@formatter:off + private static final int[] ANAKIM_MINIONS = {29349, 29350, 29351}; + private static final int[] NECRO_MOBS = {29352, 29353, 29354, 29355, 29356, 29357, 29358, 29359}; + //@formatter:on + private static final int[] ALL_MOBS = + { + ANAKIM, + ANAKIM_MINIONS[0], + ANAKIM_MINIONS[1], + ANAKIM_MINIONS[2], + NECRO_MOBS[0], + NECRO_MOBS[1], + NECRO_MOBS[2], + NECRO_MOBS[3], + NECRO_MOBS[4], + NECRO_MOBS[5], + NECRO_MOBS[6], + NECRO_MOBS[7], + REMNANT + }; + // Skill + private static final Skill REMANT_TELE = SkillData.getInstance().getSkill(23303, 1); + // Spawns + private static final List SPAWNS = new ArrayList<>(); + static + { + SPAWNS.add(new SpawnHolder(29359, 173077, -16317, -4906, 4056, false)); + SPAWNS.add(new SpawnHolder(29355, 173082, -16047, -4906, 14971, false)); + SPAWNS.add(new SpawnHolder(29359, 174578, -17866, -4906, 25990, false)); + SPAWNS.add(new SpawnHolder(29358, 175172, -14020, -4904, 8666, false)); + SPAWNS.add(new SpawnHolder(29352, 175176, -14809, -4904, 10473, false)); + SPAWNS.add(new SpawnHolder(29354, 175510, -14982, -4906, 11447, false)); + SPAWNS.add(new SpawnHolder(29353, 176466, -17481, -4904, 63292, false)); + SPAWNS.add(new SpawnHolder(29354, 176864, -14996, -4904, 53988, false)); + SPAWNS.add(new SpawnHolder(29356, 176887, -14742, -4906, 31818, false)); + SPAWNS.add(new SpawnHolder(29353, 177261, -17739, -4904, 17424, false)); + SPAWNS.add(new SpawnHolder(29359, 177451, -12992, -4925, 1420, false)); + SPAWNS.add(new SpawnHolder(29359, 179151, -13687, -4906, 48500, false)); + SPAWNS.add(new SpawnHolder(29359, 179385, -12830, -4904, 41930, false)); + SPAWNS.add(new SpawnHolder(29352, 178338, -17401, -4904, 15803, false)); + SPAWNS.add(new SpawnHolder(29352, 178515, -12993, -4925, 1155, false)); + SPAWNS.add(new SpawnHolder(29359, 178766, -15805, -4904, 1183, false)); + SPAWNS.add(new SpawnHolder(29358, 178776, -15535, -4927, 13472, false)); + SPAWNS.add(new SpawnHolder(29353, 180557, -16149, -4906, 40308, false)); + SPAWNS.add(new SpawnHolder(29358, 180636, -16493, -4927, 50561, false)); + SPAWNS.add(new SpawnHolder(29355, 180750, -13175, -4906, 44641, false)); + SPAWNS.add(new SpawnHolder(29354, 181019, -12961, -4904, 1972, false)); + SPAWNS.add(new SpawnHolder(29357, 182219, -14352, -4904, 33181, false)); + SPAWNS.add(new SpawnHolder(29352, 182923, -14598, -4906, 24425, false)); + SPAWNS.add(new SpawnHolder(29359, 182940, -12808, -4904, 12476, false)); + SPAWNS.add(new SpawnHolder(29354, 182952, -17418, -4904, 15163, false)); + SPAWNS.add(new SpawnHolder(29356, 172455, -9219, -4906, 64914, false)); + SPAWNS.add(new SpawnHolder(29358, 172468, -7295, -4904, 1132, false)); + SPAWNS.add(new SpawnHolder(29354, 172508, -10953, -4904, 61515, false)); + SPAWNS.add(new SpawnHolder(29353, 172880, -11898, -4925, 65021, false)); + SPAWNS.add(new SpawnHolder(29357, 173598, -11065, -4927, 571, false)); + SPAWNS.add(new SpawnHolder(29352, 173928, -7388, -4927, 34341, false)); + SPAWNS.add(new SpawnHolder(29352, 174259, -7974, -4906, 7003, false)); + SPAWNS.add(new SpawnHolder(29353, 175519, -9575, -4906, 58165, false)); + SPAWNS.add(new SpawnHolder(29353, 175527, -12001, -4906, 59818, false)); + SPAWNS.add(new SpawnHolder(29359, 176524, -9907, -4906, 5094, false)); + SPAWNS.add(new SpawnHolder(29357, 177097, -11914, -4904, 32360, false)); + SPAWNS.add(new SpawnHolder(29357, 177279, -7486, -4904, 47036, false)); + SPAWNS.add(new SpawnHolder(29356, 178337, -11691, -4904, 16100, false)); + SPAWNS.add(new SpawnHolder(29356, 178357, -7493, -4904, 50527, false)); + SPAWNS.add(new SpawnHolder(29353, 179213, -9903, -4906, 6134, false)); + SPAWNS.add(new SpawnHolder(29353, 180086, -9917, -4906, 33891, false)); + SPAWNS.add(new SpawnHolder(29354, 180472, -10304, -4904, 49629, false)); + SPAWNS.add(new SpawnHolder(29358, 180577, -11232, -4906, 48645, false)); + SPAWNS.add(new SpawnHolder(29353, 181269, -7388, -4904, 426, false)); + SPAWNS.add(new SpawnHolder(29352, 182519, -8817, -4906, 49404, false)); + SPAWNS.add(new SpawnHolder(29353, 182612, -8674, -4904, 44491, false)); + SPAWNS.add(new SpawnHolder(29359, 183165, -7264, -4904, 28242, false)); + SPAWNS.add(new SpawnHolder(29354, 172469, -12995, -4904, 819, false)); + SPAWNS.add(new SpawnHolder(29357, 172765, -16043, -4906, 48239, false)); + SPAWNS.add(new SpawnHolder(29356, 173490, -16291, -4906, 514, false)); + SPAWNS.add(new SpawnHolder(29357, 174545, -17625, -4904, 41172, false)); + SPAWNS.add(new SpawnHolder(29352, 174907, -17434, -4906, 10827, false)); + SPAWNS.add(new SpawnHolder(29357, 175010, -13720, -4906, 18841, false)); + SPAWNS.add(new SpawnHolder(29356, 175316, -15239, -4906, 20459, false)); + SPAWNS.add(new SpawnHolder(29356, 176275, -16947, -4904, 19252, false)); + SPAWNS.add(new SpawnHolder(29357, 176443, -17690, -4906, 65438, false)); + SPAWNS.add(new SpawnHolder(29352, 176677, -15076, -4906, 47622, false)); + SPAWNS.add(new SpawnHolder(29352, 177168, -14718, -4927, 20070, false)); + SPAWNS.add(new SpawnHolder(29353, 177424, -17617, -4904, 3700, false)); + SPAWNS.add(new SpawnHolder(29359, 179467, -13725, -4906, 43672, false)); + SPAWNS.add(new SpawnHolder(29356, 179526, -13134, -4927, 52220, false)); + SPAWNS.add(new SpawnHolder(29353, 178349, -12839, -4904, 18461, false)); + SPAWNS.add(new SpawnHolder(29352, 178428, -15548, -4906, 55285, false)); + SPAWNS.add(new SpawnHolder(29357, 178546, -17597, -4904, 2584, false)); + SPAWNS.add(new SpawnHolder(29357, 179256, -15820, -4906, 64089, false)); + SPAWNS.add(new SpawnHolder(29353, 180340, -15506, -4906, 51622, false)); + SPAWNS.add(new SpawnHolder(29355, 180555, -13151, -4906, 48007, false)); + SPAWNS.add(new SpawnHolder(29355, 180789, -16337, -4906, 8540, false)); + SPAWNS.add(new SpawnHolder(29355, 180794, -13066, -4904, 62828, false)); + SPAWNS.add(new SpawnHolder(29356, 181987, -14470, -4925, 36453, false)); + SPAWNS.add(new SpawnHolder(29356, 182752, -17591, -4904, 31555, false)); + SPAWNS.add(new SpawnHolder(29352, 183052, -14243, -4927, 17937, false)); + SPAWNS.add(new SpawnHolder(29359, 183145, -12992, -4904, 35585, false)); + SPAWNS.add(new SpawnHolder(29352, 172505, -11880, -4904, 7971, false)); + SPAWNS.add(new SpawnHolder(29355, 172514, -10004, -4906, 7764, false)); + SPAWNS.add(new SpawnHolder(29353, 172730, -9035, -4925, 20022, false)); + SPAWNS.add(new SpawnHolder(29352, 172839, -7282, -4904, 407, false)); + SPAWNS.add(new SpawnHolder(29352, 172890, -11128, -4906, 36753, false)); + SPAWNS.add(new SpawnHolder(29356, 173200, -10885, -4904, 64025, false)); + SPAWNS.add(new SpawnHolder(29353, 173969, -8136, -4906, 51517, false)); + SPAWNS.add(new SpawnHolder(29355, 174223, -7296, -4906, 40856, false)); + SPAWNS.add(new SpawnHolder(29359, 174964, -9859, -4904, 61063, false)); + SPAWNS.add(new SpawnHolder(29354, 175234, -11487, -4906, 32278, false)); + SPAWNS.add(new SpawnHolder(29357, 175508, -11435, -4906, 10075, false)); + SPAWNS.add(new SpawnHolder(29357, 175872, -9856, -4925, 5782, false)); + SPAWNS.add(new SpawnHolder(29357, 177259, -7101, -4904, 51015, false)); + SPAWNS.add(new SpawnHolder(29358, 177451, -11916, -4904, 762, false)); + SPAWNS.add(new SpawnHolder(29358, 178343, -12110, -4904, 49406, false)); + SPAWNS.add(new SpawnHolder(29359, 178346, -7111, -4904, 53343, false)); + SPAWNS.add(new SpawnHolder(29354, 178670, -9862, -4927, 9673, false)); + SPAWNS.add(new SpawnHolder(29354, 178962, -10192, -4906, 63558, false)); + SPAWNS.add(new SpawnHolder(29354, 180589, -9772, -4906, 55342, false)); + SPAWNS.add(new SpawnHolder(29354, 180681, -7470, -4906, 51819, false)); + SPAWNS.add(new SpawnHolder(29357, 180830, -10655, -4906, 6352, false)); + SPAWNS.add(new SpawnHolder(29359, 181038, -7145, -4906, 52771, false)); + SPAWNS.add(new SpawnHolder(29356, 182094, -8779, -4904, 39237, false)); + SPAWNS.add(new SpawnHolder(29358, 182783, -7300, -4904, 32768, false)); + SPAWNS.add(new SpawnHolder(29357, 183072, -8569, -4906, 17776, false)); + SPAWNS.add(new SpawnHolder(29357, 172550, -16371, -4906, 50062, false)); + SPAWNS.add(new SpawnHolder(29358, 172655, -12687, -4904, 16450, false)); + SPAWNS.add(new SpawnHolder(29357, 174277, -17521, -4904, 30613, false)); + SPAWNS.add(new SpawnHolder(29359, 174716, -17481, -4904, 17821, false)); + SPAWNS.add(new SpawnHolder(29357, 174756, -14268, -4906, 31489, false)); + SPAWNS.add(new SpawnHolder(29353, 174949, -13934, -4906, 10044, false)); + SPAWNS.add(new SpawnHolder(29355, 175243, -14276, -4904, 54713, false)); + SPAWNS.add(new SpawnHolder(29355, 176327, -14884, -4904, 36197, false)); + SPAWNS.add(new SpawnHolder(29358, 176378, -17184, -4904, 61540, false)); + SPAWNS.add(new SpawnHolder(29356, 176414, -16655, -4906, 20877, false)); + SPAWNS.add(new SpawnHolder(29354, 176576, -14876, -4904, 53805, false)); + SPAWNS.add(new SpawnHolder(29354, 177039, -17604, -4904, 31523, false)); + SPAWNS.add(new SpawnHolder(29359, 177046, -12988, -4904, 34343, false)); + SPAWNS.add(new SpawnHolder(29356, 177361, -14704, -4906, 19318, false)); + SPAWNS.add(new SpawnHolder(29358, 179145, -13076, -4906, 35562, false)); + SPAWNS.add(new SpawnHolder(29356, 179328, -13363, -4904, 45077, false)); + SPAWNS.add(new SpawnHolder(29355, 178136, -17606, -4904, 33699, false)); + SPAWNS.add(new SpawnHolder(29356, 178202, -12994, -4904, 33656, false)); + SPAWNS.add(new SpawnHolder(29358, 178253, -15890, -4906, 50087, false)); + SPAWNS.add(new SpawnHolder(29359, 179258, -15629, -4904, 1139, false)); + SPAWNS.add(new SpawnHolder(29354, 180197, -13096, -4906, 64516, false)); + SPAWNS.add(new SpawnHolder(29355, 180358, -16895, -4906, 45409, false)); + SPAWNS.add(new SpawnHolder(29354, 180400, -16511, -4904, 9156, false)); + SPAWNS.add(new SpawnHolder(29352, 180472, -15369, -4925, 51432, false)); + SPAWNS.add(new SpawnHolder(29352, 181355, -12900, -4904, 3690, false)); + SPAWNS.add(new SpawnHolder(29352, 182353, -14555, -4906, 46420, false)); + SPAWNS.add(new SpawnHolder(29358, 182906, -14226, -4906, 20032, false)); + SPAWNS.add(new SpawnHolder(29355, 182957, -13295, -4904, 48756, false)); + SPAWNS.add(new SpawnHolder(29359, 182959, -17755, -4904, 19094, false)); + SPAWNS.add(new SpawnHolder(29352, 172522, -8958, -4906, 17302, false)); + SPAWNS.add(new SpawnHolder(29356, 172656, -11131, -4906, 53634, false)); + SPAWNS.add(new SpawnHolder(29359, 172657, -11668, -4904, 19014, false)); + SPAWNS.add(new SpawnHolder(29352, 172826, -9732, -4906, 2140, false)); + SPAWNS.add(new SpawnHolder(29356, 173554, -10838, -4927, 1396, false)); + SPAWNS.add(new SpawnHolder(29357, 174175, -8170, -4927, 49895, false)); + SPAWNS.add(new SpawnHolder(29354, 175140, -9993, -4906, 57469, false)); + SPAWNS.add(new SpawnHolder(29358, 175250, -11779, -4906, 6938, false)); + SPAWNS.add(new SpawnHolder(29354, 175456, -11034, -4904, 14019, false)); + SPAWNS.add(new SpawnHolder(29357, 175790, -9431, -4906, 17010, false)); + SPAWNS.add(new SpawnHolder(29354, 177259, -12172, -4904, 49445, false)); + SPAWNS.add(new SpawnHolder(29355, 177470, -7299, -4904, 64668, false)); + SPAWNS.add(new SpawnHolder(29358, 178150, -11911, -4904, 34327, false)); + SPAWNS.add(new SpawnHolder(29355, 178539, -7297, -4925, 64795, false)); + SPAWNS.add(new SpawnHolder(29358, 179213, -10144, -4906, 4281, false)); + SPAWNS.add(new SpawnHolder(29354, 180110, -10119, -4906, 32768, false)); + SPAWNS.add(new SpawnHolder(29353, 180454, -9977, -4904, 40697, false)); + SPAWNS.add(new SpawnHolder(29353, 180588, -11006, -4906, 41368, false)); + SPAWNS.add(new SpawnHolder(29353, 181265, -7212, -4904, 484, false)); + SPAWNS.add(new SpawnHolder(29354, 182345, -8886, -4906, 49823, false)); + SPAWNS.add(new SpawnHolder(29352, 182847, -8519, -4906, 13647, false)); + SPAWNS.add(new SpawnHolder(29354, 182962, -7497, -4904, 49589, false)); + SPAWNS.add(new SpawnHolder(29354, 172803, -12986, -4925, 1432, false)); + SPAWNS.add(new SpawnHolder(29352, 173324, -15973, -4906, 27090, false)); + SPAWNS.add(new SpawnHolder(29352, 174302, -17745, -4906, 37147, false)); + SPAWNS.add(new SpawnHolder(29358, 174793, -14519, -4906, 24542, false)); + SPAWNS.add(new SpawnHolder(29357, 174884, -17717, -4906, 3409, false)); + SPAWNS.add(new SpawnHolder(29355, 175225, -13800, -4904, 13904, false)); + SPAWNS.add(new SpawnHolder(29353, 175566, -14732, -4906, 55543, false)); + SPAWNS.add(new SpawnHolder(29359, 176232, -16745, -4904, 21221, false)); + SPAWNS.add(new SpawnHolder(29354, 176257, -17436, -4904, 15723, false)); + SPAWNS.add(new SpawnHolder(29358, 177188, -14954, -4904, 28884, false)); + SPAWNS.add(new SpawnHolder(29354, 177254, -13177, -4904, 50898, false)); + SPAWNS.add(new SpawnHolder(29352, 177267, -17394, -4925, 21017, false)); + SPAWNS.add(new SpawnHolder(29354, 179274, -13854, -4925, 55304, false)); + SPAWNS.add(new SpawnHolder(29357, 178174, -7303, -4904, 27814, false)); + SPAWNS.add(new SpawnHolder(29358, 178715, -10145, -4906, 5002, false)); + SPAWNS.add(new SpawnHolder(29357, 179011, -9845, -4906, 23256, false)); + SPAWNS.add(new SpawnHolder(29354, 180287, -9677, -4906, 49376, false)); + SPAWNS.add(new SpawnHolder(29353, 180320, -11223, -4906, 45409, false)); + SPAWNS.add(new SpawnHolder(29359, 180503, -7440, -4906, 53375, false)); + SPAWNS.add(new SpawnHolder(29359, 180763, -10369, -4906, 64705, false)); + SPAWNS.add(new SpawnHolder(29358, 181039, -7438, -4906, 44443, false)); + SPAWNS.add(new SpawnHolder(29354, 182135, -8603, -4904, 32768, false)); + SPAWNS.add(new SpawnHolder(29358, 182867, -8842, -4906, 21450, false)); + SPAWNS.add(new SpawnHolder(29358, 182961, -7120, -4904, 27395, false)); + SPAWNS.add(new SpawnHolder(29352, 172441, -9616, -4906, 64703, false)); + SPAWNS.add(new SpawnHolder(29356, 172660, -12111, -4904, 51353, false)); + SPAWNS.add(new SpawnHolder(29359, 172785, -10820, -4906, 4057, false)); + SPAWNS.add(new SpawnHolder(29353, 172822, -9266, -4906, 14418, false)); + SPAWNS.add(new SpawnHolder(29352, 173280, -11141, -4906, 35853, false)); + SPAWNS.add(new SpawnHolder(29355, 173886, -7770, -4906, 44964, false)); + SPAWNS.add(new SpawnHolder(29358, 174232, -7718, -4927, 1781, false)); + SPAWNS.add(new SpawnHolder(29356, 175176, -9639, -4906, 56329, false)); + SPAWNS.add(new SpawnHolder(29357, 175213, -11259, -4906, 42485, false)); + SPAWNS.add(new SpawnHolder(29352, 175513, -10104, -4906, 47655, false)); + SPAWNS.add(new SpawnHolder(29355, 176249, -10035, -4906, 36039, false)); + SPAWNS.add(new SpawnHolder(29357, 177094, -7290, -4904, 31782, false)); + SPAWNS.add(new SpawnHolder(29355, 177253, -11727, -4904, 14326, false)); + SPAWNS.add(new SpawnHolder(29358, 178347, -17851, -4904, 17424, false)); + SPAWNS.add(new SpawnHolder(29356, 178347, -13141, -4904, 52914, false)); + SPAWNS.add(new SpawnHolder(29352, 178441, -15842, -4906, 52668, false)); + SPAWNS.add(new SpawnHolder(29355, 179015, -15501, -4906, 24709, false)); + SPAWNS.add(new SpawnHolder(29356, 180177, -15611, -4906, 31898, false)); + SPAWNS.add(new SpawnHolder(29357, 180361, -12895, -4904, 65335, false)); + SPAWNS.add(new SpawnHolder(29358, 180585, -16856, -4927, 46695, false)); + SPAWNS.add(new SpawnHolder(29353, 180743, -16075, -4906, 60699, false)); + SPAWNS.add(new SpawnHolder(29353, 181298, -13086, -4904, 63978, false)); + SPAWNS.add(new SpawnHolder(29355, 182522, -14565, -4906, 50463, false)); + SPAWNS.add(new SpawnHolder(29359, 182730, -14374, -4904, 42720, false)); + SPAWNS.add(new SpawnHolder(29353, 182787, -13004, -4904, 27242, false)); + SPAWNS.add(new SpawnHolder(29359, 183164, -17602, -4904, 32912, false)); + } + // Misc + private static final Location ENTER_LOC = new Location(172420, -17602, -4906); + private static final Location ENTER_ANAKIM_LOC = new Location(184569, -12134, -5499); + private static final L2ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003); + private static final L2ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004); + // Vars + private static List _spawns = new ArrayList<>(); + private static List _remnants = new ArrayList<>(); + private static long _lastAction; + private static L2Npc _anakimBoss; + + public Anakim() + { + addTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); + addStartNpc(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); + addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); + addSpellFinishedId(REMNANT); + addAttackId(ALL_MOBS); + addKillId(ALL_MOBS); + addSkillSeeId(ALL_MOBS); + + // Unlock + final StatsSet info = GrandBossManager.getInstance().getStatsSet(ANAKIM); + final int status = GrandBossManager.getInstance().getBossStatus(ANAKIM); + if (status == DEAD) + { + final long time = info.getLong("respawn_time") - System.currentTimeMillis(); + if (time > 0) + { + startQuestTimer("unlock_anakim", time, null, null); + } + else + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); + } + } + else if (status != ALIVE) + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + switch (event) + { + case "unlock_anakim": + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); + break; + } + case "check_activity_task": + { + if ((_lastAction + 900000) < System.currentTimeMillis()) + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); + for (L2Character charInside : BOSS_ZONE.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isNpc()) + { + charInside.deleteMe(); + } + else if (charInside.isPlayer()) + { + charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN)); + } + } + } + startQuestTimer("end_anakim", 2000, null, null); + } + else + { + startQuestTimer("check_activity_task", 60000, null, null); + } + break; + } + case "spawn_remant": + { + L2Npc randomSpawn = null; + if (npc == null) + { + for (int i = 0; i < 2; i++) + { + randomSpawn = _spawns.get(Rnd.get(_spawns.size())); + if (randomSpawn != null) + { + L2Npc remnant = addSpawn(REMNANT, randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ(), randomSpawn.getHeading(), true, 0, false, 0); + _remnants.add(remnant); + } + } + } + else + { + randomSpawn = _spawns.get(Rnd.get(_spawns.size())); + if (randomSpawn != null) + { + npc.teleToLocation(randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ()); + _spawns.add(npc); + } + } + break; + } + case "cancel_timers": + { + QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); + if (activityTimer != null) + { + activityTimer.cancel(); + } + + QuestTimer forceEnd = getQuestTimer("end_anakim", null, null); + if (forceEnd != null) + { + forceEnd.cancel(); + } + break; + } + case "end_anakim": + { + notifyEvent("cancel_timers", null, null); + if (_anakimBoss != null) + { + _anakimBoss.deleteMe(); + } + BOSS_ZONE.oustAllPlayers(); + PRE_ANAKIM_ZONE.oustAllPlayers(); + for (L2Npc spawn : _spawns) + { + if (spawn != null) + { + spawn.deleteMe(); + } + } + _spawns.clear(); + for (L2Npc remnant : _remnants) + { + if (remnant == null) + { + continue; + } + remnant.deleteMe(); + } + if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD) + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); + } + break; + } + case "exist": + { + player.teleToLocation(TeleportWhereType.TOWN); + break; + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == ANAKIM_CUBIC)) + { + final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM); + if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE)) + { + return "31101-01.html"; + } + if (!player.isInParty()) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31101-02.html")); + packet.replace("%min%", Integer.toString(Config.ANAKIM_MIN_PLAYERS)); + player.sendPacket(packet); + return null; + } + final L2Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player); + if (!isPartyLeader) + { + return "31101-03.html"; + } + + if ((members.size() < Config.ANAKIM_MIN_PLAYERS) || (members.size() > Config.ANAKIM_MAX_PLAYERS)) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31101-02.html")); + packet.replace("%min%", Integer.toString(Config.ANAKIM_MIN_PLAYERS)); + player.sendPacket(packet); + return null; + } + + for (L2PcInstance member : members) + { + if ((member.getLevel() < Config.ANAKIM_MIN_PLAYER_LVL) || (member.getLevel() > Config.ANAKIM_MAX_PLAYER_LVL)) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31101-04.html")); + packet.replace("%minlvl%", Integer.toString(Config.ANAKIM_MIN_PLAYER_LVL)); + packet.replace("%maxlvl%", Integer.toString(Config.ANAKIM_MAX_PLAYER_LVL)); + player.sendPacket(packet); + return null; + } + } + + for (L2PcInstance member : members) + { + if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) + { + member.teleToLocation(ENTER_LOC, true); + } + else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC)) + { + member.teleToLocation(ENTER_ANAKIM_LOC, true); + } + } + + if ((_anakimStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, WAITING); + _spawns.clear(); + for (SpawnHolder spawn : SPAWNS) + { + _spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); + } + _remnants.clear(); + notifyEvent("spawn_remant", null, null); + _lastAction = System.currentTimeMillis(); + startQuestTimer("check_activity_task", 60000, null, null, true); + } + else if ((_anakimStatus == WAITING) && (npc.getId() == ANAKIM_CUBIC)) + { + GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING); + // Spawn the rb + _anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0); + GrandBossManager.getInstance().addBoss((L2GrandBossInstance) _anakimBoss); + startQuestTimer("end_anakim", 60 * 60000, null, null); // 1h + if (!_remnants.isEmpty()) + { + return "You must kill all minions before you can engage in a fight with Anakim."; + } + } + } + return super.onTalk(npc, player); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + return npc.getId() + ".html"; + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet) + { + _lastAction = System.currentTimeMillis(); + if (npc.isMinion() || npc.isRaid())// Anakim and minions + { + // Anti BUGGERS + if (!BOSS_ZONE.isInsideZone(attacker)) // Character attacking out of zone + { + attacker.doDie(null); + } + if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone + { + L2Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); + } + } + } + if (npc.getId() == REMNANT) + { + if (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) + { + if (!npc.isCastingNow() && (Rnd.get(100) > 95)) + { + npc.doCast(REMANT_TELE); + } + } + } + + return super.onAttack(npc, attacker, damage, isPet); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet) + { + if (npc.getId() == ANAKIM) + { + notifyEvent("cancel_timers", null, null); + addSpawn(EXIST_CUBIC, 185082, -12606, -5499, 6133, false, 900000); // 15min + + GrandBossManager.getInstance().setBossStatus(ANAKIM, DEAD); + final long respawnTime = getRespawnTime(); + final StatsSet info = GrandBossManager.getInstance().getStatsSet(ANAKIM); + info.set("respawn_time", System.currentTimeMillis() + respawnTime); + GrandBossManager.getInstance().setStatsSet(ANAKIM, info); + + startQuestTimer("unlock_anakim", respawnTime, null, null); + startQuestTimer("end_anakim", 900000, null, null); + } + else if (npc.getId() == REMNANT) + { + _remnants.remove(npc); + if (_remnants.isEmpty()) + { + addSpawn(ANAKIM_CUBIC, 183225, -11911, -4897, 32768, false, 60 * 60000, false, 0); + } + } + return super.onKill(npc, killer, isPet); + } + + @Override + public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill) + { + if ((npc.getId() == REMNANT) && PRE_ANAKIM_ZONE.isInsideZone(npc)) + { + if (skill == REMANT_TELE) + { + notifyEvent("spawn_remant", npc, null); + } + } + return super.onSpellFinished(npc, player, skill); + } + + @Override + public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isPet) + { + if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean()) + { + if (skill.getAbnormalType() == AbnormalType.HP_RECOVER) + { + if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _anakimBoss)) // Don't call minions if are healing Anakim + { + ((L2Attackable) npc).clearAggroList(); + npc.setTarget(caster); + ((L2Attackable) npc).addDamageHate(caster, 500, 99999); + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); + } + } + } + return super.onSkillSee(npc, caster, skill, targets, isPet); + } + + private int getRespawnTime() + { + return (int) calcReuseFromDays(0, 21, Calendar.TUESDAY, 0, 16, Calendar.SATURDAY); + } + + private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day) + { + Calendar now = Calendar.getInstance(); + Calendar day1 = (Calendar) now.clone(); + day1.set(Calendar.MINUTE, day1Minute); + day1.set(Calendar.HOUR_OF_DAY, day1Hour); + day1.set(Calendar.DAY_OF_WEEK, day1Day); + + Calendar day2 = (Calendar) day1.clone(); + day2.set(Calendar.MINUTE, day2Minute); + day2.set(Calendar.HOUR_OF_DAY, day2Hour); + day2.set(Calendar.DAY_OF_WEEK, day2Day); + + if (now.after(day1)) + { + day1.add(Calendar.WEEK_OF_MONTH, 1); + } + if (now.after(day2)) + { + day2.add(Calendar.WEEK_OF_MONTH, 1); + } + + Calendar reenter = day1; + if (day2.before(day1)) + { + reenter = day2; + } + return reenter.getTimeInMillis() - System.currentTimeMillis(); + } + + public static void main(String[] args) + { + new Anakim(); + } +} diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31110.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31110.html new file mode 100644 index 0000000000..a64077c0bc --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31110.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
A human-like voice comes from a glowing blue orb:
+ + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-01.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-01.html new file mode 100644 index 0000000000..76433419b7 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-01.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
+A human-like voice comes from a glowing blue orb:
+Someone already went in, and Lilith disappeared soon after. There is no point in entering right now. + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-02.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-02.html new file mode 100644 index 0000000000..6d726dc361 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-02.html @@ -0,0 +1,3 @@ +Gatekeeper Ziggurat:
+(A command channel needs at least %min% members to challenge Lilith.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-03.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-03.html new file mode 100644 index 0000000000..3a6589712f --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-03.html @@ -0,0 +1,4 @@ +Gatekeeper Ziggurat:
+You are overcome by a voice, a voice so powerful you are helpless as it speaks:
+(The players who belong to an association can only enter through the Association Leader.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-04.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-04.html new file mode 100644 index 0000000000..1afe14429f --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118-04.html @@ -0,0 +1,3 @@ +Gatekeeper Ziggurat:
+(A command channel members level must be %minlvl% - %maxlvl% to challenge Lilith.) + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118.html new file mode 100644 index 0000000000..7e6d8fa1f8 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31118.html @@ -0,0 +1,7 @@ +Gatekeeper Ziggurat:
+A human voice seems to emanate from a shining, blue globe:
+Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.
+ + + + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31124.html b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31124.html new file mode 100644 index 0000000000..0d50e22faf --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/31124.html @@ -0,0 +1,5 @@ +Gatekeeper Ziggurat:
+A human voice seems to emanate from a shining, blue globe:
+Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.
+ + \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/Lilith.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/Lilith.java new file mode 100644 index 0000000000..b30ff0f07a --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Lilith/Lilith.java @@ -0,0 +1,703 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ai.bosses.Lilith; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.List; + +import com.l2jmobius.Config; +import com.l2jmobius.commons.util.CommonUtil; +import com.l2jmobius.commons.util.Rnd; +import com.l2jmobius.gameserver.ai.CtrlIntention; +import com.l2jmobius.gameserver.data.xml.impl.SkillData; +import com.l2jmobius.gameserver.instancemanager.GrandBossManager; +import com.l2jmobius.gameserver.instancemanager.MapRegionManager; +import com.l2jmobius.gameserver.instancemanager.ZoneManager; +import com.l2jmobius.gameserver.model.L2Object; +import com.l2jmobius.gameserver.model.L2Party; +import com.l2jmobius.gameserver.model.L2Spawn; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.TeleportWhereType; +import com.l2jmobius.gameserver.model.actor.L2Attackable; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Npc; +import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.holders.SpawnHolder; +import com.l2jmobius.gameserver.model.quest.QuestTimer; +import com.l2jmobius.gameserver.model.skills.AbnormalType; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.model.zone.L2ZoneType; +import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage; + +import ai.AbstractNpcAI; + +/** + * Lilith AI
+ * @author LasTravel
+ * @URL http://boards.lineage2.com/showpost.php?p=3386784&postcount=6
+ * @video https://www.youtube.com/watch?v=H3MuIwUjjD4 + */ +public class Lilith extends AbstractNpcAI +{ + // Status + private static final int ALIVE = 0; + private static final int WAITING = 1; + private static final int FIGHTING = 2; + private static final int DEAD = 3; + // NPCs + private static final int LILITH = 29336; + private static final int REMNANT = 19490; // Using custom NPC. + private static final int ENTER_CUBIC = 31118; + private static final int EXIST_CUBIC = 31124; + private static final int LILITH_CUBIC = 31110; + //@formatter:off + private static final int[] LILITH_MINIONS = {29337, 29338, 29339}; + private static final int[] NECRO_MOBS = {29340, 29341, 29342, 29343, 29344, 29345, 29346, 29347}; + //@formatter:on + private static final int[] ALL_MOBS = + { + LILITH, + LILITH_MINIONS[0], + LILITH_MINIONS[1], + NECRO_MOBS[0], + NECRO_MOBS[1], + NECRO_MOBS[2], + NECRO_MOBS[3], + NECRO_MOBS[4], + NECRO_MOBS[5], + NECRO_MOBS[6], + NECRO_MOBS[7], + REMNANT + }; + // Spawns + private static final List SPAWNS = new ArrayList<>(); + static + { + SPAWNS.add(new SpawnHolder(29341, -16469, 13406, -4905, 32815, false)); + SPAWNS.add(new SpawnHolder(29340, -16756, 13397, -4905, 33094, false)); + SPAWNS.add(new SpawnHolder(29344, -16995, 13398, -4905, 32724, false)); + SPAWNS.add(new SpawnHolder(29342, -17261, 13395, -4905, 32885, false)); + SPAWNS.add(new SpawnHolder(29342, -16474, 13678, -4905, 32864, false)); + SPAWNS.add(new SpawnHolder(29343, -16739, 13675, -4905, 32886, false)); + SPAWNS.add(new SpawnHolder(29342, -15271, 13463, -4905, 16550, false)); + SPAWNS.add(new SpawnHolder(29340, -15273, 13750, -4905, 16456, false)); + SPAWNS.add(new SpawnHolder(29347, -15275, 13998, -4905, 16468, false)); + SPAWNS.add(new SpawnHolder(29345, -15604, 13454, -4905, 16662, false)); + SPAWNS.add(new SpawnHolder(29345, -15608, 13738, -4905, 16530, false)); + SPAWNS.add(new SpawnHolder(29347, -15597, 14014, -4905, 15968, false)); + SPAWNS.add(new SpawnHolder(29342, -15599, 14258, -4905, 16469, false)); + SPAWNS.add(new SpawnHolder(29347, -14242, 13505, -4903, 65400, false)); + SPAWNS.add(new SpawnHolder(29343, -14720, 13505, -4903, 32767, false)); + SPAWNS.add(new SpawnHolder(29345, -14477, 13321, -4903, 49151, false)); + SPAWNS.add(new SpawnHolder(29344, -14480, 13500, -4903, 18259, false)); + SPAWNS.add(new SpawnHolder(29345, -14482, 13734, -4903, 16473, false)); + SPAWNS.add(new SpawnHolder(29346, -13146, 13508, -4903, 42, false)); + SPAWNS.add(new SpawnHolder(29341, -13625, 13506, -4903, 32426, false)); + SPAWNS.add(new SpawnHolder(29341, -13390, 13261, -4903, 48922, false)); + SPAWNS.add(new SpawnHolder(29343, -13390, 13752, -4903, 15915, false)); + SPAWNS.add(new SpawnHolder(29347, -13379, 13508, -4903, 49621, false)); + SPAWNS.add(new SpawnHolder(29340, -13422, 15555, -4905, 65425, false)); + SPAWNS.add(new SpawnHolder(29347, -13404, 15224, -4905, 65263, false)); + SPAWNS.add(new SpawnHolder(29343, -13156, 15224, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29341, -12896, 15223, -4905, 65495, false)); + SPAWNS.add(new SpawnHolder(29346, -12624, 15220, -4905, 1401, false)); + SPAWNS.add(new SpawnHolder(29341, -11488, 15432, -4905, 49313, false)); + SPAWNS.add(new SpawnHolder(29340, -11490, 15132, -4905, 49082, false)); + SPAWNS.add(new SpawnHolder(29347, -11497, 14893, -4905, 48846, false)); + SPAWNS.add(new SpawnHolder(29344, -11485, 14647, -4905, 49660, false)); + SPAWNS.add(new SpawnHolder(29347, -11476, 14397, -4905, 49527, false)); + SPAWNS.add(new SpawnHolder(29344, -11079, 15682, -4905, 49406, false)); + SPAWNS.add(new SpawnHolder(29346, -11079, 15152, -4905, 49033, false)); + SPAWNS.add(new SpawnHolder(29343, -11077, 14912, -4905, 49238, false)); + SPAWNS.add(new SpawnHolder(29346, -11075, 14670, -4905, 49238, false)); + SPAWNS.add(new SpawnHolder(29342, -11073, 14347, -4905, 49707, false)); + SPAWNS.add(new SpawnHolder(29340, -8785, 13753, -4903, 16351, false)); + SPAWNS.add(new SpawnHolder(29344, -9026, 13498, -4903, 33142, false)); + SPAWNS.add(new SpawnHolder(29346, -8520, 13506, -4903, 151, false)); + SPAWNS.add(new SpawnHolder(29344, -8784, 13501, -4903, 33079, false)); + SPAWNS.add(new SpawnHolder(29341, -13393, 18350, -4903, 16498, false)); + SPAWNS.add(new SpawnHolder(29343, -13389, 17881, -4903, 49681, false)); + SPAWNS.add(new SpawnHolder(29342, -13635, 18105, -4903, 33289, false)); + SPAWNS.add(new SpawnHolder(29346, -13397, 18111, -4903, 0, false)); + SPAWNS.add(new SpawnHolder(29341, -12597, 18131, -4905, 49273, false)); + SPAWNS.add(new SpawnHolder(29344, -12593, 17897, -4905, 49330, false)); + SPAWNS.add(new SpawnHolder(29342, -12594, 17606, -4905, 49116, false)); + SPAWNS.add(new SpawnHolder(29342, -12595, 17367, -4905, 49108, false)); + SPAWNS.add(new SpawnHolder(29344, -12269, 18143, -4905, 48851, false)); + SPAWNS.add(new SpawnHolder(29342, -12270, 17872, -4905, 49113, false)); + SPAWNS.add(new SpawnHolder(29345, -12274, 17612, -4905, 48991, false)); + SPAWNS.add(new SpawnHolder(29345, -12279, 17337, -4905, 51622, false)); + SPAWNS.add(new SpawnHolder(29347, -13395, 19509, -4903, 17094, false)); + SPAWNS.add(new SpawnHolder(29342, -13388, 18895, -4903, 49301, false)); + SPAWNS.add(new SpawnHolder(29346, -13114, 19198, -4903, 65211, false)); + SPAWNS.add(new SpawnHolder(29344, -13383, 19196, -4903, 32845, false)); + SPAWNS.add(new SpawnHolder(29343, -13711, 19197, -4903, 32519, false)); + SPAWNS.add(new SpawnHolder(29343, -14781, 19199, -4903, 33074, false)); + SPAWNS.add(new SpawnHolder(29345, -14188, 19205, -4903, 867, false)); + SPAWNS.add(new SpawnHolder(29343, -14495, 19193, -4903, 32351, false)); + SPAWNS.add(new SpawnHolder(29342, -14481, 19503, -4903, 15913, false)); + SPAWNS.add(new SpawnHolder(29340, -14475, 18881, -4903, 49151, false)); + SPAWNS.add(new SpawnHolder(29345, -14477, 17797, -4903, 49700, false)); + SPAWNS.add(new SpawnHolder(29343, -14481, 18417, -4903, 16947, false)); + SPAWNS.add(new SpawnHolder(29347, -14178, 18110, -4903, 66, false)); + SPAWNS.add(new SpawnHolder(29343, -14476, 18110, -4903, 32767, false)); + SPAWNS.add(new SpawnHolder(29344, -16404, 15929, -4905, 15862, false)); + SPAWNS.add(new SpawnHolder(29340, -16401, 16194, -4905, 16265, false)); + SPAWNS.add(new SpawnHolder(29347, -16402, 16472, -4905, 16421, false)); + SPAWNS.add(new SpawnHolder(29346, -16405, 16721, -4905, 16509, false)); + SPAWNS.add(new SpawnHolder(29347, -16409, 16966, -4905, 16554, false)); + SPAWNS.add(new SpawnHolder(29347, -16415, 17223, -4905, 16627, false)); + SPAWNS.add(new SpawnHolder(29342, -16794, 15936, -4905, 16009, false)); + SPAWNS.add(new SpawnHolder(29344, -16786, 16208, -4905, 16077, false)); + SPAWNS.add(new SpawnHolder(29344, -16775, 16485, -4905, 15970, false)); + SPAWNS.add(new SpawnHolder(29342, -16781, 16725, -4905, 16644, false)); + SPAWNS.add(new SpawnHolder(29342, -16774, 17008, -4905, 16126, false)); + SPAWNS.add(new SpawnHolder(29346, -16773, 17266, -4905, 16343, false)); + SPAWNS.add(new SpawnHolder(29344, -19089, 17842, -4903, 49586, false)); + SPAWNS.add(new SpawnHolder(29345, -19092, 18111, -4903, 62852, false)); + SPAWNS.add(new SpawnHolder(29341, -18810, 18106, -4903, 65351, false)); + SPAWNS.add(new SpawnHolder(29345, -19085, 19523, -4903, 16324, false)); + SPAWNS.add(new SpawnHolder(29342, -19086, 18927, -4903, 49134, false)); + SPAWNS.add(new SpawnHolder(29345, -18789, 19197, -4903, 65226, false)); + SPAWNS.add(new SpawnHolder(29345, -19078, 19200, -4903, 32659, false)); + SPAWNS.add(new SpawnHolder(29340, -19367, 19195, -4903, 32767, false)); + SPAWNS.add(new SpawnHolder(29345, -16217, 19163, -4905, 15989, false)); + SPAWNS.add(new SpawnHolder(29346, -16208, 19432, -4905, 15967, false)); + SPAWNS.add(new SpawnHolder(29346, -16208, 19683, -4905, 16383, false)); + SPAWNS.add(new SpawnHolder(29342, -16532, 19180, -4905, 16218, false)); + SPAWNS.add(new SpawnHolder(29340, -16531, 19459, -4905, 16346, false)); + SPAWNS.add(new SpawnHolder(29343, -16531, 19704, -4905, 16383, false)); + SPAWNS.add(new SpawnHolder(29341, -19123, 19994, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29341, -18858, 19996, -4905, 78, false)); + SPAWNS.add(new SpawnHolder(29341, -18608, 19996, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29342, -18326, 19999, -4905, 110, false)); + SPAWNS.add(new SpawnHolder(29341, -19088, 20318, -4905, 175, false)); + SPAWNS.add(new SpawnHolder(29341, -18842, 20318, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29340, -18579, 20318, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29346, -18313, 20320, -4905, 78, false)); + SPAWNS.add(new SpawnHolder(29341, -18920, 21182, -4905, 15992, false)); + SPAWNS.add(new SpawnHolder(29346, -18918, 21455, -4905, 16307, false)); + SPAWNS.add(new SpawnHolder(29342, -18930, 21719, -4905, 16857, false)); + SPAWNS.add(new SpawnHolder(29345, -19239, 21188, -4905, 16562, false)); + SPAWNS.add(new SpawnHolder(29345, -19244, 21447, -4905, 16585, false)); + SPAWNS.add(new SpawnHolder(29344, -19240, 21994, -4905, 18219, false)); + SPAWNS.add(new SpawnHolder(29343, -17843, 23849, -4905, 49203, false)); + SPAWNS.add(new SpawnHolder(29343, -17842, 23583, -4905, 49191, false)); + SPAWNS.add(new SpawnHolder(29346, -17843, 23310, -4905, 49113, false)); + SPAWNS.add(new SpawnHolder(29345, -17526, 23552, -4905, 49003, false)); + SPAWNS.add(new SpawnHolder(29340, -17532, 23281, -4905, 48921, false)); + SPAWNS.add(new SpawnHolder(29340, -17526, 23019, -4905, 49390, false)); + SPAWNS.add(new SpawnHolder(29345, -19079, 24048, -4903, 16704, false)); + SPAWNS.add(new SpawnHolder(29347, -19090, 23519, -4903, 49362, false)); + SPAWNS.add(new SpawnHolder(29347, -19356, 23804, -4903, 32408, false)); + SPAWNS.add(new SpawnHolder(29344, -19093, 23808, -4903, 65106, false)); + SPAWNS.add(new SpawnHolder(29347, -18777, 23810, -4903, 347, false)); + SPAWNS.add(new SpawnHolder(29342, -14131, 23807, -4903, 64686, false)); + SPAWNS.add(new SpawnHolder(29341, -14769, 23804, -4903, 34020, false)); + SPAWNS.add(new SpawnHolder(29345, -14479, 23507, -4903, 50019, false)); + SPAWNS.add(new SpawnHolder(29340, -14479, 23799, -4903, 16383, false)); + SPAWNS.add(new SpawnHolder(29346, -14471, 24087, -4903, 15031, false)); + SPAWNS.add(new SpawnHolder(29340, -13060, 23806, -4903, 108, false)); + SPAWNS.add(new SpawnHolder(29343, -13392, 23807, -4903, 30946, false)); + SPAWNS.add(new SpawnHolder(29341, -13393, 24098, -4903, 15393, false)); + SPAWNS.add(new SpawnHolder(29341, -13390, 23480, -4903, 47204, false)); + SPAWNS.add(new SpawnHolder(29340, -12589, 23863, -4905, 48374, false)); + SPAWNS.add(new SpawnHolder(29345, -12591, 23560, -4905, 49083, false)); + SPAWNS.add(new SpawnHolder(29343, -12578, 23295, -4905, 49663, false)); + SPAWNS.add(new SpawnHolder(29344, -12582, 23026, -4905, 48996, false)); + SPAWNS.add(new SpawnHolder(29345, -12268, 23817, -4905, 49887, false)); + SPAWNS.add(new SpawnHolder(29347, -12270, 23573, -4905, 49066, false)); + SPAWNS.add(new SpawnHolder(29346, -12272, 23061, -4905, 49390, false)); + SPAWNS.add(new SpawnHolder(29342, -11156, 23641, -4905, 122, false)); + SPAWNS.add(new SpawnHolder(29346, -10897, 23653, -4905, 482, false)); + SPAWNS.add(new SpawnHolder(29342, -10636, 23651, -4905, 65456, false)); + SPAWNS.add(new SpawnHolder(29342, -11386, 23958, -4905, 529, false)); + SPAWNS.add(new SpawnHolder(29341, -11126, 23964, -4905, 240, false)); + SPAWNS.add(new SpawnHolder(29342, -10857, 23968, -4905, 155, false)); + SPAWNS.add(new SpawnHolder(29340, -10608, 23966, -4905, 65452, false)); + SPAWNS.add(new SpawnHolder(29345, -8540, 23806, -4903, 65438, false)); + SPAWNS.add(new SpawnHolder(29342, -9103, 23804, -4903, 32907, false)); + SPAWNS.add(new SpawnHolder(29342, -8774, 23809, -4903, 50950, false)); + SPAWNS.add(new SpawnHolder(29342, -8784, 23493, -4903, 47854, false)); + SPAWNS.add(new SpawnHolder(29342, -8758, 22562, -4905, 32767, false)); + SPAWNS.add(new SpawnHolder(29344, -9037, 22562, -4905, 32767, false)); + SPAWNS.add(new SpawnHolder(29345, -9297, 22554, -4905, 32012, false)); + SPAWNS.add(new SpawnHolder(29345, -9536, 22554, -4905, 32767, false)); + SPAWNS.add(new SpawnHolder(29342, -8761, 22246, -4905, 32767, false)); + SPAWNS.add(new SpawnHolder(29344, -9007, 22247, -4905, 32725, false)); + SPAWNS.add(new SpawnHolder(29343, -9275, 22240, -4905, 33040, false)); + SPAWNS.add(new SpawnHolder(29345, -9545, 22231, -4905, 33115, false)); + SPAWNS.add(new SpawnHolder(29345, -8787, 18829, -4903, 49288, false)); + SPAWNS.add(new SpawnHolder(29346, -8785, 19512, -4903, 17015, false)); + SPAWNS.add(new SpawnHolder(29340, -8516, 19196, -4903, 147, false)); + SPAWNS.add(new SpawnHolder(29342, -8774, 19194, -4903, 32465, false)); + SPAWNS.add(new SpawnHolder(29342, -9151, 19200, -4903, 33236, false)); + SPAWNS.add(new SpawnHolder(29346, -8781, 17784, -4903, 49334, false)); + SPAWNS.add(new SpawnHolder(29345, -8778, 18444, -4903, 16507, false)); + SPAWNS.add(new SpawnHolder(29345, -8527, 18116, -4903, 65299, false)); + SPAWNS.add(new SpawnHolder(29345, -8784, 18110, -4903, 32767, false)); + SPAWNS.add(new SpawnHolder(29346, -9116, 18107, -4903, 32862, false)); + SPAWNS.add(new SpawnHolder(29342, -8775, 16859, -4905, 33548, false)); + SPAWNS.add(new SpawnHolder(29347, -9288, 16862, -4905, 33196, false)); + SPAWNS.add(new SpawnHolder(29341, -9547, 16871, -4905, 32405, false)); + SPAWNS.add(new SpawnHolder(29347, -8760, 16543, -4905, 32517, false)); + SPAWNS.add(new SpawnHolder(29342, -9068, 16540, -4905, 32869, false)); + SPAWNS.add(new SpawnHolder(29345, -9305, 16548, -4905, 32416, false)); + SPAWNS.add(new SpawnHolder(29343, -9581, 16562, -4905, 32239, false)); + SPAWNS.add(new SpawnHolder(29342, -11386, 17976, -4905, 64074, false)); + SPAWNS.add(new SpawnHolder(29343, -11129, 17977, -4905, 40, false)); + SPAWNS.add(new SpawnHolder(29345, -10864, 17977, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29343, -10610, 17973, -4905, 65371, false)); + SPAWNS.add(new SpawnHolder(29346, -11383, 18238, -4905, 481, false)); + SPAWNS.add(new SpawnHolder(29343, -11129, 18248, -4905, 410, false)); + SPAWNS.add(new SpawnHolder(29341, -10861, 18255, -4905, 142, false)); + SPAWNS.add(new SpawnHolder(29345, -10629, 18264, -4905, 436, false)); + SPAWNS.add(new SpawnHolder(29347, -11475, 21103, -4905, 48879, false)); + SPAWNS.add(new SpawnHolder(29342, -11466, 20854, -4905, 49528, false)); + SPAWNS.add(new SpawnHolder(29347, -11468, 20567, -4905, 49079, false)); + SPAWNS.add(new SpawnHolder(29347, -11462, 20304, -4905, 49389, false)); + SPAWNS.add(new SpawnHolder(29345, -11446, 20056, -4905, 49823, false)); + SPAWNS.add(new SpawnHolder(29344, -11081, 21367, -4905, 48668, false)); + SPAWNS.add(new SpawnHolder(29345, -11094, 21069, -4905, 48697, false)); + SPAWNS.add(new SpawnHolder(29343, -11088, 20812, -4905, 49395, false)); + SPAWNS.add(new SpawnHolder(29347, -11081, 20553, -4905, 49433, false)); + SPAWNS.add(new SpawnHolder(29340, -11087, 20281, -4905, 48921, false)); + SPAWNS.add(new SpawnHolder(29340, -11077, 20010, -4905, 49536, false)); + SPAWNS.add(new SpawnHolder(29345, -13405, 20920, -4905, 64568, false)); + SPAWNS.add(new SpawnHolder(29343, -13146, 20928, -4905, 322, false)); + SPAWNS.add(new SpawnHolder(29340, -12901, 20923, -4905, 65323, false)); + SPAWNS.add(new SpawnHolder(29346, -12637, 20927, -4905, 158, false)); + SPAWNS.add(new SpawnHolder(29347, -13437, 21244, -4905, 47, false)); + SPAWNS.add(new SpawnHolder(29345, -13125, 21245, -4905, 33, false)); + SPAWNS.add(new SpawnHolder(29340, -12876, 21257, -4905, 502, false)); + SPAWNS.add(new SpawnHolder(29345, -12647, 21242, -4905, 64853, false)); + SPAWNS.add(new SpawnHolder(29345, -16669, 21115, -4905, 496, false)); + SPAWNS.add(new SpawnHolder(29341, -16395, 21117, -4905, 76, false)); + SPAWNS.add(new SpawnHolder(29344, -16106, 21119, -4905, 72, false)); + SPAWNS.add(new SpawnHolder(29341, -15871, 21117, -4905, 65447, false)); + SPAWNS.add(new SpawnHolder(29343, -15595, 21120, -4905, 113, false)); + SPAWNS.add(new SpawnHolder(29345, -15317, 21135, -4905, 562, false)); + SPAWNS.add(new SpawnHolder(29347, -16403, 21506, -4905, 65281, false)); + SPAWNS.add(new SpawnHolder(29341, -16124, 21500, -4905, 65311, false)); + SPAWNS.add(new SpawnHolder(29347, -15846, 21499, -4905, 64349, false)); + SPAWNS.add(new SpawnHolder(29344, -15591, 21510, -4905, 449, false)); + SPAWNS.add(new SpawnHolder(29346, -15331, 21510, -4905, 0, false)); + SPAWNS.add(new SpawnHolder(29347, -18842, 14750, -4905, 36, false)); + SPAWNS.add(new SpawnHolder(29343, -18584, 14748, -4905, 65455, false)); + SPAWNS.add(new SpawnHolder(29342, -18321, 14746, -4905, 65456, false)); + SPAWNS.add(new SpawnHolder(29347, -19101, 15060, -4905, 65437, false)); + SPAWNS.add(new SpawnHolder(29346, -18821, 15071, -4905, 409, false)); + SPAWNS.add(new SpawnHolder(29346, -18583, 15069, -4905, 65448, false)); + SPAWNS.add(new SpawnHolder(29345, -18303, 15070, -4905, 37, false)); + SPAWNS.add(new SpawnHolder(29346, -14736, 16367, -4905, 32403, false)); + SPAWNS.add(new SpawnHolder(29340, -14975, 16370, -4905, 32637, false)); + SPAWNS.add(new SpawnHolder(29346, -15234, 16378, -4905, 32445, false)); + SPAWNS.add(new SpawnHolder(29340, -14706, 16066, -4905, 32878, false)); + SPAWNS.add(new SpawnHolder(29345, -14996, 16061, -4905, 32947, false)); + SPAWNS.add(new SpawnHolder(29346, -15242, 16055, -4905, 33022, false)); + } + // Skill + private static final Skill REMANT_TELE = SkillData.getInstance().getSkill(23303, 1); + // Misc + private static final Location ENTER_LOC = new Location(-19361, 13504, -4906); + private static final Location ENTER_LILITH_LOC = new Location(184449, -9032, -5499); + private static final L2ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005); + private static final L2ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006); + // Others + private static List _spawns = new ArrayList<>(); + private static List _remnants = new ArrayList<>(); + private static long _lastAction; + private static L2Npc _lilithBoss; + + public Lilith() + { + addTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); + addStartNpc(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); + addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); + addSpellFinishedId(REMNANT); + addAttackId(ALL_MOBS); + addKillId(ALL_MOBS); + addSkillSeeId(ALL_MOBS); + + // Unlock + final StatsSet info = GrandBossManager.getInstance().getStatsSet(LILITH); + final int status = GrandBossManager.getInstance().getBossStatus(LILITH); + if (status == DEAD) + { + final long time = info.getLong("respawn_time") - System.currentTimeMillis(); + if (time > 0) + { + startQuestTimer("unlock_lilith", time, null, null); + } + else + { + GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); + } + } + else if (status != ALIVE) + { + GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); + } + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + switch (event) + { + case "unlock_lilith": + { + GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); + break; + } + case "check_activity_task": + { + if ((_lastAction + 900000) < System.currentTimeMillis()) + { + GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); + for (L2Character charInside : BOSS_ZONE.getCharactersInside()) + { + if (charInside != null) + { + if (charInside.isNpc()) + { + charInside.deleteMe(); + } + else if (charInside.isPlayer()) + { + charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN)); + } + } + } + startQuestTimer("end_lilith", 2000, null, null); + } + else + { + startQuestTimer("check_activity_task", 60000, null, null); + } + break; + } + case "spawn_remant": + { + L2Npc randomSpawn = null; + if (npc == null) + { + for (int i = 0; i < 2; i++) + { + randomSpawn = _spawns.get(Rnd.get(_spawns.size())); + if (randomSpawn != null) + { + L2Npc remnant = addSpawn(REMNANT, randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ(), randomSpawn.getHeading(), true, 0, false, 0); + _remnants.add(remnant); + } + } + } + else + { + randomSpawn = _spawns.get(Rnd.get(_spawns.size())); + if (randomSpawn != null) + { + npc.teleToLocation(randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ()); + _spawns.add(npc); + } + } + break; + } + case "cancel_timers": + { + QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); + if (activityTimer != null) + { + activityTimer.cancel(); + } + + QuestTimer forceEnd = getQuestTimer("end_lilith", null, null); + if (forceEnd != null) + { + forceEnd.cancel(); + } + break; + } + case "end_lilith": + { + notifyEvent("cancel_timers", null, null); + if (_lilithBoss != null) + { + _lilithBoss.deleteMe(); + } + BOSS_ZONE.oustAllPlayers(); + PRE_LILITH_ZONE.oustAllPlayers(); + for (L2Npc spawn : _spawns) + { + if (spawn != null) + { + spawn.deleteMe(); + } + } + _spawns.clear(); + for (L2Npc remnant : _remnants) + { + if (remnant == null) + { + continue; + } + remnant.deleteMe(); + } + if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD) + { + GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); + } + break; + } + case "exist": + { + player.teleToLocation(TeleportWhereType.TOWN); + break; + } + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onTalk(L2Npc npc, L2PcInstance player) + { + if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC)) + { + final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH); + if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE)) + { + return "31118-01.html"; + } + if (!player.isInParty()) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31118-02.html")); + packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS)); + player.sendPacket(packet); + return null; + } + final L2Party party = player.getParty(); + final boolean isInCC = party.isInCommandChannel(); + final List members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers(); + final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player); + if (!isPartyLeader) + { + return "31118-03.html"; + } + + if ((members.size() < Config.LILITH_MIN_PLAYERS) || (members.size() > Config.LILITH_MAX_PLAYERS)) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31118-02.html")); + packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS)); + player.sendPacket(packet); + return null; + } + + for (L2PcInstance member : members) + { + if ((member.getLevel() < Config.LILITH_MIN_PLAYER_LVL) || (member.getLevel() > Config.LILITH_MAX_PLAYER_LVL)) + { + final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId()); + packet.setHtml(getHtm(player, "31118-04.html")); + packet.replace("%minlvl%", Integer.toString(Config.LILITH_MIN_PLAYER_LVL)); + packet.replace("%maxlvl%", Integer.toString(Config.LILITH_MAX_PLAYER_LVL)); + player.sendPacket(packet); + return null; + } + } + + for (L2PcInstance member : members) + { + if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) + { + member.teleToLocation(ENTER_LOC, true); + } + else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC)) + { + member.teleToLocation(ENTER_LILITH_LOC, true); + } + } + + if ((_lilithStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) + { + GrandBossManager.getInstance().setBossStatus(LILITH, WAITING); + _spawns.clear(); + for (SpawnHolder spawn : SPAWNS) + { + _spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation())); + } + _remnants.clear(); + notifyEvent("spawn_remant", null, null); + _lastAction = System.currentTimeMillis(); + startQuestTimer("check_activity_task", 60000, null, null, true); + } + else if ((_lilithStatus == WAITING) && (npc.getId() == LILITH_CUBIC)) + { + GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING); + // Spawn the rb + _lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0); + GrandBossManager.getInstance().addBoss((L2GrandBossInstance) _lilithBoss); + startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h + } + } + return super.onTalk(npc, player); + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet) + { + _lastAction = System.currentTimeMillis(); + if (npc.isMinion() || npc.isRaid()) // Lilith and minions + { + // Anti BUGGERS + if (!BOSS_ZONE.isInsideZone(attacker)) // Character attacking out of zone + { + attacker.doDie(null); + } + if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone + { + L2Spawn spawn = npc.getSpawn(); + if (spawn != null) + { + npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); + } + } + } + if (npc.getId() == REMNANT) + { + if (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) + { + if (!npc.isCastingNow() && (Rnd.get(100) > 95)) + { + npc.doCast(REMANT_TELE); + } + } + } + + return super.onAttack(npc, attacker, damage, isPet); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet) + { + if (npc.getId() == LILITH) + { + notifyEvent("cancel_timers", null, null); + addSpawn(EXIST_CUBIC, 185062, -9605, -5499, 15640, false, 900000); // 15min + + GrandBossManager.getInstance().setBossStatus(LILITH, DEAD); + final long respawnTime = getRespawnTime(); + final StatsSet info = GrandBossManager.getInstance().getStatsSet(LILITH); + info.set("respawn_time", System.currentTimeMillis() + respawnTime); + GrandBossManager.getInstance().setStatsSet(LILITH, info); + + startQuestTimer("unlock_lilith", respawnTime, null, null); + startQuestTimer("end_lilith", 900000, null, null); + } + else if (npc.getId() == REMNANT) + { + _remnants.remove(npc); + if (_remnants.isEmpty()) + { + addSpawn(LILITH_CUBIC, -19410, 23805, -4903, 62917, false, 60 * 60000, false, 0); + } + } + return super.onKill(npc, killer, isPet); + } + + @Override + public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill) + { + if ((npc.getId() == REMNANT) && PRE_LILITH_ZONE.isInsideZone(npc)) + { + if (skill == REMANT_TELE) + { + notifyEvent("spawn_remant", npc, null); + } + } + return super.onSpellFinished(npc, player, skill); + } + + @Override + public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isPet) + { + if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean()) + { + if (skill.getAbnormalType() == AbnormalType.HP_RECOVER) + { + if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss)) + { + ((L2Attackable) npc).clearAggroList(); + npc.setTarget(caster); + ((L2Attackable) npc).addDamageHate(caster, 500, 99999); + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); + } + } + } + return super.onSkillSee(npc, caster, skill, targets, isPet); + } + + private int getRespawnTime() + { + return (int) calcReuseFromDays(0, 21, Calendar.THURSDAY, 0, 14, Calendar.SATURDAY); + } + + private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day) + { + Calendar now = Calendar.getInstance(); + Calendar day1 = (Calendar) now.clone(); + day1.set(Calendar.MINUTE, day1Minute); + day1.set(Calendar.HOUR_OF_DAY, day1Hour); + day1.set(Calendar.DAY_OF_WEEK, day1Day); + + Calendar day2 = (Calendar) day1.clone(); + day2.set(Calendar.MINUTE, day2Minute); + day2.set(Calendar.HOUR_OF_DAY, day2Hour); + day2.set(Calendar.DAY_OF_WEEK, day2Day); + + if (now.after(day1)) + { + day1.add(Calendar.WEEK_OF_MONTH, 1); + } + if (now.after(day2)) + { + day2.add(Calendar.WEEK_OF_MONTH, 1); + } + + Calendar reenter = day1; + if (day2.before(day1)) + { + reenter = day2; + } + return reenter.getTimeInMillis() - System.currentTimeMillis(); + } + + @Override + public String onFirstTalk(L2Npc npc, L2PcInstance player) + { + return npc.getId() + ".html"; + } + + public static void main(String[] args) + { + new Lilith(); + } +} \ No newline at end of file diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Orfen/Orfen.java b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Orfen/Orfen.java new file mode 100644 index 0000000000..51943a3612 --- /dev/null +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/scripts/ai/bosses/Orfen/Orfen.java @@ -0,0 +1,348 @@ +/* + * This file is part of the L2J Mobius project. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package ai.bosses.Orfen; + +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + +import com.l2jmobius.Config; +import com.l2jmobius.gameserver.ai.CtrlIntention; +import com.l2jmobius.gameserver.enums.ChatType; +import com.l2jmobius.gameserver.instancemanager.GrandBossManager; +import com.l2jmobius.gameserver.instancemanager.ZoneManager; +import com.l2jmobius.gameserver.model.L2Object; +import com.l2jmobius.gameserver.model.L2Spawn; +import com.l2jmobius.gameserver.model.Location; +import com.l2jmobius.gameserver.model.StatsSet; +import com.l2jmobius.gameserver.model.actor.L2Attackable; +import com.l2jmobius.gameserver.model.actor.L2Character; +import com.l2jmobius.gameserver.model.actor.L2Npc; +import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance; +import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; +import com.l2jmobius.gameserver.model.holders.SkillHolder; +import com.l2jmobius.gameserver.model.skills.Skill; +import com.l2jmobius.gameserver.model.skills.SkillCaster; +import com.l2jmobius.gameserver.model.zone.L2ZoneType; +import com.l2jmobius.gameserver.network.NpcStringId; +import com.l2jmobius.gameserver.network.serverpackets.PlaySound; + +import ai.AbstractNpcAI; + +/** + * Orfen's AI + * @author Emperorc + */ +public final class Orfen extends AbstractNpcAI +{ + private static final Location[] POS = + { + new Location(43728, 17220, -4342), + new Location(55024, 17368, -5412), + new Location(53504, 21248, -5486), + new Location(53248, 24576, -5262) + }; + + private static final NpcStringId[] TEXT = + { + NpcStringId.S1_STOP_KIDDING_YOURSELF_ABOUT_YOUR_OWN_POWERLESSNESS, + NpcStringId.S1_I_LL_MAKE_YOU_FEEL_WHAT_TRUE_FEAR_IS, + NpcStringId.YOU_RE_REALLY_STUPID_TO_HAVE_CHALLENGED_ME_S1_GET_READY, + NpcStringId.S1_DO_YOU_THINK_THAT_S_GOING_TO_WORK + }; + + private static final int ORFEN = 29325; + private static final int ARIMA = 29326; + private static final int ARIMUS = 29327; + + private static boolean _IsTeleported; + private static Set _minions = ConcurrentHashMap.newKeySet(); + private static L2ZoneType ZONE; + + private static final byte ALIVE = 0; + private static final byte DEAD = 1; + + private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1); + private static final SkillHolder BLOW = new SkillHolder(4067, 4); + private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1); + + private Orfen() + { + final int[] mobs = + { + ORFEN, + ARIMA, + ARIMUS + }; + registerMobs(mobs); + _IsTeleported = false; + ZONE = ZoneManager.getInstance().getZoneById(12013); + final StatsSet info = GrandBossManager.getInstance().getStatsSet(ORFEN); + final int status = GrandBossManager.getInstance().getBossStatus(ORFEN); + if (status == DEAD) + { + // load the unlock date and time for Orfen from DB + final long temp = info.getLong("respawn_time") - System.currentTimeMillis(); + // if Orfen is locked until a certain time, mark it so and start the unlock timer + // the unlock time has not yet expired. + if (temp > 0) + { + startQuestTimer("orfen_unlock", temp, null, null); + } + else + { + // the time has already expired while the server was offline. Immediately spawn Orfen. + final int i = getRandom(10); + Location loc; + if (i < 4) + { + loc = POS[1]; + } + else if (i < 7) + { + loc = POS[2]; + } + else + { + loc = POS[3]; + } + final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0); + GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE); + spawnBoss(orfen); + } + } + else + { + final int loc_x = info.getInt("loc_x"); + final int loc_y = info.getInt("loc_y"); + final int loc_z = info.getInt("loc_z"); + final int heading = info.getInt("heading"); + final double hp = info.getDouble("currentHP"); + final double mp = info.getDouble("currentMP"); + final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc_x, loc_y, loc_z, heading, false, 0); + orfen.setCurrentHpMp(hp, mp); + spawnBoss(orfen); + } + } + + public void setSpawnPoint(L2Npc npc, int index) + { + ((L2Attackable) npc).clearAggroList(); + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null); + final L2Spawn spawn = npc.getSpawn(); + spawn.setLocation(POS[index]); + npc.teleToLocation(POS[index], false); + } + + public void spawnBoss(L2GrandBossInstance npc) + { + GrandBossManager.getInstance().addBoss(npc); + npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ())); + startQuestTimer("check_orfen_pos", 10000, npc, null, true); + // Spawn minions + final int x = npc.getX(); + final int y = npc.getY(); + L2Attackable mob; + mob = (L2Attackable) addSpawn(ARIMA, x + 100, y + 100, npc.getZ(), 0, false, 0); + mob.setIsRaidMinion(true); + _minions.add(mob); + mob = (L2Attackable) addSpawn(ARIMA, x + 100, y - 100, npc.getZ(), 0, false, 0); + mob.setIsRaidMinion(true); + _minions.add(mob); + mob = (L2Attackable) addSpawn(ARIMA, x - 100, y + 100, npc.getZ(), 0, false, 0); + mob.setIsRaidMinion(true); + _minions.add(mob); + mob = (L2Attackable) addSpawn(ARIMA, x - 100, y - 100, npc.getZ(), 0, false, 0); + mob.setIsRaidMinion(true); + _minions.add(mob); + startQuestTimer("check_minion_loc", 10000, npc, null, true); + } + + @Override + public String onAdvEvent(String event, L2Npc npc, L2PcInstance player) + { + if (event.equalsIgnoreCase("orfen_unlock")) + { + final int i = getRandom(10); + Location loc; + if (i < 4) + { + loc = POS[1]; + } + else if (i < 7) + { + loc = POS[2]; + } + else + { + loc = POS[3]; + } + final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0); + GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE); + spawnBoss(orfen); + } + else if (event.equalsIgnoreCase("check_orfen_pos")) + { + if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported)) + { + setSpawnPoint(npc, getRandom(3) + 1); + _IsTeleported = false; + } + else if (_IsTeleported && !ZONE.isInsideZone(npc)) + { + setSpawnPoint(npc, 0); + } + } + else if (event.equalsIgnoreCase("check_minion_loc")) + { + for (L2Attackable mob : _minions) + { + if (!npc.isInsideRadius2D(mob, 3000)) + { + mob.teleToLocation(npc.getLocation()); + ((L2Attackable) npc).clearAggroList(); + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null); + } + } + } + else if (event.equalsIgnoreCase("despawn_minions")) + { + for (L2Attackable mob : _minions) + { + mob.decayMe(); + } + _minions.clear(); + } + else if (event.equalsIgnoreCase("spawn_minion")) + { + final L2Attackable mob = (L2Attackable) addSpawn(ARIMA, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0); + mob.setIsRaidMinion(true); + _minions.add(mob); + } + return super.onAdvEvent(event, npc, player); + } + + @Override + public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon) + { + if (npc.getId() == ORFEN) + { + final L2Character originalCaster = isSummon ? caster.getServitors().values().stream().findFirst().orElse(caster.getPet()) : caster; + if ((skill.getEffectPoint() > 0) && (getRandom(5) == 0) && npc.isInsideRadius2D(originalCaster, 1000)) + { + npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(4)], caster.getName()); + originalCaster.teleToLocation(npc.getLocation()); + npc.setTarget(originalCaster); + npc.doCast(PARALYSIS.getSkill()); + } + } + return super.onSkillSee(npc, caster, skill, targets, isSummon); + } + + @Override + public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon) + { + if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType)) + { + return super.onFactionCall(npc, caller, attacker, isSummon); + } + final int npcId = npc.getId(); + final int callerId = caller.getId(); + if ((npcId == ARIMA) && (getRandom(20) == 0)) + { + npc.setTarget(attacker); + npc.doCast(BLOW.getSkill()); + } + else if (npcId == ARIMUS) + { + int chance = 1; + if (callerId == ORFEN) + { + chance = 9; + } + if ((callerId != ARIMUS) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance)) + { + npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null); + npc.setTarget(caller); + npc.doCast(ORFEN_HEAL.getSkill()); + } + } + return super.onFactionCall(npc, caller, attacker, isSummon); + } + + @Override + public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon) + { + final int npcId = npc.getId(); + if (npcId == ORFEN) + { + if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2))) + { + _IsTeleported = true; + setSpawnPoint(npc, 0); + } + else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0)) + { + npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName()); + attacker.teleToLocation(npc.getLocation()); + npc.setTarget(attacker); + npc.doCast(PARALYSIS.getSkill()); + } + } + else if (npcId == ARIMUS) + { + if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0))) + { + npc.setTarget(attacker); + npc.doCast(ORFEN_HEAL.getSkill()); + } + } + return super.onAttack(npc, attacker, damage, isSummon); + } + + @Override + public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon) + { + if (npc.getId() == ORFEN) + { + npc.broadcastPacket(new PlaySound(1, "BS02_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ())); + GrandBossManager.getInstance().setBossStatus(ORFEN, DEAD); + // Calculate Min and Max respawn times randomly. + long respawnTime = Config.ORFEN_SPAWN_INTERVAL + getRandom(-Config.ORFEN_SPAWN_RANDOM, Config.ORFEN_SPAWN_RANDOM); + respawnTime *= 3600000; + startQuestTimer("orfen_unlock", respawnTime, null, null); + // also save the respawn time so that the info is maintained past reboots + final StatsSet info = GrandBossManager.getInstance().getStatsSet(ORFEN); + info.set("respawn_time", System.currentTimeMillis() + respawnTime); + GrandBossManager.getInstance().setStatsSet(ORFEN, info); + cancelQuestTimer("check_minion_loc", npc, null); + cancelQuestTimer("check_orfen_pos", npc, null); + startQuestTimer("despawn_minions", 20000, null, null); + cancelQuestTimers("spawn_minion"); + } + else if ((GrandBossManager.getInstance().getBossStatus(ORFEN) == ALIVE) && (npc.getId() == ARIMA)) + { + _minions.remove(npc); + startQuestTimer("spawn_minion", 360000, npc, null); + } + return super.onKill(npc, killer, isSummon); + } + + public static void main(String[] args) + { + new Orfen(); + } +} diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/19400-19499.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/19400-19499.xml index 4a0eba8c0a..c490ea1b26 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/19400-19499.xml +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/19400-19499.xml @@ -2416,6 +2416,25 @@ + + + ETC + FEMALE + + + + + + + + + + + + + + + ETC diff --git a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml index a2b620e890..fd5ec23809 100644 --- a/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml +++ b/L2J_Mobius_6.0_Fafurion/dist/game/data/stats/npcs/29300-29399.xml @@ -108,7 +108,7 @@ - + @@ -244,7 +244,7 @@ - + @@ -276,7 +276,7 @@ - + @@ -407,8 +407,8 @@ - - + + @@ -437,8 +437,8 @@ - - + + @@ -643,4 +643,1885 @@ + + + + + + + + + + FAIRY + FEMALE + + + + + + + + + + 710 + + + + + + + + + + + + + + + + + + + + 300 + true + + + ORFEN + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + BUG + FEMALE + + + + + + + + + 710 + + + + + + + + + + 300 + true + + + ORFEN + + + + + + + + + + + + + + BUG + FEMALE + + + + + + + + + 710 + + + + + + + + + + 300 + true + + + ORFEN + + + + + + + + + + + + + + + + + + + DEMONIC + FEMALE + + + + + + + + + + 500 + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 480 + + + + + + + + + + + + + + + + + + + true + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + true + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 480 + + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29340 + 29341 + 29342 + 29343 + 29344 + 29345 + 29346 + 29347 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + FEMALE + + + + + + + + + + 560 + + + + + + + + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 480 + + + + + + + + + + + + + + + + + + + true + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + true + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + true + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 480 + + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 29352 + 29353 + 29354 + 29355 + 29356 + 29357 + 29358 + 29359 + + + + + + + + + + + + + + + + + + + + + + + + + + + + DIVINE + MALE + + + + + + + + + 630 + + + + + + + + + + + + + + + + + + + + + + false + 4 + + + C_DUNGEON + 21175 + 21176 + 21177 + 21178 + 21179 + 21180 + 21181 + 21182 + 21183 + 21184 + 21185 + 21186 + + + + + + + + + + + + + + + + + +