Removed non existent NPCs and related script adjustments.

This commit is contained in:
MobiusDev
2019-03-01 17:35:15 +00:00
parent 3572f40cef
commit 3dabcdf7bd
76 changed files with 52 additions and 14983 deletions

View File

@@ -1,217 +0,0 @@
/*
* 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.areas.SilentValley;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.L2Summon;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.network.NpcStringId;
import ai.AbstractNpcAI;
/**
* Silent Valley AI
* @author malyelfik
*/
public final class SilentValley extends AbstractNpcAI
{
// Skills
private static final SkillHolder BETRAYAL = new SkillHolder(6033, 1); // Treasure Seeker's Betrayal
private static final SkillHolder BLAZE = new SkillHolder(4157, 10); // NPC Blaze - Magic
// Item
private static final int SACK = 13799; // Treasure Sack of the Ancient Giants
// Chance
private static final int SPAWN_CHANCE = 2;
private static final int CHEST_DIE_CHANCE = 5;
// Monsters
private static final int CHEST = 18693; // Treasure Chest of the Ancient Giants
private static final int GUARD1 = 18694; // Treasure Chest Guard
private static final int GUARD2 = 18695; // Treasure Chest Guard
private static final int[] MOBS =
{
20965, // Chimera Piece
20966, // Changed Creation
20967, // Past Creature
20968, // Nonexistent Man
20969, // Giant's Shadow
20970, // Soldier of Ancient Times
20971, // Warrior of Ancient Times
20972, // Shaman of Ancient Times
20973, // Forgotten Ancient People
};
private SilentValley()
{
addAttackId(MOBS);
addAttackId(CHEST, GUARD1, GUARD2);
addEventReceivedId(GUARD1, GUARD2);
addKillId(MOBS);
addSeeCreatureId(MOBS);
addSeeCreatureId(GUARD1, GUARD2);
addSpawnId(CHEST, GUARD2);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if ((npc != null) && !npc.isDead())
{
switch (event)
{
case "CLEAR":
{
npc.doDie(null);
break;
}
case "CLEAR_EVENT":
{
npc.broadcastEvent("CLEAR_ALL_INSTANT", 2000, null);
npc.doDie(null);
break;
}
case "SPAWN_CHEST":
{
addSpawn(CHEST, npc.getX() - 100, npc.getY(), npc.getZ() - 100, 0, false, 0);
break;
}
}
}
return null;
}
@Override
public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon)
{
switch (npc.getId())
{
case CHEST:
{
if (!isSummon && npc.isScriptValue(0))
{
npc.setScriptValue(1);
npc.broadcastSay(ChatType.NPC_GENERAL, NpcStringId.YOU_WILL_BE_CURSED_FOR_SEEKING_THE_TREASURE);
npc.setTarget(player);
npc.doCast(BETRAYAL.getSkill());
}
else if (isSummon || (getRandom(100) < CHEST_DIE_CHANCE))
{
npc.dropItem(player, SACK, 1);
npc.broadcastEvent("CLEAR_ALL", 2000, null);
npc.doDie(null);
cancelQuestTimer("CLEAR_EVENT", npc, null);
}
break;
}
case GUARD1:
case GUARD2:
{
npc.setTarget(player);
npc.doCast(BLAZE.getSkill());
addAttackPlayerDesire(npc, player);
break;
}
default:
{
if (isSummon)
{
addAttackPlayerDesire(npc, player);
}
}
}
return super.onAttack(npc, player, damage, isSummon);
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
if (getRandom(1000) < SPAWN_CHANCE)
{
final int newZ = npc.getZ() + 100;
addSpawn(GUARD2, npc.getX() + 100, npc.getY(), newZ, 0, false, 0);
addSpawn(GUARD1, npc.getX() - 100, npc.getY(), newZ, 0, false, 0);
addSpawn(GUARD1, npc.getX(), npc.getY() + 100, newZ, 0, false, 0);
addSpawn(GUARD1, npc.getX(), npc.getY() - 100, newZ, 0, false, 0);
}
return super.onKill(npc, killer, isSummon);
}
@Override
public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
{
if (creature.isPlayable())
{
final L2PcInstance player = (isSummon) ? ((L2Summon) creature).getOwner() : creature.getActingPlayer();
if ((npc != null) && ((npc.getId() == GUARD1) || (npc.getId() == GUARD2)))
{
npc.setTarget(player);
npc.doCast(BLAZE.getSkill());
addAttackPlayerDesire(npc, player);
}
else if (creature.isAffectedBySkill(BETRAYAL.getSkillId()))
{
addAttackPlayerDesire(npc, player);
}
}
return super.onSeeCreature(npc, creature, isSummon);
}
@Override
public String onSpawn(L2Npc npc)
{
if (npc.getId() == CHEST)
{
npc.setIsInvul(true);
startQuestTimer("CLEAR_EVENT", 300000, npc, null);
}
else
{
startQuestTimer("SPAWN_CHEST", 10000, npc, null);
}
return super.onSpawn(npc);
}
@Override
public String onEventReceived(String eventName, L2Npc sender, L2Npc receiver, L2Object reference)
{
if ((receiver != null) && !receiver.isDead())
{
switch (eventName)
{
case "CLEAR_ALL":
{
startQuestTimer("CLEAR", 60000, receiver, null);
break;
}
case "CLEAR_ALL_INSTANT":
{
receiver.doDie(null);
break;
}
}
}
return super.onEventReceived(eventName, sender, receiver, reference);
}
public static void main(String[] args)
{
new SilentValley();
}
}

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
A human-like voice comes from a glowing blue orb:<br>
Someone went in already, and Anakim has disappeared soon after. There is no point in entering right now.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
(A command channel needs at least %min% members to challenge Anakim.)
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
(The players who belong to an association can only enter through the Association Leader.)
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
(A command channel members level must be %minlvl% - %maxlvl% to challenge Anakim.)
</body></html>

View File

@@ -1,7 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
A Human voice seems to emanate from a shining, blue globe:<br>
Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Anakim">"I want to teleport."</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest OracleTeleport">Enter the Dimensional Rift</Button>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
</body></html>

View File

@@ -1,5 +0,0 @@
<html><body>Gatekeeper Spirit:<br>
Behold, the sphere speaks...<br>
You must leave this place!<br>
<Button ALIGN=LEFT ICON="TELEPORT" action="bypass -h Quest Anakim exist">"Okay. I will teleport."</Button>
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br
>A human-like voice comes from a glowing blue orb:<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest Anakim">"I kinda want to teleport inside."</Button>
</body></html>

View File

