Q00345_MethodToRaiseTheDead.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. /*
  2. * Copyright (C) 2004-2015 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package quests.Q00345_MethodToRaiseTheDead;
  20. import com.l2jserver.gameserver.enums.QuestSound;
  21. import com.l2jserver.gameserver.model.actor.L2Npc;
  22. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  23. import com.l2jserver.gameserver.model.itemcontainer.Inventory;
  24. import com.l2jserver.gameserver.model.quest.Quest;
  25. import com.l2jserver.gameserver.model.quest.QuestState;
  26. import com.l2jserver.gameserver.util.Util;
  27. /**
  28. * Method to Raise the Dead (345)
  29. * @author Adry_85
  30. */
  31. public final class Q00345_MethodToRaiseTheDead extends Quest
  32. {
  33. // NPCs
  34. private static final int XENOVIA = 30912;
  35. private static final int DOROTHY = 30970;
  36. private static final int ORPHEUS = 30971;
  37. private static final int MEDIUM_JAR = 30973;
  38. // Items
  39. private static final int IMPERIAL_DIAMOND = 3456;
  40. private static final int VICTIMS_ARM_BONE = 4274;
  41. private static final int VICTIMS_THIGH_BONE = 4275;
  42. private static final int VICTIMS_SKULL = 4276;
  43. private static final int VICTIMS_RIB_BONE = 4277;
  44. private static final int VICTIMS_SPINE = 4278;
  45. private static final int USELESS_BONE_PIECES = 4280;
  46. private static final int POWDER_TO_SUMMON_DEAD_SOULS = 4281;
  47. private static final int BILL_OF_IASON_HEINE = 4407;
  48. // Misc
  49. private static final int MIN_LEVEL = 35;
  50. // Monsters
  51. private static final int CROKIAN = 20789;
  52. private static final int CROKIAN_WARRIOR = 20791;
  53. public Q00345_MethodToRaiseTheDead()
  54. {
  55. super(345, Q00345_MethodToRaiseTheDead.class.getSimpleName(), "Method to Raise the Dead");
  56. addStartNpc(DOROTHY);
  57. addTalkId(DOROTHY, ORPHEUS, MEDIUM_JAR, XENOVIA);
  58. addKillId(CROKIAN, CROKIAN_WARRIOR);
  59. registerQuestItems(VICTIMS_ARM_BONE, VICTIMS_THIGH_BONE, VICTIMS_SKULL, VICTIMS_RIB_BONE, VICTIMS_SPINE, USELESS_BONE_PIECES, POWDER_TO_SUMMON_DEAD_SOULS);
  60. }
  61. @Override
  62. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  63. {
  64. final QuestState qs = getQuestState(player, false);
  65. if (qs == null)
  66. {
  67. return null;
  68. }
  69. String htmltext = null;
  70. switch (event)
  71. {
  72. case "30970-02.htm":
  73. {
  74. qs.startQuest();
  75. htmltext = event;
  76. break;
  77. }
  78. case "30970-03.html":
  79. {
  80. qs.setMemoState(1);
  81. htmltext = event;
  82. break;
  83. }
  84. case "30970-07.html":
  85. {
  86. if (hasQuestItems(player, VICTIMS_ARM_BONE, VICTIMS_THIGH_BONE, VICTIMS_SKULL, VICTIMS_RIB_BONE, VICTIMS_SPINE))
  87. {
  88. qs.setMemoState(2);
  89. qs.setCond(2, true);
  90. htmltext = event;
  91. }
  92. break;
  93. }
  94. case "30971-02.html":
  95. case "30912-05.html":
  96. {
  97. htmltext = event;
  98. break;
  99. }
  100. case "30971-03.html":
  101. {
  102. final long uselessBonePiecesCount = getQuestItemsCount(player, USELESS_BONE_PIECES);
  103. if (uselessBonePiecesCount > 0)
  104. {
  105. giveAdena(player, uselessBonePiecesCount * 104, true);
  106. takeItems(player, USELESS_BONE_PIECES, -1);
  107. htmltext = event;
  108. }
  109. break;
  110. }
  111. case "30973-02.html":
  112. {
  113. final int memoStateEx = qs.getMemoStateEx(1);
  114. if (memoStateEx == 1)
  115. {
  116. htmltext = event;
  117. }
  118. else if (memoStateEx == 2)
  119. {
  120. htmltext = "30973-04.html";
  121. }
  122. else if (memoStateEx == 3)
  123. {
  124. htmltext = "30973-06.html";
  125. }
  126. break;
  127. }
  128. case "30973-03.html":
  129. {
  130. if (qs.isMemoState(7) && (qs.getMemoStateEx(1) == 1))
  131. {
  132. qs.setMemoState(8);
  133. qs.setCond(6, true);
  134. htmltext = event;
  135. }
  136. break;
  137. }
  138. case "30973-05.html":
  139. {
  140. if (qs.isMemoState(7) && (qs.getMemoStateEx(1) == 2))
  141. {
  142. qs.setMemoState(8);
  143. qs.setCond(6, true);
  144. htmltext = event;
  145. }
  146. break;
  147. }
  148. case "30973-07.html":
  149. {
  150. if (qs.isMemoState(7) && (qs.getMemoStateEx(1) == 3))
  151. {
  152. qs.setMemoState(8);
  153. qs.setCond(7, true);
  154. htmltext = event;
  155. }
  156. break;
  157. }
  158. case "30912-02.html":
  159. {
  160. if (qs.isMemoState(2))
  161. {
  162. htmltext = event;
  163. }
  164. break;
  165. }
  166. case "30912-03.html":
  167. {
  168. if (qs.isMemoState(2))
  169. {
  170. if (player.getAdena() >= 1000)
  171. {
  172. giveItems(player, POWDER_TO_SUMMON_DEAD_SOULS, 1);
  173. takeItems(player, Inventory.ADENA_ID, 1000);
  174. qs.setMemoState(3);
  175. qs.setCond(3, true);
  176. htmltext = event;
  177. }
  178. else
  179. {
  180. htmltext = "30912-04.html";
  181. }
  182. }
  183. break;
  184. }
  185. }
  186. return htmltext;
  187. }
  188. @Override
  189. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  190. {
  191. final QuestState qs = getRandomPartyMemberState(killer, 1, 3, npc);
  192. if ((qs == null) || !Util.checkIfInRange(1500, npc, killer, true))
  193. {
  194. return null;
  195. }
  196. final int random = getRandom(100);
  197. if (random <= 5)
  198. {
  199. if (!hasQuestItems(qs.getPlayer(), VICTIMS_ARM_BONE))
  200. {
  201. giveItems(qs.getPlayer(), VICTIMS_ARM_BONE, 1);
  202. }
  203. else
  204. {
  205. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  206. }
  207. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  208. }
  209. else if (random <= 11)
  210. {
  211. if (!hasQuestItems(qs.getPlayer(), VICTIMS_THIGH_BONE))
  212. {
  213. giveItems(qs.getPlayer(), VICTIMS_THIGH_BONE, 1);
  214. }
  215. else
  216. {
  217. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  218. }
  219. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  220. }
  221. else if (random <= 17)
  222. {
  223. if (!hasQuestItems(qs.getPlayer(), VICTIMS_SKULL))
  224. {
  225. giveItems(qs.getPlayer(), VICTIMS_SKULL, 1);
  226. }
  227. else
  228. {
  229. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  230. }
  231. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  232. }
  233. else if (random <= 23)
  234. {
  235. if (!hasQuestItems(qs.getPlayer(), VICTIMS_RIB_BONE))
  236. {
  237. giveItems(qs.getPlayer(), VICTIMS_RIB_BONE, 1);
  238. }
  239. else
  240. {
  241. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  242. }
  243. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  244. }
  245. else if (random <= 29)
  246. {
  247. if (!hasQuestItems(qs.getPlayer(), VICTIMS_SPINE))
  248. {
  249. giveItems(qs.getPlayer(), VICTIMS_SPINE, 1);
  250. }
  251. else
  252. {
  253. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  254. }
  255. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  256. }
  257. else if (random <= 60)
  258. {
  259. giveItems(qs.getPlayer(), USELESS_BONE_PIECES, 1);
  260. }
  261. return super.onKill(npc, killer, isSummon);
  262. }
  263. @Override
  264. public String onTalk(L2Npc npc, L2PcInstance player)
  265. {
  266. QuestState qs = getQuestState(player, true);
  267. String htmltext = getNoQuestMsg(player);
  268. if (qs.isCreated())
  269. {
  270. htmltext = (player.getLevel() >= MIN_LEVEL) ? "30970-01.htm" : "30970-04.htm";
  271. }
  272. else if (qs.isStarted())
  273. {
  274. switch (npc.getId())
  275. {
  276. case DOROTHY:
  277. {
  278. switch (qs.getMemoState())
  279. {
  280. case 0:
  281. {
  282. htmltext = "30970-03.html";
  283. qs.setMemoState(1);
  284. break;
  285. }
  286. case 1:
  287. {
  288. htmltext = (!hasQuestItems(player, VICTIMS_ARM_BONE, VICTIMS_THIGH_BONE, VICTIMS_SKULL, VICTIMS_RIB_BONE, VICTIMS_SPINE)) ? "30970-05.html" : "30970-06.html";
  289. break;
  290. }
  291. case 2:
  292. {
  293. htmltext = "30970-08.html";
  294. break;
  295. }
  296. case 3:
  297. {
  298. htmltext = "30970-09.html";
  299. break;
  300. }
  301. case 7:
  302. {
  303. htmltext = "30970-10.html";
  304. break;
  305. }
  306. case 8:
  307. {
  308. final int memoStateEx = qs.getMemoStateEx(1);
  309. final long uselessBonePiecesCount = getQuestItemsCount(player, USELESS_BONE_PIECES);
  310. if ((memoStateEx == 1) || (memoStateEx == 2))
  311. {
  312. giveItems(player, BILL_OF_IASON_HEINE, 3);
  313. giveAdena(player, 5390 + (70 * uselessBonePiecesCount), true);
  314. htmltext = "30970-11.html";
  315. }
  316. else if (memoStateEx == 3)
  317. {
  318. if (getRandom(100) <= 92)
  319. {
  320. giveItems(player, BILL_OF_IASON_HEINE, 5);
  321. }
  322. else
  323. {
  324. giveItems(player, IMPERIAL_DIAMOND, 1);
  325. }
  326. giveAdena(player, 3040 + (70 * uselessBonePiecesCount), true);
  327. htmltext = "30970-12.html";
  328. }
  329. qs.exitQuest(true, true);
  330. break;
  331. }
  332. }
  333. break;
  334. }
  335. case ORPHEUS:
  336. {
  337. if (hasQuestItems(player, USELESS_BONE_PIECES))
  338. {
  339. htmltext = "30971-01.html";
  340. }
  341. break;
  342. }
  343. case MEDIUM_JAR:
  344. {
  345. switch (qs.getMemoState())
  346. {
  347. case 3:
  348. {
  349. takeItems(player, -1, POWDER_TO_SUMMON_DEAD_SOULS, VICTIMS_ARM_BONE, VICTIMS_THIGH_BONE, VICTIMS_SKULL, VICTIMS_RIB_BONE, VICTIMS_SPINE);
  350. qs.setMemoState(7);
  351. final int random = getRandom(100);
  352. if (random <= 39)
  353. {
  354. qs.setMemoStateEx(1, 1);
  355. }
  356. else if (random <= 79)
  357. {
  358. qs.setMemoStateEx(1, 2);
  359. }
  360. else
  361. {
  362. qs.setMemoStateEx(1, 3);
  363. }
  364. htmltext = "30973-01.html";
  365. break;
  366. }
  367. case 7:
  368. {
  369. final int memoStateEx = qs.getMemoStateEx(1);
  370. if (memoStateEx == 1)
  371. {
  372. htmltext = "30973-08.html";
  373. }
  374. else if (memoStateEx == 2)
  375. {
  376. htmltext = "30973-09.html";
  377. }
  378. else if (memoStateEx == 3)
  379. {
  380. htmltext = "30973-10.html";
  381. }
  382. break;
  383. }
  384. case 8:
  385. {
  386. htmltext = "30973-11.html";
  387. break;
  388. }
  389. }
  390. break;
  391. }
  392. case XENOVIA:
  393. {
  394. if (qs.isMemoState(2))
  395. {
  396. htmltext = "30912-01.html";
  397. }
  398. else if (qs.isMemoState(7) || qs.isMemoState(8) || hasQuestItems(player, POWDER_TO_SUMMON_DEAD_SOULS))
  399. {
  400. htmltext = "30912-06.html";
  401. }
  402. break;
  403. }
  404. }
  405. }
  406. return htmltext;
  407. }
  408. }