Saga of the Spectral Dancer
- ID
- 96
- Название
- Saga of the Spectral Dancer
- start_npcs_json
- []
- npc_ids_json
- []
- constants_json
- {}
- Статус разбора
- metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
- Источник
- game/data/scripts/quests/Q00096_SagaOfTheSpectralDancer/Q00096_SagaOfTheSpectralDancer.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] Dark Knight Mordred: You must be the new recruit! Have you heard what some mysterious person has asked of our guild? No? Well... Someone sent us an ancient document! They think it is linked to some ancient, forbidden power, and asked us to research it! Of course, I was immediately suspicious of the request, and dispatched several guild members to check out the requestor... But they've never come back! This is starting to be a real mystery! "What happened to the document?"
[0-010.htm] Dark Knight Mordred: Please, come here. You've obtained new knowledge, but your physical capabilities are lacking. Train yourself, and come back when you're ready. Then, I'll give you a new title. (Only characters of level 76 or above may transfer to the Spectral Dancer class. Be careful. You cannot change occupation if you stop Quest!)
[0-02.htm] Dark Knight Mordred: Are you the new recruit? You're kind of scrawny, aren't you? Tell you what, if I get a mission that's suitable for you, I'll call you. Until then, practice! (This quest may only be undertaken by a Bladedancer of level 76 or above.)
[0-03.htm] Dark Knight Mordred: Well, I suppose you'll have to do... First, visit Spellbook Seller Elena in Goddard Castle Town. After analyzing the ancient documents, she'll tell you what to do next. Death Lord Hallate is said to be searching for the ancient, forbidden power. I seriously doubt that he would risk going after it in person... He'll probably send his witch Lillian! I've collected as much information about her as I could find and compiled it into this manual. Study it carefully, and keep your eyes open at all times!
[0-04.htm] Dark Knight Mordred: Have you forgotten what you're supposed to do? Go see Spellbook Seller Elena in Goddard Castle Town.
[0-05.htm] Dark Knight Mordred: No, that's not it. I called you because I want to to conduct an investigation into an ancient document. Elena, a spellbook seller in Goddard Castle Town, is very fluent in ancient languages. I've asked her to dicipher the ancient document. Go to her and find out what she's discovered... If what they say about the forbidden power is true, we should reclaim it, don't you think? Will you do it? "I'll do it!"
[0-06.htm] Dark Knight Mordred: Come in. When Elena brought me the translated ancient document, she told me that you were almost finished with the mission. What happened? You ran into Hallate? You could've been killed! This is marvelous! Have you obtained the knowledge of the stone tablet? "Yes."
[0-07.htm] Dark Knight Mordred: Please step forward! You've surpassed the title of Bladedancer! Henceforth, you shall be known as a Spectral Dancer! Please accept the congratulations of the Dark Elven Guild.
[0-08.htm] Dark Knight Mordred: Please, come here. You've obtained new knowledge, but your physical capabilities are lacking. Train yourself, and come back when you're ready. Then, I'll give you a new title. (Only characters of level 76 or above may transfer to the Spectral Dancer class. Be careful. You cannot change occupation if you stop Quest!)
[0-09.htm] Dark Knight Mordred: Please step forward! You've surpassed the title of Bladedancer! Henceforth, you shall be known as a Spectral Dancer! Please accept the congratulations of the Dark Elven Guild.
[1-01.htm] Information Broker Bavarin: What do you want? I'm on break! My neuralgia flared up again and I need my rest! Unless it's very important, leave me alone! "I need to borrow your Ancient Language Dictionary."
[1-02.htm] Information Broker Bavarin: I have the dictionary, but, as I said before, you can only have it if you bring me an ice crystal. Now go see Jeremy.
[1-03.htm] Information Broker Bavarin: Have you brought me an ice crystal? Give it to me! Hurry, the pain's coming back! Oh! I guess you want the dictionary, eh? "You can't have the ice crystal until you give me the dictionary."
[1-04.htm] Information Broker Bavarin: Didn't I already give it to you? I don't have anything else for you. I need to rest now. Please, leave me alone. Why don't you take the dictionary to Elena?
[1-05.htm] Information Broker Bavarin: Why do you need the Ancient Language Dictionary? It won't be of any use to you! Elena wanted it? Hmm. What a pain! Very well, I'll get it. But you must do something for me first. Bring me an ice crystal to soothe my neuralgia. Jeremy knows where they are.
[1-06.htm] Information Broker Bavarin: Tough life, eh? Well, here you go. Now, give me the ice crystal. Aaah... yes! I feel better already! Well, our business is done! Please tell Elena that I'll pick up the dictionary from her later.
[10-01.htm] Tablet of Vision: The tablet is softly vibrating. Someone with the Stone of Commune must be nearby. Patrol the area.
[10-02.htm] Tablet of Vision: Death Lord Hallate suddenly appears in the corner! Something seems to be holding him back...
[10-03.htm] Tablet of Vision: Further communion with this tablet would be pointless at this time. Get the next Stone of Commune from Hallate and Scryde.
[10-04.htm] Tablet of Vision: There's a disturbance nearby. I'd better not get involved right now... I'll wait a while.
[10-05.htm] Tablet of Vision: The tablet responds as you approach with the Stone of Commune. Touch the Stone of Commune to the tablet.
[10-06.htm] Tablet of Vision: This time, the flood of knowledge was painless! Now you understand the forbidden strength and the resulting fate. Go back to Dark Knight Modred in Hardin.
[10-07.htm] Tablet of Vision: The tablet goes still and dark as if nothing had happened. Everything's over. Go back to Dark Knight Mordred at Hardin's Academy.
[11-01.htm] Spellbook Seller Elena: How's it going? Did it work? I was afraid of that. The text says, you can't find the next stone until you have a perfect Stone of Commune. Shall I tell you how to get one? "Yes, of course!"
[11-02.htm] Spellbook Seller Elena: According to the book, the Archon of Halisha is very patient. You can find him inside the Four Sepulchers. To enter, you must form a party. If you choose to fight alone, slaughter the Archon's minions at the Shrine of the Loyal. Collect 700 of Halisha's Marks and he will appear. Halisha's minions are Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights and Shrine Guards. After you get the Stone of Commune, find the tablet on the way to Goddard from the Wall of Argos.
[11-03.htm] Spellbook Seller Elena: According to the book, the Archon of Halisha is very patient. You can find him inside the Four Sepulchers. To enter, you must form a party. If you choose to fight alone, slaughter the Archon's minions at the Shrine of the Loyal. Collect 700 of Halisha's Marks and he will appear. Halisha's minions are Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights and Shrine Guards. After you get the Stone of Commune, find the tablet on the way to Goddard from the Wall of Argos.
[2-01.htm] Scroll Seller Elena: What brings you here? The old document that Mordred asked me to keep? I had some problems deciphering some of the strange letters. I need a dictionary. "A dictionary?"
[2-02.htm] Scroll Seller Elena: You didn't meet Bavarin yet? I need an Ancient Language Dictionary to interpret the text.
[2-03.htm] Spellbook Seller Elena: You borrowed the dictionary? I'll translate for you. The location and description are done, but I can't read the name yet. "Here's the dictionary."
[2-04.htm] Scroll Seller Elena: Did you forget again? Look to the south of the Tower of Insolence for the Tablet of Vision.
[2-05.htm] Spellbook Seller Elena: Only a few people have the Ancient Language Dictionary. I heard Bavarin has one. You might find him visiting in the hot springs area. Ask him if you can borrow it.
[2-06.htm] Spellbook Seller Elena: Let me see... According to the Ancient Scroll, you can use a Stone of Commune to get the information from the Tablet of Vision. There are several tablets, and if you gather the information from all of them, you can get the forgotten power. The first tablet is south of the Tower of Insolence. Visit it while I finish translating. Take this Stone of Commune I found with the scroll. Come back later!
[3-01.htm] Spellbook Seller Elena: What did you find out? You can find the next Stone of Commune from the tablet when you commune with it. You also saw me at the tablet? "Yes, you were there."
[3-02.htm] Spellbook Seller Elena: The outpost of Ketra Orc is in the north side of Goddard Castle Town. Gain the confidence of Ketra's Messenger Wahkan. But if you do not like it, it is ok to go to the Varka Silenos side. What I need is the ‘Holy Stone of Wisdom'.
[3-03.htm] Spellbook Seller Elena: The Varka Silenos stronghold is on the west side of Goddard Castle Town. Gain the confidence of Varka's Messenger Naran Ashanuk. But if you do not like it, it is ok to go to the Ketra Orc side. What I need is the 'Holy Stone of Wisdom'.
[3-04.htm] Spellbook Seller Elena: You know what you need to do, right? After getting the trust from Varka Silenos or Ketra Orc and brings 'Holy Stone of Wisdom'. Don's forget to go to Ketra's Messenger Wahkan or Varka's Messenger Naran Ashanuk.
[3-05.htm] Spellbook Seller Elena: Did you get the Divine Stone of Wisdom? I know it's not easy to win the trust of the chief shaman. Let me see it. "Here's the stone."
[3-06.htm] Spellbook Seller Elena: I heard the Tablet of Vision is north of the Varka Silenos barracks. Look there.
[3-07.htm] Spellbook Seller Elena: This is a broken Stone of Commune, useless without one of the fragments that was chipped off. Find a fragment, called a Divine Stone of Wisdom, from either the Ketra Orcs or the Varka Silenos. You must gain the trust of the chief shaman from either tribe. They'll reward it to the one who is most trustworthy. They believe it holds great magical power, but don't know its nature. Which side do you choose? Ketra Orcs Varka Silenos
[3-08.htm] Spellbook Seller Elena: This'll take just a moment. Yes! Here's the Stone of Commune you seek. Let me know if it works. I'll translate this Ancient Scroll until you come back. The Tablet of Vision is in the north of the Varka Silenos barracks. Good luck!
[4-01.htm] Scryde Heartseeker: Time to show your skills, Bladedancer. Lord of Purgatory, Death Lord Hallate, where could you find a better opponent!?
[4-010.htm] Scryde Heartseeker: You mean this? I think this Stone of Commune should be yours. Take it. I won't forget you. Till we meet again! "Wait!"
[4-011.htm] Scryde Heartseeker: You mean this? I think this Stone of Commune should be yours. Take it. I won't forget you. Till we meet again!
[4-02.htm] Scryde Heartseeker: This is between him and me, so step back. Death Lord Hallate, even if you are the Lord of Purgatory, I can't let you stop me!
[4-03.htm] Scryde Heartseeker: I never thought the great Lord of Purgatory would turn tail and run. My mission is not yet complete. Don't worry, you'll get another chance. Goodbye!
[4-04.htm] Scryde Heartseeker: You can do better than that. Show me what you've got!
[4-05.htm] Scryde Heartseeker: This is a battle between him and me. Step aside. Death Lord Hallate, even if you are the Lord of Purgatory, I can't let you stop me!
[4-06.htm] Scryde Heartseeker: Thanks for your help. I don't think he'll be back for a while. "Did you find anything?"
[4-07.htm] Scryde Heartseeker: Are you looking for the Stone of Commune? "Yes."
[4-08.htm] Scryde Heartseeker: This is between him and me. Take this Stone of Commune and use it with the Tablet of Vision over there. Hurry!
[4-09.htm] Scryde Heartseeker: I can't believe the great Lord of Purgatory would turn his back and run. Use the Stone of Commune with the Tablet of Vision and you'll get the secret of the ancient knowledge!
[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. You suddenly realize that this isn't the only Stone of Commune nor Tablet of Vision, and the knowledge contained within 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, 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 west 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 west 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 creature with four wings has the Stone of Commune.
[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: Suddenly, a vast amount of knowledge is painfully seared into your brain. The cascade of brief images is unintelligible at first... As the pain slowly ebbs, you feel dizzy and begin to visualize a new place. It seems as though it might be in the southeast of Ketra Orc Outpost. Around a tablet I can see Hallate's Dancer Lillian as Mordred warned. I can also sense the power of the Stone of Commune eminating from her. As I try to look deeper, my vision slowly comes back to normal. The tablet goes still and dark, as if nothing had happened. I know now that I must find the Tablet of Vision in the Southeast of Ketra Orc Outpost!
[6-04.htm] Tablet of Vision: The tablet has no response. Go to the Southeast of Ketra Orc Outpost and get the Stone of Commune.
[7-01.htm] Tablet of Vision: The tablet is vibrating softly. I sense that someone nearby has a Stone of Commune! Examine the area carefully.
[7-02.htm] Tablet of Vision: Lillian looks just like she did in the vision! Beware of her.
[7-03.htm] Tablet of Vision: Lillian serves that devil Hallate, and we must be wary of her evil ways! Kill her and take her Stone of Commune!
[7-04.htm] Tablet of Vision: There's a fight going on over there. Wait and see what happens.
[7-05.htm] Tablet of Vision: When you approach the Tablet of Vision with the Stone of Commune, the tablet begins buzzing softly. Touch the Stone of Commune to the tablet.
[7-06.htm] Tablet of Vision: New knowledge is painfully seared into your brain. The secrets of the Tablet of Vision are becoming clear. As the pain subsides, a familiar face appears... It's Elena! And then the vision fades...Find Elena! She has the first Stone of Commune!
[7-07.htm] Tablet of Vision: The tablet goes still and quiet, as if nothing had ever happened. I must find Elena! I'm sure she has the Stone of Commune!
[8-01.htm] Tablet of Vision: I can feel the tablet resonate with the Stone of Commune. Touch the Stone of Commune to the Tablet of Vision.
[8-02.htm] Tablet of Vision: Thoughts beyond understanding are painfully seared into your brain. As the pain subsides and the communion is finished, you are surprised to discover that you still don't know where the next Stone of Commune is. Speak with Elena in Goddard Castle Town again.
[8-03.htm] Tablet of Vision: The tablet goes still and dark as if nothing had happened. Visit Elena in Goddard Castle Town and find out what to do next.
[9-01.htm] Tablet of Vision: The tablet is useless without a Stone of Commune! Go get one from the Archon of Halisha!
[9-02.htm] Tablet of Vision: The tablet responds to the presence of the Stone of Commune with a loud buzzing. Touch the Stone of Communeto the Tablet of Vision.
[9-03.htm] Tablet of Vision: Once again, thousands of incomprehensible thoughts are seared painfully into your mind. As the pain subsides, a vision appears! I see the shadow of someone standing before the tablet, holding the Stone of Commune! It seems to be northeast of Rune Castle Town.
[9-04.htm] Tablet of Vision: The tablet has no response. Let's go to the northeast of Rune Castle Townwhere the next Stone of Commune is located in.
Исходник условий и наград (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.Q00096_SagaOfTheSpectralDancer;
import quests.AbstractSagaQuest;
/**
* Saga of the Spectral Dancer (96)
* @author Emperorc
*/
public class Q00096_SagaOfTheSpectralDancer extends AbstractSagaQuest
{
public Q00096_SagaOfTheSpectralDancer()
{
super(96, "Saga of the Spectral Dancer");
_npc = new int[]
{
31582,
31623,
31284,
31284,
31611,
31646,
31649,
31653,
31654,
31655,
31656,
31284
};
_items = new int[]
{
7080,
7527,
7081,
7511,
7294,
7325,
7356,
7387,
7418,
7449,
7092,
0
};
_mob = new int[]
{
27272,
27245,
27264
};
_classId = new int[]
{
107
};
_prevClass = new int[]
{
0x22
};
_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));
}
}
}
}