@@ -1,711 +0,0 @@
/*
* 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 java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.l2jmobius.Config;
import com.l2jmobius.commons.util.CommonUtil;
import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.instancemanager.GrandBossManager;
import com.l2jmobius.gameserver.instancemanager.MapRegionManager;
import com.l2jmobius.gameserver.instancemanager.ZoneManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2Party;
import com.l2jmobius.gameserver.model.L2Spawn;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.TeleportWhereType;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SpawnHolder;
import com.l2jmobius.gameserver.model.quest.QuestTimer;
import com.l2jmobius.gameserver.model.skills.AbnormalType;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import ai.AbstractNpcAI;
/**
* Anakim AI<br>
* @author LasTravel<br>
* @URL http://boards.lineage2.com/showpost.php?p=3386784&postcount=6<br>
* @video http://www.youtube.com/watch?v=LecymFTJQzQ
*/
public class Anakim extends AbstractNpcAI
{
// Status
private static final int ALIVE = 0;
private static final int WAITING = 1;
private static final int FIGHTING = 2;
private static final int DEAD = 3;
// NPCs
private static final int ANAKIM = 25286;
private static final int REMNANT = 19490;
private static final int ENTER_CUBIC = 31101;
private static final int EXIST_CUBIC = 31109;
private static final int ANAKIM_CUBIC = 31111;
//@formatter:off
private static final int[] ANAKIM_MINIONS = {25287, 25288, 25289};
private static final int[] NECRO_MOBS = {21199, 21200, 21201, 21202, 21203, 21204, 21205, 21206, 21207};
//@formatter:on
private static final int[] ALL_MOBS =
{
ANAKIM,
ANAKIM_MINIONS[0],
ANAKIM_MINIONS[1],
ANAKIM_MINIONS[2],
NECRO_MOBS[0],
NECRO_MOBS[1],
NECRO_MOBS[2],
NECRO_MOBS[3],
NECRO_MOBS[4],
NECRO_MOBS[5],
NECRO_MOBS[6],
NECRO_MOBS[7],
NECRO_MOBS[8],
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(21206, 173077, -16317, -4906, 4056, false));
SPAWNS.add(new SpawnHolder(21202, 173082, -16047, -4906, 14971, false));
SPAWNS.add(new SpawnHolder(21206, 174578, -17866, -4906, 25990, false));
SPAWNS.add(new SpawnHolder(21207, 175080, -17489, -4904, 13139, false));
SPAWNS.add(new SpawnHolder(21205, 175172, -14020, -4904, 8666, false));
SPAWNS.add(new SpawnHolder(21199, 175176, -14809, -4904, 10473, false));
SPAWNS.add(new SpawnHolder(21201, 175510, -14982, -4906, 11447, false));
SPAWNS.add(new SpawnHolder(21207, 176139, -17080, -4906, 60699, false));
SPAWNS.add(new SpawnHolder(21200, 176466, -17481, -4904, 63292, false));
SPAWNS.add(new SpawnHolder(21201, 176864, -14996, -4904, 53988, false));
SPAWNS.add(new SpawnHolder(21203, 176887, -14742, -4906, 31818, false));
SPAWNS.add(new SpawnHolder(21200, 177261, -17739, -4904, 17424, false));
SPAWNS.add(new SpawnHolder(21206, 177451, -12992, -4925, 1420, false));
SPAWNS.add(new SpawnHolder(21206, 179151, -13687, -4906, 48500, false));
SPAWNS.add(new SpawnHolder(21206, 179385, -12830, -4904, 41930, false));
SPAWNS.add(new SpawnHolder(21199, 178338, -17401, -4904, 15803, false));
SPAWNS.add(new SpawnHolder(21199, 178515, -12993, -4925, 1155, false));
SPAWNS.add(new SpawnHolder(21206, 178766, -15805, -4904, 1183, false));
SPAWNS.add(new SpawnHolder(21205, 178776, -15535, -4927, 13472, false));
SPAWNS.add(new SpawnHolder(21207, 180176, -15794, -4906, 38823, false));
SPAWNS.add(new SpawnHolder(21200, 180557, -16149, -4906, 40308, false));
SPAWNS.add(new SpawnHolder(21205, 180636, -16493, -4927, 50561, false));
SPAWNS.add(new SpawnHolder(21202, 180750, -13175, -4906, 44641, false));
SPAWNS.add(new SpawnHolder(21201, 181019, -12961, -4904, 1972, false));
SPAWNS.add(new SpawnHolder(21204, 182219, -14352, -4904, 33181, false));
SPAWNS.add(new SpawnHolder(21199, 182923, -14598, -4906, 24425, false));
SPAWNS.add(new SpawnHolder(21206, 182940, -12808, -4904, 12476, false));
SPAWNS.add(new SpawnHolder(21201, 182952, -17418, -4904, 15163, false));
SPAWNS.add(new SpawnHolder(21203, 172455, -9219, -4906, 64914, false));
SPAWNS.add(new SpawnHolder(21205, 172468, -7295, -4904, 1132, false));
SPAWNS.add(new SpawnHolder(21201, 172508, -10953, -4904, 61515, false));
SPAWNS.add(new SpawnHolder(21207, 172794, -9531, -4927, 1997, false));
SPAWNS.add(new SpawnHolder(21200, 172880, -11898, -4925, 65021, false));
SPAWNS.add(new SpawnHolder(21204, 173598, -11065, -4927, 571, false));
SPAWNS.add(new SpawnHolder(21199, 173928, -7388, -4927, 34341, false));
SPAWNS.add(new SpawnHolder(21199, 174259, -7974, -4906, 7003, false));
SPAWNS.add(new SpawnHolder(21207, 175278, -11072, -4927, 17977, false));
SPAWNS.add(new SpawnHolder(21207, 175288, -10136, -4906, 47983, false));
SPAWNS.add(new SpawnHolder(21200, 175519, -9575, -4906, 58165, false));
SPAWNS.add(new SpawnHolder(21200, 175527, -12001, -4906, 59818, false));
SPAWNS.add(new SpawnHolder(21206, 176524, -9907, -4906, 5094, false));
SPAWNS.add(new SpawnHolder(21204, 177097, -11914, -4904, 32360, false));
SPAWNS.add(new SpawnHolder(21204, 177279, -7486, -4904, 47036, false));
SPAWNS.add(new SpawnHolder(21203, 178337, -11691, -4904, 16100, false));
SPAWNS.add(new SpawnHolder(21203, 178357, -7493, -4904, 50527, false));
SPAWNS.add(new SpawnHolder(21207, 178451, -10181, -4906, 54905, false));
SPAWNS.add(new SpawnHolder(21200, 179213, -9903, -4906, 6134, false));
SPAWNS.add(new SpawnHolder(21200, 180086, -9917, -4906, 33891, false));
SPAWNS.add(new SpawnHolder(21207, 180422, -7251, -4904, 56765, false));
SPAWNS.add(new SpawnHolder(21201, 180472, -10304, -4904, 49629, false));
SPAWNS.add(new SpawnHolder(21205, 180577, -11232, -4906, 48645, false));
SPAWNS.add(new SpawnHolder(21200, 181269, -7388, -4904, 426, false));
SPAWNS.add(new SpawnHolder(21199, 182519, -8817, -4906, 49404, false));
SPAWNS.add(new SpawnHolder(21200, 182612, -8674, -4904, 44491, false));
SPAWNS.add(new SpawnHolder(21206, 183165, -7264, -4904, 28242, false));
SPAWNS.add(new SpawnHolder(21201, 172469, -12995, -4904, 819, false));
SPAWNS.add(new SpawnHolder(21204, 172765, -16043, -4906, 48239, false));
SPAWNS.add(new SpawnHolder(21203, 173490, -16291, -4906, 514, false));
SPAWNS.add(new SpawnHolder(21204, 174545, -17625, -4904, 41172, false));
SPAWNS.add(new SpawnHolder(21199, 174907, -17434, -4906, 10827, false));
SPAWNS.add(new SpawnHolder(21207, 174982, -14693, -4906, 27145, false));
SPAWNS.add(new SpawnHolder(21204, 175010, -13720, -4906, 18841, false));
SPAWNS.add(new SpawnHolder(21203, 175316, -15239, -4906, 20459, false));
SPAWNS.add(new SpawnHolder(21203, 176275, -16947, -4904, 19252, false));
SPAWNS.add(new SpawnHolder(21204, 176443, -17690, -4906, 65438, false));
SPAWNS.add(new SpawnHolder(21199, 176677, -15076, -4906, 47622, false));
SPAWNS.add(new SpawnHolder(21199, 177168, -14718, -4927, 20070, false));
SPAWNS.add(new SpawnHolder(21207, 177265, -12826, -4904, 19490, false));
SPAWNS.add(new SpawnHolder(21200, 177424, -17617, -4904, 3700, false));
SPAWNS.add(new SpawnHolder(21206, 179467, -13725, -4906, 43672, false));
SPAWNS.add(new SpawnHolder(21203, 179526, -13134, -4927, 52220, false));
SPAWNS.add(new SpawnHolder(21200, 178349, -12839, -4904, 18461, false));
SPAWNS.add(new SpawnHolder(21199, 178428, -15548, -4906, 55285, false));
SPAWNS.add(new SpawnHolder(21204, 178546, -17597, -4904, 2584, false));
SPAWNS.add(new SpawnHolder(21204, 179256, -15820, -4906, 64089, false));
SPAWNS.add(new SpawnHolder(21200, 180340, -15506, -4906, 51622, false));
SPAWNS.add(new SpawnHolder(21207, 180444, -15827, -4904, 51038, false));
SPAWNS.add(new SpawnHolder(21202, 180555, -13151, -4906, 48007, false));
SPAWNS.add(new SpawnHolder(21202, 180789, -16337, -4906, 8540, false));
SPAWNS.add(new SpawnHolder(21202, 180794, -13066, -4904, 62828, false));
SPAWNS.add(new SpawnHolder(21203, 181987, -14470, -4925, 36453, false));
SPAWNS.add(new SpawnHolder(21203, 182752, -17591, -4904, 31555, false));
SPAWNS.add(new SpawnHolder(21199, 183052, -14243, -4927, 17937, false));
SPAWNS.add(new SpawnHolder(21206, 183145, -12992, -4904, 35585, false));
SPAWNS.add(new SpawnHolder(21199, 172505, -11880, -4904, 7971, false));
SPAWNS.add(new SpawnHolder(21202, 172514, -10004, -4906, 7764, false));
SPAWNS.add(new SpawnHolder(21200, 172730, -9035, -4925, 20022, false));
SPAWNS.add(new SpawnHolder(21199, 172839, -7282, -4904, 407, false));
SPAWNS.add(new SpawnHolder(21199, 172890, -11128, -4906, 36753, false));
SPAWNS.add(new SpawnHolder(21203, 173200, -10885, -4904, 64025, false));
SPAWNS.add(new SpawnHolder(21200, 173969, -8136, -4906, 51517, false));
SPAWNS.add(new SpawnHolder(21202, 174223, -7296, -4906, 40856, false));
SPAWNS.add(new SpawnHolder(21206, 174964, -9859, -4904, 61063, false));
SPAWNS.add(new SpawnHolder(21201, 175234, -11487, -4906, 32278, false));
SPAWNS.add(new SpawnHolder(21204, 175508, -11435, -4906, 10075, false));
SPAWNS.add(new SpawnHolder(21204, 175872, -9856, -4925, 5782, false));
SPAWNS.add(new SpawnHolder(21207, 176006, -9475, -4906, 18443, false));
SPAWNS.add(new SpawnHolder(21204, 177259, -7101, -4904, 51015, false));
SPAWNS.add(new SpawnHolder(21205, 177451, -11916, -4904, 762, false));
SPAWNS.add(new SpawnHolder(21205, 178343, -12110, -4904, 49406, false));
SPAWNS.add(new SpawnHolder(21206, 178346, -7111, -4904, 53343, false));
SPAWNS.add(new SpawnHolder(21201, 178670, -9862, -4927, 9673, false));
SPAWNS.add(new SpawnHolder(21201, 178962, -10192, -4906, 63558, false));
SPAWNS.add(new SpawnHolder(21207, 180354, -10754, -4927, 16000, false));
SPAWNS.add(new SpawnHolder(21201, 180589, -9772, -4906, 55342, false));
SPAWNS.add(new SpawnHolder(21201, 180681, -7470, -4906, 51819, false));
SPAWNS.add(new SpawnHolder(21204, 180830, -10655, -4906, 6352, false));
SPAWNS.add(new SpawnHolder(21206, 181038, -7145, -4906, 52771, false));
SPAWNS.add(new SpawnHolder(21203, 182094, -8779, -4904, 39237, false));
SPAWNS.add(new SpawnHolder(21205, 182783, -7300, -4904, 32768, false));
SPAWNS.add(new SpawnHolder(21204, 183072, -8569, -4906, 17776, false));
SPAWNS.add(new SpawnHolder(21204, 172550, -16371, -4906, 50062, false));
SPAWNS.add(new SpawnHolder(21205, 172655, -12687, -4904, 16450, false));
SPAWNS.add(new SpawnHolder(21207, 173513, -16089, -4904, 842, false));
SPAWNS.add(new SpawnHolder(21204, 174277, -17521, -4904, 30613, false));
SPAWNS.add(new SpawnHolder(21206, 174716, -17481, -4904, 17821, false));
SPAWNS.add(new SpawnHolder(21204, 174756, -14268, -4906, 31489, false));
SPAWNS.add(new SpawnHolder(21200, 174949, -13934, -4906, 10044, false));
SPAWNS.add(new SpawnHolder(21202, 175243, -14276, -4904, 54713, false));
SPAWNS.add(new SpawnHolder(21202, 176327, -14884, -4904, 36197, false));
SPAWNS.add(new SpawnHolder(21205, 176378, -17184, -4904, 61540, false));
SPAWNS.add(new SpawnHolder(21203, 176414, -16655, -4906, 20877, false));
SPAWNS.add(new SpawnHolder(21201, 176576, -14876, -4904, 53805, false));
SPAWNS.add(new SpawnHolder(21201, 177039, -17604, -4904, 31523, false));
SPAWNS.add(new SpawnHolder(21206, 177046, -12988, -4904, 34343, false));
SPAWNS.add(new SpawnHolder(21203, 177361, -14704, -4906, 19318, false));
SPAWNS.add(new SpawnHolder(21205, 179145, -13076, -4906, 35562, false));
SPAWNS.add(new SpawnHolder(21203, 179328, -13363, -4904, 45077, false));
SPAWNS.add(new SpawnHolder(21202, 178136, -17606, -4904, 33699, false));
SPAWNS.add(new SpawnHolder(21203, 178202, -12994, -4904, 33656, false));
SPAWNS.add(new SpawnHolder(21205, 178253, -15890, -4906, 50087, false));
SPAWNS.add(new SpawnHolder(21206, 179258, -15629, -4904, 1139, false));
SPAWNS.add(new SpawnHolder(21201, 180197, -13096, -4906, 64516, false));
SPAWNS.add(new SpawnHolder(21202, 180358, -16895, -4906, 45409, false));
SPAWNS.add(new SpawnHolder(21201, 180400, -16511, -4904, 9156, false));
SPAWNS.add(new SpawnHolder(21199, 180472, -15369, -4925, 51432, false));
SPAWNS.add(new SpawnHolder(21199, 181355, -12900, -4904, 3690, false));
SPAWNS.add(new SpawnHolder(21199, 182353, -14555, -4906, 46420, false));
SPAWNS.add(new SpawnHolder(21205, 182906, -14226, -4906, 20032, false));
SPAWNS.add(new SpawnHolder(21202, 182957, -13295, -4904, 48756, false));
SPAWNS.add(new SpawnHolder(21206, 182959, -17755, -4904, 19094, false));
SPAWNS.add(new SpawnHolder(21199, 172522, -8958, -4906, 17302, false));
SPAWNS.add(new SpawnHolder(21207, 172655, -7499, -4904, 49907, false));
SPAWNS.add(new SpawnHolder(21203, 172656, -11131, -4906, 53634, false));
SPAWNS.add(new SpawnHolder(21206, 172657, -11668, -4904, 19014, false));
SPAWNS.add(new SpawnHolder(21199, 172826, -9732, -4906, 2140, false));
SPAWNS.add(new SpawnHolder(21203, 173554, -10838, -4927, 1396, false));
SPAWNS.add(new SpawnHolder(21207, 173927, -7208, -4906, 31031, false));
SPAWNS.add(new SpawnHolder(21204, 174175, -8170, -4927, 49895, false));
SPAWNS.add(new SpawnHolder(21201, 175140, -9993, -4906, 57469, false));
SPAWNS.add(new SpawnHolder(21205, 175250, -11779, -4906, 6938, false));
SPAWNS.add(new SpawnHolder(21201, 175456, -11034, -4904, 14019, false));
SPAWNS.add(new SpawnHolder(21204, 175790, -9431, -4906, 17010, false));
SPAWNS.add(new SpawnHolder(21207, 176470, -9685, -4906, 62544, false));
SPAWNS.add(new SpawnHolder(21201, 177259, -12172, -4904, 49445, false));
SPAWNS.add(new SpawnHolder(21202, 177470, -7299, -4904, 64668, false));
SPAWNS.add(new SpawnHolder(21205, 178150, -11911, -4904, 34327, false));
SPAWNS.add(new SpawnHolder(21207, 178267, -10241, -4906, 47671, false));
SPAWNS.add(new SpawnHolder(21202, 178539, -7297, -4925, 64795, false));
SPAWNS.add(new SpawnHolder(21205, 179213, -10144, -4906, 4281, false));
SPAWNS.add(new SpawnHolder(21201, 180110, -10119, -4906, 32768, false));
SPAWNS.add(new SpawnHolder(21200, 180454, -9977, -4904, 40697, false));
SPAWNS.add(new SpawnHolder(21200, 180588, -11006, -4906, 41368, false));
SPAWNS.add(new SpawnHolder(21207, 180818, -7210, -4904, 37030, false));
SPAWNS.add(new SpawnHolder(21200, 181265, -7212, -4904, 484, false));
SPAWNS.add(new SpawnHolder(21201, 182345, -8886, -4906, 49823, false));
SPAWNS.add(new SpawnHolder(21199, 182847, -8519, -4906, 13647, false));
SPAWNS.add(new SpawnHolder(21201, 182962, -7497, -4904, 49589, false));
SPAWNS.add(new SpawnHolder(21207, 172731, -16335, -4906, 51647, false));
SPAWNS.add(new SpawnHolder(21201, 172803, -12986, -4925, 1432, false));
SPAWNS.add(new SpawnHolder(21199, 173324, -15973, -4906, 27090, false));
SPAWNS.add(new SpawnHolder(21199, 174302, -17745, -4906, 37147, false));
SPAWNS.add(new SpawnHolder(21205, 174793, -14519, -4906, 24542, false));
SPAWNS.add(new SpawnHolder(21204, 174884, -17717, -4906, 3409, false));
SPAWNS.add(new SpawnHolder(21202, 175225, -13800, -4904, 13904, false));
SPAWNS.add(new SpawnHolder(21200, 175566, -14732, -4906, 55543, false));
SPAWNS.add(new SpawnHolder(21206, 176232, -16745, -4904, 21221, false));
SPAWNS.add(new SpawnHolder(21201, 176257, -17436, -4904, 15723, false));
SPAWNS.add(new SpawnHolder(21207, 176625, -14737, -4906, 32062, false));
SPAWNS.add(new SpawnHolder(21205, 177188, -14954, -4904, 28884, false));
SPAWNS.add(new SpawnHolder(21201, 177254, -13177, -4904, 50898, false));
SPAWNS.add(new SpawnHolder(21199, 177267, -17394, -4925, 21017, false));
SPAWNS.add(new SpawnHolder(21207, 179173, -12908, -4906, 32768, false));
SPAWNS.add(new SpawnHolder(21201, 179274, -13854, -4925, 55304, false));
SPAWNS.add(new SpawnHolder(21204, 178174, -7303, -4904, 27814, false));
SPAWNS.add(new SpawnHolder(21207, 178542, -11903, -4904, 64644, false));
SPAWNS.add(new SpawnHolder(21205, 178715, -10145, -4906, 5002, false));
SPAWNS.add(new SpawnHolder(21204, 179011, -9845, -4906, 23256, false));
SPAWNS.add(new SpawnHolder(21201, 180287, -9677, -4906, 49376, false));
SPAWNS.add(new SpawnHolder(21200, 180320, -11223, -4906, 45409, false));
SPAWNS.add(new SpawnHolder(21206, 180503, -7440, -4906, 53375, false));
SPAWNS.add(new SpawnHolder(21206, 180763, -10369, -4906, 64705, false));
SPAWNS.add(new SpawnHolder(21205, 181039, -7438, -4906, 44443, false));
SPAWNS.add(new SpawnHolder(21201, 182135, -8603, -4904, 32768, false));
SPAWNS.add(new SpawnHolder(21205, 182867, -8842, -4906, 21450, false));
SPAWNS.add(new SpawnHolder(21205, 182961, -7120, -4904, 27395, false));
SPAWNS.add(new SpawnHolder(21199, 172441, -9616, -4906, 64703, false));
SPAWNS.add(new SpawnHolder(21207, 172652, -7100, -4904, 52107, false));
SPAWNS.add(new SpawnHolder(21203, 172660, -12111, -4904, 51353, false));
SPAWNS.add(new SpawnHolder(21206, 172785, -10820, -4906, 4057, false));
SPAWNS.add(new SpawnHolder(21200, 172822, -9266, -4906, 14418, false));
SPAWNS.add(new SpawnHolder(21199, 173280, -11141, -4906, 35853, false));
SPAWNS.add(new SpawnHolder(21202, 173886, -7770, -4906, 44964, false));
SPAWNS.add(new SpawnHolder(21205, 174232, -7718, -4927, 1781, false));
SPAWNS.add(new SpawnHolder(21203, 175176, -9639, -4906, 56329, false));
SPAWNS.add(new SpawnHolder(21204, 175213, -11259, -4906, 42485, false));
SPAWNS.add(new SpawnHolder(21199, 175513, -10104, -4906, 47655, false));
SPAWNS.add(new SpawnHolder(21207, 175526, -11796, -4907, 64496, false));
SPAWNS.add(new SpawnHolder(21202, 176249, -10035, -4906, 36039, false));
SPAWNS.add(new SpawnHolder(21204, 177094, -7290, -4904, 31782, false));
SPAWNS.add(new SpawnHolder(21202, 177253, -11727, -4904, 14326, false));
SPAWNS.add(new SpawnHolder(21205, 178347, -17851, -4904, 17424, false));
SPAWNS.add(new SpawnHolder(21203, 178347, -13141, -4904, 52914, false));
SPAWNS.add(new SpawnHolder(21199, 178441, -15842, -4906, 52668, false));
SPAWNS.add(new SpawnHolder(21202, 179015, -15501, -4906, 24709, false));
SPAWNS.add(new SpawnHolder(21203, 180177, -15611, -4906, 31898, false));
SPAWNS.add(new SpawnHolder(21204, 180361, -12895, -4904, 65335, false));
SPAWNS.add(new SpawnHolder(21205, 180585, -16856, -4927, 46695, false));
SPAWNS.add(new SpawnHolder(21200, 180743, -16075, -4906, 60699, false));
SPAWNS.add(new SpawnHolder(21200, 181298, -13086, -4904, 63978, false));
SPAWNS.add(new SpawnHolder(21202, 182522, -14565, -4906, 50463, false));
SPAWNS.add(new SpawnHolder(21206, 182730, -14374, -4904, 42720, false));
SPAWNS.add(new SpawnHolder(21200, 182787, -13004, -4904, 27242, false));
SPAWNS.add(new SpawnHolder(21206, 183164, -17602, -4904, 32912, false));
}
// Misc
private static final Location ENTER_LOC = new Location(172420, -17602, -4906);
private static final Location ENTER_ANAKIM_LOC = new Location(184569, -12134, -5499);
private static final L2ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12003);
private static final L2ZoneType PRE_ANAKIM_ZONE = ZoneManager.getInstance().getZoneById(12004);
// Vars
private static List<L2Npc> _spawns = new ArrayList<>();
private static List<L2Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static L2Npc _anakimBoss;
public Anakim()
{
addTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, ANAKIM_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
// Unlock
final StatsSet info = GrandBossManager.getInstance().getStatsSet(ANAKIM);
final int status = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if (status == DEAD)
{
final long time = info.getLong("respawn_time") - System.currentTimeMillis();
if (time > 0)
{
startQuestTimer("unlock_anakim", time, null, null);
}
else
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
else if (status != ALIVE)
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
switch (event)
{
case "unlock_anakim":
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
break;
}
case "check_activity_task":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
for (L2Character charInside : BOSS_ZONE.getCharactersInside())
{
if (charInside != null)
{
if (charInside.isNpc())
{
charInside.deleteMe();
}
else if (charInside.isPlayer())
{
charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
}
}
}
startQuestTimer("end_anakim", 2000, null, null);
}
else
{
startQuestTimer("check_activity_task", 60000, null, null);
}
break;
}
case "spawn_remant":
{
L2Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
L2Npc remnant = addSpawn(REMNANT, randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ(), randomSpawn.getHeading(), true, 0, false, 0);
_remnants.add(remnant);
}
}
}
else
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
npc.teleToLocation(randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ());
_spawns.add(npc);
}
}
break;
}
case "cancel_timers":
{
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
QuestTimer forceEnd = getQuestTimer("end_anakim", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
}
break;
}
case "end_anakim":
{
notifyEvent("cancel_timers", null, null);
if (_anakimBoss != null)
{
_anakimBoss.deleteMe();
}
BOSS_ZONE.oustAllPlayers();
PRE_ANAKIM_ZONE.oustAllPlayers();
for (L2Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (L2Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(ANAKIM) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, ALIVE);
}
break;
}
case "exist":
{
player.teleToLocation(TeleportWhereType.TOWN);
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == ANAKIM_CUBIC))
{
final int _anakimStatus = GrandBossManager.getInstance().getBossStatus(ANAKIM);
if ((npc.getId() == ENTER_CUBIC) && (_anakimStatus > ALIVE))
{
return "31101-01.html";
}
if (!player.isInParty())
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31101-02.html"));
packet.replace("%min%", Integer.toString(Config.ANAKIM_MIN_PLAYERS));
player.sendPacket(packet);
return null;
}
final L2Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<L2PcInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
if (!isPartyLeader)
{
return "31101-03.html";
}
if ((members.size() < Config.ANAKIM_MIN_PLAYERS) || (members.size() > Config.ANAKIM_MAX_PLAYERS))
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31101-02.html"));
packet.replace("%min%", Integer.toString(Config.ANAKIM_MIN_PLAYERS));
player.sendPacket(packet);
return null;
}
for (L2PcInstance member : members)
{
if ((member.getLevel() < Config.ANAKIM_MIN_PLAYER_LVL) || (member.getLevel() > Config.ANAKIM_MAX_PLAYER_LVL))
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31101-04.html"));
packet.replace("%minlvl%", Integer.toString(Config.ANAKIM_MIN_PLAYER_LVL));
packet.replace("%maxlvl%", Integer.toString(Config.ANAKIM_MAX_PLAYER_LVL));
player.sendPacket(packet);
return null;
}
}
for (L2PcInstance member : members)
{
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ANAKIM_CUBIC))
{
member.teleToLocation(ENTER_ANAKIM_LOC, true);
}
}
if ((_anakimStatus == ALIVE) && (npc.getId() == ENTER_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, WAITING);
_spawns.clear();
for (SpawnHolder spawn : SPAWNS)
{
_spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
}
_remnants.clear();
notifyEvent("spawn_remant", null, null);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
}
else if ((_anakimStatus == WAITING) && (npc.getId() == ANAKIM_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(ANAKIM, FIGHTING);
// Spawn the rb
_anakimBoss = addSpawn(ANAKIM, 185080, -12613, -5499, 16550, false, 0);
GrandBossManager.getInstance().addBoss((L2GrandBossInstance) _anakimBoss);
startQuestTimer("end_anakim", 60 * 60000, null, null); // 1h
if (!_remnants.isEmpty())
{
return "You must kill all minions before you can engage in a fight with Anakim.";
}
}
}
return super.onTalk(npc, player);
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
return npc.getId() + ".html";
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
{
_lastAction = System.currentTimeMillis();
if (npc.isMinion() || npc.isRaid())// Anakim and minions
{
// Anti BUGGERS
if (!BOSS_ZONE.isInsideZone(attacker)) // Character attacking out of zone
{
attacker.doDie(null);
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
L2Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if (npc.getId() == REMNANT)
{
if (npc.getCurrentHp() < (npc.getMaxHp() * 0.30))
{
if (!npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
}
}
return super.onAttack(npc, attacker, damage, isPet);
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
{
if (npc.getId() == ANAKIM)
{
notifyEvent("cancel_timers", null, null);
addSpawn(EXIST_CUBIC, 185082, -12606, -5499, 6133, false, 900000); // 15min
GrandBossManager.getInstance().setBossStatus(ANAKIM, DEAD);
final long respawnTime = getRespawnTime();
final StatsSet info = GrandBossManager.getInstance().getStatsSet(ANAKIM);
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatsSet(ANAKIM, info);
startQuestTimer("unlock_anakim", respawnTime, null, null);
startQuestTimer("end_anakim", 900000, null, null);
}
else if (npc.getId() == REMNANT)
{
_remnants.remove(npc);
if (_remnants.isEmpty())
{
addSpawn(ANAKIM_CUBIC, 183225, -11911, -4897, 32768, false, 60 * 60000, false, 0);
}
}
return super.onKill(npc, killer, isPet);
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_ANAKIM_ZONE.isInsideZone(npc))
{
if (skill == REMANT_TELE)
{
notifyEvent("spawn_remant", npc, null);
}
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isPet)
{
if (CommonUtil.contains(ANAKIM_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _anakimBoss)) // Don't call minions if are healing Anakim
{
((L2Attackable) npc).clearAggroList();
npc.setTarget(caster);
((L2Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
private int getRespawnTime()
{
return (int) calcReuseFromDays(0, 21, Calendar.TUESDAY, 0, 16, Calendar.SATURDAY);
}
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
Calendar now = Calendar.getInstance();
Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day);
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);
if (now.after(day1))
{
day1.add(Calendar.WEEK_OF_MONTH, 1);
}
if (now.after(day2))
{
day2.add(Calendar.WEEK_OF_MONTH, 1);
}
Calendar reenter = day1;
if (day2.before(day1))
{
reenter = day2;
}
return reenter.getTimeInMillis() - System.currentTimeMillis();
}
public static void main(String[] args)
{
new Anakim();
}
}

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br
>A human-like voice comes from a glowing blue orb:<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest Lilith">"I kinda want to teleport inside."</Button>
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
A human-like voice comes from a glowing blue orb:<br>
Someone already went in, and Lilith disappeared soon after. There is no point in entering right now.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
(A command channel needs at least %min% members to challenge Lilith.)
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
You are overcome by a voice, a voice so powerful you are helpless as it speaks:<br>
(The players who belong to an association can only enter through the Association Leader.)
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
(A command channel members level must be %minlvl% - %maxlvl% to challenge Lilith.)
</body></html>

View File

@@ -1,7 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
A human voice seems to emanate from a shining, blue globe:<br>
Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Lilith">Teleport</Button>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h npc_%objectId%_Quest OracleTeleport">Enter the Dimensional Rift</Button>
<Button ALIGN=LEFT ICON="QUEST" action="bypass -h npc_%objectId%_Quest">Quest</Button>
</body></html>

View File

@@ -1,5 +0,0 @@
<html><body>Gatekeeper Ziggurat:<br>
A human voice seems to emanate from a shining, blue globe:<br>
Behold the gateway to the Forbidden Sacred Area! My job is to guard it, and you cannot pass without my permission.<br>
<Button ALIGN=LEFT ICON="TELEPORT" action="bypass -h Quest Lilith exist">"Okay. I will teleport."</Button>
</body></html>

View File

@@ -1,733 +0,0 @@
/*
* 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 java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import com.l2jmobius.Config;
import com.l2jmobius.commons.util.CommonUtil;
import com.l2jmobius.commons.util.Rnd;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.data.xml.impl.SkillData;
import com.l2jmobius.gameserver.instancemanager.GrandBossManager;
import com.l2jmobius.gameserver.instancemanager.MapRegionManager;
import com.l2jmobius.gameserver.instancemanager.ZoneManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2Party;
import com.l2jmobius.gameserver.model.L2Spawn;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.TeleportWhereType;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SpawnHolder;
import com.l2jmobius.gameserver.model.quest.QuestTimer;
import com.l2jmobius.gameserver.model.skills.AbnormalType;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.network.serverpackets.NpcHtmlMessage;
import ai.AbstractNpcAI;
/**
* Lilith AI<br>
* @author LasTravel<br>
* @URL http://boards.lineage2.com/showpost.php?p=3386784&postcount=6<br>
* @video https://www.youtube.com/watch?v=H3MuIwUjjD4
*/
public class Lilith extends AbstractNpcAI
{
// Status
private static final int ALIVE = 0;
private static final int WAITING = 1;
private static final int FIGHTING = 2;
private static final int DEAD = 3;
// NPCs
private static final int LILITH = 25283;
private static final int REMNANT = 19490;
private static final int ENTER_CUBIC = 31118;
private static final int EXIST_CUBIC = 31124;
private static final int LILITH_CUBIC = 31110;
//@formatter:off
private static final int[] LILITH_MINIONS = {25284, 25285};
private static final int[] NECRO_MOBS = {21178, 21179, 21180, 21181, 21182, 21183, 21184, 21185, 21186};
//@formatter:on
private static final int[] ALL_MOBS =
{
LILITH,
LILITH_MINIONS[0],
LILITH_MINIONS[1],
NECRO_MOBS[0],
NECRO_MOBS[1],
NECRO_MOBS[2],
NECRO_MOBS[3],
NECRO_MOBS[4],
NECRO_MOBS[5],
NECRO_MOBS[6],
NECRO_MOBS[7],
NECRO_MOBS[8],
REMNANT
};
// Spawns
private static final List<SpawnHolder> SPAWNS = new ArrayList<>();
static
{
SPAWNS.add(new SpawnHolder(21179, -16469, 13406, -4905, 32815, false));
SPAWNS.add(new SpawnHolder(21178, -16756, 13397, -4905, 33094, false));
SPAWNS.add(new SpawnHolder(21182, -16995, 13398, -4905, 32724, false));
SPAWNS.add(new SpawnHolder(21180, -17261, 13395, -4905, 32885, false));
SPAWNS.add(new SpawnHolder(21180, -16474, 13678, -4905, 32864, false));
SPAWNS.add(new SpawnHolder(21181, -16739, 13675, -4905, 32886, false));
SPAWNS.add(new SpawnHolder(21186, -16991, 13672, -4905, 32892, false));
SPAWNS.add(new SpawnHolder(21186, -17263, 13675, -4905, 32652, false));
SPAWNS.add(new SpawnHolder(21180, -15271, 13463, -4905, 16550, false));
SPAWNS.add(new SpawnHolder(21178, -15273, 13750, -4905, 16456, false));
SPAWNS.add(new SpawnHolder(21185, -15275, 13998, -4905, 16468, false));
SPAWNS.add(new SpawnHolder(21186, -15279, 14256, -4905, 16545, false));
SPAWNS.add(new SpawnHolder(21183, -15604, 13454, -4905, 16662, false));
SPAWNS.add(new SpawnHolder(21183, -15608, 13738, -4905, 16530, false));
SPAWNS.add(new SpawnHolder(21185, -15597, 14014, -4905, 15968, false));
SPAWNS.add(new SpawnHolder(21180, -15599, 14258, -4905, 16469, false));
SPAWNS.add(new SpawnHolder(21185, -14242, 13505, -4903, 65400, false));
SPAWNS.add(new SpawnHolder(21181, -14720, 13505, -4903, 32767, false));
SPAWNS.add(new SpawnHolder(21183, -14477, 13321, -4903, 49151, false));
SPAWNS.add(new SpawnHolder(21182, -14480, 13500, -4903, 18259, false));
SPAWNS.add(new SpawnHolder(21183, -14482, 13734, -4903, 16473, false));
SPAWNS.add(new SpawnHolder(21184, -13146, 13508, -4903, 42, false));
SPAWNS.add(new SpawnHolder(21179, -13625, 13506, -4903, 32426, false));
SPAWNS.add(new SpawnHolder(21179, -13390, 13261, -4903, 48922, false));
SPAWNS.add(new SpawnHolder(21181, -13390, 13752, -4903, 15915, false));
SPAWNS.add(new SpawnHolder(21185, -13379, 13508, -4903, 49621, false));
SPAWNS.add(new SpawnHolder(21178, -13422, 15555, -4905, 65425, false));
SPAWNS.add(new SpawnHolder(21186, -13152, 15548, -4905, 65265, false));
SPAWNS.add(new SpawnHolder(21186, -12894, 15544, -4905, 65374, false));
SPAWNS.add(new SpawnHolder(21186, -12614, 15540, -4905, 65387, false));
SPAWNS.add(new SpawnHolder(21185, -13404, 15224, -4905, 65263, false));
SPAWNS.add(new SpawnHolder(21181, -13156, 15224, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21179, -12896, 15223, -4905, 65495, false));
SPAWNS.add(new SpawnHolder(21184, -12624, 15220, -4905, 1401, false));
SPAWNS.add(new SpawnHolder(21186, -11492, 15690, -4905, 48932, false));
SPAWNS.add(new SpawnHolder(21179, -11488, 15432, -4905, 49313, false));
SPAWNS.add(new SpawnHolder(21178, -11490, 15132, -4905, 49082, false));
SPAWNS.add(new SpawnHolder(21185, -11497, 14893, -4905, 48846, false));
SPAWNS.add(new SpawnHolder(21182, -11485, 14647, -4905, 49660, false));
SPAWNS.add(new SpawnHolder(21185, -11476, 14397, -4905, 49527, false));
SPAWNS.add(new SpawnHolder(21182, -11079, 15682, -4905, 49406, false));
SPAWNS.add(new SpawnHolder(21186, -11076, 15417, -4905, 49270, false));
SPAWNS.add(new SpawnHolder(21184, -11079, 15152, -4905, 49033, false));
SPAWNS.add(new SpawnHolder(21181, -11077, 14912, -4905, 49238, false));
SPAWNS.add(new SpawnHolder(21184, -11075, 14670, -4905, 49238, false));
SPAWNS.add(new SpawnHolder(21180, -11073, 14347, -4905, 49707, false));
SPAWNS.add(new SpawnHolder(21186, -8787, 13273, -4903, 49053, false));
SPAWNS.add(new SpawnHolder(21178, -8785, 13753, -4903, 16351, false));
SPAWNS.add(new SpawnHolder(21182, -9026, 13498, -4903, 33142, false));
SPAWNS.add(new SpawnHolder(21184, -8520, 13506, -4903, 151, false));
SPAWNS.add(new SpawnHolder(21182, -8784, 13501, -4903, 33079, false));
SPAWNS.add(new SpawnHolder(21179, -13393, 18350, -4903, 16498, false));
SPAWNS.add(new SpawnHolder(21181, -13389, 17881, -4903, 49681, false));
SPAWNS.add(new SpawnHolder(21180, -13635, 18105, -4903, 33289, false));
SPAWNS.add(new SpawnHolder(21184, -13397, 18111, -4903, 0, false));
SPAWNS.add(new SpawnHolder(21186, -13062, 18115, -4903, 64741, false));
SPAWNS.add(new SpawnHolder(21179, -12597, 18131, -4905, 49273, false));
SPAWNS.add(new SpawnHolder(21182, -12593, 17897, -4905, 49330, false));
SPAWNS.add(new SpawnHolder(21180, -12594, 17606, -4905, 49116, false));
SPAWNS.add(new SpawnHolder(21180, -12595, 17367, -4905, 49108, false));
SPAWNS.add(new SpawnHolder(21182, -12269, 18143, -4905, 48851, false));
SPAWNS.add(new SpawnHolder(21180, -12270, 17872, -4905, 49113, false));
SPAWNS.add(new SpawnHolder(21183, -12274, 17612, -4905, 48991, false));
SPAWNS.add(new SpawnHolder(21183, -12279, 17337, -4905, 51622, false));
SPAWNS.add(new SpawnHolder(21185, -13395, 19509, -4903, 17094, false));
SPAWNS.add(new SpawnHolder(21180, -13388, 18895, -4903, 49301, false));
SPAWNS.add(new SpawnHolder(21184, -13114, 19198, -4903, 65211, false));
SPAWNS.add(new SpawnHolder(21182, -13383, 19196, -4903, 32845, false));
SPAWNS.add(new SpawnHolder(21181, -13711, 19197, -4903, 32519, false));
SPAWNS.add(new SpawnHolder(21181, -14781, 19199, -4903, 33074, false));
SPAWNS.add(new SpawnHolder(21183, -14188, 19205, -4903, 867, false));
SPAWNS.add(new SpawnHolder(21181, -14495, 19193, -4903, 32351, false));
SPAWNS.add(new SpawnHolder(21180, -14481, 19503, -4903, 15913, false));
SPAWNS.add(new SpawnHolder(21178, -14475, 18881, -4903, 49151, false));
SPAWNS.add(new SpawnHolder(21183, -14477, 17797, -4903, 49700, false));
SPAWNS.add(new SpawnHolder(21181, -14481, 18417, -4903, 16947, false));
SPAWNS.add(new SpawnHolder(21185, -14178, 18110, -4903, 66, false));
SPAWNS.add(new SpawnHolder(21181, -14476, 18110, -4903, 32767, false));
SPAWNS.add(new SpawnHolder(21186, -14793, 18109, -4903, 32800, false));
SPAWNS.add(new SpawnHolder(21182, -16404, 15929, -4905, 15862, false));
SPAWNS.add(new SpawnHolder(21178, -16401, 16194, -4905, 16265, false));
SPAWNS.add(new SpawnHolder(21185, -16402, 16472, -4905, 16421, false));
SPAWNS.add(new SpawnHolder(21184, -16405, 16721, -4905, 16509, false));
SPAWNS.add(new SpawnHolder(21185, -16409, 16966, -4905, 16554, false));
SPAWNS.add(new SpawnHolder(21185, -16415, 17223, -4905, 16627, false));
SPAWNS.add(new SpawnHolder(21180, -16794, 15936, -4905, 16009, false));
SPAWNS.add(new SpawnHolder(21182, -16786, 16208, -4905, 16077, false));
SPAWNS.add(new SpawnHolder(21182, -16775, 16485, -4905, 15970, false));
SPAWNS.add(new SpawnHolder(21180, -16781, 16725, -4905, 16644, false));
SPAWNS.add(new SpawnHolder(21180, -16774, 17008, -4905, 16126, false));
SPAWNS.add(new SpawnHolder(21184, -16773, 17266, -4905, 16343, false));
SPAWNS.add(new SpawnHolder(21186, -19088, 18401, -4903, 16653, false));
SPAWNS.add(new SpawnHolder(21182, -19089, 17842, -4903, 49586, false));
SPAWNS.add(new SpawnHolder(21186, -19339, 18108, -4903, 32845, false));
SPAWNS.add(new SpawnHolder(21183, -19092, 18111, -4903, 62852, false));
SPAWNS.add(new SpawnHolder(21179, -18810, 18106, -4903, 65351, false));
SPAWNS.add(new SpawnHolder(21183, -19085, 19523, -4903, 16324, false));
SPAWNS.add(new SpawnHolder(21180, -19086, 18927, -4903, 49134, false));
SPAWNS.add(new SpawnHolder(21183, -18789, 19197, -4903, 65226, false));
SPAWNS.add(new SpawnHolder(21183, -19078, 19200, -4903, 32659, false));
SPAWNS.add(new SpawnHolder(21178, -19367, 19195, -4903, 32767, false));
SPAWNS.add(new SpawnHolder(21183, -16217, 19163, -4905, 15989, false));
SPAWNS.add(new SpawnHolder(21184, -16208, 19432, -4905, 15967, false));
SPAWNS.add(new SpawnHolder(21184, -16208, 19683, -4905, 16383, false));
SPAWNS.add(new SpawnHolder(21186, -16207, 19949, -4905, 16344, false));
SPAWNS.add(new SpawnHolder(21180, -16532, 19180, -4905, 16218, false));
SPAWNS.add(new SpawnHolder(21178, -16531, 19459, -4905, 16346, false));
SPAWNS.add(new SpawnHolder(21181, -16531, 19704, -4905, 16383, false));
SPAWNS.add(new SpawnHolder(21186, -16525, 19943, -4905, 16122, false));
SPAWNS.add(new SpawnHolder(21179, -19123, 19994, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21179, -18858, 19996, -4905, 78, false));
SPAWNS.add(new SpawnHolder(21179, -18608, 19996, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21180, -18326, 19999, -4905, 110, false));
SPAWNS.add(new SpawnHolder(21179, -19088, 20318, -4905, 175, false));
SPAWNS.add(new SpawnHolder(21179, -18842, 20318, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21178, -18579, 20318, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21184, -18313, 20320, -4905, 78, false));
SPAWNS.add(new SpawnHolder(21179, -18920, 21182, -4905, 15992, false));
SPAWNS.add(new SpawnHolder(21184, -18918, 21455, -4905, 16307, false));
SPAWNS.add(new SpawnHolder(21180, -18930, 21719, -4905, 16857, false));
SPAWNS.add(new SpawnHolder(21186, -18937, 21972, -4905, 16672, false));
SPAWNS.add(new SpawnHolder(21183, -19239, 21188, -4905, 16562, false));
SPAWNS.add(new SpawnHolder(21183, -19244, 21447, -4905, 16585, false));
SPAWNS.add(new SpawnHolder(21186, -19245, 21729, -4905, 16420, false));
SPAWNS.add(new SpawnHolder(21182, -19240, 21994, -4905, 18219, false));
SPAWNS.add(new SpawnHolder(21181, -17843, 23849, -4905, 49203, false));
SPAWNS.add(new SpawnHolder(21181, -17842, 23583, -4905, 49191, false));
SPAWNS.add(new SpawnHolder(21184, -17843, 23310, -4905, 49113, false));
SPAWNS.add(new SpawnHolder(21186, -17842, 23055, -4905, 49192, false));
SPAWNS.add(new SpawnHolder(21186, -17522, 23833, -4905, 48646, false));
SPAWNS.add(new SpawnHolder(21183, -17526, 23552, -4905, 49003, false));
SPAWNS.add(new SpawnHolder(21178, -17532, 23281, -4905, 48921, false));
SPAWNS.add(new SpawnHolder(21178, -17526, 23019, -4905, 49390, false));
SPAWNS.add(new SpawnHolder(21183, -19079, 24048, -4903, 16704, false));
SPAWNS.add(new SpawnHolder(21185, -19090, 23519, -4903, 49362, false));
SPAWNS.add(new SpawnHolder(21185, -19356, 23804, -4903, 32408, false));
SPAWNS.add(new SpawnHolder(21182, -19093, 23808, -4903, 65106, false));
SPAWNS.add(new SpawnHolder(21185, -18777, 23810, -4903, 347, false));
SPAWNS.add(new SpawnHolder(21180, -14131, 23807, -4903, 64686, false));
SPAWNS.add(new SpawnHolder(21179, -14769, 23804, -4903, 34020, false));
SPAWNS.add(new SpawnHolder(21183, -14479, 23507, -4903, 50019, false));
SPAWNS.add(new SpawnHolder(21178, -14479, 23799, -4903, 16383, false));
SPAWNS.add(new SpawnHolder(21184, -14471, 24087, -4903, 15031, false));
SPAWNS.add(new SpawnHolder(21178, -13060, 23806, -4903, 108, false));
SPAWNS.add(new SpawnHolder(21181, -13392, 23807, -4903, 30946, false));
SPAWNS.add(new SpawnHolder(21186, -13691, 23807, -4903, 32767, false));
SPAWNS.add(new SpawnHolder(21179, -13393, 24098, -4903, 15393, false));
SPAWNS.add(new SpawnHolder(21179, -13390, 23480, -4903, 47204, false));
SPAWNS.add(new SpawnHolder(21178, -12589, 23863, -4905, 48374, false));
SPAWNS.add(new SpawnHolder(21183, -12591, 23560, -4905, 49083, false));
SPAWNS.add(new SpawnHolder(21181, -12578, 23295, -4905, 49663, false));
SPAWNS.add(new SpawnHolder(21182, -12582, 23026, -4905, 48996, false));
SPAWNS.add(new SpawnHolder(21183, -12268, 23817, -4905, 49887, false));
SPAWNS.add(new SpawnHolder(21185, -12270, 23573, -4905, 49066, false));
SPAWNS.add(new SpawnHolder(21186, -12277, 23280, -4905, 48902, false));
SPAWNS.add(new SpawnHolder(21184, -12272, 23061, -4905, 49390, false));
SPAWNS.add(new SpawnHolder(21186, -11412, 23638, -4905, 65163, false));
SPAWNS.add(new SpawnHolder(21180, -11156, 23641, -4905, 122, false));
SPAWNS.add(new SpawnHolder(21184, -10897, 23653, -4905, 482, false));
SPAWNS.add(new SpawnHolder(21180, -10636, 23651, -4905, 65456, false));
SPAWNS.add(new SpawnHolder(21180, -11386, 23958, -4905, 529, false));
SPAWNS.add(new SpawnHolder(21179, -11126, 23964, -4905, 240, false));
SPAWNS.add(new SpawnHolder(21180, -10857, 23968, -4905, 155, false));
SPAWNS.add(new SpawnHolder(21178, -10608, 23966, -4905, 65452, false));
SPAWNS.add(new SpawnHolder(21183, -8540, 23806, -4903, 65438, false));
SPAWNS.add(new SpawnHolder(21180, -9103, 23804, -4903, 32907, false));
SPAWNS.add(new SpawnHolder(21186, -8790, 24102, -4903, 16731, false));
SPAWNS.add(new SpawnHolder(21180, -8774, 23809, -4903, 50950, false));
SPAWNS.add(new SpawnHolder(21180, -8784, 23493, -4903, 47854, false));
SPAWNS.add(new SpawnHolder(21180, -8758, 22562, -4905, 32767, false));
SPAWNS.add(new SpawnHolder(21182, -9037, 22562, -4905, 32767, false));
SPAWNS.add(new SpawnHolder(21183, -9297, 22554, -4905, 32012, false));
SPAWNS.add(new SpawnHolder(21183, -9536, 22554, -4905, 32767, false));
SPAWNS.add(new SpawnHolder(21180, -8761, 22246, -4905, 32767, false));
SPAWNS.add(new SpawnHolder(21182, -9007, 22247, -4905, 32725, false));
SPAWNS.add(new SpawnHolder(21181, -9275, 22240, -4905, 33040, false));
SPAWNS.add(new SpawnHolder(21183, -9545, 22231, -4905, 33115, false));
SPAWNS.add(new SpawnHolder(21183, -8787, 18829, -4903, 49288, false));
SPAWNS.add(new SpawnHolder(21184, -8785, 19512, -4903, 17015, false));
SPAWNS.add(new SpawnHolder(21178, -8516, 19196, -4903, 147, false));
SPAWNS.add(new SpawnHolder(21180, -8774, 19194, -4903, 32465, false));
SPAWNS.add(new SpawnHolder(21180, -9151, 19200, -4903, 33236, false));
SPAWNS.add(new SpawnHolder(21184, -8781, 17784, -4903, 49334, false));
SPAWNS.add(new SpawnHolder(21183, -8778, 18444, -4903, 16507, false));
SPAWNS.add(new SpawnHolder(21183, -8527, 18116, -4903, 65299, false));
SPAWNS.add(new SpawnHolder(21183, -8784, 18110, -4903, 32767, false));
SPAWNS.add(new SpawnHolder(21184, -9116, 18107, -4903, 32862, false));
SPAWNS.add(new SpawnHolder(21180, -8775, 16859, -4905, 33548, false));
SPAWNS.add(new SpawnHolder(21186, -9021, 16865, -4905, 32513, false));
SPAWNS.add(new SpawnHolder(21185, -9288, 16862, -4905, 33196, false));
SPAWNS.add(new SpawnHolder(21179, -9547, 16871, -4905, 32405, false));
SPAWNS.add(new SpawnHolder(21185, -8760, 16543, -4905, 32517, false));
SPAWNS.add(new SpawnHolder(21180, -9068, 16540, -4905, 32869, false));
SPAWNS.add(new SpawnHolder(21183, -9305, 16548, -4905, 32416, false));
SPAWNS.add(new SpawnHolder(21181, -9581, 16562, -4905, 32239, false));
SPAWNS.add(new SpawnHolder(21180, -11386, 17976, -4905, 64074, false));
SPAWNS.add(new SpawnHolder(21181, -11129, 17977, -4905, 40, false));
SPAWNS.add(new SpawnHolder(21183, -10864, 17977, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21181, -10610, 17973, -4905, 65371, false));
SPAWNS.add(new SpawnHolder(21184, -11383, 18238, -4905, 481, false));
SPAWNS.add(new SpawnHolder(21181, -11129, 18248, -4905, 410, false));
SPAWNS.add(new SpawnHolder(21179, -10861, 18255, -4905, 142, false));
SPAWNS.add(new SpawnHolder(21183, -10629, 18264, -4905, 436, false));
SPAWNS.add(new SpawnHolder(21186, -11468, 21371, -4905, 49558, false));
SPAWNS.add(new SpawnHolder(21185, -11475, 21103, -4905, 48879, false));
SPAWNS.add(new SpawnHolder(21180, -11466, 20854, -4905, 49528, false));
SPAWNS.add(new SpawnHolder(21185, -11468, 20567, -4905, 49079, false));
SPAWNS.add(new SpawnHolder(21185, -11462, 20304, -4905, 49389, false));
SPAWNS.add(new SpawnHolder(21183, -11446, 20056, -4905, 49823, false));
SPAWNS.add(new SpawnHolder(21182, -11081, 21367, -4905, 48668, false));
SPAWNS.add(new SpawnHolder(21183, -11094, 21069, -4905, 48697, false));
SPAWNS.add(new SpawnHolder(21181, -11088, 20812, -4905, 49395, false));
SPAWNS.add(new SpawnHolder(21185, -11081, 20553, -4905, 49433, false));
SPAWNS.add(new SpawnHolder(21178, -11087, 20281, -4905, 48921, false));
SPAWNS.add(new SpawnHolder(21178, -11077, 20010, -4905, 49536, false));
SPAWNS.add(new SpawnHolder(21183, -13405, 20920, -4905, 64568, false));
SPAWNS.add(new SpawnHolder(21181, -13146, 20928, -4905, 322, false));
SPAWNS.add(new SpawnHolder(21178, -12901, 20923, -4905, 65323, false));
SPAWNS.add(new SpawnHolder(21184, -12637, 20927, -4905, 158, false));
SPAWNS.add(new SpawnHolder(21185, -13437, 21244, -4905, 47, false));
SPAWNS.add(new SpawnHolder(21183, -13125, 21245, -4905, 33, false));
SPAWNS.add(new SpawnHolder(21178, -12876, 21257, -4905, 502, false));
SPAWNS.add(new SpawnHolder(21183, -12647, 21242, -4905, 64853, false));
SPAWNS.add(new SpawnHolder(21183, -16669, 21115, -4905, 496, false));
SPAWNS.add(new SpawnHolder(21179, -16395, 21117, -4905, 76, false));
SPAWNS.add(new SpawnHolder(21182, -16106, 21119, -4905, 72, false));
SPAWNS.add(new SpawnHolder(21179, -15871, 21117, -4905, 65447, false));
SPAWNS.add(new SpawnHolder(21181, -15595, 21120, -4905, 113, false));
SPAWNS.add(new SpawnHolder(21183, -15317, 21135, -4905, 562, false));
SPAWNS.add(new SpawnHolder(21186, -16649, 21512, -4905, 635, false));
SPAWNS.add(new SpawnHolder(21185, -16403, 21506, -4905, 65281, false));
SPAWNS.add(new SpawnHolder(21179, -16124, 21500, -4905, 65311, false));
SPAWNS.add(new SpawnHolder(21185, -15846, 21499, -4905, 64349, false));
SPAWNS.add(new SpawnHolder(21182, -15591, 21510, -4905, 449, false));
SPAWNS.add(new SpawnHolder(21184, -15331, 21510, -4905, 0, false));
SPAWNS.add(new SpawnHolder(21186, -19128, 14749, -4905, 65123, false));
SPAWNS.add(new SpawnHolder(21185, -18842, 14750, -4905, 36, false));
SPAWNS.add(new SpawnHolder(21181, -18584, 14748, -4905, 65455, false));
SPAWNS.add(new SpawnHolder(21180, -18321, 14746, -4905, 65456, false));
SPAWNS.add(new SpawnHolder(21185, -19101, 15060, -4905, 65437, false));
SPAWNS.add(new SpawnHolder(21184, -18821, 15071, -4905, 409, false));
SPAWNS.add(new SpawnHolder(21184, -18583, 15069, -4905, 65448, false));
SPAWNS.add(new SpawnHolder(21183, -18303, 15070, -4905, 37, false));
SPAWNS.add(new SpawnHolder(21186, -14450, 16357, -4905, 32120, false));
SPAWNS.add(new SpawnHolder(21184, -14736, 16367, -4905, 32403, false));
SPAWNS.add(new SpawnHolder(21178, -14975, 16370, -4905, 32637, false));
SPAWNS.add(new SpawnHolder(21184, -15234, 16378, -4905, 32445, false));
SPAWNS.add(new SpawnHolder(21186, -14424, 16069, -4905, 33302, false));
SPAWNS.add(new SpawnHolder(21178, -14706, 16066, -4905, 32878, false));
SPAWNS.add(new SpawnHolder(21183, -14996, 16061, -4905, 32947, false));
SPAWNS.add(new SpawnHolder(21184, -15242, 16055, -4905, 33022, false));
}
// Skill
private static final Skill REMANT_TELE = SkillData.getInstance().getSkill(23303, 1);
// Misc
private static final Location ENTER_LOC = new Location(-19361, 13504, -4906);
private static final Location ENTER_LILITH_LOC = new Location(184449, -9032, -5499);
private static final L2ZoneType BOSS_ZONE = ZoneManager.getInstance().getZoneById(12005);
private static final L2ZoneType PRE_LILITH_ZONE = ZoneManager.getInstance().getZoneById(12006);
// Others
private static List<L2Npc> _spawns = new ArrayList<>();
private static List<L2Npc> _remnants = new ArrayList<>();
private static long _lastAction;
private static L2Npc _lilithBoss;
public Lilith()
{
addTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC);
addStartNpc(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC);
addFirstTalkId(ENTER_CUBIC, EXIST_CUBIC, LILITH_CUBIC);
addSpellFinishedId(REMNANT);
addAttackId(ALL_MOBS);
addKillId(ALL_MOBS);
addSkillSeeId(ALL_MOBS);
// Unlock
final StatsSet info = GrandBossManager.getInstance().getStatsSet(LILITH);
final int status = GrandBossManager.getInstance().getBossStatus(LILITH);
if (status == DEAD)
{
final long time = info.getLong("respawn_time") - System.currentTimeMillis();
if (time > 0)
{
startQuestTimer("unlock_lilith", time, null, null);
}
else
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
else if (status != ALIVE)
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
switch (event)
{
case "unlock_lilith":
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
break;
}
case "check_activity_task":
{
if ((_lastAction + 900000) < System.currentTimeMillis())
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
for (L2Character charInside : BOSS_ZONE.getCharactersInside())
{
if (charInside != null)
{
if (charInside.isNpc())
{
charInside.deleteMe();
}
else if (charInside.isPlayer())
{
charInside.teleToLocation(MapRegionManager.getInstance().getTeleToLocation(charInside, TeleportWhereType.TOWN));
}
}
}
startQuestTimer("end_lilith", 2000, null, null);
}
else
{
startQuestTimer("check_activity_task", 60000, null, null);
}
break;
}
case "spawn_remant":
{
L2Npc randomSpawn = null;
if (npc == null)
{
for (int i = 0; i < 2; i++)
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
L2Npc remnant = addSpawn(REMNANT, randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ(), randomSpawn.getHeading(), true, 0, false, 0);
_remnants.add(remnant);
}
}
}
else
{
randomSpawn = _spawns.get(Rnd.get(_spawns.size()));
if (randomSpawn != null)
{
npc.teleToLocation(randomSpawn.getX(), randomSpawn.getY(), randomSpawn.getZ());
_spawns.add(npc);
}
}
break;
}
case "cancel_timers":
{
QuestTimer activityTimer = getQuestTimer("check_activity_task", null, null);
if (activityTimer != null)
{
activityTimer.cancel();
}
QuestTimer forceEnd = getQuestTimer("end_lilith", null, null);
if (forceEnd != null)
{
forceEnd.cancel();
}
break;
}
case "end_lilith":
{
notifyEvent("cancel_timers", null, null);
if (_lilithBoss != null)
{
_lilithBoss.deleteMe();
}
BOSS_ZONE.oustAllPlayers();
PRE_LILITH_ZONE.oustAllPlayers();
for (L2Npc spawn : _spawns)
{
if (spawn != null)
{
spawn.deleteMe();
}
}
_spawns.clear();
for (L2Npc remnant : _remnants)
{
if (remnant == null)
{
continue;
}
remnant.deleteMe();
}
if (GrandBossManager.getInstance().getBossStatus(LILITH) != DEAD)
{
GrandBossManager.getInstance().setBossStatus(LILITH, ALIVE);
}
break;
}
case "exist":
{
player.teleToLocation(TeleportWhereType.TOWN);
break;
}
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
if ((npc.getId() == ENTER_CUBIC) || (npc.getId() == LILITH_CUBIC))
{
final int _lilithStatus = GrandBossManager.getInstance().getBossStatus(LILITH);
if ((npc.getId() == ENTER_CUBIC) && (_lilithStatus > ALIVE))
{
return "31118-01.html";
}
if (!player.isInParty())
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31118-02.html"));
packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS));
player.sendPacket(packet);
return null;
}
final L2Party party = player.getParty();
final boolean isInCC = party.isInCommandChannel();
final List<L2PcInstance> members = (isInCC) ? party.getCommandChannel().getMembers() : party.getMembers();
final boolean isPartyLeader = (isInCC) ? party.getCommandChannel().isLeader(player) : party.isLeader(player);
if (!isPartyLeader)
{
return "31118-03.html";
}
if ((members.size() < Config.LILITH_MIN_PLAYERS) || (members.size() > Config.LILITH_MAX_PLAYERS))
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31118-02.html"));
packet.replace("%min%", Integer.toString(Config.LILITH_MIN_PLAYERS));
player.sendPacket(packet);
return null;
}
for (L2PcInstance member : members)
{
if ((member.getLevel() < Config.LILITH_MIN_PLAYER_LVL) || (member.getLevel() > Config.LILITH_MAX_PLAYER_LVL))
{
final NpcHtmlMessage packet = new NpcHtmlMessage(npc.getObjectId());
packet.setHtml(getHtm(player, "31118-04.html"));
packet.replace("%minlvl%", Integer.toString(Config.LILITH_MIN_PLAYER_LVL));
packet.replace("%maxlvl%", Integer.toString(Config.LILITH_MAX_PLAYER_LVL));
player.sendPacket(packet);
return null;
}
}
for (L2PcInstance member : members)
{
if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == ENTER_CUBIC))
{
member.teleToLocation(ENTER_LOC, true);
}
else if (member.isInsideRadius3D(npc, 1000) && (npc.getId() == LILITH_CUBIC))
{
member.teleToLocation(ENTER_LILITH_LOC, true);
}
}
if ((_lilithStatus == ALIVE) && (npc.getId() == ENTER_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(LILITH, WAITING);
_spawns.clear();
for (SpawnHolder spawn : SPAWNS)
{
_spawns.add(addSpawn(spawn.getNpcId(), spawn.getLocation()));
}
_remnants.clear();
notifyEvent("spawn_remant", null, null);
_lastAction = System.currentTimeMillis();
startQuestTimer("check_activity_task", 60000, null, null, true);
}
else if ((_lilithStatus == WAITING) && (npc.getId() == LILITH_CUBIC))
{
GrandBossManager.getInstance().setBossStatus(LILITH, FIGHTING);
// Spawn the rb
_lilithBoss = addSpawn(LILITH, 185062, -9605, -5499, 15640, false, 0);
GrandBossManager.getInstance().addBoss((L2GrandBossInstance) _lilithBoss);
startQuestTimer("end_lilith", 60 * 60000, null, null); // 1h
}
}
return super.onTalk(npc, player);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isPet)
{
_lastAction = System.currentTimeMillis();
if (npc.isMinion() || npc.isRaid()) // Lilith and minions
{
// Anti BUGGERS
if (!BOSS_ZONE.isInsideZone(attacker)) // Character attacking out of zone
{
attacker.doDie(null);
}
if (!BOSS_ZONE.isInsideZone(npc)) // Npc moved out of the zone
{
L2Spawn spawn = npc.getSpawn();
if (spawn != null)
{
npc.teleToLocation(spawn.getX(), spawn.getY(), spawn.getZ());
}
}
}
if (npc.getId() == REMNANT)
{
if (npc.getCurrentHp() < (npc.getMaxHp() * 0.30))
{
if (!npc.isCastingNow() && (Rnd.get(100) > 95))
{
npc.doCast(REMANT_TELE);
}
}
}
return super.onAttack(npc, attacker, damage, isPet);
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isPet)
{
if (npc.getId() == LILITH)
{
notifyEvent("cancel_timers", null, null);
addSpawn(EXIST_CUBIC, 185062, -9605, -5499, 15640, false, 900000); // 15min
GrandBossManager.getInstance().setBossStatus(LILITH, DEAD);
final long respawnTime = getRespawnTime();
final StatsSet info = GrandBossManager.getInstance().getStatsSet(LILITH);
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatsSet(LILITH, info);
startQuestTimer("unlock_lilith", respawnTime, null, null);
startQuestTimer("end_lilith", 900000, null, null);
}
else if (npc.getId() == REMNANT)
{
_remnants.remove(npc);
if (_remnants.isEmpty())
{
addSpawn(LILITH_CUBIC, -19410, 23805, -4903, 62917, false, 60 * 60000, false, 0);
}
}
return super.onKill(npc, killer, isPet);
}
@Override
public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
{
if ((npc.getId() == REMNANT) && PRE_LILITH_ZONE.isInsideZone(npc))
{
if (skill == REMANT_TELE)
{
notifyEvent("spawn_remant", npc, null);
}
}
return super.onSpellFinished(npc, player, skill);
}
@Override
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isPet)
{
if (CommonUtil.contains(LILITH_MINIONS, npc.getId()) && Rnd.nextBoolean())
{
if (skill.getAbnormalType() == AbnormalType.HP_RECOVER)
{
if (!npc.isCastingNow() && (npc.getTarget() != npc) && (npc.getTarget() != caster) && (npc.getTarget() != _lilithBoss))
{
((L2Attackable) npc).clearAggroList();
npc.setTarget(caster);
((L2Attackable) npc).addDamageHate(caster, 500, 99999);
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, caster);
}
}
}
return super.onSkillSee(npc, caster, skill, targets, isPet);
}
private int getRespawnTime()
{
return (int) calcReuseFromDays(0, 21, Calendar.THURSDAY, 0, 14, Calendar.SATURDAY);
}
private long calcReuseFromDays(int day1Minute, int day1Hour, int day1Day, int day2Minute, int day2Hour, int day2Day)
{
Calendar now = Calendar.getInstance();
Calendar day1 = (Calendar) now.clone();
day1.set(Calendar.MINUTE, day1Minute);
day1.set(Calendar.HOUR_OF_DAY, day1Hour);
day1.set(Calendar.DAY_OF_WEEK, day1Day);
Calendar day2 = (Calendar) day1.clone();
day2.set(Calendar.MINUTE, day2Minute);
day2.set(Calendar.HOUR_OF_DAY, day2Hour);
day2.set(Calendar.DAY_OF_WEEK, day2Day);
if (now.after(day1))
{
day1.add(Calendar.WEEK_OF_MONTH, 1);
}
if (now.after(day2))
{
day2.add(Calendar.WEEK_OF_MONTH, 1);
}
Calendar reenter = day1;
if (day2.before(day1))
{
reenter = day2;
}
return reenter.getTimeInMillis() - System.currentTimeMillis();
}
@Override
public String onFirstTalk(L2Npc npc, L2PcInstance player)
{
return npc.getId() + ".html";
}
public static void main(String[] args)
{
new Lilith();
}
}

