Anakim and Lilith changes.

Source: Liamxroy
This commit is contained in:
MobiusDevelopment 2020-04-20 11:33:18 +00:00
parent c5068fbbf7
commit bc3f2e07fa
12 changed files with 1876 additions and 1468 deletions

View File

@ -14,9 +14,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -24,7 +24,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
@ -39,7 +38,6 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SpawnHolder;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,18 +56,14 @@ 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;
private static final int FIGHTING = 1;
private static final int DEAD = 2;
// 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 =
{
@ -77,239 +71,20 @@ public class Anakim extends AbstractNpcAI
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<SpawnHolder> 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 ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003);
private static final ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004);
// Vars
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static Npc _anakimBoss;
private static GrandBossInstance _anakimTemp;
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);
addTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addStartNpc(EXIST_CUBIC, ANAKIM_CUBIC);
addFirstTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
@ -326,11 +101,15 @@ public class Anakim extends AbstractNpcAI
}
else
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
else if (status != ALIVE)
else
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
@ -342,6 +121,8 @@ public class Anakim extends AbstractNpcAI
{
case "unlock_anakim":
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
break;
}
@ -372,41 +153,15 @@ public class Anakim extends AbstractNpcAI
}
break;
}
case "spawn_remant":
{
Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
final Npc 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":
{
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
final QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
@ -421,23 +176,6 @@ public class Anakim extends AbstractNpcAI
_anakimBoss.deleteMe();
}
BOSS_ZONE.oustAllPlayers();
PRE_ANAKIM_ZONE.oustAllPlayers();
for (Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
@ -456,10 +194,10 @@ public class Anakim extends AbstractNpcAI
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == ANAKIM_CUBIC))
if (npc.getId() == ANAKIM_CUBIC)
{
final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE))
if (_anakimStatus > ALIVE)
{
return "31101-01.html";
}
@ -503,40 +241,19 @@ public class Anakim extends AbstractNpcAI
for (PlayerInstance 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))
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))
if ((_anakimStatus == ALIVE) && (npc.getId() == ANAKIM_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING);
// Spawn the rb
_anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _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);
@ -561,17 +278,13 @@ public class Anakim extends AbstractNpcAI
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
final Spawn spawn = npc.getSpawn();
Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if ((npc.getId() == REMNANT) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) && !npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
return super.onAttack(npc, attacker, damage, isPet);
}
@ -593,36 +306,24 @@ public class Anakim extends AbstractNpcAI
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(Npc npc, PlayerInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_ANAKIM_ZONE.isInsideZone(npc) && (skill == REMANT_TELE))
{
notifyEvent("spawn_remant", npc, null);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet)
{
if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean() && (skill.getAbnormalType() == AbnormalType.HP_RECOVER) && !npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _anakimBoss))
if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
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
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
@ -634,13 +335,13 @@ public class Anakim extends AbstractNpcAI
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
final Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone();
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);
final Calendar day2 = (Calendar) day1.clone();
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);

View File

@ -0,0 +1,220 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class AnakimBoss extends AbstractNpcAI
{
// Npc
private static final int ANAKIM = 29348;
// Skills
private static final SkillHolder POWER_STRIKE = new SkillHolder(32566, 1);
private static final SkillHolder POWER_MULTI_SHOT = new SkillHolder(32567, 1);
private static final SkillHolder HOLY_VENGEANCE = new SkillHolder(32568, 1);
private static final SkillHolder HOLY_DIMENSION = new SkillHolder(32569, 1);
private static final SkillHolder HOLY_SHIELD = new SkillHolder(32570, 1);
// Others
private boolean _hp75 = false;
private boolean _hp50 = false;
private boolean _hp25 = false;
private AnakimBoss()
{
registerMobs(ANAKIM);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == ANAKIM)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.75)) && !_hp75)
{
_hp75 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.50)) && !_hp50)
{
_hp50 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.25)) && !_hp25)
{
_hp25 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = HOLY_DIMENSION;
}
else if (chance < 30)
{
skillToCast = HOLY_VENGEANCE;
}
else if (chance < 50)
{
skillToCast = POWER_MULTI_SHOT;
}
else
{
skillToCast = POWER_STRIKE;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new AnakimBoss();
}
}

