Q00111_ElrokianHuntersProof.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  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.Q00111_ElrokianHuntersProof;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import com.l2jserver.gameserver.enums.QuestSound;
  23. import com.l2jserver.gameserver.model.actor.L2Npc;
  24. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  25. import com.l2jserver.gameserver.model.holders.ItemChanceHolder;
  26. import com.l2jserver.gameserver.model.quest.Quest;
  27. import com.l2jserver.gameserver.model.quest.QuestState;
  28. import com.l2jserver.gameserver.model.quest.State;
  29. /**
  30. * Elrokian Hunter's Proof (111)
  31. * @author Adry_85
  32. */
  33. public final class Q00111_ElrokianHuntersProof extends Quest
  34. {
  35. // NPCs
  36. private static final int MARQUEZ = 32113;
  37. private static final int MUSHIKA = 32114;
  38. private static final int ASAMAH = 32115;
  39. private static final int KIRIKACHIN = 32116;
  40. // Items
  41. private static final int ELROKIAN_TRAP = 8763;
  42. private static final int TRAP_STONE = 8764;
  43. private static final int DIARY_FRAGMENT = 8768;
  44. private static final int EXPEDITION_MEMBERS_LETTER = 8769;
  45. private static final int ORNITHOMINUS_CLAW = 8770;
  46. private static final int DEINONYCHUS_BONE = 8771;
  47. private static final int PACHYCEPHALOSAURUS_SKIN = 8772;
  48. private static final int PRACTICE_ELROKIAN_TRAP = 8773;
  49. // Misc
  50. private static final int MIN_LEVEL = 75;
  51. // Mobs
  52. private static final Map<Integer, ItemChanceHolder> MOBS_DROP_CHANCES = new HashMap<>();
  53. static
  54. {
  55. MOBS_DROP_CHANCES.put(22196, new ItemChanceHolder(DIARY_FRAGMENT, 0.51, 4)); // velociraptor_leader
  56. MOBS_DROP_CHANCES.put(22197, new ItemChanceHolder(DIARY_FRAGMENT, 0.51, 4)); // velociraptor
  57. MOBS_DROP_CHANCES.put(22198, new ItemChanceHolder(DIARY_FRAGMENT, 0.51, 4)); // velociraptor_s
  58. MOBS_DROP_CHANCES.put(22218, new ItemChanceHolder(DIARY_FRAGMENT, 0.25, 4)); // velociraptor_n
  59. MOBS_DROP_CHANCES.put(22223, new ItemChanceHolder(DIARY_FRAGMENT, 0.26, 4)); // velociraptor_leader2
  60. MOBS_DROP_CHANCES.put(22200, new ItemChanceHolder(ORNITHOMINUS_CLAW, 0.66, 11)); // ornithomimus_leader
  61. MOBS_DROP_CHANCES.put(22201, new ItemChanceHolder(ORNITHOMINUS_CLAW, 0.33, 11)); // ornithomimus
  62. MOBS_DROP_CHANCES.put(22202, new ItemChanceHolder(ORNITHOMINUS_CLAW, 0.66, 11)); // ornithomimus_s
  63. MOBS_DROP_CHANCES.put(22219, new ItemChanceHolder(ORNITHOMINUS_CLAW, 0.33, 11)); // ornithomimus_n
  64. MOBS_DROP_CHANCES.put(22224, new ItemChanceHolder(ORNITHOMINUS_CLAW, 0.33, 11)); // ornithomimus_leader2
  65. MOBS_DROP_CHANCES.put(22203, new ItemChanceHolder(DEINONYCHUS_BONE, 0.65, 11)); // deinonychus_leader
  66. MOBS_DROP_CHANCES.put(22204, new ItemChanceHolder(DEINONYCHUS_BONE, 0.32, 11)); // deinonychus
  67. MOBS_DROP_CHANCES.put(22205, new ItemChanceHolder(DEINONYCHUS_BONE, 0.66, 11)); // deinonychus_s
  68. MOBS_DROP_CHANCES.put(22220, new ItemChanceHolder(DEINONYCHUS_BONE, 0.32, 11)); // deinonychus_n
  69. MOBS_DROP_CHANCES.put(22225, new ItemChanceHolder(DEINONYCHUS_BONE, 0.32, 11)); // deinonychus_leader2
  70. MOBS_DROP_CHANCES.put(22208, new ItemChanceHolder(PACHYCEPHALOSAURUS_SKIN, 0.50, 11)); // pachycephalosaurus_ldr
  71. MOBS_DROP_CHANCES.put(22209, new ItemChanceHolder(PACHYCEPHALOSAURUS_SKIN, 0.50, 11)); // pachycephalosaurus
  72. MOBS_DROP_CHANCES.put(22210, new ItemChanceHolder(PACHYCEPHALOSAURUS_SKIN, 0.50, 11)); // pachycephalosaurus_s
  73. MOBS_DROP_CHANCES.put(22221, new ItemChanceHolder(PACHYCEPHALOSAURUS_SKIN, 0.49, 11)); // pachycephalosaurus_n
  74. MOBS_DROP_CHANCES.put(22226, new ItemChanceHolder(PACHYCEPHALOSAURUS_SKIN, 0.50, 11)); // pachycephalosaurus_ldr2
  75. }
  76. public Q00111_ElrokianHuntersProof()
  77. {
  78. super(111, Q00111_ElrokianHuntersProof.class.getSimpleName(), "Elrokian Hunter's Proof");
  79. addStartNpc(MARQUEZ);
  80. addTalkId(MARQUEZ, MUSHIKA, ASAMAH, KIRIKACHIN);
  81. addKillId(MOBS_DROP_CHANCES.keySet());
  82. registerQuestItems(DIARY_FRAGMENT, EXPEDITION_MEMBERS_LETTER, ORNITHOMINUS_CLAW, DEINONYCHUS_BONE, PACHYCEPHALOSAURUS_SKIN, PRACTICE_ELROKIAN_TRAP);
  83. }
  84. @Override
  85. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  86. {
  87. final QuestState qs = getQuestState(player, false);
  88. String htmltext = null;
  89. if (qs == null)
  90. {
  91. return htmltext;
  92. }
  93. switch (event)
  94. {
  95. case "32113-02.htm":
  96. case "32113-05.htm":
  97. case "32113-04.html":
  98. case "32113-10.html":
  99. case "32113-11.html":
  100. case "32113-12.html":
  101. case "32113-13.html":
  102. case "32113-14.html":
  103. case "32113-18.html":
  104. case "32113-19.html":
  105. case "32113-20.html":
  106. case "32113-21.html":
  107. case "32113-22.html":
  108. case "32113-23.html":
  109. case "32113-24.html":
  110. case "32115-08.html":
  111. case "32116-03.html":
  112. {
  113. htmltext = event;
  114. break;
  115. }
  116. case "32113-03.html":
  117. {
  118. qs.startQuest();
  119. qs.setMemoState(1);
  120. htmltext = event;
  121. break;
  122. }
  123. case "32113-15.html":
  124. {
  125. if (qs.isMemoState(3))
  126. {
  127. qs.setMemoState(4);
  128. qs.setCond(4, true);
  129. htmltext = event;
  130. }
  131. break;
  132. }
  133. case "32113-25.html":
  134. {
  135. if (qs.isMemoState(5))
  136. {
  137. qs.setMemoState(6);
  138. qs.setCond(6, true);
  139. giveItems(player, EXPEDITION_MEMBERS_LETTER, 1);
  140. htmltext = event;
  141. }
  142. break;
  143. }
  144. case "32115-03.html":
  145. {
  146. if (qs.isMemoState(2))
  147. {
  148. qs.setMemoState(3);
  149. qs.setCond(3, true);
  150. htmltext = event;
  151. }
  152. break;
  153. }
  154. case "32115-06.html":
  155. {
  156. if (qs.isMemoState(9))
  157. {
  158. qs.setMemoState(10);
  159. qs.setCond(9);
  160. playSound(player, QuestSound.ETCSOUND_ELROKI_SONG_FULL);
  161. htmltext = event;
  162. }
  163. break;
  164. }
  165. case "32115-09.html":
  166. {
  167. if (qs.isMemoState(10))
  168. {
  169. qs.setMemoState(11);
  170. qs.setCond(10, true);
  171. htmltext = event;
  172. }
  173. break;
  174. }
  175. case "32116-04.html":
  176. {
  177. if (qs.isMemoState(7))
  178. {
  179. qs.setMemoState(8);
  180. playSound(player, QuestSound.ETCSOUND_ELROKI_SONG_FULL);
  181. htmltext = event;
  182. }
  183. break;
  184. }
  185. case "32116-07.html":
  186. {
  187. if (qs.isMemoState(8))
  188. {
  189. qs.setMemoState(9);
  190. qs.setCond(8, true);
  191. htmltext = event;
  192. }
  193. break;
  194. }
  195. case "32116-10.html":
  196. {
  197. if (qs.isMemoState(12) && hasQuestItems(player, PRACTICE_ELROKIAN_TRAP))
  198. {
  199. takeItems(player, PRACTICE_ELROKIAN_TRAP, -1);
  200. giveItems(player, ELROKIAN_TRAP, 1);
  201. giveItems(player, TRAP_STONE, 100);
  202. giveAdena(player, 1071691, true);
  203. addExpAndSp(player, 553524, 55538);
  204. qs.exitQuest(false, true);
  205. htmltext = event;
  206. }
  207. break;
  208. }
  209. }
  210. return htmltext;
  211. }
  212. @Override
  213. public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
  214. {
  215. final QuestState qs = getRandomPartyMemberState(player, -1, 3, npc);
  216. if (qs != null)
  217. {
  218. final ItemChanceHolder item = MOBS_DROP_CHANCES.get(npc.getId());
  219. if (item.getCount() == qs.getMemoState())
  220. {
  221. if (qs.isCond(4))
  222. {
  223. if (giveItemRandomly(qs.getPlayer(), npc, item.getId(), 1, 50, item.getChance(), true))
  224. {
  225. qs.setCond(5);
  226. }
  227. }
  228. else if (qs.isCond(10))
  229. {
  230. if (giveItemRandomly(qs.getPlayer(), npc, item.getId(), 1, 10, item.getChance(), true) //
  231. && (getQuestItemsCount(qs.getPlayer(), ORNITHOMINUS_CLAW) >= 10) //
  232. && (getQuestItemsCount(qs.getPlayer(), DEINONYCHUS_BONE) >= 10) //
  233. && (getQuestItemsCount(qs.getPlayer(), PACHYCEPHALOSAURUS_SKIN) >= 10))
  234. {
  235. qs.setCond(11);
  236. }
  237. }
  238. }
  239. }
  240. return super.onKill(npc, player, isSummon);
  241. }
  242. @Override
  243. public String onTalk(L2Npc npc, L2PcInstance player)
  244. {
  245. QuestState qs = getQuestState(player, true);
  246. String htmltext = getNoQuestMsg(player);
  247. if (qs == null)
  248. {
  249. return htmltext;
  250. }
  251. switch (qs.getState())
  252. {
  253. case State.COMPLETED:
  254. {
  255. if (npc.getId() == MARQUEZ)
  256. {
  257. htmltext = getAlreadyCompletedMsg(player);
  258. }
  259. break;
  260. }
  261. case State.CREATED:
  262. {
  263. if (npc.getId() == MARQUEZ)
  264. {
  265. htmltext = ((player.getLevel() >= MIN_LEVEL) ? "32113-01.htm" : "32113-06.html");
  266. }
  267. break;
  268. }
  269. case State.STARTED:
  270. {
  271. switch (npc.getId())
  272. {
  273. case MARQUEZ:
  274. {
  275. switch (qs.getMemoState())
  276. {
  277. case 1:
  278. {
  279. htmltext = "32113-07.html";
  280. break;
  281. }
  282. case 2:
  283. {
  284. htmltext = "32113-08.html";
  285. break;
  286. }
  287. case 3:
  288. {
  289. htmltext = "32113-09.html";
  290. break;
  291. }
  292. case 4:
  293. {
  294. if (getQuestItemsCount(player, DIARY_FRAGMENT) < 50)
  295. {
  296. htmltext = "32113-16.html";
  297. }
  298. else
  299. {
  300. takeItems(player, DIARY_FRAGMENT, -1);
  301. qs.setMemoState(5);
  302. htmltext = "32113-17.html";
  303. }
  304. break;
  305. }
  306. case 5:
  307. {
  308. htmltext = "32113-26.html";
  309. break;
  310. }
  311. case 6:
  312. {
  313. htmltext = "32113-27.html";
  314. break;
  315. }
  316. case 7:
  317. case 8:
  318. {
  319. htmltext = "32113-28.html";
  320. break;
  321. }
  322. case 9:
  323. {
  324. htmltext = "32113-29.html";
  325. break;
  326. }
  327. case 10:
  328. case 11:
  329. case 12:
  330. {
  331. htmltext = "32113-30.html";
  332. break;
  333. }
  334. }
  335. break;
  336. }
  337. case MUSHIKA:
  338. {
  339. if (qs.isMemoState(1))
  340. {
  341. qs.setCond(2, true);
  342. qs.setMemoState(2);
  343. htmltext = "32114-01.html";
  344. }
  345. else if ((qs.getMemoState() > 1) && (qs.getMemoState() < 10))
  346. {
  347. htmltext = "32114-02.html";
  348. }
  349. else
  350. {
  351. htmltext = "32114-03.html";
  352. }
  353. break;
  354. }
  355. case ASAMAH:
  356. {
  357. switch (qs.getMemoState())
  358. {
  359. case 1:
  360. {
  361. htmltext = "32115-01.html";
  362. break;
  363. }
  364. case 2:
  365. {
  366. htmltext = "32115-02.html";
  367. break;
  368. }
  369. case 3:
  370. case 4:
  371. case 5:
  372. case 6:
  373. case 7:
  374. case 8:
  375. {
  376. htmltext = "32115-04.html";
  377. break;
  378. }
  379. case 9:
  380. {
  381. htmltext = "32115-05.html";
  382. break;
  383. }
  384. case 10:
  385. {
  386. htmltext = "32115-07.html";
  387. break;
  388. }
  389. case 11:
  390. {
  391. if ((getQuestItemsCount(player, ORNITHOMINUS_CLAW) < 10) || (getQuestItemsCount(player, DEINONYCHUS_BONE) < 10) || (getQuestItemsCount(player, PACHYCEPHALOSAURUS_SKIN) < 10))
  392. {
  393. htmltext = "32115-10.html";
  394. }
  395. else
  396. {
  397. qs.setMemoState(12);
  398. qs.setCond(12, true);
  399. giveItems(player, PRACTICE_ELROKIAN_TRAP, 1);
  400. takeItems(player, ORNITHOMINUS_CLAW, -1);
  401. takeItems(player, DEINONYCHUS_BONE, -1);
  402. takeItems(player, PACHYCEPHALOSAURUS_SKIN, -1);
  403. htmltext = "32115-11.html";
  404. }
  405. break;
  406. }
  407. case 12:
  408. {
  409. htmltext = "32115-12.html";
  410. break;
  411. }
  412. }
  413. break;
  414. }
  415. case KIRIKACHIN:
  416. {
  417. switch (qs.getMemoState())
  418. {
  419. case 1:
  420. case 2:
  421. case 3:
  422. case 4:
  423. case 5:
  424. {
  425. htmltext = "32116-01.html";
  426. break;
  427. }
  428. case 6:
  429. {
  430. if (hasQuestItems(player, EXPEDITION_MEMBERS_LETTER))
  431. {
  432. qs.setMemoState(7);
  433. qs.setCond(7, true);
  434. takeItems(player, EXPEDITION_MEMBERS_LETTER, -1);
  435. htmltext = "32116-02.html";
  436. }
  437. break;
  438. }
  439. case 7:
  440. {
  441. htmltext = "32116-05.html";
  442. break;
  443. }
  444. case 8:
  445. {
  446. htmltext = "32116-06.html";
  447. break;
  448. }
  449. case 9:
  450. case 10:
  451. case 11:
  452. {
  453. htmltext = "32116-08.html";
  454. break;
  455. }
  456. case 12:
  457. {
  458. htmltext = "32116-09.html";
  459. break;
  460. }
  461. }
  462. break;
  463. }
  464. }
  465. break;
  466. }
  467. }
  468. return htmltext;
  469. }
  470. }