View File

@@ -1,350 +0,0 @@
/*
* 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.Orfen;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import com.l2jmobius.Config;
import com.l2jmobius.gameserver.ai.CtrlIntention;
import com.l2jmobius.gameserver.enums.ChatType;
import com.l2jmobius.gameserver.instancemanager.GrandBossManager;
import com.l2jmobius.gameserver.instancemanager.ZoneManager;
import com.l2jmobius.gameserver.model.L2Object;
import com.l2jmobius.gameserver.model.L2Spawn;
import com.l2jmobius.gameserver.model.Location;
import com.l2jmobius.gameserver.model.StatsSet;
import com.l2jmobius.gameserver.model.actor.L2Attackable;
import com.l2jmobius.gameserver.model.actor.L2Character;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2GrandBossInstance;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.holders.SkillHolder;
import com.l2jmobius.gameserver.model.skills.Skill;
import com.l2jmobius.gameserver.model.skills.SkillCaster;
import com.l2jmobius.gameserver.model.zone.L2ZoneType;
import com.l2jmobius.gameserver.network.NpcStringId;
import com.l2jmobius.gameserver.network.serverpackets.PlaySound;
import ai.AbstractNpcAI;
/**
* Orfen's AI
* @author Emperorc
*/
public final class Orfen extends AbstractNpcAI
{
private static final Location[] POS =
{
new Location(43728, 17220, -4342),
new Location(55024, 17368, -5412),
new Location(53504, 21248, -5486),
new Location(53248, 24576, -5262)
};
private static final NpcStringId[] TEXT =
{
NpcStringId.S1_STOP_KIDDING_YOURSELF_ABOUT_YOUR_OWN_POWERLESSNESS,
NpcStringId.S1_I_LL_MAKE_YOU_FEEL_WHAT_TRUE_FEAR_IS,
NpcStringId.YOU_RE_REALLY_STUPID_TO_HAVE_CHALLENGED_ME_S1_GET_READY,
NpcStringId.S1_DO_YOU_THINK_THAT_S_GOING_TO_WORK
};
private static final int ORFEN = 29014;
// private static final int RAIKEL = 29015;
private static final int RAIKEL_LEOS = 29016;
// private static final int RIBA = 29017;
private static final int RIBA_IREN = 29018;
private static boolean _IsTeleported;
private static Set<L2Attackable> _minions = ConcurrentHashMap.newKeySet();
private static L2ZoneType ZONE;
private static final byte ALIVE = 0;
private static final byte DEAD = 1;
private static final SkillHolder PARALYSIS = new SkillHolder(4064, 1);
private static final SkillHolder BLOW = new SkillHolder(4067, 4);
private static final SkillHolder ORFEN_HEAL = new SkillHolder(4516, 1);
private Orfen()
{
final int[] mobs =
{
ORFEN,
RAIKEL_LEOS,
RIBA_IREN
};
registerMobs(mobs);
_IsTeleported = false;
ZONE = ZoneManager.getInstance().getZoneById(12013);
final StatsSet info = GrandBossManager.getInstance().getStatsSet(ORFEN);
final int status = GrandBossManager.getInstance().getBossStatus(ORFEN);
if (status == DEAD)
{
// load the unlock date and time for Orfen from DB
final long temp = info.getLong("respawn_time") - System.currentTimeMillis();
// if Orfen is locked until a certain time, mark it so and start the unlock timer
// the unlock time has not yet expired.
if (temp > 0)
{
startQuestTimer("orfen_unlock", temp, null, null);
}
else
{
// the time has already expired while the server was offline. Immediately spawn Orfen.
final int i = getRandom(10);
Location loc;
if (i < 4)
{
loc = POS[1];
}
else if (i < 7)
{
loc = POS[2];
}
else
{
loc = POS[3];
}
final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0);
GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE);
spawnBoss(orfen);
}
}
else
{
final int loc_x = info.getInt("loc_x");
final int loc_y = info.getInt("loc_y");
final int loc_z = info.getInt("loc_z");
final int heading = info.getInt("heading");
final double hp = info.getDouble("currentHP");
final double mp = info.getDouble("currentMP");
final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc_x, loc_y, loc_z, heading, false, 0);
orfen.setCurrentHpMp(hp, mp);
spawnBoss(orfen);
}
}
public void setSpawnPoint(L2Npc npc, int index)
{
((L2Attackable) npc).clearAggroList();
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
final L2Spawn spawn = npc.getSpawn();
spawn.setLocation(POS[index]);
npc.teleToLocation(POS[index], false);
}
public void spawnBoss(L2GrandBossInstance npc)
{
GrandBossManager.getInstance().addBoss(npc);
npc.broadcastPacket(new PlaySound(1, "BS01_A", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
startQuestTimer("check_orfen_pos", 10000, npc, null, true);
// Spawn minions
final int x = npc.getX();
final int y = npc.getY();
L2Attackable mob;
mob = (L2Attackable) addSpawn(RAIKEL_LEOS, x + 100, y + 100, npc.getZ(), 0, false, 0);
mob.setIsRaidMinion(true);
_minions.add(mob);
mob = (L2Attackable) addSpawn(RAIKEL_LEOS, x + 100, y - 100, npc.getZ(), 0, false, 0);
mob.setIsRaidMinion(true);
_minions.add(mob);
mob = (L2Attackable) addSpawn(RAIKEL_LEOS, x - 100, y + 100, npc.getZ(), 0, false, 0);
mob.setIsRaidMinion(true);
_minions.add(mob);
mob = (L2Attackable) addSpawn(RAIKEL_LEOS, x - 100, y - 100, npc.getZ(), 0, false, 0);
mob.setIsRaidMinion(true);
_minions.add(mob);
startQuestTimer("check_minion_loc", 10000, npc, null, true);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
if (event.equalsIgnoreCase("orfen_unlock"))
{
final int i = getRandom(10);
Location loc;
if (i < 4)
{
loc = POS[1];
}
else if (i < 7)
{
loc = POS[2];
}
else
{
loc = POS[3];
}
final L2GrandBossInstance orfen = (L2GrandBossInstance) addSpawn(ORFEN, loc, false, 0);
GrandBossManager.getInstance().setBossStatus(ORFEN, ALIVE);
spawnBoss(orfen);
}
else if (event.equalsIgnoreCase("check_orfen_pos"))
{
if ((_IsTeleported && (npc.getCurrentHp() > (npc.getMaxHp() * 0.95))) || (!ZONE.isInsideZone(npc) && !_IsTeleported))
{
setSpawnPoint(npc, getRandom(3) + 1);
_IsTeleported = false;
}
else if (_IsTeleported && !ZONE.isInsideZone(npc))
{
setSpawnPoint(npc, 0);
}
}
else if (event.equalsIgnoreCase("check_minion_loc"))
{
for (L2Attackable mob : _minions)
{
if (!npc.isInsideRadius2D(mob, 3000))
{
mob.teleToLocation(npc.getLocation());
((L2Attackable) npc).clearAggroList();
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
}
}
}
else if (event.equalsIgnoreCase("despawn_minions"))
{
for (L2Attackable mob : _minions)
{
mob.decayMe();
}
_minions.clear();
}
else if (event.equalsIgnoreCase("spawn_minion"))
{
final L2Attackable mob = (L2Attackable) addSpawn(RAIKEL_LEOS, npc.getX(), npc.getY(), npc.getZ(), 0, false, 0);
mob.setIsRaidMinion(true);
_minions.add(mob);
}
return super.onAdvEvent(event, npc, player);
}
@Override
public String onSkillSee(L2Npc npc, L2PcInstance caster, Skill skill, L2Object[] targets, boolean isSummon)
{
if (npc.getId() == ORFEN)
{
final L2Character originalCaster = isSummon ? caster.getServitors().values().stream().findFirst().orElse(caster.getPet()) : caster;
if ((skill.getEffectPoint() > 0) && (getRandom(5) == 0) && npc.isInsideRadius2D(originalCaster, 1000))
{
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(4)], caster.getName());
originalCaster.teleToLocation(npc.getLocation());
npc.setTarget(originalCaster);
npc.doCast(PARALYSIS.getSkill());
}
}
return super.onSkillSee(npc, caster, skill, targets, isSummon);
}
@Override
public String onFactionCall(L2Npc npc, L2Npc caller, L2PcInstance attacker, boolean isSummon)
{
if ((caller == null) || (npc == null) || npc.isCastingNow(SkillCaster::isAnyNormalType))
{
return super.onFactionCall(npc, caller, attacker, isSummon);
}
final int npcId = npc.getId();
final int callerId = caller.getId();
if ((npcId == RAIKEL_LEOS) && (getRandom(20) == 0))
{
npc.setTarget(attacker);
npc.doCast(BLOW.getSkill());
}
else if (npcId == RIBA_IREN)
{
int chance = 1;
if (callerId == ORFEN)
{
chance = 9;
}
if ((callerId != RIBA_IREN) && (caller.getCurrentHp() < (caller.getMaxHp() / 2.0)) && (getRandom(10) < chance))
{
npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE, null, null);
npc.setTarget(caller);
npc.doCast(ORFEN_HEAL.getSkill());
}
}
return super.onFactionCall(npc, caller, attacker, isSummon);
}
@Override
public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon)
{
final int npcId = npc.getId();
if (npcId == ORFEN)
{
if (!_IsTeleported && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2)))
{
_IsTeleported = true;
setSpawnPoint(npc, 0);
}
else if (npc.isInsideRadius2D(attacker, 1000) && !npc.isInsideRadius2D(attacker, 300) && (getRandom(10) == 0))
{
npc.broadcastSay(ChatType.NPC_GENERAL, TEXT[getRandom(3)], attacker.getName());
attacker.teleToLocation(npc.getLocation());
npc.setTarget(attacker);
npc.doCast(PARALYSIS.getSkill());
}
}
else if (npcId == RIBA_IREN)
{
if (!npc.isCastingNow(SkillCaster::isAnyNormalType) && ((npc.getCurrentHp() - damage) < (npc.getMaxHp() / 2.0)))
{
npc.setTarget(attacker);
npc.doCast(ORFEN_HEAL.getSkill());
}
}
return super.onAttack(npc, attacker, damage, isSummon);
}
@Override
public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
{
if (npc.getId() == ORFEN)
{
npc.broadcastPacket(new PlaySound(1, "BS02_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
GrandBossManager.getInstance().setBossStatus(ORFEN, DEAD);
// Calculate Min and Max respawn times randomly.
long respawnTime = Config.ORFEN_SPAWN_INTERVAL + getRandom(-Config.ORFEN_SPAWN_RANDOM, Config.ORFEN_SPAWN_RANDOM);
respawnTime *= 3600000;
startQuestTimer("orfen_unlock", respawnTime, null, null);
// also save the respawn time so that the info is maintained past reboots
final StatsSet info = GrandBossManager.getInstance().getStatsSet(ORFEN);
info.set("respawn_time", System.currentTimeMillis() + respawnTime);
GrandBossManager.getInstance().setStatsSet(ORFEN, info);
cancelQuestTimer("check_minion_loc", npc, null);
cancelQuestTimer("check_orfen_pos", npc, null);
startQuestTimer("despawn_minions", 20000, null, null);
cancelQuestTimers("spawn_minion");
}
else if ((GrandBossManager.getInstance().getBossStatus(ORFEN) == ALIVE) && (npc.getId() == RAIKEL_LEOS))
{
_minions.remove(npc);
startQuestTimer("spawn_minion", 360000, npc, null);
}
return super.onKill(npc, killer, isSummon);
}
public static void main(String[] args)
{
new Orfen();
}
}

View File

@@ -1,7 +0,0 @@
<html><body>Armor Trader Radia:<br>
Welcome, stranger! What can I do for you?<br>
Nice ring! Are you here to propose to me?<br>
Just kidding! Don't tell me you thought I was serious!?<br>
Oh, you're here for Leikar's order? Sorry, it hasn't come in yet. Maybe you should check with Varan in the Town of Gludio. I've been expecting a shipment from him.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30088-03.htm">"OK."</Button>
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Armor Trader Radia:<br>
Leikar's order isn't ready because the materials haven't arrived yet. You'll need to check back later.<br>
(This quest may only be undertaken by characters of level 85 or above.)
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
I would've checked with Varan myself if I wasn't so busy. Go ask him why the materials aren't here yet.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
What are you still doing here? If you want the order, you'll have to check with Varan and find out where the materials are!
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Armor Trader Radia:<br>
Welcome back! What did Varan have to say for himself?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30088-06.html">"He apologized."</Button>
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
Well, it looks like I'll need to find a new supplier. Ralford is more reliable. He can get what I need. He's at the Ivory Tower in Oren. I'll let him know you're coming.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
Please get the ingredients from Ralford at the Ivory Tower.
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Armor Trader Radia:<br>
Excellent! Can I have them?<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30088-10.html">"Here you go."</Button>
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
You haven't heard from Ralford? I need spidersilk, 420 Armor Fragments (Low Grade) and 750 Accessory Gems (Low Grade). Please hurry.
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Armor Trader Radia:<br>
Yes, your fabric is ready! Let me get it for you.<br>
Here it is! Isn't it nice? You can really make something nice with this. Have a safe journey!
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Armor Trader Radia:<br>
Where are the ingredients? I can't make the cloth without them!
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Trader Ralford:<br>
Welcome! Radia told me you'd be coming. Are you here for the spidersilk, thread and suede? Sorry, we're all out! You can probably get some thread and suede from travelers, but as for the spidersilk, that's another matter! I can make some for you if you help me!<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30165-02.html">"I'll help you."</Button>
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Trader Ralford:<br>
In the Sea of Spores, there are spiders called Trisalim Spiders and Trisalim Tarantulas. Please bring me 10 Spinneret from them and I'll make spidersilk for you.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Trader Ralford:<br>
This isn't enough! I need more.
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Trader Ralford:<br>
Wonderful! Give me the Spinneret and I'll make spidersilk for you.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30165-05.html">"Here they are."</Button>
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Trader Ralford:<br>
Thank you. Please wait here.<br>
Here's the spidersilk you asked for. Radia asked for more than just this, however. It shouldn't be too hard for you... She needs 420 Armor Fragments (Low Grade) and 750 Accessory Gems (Low Grade)
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Trader Ralford:<br>
Radia needs spidersilk, 420 Armor Fragments (Low Grade) and 750 Accessory Gems (Low Grade). Please take it to her.
</body></html>

View File

@@ -1,4 +0,0 @@
<html><body>Trader Varan:<br>
Ah, you mean Radia's order? Well, I haven't gotten the materials yet. The goods she wants have been rather scarce of late, making them difficult to obtain.<br>
<Button ALIGN=LEFT ICON="NORMAL" action="bypass -h Quest Q00034_InSearchOfCloth 30294-02.html">When can I get it then?</Button>
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Trader Varan:<br>
Tell her I'm sorry I couldn't fill the order on time, and that I accept responsibility for the breach of Contract.
</body></html>

View File

@@ -1,3 +0,0 @@
<html><body>Trader Varan:<br>
Please tell Radia that I won't make a mistake like this again.
</body></html>

View File

@@ -1,256 +0,0 @@
/*
* 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 quests.Q00034_InSearchOfCloth;
import com.l2jmobius.gameserver.enums.QuestSound;
import com.l2jmobius.gameserver.model.actor.L2Npc;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.quest.Quest;
import com.l2jmobius.gameserver.model.quest.QuestState;
import com.l2jmobius.gameserver.model.quest.State;
/**
* In Search of Cloth (34)
* @author malyelfik
*/
public class Q00034_InSearchOfCloth extends Quest
{
// NPCs
private static final int RADIA = 30088;
private static final int RALFORD = 30165;
private static final int VARAN = 30294;
// Monsters
private static final int[] MOBS =
{
23307, // Corpse Spider
23308, // Explosive Spider
};
// Items
private static final int ARMOR_FRAGMENT = 36551;
private static final int ACCESSORY_GEM = 36556;
private static final int MYSTERIOUS_CLOTH = 7076;
private static final int SKEIN_OF_YARN = 7161;
private static final int SPINNERET = 7528;
// Misc
private static final int MIN_LEVEL = 85;
private static final int SPINNERET_COUNT = 10;
private static final int ARMOR_FRAGMENT_COUNT = 420;
private static final int ACCESSORY_GEM_COUNT = 750;
public Q00034_InSearchOfCloth()
{
super(34);
addStartNpc(RADIA);
addTalkId(RADIA, RALFORD, VARAN);
addKillId(MOBS);
registerQuestItems(SKEIN_OF_YARN, SPINNERET);
}
@Override
public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
{
final QuestState qs = getQuestState(player, false);
if (qs == null)
{
return null;
}
String htmltext = event;
switch (event)
{
case "30088-03.htm":
{
qs.startQuest();
break;
}
case "30294-02.html":
{
qs.setCond(2, true);
break;
}
case "30088-06.html":
{
qs.setCond(3, true);
break;
}
case "30165-02.html":
{
qs.setCond(4, true);
break;
}
case "30165-05.html":
{
if (getQuestItemsCount(player, SPINNERET) < SPINNERET_COUNT)
{
return getNoQuestMsg(player);
}
takeItems(player, SPINNERET, SPINNERET_COUNT);
giveItems(player, SKEIN_OF_YARN, 1);
qs.setCond(6, true);
break;
}
case "30088-10.html":
{
if ((getQuestItemsCount(player, ARMOR_FRAGMENT) >= ARMOR_FRAGMENT_COUNT) && (getQuestItemsCount(player, ACCESSORY_GEM) >= ACCESSORY_GEM_COUNT) && hasQuestItems(player, SKEIN_OF_YARN))
{
takeItems(player, SKEIN_OF_YARN, 1);
takeItems(player, ARMOR_FRAGMENT, ARMOR_FRAGMENT_COUNT);
takeItems(player, ACCESSORY_GEM, ACCESSORY_GEM_COUNT);
giveItems(player, MYSTERIOUS_CLOTH, 1);
qs.exitQuest(false, true);
}
else
{
htmltext = "30088-11.html";
}
break;
}
default:
{
htmltext = null;
break;
}
}
return htmltext;
}
@Override
public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
{
final L2PcInstance member = getRandomPartyMember(player, 4);
if ((member != null) && getRandomBoolean())
{
final QuestState qs = getQuestState(member, false);
giveItems(player, SPINNERET, 1);
if (getQuestItemsCount(player, SPINNERET) >= SPINNERET_COUNT)
{
qs.setCond(5, true);
}
else
{
playSound(player, QuestSound.ITEMSOUND_QUEST_ITEMGET);
}
}
return super.onKill(npc, player, isSummon);
}
@Override
public String onTalk(L2Npc npc, L2PcInstance player)
{
String htmltext = getNoQuestMsg(player);
final QuestState qs = getQuestState(player, true);
switch (npc.getId())
{
case RADIA:
{
switch (qs.getState())
{
case State.CREATED:
{
htmltext = (player.getLevel() >= MIN_LEVEL) ? "30088-01.htm" : "30088-02.html";
break;
}
case State.STARTED:
{
switch (qs.getCond())
{
case 1:
{
htmltext = "30088-04.html";
break;
}
case 2:
{
htmltext = "30088-05.html";
break;
}
case 3:
{
htmltext = "30088-07.html";
break;
}
case 6:
{
htmltext = ((getQuestItemsCount(player, ARMOR_FRAGMENT) >= ARMOR_FRAGMENT_COUNT) && (getQuestItemsCount(player, ACCESSORY_GEM) >= ACCESSORY_GEM_COUNT)) ? "30088-08.html" : "30088-09.html";
break;
}
}
break;
}
case State.COMPLETED:
{
htmltext = getAlreadyCompletedMsg(player);
break;
}
}
break;
}
case VARAN:
{
if (qs.isStarted())
{
switch (qs.getCond())
{
case 1:
{
htmltext = "30294-01.html";
break;
}
case 2:
{
htmltext = "30294-03.html";
break;
}
}
}
break;
}
case RALFORD:
{
if (qs.isStarted())
{
switch (qs.getCond())
{
case 3:
{
htmltext = "30165-01.html";
break;
}
case 4:
{
htmltext = "30165-03.html";
break;
}
case 5:
{
htmltext = "30165-04.html";
break;
}
case 6:
{
htmltext = "30165-06.html";
break;
}
}
}
break;
}
}
return htmltext;
}
}

View File

@@ -41,10 +41,6 @@ public final class Q00386_StolenDignity extends Quest
// Monsters
private static final int CRIMSON_DRAKE = 20670;
private static final int KADIOS = 20671;
private static final int PAST_CREATURE = 20967;
private static final int GIANT_SHADOW = 20969;
private static final int ANCIENTS_SOLDIER = 20970;
private static final int ANCIENTS_WARRIOR = 20971;
private static final int SPITEFUL_SOUL_LEADER = 20974;
private static final int SPITEFUL_SOUL_WIZARD = 20975;
private static final int ARCHER_OF_DESTRUCTIONS = 21001;
@@ -96,7 +92,7 @@ public final class Q00386_StolenDignity extends Quest
super(386);
addStartNpc(WAREHOUSE_KEEPER_ROMP);
addTalkId(WAREHOUSE_KEEPER_ROMP);
addKillId(CRIMSON_DRAKE, KADIOS, PAST_CREATURE, GIANT_SHADOW, ANCIENTS_SOLDIER, ANCIENTS_WARRIOR, SPITEFUL_SOUL_LEADER, SPITEFUL_SOUL_WIZARD, ARCHER_OF_DESTRUCTIONS, GRAVEYARD_LICH, GRAVEYARD_PREDATOR, FALLEN_ORC_SHAMAN, SHARP_TALON_TIGER, HAMES_ORC_SNIPER, HAMES_ORC_PREFECT);
addKillId(CRIMSON_DRAKE, KADIOS, SPITEFUL_SOUL_LEADER, SPITEFUL_SOUL_WIZARD, ARCHER_OF_DESTRUCTIONS, GRAVEYARD_LICH, GRAVEYARD_PREDATOR, FALLEN_ORC_SHAMAN, SHARP_TALON_TIGER, HAMES_ORC_SNIPER, HAMES_ORC_PREFECT);
}
@Override
@@ -681,38 +677,6 @@ public final class Q00386_StolenDignity extends Quest
}
break;
}
case PAST_CREATURE:
{
if (getRandom(1000) < 257)
{
giveItemRandomly(qs.getPlayer(), npc, Q_STOLEN_INF_ORE, 1, 0, 1, true);
}
break;
}
case GIANT_SHADOW:
{
if (getRandom(1000) < 205)
{
giveItemRandomly(qs.getPlayer(), npc, Q_STOLEN_INF_ORE, 1, 0, 1, true);
}
break;
}
case ANCIENTS_SOLDIER:
{
if (getRandom(1000) < 208)
{
giveItemRandomly(qs.getPlayer(), npc, Q_STOLEN_INF_ORE, 1, 0, 1, true);
}
break;
}
case ANCIENTS_WARRIOR:
{
if (getRandom(1000) < 299)
{
giveItemRandomly(qs.getPlayer(), npc, Q_STOLEN_INF_ORE, 1, 0, 1, true);
}
break;
}
case SPITEFUL_SOUL_LEADER:
{
if (getRandom(100) < 44)

View File

@@ -89,8 +89,6 @@ public final class Q00420_LittleWing extends Quest
23572, // Nymph Cosmos
23573, // Nymph Cosmos
23578, // Nymph Guardian
23579, // Buoyant Seed
23580, // Fluttering Seed
23581, // Apherus
23582, // Nymph Rose
};

