Saga of the Mystic Muse
- ID
- 89
- Название
- Saga of the Mystic Muse
- start_npcs_json
- []
- npc_ids_json
- []
- constants_json
- {}
- Статус разбора
- metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
- Источник
- game/data/scripts/quests/Q00089_SagaOfTheMysticMuse/Q00089_SagaOfTheMysticMuse.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] Grand Magister Arkenias: So, you want to become a Mystic Muse? You've chosen a noble path, my child! You'll undergo a process that transforms your Elven mind to one that approaches the realm of the gods! You'll receive the power sealed by the gods in the past that prevented Elves from developing their full potential! "How can I get this power?"
[0-010.htm] Grand Magister Arkenias: You can't transfer to another class yet. Improve your skills and return. (Only a character of level 76 or above can transfer to the Mystic Muse class. Don't abandon the quest until your class transfer is complete.)
[0-02.htm] Grand Magister Arkenias: So you want to become a Mystic Muse, eh? That path is too perilous for you to walk at this time. Get some more training, and come back and see me again. (Only a character of level 76 or above and of the Spellsinger class may undertake this quest.)
[0-03.htm] Grand Magister Arkenias: I didn't scare you off, huh? Well, I won't try to stop you. Just one more thing... The Tablet of Vision can't be read alone. Only by using the Stone of Commune can you decipher it. The Stone of Commune acts as a medium, and you absorb the information directly into your body! This is known as communing with the stone tablet. At one time Stones of Commune were quite rare, but they've been turning up in lots of places lately! I fear that there are unseen, foreign hands at work here... You should go and talk to Magister Alminas in Goddard Castle Town. He'll know best what you should do next... Take a copy of the guild bulletin with you!
[0-04.htm] Grand Magister Arkenias: To become a Mystic Muse you must find six Tablets of Vision. The tablets are scattered throughout the world. You must absorb the power from the six stone tablets into your body! Go and speak with Magister Alminas in Goddard Castle Town. He'll know what you should do next.
[0-05.htm] Grand Magister Arkenias: The gods have sealed the power in several parts of the world. The Tablet of Vision is the form in which the power is sealed. You must absorb into your body all the information contained in the six stone Tablets of Vision throughout the world to obtain the power. Absorb the power from all six stone tablets, then come back to me... I'll transform you into a Mystic Muse... But, I must warn you... You've chosen a difficult path! Are you sure you wish to become a Mystic Muse? "I wish to become a Mystic Muse."
[0-06.htm] Grand Magister Arkenias: You've obtained the power of all the stone tablets! Good job! What? Why are you looking at me like that? You want the truth, eh? Very well. What did Feyshar tell you? Oh well, no use crying over spilt milk... Since I'm an Elf, I've always dreamed of being a top level wizard! You wouldn't believe what I've had to do just to get where I am now! But this isn't enough! I meant to stay on top forever! I couldn't allow anyone under me to grow stronger! That's why I tried to stop your class transfer... But you were tougher than I anticipated! The Fallen Angel Allector tried to stop you but failed. At the last stone tablet, I tried to stop you myself, but that busybody Feyshar interfered... I could've taken on both of you lightweights! "So why didn't you?"
[0-07.htm] Grand Magister Arkenias: While fighting you, I came to a realization! I was wrong... I was just trying to hold onto my position. I'd forgotten what it's like to compete with powerful opponents, all determined to win first place! I realized that you could possibly be my equal! If I continued to fight young up-and-comers like you, I could maintain my strength! That's why I withdrew. Forgive me. And, thank you! Congratulations! You're officially a Mystic Muse!
[0-08.htm] Grand Magister Arkenias: While fighting you, I came to a realization! I was wrong... I was just trying to hold onto my position! I forgot what it was like to compete with many powerful opponents, all determined to win first place! I realized that, with practice, you could possibly be my equal! If I continued to fight young up-and-comers like you, I could maintain my strength! That's why I withdrew. Forgive me, and thank you! However I can't let you transfer classes yet. Improve your abilities and come back. (Only a character of level 76 or above can transfer to the Mystic Muse class. Don't abandon the quest until your class transfer is complete.)
[0-09.htm] Grand Magister Arkenias: Thank you for your hard work. Congratulations! You're now a Mystic Muse!
[1-01.htm] Information Broker Mist: I know the silver light wanderer is pretending to be Magister Alminas of Goddard Castle Town. I have the report he requested. This investigation was difficult, so I can't give it for free! "What do you want?"
[1-02.htm] Information Broker Mist: Bring me some Ice Crystals and I'll give you the report I prepared for the Truth Scholar. You should be able to get some from Chef Jeremy if you help him prepare for the upcoming cooking contest.
[1-03.htm] Information Broker Mist: You brought the ice crystal! "Here it is."
[1-04.htm] Information Broker Mist: Give the Investigative Report to the silver light wanderer who is pretending to be Magister Alminas in Goddard Castle Town!
[1-05.htm] Information Broker Mist: I've heard that you can find Ice Crystals in this hot springs area. I've been suffering from chronic back pain lately, and I'd like to try to make an ice pack with them. Help Chef Jeremy prepare for the upcoming cooking competition and he'll give you some.
[1-06.htm] Information Broker Mist: Ah! So nice and cool. Now my back ache is gone! Give this report to the silver light wanderer.
[10-01.htm] Tablet of Vision: Someone nearby has the Stone of Commune. Examine the area.
[10-02.htm] Tablet of Vision: A vision appears of two men... The man being pursued has the Stone of Commune.
[10-03.htm] Tablet of Vision: Listen to Feyshar first.
[10-04.htm] Tablet of Vision: Someone nearby has the Stone of Commune, but it's too noisy right now. Wait until it quiets down.
[10-05.htm] Tablet of Vision: The tablet is covered with indecipherable hieroglyphs. Commune with the Tablet of Vision.
[10-06.htm] Tablet of Vision: Thoughts beyond understanding race through your mind. Laughter floats on the breeze... A man announces the birth of another Hero. The woman in blue disagrees... This is the last time she'll see the child! Communion with the six Tablets of Vision is complete. Return to Grand Magister Arkenias.
[10-07.htm] Tablet of Vision: Further communion with this tablet would be futile. Communion with the six Tablets of Vision is complete. Now return to Grand Magister Arkenias.
[11-01.htm] Magister Alminas: Now I must continue my investigation about who is trying to stop you from becoming a Mystic Muse. I'll need this stone myself, but I can tell you how to get your own. "How do I get one?"
[11-02.htm] Magister Alminas: You can get the next stone by killing the Archon of Halisha in the Four Sepulchers. You'll need help to gain entry. If that proves too difficult, go to the Shrine of the Loyal and slay Halisha's minions. If you collect 700 of Halisha's Marks, the Archon will appear. The minions include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights, and Shrine Guards.
[11-03.htm] Magister Alminas: You can get the next stone by killing the Archon of Halisha in the Four Sepulchers. You'll need help to gain entry. If that proves too difficult, go to the Shrine of the Loyal and slay Halisha's minions. If you collect 700 Halisha's Marks, the Archon will appear. The minions include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights, and Shrine Guards.
[2-01.htm] Magister Alminas: Arkenias didn't know that I'm conducting an investigation under the guise of Alminas. In a letter I intercepted Arkenias wanted Alminas to discourage you from becoming a Mystic Muse! Don't worry, since I'm not bound to him I can still tell you what you need to do to become one. "What are you investigating?"
[2-02.htm] Magister Alminas: Visit Information Broker Mist at the hot springs resort and pick up the Investigative Report I requested. Tell him the silver light wanderer sent you. Bring the report and I'll tell you how to get the power of the six stone tablets.
[2-03.htm] Magister Alminas: Thanks for the report. This merits further investigation. To become a Mystic Muse, you'll need a Stone of Commune for each of the six stone tablets. Use the stones to commune with the tablets and your path will become clear. Here's the first Stone of Commune, take it to the Tablet of Vision. "How will my path become clear?"
[2-04.htm] Magister Alminas: Commune with the Tablet of Vision south of the Tower of Insolence with the Stone of Commune I gave you. The path will then become clear.
[2-05.htm] Magister Alminas: I'll tell you in due time. Meet with Information Broker Mist at the hot springs resort. Get the Investigative Report I asked for. Tell him the silver light wanderer sent you. Bring back the report and I'll tell you of the six stone tablets.
[2-06.htm] Magister Alminas: Stones of commune and Tablets of Vision have a magical mutual attraction. You can use this force to locate the Tablets of Vision. Put simply, when you have a Stone of Commune, the location of the corresponding Tablet of Vision will appear in your mind. Once you find the next stone, you will see where to find the next tablet. After you commune with it, the location of the next Stone of Commune will be revealed to you. This process will become clearer to you as you move along. Now, take the first Stone of Commune I gave you and find the Tablet of Vision south of the Tower of Insolence!
[3-01.htm] Magister Alminas: You say you fought with Allector, the fallen angel? How could he have escaped the prison in the Ivory Tower? He must have had help. But who? It could only be .... I shouldn't say, I need more proof. I have the Stone of Commune, but it's unstable. You'll need the other fragment. "How can I get it?"
[3-02.htm] Magister Alminas: Then visit the Ketra Orcs to get the missing fragment, the Divine Stone of Wisdom. If you earn the trust of Asefa, guide of dead souls, through Ketra's Messenger Wahkan and prove to her your wisdom, you'll find it. If you change your mind halfway, you can get it from the best Shaman of Varka Silenos, Soul Guide Udan Mardui through Varka's Messenger Naran Ashanuk., just bring it to me.
[3-03.htm] Magister Alminas: Then visit the Varka Silenos to get the missing fragment, the Divine Stone of Wisdom. If you earn the Soul Guide Udan Mardui through Varka's Messenger Naran Ashanuk and prove to her your wisdom, you'll find it. If you change your mind halfway, you can get it from the best Shaman of Ketra Orcs, Soul Guide Asefa through through Ketra's Messenger Wahkan, just bring it to me.
[3-04.htm] Magister Alminas: Go to the Ketra Orcs or the Varka Silenos to get the missing fragment, the Divine Stone of Wisdom . They both know the mysterious knowledge of the stone, but not its exact use. They'll give it to the wisest of the tribe. So, it is presented as some kind of mark for ‘the wisest man of the tribe.' If you earn the trust of Asefa, guide of dead souls, through Ketra's Messenger Wahkan and prove to her your wisdom, you'll find it. Or, you can get the Divine Stone of Wisdom from Soul Guide Udan Mardui through Varka's Messenger Naran Ashanuk by gaining his trust and proving your wisdom. Either way is fine.
[3-05.htm] Magister Alminas: The Divine Stone of Wisdom! Good work. My hunch was right. The only person who could have freed Allector is indeed the Grand Magister of the Ivory Tower! Never let your guard down, there are powerful forces trying to stop you! Shall I combine the stones now? "By all means!"
[3-06.htm] Magister Alminas: Take the Stone of Commune I gave you and find the Tablet of Vision on the north side of the Varka Silenos barracks.
[3-07.htm] Magister Alminas: Go to the Ketra Orcs or the Varka Silenos to get the Divine Stone of Wisdom, a fragment of the Stone of Commune. They know of its powerful magic, but not its exact use. They'll reward the wisest of their tribe with it. You'll need to earn the trust of Asefa, chief shaman of the Ketra Orcs, or Udan Mardui, chief shaman of the Varka Silenos. Which side will you choose? The Ketra Orcs The Varka Silenos
[3-08.htm] Magister Alminas: The Stone of Commune is now complete. Find the Tablet of Vision on the north side of the Varka Silenos barracks.
[4-01.htm] Silver Feyshar: Damn it. I'll miss him like this. Help me! He's the source of your trouble.
[4-010.htm] Silver Feyshar: I missed Arkenias, but I robbed him of the Stone of Commune! Either he was hiding it to try to interrupt, or he's guarding the tablet to prevent you communing with it. He didn't put up much of a fight, he could easily have handled us both. This should finish your class transfer. See you later, I must follow Arkenias to find out the truth. "Wait!"
[4-011.htm] Silver Feyshar: I missed Arkenias, but I robbed him of the Stone of Commune! Either he was hiding it to try to interrupt, or he's guarding the tablet to prevent you communing with it. He didn't put up much of a fight, he could easily have handled us both. This should finish your class transfer. See you later, I must follow Arkenias to find out the truth.
[4-02.htm] Silver Feyshar: Damn it! I'll miss him like this.
[4-03.htm] Silver Feyshar: Missed again! I must continue the chase.
[4-04.htm] Silver Feyshar: Damn it! I'll miss him like this. Help me! He's the source of your trouble.
[4-05.htm] Silver Feyshar: Damn it! I'll miss him like this.
[4-06.htm] Silver Feyshar: Let me introduce myself. I'm Feyshar, not Alminas as you may remember me. Somebody is hindering the transfer to Mystic Muse, so I was investigating in disguise. The real Alminas is probably back to Goddard Castle Town by now. As I suspected, Grand Magister Arkenias is behind it! You showed up while I was finding out the truth. You saw him in disguise before. Listen
[4-07.htm] Silver Feyshar: Let me introduce myself. I'm Feyshar, not Alminas as you may remember me. Somebody is hindering the transfer to Mystic Muse, so I was investigating in disguise. The real Alminas is probably back to Goddard Castle Town by now. As I suspected, Grand Magister Arkenias is behind it! You showed up while I was finding out the truth. You saw him in disguise before. Listen
[4-08.htm] Silver Feyshar: Damn it! He won't talk easily. Commune with the Tablet of Vision using the stone I gave you.
[4-09.htm] Silver Feyshar: I'll follow him to find the truth. Commune with the Tablet of Vision using the stone I gave you.
[5-01.htm] Tablet of Vision: The Tablet of Vision is engraved with many incomprehensible hieroglyphs. 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 she were quietly laughing at you... You sense the location of the next Stone of Commune... It is being held by the Guardians of Forbidden Knowledge beside the Tablet of Vision in the southern Valley of the Saints.
[5-03.htm] Tablet of Vision: Further communion with this tablet is futile. You must go and find the next Stone of Commune! You sense that the next stone is being held by the Guardians of Forbidden Knowledge beside the Tablet of Vision in the southern Valley of the Saints.
[6-01.htm] Tablet of Vision: You must have a certain Stone of Commune to access this Tablet of Vision. You sense that one of the Guardians of Forbidden Knowledge protecting this tablet has the Stone of Commune.
[6-02.htm] Tablet of Vision: The Tablet of Vision is engraved with many incomprehensible hieroglyphs. Commune with the Tablet of Vision.
[6-03.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A female voice seems to float on by as if she were quietly laughing at you... You sense the location of the next Stone of Commune... It is being held by a suspicious person beside the Tablet of Vision in the southern station of the Varca Silenos.
[6-04.htm] Tablet of Vision: Further communion with this tablet is futile. You must go and find the next Stone of Commune! You sense that the next stone is being held by a suspicious person beside the Tablet of Vision in the southern station of the Varca Silenos.
[7-01.htm] Tablet of Vision: I feel the Stone of Commune nearby. Examine the area.
[7-02.htm] Tablet of Vision: Fallen Angel Allector? He must be the suspicious one that I felt before. I sense that he has the Stone of Commune.
[7-03.htm] Tablet of Vision: The time has come to get the first Stone of Commune. Destroy Allector and take his stone.
[7-04.htm] Tablet of Vision: Someone nearby must have the Stone of Commune! It's too noisy now. Try again later when things quiet down a bit.
[7-05.htm] Tablet of Vision: The Tablet of Vision is engraved with many incomprehensible hieroglyphs. Commune with the Tablet of Vision.
[7-06.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A vision appears of a woman in blue. And suddenly, the location of the next Stone of Commune becomes clear! Magister Alminas of Goddard Castle Town has it.
[7-07.htm] Tablet of Vision: Further communion with this tablet is futile. You must find the next Stone of Commune! Magister Alminas of Goddard Castle Town has it.
[8-01.htm] Tablet of Vision: The tablet is engraved with incomprehensible hieroglyphs. Commune with the Tablet of Vision.
[8-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You hear a man's voice lingering in the air... Suddenly, the location of the next Stone of Commune is clear! Magister Alminas of Goddard Castle Town has it.
[8-03.htm] Table of Vision: Further communion with this tablet would be futile. Get the next Stone of Commune from Magister Alminas of Goddard Castle Town.
[9-01.htm] Tablet of Vision: The Tablet of Vision is useless without a Stone of Commune. Kill the Archon of Halisha and take it from him.
[9-02.htm] Tablet of Vision: The tablet is covered with indecipherable hieroglyphs. Commune with the Tablet of Vision.
[9-03.htm] Tablet of Vision: A sharp blast of knowlege courses through your cranium! A vision appears... of a black knight! The location of the next Stone of Commune flashes into my mind! The next Stone of Commune... There is a suspicious figure near the next Tablet of Vision in the southeast of the Hunters' Town. It seems the figure has the Stone of Commune.
[9-04.htm] Tablet of Vision: Communing with this tablet is completed. It's time to find the next Stone of Commune. Near the Tablet of Vision in the southeast of the Hunters' Town, there is a suspicious figure apparently having the Stone of Commune.
Исходник условий и наград (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.Q00089_SagaOfTheMysticMuse;
import quests.AbstractSagaQuest;
/**
* @author Emperorc
*/
public class Q00089_SagaOfTheMysticMuse extends AbstractSagaQuest
{
public Q00089_SagaOfTheMysticMuse()
{
super(89, "Saga of the Mystic Muse");
_npc = new int[]
{
30174,
31627,
31283,
31283,
31643,
31646,
31648,
31651,
31654,
31655,
31658,
31283
};
_items = new int[]
{
7080,
7530,
7081,
7504,
7287,
7318,
7349,
7380,
7411,
7442,
7083,
0
};
_mob = new int[]
{
27251,
27238,
27255
};
_classId = new int[]
{
103
};
_prevClass = new int[]
{
0x1b
};
_x = new int[]
{
119518,
181227,
181215
};
_y = new int[]
{
-28658,
36703,
36676
};
_z = new int[]
{
-3811,
-4816,
-4812
};
_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));
}
}
}
}