View File

@ -0,0 +1,188 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class AnakimElitePriest extends AbstractNpcAI
{
// Npc
private static final int ANAKIM_ELITE_PRIEST = 29351;
// Skills
private static final SkillHolder ENERGY_SHOT = new SkillHolder(32576, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32577, 1);
private static final SkillHolder LIGHTNING = new SkillHolder(32575, 1);
private static final SkillHolder BLESS = new SkillHolder(32574, 1);
private AnakimElitePriest()
{
registerMobs(ANAKIM_ELITE_PRIEST);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == ANAKIM_ELITE_PRIEST)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = BLESS;
}
else if (chance < 30)
{
skillToCast = LIGHTNING;
}
else if (chance < 50)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = ENERGY_SHOT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new AnakimElitePriest();
}
}

View File

@ -16,7 +16,6 @@
*/
package ai.bosses.Lilith;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -24,7 +23,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
@ -39,7 +37,6 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SpawnHolder;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,280 +55,35 @@ 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;
private static final int FIGHTING = 1;
private static final int DEAD = 2;
// 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<SpawnHolder> 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 ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005);
private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006);
// Others
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static Npc _lilithBoss;
private GrandBossInstance _tempLilith = null;
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);
addTalkId(EXIST_CUBIC, LILITH_CUBIC);
addStartNpc(EXIST_CUBIC, LILITH_CUBIC);
addFirstTalkId(EXIST_CUBIC, LILITH_CUBIC);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
@ -348,11 +100,15 @@ public class Lilith extends AbstractNpcAI
}
else
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
else if (status != ALIVE)
else
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
@ -364,6 +120,8 @@ public class Lilith extends AbstractNpcAI
{
case "unlock_lilith":
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
break;
}
@ -394,41 +152,15 @@ public class Lilith extends AbstractNpcAI
}
break;
}
case "spawn_remant":
{
Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
final Npc 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":
{
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
final QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
@ -444,22 +176,6 @@ public class Lilith extends AbstractNpcAI
}
BOSS_ZONE.oustAllPlayers();
PRE_LILITH_ZONE.oustAllPlayers();
for (Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
@ -478,85 +194,67 @@ public class Lilith extends AbstractNpcAI
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC))
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == LILITH_CUBIC) && (_lilithStatus > ALIVE))
{
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE))
{
return "31118-01.html";
}
if (!player.isInParty())
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 Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<PlayerInstance> 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 (PlayerInstance member : members)
{
if (member.getLevel() < Config.LILITH_MIN_PLAYER_LVL)
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31118-02.html"));
packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS));
packet.setHtml(getHtm(player, "31118-04.html"));
packet.replace("%minlvl%", Integer.toString(Config.LILITH_MIN_PLAYER_LVL));
player.sendPacket(packet);
return null;
}
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<PlayerInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
if (!isPartyLeader)
}
for (PlayerInstance member : members)
{
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{
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 (PlayerInstance member : members)
{
if (member.getLevel() < Config.LILITH_MIN_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));
player.sendPacket(packet);
return null;
}
}
for (PlayerInstance 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((GrandBossInstance) _lilithBoss);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
member.teleToLocation(ENTER_LILITH_LOC, true);
}
}
if ((_lilithStatus == ALIVE) && (npc.getId() == LILITH_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING);
// Spawn the rb
_lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
}
return super.onTalk(npc, player);
}
@ -573,17 +271,13 @@ public class Lilith extends AbstractNpcAI
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
final Spawn spawn = npc.getSpawn();
Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if ((npc.getId() == REMNANT) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) && !npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
return super.onAttack(npc, attacker, damage, isPet);
}
@ -605,36 +299,24 @@ public class Lilith extends AbstractNpcAI
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(Npc npc, PlayerInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_LILITH_ZONE.isInsideZone(npc) && (skill == REMANT_TELE))
{
notifyEvent("spawn_remant", npc, null);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet)
{
if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean() && (skill.getAbnormalType() == AbnormalType.HP_RECOVER) && !npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
@ -646,13 +328,13 @@ public class Lilith extends AbstractNpcAI
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
final Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone();
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);
final Calendar day2 = (Calendar) day1.clone();
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);

