ZURSULUS L2

Saga of Eva's Templar

ID
71
Название
Saga of Eva's Templar
start_npcs_json
[]
npc_ids_json
[]
constants_json
{}
Статус разбора
metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
Источник
game/data/scripts/quests/Q00071_SagaOfEvasTemplar/Q00071_SagaOfEvasTemplar.java

NPC квеста

Записей нет.

Условия уровней: выражения из Java

if (player.getLevel() < 76)
if (player.getLevel() < 76)
if (player.getLevel() >= 76)

Выдача предметов, адены и опыта: выражения из Java

giveItems(player, _items[10], 1);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1);
giveItems(player, _items[1], 1);
giveItems(player, _items[4], 1);
giveItems(player, _items[7], 1);
giveItems(player, _items[9], 1);
giveItems(player, _items[9], 1);
giveItems(player, _items[8], 1);
giveItems(player, _items[5], 1);
giveItems(player, _items[6], 1);
giveItems(player, _items[8], 1);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1); // XXX rewardItems?
giveItems(player, _items[3], getRandom(1, 4));

Квесты содержат динамические условия Java. Выражения выдачи включают промежуточные предметы, варианты и случайные награды; это не гарантированная награда. Константы приведены выше. Полные условия — в исходнике.

Тексты квеста

[0-01.htm] Master Sinden: When the Elder told me of a new guardian of the Mother Tree, I thought of you. I've seen a lot here in Aden. We should talk. Listen. [0-010.htm] Master Sinden: You haven't recovered yet. Come back later. (Only a character of level 76 or above is allowed to do a class transfer. Do not abandon quest before transfer is complete!) [0-02.htm] Master Sinden: This is too dangerous for you. Brother, don't be too proud! This pilgrimage is the path of legend. No one knows the danger that lies ahead. Come see me when you are better prepared! (This quest may only be undertaken by a Temple Knight of level 76 or above.) [0-03.htm] Master Sinden: This journey may uncover some shameful parts of our Elven history. Read the legend in this book about the guardian of the Mother Tree who vowed to stop this pilgrimage. He felt an Elf should always protect the Mother tree and only help other Elves. Meet with Master Bronwyn, a former guardian. He went into seclusion after relinquishing the fight against Humans. [0-04.htm] Master Sinden: Meet with Master Bronwyn of Goddard Castle Town to begin the pilgrimage! [0-05.htm] Master Sinden: The highest honor amongst Elves is to be a guardian of the Mother Tree. However, we are destined to leave the Mother Tree eventually. You sense this as well since you've been fighting so long. Here many people gather and live preparing the future. We are saddened not to have your skills to protect the Mother Tree, but I feel you could better serve us by going on a pilgrimage that has long been forbidden. Will you do it? "Yes!" [0-06.htm] Master Sinden: Have you learned much? I can't easily forget our past. I understand my limitations. Let me help you to find the right path. "What should I do now?" [0-07.htm] Master Sinden: You're no longer an ordinary Elven Knight! The Mother Tree you're protecting symbolizes the world that produced the tree. You're also guarding that world. From now on, live your life according to what you feel is right. That is the will of Eva! [0-08.htm] Master Sinden: You're no longer an ordinary Elven Knight! The Mother Tree you're protecting symbolizes the world that produced the tree. You're also guarding that world. You need more experience! (Only a character of level 76 or above is allowed to transfer class. Don't abandon quest before completing transfer!) [0-09.htm] Master Sinden: You're no longer an ordinary Elven Knight! The Mother Tree you're protecting symbolizes the world that produced the tree. You're also guarding that world. From now on, live your life according to what you feel is right. That is the will of Eva! [1-01.htm] Chef Donath: What can I help you with? Ice of purity? What is that? What? You mean from the ancient Elven book of recipes? Oh, that! You must've been sent by Elven Master Bronwyn! "Yes, you're right." [1-02.htm] Chef Donath: You haven't obtained the ingredients yet? Without an ice crystal and the fish, I can't make the ice of purity! Ask Chef Jeremy about the ice crystal, and you'll have to look for the fat white fish on your own. [1-03.htm] Chef Donath: You brought the ice crystal and the fish? This fish is supposed to contain the water of the beginning. Thus, you can get the water which supposedly flowed from the Mother Tree at the beginning of time if you carefully distilled the juice of this fish. When we let it flow over this ice crystal... Watch him. [1-04.htm] Chef Donath: I already gave you the ice of purity. Isn't Master Bronwyn waiting for you? [1-05.htm] Chef Donath: Oh, I see. Once one had to go to the land of ice to obtain it. But now, it's possible to make it here. I can do it. First of all, bring me the legendary food material, ice crystal and a fat white fish. You can get the ice crystal from Chef Jeremy. He'll likely want something in return. Who knows? He may ask you to fight a yeti! [1-06.htm] Chef Donath: Here is the ice of purity made with the purest of water. Long ago, while seeking high quality water, I asked Master Bronwyn for advice. He taught me this method. First you must find the purest water. Since I couldn't find the ice crystal on my own, I put aside the information for later use. Now, return to Master Bronwyn. [10-01.htm] Tablet of Vision: You sense someone's presence as you approach. The seal that binds Panacea, the withered Mother Tree. We Elves brought this curse on ourselves. Could that actually be the tablet there? Patrol the area. [10-02.htm] Tablet of Vision: Suddenly, you're paralyzed! You can barely breathe! Order of Tetrarch, Mask of Guardian! Perished Elves of Light! [10-03.htm] Tablet of Vision: The tablet is still and dark. Have a talk with Kastian here. [10-04.htm] Tablet of Vision: You feel a presence as you approach the tablet. There's a disturbance going on somewhere. Best not to get involved. Wait and see what happens. [10-05.htm] Tablet of Vision: The Stone of Commune starts emitting light as you draw near the tablet. Commune with the Tablet of Vision. [10-06.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. It seems that I heard someone laughing. The man said. "One more hero you wanted is born here again." A lady with blue clothes answered. "No, he is just a baby who starts toddling. But, he won't be only under his mother's protection anymore" A goddess engraved on the way of pilgrimage like this: You are free beings. Yoke called Race, Negligence called Stability. The Elf that got hurt by betrayal,closed the door to the world and stopped breathing. The Mother Tree being rotten. A voice is heard from the head. Baby, you are now ready to help me. Then, go back to Aden and put an end to your pilgrimage. In my Temple, you will keep my honor. [10-07.htm] Tablet of Vision: Further communion with this tablet would be futile. Go back to Master Sinden of Aden Castle Town and put an end to your pilgrimage. [11-01.htm] Priest Cerenas: Are you the pilgrim that I've been expecting? I heard about a long-sealed Elven pilgrim being released recently, but I certainly didn't expect to meet him! You must be here for the Stone of Commune. If I remember correctly, you should be getting the location of the next stone from the Tablet of Vision, right? Sorry, but this one belongs to me and you can't have it! "Why not?" [11-02.htm] Priest Cerenas: If you enter the Imperial Tomb, or fight in the Shrine of the Loyal near the Wall of Argos, you will be able to meet the Archon or Inferiors of Halisha. You can get this stone if you defeat them. Do you understand? If you want this stone, you need to defeat Halisha's Inferiors or Archon. The Stone of Commune will let you know where the fifth tablet is. [11-03.htm] Priest Cerenas: This is the material that I use for my study. Because the power of Goddess Eva and other powers are swriling in the stone... And another reason is that this Stone of Commune is not impossible to get. Those who have this Stone of Commune are Demon Halisha's Inferiors. If you enter the Imperial Tomb, or fight in the Shrine of the Loyal near the Wall of Argos, you will be able to meet the Archon or Inferiors of Halisha. You can get this stone if you defeat them. Do you understand? If you want this stone, you need to defeat Halisha's Inferiors or Archon. The Stone of Commune will let you know where the fifth tablet is. [2-01.htm] Master Bronwyn: ... journey of the pilgrimage? Are you saying there is someone who still does that now? How surprising...! But, you can't leave for the journey of the pilgrimage now. I can't give you the blessing. Originally, I'm supposed to give back the stone of blessing to the one that is taking the journey, but I can't give it back to you now. Ask for the reason. [2-02.htm] Master Bronwyn: First I need some Pure Ice. Chef Donath in the hot springs area of Goddard Territory knows how to find some. [2-03.htm] Master Bronwyn: Pure Ice! I didn't know you could still get it. With this I can restore life to the stone of blessing! This pilgrimage started when the goddess Eva sent young Elves to explore and experience the outside world. Other guilds now use it as a test to find out who's the most capable. Now, you must visit the six tablets. The stone of blessing, or Stone of Commune, will lead you to the tablets. "What's a Stone of Commune?" [2-04.htm] Master Bronwyn: Pilgrim of goddess, you still have not finished the pilgrimage. Go to the first stone tablet in the South of Tower of Insolence [2-05.htm] Master Bronwyn: To restore life to the stone of blessing, I need the Pure Ice and the breath of the ancestors. I can get the latter, but the Pure Ice... Head north to the hot springs region of Goddard Territory and meet with Chef Donath, the best chef in the land. He can help you find some, if he's the best chef as rumor has it. Or...oh, never mind. That's impossible. Find him. It's your only hope. [2-06.htm] Master Bronwyn: Please wait. After I heat the Pure Ice and extract a drop, I can restore the stone of blessing. Now it contains the power of the goddess Eva. Find the first stone tablet south of the Tower of Insolence to begin your pilgrimage. While holding this stone, examine the tablet. The stone will take care of the rest. You're now a pilgrim of the goddess! May your path always be blessed. [3-01.htm] Master Sinden: Panacea speaks the truth. That's why I gave up and came back. We should no longer rely on the great history of our race to guide us. Take pride in your heritage, but also understand and accept other races. If you only think of yourself, you can't protect and guide others. "What about the Stone of Commune?" [3-02.htm] Master Sinden: The Ketra Orcs are in a territorial war with the Varka Silenos. You'll end up fighting against the Varka Silenos if you help the Ketra Orcs. You can always switch sides. Remember, by choosing to fight for one side, you're fighting against the other! It's your choice. Now go get the Divine Stone of Wisdom! [3-03.htm] Master Sinden: You choose to help the Varka Silenos in their territorial war with the Ketra Orcs? You can always switch sides. Remember though, by choosing to fight for one side, you are fighting against the other! Now go get the Divine Stone of Wisdom! [3-04.htm] Master Sinden: You can't win their trust with force, you have to earn it. Approach them patiently with a sincere heart. Return when you have the Divine Stone of Wisdom! [3-05.htm] Master Sinden: The Divine Stone of Wisdom! Panacea said entrusting the lesser Orcs with the key of binding would end up helping our enemies! Should we have acted differently? ...... [3-06.htm] Master Sinden: Go to the fourth tablet in the north of the Varka Silenos Camp. Your travel of the pilgrimage hasn't finished yet. [3-07.htm] Master Sinden: Panacea had a fight with his younger brother, Kastien, who felt it wasn't right to stop the pilgrimage since it was established by the goddess Eva. He gave me the Stone of Commune and sealed it so that only by helping other races could it be used. The key of binding was divided in two and given to the lesser Orcs and the Silenos, who founded the Ketra Orc and Varka Silenos tribes. Which side will you get the key from? Ketra Orcs Varka Silenos [3-08.htm] Master Sinden: I learned from a preacher in the wasteland that I can communicate with lesser Orcs or Silenos. Living beings may have different goals but we all share the same origin! The Stone of Commune has been activated! Take it and go to the fourth tablet in the north of the Varka Silenos Camp. [4-01.htm] Starling Knight Kastien: That's the darkness we Elves bear from our negligence! It allowed the Humans to betray us. Brother, we must succeed for the sake of our future! [4-010.htm] Starling Knight Kastien: The pride that comes from leading all the races. Elves had to hold a vision for the future. That's why the goddess Eva created this pilgrimage. The betrayal caused us to separate ourselves from others, but we can't go on this way. Use this stone to commune with the tablet. Then you'll know what the goddess wanted. Good luck, maybe we'll meet again. "Thanks for the stone." [4-011.htm] Starling Knight Kastien: The pride that comes from leading all the races. Elves had to hold a vision for the future. That's why the goddess Eva created this pilgrimage. The betrayal caused us to separate ourselves from others, but we can't go on this way. Use this stone to commune with the tablet. Then you'll know what the goddess wanted. [4-02.htm] Starling Knight Kastien: Stand back! This isn't your fight! [4-03.htm] Starling Knight Kastien: I missed again! I can't do this alone, I need help. [4-04.htm] Starling Knight Kastien: Why are you hesitating? Raise your sword, Knight, and help break the chains that bind us to this darkness! Let's fight this together! [4-05.htm] Starling Knight Kastien: Can't you see I'm busy! Stand back! [4-06.htm] Starling Knight Kastien: The devil is defeated! My brother's chains are broken. That beast represented the wall we Elves built to hide our broken pride. After being betrayed, we had to separate ourselves from other races. That's not our true nature. As a Knight, you must understand about the true pride of the Elves. "True pride?" [4-07.htm] Starling Knight Kastien: The devil is defeated! My brother's chains are broken. That beast represented the wall we Elves built to hide our broken pride. After being betrayed, we had to separate ourselves from other races. That's not our true nature. As a Knight, you must understand about the true pride of the Elves. "True pride?" [4-08.htm] Starling Knight Kastien: You've already broken the chains. You don't need to join this fight. Find the answers you seek from the tablet! [4-09.htm] Starling Knight Kastien: I can't help you anymore. Find the answers you seek from the tablet! [5-01.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision. [5-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A female voice seems to float on by as if the wind were singing... You sense that the stone is being held by sword-clad guards in the southern Valley of the Saints. [5-03.htm] Tablet of Vision: Further communion with this tablet is futile. The next Stone of Commune is being held by the Guardians of Forbidden Knowledge in the southern Valley of the Saints. Kill them and take it! [6-01.htm] Tablet of Vision: Hieroglyphics are engraved on the tablet. The Stone of Commune for this tablet is being held by one of the Guardians of Forbidden Knowledge. [6-02.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision. [6-03.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You hear the faint whisper of a woman's voice. Suddenly the noble face of a heroic Elven warrior appears before you. Betrayed by Humans, and then seemingly the entire world, he closed his mind and sealed the Elven holy land! He is waiting at the next tablet, near the border to the Northern Post. [6-04.htm] Tablet of Vision: Communing further with this tablet would be futile. Now you must confront Soul Trap Elf Panacea. Prepare for battle! [7-01.htm] Tablet of Vision: As you near the Tablet of Vision, you sense a presence. It's a familiar one... Could it be the guardian of the Mother Tree? "I've read it." [7-02.htm] Tablet of Vision: I feel his cold sense of abandonment and betrayal. Do my thought deceive me? The anger and sense of loss are overwhelming! Who would so cruelly block the way of pilgrims for centuries? Can I defeat him? [7-03.htm] Tablet of Vision: The time has come to examine the Tablet of Vision. Panacea's attack continues! [7-04.htm] Tablet of Vision: You sense a disturbance near the tablet. The time hasn't yet come for you to prove yourself. [7-05.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision. [7-06.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You hear the faint whisper of a woman's voice. A vision appears of an indecisive Knight... He turned back because he was persuaded by Panacea. He looks unfamiliar but common. He is Master Sinden of Aden Castle Town. [7-07.htm] Tablet of Vision: Further communion with this tablet is futile. Get the next Stone of Commune from Elven Master Sinden at Sedrick's Training Hall in Aden Castle Town. [8-01.htm] Tablet of Vision: The Stone of Commune starts emitting light as you approach the Tablet of Vision. Commune with the Tablet of Vision. [8-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A vision appears of a mysterious black knight... An Elven Tetrarch holding the Stone of Commune, and a man in agony... Find the Elven Tetrarch Cerenas in Goddard Castle Town. [8-03.htm] Tablet of Vision: Fiddling with this tablet further is futile. Find the Priest Cerenas, Elven Tetrarch in Goddard Castle Town. [9-01.htm] Tablet of Vision: The tablet is still and dark. The Stone of Commune that can access this tablet can be found at the Wall of Argos or the Imperial Tomb. [9-02.htm] Tablet of Vision: The Stone of Commune starts emitting light as you approach the Tablet of Vision. Commune with the Tablet of Vision. [9-03.htm] Tablet of Vision: A sharp blast of knowlege courses through your cranium! A vision appears of a black knight! And there is your old comrade Panacea! What is that substance holding him?! Chains that have bound him! You sense a power that rejects change because of a desire for rest... You sense that weariness coming over you. The next Stone of Commune is in the northern Forsaken Plains! [9-04.htm] Tablet of Vision: You do not need this tablet anymore. The next Stone of Commune is at the northern part of the Prairie of Oblivion. Cannot forget the plight of my friend Panacea! What was it? It seems not only familiar, but thrilling.
Исходник условий и наград (Java)
/*
 * 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.Q00071_SagaOfEvasTemplar;

import quests.AbstractSagaQuest;

/**
 * @author Emperorc
 */
public class Q00071_SagaOfEvasTemplar extends AbstractSagaQuest
{
	public Q00071_SagaOfEvasTemplar()
	{
		super(71, "Saga of Eva's Templar");
		_npc = new int[]
		{
			30852,
			31624,
			31278,
			30852,
			31638,
			31646,
			31648,
			31651,
			31654,
			31655,
			31658,
			31281
		};
		_items = new int[]
		{
			7080,
			7535,
			7081,
			7486,
			7269,
			7300,
			7331,
			7362,
			7393,
			7424,
			7094,
			6482
		};
		_mob = new int[]
		{
			27287,
			27220,
			27279
		};
		_classId = new int[]
		{
			99
		};
		_prevClass = new int[]
		{
			0x14
		};
		_x = new int[]
		{
			119518,
			181215,
			181227
		};
		_y = new int[]
		{
			-28658,
			36676,
			36703
		};
		_z = new int[]
		{
			-3811,
			-4812,
			-4816
		};
		_text = new String[]
		{
			"PLAYERNAME! Pursued to here! However, I jumped out of the Banshouren boundaries! You look at the giant as the sign of power!",
			"... Oh ... good! So it was ... let's begin!",
			"I do not have the patience ..! I have been a giant force ...! Cough chatter ah ah ah!",
			"Paying homage to those who disrupt the orderly will be PLAYERNAME's death!",
			"Now, my soul freed from the shackles of the millennium, Halixia, to the back side I come ...",
			"Why do you interfere others' battles?",
			"This is a waste of time.. Say goodbye...!",
			"...That is the enemy",
			"...Goodness! PLAYERNAME you are still looking?",
			"PLAYERNAME ... Not just to whom the victory. Only personnel involved in the fighting are eligible to share in the victory.",
			"Your sword is not an ornament. Don't you think, PLAYERNAME?",
			"Goodness! I no longer sense a battle there now.",
			"let...",
			"Only engaged in the battle to bar their choice. Perhaps you should regret.",
			"The human nation was foolish to try and fight a giant's strength.",
			"Must...Retreat... Too...Strong.",
			"PLAYERNAME. Defeat...by...retaining...and...Mo...Hacker",
			"....! Fight...Defeat...It...Fight...Defeat...It..."
		};
		registerNPCs();
	}
}


// Shared quest dependency: AbstractSagaQuest.java
/*
 * Copyright (c) 2013 L2jMobius
 * 
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
 * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
package quests;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.l2jmobius.gameserver.config.PlayerConfig;
import org.l2jmobius.gameserver.entity.World;
import org.l2jmobius.gameserver.entity.WorldObject;
import org.l2jmobius.gameserver.entity.actor.Creature;
import org.l2jmobius.gameserver.entity.actor.Npc;
import org.l2jmobius.gameserver.entity.actor.Player;
import org.l2jmobius.gameserver.entity.groups.Party;
import org.l2jmobius.gameserver.mechanics.script.Quest;
import org.l2jmobius.gameserver.mechanics.script.QuestState;
import org.l2jmobius.gameserver.mechanics.skill.Skill;
import org.l2jmobius.gameserver.network.enums.ChatType;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.network.serverpackets.NpcSay;

public abstract class AbstractSagaQuest extends Quest
{
	protected int[] _npc = {};
	protected int[] _items = {};
	protected int[] _mob = {};
	protected int[] _classId = {};
	protected int[] _prevClass = {};
	protected int[] _x = {};
	protected int[] _y = {};
	protected int[] _z = {};
	protected String[] _text = {};
	private static final Map<Npc, Integer> SPAWN_LIST = new HashMap<>();
	// @formatter:off
	private static final int[][] QUEST_CLASSES =
	{
		{ 0x7f }, { 0x80, 0x81 }, { 0x82 }, { 0x05 }, { 0x14 }, { 0x15 },
		{ 0x02 }, { 0x03 }, { 0x2e }, { 0x30 }, { 0x33 }, { 0x34 }, { 0x08 },
		{ 0x17 }, { 0x24 }, { 0x09 }, { 0x18 }, { 0x25 }, { 0x10 }, { 0x11 },
		{ 0x1e }, { 0x0c }, { 0x1b }, { 0x28 }, { 0x0e }, { 0x1c }, { 0x29 },
		{ 0x0d }, { 0x06 }, { 0x22 }, { 0x21 }, { 0x2b }, { 0x37 }, { 0x39 }
	};
	// @formatter:on
	private static final int[] ARCHON_HALISHA_NORM =
	{
		18212,
		18214,
		18215,
		18216,
		18218
	};
	
	public AbstractSagaQuest(int questId, String description)
	{
		super(questId, description);
	}
	
	public void registerNPCs()
	{
		addStartNpc(_npc[0]);
		addAttackId(_mob[2]);
		addAttackId(_mob[1]);
		addSkillSeeId(_mob[1]);
		addFirstTalkId(_npc[4]);
		addTalkId(_npc);
		addKillId(_mob);
		final int[] questItemIds = _items.clone();
		questItemIds[0] = 0;
		questItemIds[2] = 0; // remove Ice Crystal and Divine Stone of Wisdom
		registerQuestItems(questItemIds);
		for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
		{
			addKillId(archonMinion);
		}
		
		addKillId(ARCHON_HALISHA_NORM);
		for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
		{
			addKillId(guardianAngel);
		}
	}
	
	@Override
	public String onEvent(String event, Npc npc, Player player)
	{
		final QuestState st = getQuestState(player, false);
		if (st == null)
		{
			return null;
		}
		
		String htmltext = null;
		switch (event)
		{
			case "0-011.htm":
			case "0-012.htm":
			case "0-013.htm":
			case "0-014.htm":
			case "0-015.htm":
			{
				htmltext = event;
				break;
			}
			case "accept":
			{
				st.startQuest();
				giveItems(player, _items[10], 1);
				htmltext = "0-03.htm";
				break;
			}
			case "0-1":
			{
				if (player.getLevel() < 76)
				{
					htmltext = "0-02.htm";
					if (st.isCreated())
					{
						st.exitQuest(true);
					}
				}
				else
				{
					htmltext = "0-05.htm";
				}
				break;
			}
			case "0-2":
			{
				if (player.getLevel() < 76)
				{
					takeItems(player, _items[10], -1);
					st.setCond(20, true);
					htmltext = "0-08.htm";
				}
				else
				{
					takeItems(player, _items[10], -1);
					addExpAndSp(player, 2299404, 0);
					giveAdena(player, 5000000, true);
					giveItems(player, 6622, 1);
					final int playerClass = getPlayerClass(player);
					final int prevClass = getPrevClass(player);
					player.setPlayerClass(playerClass);
					if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
					{
						player.setBaseClass(playerClass);
					}
					
					player.broadcastUserInfo();
					cast(npc, player, 4339, 1);
					st.exitQuest(false);
					htmltext = "0-07.htm";
				}
				break;
			}
			case "1-3":
			{
				st.setCond(3);
				htmltext = "1-05.htm";
				break;
			}
			case "1-4":
			{
				st.setCond(4);
				takeItems(player, _items[0], 1);
				if (_items[11] != 0)
				{
					takeItems(player, _items[11], 1);
				}
				
				giveItems(player, _items[1], 1);
				htmltext = "1-06.htm";
				break;
			}
			case "2-1":
			{
				st.setCond(2);
				htmltext = "2-05.htm";
				break;
			}
			case "2-2":
			{
				st.setCond(5);
				takeItems(player, _items[1], 1);
				giveItems(player, _items[4], 1);
				htmltext = "2-06.htm";
				break;
			}
			case "3-5":
			{
				htmltext = "3-07.htm";
				break;
			}
			case "3-6":
			{
				st.setCond(11);
				htmltext = "3-02.htm";
				break;
			}
			case "3-7":
			{
				st.setCond(12);
				htmltext = "3-03.htm";
				break;
			}
			case "3-8":
			{
				st.setCond(13);
				takeItems(player, _items[2], 1);
				giveItems(player, _items[7], 1);
				htmltext = "3-08.htm";
				break;
			}
			case "4-1":
			{
				htmltext = "4-010.htm";
				break;
			}
			case "4-2":
			{
				giveItems(player, _items[9], 1);
				st.setCond(18, true);
				htmltext = "4-011.htm";
				break;
			}
			case "4-3":
			{
				giveItems(player, _items[9], 1);
				st.setCond(18, true);
				autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "0");
				cancelQuestTimer("Mob_2 has despawned", npc, player);
				deleteSpawn(npc);
				return null;
			}
			case "5-1":
			{
				st.setCond(6, true);
				takeItems(player, _items[4], 1);
				cast(npc, player, 4546, 1);
				htmltext = "5-02.htm";
				break;
			}
			case "6-1":
			{
				st.setCond(8, true);
				st.set("spawned", "0");
				takeItems(player, _items[5], 1);
				cast(npc, player, 4546, 1);
				htmltext = "6-03.htm";
				break;
			}
			case "7-1":
			{
				if (st.getInt("spawned") == 1)
				{
					htmltext = "7-03.htm";
				}
				else if (st.getInt("spawned") == 0)
				{
					final Npc mob1 = addSpawn(_mob[0], _x[0], _y[0], _z[0], -1);
					st.set("spawned", "1");
					startQuestTimer("Mob_1 Timer 1", 500, mob1, player);
					startQuestTimer("Mob_1 has despawned", 300000, mob1, player);
					addSpawn(st, mob1);
					htmltext = "7-02.htm";
				}
				else
				{
					htmltext = "7-04.htm";
				}
				break;
			}
			case "7-2":
			{
				st.setCond(10, true);
				takeItems(player, _items[6], 1);
				cast(npc, player, 4546, 1);
				htmltext = "7-06.htm";
				break;
			}
			case "8-1":
			{
				st.setCond(14, true);
				takeItems(player, _items[7], 1);
				cast(npc, player, 4546, 1);
				htmltext = "8-02.htm";
				break;
			}
			case "9-1":
			{
				st.setCond(17, true);
				st.set("Quest0", "0");
				st.set("Tab", "0");
				takeItems(player, _items[8], 1);
				cast(npc, player, 4546, 1);
				htmltext = "9-03.htm";
				break;
			}
			case "10-1":
			{
				if (st.getInt("Quest0") == 0)
				{
					final Npc mob3 = addSpawn(_mob[2], _x[1], _y[1], _z[1], -1);
					final Npc mob2 = addSpawn(_npc[4], _x[2], _y[2], _z[2], -1);
					addSpawn(st, mob3);
					addSpawn(st, mob2);
					st.set("Mob_2", String.valueOf(mob2.getObjectId()));
					st.set("Quest0", "1");
					st.set("Quest1", "45");
					startQuestTimer("Mob_3 Timer 1", 500, mob3, player, true);
					startQuestTimer("Mob_3 has despawned", 59000, mob3, player);
					startQuestTimer("Mob_2 Timer 1", 500, mob2, player);
					startQuestTimer("Mob_2 has despawned", 60000, mob2, player);
					htmltext = "10-02.htm";
				}
				else if (st.getInt("Quest1") == 45)
				{
					htmltext = "10-03.htm";
				}
				else
				{
					htmltext = "10-04.htm";
				}
				break;
			}
			case "10-2":
			{
				st.setCond(19, true);
				takeItems(player, _items[9], 1);
				cast(npc, player, 4546, 1);
				htmltext = "10-06.htm";
				break;
			}
			case "11-9":
			{
				st.setCond(15);
				htmltext = "11-03.htm";
				break;
			}
			case "Mob_1 Timer 1":
			{
				autoChat(npc, _text[0].replace("PLAYERNAME", player.getName()));
				return null;
			}
			case "Mob_1 has despawned":
			{
				autoChat(npc, _text[1].replace("PLAYERNAME", player.getName()));
				st.set("spawned", "0");
				deleteSpawn(npc);
				return null;
			}
			case "Archon Hellisha has despawned":
			{
				autoChat(npc, _text[6].replace("PLAYERNAME", player.getName()));
				st.set("spawned", "0");
				deleteSpawn(npc);
				return null;
			}
			case "Mob_3 Timer 1":
			{
				final Npc mob2 = findSpawn(player, World.findObject(st.getInt("Mob_2")).asNpc());
				if ((World.getFirstVisibleObject(npc, Npc.class, it -> it == mob2) != null))
				{
					npc.asAttackable().addDamageHate(mob2, 0, 99999);
					npc.getAI().setIntentionAttack(mob2);
					mob2.getAI().setIntentionAttack(npc);
					autoChat(npc, _text[14].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Mob_3 Timer 1", npc, player);
				}
				
				return null;
			}
			case "Mob_3 has despawned":
			{
				autoChat(npc, _text[15].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "2");
				deleteSpawn(npc);
				return null;
			}
			case "Mob_2 Timer 1":
			{
				autoChat(npc, _text[7].replace("PLAYERNAME", player.getName()));
				startQuestTimer("Mob_2 Timer 2", 1500, npc, player);
				if (st.getInt("Quest1") == 45)
				{
					st.set("Quest1", "0");
				}
				
				return null;
			}
			case "Mob_2 Timer 2":
			{
				autoChat(npc, _text[8].replace("PLAYERNAME", player.getName()));
				startQuestTimer("Mob_2 Timer 3", 10000, npc, player);
				return null;
			}
			case "Mob_2 Timer 3":
			{
				if (st.getInt("Quest0") == 0)
				{
					startQuestTimer("Mob_2 Timer 3", 13000, npc, player);
					if (getRandomBoolean())
					{
						autoChat(npc, _text[9].replace("PLAYERNAME", player.getName()));
					}
					else
					{
						autoChat(npc, _text[10].replace("PLAYERNAME", player.getName()));
					}
				}
				
				return null;
			}
			case "Mob_2 has despawned":
			{
				st.set("Quest1", String.valueOf(st.getInt("Quest1") + 1));
				if ((st.getInt("Quest0") == 1) || (st.getInt("Quest0") == 2) || (st.getInt("Quest1") > 3))
				{
					st.set("Quest0", "0");
					
					// TODO: This "if" will never be true.
					if (st.getInt("Quest0") == 1)
					{
						autoChat(npc, _text[11].replace("PLAYERNAME", player.getName()));
					}
					else
					{
						autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
					}
					
					deleteSpawn(npc);
				}
				else
				{
					startQuestTimer("Mob_2 has despawned", 1000, npc, player);
				}
				
				return null;
			}
		}
		
		return htmltext;
	}
	
	@Override
	public void onAttack(Npc npc, Player player, int damage, boolean isSummon)
	{
		final QuestState st2 = findRightState(npc);
		if (st2 != null)
		{
			final int cond = st2.getCond();
			final QuestState st = getQuestState(player, false);
			final int npcId = npc.getId();
			if ((npcId == _mob[2]) && (st == st2) && (cond == 17))
			{
				int quest0 = st.getInt("Quest0") + 1;
				if (quest0 == 1)
				{
					autoChat(npc, _text[16].replace("PLAYERNAME", player.getName()));
				}
				
				if (quest0 > 15)
				{
					quest0 = 1;
					autoChat(npc, _text[17].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Mob_3 has despawned", npc, st2.getPlayer());
					st.set("Tab", "1");
					deleteSpawn(npc);
				}
				
				st.set("Quest0", Integer.toString(quest0));
			}
			else if ((npcId == _mob[1]) && (cond == 15) && ((st != st2) || player.isInParty()))
			{
				autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
				cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
				st2.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
	}
	
	@Override
	public String onFirstTalk(Npc npc, Player player)
	{
		String htmltext = "";
		final QuestState st = getQuestState(player, false);
		final int npcId = npc.getId();
		if ((st != null) && (npcId == _npc[4]))
		{
			final int cond = st.getCond();
			if (cond == 17)
			{
				final QuestState st2 = findRightState(npc);
				if (st2 != null)
				{
					player.setLastQuestNpcObject(npc.getObjectId());
					final int tab = st.getInt("Tab");
					final int quest0 = st.getInt("Quest0");
					if (st == st2)
					{
						if (tab == 1)
						{
							if (quest0 == 0)
							{
								htmltext = "4-04.htm";
							}
							else if (quest0 == 1)
							{
								htmltext = "4-06.htm";
							}
						}
						else if (quest0 == 0)
						{
							htmltext = "4-01.htm";
						}
						else if (quest0 == 1)
						{
							htmltext = "4-03.htm";
						}
					}
					else if (tab == 1)
					{
						if (quest0 == 0)
						{
							htmltext = "4-05.htm";
						}
						else if (quest0 == 1)
						{
							htmltext = "4-07.htm";
						}
					}
					else if (quest0 == 0)
					{
						htmltext = "4-02.htm";
					}
				}
			}
			else if (cond == 18)
			{
				htmltext = "4-08.htm";
			}
		}
		
		if (htmltext.isEmpty())
		{
			npc.showChatWindow(player);
		}
		
		return htmltext;
	}
	
	@Override
	public void onKill(Npc npc, Player player, boolean isSummon)
	{
		final int npcId = npc.getId();
		QuestState st = getQuestState(player, false);
		for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
		{
			if (npcId == archonMinion)
			{
				final Party party = player.getParty();
				if (party != null)
				{
					final List<QuestState> partyQuestMembers = new ArrayList<>();
					for (Player player1 : party.getMembers())
					{
						final QuestState st1 = findQuest(player1);
						if ((st1 != null) && st1.isCond(15) && player1.isInsideRadius2D(player, PlayerConfig.ALT_PARTY_RANGE))
						{
							partyQuestMembers.add(st1);
						}
					}
					
					if (!partyQuestMembers.isEmpty())
					{
						final QuestState st2 = partyQuestMembers.get(getRandom(partyQuestMembers.size()));
						giveHalishaMark(st2);
					}
				}
				else
				{
					final QuestState st1 = findQuest(player);
					if ((st1 != null) && st1.isCond(15))
					{
						giveHalishaMark(st1);
					}
				}
				return;
			}
		}
		
		for (int element : ARCHON_HALISHA_NORM)
		{
			if (npcId == element)
			{
				final QuestState st1 = findQuest(player);
				if ((st1 != null) && st1.isCond(15))
				{
					// This is just a guess....not really sure what it actually says, if anything
					autoChat(npc, _text[4].replace("PLAYERNAME", st1.getPlayer().getName()));
					giveItems(player, _items[8], 1);
					takeItems(player, _items[3], -1);
					st1.setCond(16, true);
				}
				return;
			}
		}
		
		for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
		{
			if (npcId == guardianAngel)
			{
				final QuestState st1 = findQuest(player);
				if ((st1 != null) && st1.isCond(6))
				{
					final int kills = st1.getInt("kills");
					if (kills < 9)
					{
						st1.set("kills", Integer.toString(kills + 1));
					}
					else
					{
						giveItems(player, _items[5], 1);
						st.setCond(7, true);
					}
				}
				return;
			}
		}
		
		if ((st != null) && (npcId != _mob[2]))
		{
			final QuestState st2 = findRightState(npc);
			if (st2 != null)
			{
				final int cond = st.getCond();
				if ((npcId == _mob[0]) && (cond == 8))
				{
					if (!player.isInParty() && (st == st2))
					{
						autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
						giveItems(player, _items[6], 1);
						st.setCond(9, true);
					}
					
					cancelQuestTimer("Mob_1 has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
				else if ((npcId == _mob[1]) && (cond == 15))
				{
					if (!player.isInParty())
					{
						if (st == st2)
						{
							autoChat(npc, _text[4].replace("PLAYERNAME", player.getName()));
							giveItems(player, _items[8], 1);
							takeItems(player, _items[3], -1);
							st.setCond(16, true);
						}
						else
						{
							autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
						}
					}
					
					cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
			}
		}
		else if (npcId == _mob[0])
		{
			st = findRightState(npc);
			if (st != null)
			{
				cancelQuestTimer("Mob_1 has despawned", npc, st.getPlayer());
				st.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
		else if (npcId == _mob[1])
		{
			st = findRightState(npc);
			if (st != null)
			{
				cancelQuestTimer("Archon Hellisha has despawned", npc, st.getPlayer());
				st.set("spawned", "0");
				deleteSpawn(npc);
			}
		}
		else if (npcId == _mob[2])
		{
			st = findRightState(npc);
			if (st != null)
			{
				st.setCond(18, true);
				autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
				st.set("Quest0", "0");
				cancelQuestTimer("Mob_2 has despawned", npc, player);
				deleteSpawn(npc);
			}
		}
	}
	
	@Override
	public void onSkillSee(Npc npc, Player player, Skill skill, List<WorldObject> targets, boolean isSummon)
	{
		if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) != player.getObjectId()))
		{
			final Player questPlayer = World.findObject(SPAWN_LIST.get(npc)).asPlayer();
			if (questPlayer == null)
			{
				return;
			}
			
			for (WorldObject obj : targets)
			{
				if ((obj == questPlayer) || (obj == npc))
				{
					final QuestState st2 = findRightState(npc);
					if (st2 == null)
					{
						return;
					}
					
					autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
					cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
					st2.set("spawned", "0");
					deleteSpawn(npc);
				}
			}
		}
	}
	
	@Override
	public String onTalk(Npc npc, Player player)
	{
		final QuestState st = getQuestState(player, true);
		String htmltext = getNoQuestMsg(player);
		final int npcId = npc.getId();
		if ((npcId == _npc[0]) && st.isCompleted())
		{
			htmltext = getAlreadyCompletedMsg(player);
		}
		else if (player.getPlayerClass().getId() == getPrevClass(player))
		{
			switch (st.getCond())
			{
				case 0:
				{
					if (npcId == _npc[0])
					{
						htmltext = "0-01.htm";
					}
					break;
				}
				case 1:
				{
					if (npcId == _npc[0])
					{
						htmltext = "0-04.htm";
					}
					else if (npcId == _npc[2])
					{
						htmltext = "2-01.htm";
					}
					break;
				}
				case 2:
				{
					if (npcId == _npc[2])
					{
						htmltext = "2-02.htm";
					}
					else if (npcId == _npc[1])
					{
						htmltext = "1-01.htm";
					}
					break;
				}
				case 3:
				{
					if ((npcId == _npc[1]) && hasQuestItems(player, _items[0]))
					{
						if ((_items[11] == 0) || hasQuestItems(player, _items[11]))
						{
							htmltext = "1-03.htm";
						}
						else
						{
							htmltext = "1-02.htm";
						}
					}
					break;
				}
				case 4:
				{
					if (npcId == _npc[1])
					{
						htmltext = "1-04.htm";
					}
					else if (npcId == _npc[2])
					{
						htmltext = "2-03.htm";
					}
					break;
				}
				case 5:
				{
					if (npcId == _npc[2])
					{
						htmltext = "2-04.htm";
					}
					else if (npcId == _npc[5])
					{
						htmltext = "5-01.htm";
					}
					break;
				}
				case 6:
				{
					if (npcId == _npc[5])
					{
						htmltext = "5-03.htm";
					}
					else if (npcId == _npc[6])
					{
						htmltext = "6-01.htm";
					}
					break;
				}
				case 7:
				{
					if (npcId == _npc[6])
					{
						htmltext = "6-02.htm";
					}
					break;
				}
				case 8:
				{
					if (npcId == _npc[6])
					{
						htmltext = "6-04.htm";
					}
					else if (npcId == _npc[7])
					{
						htmltext = "7-01.htm";
					}
					break;
				}
				case 9:
				{
					if (npcId == _npc[7])
					{
						htmltext = "7-05.htm";
					}
					break;
				}
				case 10:
				{
					if (npcId == _npc[7])
					{
						htmltext = "7-07.htm";
					}
					else if (npcId == _npc[3])
					{
						htmltext = "3-01.htm";
					}
					break;
				}
				case 11:
				case 12:
				{
					if (npcId == _npc[3])
					{
						if (hasQuestItems(player, _items[2]))
						{
							htmltext = "3-05.htm";
						}
						else
						{
							htmltext = "3-04.htm";
						}
					}
					break;
				}
				case 13:
				{
					if (npcId == _npc[3])
					{
						htmltext = "3-06.htm";
					}
					else if (npcId == _npc[8])
					{
						htmltext = "8-01.htm";
					}
					break;
				}
				case 14:
				{
					if (npcId == _npc[8])
					{
						htmltext = "8-03.htm";
					}
					else if (npcId == _npc[11])
					{
						htmltext = "11-01.htm";
					}
					break;
				}
				case 15:
				{
					if (npcId == _npc[11])
					{
						htmltext = "11-02.htm";
					}
					else if (npcId == _npc[9])
					{
						htmltext = "9-01.htm";
					}
					break;
				}
				case 16:
				{
					if (npcId == _npc[9])
					{
						htmltext = "9-02.htm";
					}
					break;
				}
				case 17:
				{
					if (npcId == _npc[9])
					{
						htmltext = "9-04.htm";
					}
					else if (npcId == _npc[10])
					{
						htmltext = "10-01.htm";
					}
					break;
				}
				case 18:
				{
					if (npcId == _npc[10])
					{
						htmltext = "10-05.htm";
					}
					break;
				}
				case 19:
				{
					if (npcId == _npc[10])
					{
						htmltext = "10-07.htm";
					}
					else if (npcId == _npc[0])
					{
						htmltext = "0-06.htm";
					}
					break;
				}
				case 20:
				{
					if (npcId == _npc[0])
					{
						if (player.getLevel() >= 76)
						{
							htmltext = "0-09.htm";
							
							st.exitQuest(false);
							addExpAndSp(player, 2299404, 0);
							giveAdena(player, 5000000, true);
							giveItems(player, 6622, 1); // XXX rewardItems?
							final int playerClass = getPlayerClass(player);
							final int prevClass = getPrevClass(player);
							player.setPlayerClass(playerClass);
							if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
							{
								player.setBaseClass(playerClass);
							}
							
							player.broadcastUserInfo();
							cast(npc, player, 4339, 1);
						}
						else
						{
							htmltext = "0-010.htm";
						}
					}
					break;
				}
			}
		}
		
		return htmltext;
	}
	
	private QuestState findQuest(Player player)
	{
		final QuestState st = getQuestState(player, false);
		if (st != null)
		{
			if (getId() == 68)
			{
				for (int q = 0; q < 2; q++)
				{
					if (player.getPlayerClass().getId() == QUEST_CLASSES[1][q])
					{
						return st;
					}
				}
			}
			else if (player.getPlayerClass().getId() == QUEST_CLASSES[getId() - 67][0])
			{
				return st;
			}
		}
		
		return null;
	}
	
	private void autoChat(Npc npc, String text)
	{
		npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), text));
	}
	
	private void cast(Npc npc, Creature target, int skillId, int level)
	{
		target.broadcastSkillPacket(new MagicSkillUse(target, target, skillId, level, 6000, 1), target);
		target.broadcastSkillPacket(new MagicSkillUse(npc, npc, skillId, level, 6000, 1), npc);
	}
	
	private void addSpawn(QuestState st, Npc mob)
	{
		SPAWN_LIST.put(mob, st.getPlayer().getObjectId());
	}
	
	private static Npc findSpawn(Player player, Npc npc)
	{
		if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) == player.getObjectId()))
		{
			return npc;
		}
		
		return null;
	}
	
	private void deleteSpawn(Npc npc)
	{
		if (SPAWN_LIST.remove(npc) != null)
		{
			npc.deleteMe();
		}
	}
	
	private QuestState findRightState(Npc npc)
	{
		Player player = null;
		QuestState st = null;
		final Integer spawned = SPAWN_LIST.get(npc);
		if (spawned != null)
		{
			player = World.getPlayer(spawned);
			if (player != null)
			{
				st = player.getQuestState(getName());
			}
		}
		
		return st;
	}
	
	private int getPlayerClass(Player player)
	{
		if (player.getPlayerClass().getId() == 0x81)
		{
			return _classId[1];
		}
		
		return _classId[0];
	}
	
	private int getPrevClass(Player player)
	{
		if (player.getPlayerClass().getId() == 0x81)
		{
			if (_prevClass.length == 1)
			{
				return -1;
			}
			
			return _prevClass[1];
		}
		
		return _prevClass[0];
	}
	
	private void giveHalishaMark(QuestState st)
	{
		if (st.getInt("spawned") == 0)
		{
			final Player player = st.getPlayer();
			if (getQuestItemsCount(player, _items[3]) >= 700)
			{
				takeItems(player, _items[3], 20);
				final int xx = st.getPlayer().getX();
				final int yy = st.getPlayer().getY();
				final int zz = st.getPlayer().getZ();
				final Npc archon = addSpawn(_mob[1], xx, yy, zz, -1);
				addSpawn(st, archon);
				st.set("spawned", "1");
				startQuestTimer("Archon Hellisha has despawned", 600000, archon, player);
				autoChat(archon, _text[13].replace("PLAYERNAME", st.getPlayer().getName()));
				archon.asAttackable().addDamageHate(st.getPlayer(), 0, 99999);
				archon.getAI().setIntentionAttack(st.getPlayer());
			}
			else
			{
				giveItems(player, _items[3], getRandom(1, 4));
			}
		}
	}
}