# Made by Fulminus, version 0.1
import sys
from com.l2jserver.gameserver.model.quest import State
from com.l2jserver.gameserver.model.quest import QuestState
from com.l2jserver.gameserver.model.quest import Quest as JQuest
from com.l2jserver.util import Rnd
qn = "234_FatesWhisper"
PIPETTE_KNIFE = 4665
REIRIAS_SOUL_ORB = 4666
KERMONS_INFERNIUM_SCEPTER = 4667
GOLCONDAS_INFERNIUM_SCEPTER = 4668
HALLATES_INFERNIUM_SCEPTER = 4669
REORINS_HAMMER = 4670
REORINS_MOLD = 4671
INFERNIUM_VARNISH = 4672
RED_PIPETTE_KNIFE = 4673
STAR_OF_DESTINY = 5011
CRYSTAL_B = 1460
BLOOD_STAINED_CLOTH = 14361
WHITE_CLOTH = 14362
#Reorin, Cliff, Ferris, Zenkin, Kaspar, Kernon's Chest, Golkonda's Chest, Hallate's Chest, Cabrio's "Coffer of the Dead"
NPC=[31002,30182,30847,30178,30833,31028,31029,31030,31027]
CHEST_SPAWNS = {
25035:31027, # Shilen's Messenger Cabrio
25054:31028, # Demon Kernon
25126:31029, # Golkonda, the Longhorn General
25220:31030 # Death Lord Hallate
}
#mobId=[cond,dropId,rate]
DROPLIST={
20823: [8,BLOOD_STAINED_CLOTH,80],
20826: [8,BLOOD_STAINED_CLOTH,80],
20827: [8,BLOOD_STAINED_CLOTH,80],
20828: [8,BLOOD_STAINED_CLOTH,80],
20829: [8,BLOOD_STAINED_CLOTH,80],
21064: [8,BLOOD_STAINED_CLOTH,80],
21065: [8,BLOOD_STAINED_CLOTH,80],
21066: [8,BLOOD_STAINED_CLOTH,80],
21069: [8,BLOOD_STAINED_CLOTH,80],
21072: [8,BLOOD_STAINED_CLOTH,80],
}
Weapons={
79:"Sword of Damascus",
2626:"Samurai Dualsword",
287:"Bow of Peril",
97:"Lance",
175:"Art of Battle Axe",
210:"Staff of Evil Spirits",
234:"Demon Dagger" ,
268:"Bellion Cestus" ,
171:"Deadman's Glory" ,
7883:"Guardian Sword",
7889:"Wizard's Tear",
7901:"Star Buster",
7893:"Kaim Vanul's Bones"
}
class Quest (JQuest) :
def __init__(self,id,name,descr):
JQuest.__init__(self,id,name,descr)
self.questItemIds = [BLOOD_STAINED_CLOTH,WHITE_CLOTH,PIPETTE_KNIFE,RED_PIPETTE_KNIFE]
def onAdvEvent (self,event,npc, player) :
htmltext = event
st = self.getQuestState(player, False)
if not st : return
#accept quest
if event == "1" :
st.set("cond","1")
st.setState(State.STARTED)
htmltext = "31002-03.htm"
# talking with cliff...last dialog to get the Infernium Varnish
elif event == "30182_01" :
htmltext = "30182-01c.htm"
st.giveItems(INFERNIUM_VARNISH,1)
# open Kernon's Chest
elif event == "31028_01" :
htmltext = "31028-02.htm"
st.giveItems(KERMONS_INFERNIUM_SCEPTER,1)
# open Hallate's Chest
elif event == "31029_01" :
htmltext = "31029-02.htm"
st.giveItems(GOLCONDAS_INFERNIUM_SCEPTER,1)
# open Golkonda's Chest
elif event == "31030_01" :
htmltext = "31030-02.htm"
st.giveItems(HALLATES_INFERNIUM_SCEPTER,1)
# dialog with Zenkin
elif event == "30178_01" :
st.set("cond","6")
htmltext = "30178-01a.htm"
# dialog with Kaspar - go to baium
elif event == "30833_01a" :
htmltext = "30833-01b.htm"
st.giveItems(PIPETTE_KNIFE,1)
st.set("cond","7")
# dialog with Kaspar - go to toi
elif event == "30833_01a2" :
htmltext = "30833-01b2.htm"
st.giveItems(WHITE_CLOTH,30)
st.set("cond","8")
## FINAL ITEM EXCHANGE SECTION
elif event.startswith("selectBGrade_"):
if st.getInt("bypass") :
return
bGradeId = event.replace("selectBGrade_", "")
st.set("weaponId",bGradeId)
htmltext = st.showHtmlFile("31002-13.htm").replace("%weaponname%",Weapons[int(bGradeId)])
elif event.startswith("confirmWeapon"):
st.set("bypass","1")
htmltext = st.showHtmlFile("31002-14.htm").replace("%weaponname%",Weapons[st.getInt("weaponId")])
elif event.startswith("selectAGrade_"):
if st.getInt("bypass"):
if st.getQuestItemsCount(st.getInt("weaponId")) > 0 :
aGradeItemId = int(event.replace("selectAGrade_", ""))
htmltext = "31002-12.htm"
st.takeItems(st.getInt("weaponId"),1)
st.giveItems(aGradeItemId,1)
st.giveItems(STAR_OF_DESTINY,1)
st.exitQuest(False)
st.unset("cond")
st.unset("bypass")
st.unset("weaponId")
else:
htmltext = st.showHtmlFile("31002-15.htm").replace("%weaponname%",Weapons[st.getInt("weaponId")])
else:
htmltext="
Maestro Reorin:
Are you trying to cheat me?! What happenned to the weapon you were about to give me for the neutralization of Infernum's evil aura?"
#st.exitQuest(1)
return htmltext
def onTalk (self,npc,player):
htmltext = Quest.getNoQuestMsg(player)
st = self.getQuestState(player, True)
if not st : return htmltext
npcId = npc.getId()
id = st.getState()
# first time when a player join the quest
if id == State.CREATED:
if player.getLevel() >= 75:
htmltext = "31002-02.htm"
else:
htmltext = "31002-01.htm"
st.exitQuest(1)
return htmltext
# if quest is already State.COMPLETED
elif id == State.COMPLETED:
return Quest.getAlreadyCompletedMsg(player)
# if quest is accepted and in progress
elif id == State.STARTED:
cond =st.getInt("cond")
if npcId == NPC[0] :
if cond == 1 and not st.getQuestItemsCount(REIRIAS_SOUL_ORB) : # waiting for the orb
htmltext = "31002-04b.htm"
elif cond == 1 : #got the orb! Go to the next step (infernium scepter pieces)
st.takeItems(REIRIAS_SOUL_ORB,1)
htmltext = "31002-05.htm"
st.set("cond","2")
# waiting for infernium scepter pieces
elif cond == 2 and (st.getQuestItemsCount(KERMONS_INFERNIUM_SCEPTER)+st.getQuestItemsCount(GOLCONDAS_INFERNIUM_SCEPTER)+st.getQuestItemsCount(HALLATES_INFERNIUM_SCEPTER) < 3) :
htmltext = "31002-05c.htm"
elif cond == 2 : #got the infernium scepter pieces! Go to the next step (infernium Varnish)
st.takeItems(KERMONS_INFERNIUM_SCEPTER,1)
st.takeItems(GOLCONDAS_INFERNIUM_SCEPTER,1)
st.takeItems(HALLATES_INFERNIUM_SCEPTER,1)
htmltext = "31002-06.htm"
st.set("cond","3")
# waiting for infernium varnish
elif cond == 3 and not st.getQuestItemsCount(INFERNIUM_VARNISH) :
htmltext = "31002-06b.htm"
elif cond == 3 : #got the infernium varnish! Go to the next step (Reorin's Hammer)
st.takeItems(INFERNIUM_VARNISH,1)
htmltext = "31002-07.htm"
st.set("cond","4")
# waiting for Reorin's Hammer
elif cond == 4 and not st.getQuestItemsCount(REORINS_HAMMER) :
htmltext = "31002-07b.htm"
elif cond == 4 : # got Reorin's Hammer! Go to the next step (Reorin's Mold)
st.takeItems(REORINS_HAMMER,1)
htmltext = "31002-08.htm"
st.set("cond","5")
elif cond < 10 : # waiting for Reorin's Mold
htmltext = "31002-08b.htm"
elif cond == 10 : # got Reorin's Mold! Go to the next step (B Crystals)
st.takeItems(REORINS_MOLD,1)
htmltext = "31002-09.htm"
st.set("cond","11")
qs = st.getPlayer().getQuestState("255_Tutorial")
if qs:
st.showQuestionMark(13)
st.playSound("ItemSound.quest_tutorial")
# waiting for 984 B Grade Crystals
elif cond == 11 and (st.getQuestItemsCount(CRYSTAL_B) < 984) :
htmltext = "31002-09a.htm"
elif cond == 11 : # got the crystals
st.takeItems(CRYSTAL_B,984)
htmltext = "31002-BGradeList.htm"
st.set("cond","12")
# all is ready. Now give a menu to trade the B weapon for the player's choice of A Weapon.
elif cond == 12:
if st.getInt("bypass"): #weapon is set
if st.getQuestItemsCount(st.getInt("weaponId")) > 0 : #have weapon
htmltext = st.showHtmlFile("31002-AGradeList.htm").replace("%weaponname%",Weapons[st.getInt("weaponId")])
else: #dont have
htmltext = st.showHtmlFile("31002-15.htm").replace("%weaponname%",Weapons[st.getInt("weaponId")])
else : #weapon not yet chosen
htmltext = "31002-BGradeList.htm"
## CLIFF.
# came to take the varnish
elif npcId == NPC[1] and cond==3 and not st.getQuestItemsCount(INFERNIUM_VARNISH) :
htmltext = "30182-01.htm"
# you already got the varnish...why are you back?
elif npcId == NPC[1] and (cond>=3 or st.getQuestItemsCount(INFERNIUM_VARNISH)) :
htmltext = "30182-02.htm"
## FERRIS
# go to take the mold
elif npcId == NPC[2] and cond==4 and not st.getQuestItemsCount(REORINS_HAMMER) :
htmltext = "30847-01.htm" # go to trader Zenkin
st.giveItems(REORINS_HAMMER,1)
# I already told you I don't have it!
elif npcId == NPC[2] and cond>=4 :
htmltext = "30847-02.htm" # go to trader Zenkin
## ZENKIN
# go to take mold
elif npcId == NPC[3] and cond==5 :
htmltext = "30178-01.htm" # go to Magister Kaspar
# I already told you I don't have it!
elif npcId == NPC[3] and cond>5 :
htmltext = "30178-02.htm" # go to Magister Kaspar
## KASPAR
elif npcId == NPC[4]:
# first visit: You have neither plain nor blooded knife.
if cond==6 :
htmltext = "30833-01.htm" # go to Magister Hanellin,etc. Get Baium's Blood with the pipette
#revisit after you've gotten the mold: What are you still doing here?
if cond > 9 :
htmltext = "30833-04.htm" # Have you given the mold to Reorin, yet?
# revisit before getting the blood: remind "go get the blood"
if cond==7 and st.getQuestItemsCount(PIPETTE_KNIFE) and not st.getQuestItemsCount(RED_PIPETTE_KNIFE) :
htmltext = "30833-02.htm" # go to Magister Hanellin,etc. Get Baium's Blood with the pipette
# got the blood and I'm ready to proceed
if cond==7 and not st.getQuestItemsCount(PIPETTE_KNIFE) and st.getQuestItemsCount(RED_PIPETTE_KNIFE) :
htmltext = "30833-03.htm" # great! Here is your mold for Reorin
st.takeItems(RED_PIPETTE_KNIFE,1)
st.giveItems(REORINS_MOLD,1)
st.set("cond","10")
# get 30 blood cloths
if cond==8:
htmltext = "30833-02b.htm"
# finished hunt 30 blood cloths, give reorin mold
if cond==9:
htmltext = "30833-03b.htm"
st.takeItems(BLOOD_STAINED_CLOTH,-1)
st.giveItems(REORINS_MOLD,1)
st.set("cond","10")
## CHESTS FROM RAIDBOSSES
elif cond==1 :
if npcId ==NPC[8] and st.getQuestItemsCount(REIRIAS_SOUL_ORB)==0 :
htmltext = "31027-01.htm"
st.giveItems(REIRIAS_SOUL_ORB,1)
st.playSound("ItemSound.quest_itemget")
elif cond==2 :
# Kernon's Chest
if npcId == NPC[5] and st.getQuestItemsCount(KERMONS_INFERNIUM_SCEPTER)==0 :
htmltext = "31028-01.htm"
elif npcId == NPC[5] :
htmltext = "This chest looks empty"
# Golkonda's Chest
elif npcId == NPC[6] and st.getQuestItemsCount(GOLCONDAS_INFERNIUM_SCEPTER)==0 :
htmltext = "31029-01.htm"
elif npcId == NPC[6] :
htmltext = "This chest looks empty"
# Hallate's Chest
elif npcId == NPC[7] and st.getQuestItemsCount(HALLATES_INFERNIUM_SCEPTER)==0 :
htmltext = "31030-01.htm"
elif npcId == NPC[7] :
htmltext = "This chest looks empty"
return htmltext
def onAttack (self, npc, player, damage, isPet, skill):
st = self.getQuestState(player, False)
if not st : return
if st.getState() != State.STARTED : return
if isPet : return
if st.getInt("cond") == 7 and npc.getId() == 29020 :
if player.getActiveWeaponItem() and player.getActiveWeaponItem().getId() == PIPETTE_KNIFE and st.getQuestItemsCount(RED_PIPETTE_KNIFE) == 0:
st.giveItems(RED_PIPETTE_KNIFE,1)
st.takeItems(PIPETTE_KNIFE,1)
st.playSound("ItemSound.quest_itemget")
return
def onKill(self,npc,player,isPet):
npcId=npc.getId()
# the chests always spawn, even if the RB is killed with nobody nearby doing the quest.
if npcId in CHEST_SPAWNS.keys() :
self.addSpawn(CHEST_SPAWNS[npcId], npc.getX(), npc.getY(), npc.getZ(),npc.getHeading(), True, 60000)
else :
value,dropId,chance = DROPLIST[npcId]
if chance > 0 and Rnd.get(100) < chance:
party = player.getParty()
if party :
PartyQuestMembers = []
for partyMember in party.getMembers().toArray() :
if partyMember.isInsideRadius(player,1500,True,False):
pst = partyMember.getQuestState(qn)
if pst :
if pst.getInt("cond") == 8 and pst.getQuestItemsCount(dropId) < 30 :
PartyQuestMembers.append(pst)
if len(PartyQuestMembers) == 0 : return
stw = PartyQuestMembers[Rnd.get(len(PartyQuestMembers))]
stw.giveItems(dropId,1)
stw.takeItems(WHITE_CLOTH,1)
stw.playSound("ItemSound.quest_itemget")
if stw.getQuestItemsCount(dropId) >= 30:
stw.set("cond","9")
else:
st = self.getQuestState(player, False)
if not st : return
if st.getState() != State.STARTED : return
if npcId in DROPLIST.keys() :
if st.getInt("cond") == value:
if value == 8 and st.getQuestItemsCount(dropId) < 30:
st.giveItems(dropId,1)
st.takeItems(WHITE_CLOTH,1)
st.playSound("ItemSound.quest_itemget")
if st.getQuestItemsCount(dropId) >= 30:
st.set("cond","9")
return
QUEST = Quest(234,qn,"Fate's Whisper")
QUEST.addStartNpc(NPC[0])
for npcId in NPC:
QUEST.addTalkId(npcId)
for mobId in DROPLIST.keys() :
QUEST.addKillId(mobId)
for mobId in CHEST_SPAWNS.keys() :
QUEST.addKillId(mobId)
QUEST.addAttackId(29020)