View File

@ -0,0 +1,220 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Lilith;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class LilithBoss extends AbstractNpcAI
{
// Npc
private static final int LILITH = 29336;
// Skills
private static final SkillHolder MAGIC_BOLT = new SkillHolder(32536, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32537, 1);
private static final SkillHolder UNHOLY_VENGEANCE = new SkillHolder(32538, 1);
private static final SkillHolder UNHOLY_DIMENSION = new SkillHolder(32539, 1);
private static final SkillHolder UNHOLY_SHIELD = new SkillHolder(32540, 1);
// Others
private boolean _hp75 = false;
private boolean _hp50 = false;
private boolean _hp25 = false;
private LilithBoss()
{
registerMobs(LILITH);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == LILITH)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.75)) && !_hp75)
{
_hp75 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.50)) && !_hp50)
{
_hp50 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.25)) && !_hp25)
{
_hp25 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = UNHOLY_DIMENSION;
}
else if (chance < 30)
{
skillToCast = UNHOLY_VENGEANCE;
}
else if (chance < 50)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = MAGIC_BOLT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new LilithBoss();
}
}

View File

@ -0,0 +1,193 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Lilith;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class LilithEliteShaman extends AbstractNpcAI
{
// Npc
private static final int LILITH_ELITE_SHAMAN = 29339;
// Skills
private static final SkillHolder MAGIC_BOLT = new SkillHolder(32544, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32546, 1);
private static final SkillHolder MAGIC_BURST = new SkillHolder(32547, 1);
private static final SkillHolder TERA_FEAR = new SkillHolder(32545, 1);
private static final SkillHolder MAGIC_HOLD = new SkillHolder(32548, 1);
private LilithEliteShaman()
{
registerMobs(LILITH_ELITE_SHAMAN);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == LILITH_ELITE_SHAMAN)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = MAGIC_HOLD;
}
else if (chance < 25)
{
skillToCast = TERA_FEAR;
}
else if (chance < 35)
{
skillToCast = MAGIC_BURST;
}
else if (chance < 55)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = MAGIC_BOLT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new LilithEliteShaman();
}
}

View File

@ -14,9 +14,9 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -24,7 +24,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
@ -39,7 +38,6 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SpawnHolder;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,18 +56,14 @@ 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;
private static final int FIGHTING = 1;
private static final int DEAD = 2;
// 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 =
{
@ -77,239 +71,20 @@ public class Anakim extends AbstractNpcAI
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<SpawnHolder> 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 ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003);
private static final ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004);
// Vars
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static Npc _anakimBoss;
private static GrandBossInstance _anakimTemp;
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);
addTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addStartNpc(EXIST_CUBIC, ANAKIM_CUBIC);
addFirstTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
@ -326,11 +101,15 @@ public class Anakim extends AbstractNpcAI
}
else
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
else if (status != ALIVE)
else
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
@ -342,6 +121,8 @@ public class Anakim extends AbstractNpcAI
{
case "unlock_anakim":
{
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
break;
}
@ -372,41 +153,15 @@ public class Anakim extends AbstractNpcAI
}
break;
}
case "spawn_remant":
{
Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
final Npc 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":
{
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
final QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
@ -421,23 +176,6 @@ public class Anakim extends AbstractNpcAI
_anakimBoss.deleteMe();
}
BOSS_ZONE.oustAllPlayers();
PRE_ANAKIM_ZONE.oustAllPlayers();
for (Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
@ -456,10 +194,10 @@ public class Anakim extends AbstractNpcAI
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == ANAKIM_CUBIC))
if (npc.getId() == ANAKIM_CUBIC)
{
final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE))
if (_anakimStatus > ALIVE)
{
return "31101-01.html";
}
@ -503,40 +241,19 @@ public class Anakim extends AbstractNpcAI
for (PlayerInstance 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))
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))
if ((_anakimStatus == ALIVE) && (npc.getId() == ANAKIM_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING);
// Spawn the rb
_anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _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);
@ -561,17 +278,13 @@ public class Anakim extends AbstractNpcAI
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
final Spawn spawn = npc.getSpawn();
Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if ((npc.getId() == REMNANT) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) && !npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
return super.onAttack(npc, attacker, damage, isPet);
}
@ -593,36 +306,24 @@ public class Anakim extends AbstractNpcAI
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(Npc npc, PlayerInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_ANAKIM_ZONE.isInsideZone(npc) && (skill == REMANT_TELE))
{
notifyEvent("spawn_remant", npc, null);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet)
{
if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean() && (skill.getAbnormalType() == AbnormalType.HP_RECOVER) && !npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _anakimBoss))
if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
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
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
@ -634,13 +335,13 @@ public class Anakim extends AbstractNpcAI
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
final Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone();
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);
final Calendar day2 = (Calendar) day1.clone();
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);

