ZURSULUS L2

Saga of the Maestro

ID
100
Название
Saga of the Maestro
start_npcs_json
[]
npc_ids_json
[]
constants_json
{}
Статус разбора
metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
Источник
game/data/scripts/quests/Q00100_SagaOfTheMaestro/Q00100_SagaOfTheMaestro.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] Chief Golem Craftsman Telson: Our Black Anvil guild has watched you closely for a long time. We paid particular attention when you passed the cruel test of the three blacksmiths and were proclaimed an Artisan, and when you made seven Journeyman Rings and passed the guild's trial. Not long ago, we determined that you are a splendid Dwarf, with exceptional guts and acumen! I'd like to make you an official offer! One time only! Do you wish to challenge a test given to only the best Artisans? This is your chance to become a Maestro, the ultimate Artisan! "I'll do it." [0-010.htm] Chief Golem Craftsman Telson: You've learned the truths of absolute geometry, but you still haven't learned the most sacred truths! Your pilgrimage isn't done yet! Like food, knowledge must be digested to become truth. Have more experiences and then come back! (Only a character of level 76 or above can transfer to the Maestro class. Don't abandon the quest until class transfer is complete.) [0-02.htm] Chief Golem Craftsman Telson: The Black Anvil Guild has watched you closely for a long time. We paid particular attention when you passed the cruel test of the three blacksmiths and were proclaimed an Artisan, and when you made seven Journeyman Rings and passed the guild's trial. We've determined that you're a splendid Dwarf, with exceptional guts and acumen! I'd really like to offer you the chance to become a Maestro, the ultimate artisan, but you don't have enough experience yet. Keep up the hard work! (This quest may only be undertaken by a Warsmith of level 76 or above.) [0-03.htm] Chief Golem Craftsman Telson: He's probably in Goddard Castle Town by now. He, like his brother, tends to show up and disappear suddenly! So, I'm not quite sure. Yesterday he came running up to me and dropped this off. He asked me to give it to you. I skimmed through it, and it seems to be a report about a spirit that protects one of the six tablets. You should read it, since you'll have to face it eventually. Now, get going! Good luck! [0-04.htm] Chief Golem Craftsman Telson: You should meet Master Tobald first and ask him about the pilgrimage of tablets. He's probably in Goddard Castle Town by now. He, like his brother, tends to show up unexpectedly and then vanish just as suddenly... So, I'm not quite sure. You must read the report I gave you! You'll need to know what's in it! Get going now! Good luck! [0-05.htm] Chief Golem Craftsman Telson: To reach the level of Maestro, you must learn the basic truths of absolute geometry. No books or scrolls exist on the subject, so your path will not be an easy one. The knowledge is far from the domain of Dwarves, in the territory of the gods. The secret is supposedly written on six ancient tablets, hidden by the gods in secluded areas and protected by formidable monsters to prevent anyone from discovering the magic they contain. Once you learn all the knowledge specified in the six tablets, you'll become a Maestro, with the crystal structures of metals flowing through your fingertips! A Dwarf named Master Tobald left earlier to undertake the pilgrimage of the tablets. Do you know him? His brother is the famous Master Toma! He may be careless, it must run in his family, but his abilities are undeniable! Tobald can help you with various things regarding the pilgrimage of the tablets. Go and find him! "Where is he?" [0-06.htm] Chief Golem Craftsman Telson: Welcome back! Well, Master Tobald came by a few days ago and was talking about you! He said that you'd be coming by today, and here you are! How strange! Did you really finish the pilgrimage of tablets? You finished before Tobald! That's incredible! "Now what?" [0-07.htm] Chief Golem Craftsman Telson: You've learned the ultimate sacred truths of absolute geometry! My only role is to confer an appropriate title upon the person with the knowledge. On behalf of the Black Anvil Guild, I hereby grant you the title of Maestro! Congratulations! The birth of a new Maestro is a very happy occasion! I expect great things from you! Please do your best to become a model for all Dwarves! [0-08.htm] Chief Golem Craftsman Telson: You've learned the truths of absolute geometry, but you still haven't learned the most sacred truths! Your pilgrimage isn't done yet! Like food, knowledge must be digested to become truth. Have more experiences and then come back! (Only a character of level 76 or above can transfer to the Maestro class. Don't abandon the quest until class transfer is complete.) [0-09.htm] Chief Golem Craftsman Telson: You've learned the ultimate sacred truths of absolute geometry! My only role is to confer an appropriate title upon the person with the knowledge. On behalf of the Black Anvil guild, I hereby grant you the title of Maestro! Congratulations! The birth of a new Maestro is a very happy occasion! I expect great things from you! Please do your best to become a model for all Dwarves! [1-01.htm] Blueprint Seller Borodin: That's right! I've been asked to repair one of Master Tobald's inventions! What an honor! Master Toma's development of the spatial movement device was amazing, but a machine that lets you travel through time is something, isn't it? "I heard that you are having a problem making the repairs." [1-02.htm] Blueprint Seller Borodin: You're really narrow-minded, aren't you? Look! I must have ice crystals to repair Wilma #3! You'll find them in the hot springs area in the north part of Goddard. Chef Jeremy can tell you more. [1-03.htm] Blueprint Seller Borodin: Welcome back! You've brought the ice crystals that produce a temperature of absolute zero! I can fix the cooling system easily with these! I heard you killed Bumbalump! Is that true? Awesome! "Here you go." [1-04.htm] Blueprint Seller Borodin: Why are you back? I fixed the cooling system of Wilma #3 and gave it to you to take to Master Tobald! Get going! [1-05.htm] Blueprint Seller Borodin: Ha! I'm embarrassed to say, but that's what happened. Honestly, I need a very powerful coolant to repair such a huge cooling system... Could you please find some ice crystals for me? I've heard they reach a temperature of absolute zero! You can only find them in the hot springs area in the northern part of Goddard. Chef Jeremy will tell you where to find them if you help him find some soy sauce. [1-06.htm] Blueprint Seller Borodin: As you can see, the problem isn't my skill, only the shortage of raw materials! I fixed it, didn't I? Take it to Master Tobald now. Wilma #3 is working fine! I heard you were on the pilgrimage of the tablets. I didn't realize you were so important! Good luck! May you become as great a craftsman as Master Tobald himself! [10-01.htm] Tablet of Vision: You can feel the presence of the Stone of Commune near the tablet. You feel you can find out its exact location if you lay your hands on the tablet. Lay hands on the tablet. [10-02.htm] Tablet of Vision: As you are about to lay your hands on the tablet, you can feel something behind you. And a new creature that you haven't seen before appears... [10-03.htm] Tablet of Vision: You need the Stone of Commune to decipher the hieroglyphs on the tablet. Speak with Master Tobalt about the Stone of Commune. [10-04.htm] Tablet of Vision: Someone is already communing with the tablet. Try again later. [10-05.htm] Tablet of Vision: The tablet is inscribed with indecipherable hieroglyphs. The letters emit a dim light and the tablet seems to manifest strong magical powers. Use the Stone of Commune. [10-06.htm] Tablet of Vision: As you hold the Stone of Commune and concentrate on it, the tablet gets surrounded by bright light. You hear several hundred people simultaneously reading scriptures, and new knowledge starts to enter your mind. On one hand, you feel like you understand everything. On the other hand, you feel that you don't understand anything. You hear someone's low-pitched laughter. And you hear a man's voice. "You now have one more successor that you like." A blonde woman replies. "No, he's like a baby who just started walking. But he will no longer need his mother's protection..." All images disappear, and you start to recognize the surrounding environment. You are starting to understand the knowledge you have gained from the tablet little by little. The pilgrimage of the tablet seems to have ended. Return to Rune Castle Town and see Chief Golem Crafter Telson. [10-07.htm] Tablet of Vision: Nothing happens any more even when you lay your hands on the tablet. Now that you have finished your pilgrimage of the tablet, go back to Rune Castle Town and see Chief Golem Crafter Telson. [11-01.htm] Master Tobald: Who are you? What? You're on the pilgrimage of tablets as well, huh? Hmm! Did you feel this Stone of Commune that I found? I can't give it to you! You have no idea what I had to go through to get it! Don't look so pathetic, I'll tell you where to get another one. Go to the Imperial Tomb or the Wall of Argos. At the cemetery, you must enter the Four Sepulchers which is farthest inside. At the Wall of Argos, go to the Shrine of the Loyal at the northeastern end. One more thing... "What?" [11-02.htm] Master Tobald: How narrow-minded! To get your hands on the fifth Stone of Commune, you must slay the Archon of Halisha! Find him in the cemetery or at the Shrine of the Loyal inside the Wall of Argos. At the cemetery, you must enter the Four Sepulchers, which is farthest inside. At the shrine, you must kill as many low-level beasts as you can before the Archon will appear. That's all the advice I'll give you! [11-03.htm] Master Tobald: There are two ways to confront the Archon of Halisha. The devil has the fifth Stone of Commune. If you go to the Imperial Tomb, you'll find him in the Four Sepulchers. If you go to the Shrine of the Loyal, you must slay many of his minions for the Archon to appear. This is all I can tell you! If you run into me later, don't bother me! [2-01.htm] Master Tobald: Long time no see! I knew you'd come. Thank you. I would have been killed by the assassin if it weren't for you. Do you remember my project? I succeeded in developing the time machine! It's called Wilma #3. Unfortunately, I can't show it to you now, it's broken. The pilgrimage of tablets? Ah, yes! You still haven't done the pilgrimage. I forgot that you'd returned to the future... Hey! I'm really glad to see you! The pilgrimage! Sure, I'll help you! "Have we met before?" [2-02.htm] Master Tobald: Huh? You're still here. Did you meet Blueprint Seller Borodin? He was supposed to repair the cooling system of my time machine, Wilma #3, but something went wrong. Go ask him what the problem is and help him. Thank you! [2-03.htm] Master Tobald: Ah, It's fixed! Thank you very much! You're always there for me! Have you started the pilgrimage of the stone tablets yet? I'm a little confused, this is my first experience with time travel! I'll tell you about the Tablet of Vision. It concerns the ancient times, when the giants became intoxicated with power and rebelled against the gods. Einhasad broke the tablet that he used to teach magic to the giants into six pieces. They contain the most profound truths. The passages written on these six Tablets of Vision were indecipherable, as they were written in the characters of the gods. No one can understand unless they are a god or possess the power of a god. However, there is a way to learn the knowledge... "How?" [2-04.htm] Master Tobald: You're still here? Find the first Tablet of Vision with the Stone of Commune I gave you. Use the Map if you need to. Follow your feeling. I know you can do it! [2-05.htm] Master Tobald: I don't know! I need to bring a few things to help you with the pilgrimage. We'll need to fix my Wilma #3. Can you help me out? Then you'll find the first Tablet of Vision! Cheer up! You'll do great work in the future. Please be careful! I asked my student, Blueprint Seller Borodin, to repair the cooling system of Wilma #3, but something went wrong. I'm sure you can quickly find the problem. Please do this for me! [2-06.htm] Master Tobald: Take this Stone of Commune. I don't need it anymore. With its power you can read the god's characters on the Tablet of Vision. You can also intuitively see where the next tablet is hidden just by holding the stone in your hand. Isn't it great? I wonder who made it. Don't you think someone is trying to teach us the knowledge forbidden by Einhasad? Soon you'll be a Maestro! Remember, follow where the stone leads you, and you'll find the first tablet! Cheer up! You'll do great work in the future. Please be careful! [3-01.htm] Master Tobald: What are you doing here? You're on the pilgrimage of the tablets, huh? Oh, that's right! You're still taking the test of the Maestro. Because of the time paradox, I shouldn't do this, but I have a favor to ask of you. During the pilgrimage, we'll meet again. That is, you'll meet me when I was still taking the test. Please help me pass the test. I know I can't defeat the assassin on my own... I can't say anything more. If you know too much about the future, the continuity of time and space may crack! "Do you have the fourth Stone of Commune?" [3-02.htm] Master Tobald: Meet Ketra Messenger Wahkan. They'll be hiring soldiers. This is a great opportunity to gain their trust! Soul Guide Asefa is their chief shaman. He has the Divine Stone of Wisdom that we're looking for. If things don't go your way, you can switch sides and approach the Varka Silenos. Cheer up! [3-03.htm] Master Tobald: Meet Messenger Naran Ashanuk of the Varka Silenos. They'll be hiring soldiers. This is a great opportunity to gain their trust! Soul Guide Udan Mardui is their chief shaman. He has the Divine Stone of Wisdom that we're looking for. If things don't go your way, you can switch sides and approach the Ketra Orcs. Cheer up! [3-04.htm] Master Tobald: To use the fourth Stone of Commune, you must get the Divine Stone of Wisdom that the Ketra Orcs or theVarka Sillenos have. You must first gain their trust, but it won't be easy as they are tough and belligerent. Cheer up! [3-05.htm] Master Tobald: You've got the Divine Stone of Wisdom! This is the other half of the fourth Stone of Commune. Now we can join them. "Join the fragments." [3-06.htm] Master Tobald: Take the Stone of Commune I gave you to the fourth Tablet of Vision. You'll intuitively know the location by holding the Stone of Commune. Good luck! [3-07.htm] Master Tobald: Ah, you must feel this small fragment of the fourth Stone of Commune. I brought it from the future, but it broke into pieces when my time machine malfunctioned and part of it flew into the past. We must find one of the other pieces and reunite them. The pieces that flew through the time slip are called stones of sacred wisdom and are worshiped by the primitive tribes in this area. I think the Ketra Orcs and Varka Silenos have them. To get a stone, you must gain the tribe's trust. You must choose which tribe to approach first, they are both tough and belligerent... "I'll go to the Ketra Orcs." "I'll go to the Varka Silenos." [3-08.htm] Master Tobald: These two pieces fit perfectly, don't they? Take this Stone of Commune and find the fourth Tablet of Vision. Follow your feeling! Good luck! [4-01.htm] Master Tobald: Help me, I could get killed! [4-010.htm] Master Tobald: Thank you. He almost stole the stone! I hope you can pass this test. Goodbye for now! Wait...! [4-011.htm] Master Tobald: Thank you! He almost stole the stone from me! You're more worthy than I, you should have it. That fight made me think of a great new invention, a time travel device. I'd better hurry back and draw up the blueprints! [4-02.htm] Master Tobald: I'm going to die! [4-03.htm] Master Tobald: That was close. I never want to see him again! [4-04.htm] Master Tobald: Help me, I could get killed! [4-05.htm] Master Tobald: I'm going to die! [4-06.htm] Master Tobald: What a scary fella he is! Are assassins all like that? They are the ones that I would never wish to come across again. I narrowly made it because you helped me. I don't know what kind of person he is, but he must have eyes on the one who passes this test. "So?" [4-07.htm] Master Tobald: I almost got killed! I have a long ways to go. "So?" [4-08.htm] Master Tobald: I'll defend myself, thank you. Take the stone I gave you and commune with the last tablet! [4-09.htm] Master Tobald: Take the stone I gave you and commune with the last stone tablet! [5-01.htm] Tablet of Vision: Hieroglyphics are engraved on the tablet. They emit a dim light, with a mysterious and powerful magic. Use the stone. [5-02.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. One of the voices is a familiar female whisper. But it quickly disappears. Slowly, you begin to visualize where the next Stone of Commune is... in the valley of dust... you see a second Tablet of Vision... and a female warrior in platinum armor. She is holding the stone... She unfolds her wings and flies away... and she's not alone... In an instant, the images disappear and then the stone goes completely dark. [5-03.htm] Tablet of Vision: You visualize the stone once again when touching the Tablet. In the yellow-brown valley... you see a female warrior with platinum wings... She is holding the stone in her hand. You are compelled to go forth and find the stone right now! [6-01.htm] Tablet of Vision: You must have the Stone of Commune to access this Tablet of Vision. The stone is being held by one of the female warriors with platinum wings. [6-02.htm] Tablet of Vision: Hieroglyphics are engraved on the tablet. They emit a dim light, with a mysterious and powerful magic. Use the stone. [6-03.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. One of the voices is a familiar female whisper. But it quickly disappears. Slowly, you sense the stone... You see the third Tablet of Vision... and an angel with two pairs of wings... She is holding the stone in her hand... In an instant, the images disappear and then the stone goes completely dark. [6-04.htm] Tablet of Vision: Once again, you see the third Tablet of Vision... and a female warrior with wings... She is holding the stone in her hand. You are compelled to go forth and find the stone right now! [7-01.htm] Tablet of Vision: The Stone of Commune exists near the tablet. Putting your hands on the tablet will reveal the location of the stone. Put your hands on the tablet. Patrol the area. [7-02.htm] Tablet of Vision: Putting your hands on the slate, your entire body is knocked back by something powerful but invisible. Then, it begins to appear. [7-03.htm] Tablet of Vision: The Tablet of Vision cannot be accessed without the Stone of Commune. Defeat Archangel Iconoclasis, and take it from him. [7-04.htm] Tablet of Vision: Someone else is currently communing with the Tablet of Vision. Come back later. [7-05.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [7-06.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. One of the voices is a familiar female whisper. But it quickly disappears. Slowly, you begin to visualize where the next Stone of Commune is...The Goddard Castle Town...There is Master Tobald. Master Tobald has the Stone of Commune! In an instant, the images disappear and then the stone goes completely dark. [7-07.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. Master Tobald in Goddard Castle Town has the stone! Find Master Tobald and get it from him. [8-01.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [8-02.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. There is a vision of a beautiful blonde woman and a knight with black armor. The vision disappears. Slowly, you begin to visualize where the next Stone of Commune is...The Goddard Castle Town...Master Tobald with the Stone of Commune appears. He is scratching his head. In an instant, the images disappear and then the stone goes completely dark. [8-03.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. It seems Master Tobald in the Goddard Castle Town has the fifth Stone of Commune. Go and get it from him! [9-01.htm] Tablet of Vision: To decode the figures in the tablet, the Stone of Commune is needed. The fifth Stone of Commune is in the possession of the Archon of Halisha! You can find him at the Sepulchers or the Shrine of the Feudal Lords at the northeastern part of the Wall of Argos, and defeat low-grade evils. [9-02.htm] Tablet of Vision: Ancient, indecipherable hieroglyphs are engraved upon the tablet. They emit a mysterious, dim light. There is something magical and powerful in the tablet. Commune with the Tablet of Vision. [9-03.htm] Tablet of Vision: The Tablet of Vision becomes overwhelmed by bright lights. While you are holding the stone to work on it, you start to acquire a new sense of knowledge as you hear the voices of thousands reading scriptures in the background. You now realize the truth of the world and yet understand nothing. There is a vision of a beautiful blonde woman and a knight with black armor. The vision disappears. Slowly, you begin to visualize where the next Stone of Commune is...A vision appears...The sixth Tablet of Vision hidden in the wilds. Standing in front of the sixth tablet is an unfamiliar human figure...His face is invisible in the darkness, but the Stone of Commune held in his hand emits a dim light. In an instant, the images disappear and then the stone goes completely dark. [9-04.htm] Tablet of Vision: Putting your hands on the tablet, the location of the Stone of Commune again becomes clear. The sixth Stone of Commune is hidden in the wilderness and there are ominious signs of a person's presence ...He is holding the Stone of Commune in his hands...Go and get the stone from him!
Исходник условий и наград (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.Q00100_SagaOfTheMaestro;

import quests.AbstractSagaQuest;

/**
 * Saga of the Maestro (100)
 * @author Emperorc
 */
public class Q00100_SagaOfTheMaestro extends AbstractSagaQuest
{
	public Q00100_SagaOfTheMaestro()
	{
		super(100, "Saga of the Maestro");
		_npc = new int[]
		{
			31592,
			31273,
			31597,
			31597,
			31596,
			31646,
			31648,
			31653,
			31654,
			31655,
			31656,
			31597
		};
		_items = new int[]
		{
			7080,
			7607,
			7081,
			7515,
			7298,
			7329,
			7360,
			7391,
			7422,
			7453,
			7108,
			0
		};
		_mob = new int[]
		{
			27260,
			27249,
			27308
		};
		_classId = new int[]
		{
			118
		};
		_prevClass = new int[]
		{
			0x39
		};
		_x = new int[]
		{
			164650,
			47429,
			47391
		};
		_y = new int[]
		{
			-74121,
			-56923,
			-56929
		};
		_z = new int[]
		{
			-2871,
			-2383,
			-2370
		};
		_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));
			}
		}
	}
}