ZURSULUS L2

Saga of the Hierophant

ID
86
Название
Saga of the Hierophant
start_npcs_json
[]
npc_ids_json
[]
constants_json
{}
Статус разбора
metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
Источник
game/data/scripts/quests/Q00086_SagaOfTheHierophant/Q00086_SagaOfTheHierophant.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] High Priest Hollint: I ask you, follower of the path of light... Have you ever heard of a Saint of Light? Or perhaps you've met one in person? Recently, a Saint of Light has reportedly been seen in Goddard Castle Town. This could be a hoax, like the one who appeared in Gludio... But this time, it seems different! "What's different?" [0-010.htm] High Priest Hollint: Your abilities currently do not exceed those typical of your class. I"ll promote you when the time is right. (Only a character of level 76 may transfer class. Don't abandon the quest before class transfer is complete!) [0-02.htm] High Priest Hollint: Follower of the path of light, I ask you... Have you ever reached your limit, and struggled to escape your fate? I'm afraid you still don't get it. Get some more training and come back. (This quest may only be undertaken by a Prophet of level 76 or above.) [0-03.htm] High Priest Hollint: I'm glad to hear that! Look for the Saint of Light in Goddard Castle Town. You can decide your own fate after that, but don't forget to come back and see me. I want to hear your opinion on these matters. Here's a book that I got from Franz, along with his information. It has information regarding a person who may try to interrupt your work. I hope you never run into him, but if you do, use the information in this book to deal with him. May the divine blessing of Einhasad be with you always... [0-04.htm] High Priest Hollint: Did you forget what you promised to do? Find the Saint of Light in Goddard Castle Town and find out from her what you need to do next. [0-05.htm] High Priest Hollint: You know Franz pretty well, don't you? He's personally vouched for the Saint of Light in Goddard Castle Town! He says that anybody who has reached their limit and desires a new fate should speak with her. I'll need to verify his information further, because it seems rather hastily scribbled down, but so far it seems reliable. I understand that you're also seeking a new path. Are you willing to take on a new mission? "I'll do it." [0-06.htm] High Priest Hollint: Your reputation is growing, and the saint has even acknowledged you! She says that you've obtained a new understanding after being blessed by Einhasad. Is that true? "I've gained a new understanding." [0-07.htm] High Priest Hollint: Congratulations on receiving the recognition of the Saint and a new understanding! Your faith and knowledge already surpasses that of a Prophet. Henceforth you shall be known as a Heirophant! May you spread your understanding to many people and guide them with care. [0-08.htm] High Priest Hollint: Congratulations on receiving the recognition of the saint and a new understanding. Your abilities currently do not exceed those typical of your class. I'll promote you when the time is right. (Only a character of level 76 may transfer class. Don't abandon the quest before class transfer is complete!) [0-09.htm] High Priest Hollint: Congratulations on receiving the recognition of the saint and a new understanding! Your faith and knowledge already surpass that of a Prophet. Henceforth you shall be known as a Hierophant! May you spread your understanding to many people and guide them. [1-01.htm] Chef Duncan: What can I do for you, priest of light? Saint Agnes sent you to me? Well come on in, then! How are things with Saint Agnes? Ah, yes, the starving people! She has a heart of gold, that one! I'll always do anything I can to help her. I'm glad you came! I'll need something to keep the food fresh on the trip back to her, however... "What do you need?" [1-02.htm] Chef Duncan: There's quite a bit of food here, and it's bound to spoil unless we have a way to preserve it. We'll need an ice crystal to keep it fresh. Chef Jeremy has them. You can go and ask him about them. [1-03.htm] Chef Duncan: You brought the ice crystals. I've already prepared all the food and packaged it to go. Now all I have to do is process it to keep it fresh. Give me an ice crystal now. "Here it is." [1-04.htm] Chef Duncan: Oh, you're still here. Although I processed the food so that it won't spoil quickly, it won't last forever! Take it to the Saint immediately, before it goes bad! [1-05.htm] Chef Duncan: Ice crystals are crystallizations of cold energy. Bring one to me, and I'll process the food so that it won't spoil on your journey. Chef Jeremy has the ice crystals. You must meet and help him. He is laboring to prepare a cooking contest. That way you will find the ice crystals. Please do it for me. [1-06.htm] Chef Duncan: To keep it cool, place the ice crystal here and seal it completely like this... Voila! It's done! Take it to the saint! Do you think it's enough food? It's not a pretty box, but I put my heart into it! I trust the saint will divide it fairly among all the people in the village. Please, give my best regards to Saint Agnes! [10-01.htm] Tablet of Vision: The tablet begins vibrating softly. The Stone of Commune must be nearby. Patrol the area. [10-02.htm] Tablet of Vision: You feel the vibration from the Stone of Commune as a powerful being appears. Someone prevents his approach! [10-03.htm] Tablet of Vision: Without the Stone of Commune, it's just a tablet. Find the man who prevented the creature from attacking you. [10-04.htm] Tablet of Vision: There's a fight. You'd better not get involved. [10-05.htm] Tablet of Vision: The stone vibrates as you approach. Touch the Stone of Commune to the Tablet of Vision. [10-06.htm] Tablet of Vision: Forbidden knowledge enters your mind, this time without pain. You now understand the forbidden strength and the resulting fate. You realize its grandness. Go and report to High Priest Holint of Oren Castle Town. [10-07.htm] Tablet of Vision: The tablet goes still and dark as if nothing had happened. Go to High Priest Hollint in Oren Castle Town and tell him what you've learned. [11-01.htm] Priest Bastian: Hello again! Isn't Agnes great? I don't know how I ever got along without her! Did you find that Stone of Commune useful? This time, a very important priest asked me to help you. "What did he say?" [11-02.htm] Priest Bastian: The Stone of Commune that you seek is in the possession of the Archon of Halisha! He resides inside the Four Sepulchers, but you must not pursue him there alone! Form a party with at least three other players before even attempting it! If you must pursue him alone, attack his minions at the Shrine of the Loyal. He will show himself to defend them when you've gathered 700 marks of Halisha. His minions include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights and Shrine Guards. The Tablet of Vision that you seek can be found between the Wall of Argos and Goddard. [11-03.htm] Priest Bastian: The Stone of Commune that you seek is in the possession of the Archon of Halisha! He resides inside the Four Sepulchers, but you must not pursue him there alone! Form a party with at least three other players before even attempting it! If you must pursue him alone, attack his minions at the Shrine of the Loyal. He will show himself to defend them when you've gathered 700 marks of Halisha. His minions include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights and Shrine Guards. The Tablet of Vision that you seek can be found between the Wall of Argos and Goddard. [2-01.htm] Saint of Light Agnes: I have heard of your undying passion as a Priest. Goddard Castle Town needs someone to help relieve the grief and suffering that is abundant here. The people have lost their hopes and dreams. Can you help me reignite their passions? "What can I do?" [2-02.htm] Saint of Light Agnes: Meet Duncan who is working in the hot springs area. He can help with the suffering caused by this famine. [2-03.htm] Saint of Light Agnes: The light shines brighter than ever in you, Priest. I gather your mission was a success. How is Duncan? May the blessing of light always be with him for this favor. "Here's the food you asked for." [2-04.htm] Saint of Light Agnes: I won't forget your kindness. Have you been to the Tablet of Vision south of the Tower of Insolence? I hope you find what you seek. [2-05.htm] Saint of Light Agnes: I wish to give light and hope to the people of this town, but they are blinded by hunger. Can you visit Duncan in the hot springs area and bring back some food? He has promised to help me. [2-06.htm] Saint of Light Agnes: I'll fill the granary with this generous gift. Thanks to your help, these people can walk the path of light once more. Now I can help you! A woman named Luna told me of how one can step beyond his own limitations. You remind me of her. Take this Stone of Commune to the Tablet of Vision, south of the Tower of Insolence. It will bring you new knowledge. [3-01.htm] Priest Bastian: Hello! I've been expecting you! Don't look so surprised! You're here for the Stone of Commune, aren't you? I got this one from Agnes a while back. Don't you wonder how she got it and why she gave it to me? If you knew her, you'd understand! While you were away, there was an accident in Goddard Castle Town. Agnes provided food for the townspeople, and after the accident, everyone, including myself, came to rely upon her. The stone you seek isn't perfect. When she gave me this one, she said she needed a more powerful one. "What do you need?" [3-02.htm] Priest Bastian: I'll let you know the location of Ketra's Messenger Wahkan in the Ketra Orc Camp. First of all, you must gain trust of Ketra's Messenger Wahkan, and keep on working hard until you get the Divine Stone of Wisdom from Soul Guide Asefa who is the highest-ranking shaman of Ketra Orcs. [3-03.htm] Priest Bastian: I'll let you know the location of Varka's Messenger Naran Ashanuk in the Varka Silenos Camp. First of all, you must gain trust of Varka's Messenger Naran Ashanuk, and keep on working hard until you get the Divine Stone of Wisdom from Soul Guide Udan Mardui who is the highest-ranking shaman of Varka Silenos. [3-04.htm] Priest Bastian: Did you get the Divine Stone of Wisdom? Find the 'Divine Stone of Wisdom' by winning the trust of Asefa, chief shaman of the Ketra Orcs, or Udan Mardui, chief shaman of the Varka Silenos. If that doesn't work, speak to Ketra's Messenger Wahkan or Varka's Messenger Naran Ashanuk. [3-05.htm] Priest Bastian: Wonderful! I didn't think you could do it so quickly in the middle of a war! Could I see the stone for a moment? I can create a Stone of Commune for you now if you wish. "Here it is." [3-06.htm] Priest Bastian: What are you still doing here? Our destiny approaches! The Stone of Commune is stronger than ever. Take it south of the Varka Silenos barracks. [3-07.htm] Priest Bastian: Each tribe has a chief shaman who also serves as a guide of dead souls. Asefa serves the Ketra Orcs and Udan Mardui serves the Varka Silenos. Each one possesses a Divine Stone of Wisdom. They are vaguely aware of its power, but have no idea how to use it. They actually give it away as a prize to whomever they consider the wisest of their respective tribes! You must gain their trust and get the stone. Bring it to me, and I'll combine it with the stone that Agnes gave me to create a Stone of Commune. The Ketra Orcs and the Varka Silenos are currently at war with each other, so you must choose which tribe to approach. "I'll approach the Ketra Orcs!" "I'll approach the Varka Silenos!" [3-08.htm] Priest Bastian: I'll just combine the two pieces like this... Voila! Now I'll give this to you as Agnes requested. May the holy light guide your path. The Tablet of Vision that you seek is located north of the Varka Silenos barracks. With luck, we'll meet again. [4-01.htm] Sunset Guide Luna: Why are you staring off into space? This is a fight to defeat darkness! Don't you have a stake in this? Do you think someone else will save you, like those pathetic priests in the temple? Snap out of it! Help us to conquer the forces of darkness! [4-010.htm] Sunset Guide Luna: It's good to know I have friends fighting alongside me. Stay true to the faith! By the way, this stone was protected by Fallen angel Tanakia! You were looking for it, right? Well, take it! I must be going now. I hope we meet again someday. "Wait!" [4-011.htm] Sunset Guide Luna: This is the stone that he dropped while running away from his last fight. You're qualified to possess its secrets. Now, I must be going. I hope we meet again someday. [4-02.htm] Sunset Guide Luna: I am invincible! Until the power of light defeats the darkness that fills the world! This isn't your fight. Stand back! [4-03.htm] Sunset Guide Luna: That filthy demon turned tail and ran... This fight isn't finished! I won't rest until the power of darkness is completely defeated! You'll certainly fight against him one day. Until that day, may the light protect you. [4-04.htm] Sunset Guide Luna: Don't stop! You have to finish this fight! You don't want the power of the darkness and corruption to cover the world again, do you? [4-05.htm] Sunset Guide Luna: I am invincible! Until the power of light defeats the darkness that fills the world! This isn't your fight. Stand back! [4-06.htm] Sunset Guide Luna: Nice work! The power of darkness won't disappear if you just sit praying in the temple. It must be destroyed! It's a pity that there are so many priests who don't recognize that simple truth! Even fallen angels can't neglect the power of those who have true belief, can they? "You're absolutely right!" [4-07.htm] Sunset Guide Luna: I didn't expect to be meeting you like this. That devil seems to last forever! I can't rest until he is completely destroyed. I have something for you. "What?" [4-08.htm] Sunset Guide Luna: This isn't your fight. Stand back! Don't you have the Stone of Commune? Use it to communicate with the Tablet of Vision. Hurry up, before Tanakia finds out! [4-09.htm] Sunset Guide Luna: Why are you still here? Do you still have the Stone of Commune that I gave you? Why haven't you communed with the tablet yet? [5-01.htm] Tablet of Vision: A rough tablet appears before you. It emits a faint hum similar to the Stone of Commune as you approach. Touch the Stone of Commune to the Tablet of Vision. [5-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. In a mesmerizing revelation you realize that this isn't the only Stone of Commune nor Tablet of Vision! The knowledge contained in these tablets could change the world! As the pain subsides, a strange vision appears before you. A creature with four white wings, flying above the Valley of Saints, is carrying the Stone of Commune! In a moment, the vision fades... The tablet goes still and dark, as if nothing had happened. Go to the south of the Valley of Saints and find the Tablet of Vision! [5-03.htm] Tablet of Vision: The tablet goes still and dark, as if nothing had happened. Go to the south of the Valley of Saints and find the next Stone of Commune! [6-01.htm] Tablet of Vision: You must have the Stone of Commune to access the Tablet of Vision. The Stone of Commune is held by a creature with four wings. [6-02.htm] Tablet of Vision: The unshaped tablet begins to shake and make noise as the Stone of Commune draws near. Touch the Tablet of Vision with the Stone of Commune. [6-03.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. The cascade of brief images is unintelligible at first... But then, the next tablet comes into view! It's northeast of the Ketra Orc Outpost! Someone nearby has the Stone of Commune! It looks like the legendary Naverius has it! And then the vision fades. You must go northeast of the Ketra Orc Outpost and get the Stone of Commune. [6-04.htm] Tablet of Vision: The tablet goes still and quiet, as if nothing had ever happened. Go to the northeast of the Ketra Orc Outpost and get the Stone of Commune. [7-01.htm] Tablet of Vision: The tablet begins to shake slightly. Someone is nearby! Examine the area carefully. [7-02.htm] Tablet of Vision: Suddenly, someone appears on the other side of the tablet. Could it be Naverius, the main character in the book I got from Hollint? [7-03.htm] Tablet of Vision: I must get the Stone of Commune away from Naverius! [7-04.htm] Tablet of Vision: There's a disturbance far from here. This isn't the time to get involved. [7-05.htm] Tablet of Vision: As I approach the tablet with the Stone of Commune, it starts to buzz. Touch the Stone of Commune to the Tablet of Vision. [7-06.htm] Tablet of Vision: Suddenly, huge amounts of knowledge are painfully seared into your brain. Some secrets of the tablet start to be revealed. Suddenly, the vision goes white... and emerging from within is a face... Could it be...? Bastian in the Goddard Castle Town? And then, just as suddenly, the vision vanishes and the commune is over. [7-07.htm] Tablet of Vision: The tablet goes still and quiet, as if nothing had ever happened. Visit Priest Bastian in Goddard Castle Town and get the Stone of Commune from him. [8-01.htm] Tablet of Vision: The Stone of Commune is vibrating so fiercely you fear it will shake itself to pieces. Take the Stone of Commune nearer to the Tablet of Vision. [8-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. . . As the pain fades, the communion comes to an end. But where is the next Stone of Commune? Bastian's last words were troubling.... Talk to him again soon! [8-03.htm] Tablet of Vision: The tablet goes still and dark as if nothing had happened. Talk to Bastian, maybe he'll have an idea where the next Stone of Commune might be! [9-01.htm] Tablet of Vision: As Bastian said, kill the Archon of Halisha at the Wall of Argos or the Shrine of the Loyal and take the stone from him! [9-02.htm] Tablet of Vision: The reaction doesn't seem as dramatic as before, but it appears to be working. Approach the Tablet of Vision with the Stone of Commune. [9-03.htm] Tablet of Vision: Countless thoughts beyond comprehension are again seared painfully into your brain. Now the words of Naverius make sense. I know where the next Tablet of Vision is! It's southeast of Hunters Village. Someone near the tablet has the Stone of Commune. It's hard to make out, but he seems to be riding something, and something else is bearing down on him from behind! And then the vision fades... [9-04.htm] Tablet of Vision: The tablet goes still and dark as if nothing had happened. Go and find the Stone of Commune southeast of Hunters Village.
Исходник условий и наград (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.Q00086_SagaOfTheHierophant;

import quests.AbstractSagaQuest;

/**
 * @author Emperorc
 */
public class Q00086_SagaOfTheHierophant extends AbstractSagaQuest
{
	public Q00086_SagaOfTheHierophant()
	{
		super(86, "Saga of the Hierophant");
		_npc = new int[]
		{
			30191,
			31626,
			31588,
			31280,
			31591,
			31646,
			31648,
			31652,
			31654,
			31655,
			31659,
			31280
		};
		_items = new int[]
		{
			7080,
			7523,
			7081,
			7501,
			7284,
			7315,
			7346,
			7377,
			7408,
			7439,
			7089,
			0
		};
		_mob = new int[]
		{
			27269,
			27235,
			27275
		};
		_classId = new int[]
		{
			98
		};
		_prevClass = new int[]
		{
			0x11
		};
		_x = new int[]
		{
			161719,
			124355,
			124376
		};
		_y = new int[]
		{
			-92823,
			82155,
			82127
		};
		_z = new int[]
		{
			-1893,
			-2803,
			-2796
		};
		_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));
			}
		}
	}
}