Saga of the Ghost Hunter
- ID
- 81
- Название
- Saga of the Ghost Hunter
- start_npcs_json
- []
- npc_ids_json
- []
- constants_json
- {}
- Статус разбора
- metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
- Источник
- game/data/scripts/quests/Q00081_SagaOfTheGhostHunter/Q00081_SagaOfTheGhostHunter.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] Black Cat: Are you the person sent by the union? Then, please listen carefully to what I'm about to tell you. "I'm listening."
[0-010.htm] Black Cat: Within your body hides an amazing power, but you are not skilled enough to control it yet. What a pity! Improve your skills and come back. (Only a character of level 76 or above is allowed to transfer to another class. Be careful. You cannot change occupation if you stop Quest!)
[0-02.htm] Black Cat: I'm really starting to wonder whether Bernard is the right person to send me challengers! I think he's lost his mind over his stupid coins! (This quest may only be undertaken by a Abyss Walker of level 76 or above.)
[0-03.htm] Black Cat: Very well, I'll tell you. If you study the history of the ancient heroes, you'll find that at least a few of them must have obtained the forbidden power! Without it, they never could've accomplished what they did! Master Drakon, my relative, is one such hero! It's obvious that he knows something, but he always makes excuses, never sharing anything he knows! Why don't you try talking to him?
[0-04.htm] Black Cat: Did you meet Master Dra? What are you waiting for? Go to him immediately!
[0-05.htm] Black Cat: At one time, I was considered the most likely to succeed in the Hunters Union! Unfortunately, I made the mistake of challenging the power that was forbidden by the gods! This power allows whoever controls it to transcend Human limitations! But look where it got me! My body was totally ruined, and when I could no longer challenge the power, I was expelled from the union by my jealous rivals! I sank into a mass of self-pity and regret! But then, I had an idea! Maybe I can't do it personally, but I can certainly train and send someone on my behalf! Using my brain rather than physical force, and overcoming many political obstacles, I took control of the union! While in that position, I never found the competent person I needed. When I resigned, I was promised by the president of the union that I would be supplied with a competent person! He seemed credible then, he wasn't so obsessed with his coins at that point... Are you up to the challenge? Are you willing to risk injuries such as mine, or worse? Are you brave enough to seek the power? "I'm ready to take the challenge."
[0-06.htm] Black Cat: Sometimes I doubt whether anyone can ever bring the power to me. You showed great promise... Could you have really gotten it this time? "I've got the power!"
[0-07.htm] Black Cat: At last, my lifetime of work has borne fruit! Great job! You've made me very proud. I'll have Bernard announce it to the guild. We have a very special honor to bestow upon you who have overcome such unimaginable hardships. You shall henceforth be known as a Ghost Hunter!
[0-08.htm] Black Cat: Within your body hides an amazing power, but you are not skilled enough to control it yet. What a pity! Improve your skills and come back. (Only a character of level 76 or above is allowed to transfer to another class. Be careful. You cannot change occupation if you stop Quest!)
[0-09.htm] Black Cat: At last, my lifetime of work has borne fruit! Great job! You've made me very proud. I'll have Bernard announce it to the guild. We have a very special honor to bestow upon you who have overcome such unimaginable hardships. You shall henceforth be known as a Ghost Hunter!
[1-01.htm] Chef Donath: Master Drakon wants my secret recipe book, eh? Sorry to break it to you, but there's no such thing as a secret recipe! My skill comes from endless training and trial and error. Of course, I did take a few notes along the way... "Please, give me the recipe book!"
[1-02.htm] Chef Donath: Bring me an ice crystal and I'll give you my recipe book.
[1-03.htm] Chef Donath: Excellent! Now can I have it? "Here you go."
[1-04.htm] Chef Donath: Master Drakon must be starving! Return to him now.
[1-05.htm] Chef Donath: I've spent a lot of time and energy on this cookbook, and I won't just give it to you for free! Bring me the ice crystals. You can find them from a monster in the hot spring area... You must go and find Chef Jeremy. He is working there. You must help him make soy sauce. He will show you where the ice crystals can be found.
[1-06.htm] Chef Donath: This is my entire collection of recipes! If you're only interested in general dishes, you'll just need one page.
[10-01.htm] Tablet of Vision: You feel something strange. Examine the area.
[10-02.htm] Tablet of Vision: A powerful energy appears.
[10-03.htm] Tablet of Vision: The tablet is still and dark. Speak with the Hero.
[10-04.htm] Tablet of Vision: Someone is currently communing with the tablet. Try again later.
[10-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.
[10-06.htm] Tablet of Vision: An old, familiar energy enters your body. Suddenly, a new, even more intense feeling appears! All the pleasure, pain, anger and love of the previous challengers of this power course through your veins! The screams you hear are your own. But are they real or imagined? You feel consciousness slipping away... ... ... And then you awake... Your lips move, but no words are formed. Could this be the end?
[10-07.htm] Tablet of Vision: This tablet is useless. Return to Black Cat.
[11-01.htm] Hermit: I can't remember the last time anyone came this far just to see me! Are you ready for the second test? "I'm ready."
[11-02.htm] Hermit: Kill the Archon of Halisha! He can be found in the Sepulchers, or by attacking his minions on the north side of the Wall of Argos. Kill him and take possession of the fifth Stone of Commune.
[11-03.htm] Hermit: Ah, yes, the second test... the Archon of Halisha has the fifth Stone of Commune. After you get it from him, take it to the northwestern end of the Wall of Argos. Commune with the Tablet of Vision there. Slaying the Archon of Halisha isn't going to be easy! He can usually be found inside the Sepulchers, but if you attack his minions on the north side of the Wall of Argos, that usually draws him out! Good luck! Your success means that my long wait is finally over!
[2-01.htm] Master Drakon: Secrets of my ancestors? What are you talking about? Why is this dish so tasteless? Rats! I've ruined dinner again! I wish I could cook as good as Chef Donath. Maybe you could get me his secret recipe book? "I'll get it!"
[2-02.htm] Master Drakon: Where's Donath's secret recipe book? I'll tell you the secret of my ancestors if you get it for me.
[2-03.htm] Master Drakon: You've brought me Chef Donath's secret recipes! Give it to me. "Here's the book."
[2-04.htm] Master Drakon: Didn't I tell you? The first Tablet of Vision is south of the Tower of Insolence.
[2-05.htm] Master Drakon: You can get it for me? It would break my family's code to tell you my ancestors' secrets. I'll do it if you get me Chef Donath's secret recipe book!
[2-06.htm] Master Drakon: These recipes are fabulous! I'll only tell the story of my ancestors once, so listen well. The story says that the power was sealed by Einhasad, but unbeknownst to him, Gran Kain and Eva took a portion of it and sealed it into stone tablets that they then distributed throughout the world. The power of the tablets is obtained by communing with them using a Stone of Commune. By going through many trials, my ancestors collected that power! Here's the remaining Stone of Commune that's been in my family for generations. You need this to get the power of Tablet. The location of the first Tablet is in the south of Tower of Insolence. Go look for it.
[3-01.htm] Hermit: I've been expecting you. You follow in the footsteps of giants! I've been waiting for many, many years... Since the gods told me to expect a hero such as you! I have the stone of vision you seek. First, however, you must prove that you are who you appear to be... Will you take a test? Yes, I will take the test.
[3-02.htm] Hermit: Well, go to the Ketra Orcs and get the Divine Stone of Wisdom. Like I said, Ketra Orcs are not the ones who trust strangers easily. To obtain Ketra Orcs' trust, you should go to Ketra's Messenger Wahkan in the Ketra Orc Outpost, and carry out difficult tasks that he asks you to do. You must earn the trust of the Ketra Orcs! This won't be an easy task, and will take much time and patience. Remember to never help their mortal enemies, the Varka Silenos! You'd never regain their trust!
[3-03.htm] Hermit: Well, go to the Varka Silenos and get the Divine Stone of Wisdom. Like I said, Varka Silenos are not the ones who trust strangers easily. To obtain Varka Silenos' trust, you should go to Varka's Messenger Naran Ashanuk in the Varka Silenos Outpost, and carry out difficult tasks that he asks you to do. You must earn the trust of the Ketra Orcs! This won't be an easy task, and will take much time and patience. Remember to never help their mortal enemies, the Ketra Orcs! You'd never regain their trust!
[3-04.htm] Hermit: Obtaining it won't be an easy task. This is your chance to prove that you are truly the one to succeed the legend! After earning the trust of the tribe you chose and being regarded as a true friend by them, you can obtain the Divine Stone of Wisdom. For Ketra Orcs, you must go to Ketra's Messenger Wahkan in the Ketra Orc Outpost whereas you must go see Varka's Messenger Naran Ashanuk in the Varka Silenos Outpost for Varka Silenos.
[3-05.htm] Hermit: Have you brought the Divine Stone of Wisdom? "Here is the Divine Stone of Wisdom."
[3-06.htm] Hermit: The Tablet of Vision can be found in the northern part of the Varka Silenos stronghold. Please don't disappoint us.
[3-07.htm] Hermit: This test has two paths. The Ketra Orcs and the Varka Silenos have long been at war, and both tribes are infamous for their hatred of each other and their cruelty in battle. Select one of the two tribes and obtain from them the Divine Stone of Wisdom. They give that only to those who they consider to be their true friend. Which tribe would you like to choose? "I'll fight for the Ketra Orcs!" "I'll fight for the Varka Silenos!"
[3-08.htm] Hermit: You've passed the first test. You've already come further than most who've attempted it! You're really starting to look like the hero I've been waiting for! Further dangers await you, however... You must always try to keep your cool. Take this Stone of Commune to the Tablet of Vision in the northern part of the Varka Silenos stronghold. You'll get further instruction from the Tablet of Vision.
[4-01.htm] Aria Firstmatter: That's the very least you could do! Pay attention! Don't you have any sense of responsibility?
[4-010.htm] Aria Firstmatter: Oh, really? Is that right? Hmmm! Hey, newbie! Here's the Stone of Commune! You've been looking for it, haven't you? Well, here you go! Enjoy! "Wait! Hold on!"
[4-011.htm] Aria Firstmatter: This is the Stone of Commune. If we're lucky, we shall never meet again. Now, if you'll excuse me, I have more newbies that need their diapers changed. Good luck!
[4-02.htm] Aria Firstmatter: If I wanted your help I would've demanded it! Wait your turn!
[4-03.htm] Aria Firstmatter: Oh, I missed it! I must be losing my touch! Age is slowing me down... Oh, well...I'll just have to wait for another chance!
[4-04.htm] Aria Firstmatter: You've got long way to go! Is that the best you can do?
[4-05.htm] Aria Firstmatter: Stop bugging me! If I wanted your help I would've told you so! Wait your turn!
[4-06.htm] Aria Firstmatter: Not bad, newbie! Of course, you've still got a lot to learn, but you show promise! I helped you out this time. Don't expect it to happen again! "I could've done it without you!"
[4-07.htm] Aria Firstmatter: Wow, not too bad! Careful you don't lose your diaper, newbie! Ha! Did I embarrass you? Here, take this Stone of Commune, and don't say I never did anything for you! Take the Stone of Commune
[4-08.htm] Aria Firstmatter: That's enough, Mr. Azrael! So, you want to help little old me? Never mind that! Just commune with the tablet!
[4-09.htm] Aria Firstmatter: Do you see that stone of vision? Commune with it! By the way, I think we'll be seeing each other more often! You've joined the game of the gods! Welcome!
[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: You feel a strange, disconnected force enter your body. The tablet seems to be communicating with you. You see a vision of a tablet much like this one, protected by several ominous guardians. One of them is holding the next Stone of Commune! It appears that they're located in the northwest part of the Valley of Saints! You feel the Tablet of Vision weakening.
[5-03.htm] Tablet of Vision: The tablet goes completely dark. You must retrieve the Stone of Commune from the Guardians of Forbidden Knowledge!
[6-01.htm] Tablet of Viision: There are no changes. I may need the Stone of Commune that the Guardians of Forbidden Knowledge have.
[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: You feel a strange, disconnected force enter your body. You begin to see visions. You see a landscape, I can see the Tablet that has the same shape as this Tablet. It seems to be located in the southeast of Ketra Orc Outpost. You feel the Tablet of Vision weakening.
[6-04.htm] Tablet of Vision: The tablet goes completely dark. Your destiny lies elsewhere.
[7-01.htm] Tablet of Vision: You sense evil around you. Examine the area.
[7-02.htm] Tablet of Vision: It's Ezekiel! I read about him in that book I got from Black Cat!
[7-03.htm] Tablet of Vision: Ezekiel must be dealt with first.
[7-04.htm] Tablet of Vision: Someone else is currently communing with the Tablet of Vision. Please wait.
[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: You feel a strange, disconnected force enter your body. You begin to see visions. You see a landscape, I see a male Human. The house engulfed in a dark aura... The are appears to be located near the Ketra Orc Outpost. You feel the Tablet of Vision weakening.
[7-07.htm] Tablet of Vision: The power is gone. Find the man you saw in the vision!
[8-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.
[8-02.htm] Tablet of Vision: You feel a strange, disconnected force enter your body. At that moment, a vision appears of a man engulfed by a dark aura. It seems he is on the road from the Wall of Argos to Goddard Castle. You feel the Tablet of Vision weakening.
[8-03.htm] Tablet of Vision: The tablet is still and dark. Find the man you saw in the vision.
[9-01.htm] Tablet of Vision: The tablet is still and dark. As the hermit said, kill the Archon of Halisha and take the stone from him!
[9-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.
[9-03.htm] Tablet of Vision: You feel a strange, disconnected force enter your body. You begin to see visions. You see a landscape, I see a male Human. I see a monument that looks like the Tablet of Vision. It looks like it is located somewhere in the northwest of the Forest of the Dead. The force out of the Tablet grows less and less.
[9-04.htm] Tablet of Vision: The tablet is still and dark. Find the next Stone of Commune now.
Исходник условий и наград (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.Q00081_SagaOfTheGhostHunter;
import quests.AbstractSagaQuest;
/**
* @author Emperorc
*/
public class Q00081_SagaOfTheGhostHunter extends AbstractSagaQuest
{
public Q00081_SagaOfTheGhostHunter()
{
super(81, "Saga of the Ghost Hunter");
_npc = new int[]
{
31603,
31624,
31286,
31615,
31617,
31646,
31649,
31653,
31654,
31655,
31656,
31616
};
_items = new int[]
{
7080,
7518,
7081,
7496,
7279,
7310,
7341,
7372,
7403,
7434,
7104,
0
};
_mob = new int[]
{
27301,
27230,
27304
};
_classId = new int[]
{
108
};
_prevClass = new int[]
{
0x24
};
_x = new int[]
{
164650,
47391,
47429
};
_y = new int[]
{
-74121,
-56929,
-56923
};
_z = new int[]
{
-2871,
-2370,
-2383
};
_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));
}
}
}
}