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 * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package ai.bosses.Anakim; package ai.bosses.Anakim;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
@ -24,7 +24,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; 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.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance; import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,18 +56,14 @@ public class Anakim extends AbstractNpcAI
{ {
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int WAITING = 1; private static final int FIGHTING = 1;
private static final int FIGHTING = 2; private static final int DEAD = 2;
private static final int DEAD = 3;
// NPCs // NPCs
private static final int ANAKIM = 29348; 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 EXIST_CUBIC = 31109;
private static final int ANAKIM_CUBIC = 31111; private static final int ANAKIM_CUBIC = 31111;
//@formatter:off //@formatter:off
private static final int[] ANAKIM_MINIONS = {29349, 29350, 29351}; 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 //@formatter:on
private static final int[] ALL_MOBS = private static final int[] ALL_MOBS =
{ {
@ -77,239 +71,20 @@ public class Anakim extends AbstractNpcAI
ANAKIM_MINIONS[0], ANAKIM_MINIONS[0],
ANAKIM_MINIONS[1], ANAKIM_MINIONS[1],
ANAKIM_MINIONS[2], 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 // 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 Location ENTER_ANAKIM_LOC = new Location(184569, -12134, -5499);
private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003); private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003);
private static final ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004);
// Vars // Vars
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction; private static long _lastAction;
private static Npc _anakimBoss; private static Npc _anakimBoss;
private static GrandBossInstance _anakimTemp;
public Anakim() public Anakim()
{ {
addTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addStartNpc(EXIST_CUBIC, ANAKIM_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addFirstTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS); addAttackId(ALL_MOBS);
addKillId(ALL_MOBS); addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS); addSkillSeeId(ALL_MOBS);
@ -326,11 +101,15 @@ public class Anakim extends AbstractNpcAI
} }
else else
{ {
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); 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); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
} }
} }
@ -342,6 +121,8 @@ public class Anakim extends AbstractNpcAI
{ {
case "unlock_anakim": case "unlock_anakim":
{ {
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
break; break;
} }
@ -372,41 +153,15 @@ public class Anakim extends AbstractNpcAI
} }
break; 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": case "cancel_timers":
{ {
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null) if (activityTimer != null)
{ {
activityTimer.cancel(); activityTimer.cancel();
} }
final QuestTimer forceEnd = getQuestTimer("end_anakim", null, null); QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
if (forceEnd != null) if (forceEnd != null)
{ {
forceEnd.cancel(); forceEnd.cancel();
@ -421,23 +176,6 @@ public class Anakim extends AbstractNpcAI
_anakimBoss.deleteMe(); _anakimBoss.deleteMe();
} }
BOSS_ZONE.oustAllPlayers(); 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) if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD)
{ {
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
@ -456,10 +194,10 @@ public class Anakim extends AbstractNpcAI
@Override @Override
public String onTalk(Npc npc, PlayerInstance player) 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); final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE)) if (_anakimStatus > ALIVE)
{ {
return "31101-01.html"; return "31101-01.html";
} }
@ -503,40 +241,19 @@ public class Anakim extends AbstractNpcAI
for (PlayerInstance member : members) for (PlayerInstance member : members)
{ {
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC))
{ {
member.teleToLocation(ENTER_ANAKIM_LOC, true); member.teleToLocation(ENTER_ANAKIM_LOC, true);
} }
} }
if ((_anakimStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) if ((_anakimStatus == ALIVE) && (npc.getId() == ANAKIM_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, WAITING);
_spawns.clear();
for (SpawnHolder spawn : SPAWNS)
{
_spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
}
_remnants.clear();
notifyEvent("spawn_remant", null, null);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
}
else if ((_anakimStatus == WAITING) && (npc.getId() == ANAKIM_CUBIC))
{ {
GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING); GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING);
// Spawn the rb // Spawn the rb
_anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0); _anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _anakimBoss); GrandBossManager.getInstance().addBoss((GrandBossInstance) _anakimBoss);
startQuestTimer("end_anakim", 60 * 60000, null, null); // 1h 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); 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 if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{ {
final Spawn spawn = npc.getSpawn(); Spawn spawn = npc.getSpawn();
if (spawn != null) if (spawn != null)
{ {
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); 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); return super.onAttack(npc, attacker, damage, isPet);
} }
@ -593,37 +306,25 @@ public class Anakim extends AbstractNpcAI
startQuestTimer("unlock_anakim", respawnTime, null, null); startQuestTimer("unlock_anakim", respawnTime, null, null);
startQuestTimer("end_anakim", 900000, 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); 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 @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet) 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())
{
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(); ((Attackable) npc).clearAggroList();
npc.setTarget(caster); npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999); ((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
} }
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet); 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) private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{ {
final Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone(); Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute); day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour); day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day); 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.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour); day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day); 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; package ai.bosses.Lilith;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
@ -24,7 +23,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; 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.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance; import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,280 +55,35 @@ public class Lilith extends AbstractNpcAI
{ {
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int WAITING = 1; private static final int FIGHTING = 1;
private static final int FIGHTING = 2; private static final int DEAD = 2;
private static final int DEAD = 3;
// NPCs // NPCs
private static final int LILITH = 29336; 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 EXIST_CUBIC = 31124;
private static final int LILITH_CUBIC = 31110; private static final int LILITH_CUBIC = 31110;
//@formatter:off //@formatter:off
private static final int[] LILITH_MINIONS = {29337, 29338, 29339}; 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 //@formatter:on
private static final int[] ALL_MOBS = private static final int[] ALL_MOBS =
{ {
LILITH, LILITH,
LILITH_MINIONS[0], LILITH_MINIONS[0],
LILITH_MINIONS[1], 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 // 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 Location ENTER_LILITH_LOC = new Location(184449, -9032, -5499);
private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005); private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005);
private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006); private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006);
// Others // Others
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction; private static long _lastAction;
private static Npc _lilithBoss; private static Npc _lilithBoss;
private GrandBossInstance _tempLilith = null;
public Lilith() public Lilith()
{ {
addTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addTalkId(EXIST_CUBIC, LILITH_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addStartNpc(EXIST_CUBIC, LILITH_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addFirstTalkId(EXIST_CUBIC, LILITH_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS); addAttackId(ALL_MOBS);
addKillId(ALL_MOBS); addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS); addSkillSeeId(ALL_MOBS);
@ -348,11 +100,15 @@ public class Lilith extends AbstractNpcAI
} }
else else
{ {
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); 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); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
} }
} }
@ -364,6 +120,8 @@ public class Lilith extends AbstractNpcAI
{ {
case "unlock_lilith": case "unlock_lilith":
{ {
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
break; break;
} }
@ -394,41 +152,15 @@ public class Lilith extends AbstractNpcAI
} }
break; 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": case "cancel_timers":
{ {
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null) if (activityTimer != null)
{ {
activityTimer.cancel(); activityTimer.cancel();
} }
final QuestTimer forceEnd = getQuestTimer("end_lilith", null, null); QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
if (forceEnd != null) if (forceEnd != null)
{ {
forceEnd.cancel(); forceEnd.cancel();
@ -444,22 +176,6 @@ public class Lilith extends AbstractNpcAI
} }
BOSS_ZONE.oustAllPlayers(); BOSS_ZONE.oustAllPlayers();
PRE_LILITH_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) if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD)
{ {
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
@ -477,11 +193,9 @@ public class Lilith extends AbstractNpcAI
@Override @Override
public String onTalk(Npc npc, PlayerInstance player) public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC))
{ {
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH); final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE)) if ((npc.getId() == LILITH_CUBIC) && (_lilithStatus > ALIVE))
{ {
return "31118-01.html"; return "31118-01.html";
} }
@ -525,38 +239,22 @@ public class Lilith extends AbstractNpcAI
for (PlayerInstance member : members) for (PlayerInstance member : members)
{ {
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{ {
member.teleToLocation(ENTER_LILITH_LOC, true); member.teleToLocation(ENTER_LILITH_LOC, true);
} }
} }
if ((_lilithStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) if ((_lilithStatus == ALIVE) && (npc.getId() == LILITH_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); GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING);
// Spawn the rb // Spawn the rb
_lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0); _lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss); GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
} }
}
return super.onTalk(npc, player); 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 if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{ {
final Spawn spawn = npc.getSpawn(); Spawn spawn = npc.getSpawn();
if (spawn != null) if (spawn != null)
{ {
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); 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); return super.onAttack(npc, attacker, damage, isPet);
} }
@ -605,37 +299,25 @@ public class Lilith extends AbstractNpcAI
startQuestTimer("unlock_lilith", respawnTime, null, null); startQuestTimer("unlock_lilith", respawnTime, null, null);
startQuestTimer("end_lilith", 900000, 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); 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 @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet) 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())
{
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
{ {
((Attackable) npc).clearAggroList(); ((Attackable) npc).clearAggroList();
npc.setTarget(caster); npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999); ((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
} }
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet); 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) private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{ {
final Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone(); Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute); day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour); day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day); 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.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour); day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day); 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 * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
package ai.bosses.Anakim; package ai.bosses.Anakim;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
@ -24,7 +24,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; 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.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance; import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,18 +56,14 @@ public class Anakim extends AbstractNpcAI
{ {
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int WAITING = 1; private static final int FIGHTING = 1;
private static final int FIGHTING = 2; private static final int DEAD = 2;
private static final int DEAD = 3;
// NPCs // NPCs
private static final int ANAKIM = 29348; 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 EXIST_CUBIC = 31109;
private static final int ANAKIM_CUBIC = 31111; private static final int ANAKIM_CUBIC = 31111;
//@formatter:off //@formatter:off
private static final int[] ANAKIM_MINIONS = {29349, 29350, 29351}; 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 //@formatter:on
private static final int[] ALL_MOBS = private static final int[] ALL_MOBS =
{ {
@ -77,239 +71,20 @@ public class Anakim extends AbstractNpcAI
ANAKIM_MINIONS[0], ANAKIM_MINIONS[0],
ANAKIM_MINIONS[1], ANAKIM_MINIONS[1],
ANAKIM_MINIONS[2], 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 // 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 Location ENTER_ANAKIM_LOC = new Location(184569, -12134, -5499);
private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003); private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003);
private static final ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004);
// Vars // Vars
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction; private static long _lastAction;
private static Npc _anakimBoss; private static Npc _anakimBoss;
private static GrandBossInstance _anakimTemp;
public Anakim() public Anakim()
{ {
addTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addStartNpc(EXIST_CUBIC, ANAKIM_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC); addFirstTalkId(EXIST_CUBIC, ANAKIM_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS); addAttackId(ALL_MOBS);
addKillId(ALL_MOBS); addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS); addSkillSeeId(ALL_MOBS);
@ -326,11 +101,15 @@ public class Anakim extends AbstractNpcAI
} }
else else
{ {
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); 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); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
} }
} }
@ -342,6 +121,8 @@ public class Anakim extends AbstractNpcAI
{ {
case "unlock_anakim": case "unlock_anakim":
{ {
_anakimTemp = (GrandBossInstance) addSpawn(ANAKIM, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_anakimTemp);
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
break; break;
} }
@ -372,41 +153,15 @@ public class Anakim extends AbstractNpcAI
} }
break; 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": case "cancel_timers":
{ {
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null) if (activityTimer != null)
{ {
activityTimer.cancel(); activityTimer.cancel();
} }
final QuestTimer forceEnd = getQuestTimer("end_anakim", null, null); QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
if (forceEnd != null) if (forceEnd != null)
{ {
forceEnd.cancel(); forceEnd.cancel();
@ -421,23 +176,6 @@ public class Anakim extends AbstractNpcAI
_anakimBoss.deleteMe(); _anakimBoss.deleteMe();
} }
BOSS_ZONE.oustAllPlayers(); 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) if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD)
{ {
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE); GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
@ -456,10 +194,10 @@ public class Anakim extends AbstractNpcAI
@Override @Override
public String onTalk(Npc npc, PlayerInstance player) 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); final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE)) if (_anakimStatus > ALIVE)
{ {
return "31101-01.html"; return "31101-01.html";
} }
@ -503,40 +241,19 @@ public class Anakim extends AbstractNpcAI
for (PlayerInstance member : members) for (PlayerInstance member : members)
{ {
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC))
{ {
member.teleToLocation(ENTER_ANAKIM_LOC, true); member.teleToLocation(ENTER_ANAKIM_LOC, true);
} }
} }
if ((_anakimStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) if ((_anakimStatus == ALIVE) && (npc.getId() == ANAKIM_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, WAITING);
_spawns.clear();
for (SpawnHolder spawn : SPAWNS)
{
_spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
}
_remnants.clear();
notifyEvent("spawn_remant", null, null);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
}
else if ((_anakimStatus == WAITING) && (npc.getId() == ANAKIM_CUBIC))
{ {
GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING); GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING);
// Spawn the rb // Spawn the rb
_anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0); _anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _anakimBoss); GrandBossManager.getInstance().addBoss((GrandBossInstance) _anakimBoss);
startQuestTimer("end_anakim", 60 * 60000, null, null); // 1h 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); 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 if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{ {
final Spawn spawn = npc.getSpawn(); Spawn spawn = npc.getSpawn();
if (spawn != null) if (spawn != null)
{ {
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); 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); return super.onAttack(npc, attacker, damage, isPet);
} }
@ -593,37 +306,25 @@ public class Anakim extends AbstractNpcAI
startQuestTimer("unlock_anakim", respawnTime, null, null); startQuestTimer("unlock_anakim", respawnTime, null, null);
startQuestTimer("end_anakim", 900000, 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); 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 @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet) 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())
{
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(); ((Attackable) npc).clearAggroList();
npc.setTarget(caster); npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999); ((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
} }
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet); 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) private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{ {
final Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone(); Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute); day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour); day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day); 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.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour); day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day); 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; package ai.bosses.Lilith;
import java.util.ArrayList;
import java.util.Calendar; import java.util.Calendar;
import java.util.List; import java.util.List;
@ -24,7 +23,6 @@ import org.l2jmobius.Config;
import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.commons.util.CommonUtil;
import org.l2jmobius.commons.util.Rnd; import org.l2jmobius.commons.util.Rnd;
import org.l2jmobius.gameserver.ai.CtrlIntention; import org.l2jmobius.gameserver.ai.CtrlIntention;
import org.l2jmobius.gameserver.data.xml.impl.SkillData;
import org.l2jmobius.gameserver.enums.TeleportWhereType; import org.l2jmobius.gameserver.enums.TeleportWhereType;
import org.l2jmobius.gameserver.instancemanager.GrandBossManager; import org.l2jmobius.gameserver.instancemanager.GrandBossManager;
import org.l2jmobius.gameserver.instancemanager.MapRegionManager; 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.Npc;
import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance; import org.l2jmobius.gameserver.model.actor.instance.GrandBossInstance;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; 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.quest.QuestTimer;
import org.l2jmobius.gameserver.model.skills.AbnormalType; import org.l2jmobius.gameserver.model.skills.AbnormalType;
import org.l2jmobius.gameserver.model.skills.Skill; import org.l2jmobius.gameserver.model.skills.Skill;
@ -58,280 +55,35 @@ public class Lilith extends AbstractNpcAI
{ {
// Status // Status
private static final int ALIVE = 0; private static final int ALIVE = 0;
private static final int WAITING = 1; private static final int FIGHTING = 1;
private static final int FIGHTING = 2; private static final int DEAD = 2;
private static final int DEAD = 3;
// NPCs // NPCs
private static final int LILITH = 29336; 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 EXIST_CUBIC = 31124;
private static final int LILITH_CUBIC = 31110; private static final int LILITH_CUBIC = 31110;
//@formatter:off //@formatter:off
private static final int[] LILITH_MINIONS = {29337, 29338, 29339}; 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 //@formatter:on
private static final int[] ALL_MOBS = private static final int[] ALL_MOBS =
{ {
LILITH, LILITH,
LILITH_MINIONS[0], LILITH_MINIONS[0],
LILITH_MINIONS[1], 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 // 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 Location ENTER_LILITH_LOC = new Location(184449, -9032, -5499);
private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005); private static final ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005);
private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006); private static final ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006);
// Others // Others
private static List<Npc> _spawns = new ArrayList<>();
private static List<Npc> _remnants = new ArrayList<>();
private static long _lastAction; private static long _lastAction;
private static Npc _lilithBoss; private static Npc _lilithBoss;
private GrandBossInstance _tempLilith = null;
public Lilith() public Lilith()
{ {
addTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addTalkId(EXIST_CUBIC, LILITH_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addStartNpc(EXIST_CUBIC, LILITH_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC); addFirstTalkId(EXIST_CUBIC, LILITH_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS); addAttackId(ALL_MOBS);
addKillId(ALL_MOBS); addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS); addSkillSeeId(ALL_MOBS);
@ -348,11 +100,15 @@ public class Lilith extends AbstractNpcAI
} }
else else
{ {
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); 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); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
} }
} }
@ -364,6 +120,8 @@ public class Lilith extends AbstractNpcAI
{ {
case "unlock_lilith": case "unlock_lilith":
{ {
_tempLilith = (GrandBossInstance) addSpawn(LILITH, -113360, -244676, -15536, 0, false, 0);
GrandBossManager.getInstance().addBoss(_tempLilith);
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
break; break;
} }
@ -394,41 +152,15 @@ public class Lilith extends AbstractNpcAI
} }
break; 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": case "cancel_timers":
{ {
final QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null); QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null) if (activityTimer != null)
{ {
activityTimer.cancel(); activityTimer.cancel();
} }
final QuestTimer forceEnd = getQuestTimer("end_lilith", null, null); QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
if (forceEnd != null) if (forceEnd != null)
{ {
forceEnd.cancel(); forceEnd.cancel();
@ -444,22 +176,6 @@ public class Lilith extends AbstractNpcAI
} }
BOSS_ZONE.oustAllPlayers(); BOSS_ZONE.oustAllPlayers();
PRE_LILITH_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) if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD)
{ {
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE); GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
@ -477,11 +193,9 @@ public class Lilith extends AbstractNpcAI
@Override @Override
public String onTalk(Npc npc, PlayerInstance player) public String onTalk(Npc npc, PlayerInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC))
{ {
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH); final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE)) if ((npc.getId() == LILITH_CUBIC) && (_lilithStatus > ALIVE))
{ {
return "31118-01.html"; return "31118-01.html";
} }
@ -525,38 +239,22 @@ public class Lilith extends AbstractNpcAI
for (PlayerInstance member : members) for (PlayerInstance member : members)
{ {
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC)) if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{ {
member.teleToLocation(ENTER_LILITH_LOC, true); member.teleToLocation(ENTER_LILITH_LOC, true);
} }
} }
if ((_lilithStatus == ALIVE) && (npc.getId() == ENTER_CUBIC)) if ((_lilithStatus == ALIVE) && (npc.getId() == LILITH_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); GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING);
// Spawn the rb // Spawn the rb
_lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0); _lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0);
GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss); GrandBossManager.getInstance().addBoss((GrandBossInstance) _lilithBoss);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
} }
}
return super.onTalk(npc, player); 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 if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{ {
final Spawn spawn = npc.getSpawn(); Spawn spawn = npc.getSpawn();
if (spawn != null) if (spawn != null)
{ {
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ()); 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); return super.onAttack(npc, attacker, damage, isPet);
} }
@ -605,37 +299,25 @@ public class Lilith extends AbstractNpcAI
startQuestTimer("unlock_lilith", respawnTime, null, null); startQuestTimer("unlock_lilith", respawnTime, null, null);
startQuestTimer("end_lilith", 900000, 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); 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 @Override
public String onSkillSee(Npc npc, PlayerInstance caster, Skill skill, WorldObject[] targets, boolean isPet) 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())
{
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
{ {
((Attackable) npc).clearAggroList(); ((Attackable) npc).clearAggroList();
npc.setTarget(caster); npc.setTarget(caster);
((Attackable) npc).addDamageHate(caster, 500, 99999); ((Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster); npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
} }
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet); 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) private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{ {
final Calendar now = Calendar.getInstance(); Calendar now = Calendar.getInstance();
final Calendar day1 = (Calendar) now.clone(); Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute); day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour); day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day); 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.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour); day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day); 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();
}
}