Q00327_RecoverTheFarmland.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461
  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.Q00327_RecoverTheFarmland;
  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.ItemHolder;
  26. import com.l2jserver.gameserver.model.quest.Quest;
  27. import com.l2jserver.gameserver.model.quest.QuestState;
  28. /**
  29. * Recover the Farmland (327).
  30. * @author GKR
  31. */
  32. public final class Q00327_RecoverTheFarmland extends Quest
  33. {
  34. // NPCs
  35. private static final int IRIS = 30034;
  36. private static final int ASHA = 30313;
  37. private static final int NESTLE = 30314;
  38. private static final int LEIKAN = 30382;
  39. private static final int PIOTUR = 30597;
  40. private static final int TUREK_ORK_WARLORD = 20495;
  41. private static final int TUREK_ORK_ARCHER = 20496;
  42. private static final int TUREK_ORK_SKIRMISHER = 20497;
  43. private static final int TUREK_ORK_SUPPLIER = 20498;
  44. private static final int TUREK_ORK_FOOTMAN = 20499;
  45. private static final int TUREK_ORK_SENTINEL = 20500;
  46. private static final int TUREK_ORK_SHAMAN = 20501;
  47. // Items
  48. private static final int TUREK_DOG_TAG = 1846;
  49. private static final int TUREK_MEDALLION = 1847;
  50. private static final int LEIKANS_LETTER = 5012;
  51. private static final int CLAY_URN_FRAGMENT = 1848;
  52. private static final int BRASS_TRINKET_PIECE = 1849;
  53. private static final int BRONZE_MIRROR_PIECE = 1850;
  54. private static final int JADE_NECKLACE_BEAD = 1851;
  55. private static final int ANCIENT_CLAY_URN = 1852;
  56. private static final int ANCIENT_BRASS_TIARA = 1853;
  57. private static final int ANCIENT_BRONZE_MIRROR = 1854;
  58. private static final int ANCIENT_JADE_NECKLACE = 1855;
  59. private static final int QUICK_STEP_POTION = 734;
  60. private static final int SWIFT_ATTACK_POTION = 735;
  61. private static final int SCROLL_OF_ESCAPE = 736;
  62. private static final int SCROLL_OF_RESURRECTION = 737;
  63. private static final int HEALING_POTION = 1061;
  64. private static final int SOULSHOT_D = 1463;
  65. private static final int SPIRITSHOT_D = 2510;
  66. // Misc
  67. private static final int MIN_LVL = 25;
  68. private static final Map<String, ItemHolder> FRAGMENTS_REWARD_DATA = new HashMap<>(4);
  69. private static final Map<Integer, Integer> FRAGMENTS_DROP_PROB = new HashMap<>(7);
  70. private static final ItemHolder[] FULL_REWARD_DATA =
  71. {
  72. new ItemHolder(ANCIENT_CLAY_URN, 2766),
  73. new ItemHolder(ANCIENT_BRASS_TIARA, 3227),
  74. new ItemHolder(ANCIENT_BRONZE_MIRROR, 3227),
  75. new ItemHolder(ANCIENT_JADE_NECKLACE, 3919)
  76. };
  77. static
  78. {
  79. FRAGMENTS_REWARD_DATA.put("30034-03.html", new ItemHolder(CLAY_URN_FRAGMENT, 307));
  80. FRAGMENTS_REWARD_DATA.put("30034-04.html", new ItemHolder(BRASS_TRINKET_PIECE, 368));
  81. FRAGMENTS_REWARD_DATA.put("30034-05.html", new ItemHolder(BRONZE_MIRROR_PIECE, 368));
  82. FRAGMENTS_REWARD_DATA.put("30034-06.html", new ItemHolder(JADE_NECKLACE_BEAD, 430));
  83. FRAGMENTS_DROP_PROB.put(TUREK_ORK_ARCHER, 21);
  84. FRAGMENTS_DROP_PROB.put(TUREK_ORK_FOOTMAN, 19);
  85. FRAGMENTS_DROP_PROB.put(TUREK_ORK_SENTINEL, 18);
  86. FRAGMENTS_DROP_PROB.put(TUREK_ORK_SHAMAN, 22);
  87. FRAGMENTS_DROP_PROB.put(TUREK_ORK_SKIRMISHER, 21);
  88. FRAGMENTS_DROP_PROB.put(TUREK_ORK_SUPPLIER, 20);
  89. FRAGMENTS_DROP_PROB.put(TUREK_ORK_WARLORD, 26);
  90. }
  91. public Q00327_RecoverTheFarmland()
  92. {
  93. super(327, Q00327_RecoverTheFarmland.class.getSimpleName(), "Recover the Farmland");
  94. addStartNpc(LEIKAN, PIOTUR);
  95. addTalkId(LEIKAN, PIOTUR, IRIS, ASHA, NESTLE);
  96. addKillId(TUREK_ORK_WARLORD, TUREK_ORK_ARCHER, TUREK_ORK_SKIRMISHER, TUREK_ORK_SUPPLIER, TUREK_ORK_FOOTMAN, TUREK_ORK_SENTINEL, TUREK_ORK_SHAMAN);
  97. registerQuestItems(TUREK_DOG_TAG, TUREK_MEDALLION, LEIKANS_LETTER);
  98. }
  99. @Override
  100. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  101. {
  102. final QuestState st = getQuestState(player, false);
  103. if (st == null)
  104. {
  105. return null;
  106. }
  107. String html = null;
  108. switch (event)
  109. {
  110. case "30034-01.html":
  111. case "30313-01.html":
  112. case "30314-02.html":
  113. case "30314-08.html":
  114. case "30314-09.html":
  115. case "30382-05a.html":
  116. case "30382-05b.html":
  117. case "30597-03.html":
  118. case "30597-07.html":
  119. {
  120. html = event;
  121. break;
  122. }
  123. case "30382-03.htm":
  124. {
  125. st.startQuest();
  126. giveItems(player, LEIKANS_LETTER, 1);
  127. st.setCond(2);
  128. html = event;
  129. break;
  130. }
  131. case "30597-03.htm":
  132. {
  133. st.startQuest();
  134. html = event;
  135. break;
  136. }
  137. case "30597-06.html":
  138. {
  139. st.exitQuest(true, true);
  140. html = event;
  141. break;
  142. }
  143. case "30034-03.html":
  144. case "30034-04.html":
  145. case "30034-05.html":
  146. case "30034-06.html":
  147. {
  148. final ItemHolder item = FRAGMENTS_REWARD_DATA.get(event);
  149. if (!hasQuestItems(player, item.getId()))
  150. {
  151. html = "30034-02.html";
  152. }
  153. else
  154. {
  155. addExpAndSp(player, getQuestItemsCount(player, item.getId()) * item.getCount(), 0);
  156. takeItems(player, item.getId(), -1);
  157. playSound(player, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  158. html = event;
  159. }
  160. break;
  161. }
  162. case "30034-07.html":
  163. {
  164. boolean rewarded = false;
  165. for (ItemHolder it : FULL_REWARD_DATA)
  166. {
  167. if (hasQuestItems(player, it.getId()))
  168. {
  169. addExpAndSp(player, getQuestItemsCount(player, it.getId()) * it.getCount(), 0);
  170. takeItems(player, it.getId(), -1);
  171. playSound(player, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  172. rewarded = true;
  173. }
  174. }
  175. html = rewarded ? event : "30034-02.html";
  176. break;
  177. }
  178. case "30313-03.html":
  179. {
  180. if (getQuestItemsCount(player, CLAY_URN_FRAGMENT) < 5)
  181. {
  182. html = "30313-02.html";
  183. }
  184. else
  185. {
  186. takeItems(player, CLAY_URN_FRAGMENT, 5);
  187. if (getRandom(6) < 5)
  188. {
  189. giveItems(player, ANCIENT_CLAY_URN, 1);
  190. html = event;
  191. }
  192. else
  193. {
  194. html = "30313-10.html";
  195. }
  196. }
  197. break;
  198. }
  199. case "30313-05.html":
  200. {
  201. if (getQuestItemsCount(player, BRASS_TRINKET_PIECE) < 5)
  202. {
  203. html = "30313-04.html";
  204. }
  205. else
  206. {
  207. takeItems(player, BRASS_TRINKET_PIECE, 5);
  208. if (getRandom(7) < 6)
  209. {
  210. giveItems(player, ANCIENT_BRASS_TIARA, 1);
  211. html = event;
  212. }
  213. else
  214. {
  215. html = "30313-10.html";
  216. }
  217. }
  218. break;
  219. }
  220. case "30313-07.html":
  221. {
  222. if (getQuestItemsCount(player, BRONZE_MIRROR_PIECE) < 5)
  223. {
  224. html = "30313-06.html";
  225. }
  226. else
  227. {
  228. takeItems(player, BRONZE_MIRROR_PIECE, 5);
  229. if (getRandom(7) < 6)
  230. {
  231. giveItems(player, ANCIENT_BRONZE_MIRROR, 1);
  232. html = event;
  233. }
  234. else
  235. {
  236. html = "30313-10.html";
  237. }
  238. }
  239. break;
  240. }
  241. case "30313-09.html":
  242. {
  243. if (getQuestItemsCount(player, JADE_NECKLACE_BEAD) < 5)
  244. {
  245. html = "30313-08.html";
  246. }
  247. else
  248. {
  249. takeItems(player, JADE_NECKLACE_BEAD, 5);
  250. if (getRandom(8) < 7)
  251. {
  252. giveItems(player, ANCIENT_JADE_NECKLACE, 1);
  253. html = event;
  254. }
  255. else
  256. {
  257. html = "30313-10.html";
  258. }
  259. }
  260. break;
  261. }
  262. case "30314-03.html":
  263. {
  264. if (!hasQuestItems(player, ANCIENT_CLAY_URN))
  265. {
  266. html = "30314-07.html";
  267. }
  268. else
  269. {
  270. rewardItems(player, SOULSHOT_D, getRandom(70, 110));
  271. takeItems(player, ANCIENT_CLAY_URN, 1);
  272. html = event;
  273. }
  274. break;
  275. }
  276. case "30314-04.html":
  277. {
  278. if (!hasQuestItems(player, ANCIENT_BRASS_TIARA))
  279. {
  280. html = "30314-07.html";
  281. }
  282. else
  283. {
  284. final int rnd = getRandom(100);
  285. if (rnd < 40)
  286. {
  287. rewardItems(player, HEALING_POTION, 1);
  288. }
  289. else if (rnd < 84)
  290. {
  291. rewardItems(player, QUICK_STEP_POTION, 1);
  292. }
  293. else
  294. {
  295. rewardItems(player, SWIFT_ATTACK_POTION, 1);
  296. }
  297. takeItems(player, ANCIENT_BRASS_TIARA, 1);
  298. html = event;
  299. }
  300. break;
  301. }
  302. case "30314-05.html":
  303. {
  304. if (!hasQuestItems(player, ANCIENT_BRONZE_MIRROR))
  305. {
  306. html = "30314-07.html";
  307. }
  308. else
  309. {
  310. rewardItems(player, (getRandom(100) < 59) ? SCROLL_OF_ESCAPE : SCROLL_OF_RESURRECTION, 1);
  311. takeItems(player, ANCIENT_BRONZE_MIRROR, 1);
  312. html = event;
  313. }
  314. break;
  315. }
  316. case "30314-06.html":
  317. {
  318. if (!hasQuestItems(player, ANCIENT_JADE_NECKLACE))
  319. {
  320. html = "30314-07.html";
  321. }
  322. else
  323. {
  324. rewardItems(player, SPIRITSHOT_D, getRandom(50, 90));
  325. takeItems(player, ANCIENT_JADE_NECKLACE, 1);
  326. html = event;
  327. }
  328. break;
  329. }
  330. }
  331. return html;
  332. }
  333. @Override
  334. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  335. {
  336. final QuestState st = getQuestState(killer, false);
  337. if (st != null)
  338. {
  339. if ((npc.getId() == TUREK_ORK_SHAMAN) || (npc.getId() == TUREK_ORK_WARLORD))
  340. {
  341. giveItems(killer, TUREK_MEDALLION, 1);
  342. }
  343. else
  344. {
  345. giveItems(killer, TUREK_DOG_TAG, 1);
  346. }
  347. if (getRandom(100) < FRAGMENTS_DROP_PROB.get(npc.getId()))
  348. {
  349. giveItems(killer, getRandom(CLAY_URN_FRAGMENT, JADE_NECKLACE_BEAD), 1);
  350. }
  351. }
  352. return super.onKill(npc, killer, isSummon);
  353. }
  354. @Override
  355. public String onTalk(L2Npc npc, L2PcInstance player)
  356. {
  357. final QuestState st = getQuestState(player, true);
  358. String html = getNoQuestMsg(player);
  359. switch (npc.getId())
  360. {
  361. case LEIKAN:
  362. {
  363. if (st.isCreated())
  364. {
  365. html = ((player.getLevel() >= MIN_LVL) ? "30382-02.htm" : "30382-01.htm");
  366. }
  367. else if (st.isStarted())
  368. {
  369. if (hasQuestItems(player, LEIKANS_LETTER))
  370. {
  371. html = "30382-04.html";
  372. }
  373. else
  374. {
  375. html = "30382-05.html";
  376. st.setCond(5, true);
  377. }
  378. }
  379. break;
  380. }
  381. case PIOTUR:
  382. {
  383. if (st.isCreated())
  384. {
  385. html = ((player.getLevel() >= MIN_LVL) ? "30597-02.htm" : "30597-01.htm");
  386. }
  387. else if (st.isStarted())
  388. {
  389. if (hasQuestItems(player, LEIKANS_LETTER))
  390. {
  391. html = "30597-03a.htm";
  392. takeItems(player, LEIKANS_LETTER, -1);
  393. st.setCond(3, true);
  394. }
  395. else
  396. {
  397. if (!hasQuestItems(player, TUREK_DOG_TAG) && !hasQuestItems(player, TUREK_MEDALLION))
  398. {
  399. html = "30597-04.html";
  400. }
  401. else
  402. {
  403. html = "30597-05.html";
  404. final long dogTags = getQuestItemsCount(player, TUREK_DOG_TAG);
  405. final long medallions = getQuestItemsCount(player, TUREK_MEDALLION);
  406. final long rewardCount = (dogTags * 40) + (medallions * 50) + (((dogTags + medallions) >= 10) ? 619 : 0);
  407. giveAdena(player, rewardCount, true);
  408. takeItems(player, TUREK_DOG_TAG, -1);
  409. takeItems(player, TUREK_MEDALLION, -1);
  410. st.setCond(4, true);
  411. }
  412. }
  413. }
  414. break;
  415. }
  416. case IRIS:
  417. {
  418. if (st.isStarted())
  419. {
  420. html = "30034-01.html";
  421. }
  422. break;
  423. }
  424. case ASHA:
  425. {
  426. if (st.isStarted())
  427. {
  428. html = "30313-01.html";
  429. }
  430. break;
  431. }
  432. case NESTLE:
  433. {
  434. if (st.isStarted())
  435. {
  436. html = "30314-01.html";
  437. }
  438. break;
  439. }
  440. }
  441. return html;
  442. }
  443. }