Q00404_PathOfTheHumanWizard.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393
  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.Q00404_PathOfTheHumanWizard;
  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.base.ClassId;
  24. import com.l2jserver.gameserver.model.quest.Quest;
  25. import com.l2jserver.gameserver.model.quest.QuestState;
  26. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  27. import com.l2jserver.gameserver.util.Util;
  28. /**
  29. * Path Of The Human Wizard (404)
  30. * @author ivantotov
  31. */
  32. public final class Q00404_PathOfTheHumanWizard extends Quest
  33. {
  34. // NPCs
  35. private static final int PARINA = 30391;
  36. private static final int EARTH_SNAKE = 30409;
  37. private static final int WASTELAND_LIZARDMAN = 30410;
  38. private static final int FLAME_SALAMANDER = 30411;
  39. private static final int WIND_SYLPH = 30412;
  40. private static final int WATER_UNDINE = 30413;
  41. // Items
  42. private static final int MAP_OF_LUSTER = 1280;
  43. private static final int KEY_OF_FLAME = 1281;
  44. private static final int FLAME_EARING = 1282;
  45. private static final int BROKEN_BRONZE_MIRROR = 1283;
  46. private static final int WIND_FEATHER = 1284;
  47. private static final int WIND_BANGLE = 1285;
  48. private static final int RAMAS_DIARY = 1286;
  49. private static final int SPARKLE_PEBBLE = 1287;
  50. private static final int WATER_NECKLACE = 1288;
  51. private static final int RUSTY_COIN = 1289;
  52. private static final int RED_SOIL = 1290;
  53. private static final int EARTH_RING = 1291;
  54. // Reward
  55. private static final int BEAD_OF_SEASON = 1292;
  56. // Monster
  57. private static final int RED_BEAR = 20021;
  58. private static final int RATMAN_WARRIOR = 20359;
  59. // Quest Monster
  60. private static final int WATER_SEER = 27030;
  61. // Misc
  62. private static final int MIN_LEVEL = 18;
  63. public Q00404_PathOfTheHumanWizard()
  64. {
  65. super(404, Q00404_PathOfTheHumanWizard.class.getSimpleName(), "Path Of The Human Wizard");
  66. addStartNpc(PARINA);
  67. addTalkId(PARINA, EARTH_SNAKE, WASTELAND_LIZARDMAN, FLAME_SALAMANDER, WIND_SYLPH, WATER_UNDINE);
  68. addKillId(RED_BEAR, RATMAN_WARRIOR, WATER_SEER);
  69. registerQuestItems(MAP_OF_LUSTER, KEY_OF_FLAME, FLAME_EARING, BROKEN_BRONZE_MIRROR, WIND_FEATHER, WIND_BANGLE, RAMAS_DIARY, SPARKLE_PEBBLE, WATER_NECKLACE, RUSTY_COIN, RED_SOIL, EARTH_RING);
  70. }
  71. @Override
  72. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  73. {
  74. final QuestState qs = getQuestState(player, false);
  75. if (qs == null)
  76. {
  77. return null;
  78. }
  79. String htmltext = null;
  80. switch (event)
  81. {
  82. case "ACCEPT":
  83. {
  84. if (player.getClassId() == ClassId.mage)
  85. {
  86. if (player.getLevel() >= MIN_LEVEL)
  87. {
  88. if (hasQuestItems(player, BEAD_OF_SEASON))
  89. {
  90. htmltext = "30391-03.htm";
  91. }
  92. else
  93. {
  94. qs.startQuest();
  95. htmltext = "30391-07.htm";
  96. }
  97. }
  98. else
  99. {
  100. htmltext = "30391-02.htm";
  101. }
  102. }
  103. else if (player.getClassId() == ClassId.wizard)
  104. {
  105. htmltext = "30391-02a.htm";
  106. }
  107. else
  108. {
  109. htmltext = "30391-01.htm";
  110. }
  111. break;
  112. }
  113. case "30410-02.html":
  114. {
  115. htmltext = event;
  116. break;
  117. }
  118. case "30410-03.html":
  119. {
  120. giveItems(player, WIND_FEATHER, 1);
  121. qs.setCond(6, true);
  122. htmltext = event;
  123. break;
  124. }
  125. }
  126. return htmltext;
  127. }
  128. @Override
  129. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  130. {
  131. final QuestState qs = getQuestState(killer, false);
  132. if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true))
  133. {
  134. switch (npc.getId())
  135. {
  136. case RED_BEAR:
  137. {
  138. if (hasQuestItems(killer, RUSTY_COIN) && !hasQuestItems(killer, RED_SOIL) && (getRandom(100) < 20))
  139. {
  140. giveItems(killer, RED_SOIL, 1);
  141. qs.setCond(12, true);
  142. }
  143. break;
  144. }
  145. case RATMAN_WARRIOR:
  146. {
  147. if (hasQuestItems(killer, MAP_OF_LUSTER) && !hasQuestItems(killer, KEY_OF_FLAME) && (getRandom(100) < 80))
  148. {
  149. giveItems(killer, KEY_OF_FLAME, 1);
  150. qs.setCond(3, true);
  151. }
  152. break;
  153. }
  154. case WATER_SEER:
  155. {
  156. if (hasQuestItems(killer, RAMAS_DIARY) && (getQuestItemsCount(killer, SPARKLE_PEBBLE) < 2) && (getRandom(100) < 80))
  157. {
  158. giveItems(killer, SPARKLE_PEBBLE, 1);
  159. if (getQuestItemsCount(killer, SPARKLE_PEBBLE) == 2)
  160. {
  161. qs.setCond(9, true);
  162. }
  163. else
  164. {
  165. playSound(qs.getPlayer(), QuestSound.ITEMSOUND_QUEST_ITEMGET);
  166. }
  167. }
  168. break;
  169. }
  170. }
  171. }
  172. return super.onKill(npc, killer, isSummon);
  173. }
  174. @Override
  175. public String onTalk(L2Npc npc, L2PcInstance player)
  176. {
  177. final QuestState qs = getQuestState(player, true);
  178. String htmltext = getNoQuestMsg(player);
  179. if (qs.isCreated() || qs.isCompleted())
  180. {
  181. if (npc.getId() == PARINA)
  182. {
  183. htmltext = "30391-04.htm";
  184. }
  185. }
  186. else if (qs.isStarted())
  187. {
  188. switch (npc.getId())
  189. {
  190. case PARINA:
  191. {
  192. if (!hasQuestItems(player, FLAME_EARING, WIND_BANGLE, WATER_NECKLACE, EARTH_RING))
  193. {
  194. htmltext = "30391-05.html";
  195. }
  196. else
  197. {
  198. giveAdena(player, 163800, true);
  199. takeItems(player, FLAME_EARING, 1);
  200. takeItems(player, WIND_BANGLE, 1);
  201. takeItems(player, WATER_NECKLACE, 1);
  202. takeItems(player, EARTH_RING, 1);
  203. if (!hasQuestItems(player, BEAD_OF_SEASON))
  204. {
  205. giveItems(player, BEAD_OF_SEASON, 1);
  206. }
  207. final int level = player.getLevel();
  208. if (level >= 20)
  209. {
  210. addExpAndSp(player, 320534, 23152);
  211. }
  212. else if (level == 19)
  213. {
  214. addExpAndSp(player, 456128, 29850);
  215. }
  216. else
  217. {
  218. addExpAndSp(player, 591724, 36548);
  219. }
  220. qs.exitQuest(false, true);
  221. player.sendPacket(new SocialAction(player.getObjectId(), 3));
  222. qs.saveGlobalQuestVar("1ClassQuestFinished", "1");
  223. htmltext = "30391-06.html";
  224. }
  225. break;
  226. }
  227. case EARTH_SNAKE:
  228. {
  229. if (hasQuestItems(player, WATER_NECKLACE) && !hasAtLeastOneQuestItem(player, RUSTY_COIN, EARTH_RING))
  230. {
  231. if (!hasQuestItems(player, RUSTY_COIN))
  232. {
  233. giveItems(player, RUSTY_COIN, 1);
  234. }
  235. qs.setCond(11, true);
  236. htmltext = "30409-01.html";
  237. }
  238. else if (hasQuestItems(player, RUSTY_COIN))
  239. {
  240. if (!hasQuestItems(player, RED_SOIL))
  241. {
  242. htmltext = "30409-02.html";
  243. }
  244. else
  245. {
  246. takeItems(player, RUSTY_COIN, 1);
  247. takeItems(player, RED_SOIL, 1);
  248. if (!hasQuestItems(player, EARTH_RING))
  249. {
  250. giveItems(player, EARTH_RING, 1);
  251. }
  252. qs.setCond(13, true);
  253. htmltext = "30409-03.html";
  254. }
  255. }
  256. else if (hasQuestItems(player, EARTH_RING))
  257. {
  258. htmltext = "30409-04.html";
  259. }
  260. break;
  261. }
  262. case WASTELAND_LIZARDMAN:
  263. {
  264. if (hasQuestItems(player, BROKEN_BRONZE_MIRROR))
  265. {
  266. if (!hasQuestItems(player, WIND_FEATHER))
  267. {
  268. htmltext = "30410-01.html";
  269. }
  270. else
  271. {
  272. htmltext = "30410-04.html";
  273. }
  274. }
  275. break;
  276. }
  277. case FLAME_SALAMANDER:
  278. {
  279. if (!hasAtLeastOneQuestItem(player, MAP_OF_LUSTER, FLAME_EARING))
  280. {
  281. if (!hasQuestItems(player, MAP_OF_LUSTER))
  282. {
  283. giveItems(player, MAP_OF_LUSTER, 1);
  284. }
  285. qs.setCond(2, true);
  286. htmltext = "30411-01.html";
  287. }
  288. else if (hasQuestItems(player, MAP_OF_LUSTER))
  289. {
  290. if (!hasQuestItems(player, KEY_OF_FLAME))
  291. {
  292. htmltext = "30411-02.html";
  293. }
  294. else
  295. {
  296. takeItems(player, MAP_OF_LUSTER, 1);
  297. takeItems(player, KEY_OF_FLAME, 1);
  298. if (!hasQuestItems(player, FLAME_EARING))
  299. {
  300. giveItems(player, FLAME_EARING, 1);
  301. }
  302. qs.setCond(4, true);
  303. htmltext = "30411-03.html";
  304. }
  305. }
  306. else if (hasQuestItems(player, FLAME_EARING))
  307. {
  308. htmltext = "30411-04.html";
  309. }
  310. break;
  311. }
  312. case WIND_SYLPH:
  313. {
  314. if (hasQuestItems(player, FLAME_EARING) && !hasAtLeastOneQuestItem(player, BROKEN_BRONZE_MIRROR, WIND_BANGLE))
  315. {
  316. if (!hasQuestItems(player, BROKEN_BRONZE_MIRROR))
  317. {
  318. giveItems(player, BROKEN_BRONZE_MIRROR, 1);
  319. }
  320. qs.setCond(5, true);
  321. htmltext = "30412-01.html";
  322. }
  323. else if (hasQuestItems(player, BROKEN_BRONZE_MIRROR))
  324. {
  325. if (!hasQuestItems(player, WIND_FEATHER))
  326. {
  327. htmltext = "30412-02.html";
  328. }
  329. else
  330. {
  331. takeItems(player, BROKEN_BRONZE_MIRROR, 1);
  332. takeItems(player, WIND_FEATHER, 1);
  333. if (!hasQuestItems(player, WIND_BANGLE))
  334. {
  335. giveItems(player, WIND_BANGLE, 1);
  336. }
  337. qs.setCond(7, true);
  338. htmltext = "30412-03.html";
  339. }
  340. }
  341. else if (hasQuestItems(player, WIND_BANGLE))
  342. {
  343. htmltext = "30412-04.html";
  344. }
  345. break;
  346. }
  347. case WATER_UNDINE:
  348. {
  349. if (hasQuestItems(player, WIND_BANGLE) && !hasAtLeastOneQuestItem(player, RAMAS_DIARY, WATER_NECKLACE))
  350. {
  351. if (!hasQuestItems(player, RAMAS_DIARY))
  352. {
  353. giveItems(player, RAMAS_DIARY, 1);
  354. }
  355. qs.setCond(8, true);
  356. htmltext = "30413-01.html";
  357. }
  358. else if (hasQuestItems(player, RAMAS_DIARY))
  359. {
  360. if (getQuestItemsCount(player, SPARKLE_PEBBLE) < 2)
  361. {
  362. htmltext = "30413-02.html";
  363. }
  364. else
  365. {
  366. takeItems(player, RAMAS_DIARY, 1);
  367. takeItems(player, SPARKLE_PEBBLE, -1);
  368. if (!hasQuestItems(player, WATER_NECKLACE))
  369. {
  370. giveItems(player, WATER_NECKLACE, 1);
  371. }
  372. qs.setCond(10, true);
  373. htmltext = "30413-03.html";
  374. }
  375. }
  376. else if (hasQuestItems(player, WATER_NECKLACE))
  377. {
  378. htmltext = "30413-04.html";
  379. }
  380. break;
  381. }
  382. }
  383. }
  384. return htmltext;
  385. }
  386. }