View File

@ -0,0 +1,220 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class AnakimBoss extends AbstractNpcAI
{
// Npc
private static final int ANAKIM = 29348;
// Skills
private static final SkillHolder POWER_STRIKE = new SkillHolder(32566, 1);
private static final SkillHolder POWER_MULTI_SHOT = new SkillHolder(32567, 1);
private static final SkillHolder HOLY_VENGEANCE = new SkillHolder(32568, 1);
private static final SkillHolder HOLY_DIMENSION = new SkillHolder(32569, 1);
private static final SkillHolder HOLY_SHIELD = new SkillHolder(32570, 1);
// Others
private boolean _hp75 = false;
private boolean _hp50 = false;
private boolean _hp25 = false;
private AnakimBoss()
{
registerMobs(ANAKIM);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == ANAKIM)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.75)) && !_hp75)
{
_hp75 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.50)) && !_hp50)
{
_hp50 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.25)) && !_hp25)
{
_hp25 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(HOLY_SHIELD.getSkill());
return;
}
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = HOLY_DIMENSION;
}
else if (chance < 30)
{
skillToCast = HOLY_VENGEANCE;
}
else if (chance < 50)
{
skillToCast = POWER_MULTI_SHOT;
}
else
{
skillToCast = POWER_STRIKE;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new AnakimBoss();
}
}

View File

@ -0,0 +1,188 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Anakim;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class AnakimElitePriest extends AbstractNpcAI
{
// Npc
private static final int ANAKIM_ELITE_PRIEST = 29351;
// Skills
private static final SkillHolder ENERGY_SHOT = new SkillHolder(32576, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32577, 1);
private static final SkillHolder LIGHTNING = new SkillHolder(32575, 1);
private static final SkillHolder BLESS = new SkillHolder(32574, 1);
private AnakimElitePriest()
{
registerMobs(ANAKIM_ELITE_PRIEST);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == ANAKIM_ELITE_PRIEST)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = BLESS;
}
else if (chance < 30)
{
skillToCast = LIGHTNING;
}
else if (chance < 50)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = ENERGY_SHOT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new AnakimElitePriest();
}
}

View File

