Q00212_TrialOfDuty.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589
  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.Q00212_TrialOfDuty;
  20. import com.l2jserver.gameserver.enums.CategoryType;
  21. import com.l2jserver.gameserver.enums.QuestSound;
  22. import com.l2jserver.gameserver.model.actor.L2Npc;
  23. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  24. import com.l2jserver.gameserver.model.base.ClassId;
  25. import com.l2jserver.gameserver.model.holders.ItemHolder;
  26. import com.l2jserver.gameserver.model.items.L2Weapon;
  27. import com.l2jserver.gameserver.model.quest.Quest;
  28. import com.l2jserver.gameserver.model.quest.QuestState;
  29. import com.l2jserver.gameserver.model.variables.PlayerVariables;
  30. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  31. import com.l2jserver.gameserver.util.Util;
  32. /**
  33. * Trial of Duty (212)
  34. * @author jurchiks
  35. */
  36. public final class Q00212_TrialOfDuty extends Quest
  37. {
  38. // NPCs
  39. private static final int HANNAVALT = 30109;
  40. private static final int DUSTIN = 30116;
  41. private static final int SIR_COLLIN_WINDAWOOD = 30311;
  42. private static final int SIR_ARON_TANFORD = 30653;
  43. private static final int SIR_KIEL_NIGHTHAWK = 30654;
  44. private static final int ISAEL_SILVERSHADOW = 30655;
  45. private static final int SPIRIT_OF_SIR_TALIANUS = 30656;
  46. // Items
  47. private static final int LETTER_OF_DUSTIN = 2634;
  48. private static final int KNIGHTS_TEAR = 2635;
  49. private static final int MIRROR_OF_ORPIC = 2636;
  50. private static final int TEAR_OF_CONFESSION = 2637;
  51. private static final ItemHolder REPORT_PIECE = new ItemHolder(2638, 10);
  52. private static final int TALIANUSS_REPORT = 2639;
  53. private static final int TEAR_OF_LOYALTY = 2640;
  54. private static final ItemHolder MILITAS_ARTICLE = new ItemHolder(2641, 20);
  55. private static final int SAINTS_ASHES_URN = 2641;
  56. private static final int ATHEBALDTS_SKULL = 2643;
  57. private static final int ATHEBALDTS_RIBS = 2644;
  58. private static final int ATHEBALDTS_SHIN = 2645;
  59. private static final int LETTER_OF_WINDAWOOD = 2646;
  60. private static final int OLD_KNIGHTS_SWORD = 3027;
  61. // Monsters
  62. private static final int HANGMAN_TREE = 20144;
  63. private static final int SKELETON_MARAUDER = 20190;
  64. private static final int SKELETON_RAIDER = 20191;
  65. private static final int STRAIN = 20200;
  66. private static final int GHOUL = 20201;
  67. private static final int BREKA_ORC_OVERLORD = 20270;
  68. private static final int LETO_LIZARDMAN = 20577;
  69. private static final int LETO_LIZARDMAN_ARCHER = 20578;
  70. private static final int LETO_LIZARDMAN_SOLDIER = 20579;
  71. private static final int LETO_LIZARDMAN_WARRIOR = 20580;
  72. private static final int LETO_LIZARDMAN_SHAMAN = 20581;
  73. private static final int LETO_LIZARDMAN_OVERLORD = 20582;
  74. private static final int SPIRIT_OF_SIR_HEROD = 27119;
  75. // Rewards
  76. private static final int MARK_OF_DUTY = 2633;
  77. private static final int DIMENSIONAL_DIAMOND = 7562;
  78. // Misc
  79. private static final int MIN_LEVEL = 35;
  80. public Q00212_TrialOfDuty()
  81. {
  82. super(212, Q00212_TrialOfDuty.class.getSimpleName(), "Trial of Duty");
  83. addStartNpc(HANNAVALT);
  84. addTalkId(HANNAVALT, DUSTIN, SIR_COLLIN_WINDAWOOD, SIR_ARON_TANFORD, SIR_KIEL_NIGHTHAWK, ISAEL_SILVERSHADOW, SPIRIT_OF_SIR_TALIANUS);
  85. addKillId(HANGMAN_TREE, SKELETON_MARAUDER, SKELETON_RAIDER, STRAIN, GHOUL, BREKA_ORC_OVERLORD, LETO_LIZARDMAN, LETO_LIZARDMAN_ARCHER, LETO_LIZARDMAN_SOLDIER, LETO_LIZARDMAN_WARRIOR, LETO_LIZARDMAN_SHAMAN, LETO_LIZARDMAN_OVERLORD, SPIRIT_OF_SIR_HEROD);
  86. registerQuestItems(LETTER_OF_DUSTIN, KNIGHTS_TEAR, MIRROR_OF_ORPIC, TEAR_OF_CONFESSION, REPORT_PIECE.getId(), TALIANUSS_REPORT, TEAR_OF_LOYALTY, MILITAS_ARTICLE.getId(), SAINTS_ASHES_URN, ATHEBALDTS_SKULL, ATHEBALDTS_RIBS, ATHEBALDTS_SHIN, LETTER_OF_WINDAWOOD, OLD_KNIGHTS_SWORD);
  87. }
  88. @Override
  89. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  90. {
  91. final QuestState qs = getQuestState(player, false);
  92. String html = null;
  93. if (qs == null)
  94. {
  95. return html;
  96. }
  97. switch (event)
  98. {
  99. case "quest_accept":
  100. {
  101. if (qs.isCreated() && (player.getLevel() >= MIN_LEVEL) && player.isInCategory(CategoryType.KNIGHT_GROUP))
  102. {
  103. qs.startQuest();
  104. qs.setMemoState(1);
  105. qs.set("flag", 0);
  106. if (rewardDimensionalDiamonds(player))
  107. {
  108. html = "30109-04a.htm";
  109. }
  110. else
  111. {
  112. html = "30109-04.htm";
  113. }
  114. }
  115. break;
  116. }
  117. case "30116-02.html":
  118. case "30116-03.html":
  119. case "30116-04.html":
  120. {
  121. if (qs.isMemoState(10) && hasQuestItems(player, TEAR_OF_LOYALTY))
  122. {
  123. html = event;
  124. }
  125. break;
  126. }
  127. case "30116-05.html":
  128. {
  129. if (qs.isMemoState(10) && hasQuestItems(player, TEAR_OF_LOYALTY))
  130. {
  131. html = event;
  132. takeItems(player, TEAR_OF_LOYALTY, -1);
  133. qs.setMemoState(11);
  134. qs.setCond(14, true);
  135. }
  136. break;
  137. }
  138. }
  139. return html;
  140. }
  141. @Override
  142. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  143. {
  144. final QuestState qs = getQuestState(killer, false);
  145. if ((qs == null) || !Util.checkIfInRange(1500, killer, npc, true))
  146. {
  147. return super.onKill(npc, killer, isSummon);
  148. }
  149. switch (npc.getId())
  150. {
  151. case SKELETON_MARAUDER:
  152. case SKELETON_RAIDER:
  153. {
  154. if (qs.isMemoState(2))
  155. {
  156. final int flag = qs.getInt("flag");
  157. if (getRandom(100) < (flag * 10))
  158. {
  159. addSpawn(SPIRIT_OF_SIR_HEROD, npc);
  160. qs.set("flag", 0);
  161. }
  162. else
  163. {
  164. qs.set("flag", flag + 1);
  165. }
  166. }
  167. break;
  168. }
  169. case SPIRIT_OF_SIR_HEROD:
  170. {
  171. if (qs.isMemoState(2))
  172. {
  173. final L2Weapon weapon = killer.getActiveWeaponItem();
  174. if ((weapon != null) && (weapon.getId() == OLD_KNIGHTS_SWORD))
  175. {
  176. giveItems(killer, KNIGHTS_TEAR, 1);
  177. qs.setMemoState(3);
  178. qs.setCond(3, true);
  179. }
  180. }
  181. break;
  182. }
  183. case STRAIN:
  184. case GHOUL:
  185. {
  186. if (qs.isMemoState(5) && !hasQuestItems(killer, TALIANUSS_REPORT))
  187. {
  188. if (giveItemRandomly(killer, npc, REPORT_PIECE.getId(), 1, REPORT_PIECE.getCount(), 1, true))
  189. {
  190. takeItem(killer, REPORT_PIECE);
  191. giveItems(killer, TALIANUSS_REPORT, 1);
  192. qs.setCond(6);
  193. }
  194. }
  195. break;
  196. }
  197. case HANGMAN_TREE:
  198. {
  199. if (qs.isMemoState(6))
  200. {
  201. final int flag = qs.getInt("flag");
  202. if (getRandom(100) < ((flag - 3) * 33))
  203. {
  204. addSpawn(SPIRIT_OF_SIR_TALIANUS, npc);
  205. qs.set("flag", 0);
  206. qs.setCond(8, true);
  207. }
  208. else
  209. {
  210. qs.set("flag", flag + 1);
  211. }
  212. }
  213. break;
  214. }
  215. case LETO_LIZARDMAN:
  216. case LETO_LIZARDMAN_ARCHER:
  217. case LETO_LIZARDMAN_SOLDIER:
  218. case LETO_LIZARDMAN_WARRIOR:
  219. case LETO_LIZARDMAN_SHAMAN:
  220. case LETO_LIZARDMAN_OVERLORD:
  221. {
  222. if (qs.isMemoState(9) && giveItemRandomly(killer, npc, MILITAS_ARTICLE.getId(), 1, MILITAS_ARTICLE.getCount(), 1, true))
  223. {
  224. qs.setCond(12);
  225. }
  226. break;
  227. }
  228. case BREKA_ORC_OVERLORD:
  229. {
  230. if (qs.isMemoState(11))
  231. {
  232. if (!hasQuestItems(killer, ATHEBALDTS_SKULL))
  233. {
  234. giveItems(killer, ATHEBALDTS_SKULL, 1);
  235. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  236. }
  237. else if (!hasQuestItems(killer, ATHEBALDTS_RIBS))
  238. {
  239. giveItems(killer, ATHEBALDTS_RIBS, 1);
  240. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  241. }
  242. else if (!hasQuestItems(killer, ATHEBALDTS_SHIN))
  243. {
  244. giveItems(killer, ATHEBALDTS_SHIN, 1);
  245. qs.setCond(15, true);
  246. }
  247. }
  248. break;
  249. }
  250. }
  251. return super.onKill(npc, killer, isSummon);
  252. }
  253. @Override
  254. public String onTalk(L2Npc npc, L2PcInstance talker)
  255. {
  256. final QuestState qs = getQuestState(talker, true);
  257. String html = getNoQuestMsg(talker);
  258. switch (npc.getId())
  259. {
  260. case HANNAVALT:
  261. {
  262. if (qs.isCreated())
  263. {
  264. if (!talker.isInCategory(CategoryType.KNIGHT_GROUP))
  265. {
  266. html = "30109-02.html";
  267. }
  268. else if (talker.getLevel() < MIN_LEVEL)
  269. {
  270. html = "30109-01.html";
  271. }
  272. else
  273. {
  274. html = "30109-03.htm";
  275. }
  276. }
  277. else if (qs.isStarted())
  278. {
  279. switch (qs.getMemoState())
  280. {
  281. case 1:
  282. {
  283. html = "30109-04.html";
  284. break;
  285. }
  286. case 14:
  287. {
  288. if (hasQuestItems(talker, LETTER_OF_DUSTIN))
  289. {
  290. html = "30109-05.html";
  291. takeItems(talker, LETTER_OF_DUSTIN, -1);
  292. addExpAndSp(talker, 762576, 49458);
  293. giveAdena(talker, 138968, true);
  294. giveItems(talker, MARK_OF_DUTY, 1);
  295. qs.exitQuest(false, true);
  296. talker.sendPacket(new SocialAction(talker.getObjectId(), 3));
  297. rewardDimensionalDiamonds(talker);
  298. }
  299. break;
  300. }
  301. }
  302. }
  303. else
  304. {
  305. html = getAlreadyCompletedMsg(talker);
  306. }
  307. break;
  308. }
  309. case SIR_ARON_TANFORD:
  310. {
  311. switch (qs.getMemoState())
  312. {
  313. case 1:
  314. {
  315. html = "30653-01.html";
  316. if (!hasQuestItems(talker, OLD_KNIGHTS_SWORD))
  317. {
  318. giveItems(talker, OLD_KNIGHTS_SWORD, 1);
  319. }
  320. qs.setMemoState(2);
  321. qs.setCond(2, true);
  322. break;
  323. }
  324. case 2:
  325. {
  326. if (hasQuestItems(talker, OLD_KNIGHTS_SWORD))
  327. {
  328. html = "30653-02.html";
  329. }
  330. break;
  331. }
  332. case 3:
  333. {
  334. if (hasQuestItems(talker, KNIGHTS_TEAR))
  335. {
  336. html = "30653-03.html";
  337. takeItems(talker, -1, KNIGHTS_TEAR, OLD_KNIGHTS_SWORD);
  338. qs.setMemoState(4);
  339. qs.setCond(4, true);
  340. }
  341. break;
  342. }
  343. case 4:
  344. {
  345. html = "30653-04.html";
  346. break;
  347. }
  348. }
  349. break;
  350. }
  351. case SIR_KIEL_NIGHTHAWK:
  352. {
  353. switch (qs.getMemoState())
  354. {
  355. case 4:
  356. {
  357. html = "30654-01.html";
  358. qs.setMemoState(5);
  359. qs.setCond(5, true);
  360. break;
  361. }
  362. case 5:
  363. {
  364. if (!hasQuestItems(talker, TALIANUSS_REPORT))
  365. {
  366. html = "30654-02.html";
  367. }
  368. else
  369. {
  370. html = "30654-03.html";
  371. qs.setMemoState(6);
  372. qs.setCond(7, true);
  373. giveItems(talker, MIRROR_OF_ORPIC, 1);
  374. }
  375. break;
  376. }
  377. case 6:
  378. {
  379. if (hasQuestItems(talker, MIRROR_OF_ORPIC))
  380. {
  381. html = "30654-04.html";
  382. }
  383. break;
  384. }
  385. case 7:
  386. {
  387. if (hasQuestItems(talker, TEAR_OF_CONFESSION))
  388. {
  389. html = "30654-05.html";
  390. takeItems(talker, TEAR_OF_CONFESSION, -1);
  391. qs.setMemoState(8);
  392. qs.setCond(10, true);
  393. }
  394. break;
  395. }
  396. case 8:
  397. {
  398. html = "30654-06.html";
  399. break;
  400. }
  401. }
  402. break;
  403. }
  404. case SPIRIT_OF_SIR_TALIANUS:
  405. {
  406. if (qs.isMemoState(6) && hasQuestItems(talker, MIRROR_OF_ORPIC, TALIANUSS_REPORT))
  407. {
  408. html = "30656-01.html";
  409. takeItems(talker, -1, MIRROR_OF_ORPIC, TALIANUSS_REPORT);
  410. giveItems(talker, TEAR_OF_CONFESSION, 1);
  411. qs.setMemoState(7);
  412. qs.setCond(9, true);
  413. npc.deleteMe();
  414. }
  415. break;
  416. }
  417. case ISAEL_SILVERSHADOW:
  418. {
  419. switch (qs.getMemoState())
  420. {
  421. case 8:
  422. {
  423. if (talker.getLevel() < MIN_LEVEL)
  424. {
  425. html = "30655-01.html";
  426. }
  427. else
  428. {
  429. html = "30655-02.html";
  430. qs.setMemoState(9);
  431. qs.setCond(11, true);
  432. }
  433. break;
  434. }
  435. case 9:
  436. {
  437. if (!hasItem(talker, MILITAS_ARTICLE))
  438. {
  439. html = "30655-03.html";
  440. }
  441. else
  442. {
  443. html = "30655-04.html";
  444. giveItems(talker, TEAR_OF_LOYALTY, 1);
  445. takeItem(talker, MILITAS_ARTICLE);
  446. qs.setMemoState(10);
  447. qs.setCond(13, true);
  448. }
  449. break;
  450. }
  451. case 10:
  452. {
  453. if (hasQuestItems(talker, TEAR_OF_LOYALTY))
  454. {
  455. html = "30655-05.html";
  456. }
  457. break;
  458. }
  459. }
  460. break;
  461. }
  462. case DUSTIN:
  463. {
  464. switch (qs.getMemoState())
  465. {
  466. case 10:
  467. {
  468. if (hasQuestItems(talker, TEAR_OF_LOYALTY))
  469. {
  470. html = "30116-01.html";
  471. }
  472. break;
  473. }
  474. case 11:
  475. {
  476. if (!hasQuestItems(talker, ATHEBALDTS_SKULL, ATHEBALDTS_RIBS, ATHEBALDTS_SHIN))
  477. {
  478. html = "30116-06.html";
  479. }
  480. else
  481. {
  482. html = "30116-07.html";
  483. takeItems(talker, -1, ATHEBALDTS_SKULL, ATHEBALDTS_RIBS, ATHEBALDTS_SHIN);
  484. giveItems(talker, SAINTS_ASHES_URN, 1);
  485. qs.setMemoState(12);
  486. qs.setCond(16, true);
  487. }
  488. break;
  489. }
  490. case 12:
  491. {
  492. if (hasQuestItems(talker, SAINTS_ASHES_URN))
  493. {
  494. html = "30116-09.html";
  495. }
  496. break;
  497. }
  498. case 13:
  499. {
  500. if (hasQuestItems(talker, LETTER_OF_WINDAWOOD))
  501. {
  502. html = "30116-08.html";
  503. takeItems(talker, LETTER_OF_WINDAWOOD, -1);
  504. giveItems(talker, LETTER_OF_DUSTIN, 1);
  505. qs.setMemoState(14);
  506. qs.setCond(18, true);
  507. }
  508. break;
  509. }
  510. case 14:
  511. {
  512. if (hasQuestItems(talker, LETTER_OF_DUSTIN))
  513. {
  514. html = "30116-10.html";
  515. }
  516. break;
  517. }
  518. }
  519. break;
  520. }
  521. case SIR_COLLIN_WINDAWOOD:
  522. {
  523. switch (qs.getMemoState())
  524. {
  525. case 12:
  526. {
  527. if (hasQuestItems(talker, SAINTS_ASHES_URN))
  528. {
  529. html = "30311-01.html";
  530. takeItems(talker, SAINTS_ASHES_URN, -1);
  531. giveItems(talker, LETTER_OF_WINDAWOOD, 1);
  532. qs.setMemoState(13);
  533. qs.setCond(17, true);
  534. }
  535. break;
  536. }
  537. case 13:
  538. {
  539. if (hasQuestItems(talker, LETTER_OF_WINDAWOOD))
  540. {
  541. html = "30311-02.html";
  542. }
  543. break;
  544. }
  545. }
  546. break;
  547. }
  548. }
  549. return html;
  550. }
  551. private static boolean rewardDimensionalDiamonds(L2PcInstance player)
  552. {
  553. final PlayerVariables vars = player.getVariables();
  554. if (vars.getInt("2ND_CLASS_DIAMOND_REWARD", 0) == 0)
  555. {
  556. if (player.getClassId() == ClassId.knight)
  557. {
  558. rewardItems(player, DIMENSIONAL_DIAMOND, 45);
  559. }
  560. else
  561. {
  562. rewardItems(player, DIMENSIONAL_DIAMOND, 61);
  563. }
  564. vars.set("2ND_CLASS_DIAMOND_REWARD", 1);
  565. return true;
  566. }
  567. return false;
  568. }
  569. }