Saga of the Grand Khavatari
- ID
- 76
- Название
- Saga of the Grand Khavatari
- start_npcs_json
- []
- npc_ids_json
- []
- constants_json
- {}
- Статус разбора
- metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
- Источник
- game/data/scripts/quests/Q00076_SagaOfTheGrandKhavatari/Q00076_SagaOfTheGrandKhavatari.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] Amulet Seller Hakran: We've got a big problem! Do you remember Hubai, Khavatari's eldest son? He knows more about the arts of Khavatari than anyone! "Yes, I remember him."
[0-010.htm] Amulet Seller Hakran: When your wounds have healed and your body has recovered, come back and see me. I need to tell you something. (Only a character of level 76 or above may transfer to another class. Don't abandon the quest until class transfer is complete.)
[0-02.htm] Amulet Seller Hakran: I probably should even mention the temple's disgrace to you! You're bound to find out eventually...? But I don't want to unnecessarily alarm you! Train more...! For now, just prepare for disaster...! (Quest available for Tyrants of Level 76 or above only.)
[0-03.htm] Amulet Seller Hakran: He was assassinated.....! You're the most accomplished tyrant I've ever seen! I'll wager you could track down that scoundrel...! Take this. It's one of three of the Khavatari scrolls left by Hubai! The other two are missing, and Khavatari Kashu and Khavatari Urzu, Hubai's disciples, have disappeared as well! They were the designated successors of Hubai! I'm afraid that one of them killed Hubai and stole the scrolls! Go and see the Duda-Mara totem spirit! He's laid out spider webs in all directions looking for them. He should know by now which way they're headed..!
[0-04.htm] Amulet Seller Hakran: Visit the Duda-Mara totem spirit. He's laid out webs everywhere. He should know by now which way they're headed..!
[0-05.htm] Amulet Seller Hakran: Exactly! Your old trainer, Khavatari Rosheek, and Khavatari Toruku are disciples of Khavatari Hubai. Such a pity about what happened to Hubai...! "What happened to Khavatari Hubai?"
[0-06.htm] Amulet Seller Hakran: Kashu has returned to the village. But you have more business to do, don't you? From now on, Khavatari Hubai's job will be done by Khavatari Kashu. He asked me to relay his gratitude for avenging Hubai's death. Have you completed your pilgrimage of the vision? "Yes, I did."
[0-07.htm] Amulet Seller Hakran: Very well. As of today, you've officially become Grand Khavatari! This is a reason to celebrate! Grand Khavataris have appeared at the same time! Yes, we've lost Hubai... but our future no longer seems so bleak!
[0-08.htm] Amulet Seller Hakran: Wonderful! Go rest for a while and then come back and see me. I have something tell you after you recover your strength. (Only a character of level 76 or above can transfer to another class. Don't abandon this quest until class transfer is complete.)
[0-09.htm] Amulet Seller Hakran: Are you well-rested? If you''ve completed your pilgrimage of the vision, today you are a Grand Khavatari! Not many have completed that pilgrimage! I pray that you and Kashu further develop the arts of Khavatari. Tejakar Khavatari!
[1-01.htm] Chef Donath: Bitter Cold Vodka? Isn't that the Orcish liquor made by mixing the flames of Pa'agrio with the power of 99 dead spirits? You can't just ask me to make such a.... "Well you see, it's like this..."
[1-02.htm] Chef Donath: Although it's practically impossible to make genuine Bitter Cold Vodka, I can get pretty close! I'll need a divine ingredient known as an ice crystal. Chef Jeremy can tell you where to find one. I can't make Bitter Cold Vodka without it!
[1-03.htm] Chef Donath: You brought the ice crystal! Excellent! Now I'll make the Bitter Cold Vodka. I must warn you, the power of the spirits within the liquor is not that strong, and over time, it loses its effect. Will that be acceptable? "That's OK."
[1-04.htm] Chef Donath: Maybe a dead spirit could notice the difference, but without the actual flames of Pa'agrio and the dead spirits, this is the best that I can do. Take it and go.
[1-05.htm] Chef Donath: Hmm... if that's what you want, I'll do it, but only if you're sure that's what you really want! I should be able to get pretty close to the original. It'll do for a simple ritual, but not for a formal religious rite. I must have a divine ingredient known as an ice crystal! Chef Jeremy can tell you where to get one. I can't make Bitter Cold Vodka without it.
[1-06.htm] Chef Donath: If you say so, it's all right with me! Here we go! Working with dead spirits always makes me so nervous! Take it and go!
[10-01.htm] Tablet of Vision: You hear fighting and the yell of Khavatari. The opponent is the god of flame, who can't be defeated alone! Run towards the sound.
[10-02.htm] Tablet of Vision: Khavatari Kashu, Hubai's disciple, fights with the evil Spirit of Flame. Go help!
[10-03.htm] Tablet of Vision: The tablet doesn't respond. Khavatari Kashu looks as if she has something to say.
[10-04.htm] Tablet of Vision: You feel someone's presence as you approach. This is not your fight.
[10-05.htm] Tablet of Vision: The Stone of Commune emits light as you approach the tablet. Commune with the Tablet of Vision.
[10-06.htm] Tablet of Vision: Vast amounts of knowledge rush into your mind. You hear the sound of distant laughter. A voice whispers, "Another Hero is born." The lady in blue disagrees... Khavatari talks of the stream cooling the soul of flame, that is Pa'agrio's union with the gods! The flame is within you. Follow Kashu and see Amulet Seller Hakran in Rune Castle Town.
[10-07.htm] Tablet of Vision: Communion with this tablet would be futile. Go see Amulet Seller Hakran in Rune Castle Town.
[11-01.htm] Seer Skahi: Tejakar Duda-Mara! You came to see me again as the spider foretold! Khavatari Kashu has left for the last stone tablet! Hurry, he'll need your help! "What should I do?"
[11-02.htm] Seer Skahi: Find the Archon of Halisha inside the Four Sepulchers at the Human Imperial Tomb. If entering is too difficult, go to the Shrine of the Loyal and fight Halisha's minions. He'll show up if you kill enough of them! Defeat him and get the Stone of Commune.
[11-03.htm] Seer Skahi: The power of the ancient Orcs that you seek was created by the gods, but stolen by devils. Find the Archon of Halisha inside the Four Sepulchers at the Human Imperial Tomb! If entering is too difficult, go to the Shrine of the Loyal and fight Halisha's minions! He'll show up if you kill enough of them. Defeat him and get the Stone of Commune!
[2-01.htm] Duda-Mara Totem Spirit: Heh heh... a young Orc seeking information... I know exactly why you're here! You're trying to find the two Orcs who murdered Khavatari Hubai, aren't you? Yes, I am!
[2-02.htm] Duda-Mara Totem Spirit: How dare you come here empty-handed! Don't you know who I am? Show the proper respect!
[2-03.htm] Duda-Mara Totem Spirit: Have you brought liquor for the ritual? Well, it's not enough, but it's certainly better than nothing! Give me your hand. "OK."
[2-04.htm] Duda-Mara Totem Spirit: The time has come for your last journey of training as a tyrant. Go to the Tablet of Vision, my child.
[2-05.htm] Duda-Mara Totem Spirit: You rascal! You dare ask for my help without bringing anything for me?! The least you could've done is brought me some Bitter Cold Vodka! You're lucky I don't skin you alive!
[2-06.htm] Duda-Mara Totem Spirit: Take this stone that the god of fire has entrusted with your tribe. Two of Hubai's disciples stole it from him. Things did not go well as they left on their last training mission as tyrants... I'm afraid one of them killed Hubai, and the other is relentlessly pursuing the killer! To find them, you must undertake the last training journey of a tyrant. First you must learn from the stone of vision near the Tower of Insolence. You should get going!
[3-01.htm] Seer Skahi: The spidersilk of Duda-Mara told me you would come. This won't be our only meeting. "Tell me about Ajirua."
[3-02.htm] Seer Skahi: Warrior, then, go to Ketra Orc Outpost first and see Ketra's Messenger Wahkan. So, gain their trust and give them a hand! I, the Seer, will consider you as great one through your mind to help Betrayer Orc! Do what you want! But, don't forget! There are more than one stone! When you are betrayed and suffered, another way is also waiting for you!
[3-03.htm] Seer Skahi: Meet Varka's Messenger Naran Ashanuk in the Varka Silenos stronghold. Gain their trust by lending your strength! To kill betrayer Orcs is the spirit of a warrior! If your suffering is too great, there is another way!
[3-04.htm] Seer Skahi: Warrior, you must bring the Divine Stone of Wisdom! To get it you must choose sides in this war. Find Messenger Wahkan of the Ketra Orcs or Messenger Naran Ashanuk of the Varka Silenos.
[3-05.htm] Seer Skahi: Warrior, you have shown the qualities of a king and passed the test by getting the Divine Stone of Wisdom! Don't forget the people you helped or the blood you spilled. Never forget that Duda-Mara's totem spirit protects you. Hand me the stone! "Here's the stone."
[3-06.htm] Seer Skahi: Go to the northe of the Varka Silenos Barracks and commune with the Tablet!
[3-07.htm] Seer Skahi: Flame Spirit Ajirua is preparing you for Khavatari's test. Here it is. The Ketra Orcs, a lower race who betrayed us long ago, and the Varka Silenos are at war. They each have a Divine Stone of Wisdom, but you must earn their absolute trust to get it. Bring either stone to pass the test. Which side do you choose? Ketra Orcs Varka Silenos
[3-08.htm] Seer Skahi: Soul in the stone, Wake up and restore the power of the Stone of Commune! Warrior, receive this Stone of Commune you have restored! Go to Varka Silenos Barracks and say what you have done to the Tablet in the north! Eternal Flame is watching you all the time!
[4-01.htm] Khavatari Kashu: Welcome, brother! Come and fight with me! Follow the teachings of the vision!
[4-010.htm] Khavatari Kashu: With your help, I was able to defeat my opponent! Here, take this. You'll need this to complete the final stage of the pilgrimage of vision the master told you about.. I'm content with the fact that I slaughtered the enemy of my master. I'll return now. Take your time, and return when you finish your mission! "Wait!"
[4-011.htm] Khavatari Kashu: With your help, I was able to defeat my opponent! Here, take this. You'll need this to complete the final stage of the pilgrimage of vision the master told you about.. I'm content with the fact that I slaughtered the enemy of my master. I'll return now. Take your time, and return when you finish your mission!
[4-02.htm] Khavatari Kashu: It's too dangerous! You can't beat this guy unless you possess the flow of Khavatari! Step back!
[4-03.htm] Khavatari Kashu: Argh..., I'm hurt! I need to rest.
[4-04.htm] Khavatari Kashu: Watch out! Don't lose your calm and fight the flow! We must concentrate all of our energy into this fight!
[4-05.htm] Khavatari Kashu: Long time no see, my brother! Why don't you take a break?
[4-06.htm] Khavatari Kashu: Did he withdraw? Excellent! Even with both of us fighting against him, we faced a serious risk of being turned into blackened pieces of Charcoal! Your level of Khavatari is quite impressive! Well, I guess that's obvious since you've made it this far, right...? Skahi told me about you when we lost our brother to that beast! At that moment, I placed all my trust in you! Now, give me your hand. "Here it is."
[4-07.htm] Khavatari Kashu: Did he withdraw? Excellent! Even with both of us fighting against him, we faced a serious risk of being turned into blackened pieces of Charcoal! Your level of Khavatari is quite impressive! Well, I guess that's obvious since you've made it this far, right...? Skahi told me about you when we lost our brother to that beast! At that moment, I placed all my trust in you! Now, give me your hand. "Here it is."
[4-08.htm] Khavatari Kashu: Use that stone to finish your pilgrimage of the vision! Pay no attention to me!
[4-09.htm] Khavatari Kashu: Take the stone and finish your pilgrimage of vision.
[5-01.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision.
[5-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A female voice seems to float on by as if the wind were singing... You sense that the next Stone of Commune is held by many warriors in a place northeast of the Valley of Saints.
[5-03.htm] Tablet of Vision: Further communion with this tablet is futile. Now you must go to the Valley of Saints. Kill the Guardians of Forbidden Knowledge and take the Stone of Commune held by them in the northeast of the Valley of Saints.
[6-01.htm] Tablet of Vision: The hieroglyphs on the tablet are indecipherable. The Guardians of Forbidden Knowledge hold the Stone of Commune you'll need to access this tablet.
[6-02.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision.
[6-03.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You hear the faint whisper of a woman's voice. You see a vision of the tyrant, tempted by power, killing his teacher and fleeing to the Ketra Orc Outpost.
[6-04.htm] Tablet of Vision: Further communion with this tablet is futile. Use the scroll of Khavatari to destroy the apostate Orc! He can be found in the Ketra Orc Outpost.
[7-01.htm] Tablet of Vision: As you near the Tablet of Vision, you sense a presence. It's the peculiar flame of jealousy for the one tempted by the devil Khavatari! It promises quick training, but eventually leads to destruction. You see an Orc who has taken this path. He's watching you as well! "Show yourself!"
[7-02.htm] Tablet of Vision: It's Uruz, the senior disciple!
[7-03.htm] Tablet of Vision: The Tablet of Vision is inscribed with incomprehensible hieroglyphs. Uruz's attack continues!
[7-04.htm] Tablet of Vision: You sense a disturbance near the tablet. The time hasn't yet come for you to prove yourself.
[7-05.htm] Tablet of Vision: The Stone of Commune starts emitting light as soon as you near the Tablet of Vision. Commune with the Tablet of Vision.
[7-06.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You hear the faint whisper of a female's voice... Two tyrants asked Khavatari Hubai to name his successor. Though Hubai thought it was not the right time, he couldn't ignore Uruz and told him to teach the secrets to the one who finished the Pilgrimage of Vision. But Uruz was tempted by Ajirua on the way. Ajirua...! That devil showed up several times in the history of Khavatari! Find out more from Seer Skahi at the Orc Guild in Goddard Castle Town!
[7-07.htm] Tablet of Vision: Further communion with this tablet is futile. Get the next Stone of Commune from Seer Skahi in Goddard Castle Town.
[8-01.htm] Tablet of Vision: The Stone of Commune starts emitting light as you approach the Tablet of Vision. Commune with the Tablet of Vision.
[8-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A vision appears of a mysterious dark knight... A lonely warrior of Khavatari meets with Seer Skahi. The Warrior is lonely but his mind is strong. He disappeared with the Stone of Commune after talking with Skahi.
[8-03.htm] Tablet of Vision: Further communion with this tablet would be pointless at this time. Speak with Seer Skahi in Goddard Castle Town.
[9-01.htm] Tablet of Vision: The tablet is still and dark. The Stone of Commune that can access this tablet may be obtained at the Imperial Tomb or the Shrine of the Loyal.
[9-02.htm] Tablet of Vision: The Stone of Commune starts emitting light as you approach the Tablet of Vision. Commune with the Tablet of Vision.
[9-03.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. I think I saw a man in black armor somewhere... The visions continue... The image of Ajirua coiled in dry flames... It is the flame of the founder and of eternity. It is a huge flame that seemingly swallows itself as it spins inversely. It begins to change shape and reveals Khavatari Uruz who is waiting for Khavatari Kashu who is near the Hunters Village. Khavatari Kashu want to confront Uruz alone! Let's hurry and help him!
[9-04.htm] Tablet of Vision: Further communion with this tablet would be futile. Find the evil spirit Ajirua near Hunters Village!
Исходник условий и наград (Java)
/*
* This file is part of the L2J Mobius project.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package quests.Q00076_SagaOfTheGrandKhavatari;
import quests.AbstractSagaQuest;
/**
* @author Emperorc
*/
public class Q00076_SagaOfTheGrandKhavatari extends AbstractSagaQuest
{
public Q00076_SagaOfTheGrandKhavatari()
{
super(76, "Saga of the Grand Khavatari");
_npc = new int[]
{
31339,
31624,
31589,
31290,
31637,
31646,
31647,
31652,
31654,
31655,
31659,
31290
};
_items = new int[]
{
7080,
7539,
7081,
7491,
7274,
7305,
7336,
7367,
7398,
7429,
7099,
0
};
_mob = new int[]
{
27293,
27226,
27284
};
_classId = new int[]
{
114
};
_prevClass = new int[]
{
0x30
};
_x = new int[]
{
161719,
124355,
124376
};
_y = new int[]
{
-92823,
82155,
82127
};
_z = new int[]
{
-1893,
-2803,
-2796
};
_text = new String[]
{
"PLAYERNAME! Pursued to here! However, I jumped out of the Banshouren boundaries! You look at the giant as the sign of power!",
"... Oh ... good! So it was ... let's begin!",
"I do not have the patience ..! I have been a giant force ...! Cough chatter ah ah ah!",
"Paying homage to those who disrupt the orderly will be PLAYERNAME's death!",
"Now, my soul freed from the shackles of the millennium, Halixia, to the back side I come ...",
"Why do you interfere others' battles?",
"This is a waste of time.. Say goodbye...!",
"...That is the enemy",
"...Goodness! PLAYERNAME you are still looking?",
"PLAYERNAME ... Not just to whom the victory. Only personnel involved in the fighting are eligible to share in the victory.",
"Your sword is not an ornament. Don't you think, PLAYERNAME?",
"Goodness! I no longer sense a battle there now.",
"let...",
"Only engaged in the battle to bar their choice. Perhaps you should regret.",
"The human nation was foolish to try and fight a giant's strength.",
"Must...Retreat... Too...Strong.",
"PLAYERNAME. Defeat...by...retaining...and...Mo...Hacker",
"....! Fight...Defeat...It...Fight...Defeat...It..."
};
registerNPCs();
}
}
// Shared quest dependency: AbstractSagaQuest.java
/*
* Copyright (c) 2013 L2jMobius
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
package quests;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.l2jmobius.gameserver.config.PlayerConfig;
import org.l2jmobius.gameserver.entity.World;
import org.l2jmobius.gameserver.entity.WorldObject;
import org.l2jmobius.gameserver.entity.actor.Creature;
import org.l2jmobius.gameserver.entity.actor.Npc;
import org.l2jmobius.gameserver.entity.actor.Player;
import org.l2jmobius.gameserver.entity.groups.Party;
import org.l2jmobius.gameserver.mechanics.script.Quest;
import org.l2jmobius.gameserver.mechanics.script.QuestState;
import org.l2jmobius.gameserver.mechanics.skill.Skill;
import org.l2jmobius.gameserver.network.enums.ChatType;
import org.l2jmobius.gameserver.network.serverpackets.MagicSkillUse;
import org.l2jmobius.gameserver.network.serverpackets.NpcSay;
public abstract class AbstractSagaQuest extends Quest
{
protected int[] _npc = {};
protected int[] _items = {};
protected int[] _mob = {};
protected int[] _classId = {};
protected int[] _prevClass = {};
protected int[] _x = {};
protected int[] _y = {};
protected int[] _z = {};
protected String[] _text = {};
private static final Map<Npc, Integer> SPAWN_LIST = new HashMap<>();
// @formatter:off
private static final int[][] QUEST_CLASSES =
{
{ 0x7f }, { 0x80, 0x81 }, { 0x82 }, { 0x05 }, { 0x14 }, { 0x15 },
{ 0x02 }, { 0x03 }, { 0x2e }, { 0x30 }, { 0x33 }, { 0x34 }, { 0x08 },
{ 0x17 }, { 0x24 }, { 0x09 }, { 0x18 }, { 0x25 }, { 0x10 }, { 0x11 },
{ 0x1e }, { 0x0c }, { 0x1b }, { 0x28 }, { 0x0e }, { 0x1c }, { 0x29 },
{ 0x0d }, { 0x06 }, { 0x22 }, { 0x21 }, { 0x2b }, { 0x37 }, { 0x39 }
};
// @formatter:on
private static final int[] ARCHON_HALISHA_NORM =
{
18212,
18214,
18215,
18216,
18218
};
public AbstractSagaQuest(int questId, String description)
{
super(questId, description);
}
public void registerNPCs()
{
addStartNpc(_npc[0]);
addAttackId(_mob[2]);
addAttackId(_mob[1]);
addSkillSeeId(_mob[1]);
addFirstTalkId(_npc[4]);
addTalkId(_npc);
addKillId(_mob);
final int[] questItemIds = _items.clone();
questItemIds[0] = 0;
questItemIds[2] = 0; // remove Ice Crystal and Divine Stone of Wisdom
registerQuestItems(questItemIds);
for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
{
addKillId(archonMinion);
}
addKillId(ARCHON_HALISHA_NORM);
for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
{
addKillId(guardianAngel);
}
}
@Override
public String onEvent(String event, Npc npc, Player player)
{
final QuestState st = getQuestState(player, false);
if (st == null)
{
return null;
}
String htmltext = null;
switch (event)
{
case "0-011.htm":
case "0-012.htm":
case "0-013.htm":
case "0-014.htm":
case "0-015.htm":
{
htmltext = event;
break;
}
case "accept":
{
st.startQuest();
giveItems(player, _items[10], 1);
htmltext = "0-03.htm";
break;
}
case "0-1":
{
if (player.getLevel() < 76)
{
htmltext = "0-02.htm";
if (st.isCreated())
{
st.exitQuest(true);
}
}
else
{
htmltext = "0-05.htm";
}
break;
}
case "0-2":
{
if (player.getLevel() < 76)
{
takeItems(player, _items[10], -1);
st.setCond(20, true);
htmltext = "0-08.htm";
}
else
{
takeItems(player, _items[10], -1);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1);
final int playerClass = getPlayerClass(player);
final int prevClass = getPrevClass(player);
player.setPlayerClass(playerClass);
if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
{
player.setBaseClass(playerClass);
}
player.broadcastUserInfo();
cast(npc, player, 4339, 1);
st.exitQuest(false);
htmltext = "0-07.htm";
}
break;
}
case "1-3":
{
st.setCond(3);
htmltext = "1-05.htm";
break;
}
case "1-4":
{
st.setCond(4);
takeItems(player, _items[0], 1);
if (_items[11] != 0)
{
takeItems(player, _items[11], 1);
}
giveItems(player, _items[1], 1);
htmltext = "1-06.htm";
break;
}
case "2-1":
{
st.setCond(2);
htmltext = "2-05.htm";
break;
}
case "2-2":
{
st.setCond(5);
takeItems(player, _items[1], 1);
giveItems(player, _items[4], 1);
htmltext = "2-06.htm";
break;
}
case "3-5":
{
htmltext = "3-07.htm";
break;
}
case "3-6":
{
st.setCond(11);
htmltext = "3-02.htm";
break;
}
case "3-7":
{
st.setCond(12);
htmltext = "3-03.htm";
break;
}
case "3-8":
{
st.setCond(13);
takeItems(player, _items[2], 1);
giveItems(player, _items[7], 1);
htmltext = "3-08.htm";
break;
}
case "4-1":
{
htmltext = "4-010.htm";
break;
}
case "4-2":
{
giveItems(player, _items[9], 1);
st.setCond(18, true);
htmltext = "4-011.htm";
break;
}
case "4-3":
{
giveItems(player, _items[9], 1);
st.setCond(18, true);
autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
st.set("Quest0", "0");
cancelQuestTimer("Mob_2 has despawned", npc, player);
deleteSpawn(npc);
return null;
}
case "5-1":
{
st.setCond(6, true);
takeItems(player, _items[4], 1);
cast(npc, player, 4546, 1);
htmltext = "5-02.htm";
break;
}
case "6-1":
{
st.setCond(8, true);
st.set("spawned", "0");
takeItems(player, _items[5], 1);
cast(npc, player, 4546, 1);
htmltext = "6-03.htm";
break;
}
case "7-1":
{
if (st.getInt("spawned") == 1)
{
htmltext = "7-03.htm";
}
else if (st.getInt("spawned") == 0)
{
final Npc mob1 = addSpawn(_mob[0], _x[0], _y[0], _z[0], -1);
st.set("spawned", "1");
startQuestTimer("Mob_1 Timer 1", 500, mob1, player);
startQuestTimer("Mob_1 has despawned", 300000, mob1, player);
addSpawn(st, mob1);
htmltext = "7-02.htm";
}
else
{
htmltext = "7-04.htm";
}
break;
}
case "7-2":
{
st.setCond(10, true);
takeItems(player, _items[6], 1);
cast(npc, player, 4546, 1);
htmltext = "7-06.htm";
break;
}
case "8-1":
{
st.setCond(14, true);
takeItems(player, _items[7], 1);
cast(npc, player, 4546, 1);
htmltext = "8-02.htm";
break;
}
case "9-1":
{
st.setCond(17, true);
st.set("Quest0", "0");
st.set("Tab", "0");
takeItems(player, _items[8], 1);
cast(npc, player, 4546, 1);
htmltext = "9-03.htm";
break;
}
case "10-1":
{
if (st.getInt("Quest0") == 0)
{
final Npc mob3 = addSpawn(_mob[2], _x[1], _y[1], _z[1], -1);
final Npc mob2 = addSpawn(_npc[4], _x[2], _y[2], _z[2], -1);
addSpawn(st, mob3);
addSpawn(st, mob2);
st.set("Mob_2", String.valueOf(mob2.getObjectId()));
st.set("Quest0", "1");
st.set("Quest1", "45");
startQuestTimer("Mob_3 Timer 1", 500, mob3, player, true);
startQuestTimer("Mob_3 has despawned", 59000, mob3, player);
startQuestTimer("Mob_2 Timer 1", 500, mob2, player);
startQuestTimer("Mob_2 has despawned", 60000, mob2, player);
htmltext = "10-02.htm";
}
else if (st.getInt("Quest1") == 45)
{
htmltext = "10-03.htm";
}
else
{
htmltext = "10-04.htm";
}
break;
}
case "10-2":
{
st.setCond(19, true);
takeItems(player, _items[9], 1);
cast(npc, player, 4546, 1);
htmltext = "10-06.htm";
break;
}
case "11-9":
{
st.setCond(15);
htmltext = "11-03.htm";
break;
}
case "Mob_1 Timer 1":
{
autoChat(npc, _text[0].replace("PLAYERNAME", player.getName()));
return null;
}
case "Mob_1 has despawned":
{
autoChat(npc, _text[1].replace("PLAYERNAME", player.getName()));
st.set("spawned", "0");
deleteSpawn(npc);
return null;
}
case "Archon Hellisha has despawned":
{
autoChat(npc, _text[6].replace("PLAYERNAME", player.getName()));
st.set("spawned", "0");
deleteSpawn(npc);
return null;
}
case "Mob_3 Timer 1":
{
final Npc mob2 = findSpawn(player, World.findObject(st.getInt("Mob_2")).asNpc());
if ((World.getFirstVisibleObject(npc, Npc.class, it -> it == mob2) != null))
{
npc.asAttackable().addDamageHate(mob2, 0, 99999);
npc.getAI().setIntentionAttack(mob2);
mob2.getAI().setIntentionAttack(npc);
autoChat(npc, _text[14].replace("PLAYERNAME", player.getName()));
cancelQuestTimer("Mob_3 Timer 1", npc, player);
}
return null;
}
case "Mob_3 has despawned":
{
autoChat(npc, _text[15].replace("PLAYERNAME", player.getName()));
st.set("Quest0", "2");
deleteSpawn(npc);
return null;
}
case "Mob_2 Timer 1":
{
autoChat(npc, _text[7].replace("PLAYERNAME", player.getName()));
startQuestTimer("Mob_2 Timer 2", 1500, npc, player);
if (st.getInt("Quest1") == 45)
{
st.set("Quest1", "0");
}
return null;
}
case "Mob_2 Timer 2":
{
autoChat(npc, _text[8].replace("PLAYERNAME", player.getName()));
startQuestTimer("Mob_2 Timer 3", 10000, npc, player);
return null;
}
case "Mob_2 Timer 3":
{
if (st.getInt("Quest0") == 0)
{
startQuestTimer("Mob_2 Timer 3", 13000, npc, player);
if (getRandomBoolean())
{
autoChat(npc, _text[9].replace("PLAYERNAME", player.getName()));
}
else
{
autoChat(npc, _text[10].replace("PLAYERNAME", player.getName()));
}
}
return null;
}
case "Mob_2 has despawned":
{
st.set("Quest1", String.valueOf(st.getInt("Quest1") + 1));
if ((st.getInt("Quest0") == 1) || (st.getInt("Quest0") == 2) || (st.getInt("Quest1") > 3))
{
st.set("Quest0", "0");
// TODO: This "if" will never be true.
if (st.getInt("Quest0") == 1)
{
autoChat(npc, _text[11].replace("PLAYERNAME", player.getName()));
}
else
{
autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
}
deleteSpawn(npc);
}
else
{
startQuestTimer("Mob_2 has despawned", 1000, npc, player);
}
return null;
}
}
return htmltext;
}
@Override
public void onAttack(Npc npc, Player player, int damage, boolean isSummon)
{
final QuestState st2 = findRightState(npc);
if (st2 != null)
{
final int cond = st2.getCond();
final QuestState st = getQuestState(player, false);
final int npcId = npc.getId();
if ((npcId == _mob[2]) && (st == st2) && (cond == 17))
{
int quest0 = st.getInt("Quest0") + 1;
if (quest0 == 1)
{
autoChat(npc, _text[16].replace("PLAYERNAME", player.getName()));
}
if (quest0 > 15)
{
quest0 = 1;
autoChat(npc, _text[17].replace("PLAYERNAME", player.getName()));
cancelQuestTimer("Mob_3 has despawned", npc, st2.getPlayer());
st.set("Tab", "1");
deleteSpawn(npc);
}
st.set("Quest0", Integer.toString(quest0));
}
else if ((npcId == _mob[1]) && (cond == 15) && ((st != st2) || player.isInParty()))
{
autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
st2.set("spawned", "0");
deleteSpawn(npc);
}
}
}
@Override
public String onFirstTalk(Npc npc, Player player)
{
String htmltext = "";
final QuestState st = getQuestState(player, false);
final int npcId = npc.getId();
if ((st != null) && (npcId == _npc[4]))
{
final int cond = st.getCond();
if (cond == 17)
{
final QuestState st2 = findRightState(npc);
if (st2 != null)
{
player.setLastQuestNpcObject(npc.getObjectId());
final int tab = st.getInt("Tab");
final int quest0 = st.getInt("Quest0");
if (st == st2)
{
if (tab == 1)
{
if (quest0 == 0)
{
htmltext = "4-04.htm";
}
else if (quest0 == 1)
{
htmltext = "4-06.htm";
}
}
else if (quest0 == 0)
{
htmltext = "4-01.htm";
}
else if (quest0 == 1)
{
htmltext = "4-03.htm";
}
}
else if (tab == 1)
{
if (quest0 == 0)
{
htmltext = "4-05.htm";
}
else if (quest0 == 1)
{
htmltext = "4-07.htm";
}
}
else if (quest0 == 0)
{
htmltext = "4-02.htm";
}
}
}
else if (cond == 18)
{
htmltext = "4-08.htm";
}
}
if (htmltext.isEmpty())
{
npc.showChatWindow(player);
}
return htmltext;
}
@Override
public void onKill(Npc npc, Player player, boolean isSummon)
{
final int npcId = npc.getId();
QuestState st = getQuestState(player, false);
for (int archonMinion = 21646; archonMinion < 21652; archonMinion++)
{
if (npcId == archonMinion)
{
final Party party = player.getParty();
if (party != null)
{
final List<QuestState> partyQuestMembers = new ArrayList<>();
for (Player player1 : party.getMembers())
{
final QuestState st1 = findQuest(player1);
if ((st1 != null) && st1.isCond(15) && player1.isInsideRadius2D(player, PlayerConfig.ALT_PARTY_RANGE))
{
partyQuestMembers.add(st1);
}
}
if (!partyQuestMembers.isEmpty())
{
final QuestState st2 = partyQuestMembers.get(getRandom(partyQuestMembers.size()));
giveHalishaMark(st2);
}
}
else
{
final QuestState st1 = findQuest(player);
if ((st1 != null) && st1.isCond(15))
{
giveHalishaMark(st1);
}
}
return;
}
}
for (int element : ARCHON_HALISHA_NORM)
{
if (npcId == element)
{
final QuestState st1 = findQuest(player);
if ((st1 != null) && st1.isCond(15))
{
// This is just a guess....not really sure what it actually says, if anything
autoChat(npc, _text[4].replace("PLAYERNAME", st1.getPlayer().getName()));
giveItems(player, _items[8], 1);
takeItems(player, _items[3], -1);
st1.setCond(16, true);
}
return;
}
}
for (int guardianAngel = 27214; guardianAngel < 27217; guardianAngel++)
{
if (npcId == guardianAngel)
{
final QuestState st1 = findQuest(player);
if ((st1 != null) && st1.isCond(6))
{
final int kills = st1.getInt("kills");
if (kills < 9)
{
st1.set("kills", Integer.toString(kills + 1));
}
else
{
giveItems(player, _items[5], 1);
st.setCond(7, true);
}
}
return;
}
}
if ((st != null) && (npcId != _mob[2]))
{
final QuestState st2 = findRightState(npc);
if (st2 != null)
{
final int cond = st.getCond();
if ((npcId == _mob[0]) && (cond == 8))
{
if (!player.isInParty() && (st == st2))
{
autoChat(npc, _text[12].replace("PLAYERNAME", player.getName()));
giveItems(player, _items[6], 1);
st.setCond(9, true);
}
cancelQuestTimer("Mob_1 has despawned", npc, st2.getPlayer());
st2.set("spawned", "0");
deleteSpawn(npc);
}
else if ((npcId == _mob[1]) && (cond == 15))
{
if (!player.isInParty())
{
if (st == st2)
{
autoChat(npc, _text[4].replace("PLAYERNAME", player.getName()));
giveItems(player, _items[8], 1);
takeItems(player, _items[3], -1);
st.setCond(16, true);
}
else
{
autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
}
}
cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
st2.set("spawned", "0");
deleteSpawn(npc);
}
}
}
else if (npcId == _mob[0])
{
st = findRightState(npc);
if (st != null)
{
cancelQuestTimer("Mob_1 has despawned", npc, st.getPlayer());
st.set("spawned", "0");
deleteSpawn(npc);
}
}
else if (npcId == _mob[1])
{
st = findRightState(npc);
if (st != null)
{
cancelQuestTimer("Archon Hellisha has despawned", npc, st.getPlayer());
st.set("spawned", "0");
deleteSpawn(npc);
}
}
else if (npcId == _mob[2])
{
st = findRightState(npc);
if (st != null)
{
st.setCond(18, true);
autoChat(npc, _text[13].replace("PLAYERNAME", player.getName()));
st.set("Quest0", "0");
cancelQuestTimer("Mob_2 has despawned", npc, player);
deleteSpawn(npc);
}
}
}
@Override
public void onSkillSee(Npc npc, Player player, Skill skill, List<WorldObject> targets, boolean isSummon)
{
if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) != player.getObjectId()))
{
final Player questPlayer = World.findObject(SPAWN_LIST.get(npc)).asPlayer();
if (questPlayer == null)
{
return;
}
for (WorldObject obj : targets)
{
if ((obj == questPlayer) || (obj == npc))
{
final QuestState st2 = findRightState(npc);
if (st2 == null)
{
return;
}
autoChat(npc, _text[5].replace("PLAYERNAME", player.getName()));
cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
st2.set("spawned", "0");
deleteSpawn(npc);
}
}
}
}
@Override
public String onTalk(Npc npc, Player player)
{
final QuestState st = getQuestState(player, true);
String htmltext = getNoQuestMsg(player);
final int npcId = npc.getId();
if ((npcId == _npc[0]) && st.isCompleted())
{
htmltext = getAlreadyCompletedMsg(player);
}
else if (player.getPlayerClass().getId() == getPrevClass(player))
{
switch (st.getCond())
{
case 0:
{
if (npcId == _npc[0])
{
htmltext = "0-01.htm";
}
break;
}
case 1:
{
if (npcId == _npc[0])
{
htmltext = "0-04.htm";
}
else if (npcId == _npc[2])
{
htmltext = "2-01.htm";
}
break;
}
case 2:
{
if (npcId == _npc[2])
{
htmltext = "2-02.htm";
}
else if (npcId == _npc[1])
{
htmltext = "1-01.htm";
}
break;
}
case 3:
{
if ((npcId == _npc[1]) && hasQuestItems(player, _items[0]))
{
if ((_items[11] == 0) || hasQuestItems(player, _items[11]))
{
htmltext = "1-03.htm";
}
else
{
htmltext = "1-02.htm";
}
}
break;
}
case 4:
{
if (npcId == _npc[1])
{
htmltext = "1-04.htm";
}
else if (npcId == _npc[2])
{
htmltext = "2-03.htm";
}
break;
}
case 5:
{
if (npcId == _npc[2])
{
htmltext = "2-04.htm";
}
else if (npcId == _npc[5])
{
htmltext = "5-01.htm";
}
break;
}
case 6:
{
if (npcId == _npc[5])
{
htmltext = "5-03.htm";
}
else if (npcId == _npc[6])
{
htmltext = "6-01.htm";
}
break;
}
case 7:
{
if (npcId == _npc[6])
{
htmltext = "6-02.htm";
}
break;
}
case 8:
{
if (npcId == _npc[6])
{
htmltext = "6-04.htm";
}
else if (npcId == _npc[7])
{
htmltext = "7-01.htm";
}
break;
}
case 9:
{
if (npcId == _npc[7])
{
htmltext = "7-05.htm";
}
break;
}
case 10:
{
if (npcId == _npc[7])
{
htmltext = "7-07.htm";
}
else if (npcId == _npc[3])
{
htmltext = "3-01.htm";
}
break;
}
case 11:
case 12:
{
if (npcId == _npc[3])
{
if (hasQuestItems(player, _items[2]))
{
htmltext = "3-05.htm";
}
else
{
htmltext = "3-04.htm";
}
}
break;
}
case 13:
{
if (npcId == _npc[3])
{
htmltext = "3-06.htm";
}
else if (npcId == _npc[8])
{
htmltext = "8-01.htm";
}
break;
}
case 14:
{
if (npcId == _npc[8])
{
htmltext = "8-03.htm";
}
else if (npcId == _npc[11])
{
htmltext = "11-01.htm";
}
break;
}
case 15:
{
if (npcId == _npc[11])
{
htmltext = "11-02.htm";
}
else if (npcId == _npc[9])
{
htmltext = "9-01.htm";
}
break;
}
case 16:
{
if (npcId == _npc[9])
{
htmltext = "9-02.htm";
}
break;
}
case 17:
{
if (npcId == _npc[9])
{
htmltext = "9-04.htm";
}
else if (npcId == _npc[10])
{
htmltext = "10-01.htm";
}
break;
}
case 18:
{
if (npcId == _npc[10])
{
htmltext = "10-05.htm";
}
break;
}
case 19:
{
if (npcId == _npc[10])
{
htmltext = "10-07.htm";
}
else if (npcId == _npc[0])
{
htmltext = "0-06.htm";
}
break;
}
case 20:
{
if (npcId == _npc[0])
{
if (player.getLevel() >= 76)
{
htmltext = "0-09.htm";
st.exitQuest(false);
addExpAndSp(player, 2299404, 0);
giveAdena(player, 5000000, true);
giveItems(player, 6622, 1); // XXX rewardItems?
final int playerClass = getPlayerClass(player);
final int prevClass = getPrevClass(player);
player.setPlayerClass(playerClass);
if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
{
player.setBaseClass(playerClass);
}
player.broadcastUserInfo();
cast(npc, player, 4339, 1);
}
else
{
htmltext = "0-010.htm";
}
}
break;
}
}
}
return htmltext;
}
private QuestState findQuest(Player player)
{
final QuestState st = getQuestState(player, false);
if (st != null)
{
if (getId() == 68)
{
for (int q = 0; q < 2; q++)
{
if (player.getPlayerClass().getId() == QUEST_CLASSES[1][q])
{
return st;
}
}
}
else if (player.getPlayerClass().getId() == QUEST_CLASSES[getId() - 67][0])
{
return st;
}
}
return null;
}
private void autoChat(Npc npc, String text)
{
npc.broadcastPacket(new NpcSay(npc.getObjectId(), ChatType.GENERAL, npc.getId(), text));
}
private void cast(Npc npc, Creature target, int skillId, int level)
{
target.broadcastSkillPacket(new MagicSkillUse(target, target, skillId, level, 6000, 1), target);
target.broadcastSkillPacket(new MagicSkillUse(npc, npc, skillId, level, 6000, 1), npc);
}
private void addSpawn(QuestState st, Npc mob)
{
SPAWN_LIST.put(mob, st.getPlayer().getObjectId());
}
private static Npc findSpawn(Player player, Npc npc)
{
if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) == player.getObjectId()))
{
return npc;
}
return null;
}
private void deleteSpawn(Npc npc)
{
if (SPAWN_LIST.remove(npc) != null)
{
npc.deleteMe();
}
}
private QuestState findRightState(Npc npc)
{
Player player = null;
QuestState st = null;
final Integer spawned = SPAWN_LIST.get(npc);
if (spawned != null)
{
player = World.getPlayer(spawned);
if (player != null)
{
st = player.getQuestState(getName());
}
}
return st;
}
private int getPlayerClass(Player player)
{
if (player.getPlayerClass().getId() == 0x81)
{
return _classId[1];
}
return _classId[0];
}
private int getPrevClass(Player player)
{
if (player.getPlayerClass().getId() == 0x81)
{
if (_prevClass.length == 1)
{
return -1;
}
return _prevClass[1];
}
return _prevClass[0];
}
private void giveHalishaMark(QuestState st)
{
if (st.getInt("spawned") == 0)
{
final Player player = st.getPlayer();
if (getQuestItemsCount(player, _items[3]) >= 700)
{
takeItems(player, _items[3], 20);
final int xx = st.getPlayer().getX();
final int yy = st.getPlayer().getY();
final int zz = st.getPlayer().getZ();
final Npc archon = addSpawn(_mob[1], xx, yy, zz, -1);
addSpawn(st, archon);
st.set("spawned", "1");
startQuestTimer("Archon Hellisha has despawned", 600000, archon, player);
autoChat(archon, _text[13].replace("PLAYERNAME", st.getPlayer().getName()));
archon.asAttackable().addDamageHate(st.getPlayer(), 0, 99999);
archon.getAI().setIntentionAttack(st.getPlayer());
}
else
{
giveItems(player, _items[3], getRandom(1, 4));
}
}
}
}