@ -16,7 +16,6 @@
*/
package ai.bosses.Lilith;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
@ -24,7 +23,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager;
@ -39,7 +37,6 @@ import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SpawnHolder;
import org.l2jmobius.gameserver.model.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,280 +55,35 @@ 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;
private static final int FIGHTING = 1;
private static final int DEAD = 2;
// 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<SpawnHolder> 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 ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005);
private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006);
// Others
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static Npc _lilithBoss;
private GrandBossInstance _tempLilith = null;
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);
addTalkId(EXIST_CUBIC, LILITH_CUBIC);
addStartNpc(EXIST_CUBIC, LILITH_CUBIC);
addFirstTalkId(EXIST_CUBIC, LILITH_CUBIC);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
@ -348,11 +100,15 @@ public class Lilith extends AbstractNpcAI
}
else
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
else if (status != ALIVE)
else
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
@ -364,6 +120,8 @@ public class Lilith extends AbstractNpcAI
{
case "unlock_lilith":
{
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
break;
}
@ -394,41 +152,15 @@ public class Lilith extends AbstractNpcAI
}
break;
}
case "spawn_remant":
{
Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
final Npc 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":
{
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
final QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
@ -444,22 +176,6 @@ public class Lilith extends AbstractNpcAI
}
BOSS_ZONE.oustAllPlayers();
PRE_LILITH_ZONE.oustAllPlayers();
for (Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
@ -478,85 +194,67 @@ public class Lilith extends AbstractNpcAI
@Override
public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC))
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == LILITH_CUBIC) && (_lilithStatus > ALIVE))
{
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE))
{
return "31118-01.html";
}
if (!player.isInParty())
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 Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<PlayerInstance> 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 (PlayerInstance member : members)
{
if (member.getLevel() < Config.LILITH_MIN_PLAYER_LVL)
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31118-02.html"));
packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS));
packet.setHtml(getHtm(player, "31118-04.html"));
packet.replace("%minlvl%", Integer.toString(Config.LILITH_MIN_PLAYER_LVL));
player.sendPacket(packet);
return null;
}
final Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<PlayerInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
if (!isPartyLeader)
}
for (PlayerInstance member : members)
{
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{
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 (PlayerInstance member : members)
{
if (member.getLevel() < Config.LILITH_MIN_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));
player.sendPacket(packet);
return null;
}
}
for (PlayerInstance 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((GrandBossInstance) _lilithBoss);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
member.teleToLocation(ENTER_LILITH_LOC, true);
}
}
if ((_lilithStatus == ALIVE) && (npc.getId() == LILITH_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING);
// Spawn the rb
_lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
}
return super.onTalk(npc, player);
}
@ -573,17 +271,13 @@ public class Lilith extends AbstractNpcAI
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
final Spawn spawn = npc.getSpawn();
Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if ((npc.getId() == REMNANT) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.30)) && !npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
return super.onAttack(npc, attacker, damage, isPet);
}
@ -605,36 +299,24 @@ public class Lilith extends AbstractNpcAI
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(Npc npc, PlayerInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_LILITH_ZONE.isInsideZone(npc) && (skill == REMANT_TELE))
{
notifyEvent("spawn_remant", npc, null);
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet)
{
if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean() && (skill.getAbnormalType() == AbnormalType.HP_RECOVER) && !npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
{
((Attackable) npc).clearAggroList();
npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
@ -646,13 +328,13 @@ public class Lilith extends AbstractNpcAI
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
final Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone();
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);
final Calendar day2 = (Calendar) day1.clone();
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);

View File

@ -0,0 +1,220 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Lilith;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class LilithBoss extends AbstractNpcAI
{
// Npc
private static final int LILITH = 29336;
// Skills
private static final SkillHolder MAGIC_BOLT = new SkillHolder(32536, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32537, 1);
private static final SkillHolder UNHOLY_VENGEANCE = new SkillHolder(32538, 1);
private static final SkillHolder UNHOLY_DIMENSION = new SkillHolder(32539, 1);
private static final SkillHolder UNHOLY_SHIELD = new SkillHolder(32540, 1);
// Others
private boolean _hp75 = false;
private boolean _hp50 = false;
private boolean _hp25 = false;
private LilithBoss()
{
registerMobs(LILITH);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == LILITH)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.75)) && !_hp75)
{
_hp75 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.50)) && !_hp50)
{
_hp50 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
else if ((npc.getCurrentHp() <= (npc.getMaxHp() * 0.25)) && !_hp25)
{
_hp25 = true;
npc.abortCast();
npc.abortAttack();
npc.setTarget(npc);
npc.doCast(UNHOLY_SHIELD.getSkill());
return;
}
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = UNHOLY_DIMENSION;
}
else if (chance < 30)
{
skillToCast = UNHOLY_VENGEANCE;
}
else if (chance < 50)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = MAGIC_BOLT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new LilithBoss();
}
}

View File

