__init__.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. # version 0.2
  2. # by DrLecter, with fixes from Ryo_Saeba
  3. import sys
  4. from com.l2jserver import Config
  5. from com.l2jserver.gameserver.model.quest import State
  6. from com.l2jserver.gameserver.model.quest import QuestState
  7. from com.l2jserver.gameserver.model.quest import Quest as JQuest
  8. qn = "419_GetAPet"
  9. # constants section
  10. REQUIRED_SPIDER_LEGS = 50
  11. #Quest items
  12. ANIMAL_LOVERS_LIST1,ANIMAL_SLAYER_LIST1,ANIMAL_SLAYER_LIST2,ANIMAL_SLAYER_LIST3,\
  13. ANIMAL_SLAYER_LIST4,ANIMAL_SLAYER_LIST5,SPIDER_LEG1,SPIDER_LEG2,SPIDER_LEG3, \
  14. SPIDER_LEG4,SPIDER_LEG5,ANIMAL_SLAYER_LIST6,SPIDER_LEG6 = range(3417,3428)+range(10164,10166)
  15. #Chance of drop in %
  16. SPIDER_LEG_DROP = 100
  17. #mobs
  18. #1 humans
  19. SPIDER_H1 = 20103 # Giant Spider
  20. SPIDER_H2 = 20106 # Talon Spider
  21. SPIDER_H3 = 20108 # Blade Spider
  22. #2 elves
  23. SPIDER_LE1 = 20460 # Crimson Spider
  24. SPIDER_LE2 = 20308 # Hook Spider
  25. SPIDER_LE3 = 20466 # Pincer Spider
  26. #3 dark elves
  27. SPIDER_DE1 = 20025 # Lesser Dark Horror
  28. SPIDER_DE2 = 20105 # Dark Horror
  29. SPIDER_DE3 = 20034 # Prowler
  30. #4 orcs
  31. SPIDER_O1 = 20474 # Kasha Spider
  32. SPIDER_O2 = 20476 # Kasha Fang Spider
  33. SPIDER_O3 = 20478 # Kasha Blade Spider
  34. #5 dwarves
  35. SPIDER_D1 = 20403 # Hunter Tarantula
  36. SPIDER_D2 = 20508 # Plunder Tarantula
  37. #6 kamael
  38. SPIDER_K1 = 22244 # Crimson Spider
  39. #NPCs
  40. PET_MANAGER_MARTIN = 30731
  41. GK_BELLA = 30256
  42. MC_ELLIE = 30091
  43. GD_METTY = 30072
  44. #Rewards
  45. WOLF_COLLAR = 2375
  46. # helper functions section
  47. def getCount_proof(st) :
  48. race = st.getPlayer().getRace().ordinal()
  49. if race == 0: proofs = st.getQuestItemsCount(SPIDER_LEG1)
  50. if race == 1: proofs = st.getQuestItemsCount(SPIDER_LEG2)
  51. if race == 2: proofs = st.getQuestItemsCount(SPIDER_LEG3)
  52. if race == 3: proofs = st.getQuestItemsCount(SPIDER_LEG4)
  53. if race == 4: proofs = st.getQuestItemsCount(SPIDER_LEG5)
  54. if race == 5: proofs = st.getQuestItemsCount(SPIDER_LEG6)
  55. return proofs
  56. def check_questions(st) :
  57. question = 1
  58. quiz = st.get("quiz")
  59. answers = st.getInt("answers")
  60. if answers < 10 :
  61. questions = quiz.split()
  62. index = st.getQuest().getRandom(len(questions) - 1)
  63. question = questions[index]
  64. if len(questions) > 10 - answers :
  65. questions[index] = questions[-1]
  66. del questions[-1]
  67. st.set("quiz"," ".join(questions))
  68. htmltext = "419_q"+str(question)+".htm"
  69. return htmltext
  70. elif answers == 10 :
  71. st.giveItems(WOLF_COLLAR,1)
  72. st.takeItems(ANIMAL_LOVERS_LIST1,-1)
  73. st.exitQuest(1)
  74. st.playSound("ItemSound.quest_finish")
  75. htmltext="Completed.htm"
  76. return htmltext
  77. # Main Quest Code
  78. class Quest (JQuest):
  79. def __init__(self,id,name,descr):
  80. JQuest.__init__(self,id,name,descr)
  81. self.questItemIds = range(3417,3428)+range(10164,10166)
  82. def onEvent (self,event,st):
  83. id = st.getState()
  84. if id == State.CREATED :
  85. st.set("cond","0")
  86. if event == "details" :
  87. return "419_confirm.htm"
  88. elif event == "agree" :
  89. st.setState(State.STARTED)
  90. st.set("step","STARTED")
  91. st.set("cond","1")
  92. race = st.getPlayer().getRace().ordinal()
  93. if race == 0:
  94. st.giveItems(ANIMAL_SLAYER_LIST1,1)
  95. htmltext = "419_slay_0.htm"
  96. elif race == 1:
  97. st.giveItems(ANIMAL_SLAYER_LIST2,1)
  98. htmltext = "419_slay_1.htm"
  99. elif race == 2:
  100. st.giveItems(ANIMAL_SLAYER_LIST3,1)
  101. htmltext = "419_slay_2.htm"
  102. elif race == 3:
  103. st.giveItems(ANIMAL_SLAYER_LIST4,1)
  104. htmltext = "419_slay_3.htm"
  105. elif race == 4:
  106. st.giveItems(ANIMAL_SLAYER_LIST5,1)
  107. htmltext = "419_slay_4.htm"
  108. elif race == 5:
  109. st.giveItems(ANIMAL_SLAYER_LIST6,1)
  110. htmltext = "419_slay_5.htm"
  111. else :
  112. htmltext = "Error: unknown race..."
  113. st.exitQuest(1)
  114. st.playSound("ItemSound.quest_accept")
  115. return htmltext
  116. elif event == "disagree" :
  117. st.exitQuest(1)
  118. return "419_cancelled.htm"
  119. elif id == State.STARTED and st.getInt("progress") == 7:
  120. if event == "tryme" :
  121. st.set("quiz","1 2 3 4 5 6 7 8 9 10 11 12 13 14")
  122. st.set("answers","0")
  123. return check_questions(st)
  124. elif event == "wrong" :
  125. st.set("step","SLAYED")
  126. st.set("progress","0")
  127. st.unset("quiz")
  128. st.unset("answers")
  129. return "419_failed.htm"
  130. elif event == "right" :
  131. st.set("answers",str(st.getInt("answers") + 1))
  132. return check_questions(st)
  133. elif id == State.STARTED and st.get("step")=="SLAYED" :
  134. if event == "talk" :
  135. st.set("progress","0")
  136. race = st.getPlayer().getRace().ordinal()
  137. if race == 0:
  138. st.takeItems(SPIDER_LEG1,REQUIRED_SPIDER_LEGS)
  139. st.takeItems(ANIMAL_SLAYER_LIST1,1)
  140. elif race == 1:
  141. st.takeItems(SPIDER_LEG2,REQUIRED_SPIDER_LEGS)
  142. st.takeItems(ANIMAL_SLAYER_LIST2,1)
  143. elif race == 2:
  144. st.takeItems(SPIDER_LEG3,REQUIRED_SPIDER_LEGS)
  145. st.takeItems(ANIMAL_SLAYER_LIST3,1)
  146. elif race == 3:
  147. st.takeItems(SPIDER_LEG4,REQUIRED_SPIDER_LEGS)
  148. st.takeItems(ANIMAL_SLAYER_LIST4,1)
  149. elif race == 4:
  150. st.takeItems(SPIDER_LEG5,REQUIRED_SPIDER_LEGS)
  151. st.takeItems(ANIMAL_SLAYER_LIST5,1)
  152. elif race == 5:
  153. st.takeItems(SPIDER_LEG6,REQUIRED_SPIDER_LEGS)
  154. st.takeItems(ANIMAL_SLAYER_LIST6,1)
  155. st.giveItems(ANIMAL_LOVERS_LIST1,1)
  156. return "419_talk.htm"
  157. if event == "talk1" :
  158. return "419_bella_2.htm"
  159. if event == "talk2" :
  160. st.set("progress", str(st.getInt("progress") | 1))
  161. return "419_bella_3.htm"
  162. if event == "talk3" :
  163. st.set("progress", str(st.getInt("progress") | 2))
  164. return "419_ellie_2.htm"
  165. if event == "talk4" :
  166. st.set("progress", str(st.getInt("progress") | 4))
  167. return "419_metty_2.htm"
  168. return
  169. def onTalk (self,npc,player):
  170. htmltext = Quest.getNoQuestMsg(player)
  171. st = self.getQuestState(player, True)
  172. if not st : return htmltext
  173. npcId = npc.getId()
  174. id = st.getState()
  175. if npcId != PET_MANAGER_MARTIN and id == State.STARTED:
  176. if st.get("step")!="SLAYED" : return htmltext
  177. if id == State.COMPLETED: st.setState(State.CREATED)
  178. if npcId == PET_MANAGER_MARTIN :
  179. if id == State.CREATED :
  180. if player.getLevel() < 15 :
  181. st.exitQuest(1)
  182. return "419_low_level.htm"
  183. return "Start.htm"
  184. if id == State.STARTED and st.get("step")=="STARTED" :
  185. if getCount_proof(st) == 0 :
  186. return "419_no_slay.htm"
  187. elif getCount_proof(st) < REQUIRED_SPIDER_LEGS :
  188. return "419_pending_slay.htm"
  189. else :
  190. st.set("step","SLAYED")
  191. return "Slayed.htm"
  192. if id == State.STARTED and st.get("step")=="SLAYED" :
  193. if st.getInt("progress") == 7 :
  194. return "Talked.htm"
  195. return "419_pending_talk.htm"
  196. elif id == State.STARTED and st.get("step")=="SLAYED":
  197. if npcId == GK_BELLA :
  198. return "419_bella_1.htm"
  199. elif npcId == MC_ELLIE :
  200. return "419_ellie_1.htm"
  201. elif npcId == GD_METTY :
  202. return "419_metty_1.htm"
  203. return
  204. def onKill(self,npc,player,isPet):
  205. st = self.getQuestState(player, False)
  206. if not st : return
  207. if st.getState() != State.STARTED : return
  208. npcId = npc.getId()
  209. collected = getCount_proof(st)
  210. if collected < REQUIRED_SPIDER_LEGS:
  211. race = player.getRace().ordinal()
  212. if race == 0 :
  213. npcs = [ SPIDER_H1, SPIDER_H2, SPIDER_H3 ]
  214. item = SPIDER_LEG1
  215. if race == 1 :
  216. npcs = [ SPIDER_LE1, SPIDER_LE2, SPIDER_LE3 ]
  217. item = SPIDER_LEG2
  218. if race == 2 :
  219. npcs = [ SPIDER_DE1, SPIDER_DE2, SPIDER_DE3 ]
  220. item = SPIDER_LEG3
  221. if race == 3 :
  222. npcs = [ SPIDER_O1, SPIDER_O2, SPIDER_O3 ]
  223. item = SPIDER_LEG4
  224. if race == 4 :
  225. npcs = [ SPIDER_D1, SPIDER_D2 ]
  226. item = SPIDER_LEG5
  227. if race == 5 :
  228. npcs = [ SPIDER_K1 ]
  229. item = SPIDER_LEG6
  230. if npcId in npcs :
  231. chance = SPIDER_LEG_DROP * Config.RATE_QUEST_DROP
  232. numItems, chance = divmod(chance,100)
  233. count = st.getQuestItemsCount(item)
  234. if self.getRandom(100) < chance :
  235. numItems += 1
  236. if numItems :
  237. if count + numItems >= REQUIRED_SPIDER_LEGS :
  238. numItems = REQUIRED_SPIDER_LEGS - count
  239. st.playSound("ItemSound.quest_middle")
  240. else:
  241. st.playSound("ItemSound.quest_itemget")
  242. st.giveItems(item,int(numItems))
  243. return
  244. # Quest class and state definition
  245. QUEST = Quest(419, qn, "Wolf Collar")
  246. # Quest NPC starter initialization
  247. QUEST.addStartNpc(PET_MANAGER_MARTIN)
  248. # Quest mob initialization
  249. for mob in [SPIDER_H1,SPIDER_H2,SPIDER_H3,SPIDER_LE1,SPIDER_LE2,SPIDER_LE3,SPIDER_DE1,SPIDER_DE2,SPIDER_DE3,SPIDER_O1,SPIDER_O2,SPIDER_O3,SPIDER_D1,SPIDER_D2,SPIDER_K1]:
  250. QUEST.addKillId(mob)
  251. # Quest NPC initialization
  252. QUEST.addTalkId(PET_MANAGER_MARTIN)
  253. QUEST.addTalkId(GK_BELLA)
  254. QUEST.addTalkId(MC_ELLIE)
  255. QUEST.addTalkId(GD_METTY)