__init__.py 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548
  1. # Written by
  2. # questdevs Team
  3. import sys
  4. from java.util import Iterator
  5. from com.l2jserver.util import Rnd
  6. from com.l2jserver.gameserver.network.serverpackets import NpcSay
  7. from com.l2jserver.gameserver.model.quest import State
  8. from com.l2jserver.gameserver.model.quest import QuestState
  9. from com.l2jserver.gameserver.model.quest import Quest as JQuest
  10. from com.l2jserver.commons.database.pool.impl import ConnectionFactory
  11. qn = "503_PursuitClanAmbition"
  12. qd = "Pursuit Clan Ambition"
  13. # Items
  14. # first part
  15. G_Let_Martien = 3866
  16. Th_Wyrm_Eggs = 3842
  17. Drake_Eggs = 3841
  18. Bl_Wyrm_Eggs = 3840
  19. Mi_Drake_Eggs = 3839
  20. Brooch = 3843
  21. Bl_Anvil_Coin = 3871
  22. # second Part
  23. G_Let_Balthazar = 3867
  24. Spiteful_Soul_Energy = 14855
  25. # third part
  26. G_Let_Rodemai = 3868
  27. Imp_Keys = 3847
  28. Scepter_Judgement = 3869
  29. # the final item
  30. Proof_Aspiration = 3870
  31. EggList = [Mi_Drake_Eggs,Bl_Wyrm_Eggs,Drake_Eggs,Th_Wyrm_Eggs]
  32. # NPC = Martien,Athrea,Kalis,Gustaf,Fritz,Lutz,Kurtz,Kusto,Balthazar,Rodemai,Coffer,Cleo
  33. NPC=[30645,30758,30759,30760,30761,30762,30763,30512,30764,30868,30765,30766]
  34. STATS=["cond","Fritz","Lutz","Kurtz","ImpGraveKeeper"]
  35. # DROPLIST = step,chance,maxcount,item
  36. # condition,maxcount,chance,itemList = DROPLIST[npcId]
  37. DROPLIST = {
  38. 20282: [2,10,20,[Th_Wyrm_Eggs]], # Thunder Wyrm 1
  39. 20243: [2,10,15,[Th_Wyrm_Eggs]], # Thunder Wyrm 2
  40. 20137: [2,10,20,[Drake_Eggs]], # Drake 1
  41. 20285: [2,10,25,[Drake_Eggs]], # Drake 2
  42. 27178:[2,10,100,[Bl_Wyrm_Eggs]], # Blitz Wyrm
  43. 20974: [5,10,20,[Spiteful_Soul_Energy]], # Spiteful Soul Leader
  44. 20668: [10,0,15,[]], # Grave Guard
  45. 27179:[10,6,80,[Imp_Keys]], # GraveKeyKeeper
  46. 27181:[10,0,100,[]] # Imperial Gravekeeper
  47. }
  48. def suscribe_members(st) :
  49. clan=st.getPlayer().getClanId()
  50. con=ConnectionFactory.getInstance().getConnection()
  51. offline=con.prepareStatement("SELECT charId FROM characters WHERE clanid=? AND online=0")
  52. offline.setInt(1, clan)
  53. rs=offline.executeQuery()
  54. while (rs.next()) :
  55. charId=rs.getInt("charId")
  56. try :
  57. insertion = con.prepareStatement("INSERT INTO character_quests (charId,name,var,value) VALUES (?,?,?,?)")
  58. insertion.setInt(1, charId)
  59. insertion.setString(2, qn)
  60. insertion.setString(3, "<state>")
  61. insertion.setString(4, "Started")
  62. insertion.executeUpdate()
  63. insertion.close();
  64. except :
  65. try : insertion.close()
  66. except : pass
  67. try :
  68. con.close()
  69. except :
  70. pass
  71. def offlineMemberExit(st) :
  72. clan=st.getPlayer().getClanId()
  73. con=ConnectionFactory.getInstance().getConnection()
  74. offline=con.prepareStatement("DELETE FROM character_quests WHERE name = ? and charId IN (SELECT charId FROM characters WHERE clanId =? AND online=0")
  75. offline.setString(1, qn)
  76. offline.setInt(2, clan)
  77. try :
  78. offline.executeUpdate()
  79. offline.close()
  80. con.close()
  81. except :
  82. try : con.close()
  83. except : pass
  84. # returns leaders quest cond, if he is offline will read out of database :)
  85. def getLeaderVar(st, var) :
  86. try :
  87. clan = st.getPlayer().getClan()
  88. if clan == None:
  89. return -1
  90. leader=clan.getLeader().getPlayerInstance()
  91. if leader != None :
  92. return int(leader.getQuestState(qn).get(var))
  93. except :
  94. pass
  95. leaderId=st.getPlayer().getClan().getLeaderId()
  96. con=ConnectionFactory.getInstance().getConnection()
  97. offline=con.prepareStatement("SELECT value FROM character_quests WHERE charId=? AND var=? AND name=?")
  98. offline.setInt(1, leaderId)
  99. offline.setString(2, var)
  100. offline.setString(3, qn)
  101. rs=offline.executeQuery()
  102. if rs :
  103. rs.next()
  104. try :
  105. val=rs.getInt("value")
  106. con.close()
  107. except :
  108. val=-1
  109. try : con.close()
  110. except : pass
  111. else :
  112. val=-1
  113. return int(val)
  114. # set's leaders quest cond, if he is offline will read out of database :)
  115. # for now, if the leader is not logged in, this assumes that the variable
  116. # has already been inserted once (initialized, in some sense).
  117. def setLeaderVar(st, var, value) :
  118. clan = st.getPlayer().getClan()
  119. if clan == None: return
  120. leader=clan.getLeader().getPlayerInstance()
  121. if leader != None :
  122. leader.getQuestState(qn).set(var,value)
  123. else :
  124. leaderId=st.getPlayer().getClan().getLeaderId()
  125. con=ConnectionFactory.getInstance().getConnection()
  126. offline=con.prepareStatement("UPDATE character_quests SET value=? WHERE charId=? AND var=? AND name=?")
  127. offline.setString(1, value)
  128. offline.setInt(2, leaderId)
  129. offline.setString(3, var)
  130. offline.setString(4, qn)
  131. try :
  132. offline.executeUpdate()
  133. offline.close()
  134. con.close()
  135. except :
  136. try : con.close()
  137. except : pass
  138. return
  139. def checkEggs(st):
  140. count = 0
  141. for item in EggList:
  142. if st.getQuestItemsCount(item) > 9:
  143. count+=1
  144. if count > 3 :
  145. return 1
  146. else:
  147. return 0
  148. def giveItem(item,maxcount,st):
  149. count = st.getQuestItemsCount(item)
  150. if count < maxcount:
  151. st.giveItems(item,1)
  152. if count == maxcount-1:
  153. st.playSound("ItemSound.quest_middle")
  154. else:
  155. st.playSound("ItemSound.quest_itemget")
  156. return
  157. def exit503(completed,st):
  158. if completed:
  159. st.giveItems(Proof_Aspiration,1)
  160. st.addExpAndSp(0,250000)
  161. for var in STATS:
  162. st.unset(var)
  163. st.exitQuest(False)
  164. else:
  165. st.exitQuest(1)
  166. st.takeItems(Scepter_Judgement,-1)
  167. try:
  168. members = st.getPlayer().getClan().getOnlineMembers(0)
  169. for i in members:
  170. st.getPlayer().getClan().getClanMember(i).getPlayerInstance().getQuestState(qn).exitQuest(1)
  171. offlineMemberExit(st)
  172. except:
  173. return "You dont have any members in your Clan, so you can't finish the Pursuit of Aspiration"
  174. return "Congratulations, you have finished the Pursuit of Clan Ambition"
  175. class Quest (JQuest) :
  176. def __init__(self,id,name,descr):
  177. JQuest.__init__(self,id,name,descr)
  178. self.questItemIds = range(3839,3848)+range(3866,3870)
  179. self.ImpGraveKepperStat = 1
  180. def onEvent (self,event,st) :
  181. htmltext = event
  182. # Events Gustaf
  183. if event == "30760-08.htm" :
  184. st.giveItems(G_Let_Martien,1)
  185. for var in STATS:
  186. st.set(var,"1")
  187. st.setState(State.STARTED)
  188. elif event == "30760-12.htm" :
  189. st.giveItems(G_Let_Balthazar,1)
  190. st.set("cond","4")
  191. elif event == "30760-16.htm" :
  192. st.giveItems(G_Let_Rodemai,1)
  193. st.set("cond","7")
  194. elif event == "30760-20.htm" :
  195. exit503(1,st)
  196. elif event == "30760-22.htm" :
  197. st.set("cond","13")
  198. elif event == "30760-23.htm" :
  199. exit503(1,st)
  200. # Events Martien
  201. elif event == "30645-03.htm":
  202. st.takeItems(G_Let_Martien,-1)
  203. st.set("cond","2")
  204. suscribe_members(st)
  205. try:
  206. members = st.getPlayer().getClan().getOnlineMembers(0)
  207. for i in members:
  208. pst = QuestManager.getInstance().getQuest(qn).newQuestState(st.getPlayer().getClan().getClanMember(int(i)).getPlayerInstance())
  209. pst.setState(State.STARTED)
  210. except:
  211. return htmltext
  212. # Events Kurtz
  213. elif event == "30763-03.htm":
  214. if st.getInt("Kurtz") == 1:
  215. htmltext = "30763-02.htm"
  216. st.giveItems(Mi_Drake_Eggs,6)
  217. st.giveItems(Brooch,1)
  218. st.set("Kurtz","2")
  219. # Events Lutz
  220. elif event == "30762-03.htm":
  221. lutz = st.getInt("Lutz")
  222. if lutz == 1:
  223. htmltext = "30762-02.htm"
  224. st.giveItems(Mi_Drake_Eggs,4)
  225. st.giveItems(Bl_Wyrm_Eggs,3)
  226. st.set("Lutz","2")
  227. st.addSpawn(27178,65170,109503,-3671,120000)
  228. st.addSpawn(27178,65219,109463,-3676,120000)
  229. # Events Fritz
  230. elif event == "30761-03.htm":
  231. fritz = st.getInt("Fritz")
  232. if fritz == 1:
  233. htmltext = "30761-02.htm"
  234. st.giveItems(Bl_Wyrm_Eggs,3)
  235. st.set("Fritz","2")
  236. st.addSpawn(27178,64728,115954,-3628,120000)
  237. st.addSpawn(27178,64763,115871,-3631,120000)
  238. # Events Kusto
  239. elif event == "30512-03.htm":
  240. st.takeItems(Brooch,-1)
  241. st.giveItems(Bl_Anvil_Coin,1)
  242. st.set("Kurtz","3")
  243. # Events Balthazar
  244. elif event == "30764-03.htm":
  245. st.takeItems(G_Let_Balthazar,-1)
  246. st.set("cond","5")
  247. st.set("Kurtz","3")
  248. elif event == "30764-05.htm":
  249. st.takeItems(G_Let_Balthazar,-1)
  250. st.set("cond","5")
  251. elif event == "30764-06.htm":
  252. st.takeItems(Bl_Anvil_Coin,-1)
  253. st.set("Kurtz","4")
  254. # Events Rodemai
  255. elif event == "30868-04.htm":
  256. st.takeItems(G_Let_Rodemai,-1)
  257. st.set("cond","8")
  258. elif event == "30868-06a.htm":
  259. st.set("cond","10")
  260. elif event == "30868-10.htm":
  261. st.set("cond","12")
  262. # Events Cleo
  263. elif event == "30766-04.htm":
  264. st.set("cond","9")
  265. spawnedNpc=st.addSpawn(30766,160622,21230,-3710,90000)
  266. spawnedNpc.broadcastPacket(NpcSay(spawnedNpc.getObjectId(),0,spawnedNpc.getId(),"Blood and Honour."))
  267. spawnedNpc=st.addSpawn(30759,160665,21209,-3710,90000)
  268. spawnedNpc.broadcastPacket(NpcSay(spawnedNpc.getObjectId(),0,spawnedNpc.getId(),"Ambition and Power"))
  269. spawnedNpc=st.addSpawn(30758,160665,21291,-3710,90000)
  270. spawnedNpc.broadcastPacket(NpcSay(spawnedNpc.getObjectId(),0,spawnedNpc.getId(),"War and Death"))
  271. elif event == "30766-08.htm":
  272. st.takeItems(Scepter_Judgement,-1)
  273. exit503(0,st)
  274. return htmltext
  275. def onTalk (self,npc,player):
  276. htmltext = Quest.getNoQuestMsg(player)
  277. st = self.getQuestState(player, True)
  278. if not st : return htmltext
  279. npcId = npc.getId()
  280. id = st.getState()
  281. if npcId != NPC[3] and id == State.CREATED : return htmltext
  282. Martien,Athrea,Kalis,Gustaf,Fritz,Lutz,Kurtz,Kusto,Balthazar,Rodemai,Coffer,Cleo = 30645,30758,30759,30760,30761,30762,30763,30512,30764,30868,30765,30766
  283. isLeader = player.isClanLeader()
  284. if id == State.CREATED and npcId == Gustaf:
  285. for var in STATS: # adds all the vars for initialisation
  286. st.set(var,"0")
  287. if player.getClan(): # has Clan
  288. if isLeader: # check if player is clan leader
  289. clanLevel = player.getClan().getLevel()
  290. if st.getQuestItemsCount(Proof_Aspiration): # if he has the proof already, tell him what to do now
  291. htmltext = "30760-03.htm"
  292. st.exitQuest(1)
  293. elif clanLevel == 4: # if clanLevel == 4 you can take this quest, because repeatable
  294. htmltext = "30760-04.htm"
  295. else: # if clanLevel is too low or too high you cant take it
  296. htmltext = "30760-02.htm"
  297. st.exitQuest(1)
  298. else: # player isnt a leader
  299. htmltext = "30760-04t.htm"
  300. st.exitQuest(1)
  301. else: # no Clan
  302. htmltext = "30760-01.htm"
  303. st.exitQuest(1)
  304. return htmltext
  305. elif player.getClan() and player.getClan().getLevel() >= 5: # player has level 5 clan already
  306. return Quest.getAlreadyCompletedMsg(player)
  307. elif id == State.COMPLETED: # player has proof, and has finished quest as leader
  308. return Quest.getAlreadyCompletedMsg(player)
  309. else:
  310. ######## Leader Area ######
  311. if isLeader:
  312. cond = st.getInt("cond")
  313. kurtz = st.getInt("Kurtz")
  314. lutz = st.getInt("Lutz")
  315. fritz = st.getInt("Fritz")
  316. if npcId == Gustaf :
  317. if cond == 1:
  318. htmltext = "30760-09.htm"
  319. elif cond == 2:
  320. htmltext = "30760-10.htm"
  321. elif cond == 3:
  322. htmltext = "30760-11.htm"
  323. elif cond == 4:
  324. htmltext = "30760-13.htm"
  325. elif cond == 5:
  326. htmltext = "30760-14.htm"
  327. elif cond == 6:
  328. htmltext = "30760-15.htm"
  329. elif cond == 7:
  330. htmltext = "30760-17.htm"
  331. elif cond == 12:
  332. htmltext = "30760-19.htm"
  333. elif cond == 13:
  334. htmltext = "30760-24.htm"
  335. else:
  336. htmltext = "30760-18.htm"
  337. elif npcId == Martien :
  338. if cond == 1:
  339. htmltext = "30645-02.htm"
  340. elif cond == 2:
  341. if checkEggs(st) and kurtz > 1 and lutz > 1 and fritz > 1:
  342. htmltext = "30645-05.htm"
  343. st.set("cond","3")
  344. for item in EggList:
  345. st.takeItems(item,-1)
  346. else:
  347. htmltext = "30645-04.htm"
  348. elif cond == 3:
  349. htmltext = "30645-07.htm"
  350. else:
  351. htmltext = "30645-08.htm"
  352. elif cond == 2: # Dwarven Corpse in DV, only needed if condition is 2
  353. if npcId == Lutz:
  354. htmltext = "30762-01.htm"
  355. elif npcId == Kurtz:
  356. htmltext = "30763-01.htm"
  357. elif npcId == Fritz:
  358. htmltext = "30761-01.htm"
  359. elif npcId == Kusto:
  360. if kurtz == 1:
  361. htmltext = "30512-01.htm"
  362. elif kurtz == 2:
  363. htmltext = "30512-02.htm"
  364. else:
  365. htmltext = "30512-04.htm"
  366. return htmltext
  367. elif npcId == Balthazar:
  368. if cond == 4:
  369. if kurtz > 2:
  370. htmltext = "30764-04.htm"
  371. else:
  372. htmltext = "30764-02.htm"
  373. elif cond == 5:
  374. if st.getQuestItemsCount(Spiteful_Soul_Energy) >= 10 :
  375. htmltext = "30764-08.htm"
  376. st.takeItems(Spiteful_Soul_Energy,-1)
  377. st.takeItems(Brooch,-1)
  378. st.set("cond","6")
  379. else:
  380. htmltext = "30764-07.htm"
  381. elif cond == 6:
  382. htmltext = "30764-09.htm"
  383. elif npcId == Rodemai:
  384. if cond == 7:
  385. htmltext = "30868-02.htm"
  386. elif cond == 8:
  387. htmltext = "30868-05.htm"
  388. elif cond == 9:
  389. htmltext = "30868-06.htm"
  390. elif cond == 10:
  391. htmltext = "30868-08.htm"
  392. elif cond == 11:
  393. htmltext = "30868-09.htm"
  394. elif cond == 12:
  395. htmltext = "30868-11.htm"
  396. elif npcId == Cleo:
  397. if cond == 8:
  398. htmltext = "30766-02.htm"
  399. elif cond == 9:
  400. htmltext = "30766-05.htm"
  401. elif cond == 10:
  402. htmltext = "30766-06.htm"
  403. elif cond in [11,12,13]:
  404. htmltext = "30766-07.htm"
  405. elif npcId == Coffer:
  406. if st.getInt("cond") == 10:
  407. if st.getQuestItemsCount(Imp_Keys) < 6:
  408. htmltext = "30765-03a.htm"
  409. elif st.getInt("ImpGraveKeeper") == 3:
  410. htmltext = "30765-02.htm"
  411. st.set("cond","11")
  412. st.takeItems(Imp_Keys,6)
  413. st.giveItems(Scepter_Judgement,1)
  414. else:
  415. htmltext = "<html><body>(You and your Clan didn't kill the Imperial Gravekeeper by your own, go and try again.)</body></html>"
  416. else:
  417. htmltext = "<html><body>(You already have the Scepter of Judgement.)</body></html>"
  418. elif npcId == Kalis:
  419. htmltext = "30759-01.htm"
  420. elif npcId == Athrea:
  421. htmltext = "30758-01.htm"
  422. return htmltext
  423. ######## Member Area ######
  424. else:
  425. cond = getLeaderVar(st,"cond")
  426. if npcId == Martien and cond in [1,2,3]:
  427. htmltext = "30645-01.htm"
  428. elif npcId == Rodemai :
  429. if cond in [9,10]:
  430. htmltext = "30868-07.htm"
  431. elif cond == 7:
  432. htmltext = "30868-01.htm"
  433. elif npcId == Balthazar and cond == 4:
  434. htmltext = "30764-01.htm"
  435. elif npcId == Cleo and cond == 8:
  436. htmltext = "30766-01.htm"
  437. elif npcId == Kusto and 6 > cond > 2:
  438. htmltext = "30512-01a.htm"
  439. elif npcId == Coffer and cond == 10:
  440. htmltext = "30765-01.htm"
  441. elif npcId == Gustaf:
  442. if cond == 3:
  443. htmltext = "30760-11t.htm"
  444. elif cond == 4:
  445. htmltext = "30760-15t.htm"
  446. elif cond == 12:
  447. htmltext = "30760-19t.htm"
  448. elif cond == 13:
  449. htmltext = "30766-24t.htm"
  450. return htmltext
  451. def onAttack(self, npc, player, damage, isPet, skill):
  452. npdId = npc.getId()
  453. if (npc.getMaxHp()/2) > npc.getCurrentHp():
  454. if Rnd.get(100) < 4:
  455. if self.ImpGraveKepperStat == 1:
  456. for j in range(2):
  457. for k in range(2):
  458. self.addSpawn(27180,npc.getX()+70*pow(-1,j%2),npc.getY()+70*pow(-1,k%2),npc.getZ(),0,False,0)
  459. self.ImpGraveKepperStat = 2
  460. else:
  461. players = npc.getKnownList().getKnownPlayers().values().toArray()
  462. if len(players) :
  463. playerToTP = players[Rnd.get(int(len(players)))]
  464. playerToTP.teleToLocation(185462,20342,-3250)
  465. return
  466. def onKill(self,npc,player,isPet):
  467. # all kill events triggered by the leader occur automatically.
  468. # However, kill events that were triggered by members occur via the leader and
  469. # only if the leader is online and within a certain distance!
  470. leader_st = 0
  471. if player.isClanLeader() :
  472. leader_st = self.getQuestState(player, False)
  473. else :
  474. clan = player.getClan()
  475. if clan:
  476. c_leader=clan.getLeader()
  477. if c_leader:
  478. leader=c_leader.getPlayerInstance()
  479. if leader :
  480. if player.isInsideRadius(leader, 1600, 1, 0) :
  481. leader_st = leader.getQuestState(qn)
  482. if leader_st :
  483. if leader_st.getState() != State.STARTED : return
  484. npcId=npc.getId()
  485. condition,maxcount,chance,itemList = DROPLIST[npcId]
  486. random = self.getRandom(100)
  487. cond = leader_st.getInt("cond")
  488. if cond == condition and random < chance:
  489. if len(itemList) > 1:
  490. stoneRandom = self.getRandom(3)
  491. if stoneRandom == 0 :
  492. if leader_st.getInt("Kurtz") < 4:
  493. return
  494. else:
  495. maxcount*=4
  496. giveItem(itemList[stoneRandom],maxcount,leader_st)
  497. elif len(itemList) :
  498. giveItem(itemList[0],maxcount,leader_st)
  499. else:
  500. if npcId == 27181: # Imperial Gravekeeper
  501. spawnedNpc=leader_st.addSpawn(30765,120000)
  502. npc.broadcastPacket(NpcSay(spawnedNpc.getObjectId(),0,spawnedNpc.getId(),"Curse of the gods on the one that defiles the property of the empire!"))
  503. leader_st.set("ImpGraveKeeper","3")
  504. self.ImpGraveKepperStat = 1
  505. else:
  506. leader_st.addSpawn(27179)
  507. return
  508. QUEST = Quest(503,qn,"Pursuit of Clan Ambition")
  509. QUEST.addStartNpc(NPC[3])
  510. for npcId in NPC:
  511. QUEST.addTalkId(npcId)
  512. for mobId in DROPLIST.keys():
  513. QUEST.addKillId(mobId)
  514. QUEST.addAttackId(27181)