@ -0,0 +1,193 @@
/*
* 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 <http://www.gnu.org/licenses/>.
*/
package ai.bosses.Lilith;
import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.gameserver.model.actor.Creature;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.SkillHolder;
import org.l2jmobius.gameserver.model.skills.Skill;
import org.l2jmobius.gameserver.model.skills.SkillCaster;
import org.l2jmobius.gameserver.model.variables.NpcVariables;
import ai.AbstractNpcAI;
/**
* @author NviX
*/
public class LilithEliteShaman extends AbstractNpcAI
{
// Npc
private static final int LILITH_ELITE_SHAMAN = 29339;
// Skills
private static final SkillHolder MAGIC_BOLT = new SkillHolder(32544, 1);
private static final SkillHolder MAGIC_BLAST = new SkillHolder(32546, 1);
private static final SkillHolder MAGIC_BURST = new SkillHolder(32547, 1);
private static final SkillHolder TERA_FEAR = new SkillHolder(32545, 1);
private static final SkillHolder MAGIC_HOLD = new SkillHolder(32548, 1);
private LilithEliteShaman()
{
registerMobs(LILITH_ELITE_SHAMAN);
}
@Override
public String onAdvEvent(String event, Npc npc, PlayerInstance player)
{
switch (event)
{
case "MANAGE_SKILLS":
{
if (npc != null)
{
manageSkills(npc);
}
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onAttack(Npc npc, PlayerInstance attacker, int damage, boolean isSummon, Skill skill)
{
if (npc.getId() == LILITH_ELITE_SHAMAN)
{
if (skill == null)
{
refreshAiParams(attacker, npc, (damage * 1000));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
{
refreshAiParams(attacker, npc, ((damage / 3) * 100));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
{
refreshAiParams(attacker, npc, (damage * 20));
}
else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
{
refreshAiParams(attacker, npc, (damage * 10));
}
else
{
refreshAiParams(attacker, npc, ((damage / 3) * 20));
}
manageSkills(npc);
}
return super.onAttack(npc, attacker, damage, isSummon);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage)
{
refreshAiParams(attacker, npc, damage, damage);
}
private final void refreshAiParams(Creature attacker, Npc npc, int damage, int aggro)
{
final int newAggroVal = damage + getRandom(3000);
final int aggroVal = aggro + 1000;
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
if (attacker == vars.getObject("c_quest" + i, Creature.class))
{
if (vars.getInt("i_quest" + i) < aggroVal)
{
vars.set("i_quest" + i, newAggroVal);
}
return;
}
}
final int index = CommonUtil.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
vars.set("i_quest" + index, newAggroVal);
vars.set("c_quest" + index, attacker);
}
@Override
public String onSpellFinished(Npc npc, PlayerInstance player, Skill skill)
{
startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
return super.onSpellFinished(npc, player, skill);
}
private void manageSkills(Npc npc)
{
if (npc.isCastingNow(SkillCaster::isAnyNormalType) || npc.isCoreAIDisabled() || !npc.isInCombat())
{
return;
}
final NpcVariables vars = npc.getVariables();
for (int i = 0; i < 3; i++)
{
final Creature attacker = vars.getObject("c_quest" + i, Creature.class);
if ((attacker == null) || ((npc.calculateDistance3D(attacker) > 9000) || attacker.isDead()))
{
vars.set("i_quest" + i, 0);
}
}
final int index = CommonUtil.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
final Creature player = vars.getObject("c_quest" + index, Creature.class);
final int i2 = vars.getInt("i_quest" + index);
if ((i2 > 0) && (getRandom(100) < 70))
{
vars.set("i_quest" + index, 500);
}
SkillHolder skillToCast = null;
int chance = getRandom(100);
if ((player != null) && !player.isDead())
{
if (chance < 15)
{
skillToCast = MAGIC_HOLD;
}
else if (chance < 25)
{
skillToCast = TERA_FEAR;
}
else if (chance < 35)
{
skillToCast = MAGIC_BURST;
}
else if (chance < 55)
{
skillToCast = MAGIC_BLAST;
}
else
{
skillToCast = MAGIC_BOLT;
}
}
if ((skillToCast != null) && SkillCaster.checkUseConditions(npc, skillToCast.getSkill()))
{
npc.setTarget(player);
npc.doCast(skillToCast.getSkill());
}
}
public static void main(String[] args)
{
new LilithEliteShaman();
}
}