Removed non existent NPCs and related script adjustments.
This commit is contained in:
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Gatekeeper Ziggurat:<br>
|
||||
(A command channel needs at least %min% members to challenge Anakim.)
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Gatekeeper Ziggurat:<br>
|
||||
(A command channel members level must be %minlvl% - %maxlvl% to challenge Anakim.)
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Gatekeeper Ziggurat:<br>
|
||||
(A command channel needs at least %min% members to challenge Lilith.)
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Gatekeeper Ziggurat:<br>
|
||||
(A command channel members level must be %minlvl% - %maxlvl% to challenge Lilith.)
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Armor Trader Radia:<br>
|
||||
Please get the ingredients from Ralford at the Ivory Tower.
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Armor Trader Radia:<br>
|
||||
Where are the ingredients? I can't make the cloth without them!
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Trader Ralford:<br>
|
||||
This isn't enough! I need more.
|
||||
</body></html>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -1,3 +0,0 @@
|
||||
<html><body>Trader Varan:<br>
|
||||
Please tell Radia that I won't make a mistake like this again.
|
||||
</body></html>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user