View File

@@ -57,10 +57,6 @@ public final class Q00662_AGameOfCards extends Quest
MONSTERS.put(20959, 455); // Dark Guard
MONSTERS.put(20961, 365); // Bloody Knight
MONSTERS.put(20962, 348); // Bloody Priest
MONSTERS.put(20965, 457); // Chimera Piece
MONSTERS.put(20968, 418); // Forgotten Face
MONSTERS.put(20972, 350); // Shaman of Ancient Times
MONSTERS.put(20973, 453); // Forgotten Ancient People
MONSTERS.put(21002, 315); // Doom Scout
MONSTERS.put(21004, 320); // Dismal Pole
MONSTERS.put(21006, 335); // Doom Servant

View File

@@ -26,7 +26,6 @@ import quests.Q00017_LightAndDarkness.Q00017_LightAndDarkness;
import quests.Q00031_SecretBuriedInTheSwamp.Q00031_SecretBuriedInTheSwamp;
import quests.Q00032_AnObviousLie.Q00032_AnObviousLie;
import quests.Q00033_MakeAPairOfDressShoes.Q00033_MakeAPairOfDressShoes;
import quests.Q00034_InSearchOfCloth.Q00034_InSearchOfCloth;
import quests.Q00035_FindGlitteringJewelry.Q00035_FindGlitteringJewelry;
import quests.Q00036_MakeASewingKit.Q00036_MakeASewingKit;
import quests.Q00037_MakeFormalWear.Q00037_MakeFormalWear;
@@ -408,7 +407,6 @@ public class QuestMasterHandler
Q00031_SecretBuriedInTheSwamp.class,
Q00032_AnObviousLie.class,
Q00033_MakeAPairOfDressShoes.class,
Q00034_InSearchOfCloth.class,
Q00035_FindGlitteringJewelry.class,
Q00036_MakeASewingKit.class,
Q00037_MakeFormalWear.class,