Saga of the Hell Knight
- ID
- 95
- Название
- Saga of the Hell Knight
- start_npcs_json
- []
- npc_ids_json
- []
- constants_json
- {}
- Статус разбора
- metadata_only; dynamic Java conditions/rewards retained in source; unresolved starts: []
- Источник
- game/data/scripts/quests/Q00095_SagaOfTheHellKnight/Q00095_SagaOfTheHellKnight.java
NPC квеста
Записей нет.
Условия уровней: выражения из Java
if (player.getLevel() < 76) if (player.getLevel() < 76) if (player.getLevel() >= 76)
Выдача предметов, адены и опыта: выражения из Java
giveItems(player, _items[10], 1); addExpAndSp(player, 2299404, 0); giveAdena(player, 5000000, true); giveItems(player, 6622, 1); giveItems(player, _items[1], 1); giveItems(player, _items[4], 1); giveItems(player, _items[7], 1); giveItems(player, _items[9], 1); giveItems(player, _items[9], 1); giveItems(player, _items[8], 1); giveItems(player, _items[5], 1); giveItems(player, _items[6], 1); giveItems(player, _items[8], 1); addExpAndSp(player, 2299404, 0); giveAdena(player, 5000000, true); giveItems(player, 6622, 1); // XXX rewardItems? giveItems(player, _items[3], getRandom(1, 4));
Квесты содержат динамические условия Java. Выражения выдачи включают промежуточные предметы, варианты и случайные награды; это не гарантированная награда. Константы приведены выше. Полные условия — в исходнике.
Тексты квеста
[0-01.htm] Dark Knight Mordred: Hmm... So, you want to be a Hell Knight, eh? I'm glad you came! Well, you'll have to prove yourself by completing a mission! Have you heard of a Dark Avenger named Waldstein? He was sent out some time ago in pursuit of the Death Lords, and hasn't been heard from since. Please find out what happened to him! It's been rumored that he actually joined the Death Lords! Our guild is under a lot of pressure to deal with this matter, one way or the other. Will you investigate this for us? There have been reports that Waldstein was seen in the vicinity of the Tablet of Vision. You may need to undertake the Pilgrimage of the Tablet of Vision if you're going to find him... "What is the Pilgrimage of the Tablet of Vision?"
[0-010.htm] Dark Knight Mordred: You're still not quite ready for a class transfer. Come back when you're older! (Only a character of level 76 or above may transfer to the Hell Knight class. Don't abandon the quest until class transfer is complete.)
[0-02.htm] Dark Knight Mordred: You, a Hell Knight? Ha! Come back when you've grown up! (This quest may only be undertaken by a Dark Avenger of level 76 or above.)
[0-03.htm] Dark Knight Mordred: Will you find Waldstein for us? As I said, Waldstein's been seen near the Tablet of Vision recently. He's probably paying homage to it... Join the pilgrims of the Tablet of Vision so you can follow Waldstein. Find out what he's up to. Speak with Guard Bayard of Goddard Castle Town. He'll tell you what you need to do next. You should take a copy of the guild bulletin with you!
[0-04.htm] Dark Knight Mordred: Please try and find Waldstein near the Tablet of Vision. He was dispatched in pursuit of the Death Lords, and rumors persist that he's joined them! Join the Pilgrimage of the Tablet of Vision and find out what he's up to. Visit Guard Bayard of Goddard Castle Town. He'll tell you what to do next.
[0-05.htm] Dark Knight Mordred: Haven't you heard? For a Dark Avenger to become a Hell Knight, he must leave the Human realm and enter the Realm of the Gods! Basically, he must receive the power that was forbidden by the gods. This power was sealed by the gods and scattered throughout the world, to keep the Humans from gaining their full potential. The Tablets of Vision are the keepers of this power. When you absorb the information from all six Tablets of Vision, you'll gain a power that's far superior to any that anyone has ever possessed! Such is the path of the Hell Knight. Waldstein's been spotted lurking near the Tablets of Vision. Find him and see if it's true that he's joined the Death Lords. "I'll do it!"
[0-06.htm] Dark Knight Mordred: Ah, you're back! Do you have news of Waldstein? "Waldstein didn't join the Death Lords."
[0-07.htm] Dark Knight Mordred: What a relief! I should've known not to listen to rumors! By the way, congratulations on completing the pilgrimage of the Tablet of Vision! You're more that qualified to be a Hell Knight! In fact, I'll promote you myself! Congratulations! You're a a Hell Knight!
[0-08.htm] Dark Knight Mordred: Oh, I should've known that Waldstein wouldn't join the Death Lords! This should stop any actions against Waldstein... By the way, congratulations on completing the Pilgrimage of the Tablet of Vision! You surely earned the right to be a Hell Knight. If I could, I'd transfer you myself right now, but unfortunately... You're not quite ready for a class transfer. Come back when you're older! (Only a character of level 76 or above may transfer to the Hell Knight class. Don't abandon the quest until class transfer is complete.)
[0-09.htm] Dark Knight Mordred: Thanks for your hard work! Congratulations, you're a Hell Knight! Good job!
[1-01.htm] Information Broker Bavarin: Guard Bayard of Goddard Castle Town? It sounds so strange hearing him called that! He was once Captain of the Knights! He got mixed up in the intrigues within the Order of the Knights and became a scapegoat! He was demoted to guard! Poor man! Well, anyway, I have the report that Mr. Bayard requested. This was a very complicated investigation, so the information won't be free... "What do you want?"
[1-02.htm] Information Broker Bavarin: Bring me some ice crystals and I'll give you the report for the Truth Scholar. Speak with Chef Jeremy, who's getting ready for a cooking contest. He can tell you where to find some ice crystals.
[1-03.htm] Information Broker Bavarin: So, this is the ice crystal I've heard so much about? Hand it over! "Here it is."
[1-04.htm] Information Broker Bavarin: Didn't you hear me? Take the report I gave you to Mr. Bayard.
[1-05.htm] Information Broker Bavarin: You can find ice crystals that continuously generate cold in this hot springs area. Bring me some of them. My back has been bothering me lately, and I want to make an ice pack. Speak with Chef Jeremy, who's getting ready for a cooking contest. He can tell you where to find some ice crystals.
[1-06.htm] Information Broker Bavarin: Oh, that feels good! My back feels better already! Here's the report. Take it to Mr. Bayard.
[10-01.htm] Tablet of Vision: Someone nearby has the Stone of Commune. Examine the area.
[10-02.htm] Tablet of Vision: You see two figures! It's Waldstein and Death Lord Hallate. Hallate has the Stone of Commune!
[10-03.htm] Tablet of Vision: Listen to Waldstein first.
[10-04.htm] Tablet of Vision: Someone around here has the Stone of Commune, but it's too noisy now. Try again later when things quiet down a bit.
[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: A sharp blast of knowlege courses through your cranium! You hear the sound of distant laughter. 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. You've already heard what Waldstein had to say, so go back to Dark Knight Mordred.
[10-07.htm] Tablet of Vision: Further communion with this tablet would be futile. You've heard what Waldstein had to say, so go back to Dark Knight Mordred.
[11-01.htm] Guard Bayard: You didn't find Waldstein? He'll be hard to find once the pilgrimage is over. You must act swiftly! Now I'll join the search. You'll need your own Stone of Commune. "Where can I get one?"
[11-02.htm] Guard Bayard: To find the next stone you must defeat the Archon of Halisha inside the Four Sepulchers. To enter will not be easy. If you can't form a strong party, go to the Shrine of the Loyal. There you'll find Halisha's subordinates. Collect 700 of their marks and the Archon of Halisha will appear. They include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights, and Shrine Guards.
[11-03.htm] Guard Bayard: To find the next stone you must defeat the Archon of Halisha inside the Four Sepulchers. To enter will not be easy. If you can't form a strong party, go to the Shrine of the Loyal. There you'll find Halisha's subordinates. Collect 700 of their marks and the Archon of Halisha will appear. They include Grave Scarabs, Scavenger Scarabs, Grave Ants, Scavenger Ants, Shrine Knights, and Shrine Guards.
[2-01.htm] Guard Bayard: I'm glad you came to me about Waldstein. Do you remember the massacre of priests in Goddard Castle Town by the Death Lords some time ago? Their pursuers were killed as well. I heard Waldstein was seen traveling with the Death Lords! I find it hard to believe such a trustworthy man would join them, so I'm investigating this myself. Being a guard limits my ability to act. Others are afraid of revenge and have quit helping. Your help will ensure that justice will prevail! By the way... "By the way what?"
[2-02.htm] Guard Bayard: Have you gone to the hot springs area yet? Go see Information Broker Bavarin and get the report. He should be finished. Bring it to me and I'll tell you how to nab Waldstein.
[2-03.htm] Guard Bayard: Good work! Show me the report. Hmm... This confirms Waldstein was seen with the gang of Death Lords! It's believed Waldstein is making the Pilgrimage of the Tablet of Vision to become a Hell Knight. To complete the pilgrimage you must commune with each of six stone tablets. You must have a Stone of Commune for each tablet. Upon completion of all six you will gain a level. Follow Waldstein's footsteps to find him. Here's the first Stone of Commune. Use it to commune with the Tablet of Vision where he was last seen. The path to follow will then open to you. "How will the path open to me?"
[2-04.htm] Guard Bayard: Try communicating with the Tablet of Vision south of the Tower of Insolence by using the Stone of Commune that I gave you. The path will then be revealed to you.
[2-05.htm] Guard Bayard: Go and see Information Broker Bavarin at the hot springs area. Bring me the report I asked him to prepare. Then I'll tell you how to find Waldstein.
[2-06.htm] Guard Bayard: The Stone of Commune and the Tablet of Vision are attracted to each other.This will guide you. Simply put, commune with the tablet and the location of the next stone will be revealed to you. Once you find the next stone, you will see where to find the next tablet. This is Waldstein's path. Once you commune with the Tablet of Vision you'll understand. Here's the first stone, now go!
[3-01.htm] Guard Bayard: Back, huh? Any clues about Waldstein? Yes? Now we can be sure he's on the Pilgrimage of the Tablets of Vision! If you continue the pilgrimage, I'm sure you'll find him. I have the next Stone of Commune. But it is unstable. You must find the missing fragment. "Where is it?"
[3-02.htm] Guard Bayard: Well. 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] Guard Bayard: Well, 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] Guard Bayard: 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] Guard Bayard: You got the stone! Waldstein was seen yesterday in the Varka Silenos stronghold and the Ketra Orc advance base. It seems like Waldstein was also looking for a stone. He may be headed towards the tablet! Let's hurry! I'll stabilize the stone. Watch
[3-06.htm] Guard Bayard: Take the Stone of Commune to the the Tablet of Vision north of the Varka Silenos barracks. Hurry up and find Waldstein!
[3-07.htm] Guard Bayard: Asefa, Chief Shaman of the Ketra Orcs, and Udan Mardui, Chief Shaman of Varka Silenos are both guides of dead souls. Each has a Divine Stone of Wisdom, a fragment of the Stone of Commune. Bring one to me. They both know the mysterious knowledge of the stone, but not its exact use. They'll give it to the wisest of the tribe. Earn their trust, and you'll get the fragment. Which side will you choose? The Ketra Orcs The Varka Silenos
[3-08.htm] Guard Bayard: The stone is complete! Go to the Tablet of Vision north of the Varka Silenos barracks. Hurry and find Waldstein!
[4-01.htm] Disgraced Knight Waldstein: Oh, no! I'll miss him if I keep this up! Help me!
[4-010.htm] Disgraced Knight Waldstein: Master Mordred sent you, right? Tell him not to worry! He shouldn't believe silly rumors! Take this Stone of Commune that I took from Death Lord Hallate and let it react with the last tablet. This will be your final challenge before you become a Hell Knight. Until we meet again... I'm off to find Hallate! "Wait!"
[4-011.htm] Disgraced Knight Waldstein: Master Mordred sent you, right? Tell him not to worry! He shouldn't believe silly rumors! Take this Stone of Commune that I took from Death Lord Hallate and let it react with the last tablet. This will be your final challenge before you may become a Hell Knight. Until we meet again... I'm off to find Hallate!
[4-02.htm] Disgraced Knight Waldstein: Oh, no! I'll miss him if I keep this up!
[4-03.htm] Disgraced Knight Waldstein: Missed him again! I must catch him!
[4-04.htm] Disgraced Knight Waldstein: I really need help or he's going to get away!
[4-05.htm] Disgraced Knight Waldstein: He's getting away!
[4-06.htm] Disgraced Knight Waldstein: Thanks for the help! Master Mordred ordered me to locate the Death Lords, and I decided to infiltrate them to gather more information. This created some nasty rumors about me back in the village... Lately, I've been on a pilgrimage with the Death Lords. They're very interested in obtaining the power sealed within the Tablet of Vision. I couldn't bear seeing them obtain the power of the final tablet, and foolishly revealed my true identity by attacking them! I feel like such a fool! "Tell me more."
[4-07.htm] Disgraced Knight Waldstein: Thanks for the help! Master Mordred ordered me to locate the Death Lords, and I decided to infiltrate them to gather more information. This created some nasty rumors about me back in the village... Lately I've been on a pilgrimage with the Death Lords. They're very interested in obtaining the power sealed within the Tablet of Vision. I couldn't bear seeing them obtain the power of the final tablet, and foolishly revealed my true identity by attacking them! I feel like such an idiot! "Tell me more."
[4-08.htm] Disgraced Knight Waldstein: This won't be easy! You must allow the Tablet of Vision and the Stone of Commune to react with one another.
[4-09.htm] Disgraced Knight Waldstein: I must continue pursuing Hallate! Allow the Tablet of Vision and the Stone of Commune to react with one another.
[5-01.htm] Tablet of Vision: There is no sign of Waldstein. The tablet is covered with indecipherable hieroglyphs. Commune with the Tablet of Vision.
[5-02.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. A female laugh seems to float by in the wind... 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 northeastern Valley of the Saints.
[5-03.htm] Table of Vision: I can no longer commune with this Tablet. It seems that there are no marks of Waldstein, so finding the next Stone of Commune is the best option. You sense that the next stone is being held by the Guardians of Forbidden Knowledge near the Tablet of Vision in the northeast part of the Valley of 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: There is not a trace of Waldstein, only a faint footprint of his big cat. The Tablet of Vision is engraved with unreadable 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 someone with wings beside the Tablet of Vision in the southeastern outpost of the Ketra Orc.
[6-04.htm] Tablet of Vision: Further communion with this tablet is futile. It seems that there is no sign of Waldstein. You must go and find the next Stone of Commune. You sense that someone with wings beside the Tablet of Vision in the southeastern outpost of the Ketra Orc is holding the next stone.
[7-01.htm] Tablet of Vision: Bloody footprints and sword marks scar the ground. Something definitely happened here! Could these be pawprints of the kitty cat I saw earlier? No, these are the pawprints of a dark panther! I sense the presence of someone and the power of the Stone of Commune. Examine the area.
[7-02.htm] Tablet of Vision: Archangel Iconoclasis? He must be the winged one I sensed before. I'm sure he has the Stone of Commune.!
[7-03.htm] Tablet of Vision: First I must defeat the Archangel Iconoclasis and get the next Stone of Commune from him.
[7-04.htm] Tablet of Vision: Someone around here has the Stone of Commune, but it's too noisy now. Wait until it quiets down.
[7-05.htm] Tablet of Vision: The marks on the ground must be the remnants of the battle between Waldstein and Iconoclasis. Waldstein seems quite determined to complete the Pilgrimage of the Tablet of Vision. The Tablet of Vision is engraved with incomprehensible hieroglyphs. Commune with the Tablet of Vision.
[7-06.htm] Tablet of Vision: Countless thoughts beyond comprehension sear painfully into your brain. You see a vision of a woman in a blue dress... I know where the next Stone of Commune is! I know that Guard Bayard of Goddard Castle Town has it! Find him!
[7-07.htm] Tablet of Vision: Further communion with this tablet is futile. You must find the next Stone of Commune! Guard Bayard of Goddard Castle Town has it! Find him!
[8-01.htm] Tablet of Vision: There's no sign of Waldstein, only dark panther pawprints around the tablet. Waldstein must've already gone to the next Stone of Commune! 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! Guard Bayard 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 Guard Bayard 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 andtake it from him.
[9-02.htm] Tablet of Vision: There's no sign of Waldstein, just dark panther pawprints around the tablet. Missed him again! 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 is flashed into your mind! A suspicious person near the next Tablet of Vision has it. This may be the last chance to find Waldstein! Hurry!
[9-04.htm] Tablet of Vision: Communing with this tablet is completed. It's time to find the next Stone of Commune. Near the next Tablet of Vision in the northern part of the Forest of the Dead, it seems a suspicious figure has the Stone of Commune. This may be the last chance to find Waldstein! Hurry!
Исходник условий и наград (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.Q00095_SagaOfTheHellKnight;
import quests.AbstractSagaQuest;
/**
* Saga of the Hell Knight (95)
* @author Emperorc
*/
public class Q00095_SagaOfTheHellKnight extends AbstractSagaQuest
{
public Q00095_SagaOfTheHellKnight()
{
super(95, "Saga of the Hell Knight");
_npc = new int[]
{
31582,
31623,
31297,
31297,
31599,
31646,
31647,
31653,
31654,
31655,
31656,
31297
};
_items = new int[]
{
7080,
7532,
7081,
7510,
7293,
7324,
7355,
7386,
7417,
7448,
7086,
0
};
_mob = new int[]
{
27258,
27244,
27263
};
_classId = new int[]
{
91
};
_prevClass = new int[]
{
0x06
};
_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));
}
}
}
}