Q00228_TestOfMagus.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647
  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.Q00228_TestOfMagus;
  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.NpcStringId;
  27. import com.l2jserver.gameserver.network.clientpackets.Say2;
  28. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  29. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  30. import com.l2jserver.gameserver.util.Util;
  31. /**
  32. * Test Of Magus (228)
  33. * @author ivantotov
  34. */
  35. public final class Q00228_TestOfMagus extends Quest
  36. {
  37. // NPCs
  38. private static final int PARINA = 30391;
  39. private static final int EARTH_SNAKE = 30409;
  40. private static final int FLAME_SALAMANDER = 30411;
  41. private static final int WIND_SYLPH = 30412;
  42. private static final int WATER_UNDINE = 30413;
  43. private static final int ELDER_CASIAN = 30612;
  44. private static final int BARD_RUKAL = 30629;
  45. // Items
  46. private static final int RUKALS_LETTER = 2841;
  47. private static final int PARINAS_LETTER = 2842;
  48. private static final int LILAC_CHARM = 2843;
  49. private static final int GOLDEN_SEED_1ST = 2844;
  50. private static final int GOLDEN_SEED_2ND = 2845;
  51. private static final int GOLDEN_SEED_3RD = 2846;
  52. private static final int SCORE_OF_ELEMENTS = 2847;
  53. private static final int DAZZLING_DROP = 2848;
  54. private static final int FLAME_CRYSTAL = 2849;
  55. private static final int HARPYS_FEATHER = 2850;
  56. private static final int WYRMS_WINGBONE = 2851;
  57. private static final int WINDSUS_MANE = 2852;
  58. private static final int ENCHANTED_MONSTER_EYE_SHELL = 2853;
  59. private static final int ENCHANTED_GOLEM_POWDER = 2854;
  60. private static final int ENCHANTED_IRON_GOLEM_SCRAP = 2855;
  61. private static final int TONE_OF_WATER = 2856;
  62. private static final int TONE_OF_FIRE = 2857;
  63. private static final int TONE_OF_WIND = 2858;
  64. private static final int TONE_OF_EARTH = 2859;
  65. private static final int SALAMANDER_CHARM = 2860;
  66. private static final int SYLPH_CHARM = 2861;
  67. private static final int UNDINE_CHARM = 2862;
  68. private static final int SERPENT_CHARM = 2863;
  69. // Reward
  70. private static final int MARK_OF_MAGUS = 2840;
  71. private static final int DIMENSIONAL_DIAMOND = 7562;
  72. // Monster
  73. private static final int HARPY = 20145;
  74. private static final int MARSH_STAKATO = 20157;
  75. private static final int WYRM = 20176;
  76. private static final int MARSH_STAKATO_WORKER = 20230;
  77. private static final int TOAD_LORD = 20231;
  78. private static final int MARSH_STAKATO_SOLDIER = 20232;
  79. private static final int MARSH_STAKATO_DRONE = 20234;
  80. private static final int WINDSUS = 20553;
  81. private static final int ENCHANTED_MONSTEREYE = 20564;
  82. private static final int ENCHANTED_STOLEN_GOLEM = 20565;
  83. private static final int ENCHANTED_IRON_GOLEM = 20566;
  84. // Quest Monster
  85. private static final int SINGING_FLOWER_PHANTASM = 27095;
  86. private static final int SINGING_FLOWER_NIGTMATE = 27096;
  87. private static final int SINGING_FLOWER_DARKLING = 27097;
  88. private static final int GHOST_FIRE = 27098;
  89. // Misc
  90. private static final int MIN_LVL = 39;
  91. public Q00228_TestOfMagus()
  92. {
  93. super(228, Q00228_TestOfMagus.class.getSimpleName(), "Test Of Magus");
  94. addStartNpc(BARD_RUKAL);
  95. addTalkId(BARD_RUKAL, PARINA, EARTH_SNAKE, FLAME_SALAMANDER, WIND_SYLPH, WATER_UNDINE, ELDER_CASIAN);
  96. addKillId(HARPY, MARSH_STAKATO, WYRM, MARSH_STAKATO_WORKER, TOAD_LORD, MARSH_STAKATO_SOLDIER, MARSH_STAKATO_DRONE, WINDSUS, ENCHANTED_MONSTEREYE, ENCHANTED_STOLEN_GOLEM, ENCHANTED_IRON_GOLEM, SINGING_FLOWER_PHANTASM, SINGING_FLOWER_NIGTMATE, SINGING_FLOWER_DARKLING, GHOST_FIRE);
  97. registerQuestItems(RUKALS_LETTER, PARINAS_LETTER, LILAC_CHARM, GOLDEN_SEED_1ST, GOLDEN_SEED_2ND, GOLDEN_SEED_3RD, SCORE_OF_ELEMENTS, DAZZLING_DROP, FLAME_CRYSTAL, HARPYS_FEATHER, WYRMS_WINGBONE, WINDSUS_MANE, ENCHANTED_MONSTER_EYE_SHELL, ENCHANTED_GOLEM_POWDER, ENCHANTED_IRON_GOLEM_SCRAP, TONE_OF_WATER, TONE_OF_FIRE, TONE_OF_WIND, TONE_OF_EARTH, SALAMANDER_CHARM, SYLPH_CHARM, UNDINE_CHARM, SERPENT_CHARM);
  98. }
  99. @Override
  100. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  101. {
  102. final QuestState qs = getQuestState(player, false);
  103. if (qs == null)
  104. {
  105. return null;
  106. }
  107. String htmltext = null;
  108. switch (event)
  109. {
  110. case "ACCEPT":
  111. {
  112. if (qs.isCreated())
  113. {
  114. qs.startQuest();
  115. playSound(player, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  116. giveItems(player, RUKALS_LETTER, 1);
  117. if (player.getVariables().getInt("2ND_CLASS_DIAMOND_REWARD", 0) == 0)
  118. {
  119. giveItems(player, DIMENSIONAL_DIAMOND, 122);
  120. player.getVariables().set("2ND_CLASS_DIAMOND_REWARD", 1);
  121. htmltext = "30629-04a.htm";
  122. }
  123. else
  124. {
  125. htmltext = "30629-04.htm";
  126. }
  127. }
  128. break;
  129. }
  130. case "30629-09.html":
  131. case "30409-02.html":
  132. {
  133. htmltext = event;
  134. break;
  135. }
  136. case "30629-10.html":
  137. {
  138. if (hasQuestItems(player, GOLDEN_SEED_3RD))
  139. {
  140. takeItems(player, LILAC_CHARM, 1);
  141. takeItems(player, GOLDEN_SEED_1ST, 1);
  142. takeItems(player, GOLDEN_SEED_2ND, 1);
  143. takeItems(player, GOLDEN_SEED_3RD, 1);
  144. giveItems(player, SCORE_OF_ELEMENTS, 1);
  145. qs.setCond(5, true);
  146. htmltext = event;
  147. }
  148. break;
  149. }
  150. case "30391-02.html":
  151. {
  152. if (hasQuestItems(player, RUKALS_LETTER))
  153. {
  154. takeItems(player, RUKALS_LETTER, 1);
  155. giveItems(player, PARINAS_LETTER, 1);
  156. qs.setCond(2, true);
  157. htmltext = event;
  158. }
  159. break;
  160. }
  161. case "30409-03.html":
  162. {
  163. giveItems(player, SERPENT_CHARM, 1);
  164. htmltext = event;
  165. break;
  166. }
  167. case "30412-02.html":
  168. {
  169. giveItems(player, SYLPH_CHARM, 1);
  170. htmltext = event;
  171. break;
  172. }
  173. case "30612-02.html":
  174. {
  175. takeItems(player, PARINAS_LETTER, 1);
  176. giveItems(player, LILAC_CHARM, 1);
  177. qs.setCond(3, true);
  178. htmltext = event;
  179. break;
  180. }
  181. }
  182. return htmltext;
  183. }
  184. @Override
  185. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  186. {
  187. final QuestState qs = getQuestState(killer, false);
  188. if ((qs != null) && qs.isStarted() && Util.checkIfInRange(1500, npc, killer, true))
  189. {
  190. switch (npc.getId())
  191. {
  192. case HARPY:
  193. {
  194. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SYLPH_CHARM) && (getQuestItemsCount(killer, HARPYS_FEATHER) < 20))
  195. {
  196. giveItems(killer, HARPYS_FEATHER, 1);
  197. if (getQuestItemsCount(killer, HARPYS_FEATHER) >= 20)
  198. {
  199. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  200. }
  201. else
  202. {
  203. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  204. }
  205. }
  206. break;
  207. }
  208. case MARSH_STAKATO:
  209. case MARSH_STAKATO_WORKER:
  210. case TOAD_LORD:
  211. case MARSH_STAKATO_SOLDIER:
  212. case MARSH_STAKATO_DRONE:
  213. {
  214. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, UNDINE_CHARM) && (getQuestItemsCount(killer, DAZZLING_DROP) < 20))
  215. {
  216. giveItems(killer, DAZZLING_DROP, 1);
  217. if (getQuestItemsCount(killer, DAZZLING_DROP) >= 20)
  218. {
  219. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  220. }
  221. else
  222. {
  223. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  224. }
  225. }
  226. break;
  227. }
  228. case WYRM:
  229. {
  230. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SYLPH_CHARM) && (getQuestItemsCount(killer, WYRMS_WINGBONE) < 10))
  231. {
  232. if (getRandom(100) < 50)
  233. {
  234. giveItems(killer, WYRMS_WINGBONE, 1);
  235. if (getQuestItemsCount(killer, WYRMS_WINGBONE) >= 10)
  236. {
  237. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  238. }
  239. else
  240. {
  241. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  242. }
  243. }
  244. }
  245. break;
  246. }
  247. case WINDSUS:
  248. {
  249. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SYLPH_CHARM) && (getQuestItemsCount(killer, WINDSUS_MANE) < 10))
  250. {
  251. if (getRandom(100) < 50)
  252. {
  253. giveItems(killer, WINDSUS_MANE, 1);
  254. if (getQuestItemsCount(killer, WINDSUS_MANE) >= 10)
  255. {
  256. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  257. }
  258. else
  259. {
  260. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  261. }
  262. }
  263. }
  264. break;
  265. }
  266. case ENCHANTED_MONSTEREYE:
  267. {
  268. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SERPENT_CHARM) && (getQuestItemsCount(killer, ENCHANTED_MONSTER_EYE_SHELL) < 10))
  269. {
  270. giveItems(killer, ENCHANTED_MONSTER_EYE_SHELL, 1);
  271. if (getQuestItemsCount(killer, ENCHANTED_MONSTER_EYE_SHELL) >= 10)
  272. {
  273. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  274. }
  275. else
  276. {
  277. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  278. }
  279. }
  280. break;
  281. }
  282. case ENCHANTED_STOLEN_GOLEM:
  283. {
  284. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SERPENT_CHARM) && (getQuestItemsCount(killer, ENCHANTED_GOLEM_POWDER) < 10))
  285. {
  286. giveItems(killer, ENCHANTED_GOLEM_POWDER, 1);
  287. if (getQuestItemsCount(killer, ENCHANTED_GOLEM_POWDER) >= 10)
  288. {
  289. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  290. }
  291. else
  292. {
  293. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  294. }
  295. }
  296. break;
  297. }
  298. case ENCHANTED_IRON_GOLEM:
  299. {
  300. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SERPENT_CHARM) && (getQuestItemsCount(killer, ENCHANTED_IRON_GOLEM_SCRAP) < 10))
  301. {
  302. giveItems(killer, ENCHANTED_IRON_GOLEM_SCRAP, 1);
  303. if (getQuestItemsCount(killer, ENCHANTED_IRON_GOLEM_SCRAP) >= 10)
  304. {
  305. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  306. }
  307. else
  308. {
  309. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  310. }
  311. }
  312. break;
  313. }
  314. case SINGING_FLOWER_PHANTASM:
  315. {
  316. if (hasQuestItems(killer, LILAC_CHARM) && !hasQuestItems(killer, GOLDEN_SEED_1ST))
  317. {
  318. giveItems(killer, GOLDEN_SEED_1ST, 1);
  319. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.I_AM_A_TREE_OF_NOTHING_A_TREE_THAT_KNOWS_WHERE_TO_RETURN));
  320. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  321. if (hasQuestItems(killer, GOLDEN_SEED_2ND, GOLDEN_SEED_3RD))
  322. {
  323. qs.setCond(4);
  324. }
  325. }
  326. break;
  327. }
  328. case SINGING_FLOWER_NIGTMATE:
  329. {
  330. if (hasQuestItems(killer, LILAC_CHARM) && !hasQuestItems(killer, GOLDEN_SEED_2ND))
  331. {
  332. giveItems(killer, GOLDEN_SEED_2ND, 1);
  333. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.I_AM_A_CREATURE_THAT_SHOWS_THE_TRUTH_OF_THE_PLACE_DEEP_IN_MY_HEART));
  334. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  335. if (hasQuestItems(killer, GOLDEN_SEED_1ST, GOLDEN_SEED_3RD))
  336. {
  337. qs.setCond(4);
  338. }
  339. }
  340. break;
  341. }
  342. case SINGING_FLOWER_DARKLING:
  343. {
  344. if (hasQuestItems(killer, LILAC_CHARM) && !hasQuestItems(killer, GOLDEN_SEED_3RD))
  345. {
  346. giveItems(killer, GOLDEN_SEED_3RD, 1);
  347. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.I_AM_A_MIRROR_OF_DARKNESS_A_VIRTUAL_IMAGE_OF_DARKNESS));
  348. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  349. if (hasQuestItems(killer, GOLDEN_SEED_1ST, GOLDEN_SEED_2ND))
  350. {
  351. qs.setCond(4);
  352. }
  353. }
  354. break;
  355. }
  356. case GHOST_FIRE:
  357. {
  358. if (hasQuestItems(killer, SCORE_OF_ELEMENTS, SALAMANDER_CHARM) && (getQuestItemsCount(killer, FLAME_CRYSTAL) < 5))
  359. {
  360. if (getRandom(100) < 50)
  361. {
  362. giveItems(killer, FLAME_CRYSTAL, 1);
  363. if (getQuestItemsCount(killer, FLAME_CRYSTAL) >= 5)
  364. {
  365. playSound(killer, QuestSound.ITEMSOUND_QUEST_MIDDLE);
  366. }
  367. else
  368. {
  369. playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET);
  370. }
  371. }
  372. }
  373. break;
  374. }
  375. }
  376. }
  377. return super.onKill(npc, killer, isSummon);
  378. }
  379. @Override
  380. public String onTalk(L2Npc npc, L2PcInstance player)
  381. {
  382. final QuestState qs = getQuestState(player, true);
  383. String htmltext = getNoQuestMsg(player);
  384. if (qs.isCreated())
  385. {
  386. if (npc.getId() == BARD_RUKAL)
  387. {
  388. if ((player.getClassId() == ClassId.wizard) || (player.getClassId() == ClassId.elvenWizard) || ((player.getClassId() == ClassId.darkWizard)))
  389. {
  390. if (player.getLevel() < MIN_LVL)
  391. {
  392. htmltext = "30629-02.html";
  393. }
  394. else
  395. {
  396. htmltext = "30629-03.htm";
  397. }
  398. }
  399. else
  400. {
  401. htmltext = "30629-01.html";
  402. }
  403. }
  404. }
  405. else if (qs.isStarted())
  406. {
  407. switch (npc.getId())
  408. {
  409. case BARD_RUKAL:
  410. {
  411. if (hasQuestItems(player, RUKALS_LETTER))
  412. {
  413. htmltext = "30629-05.html";
  414. }
  415. else if (hasQuestItems(player, PARINAS_LETTER))
  416. {
  417. htmltext = "30629-06.html";
  418. }
  419. else if (hasQuestItems(player, LILAC_CHARM))
  420. {
  421. if (hasQuestItems(player, GOLDEN_SEED_1ST, GOLDEN_SEED_2ND, GOLDEN_SEED_3RD))
  422. {
  423. htmltext = "30629-08.html";
  424. }
  425. else
  426. {
  427. htmltext = "30629-07.html";
  428. }
  429. }
  430. else if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  431. {
  432. if (hasQuestItems(player, TONE_OF_WATER, TONE_OF_FIRE, TONE_OF_WIND, TONE_OF_EARTH))
  433. {
  434. giveAdena(player, 372154, true);
  435. giveItems(player, MARK_OF_MAGUS, 1);
  436. addExpAndSp(player, 2058244, 141240);
  437. qs.exitQuest(false, true);
  438. player.sendPacket(new SocialAction(player.getObjectId(), 3));
  439. htmltext = "30629-12.html";
  440. }
  441. else
  442. {
  443. htmltext = "30629-11.html";
  444. }
  445. }
  446. break;
  447. }
  448. case PARINA:
  449. {
  450. if (hasQuestItems(player, RUKALS_LETTER))
  451. {
  452. htmltext = "30391-01.html";
  453. }
  454. else if (hasQuestItems(player, PARINAS_LETTER))
  455. {
  456. htmltext = "30391-03.html";
  457. }
  458. else if (hasQuestItems(player, LILAC_CHARM))
  459. {
  460. htmltext = "30391-04.html";
  461. }
  462. else if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  463. {
  464. htmltext = "30391-05.html";
  465. }
  466. break;
  467. }
  468. case EARTH_SNAKE:
  469. {
  470. if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  471. {
  472. if (!hasAtLeastOneQuestItem(player, TONE_OF_EARTH, SERPENT_CHARM))
  473. {
  474. htmltext = "30409-01.html";
  475. }
  476. else if (hasQuestItems(player, SERPENT_CHARM))
  477. {
  478. if ((getQuestItemsCount(player, ENCHANTED_MONSTER_EYE_SHELL) >= 10) && (getQuestItemsCount(player, ENCHANTED_GOLEM_POWDER) >= 10) && (getQuestItemsCount(player, ENCHANTED_IRON_GOLEM_SCRAP) >= 10))
  479. {
  480. takeItems(player, ENCHANTED_MONSTER_EYE_SHELL, -1);
  481. takeItems(player, ENCHANTED_GOLEM_POWDER, -1);
  482. takeItems(player, ENCHANTED_IRON_GOLEM_SCRAP, -1);
  483. giveItems(player, TONE_OF_EARTH, 1);
  484. takeItems(player, SERPENT_CHARM, 1);
  485. if (hasQuestItems(player, TONE_OF_FIRE, TONE_OF_WATER, TONE_OF_WIND))
  486. {
  487. qs.setCond(6, true);
  488. }
  489. htmltext = "30409-05.html";
  490. }
  491. else
  492. {
  493. htmltext = "30409-04.html";
  494. }
  495. }
  496. else if (hasQuestItems(player, TONE_OF_EARTH) && !hasQuestItems(player, SERPENT_CHARM))
  497. {
  498. htmltext = "30409-06.html";
  499. }
  500. }
  501. break;
  502. }
  503. case FLAME_SALAMANDER:
  504. {
  505. if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  506. {
  507. if (!hasAtLeastOneQuestItem(player, TONE_OF_FIRE, SALAMANDER_CHARM))
  508. {
  509. htmltext = "30411-01.html";
  510. giveItems(player, SALAMANDER_CHARM, 1);
  511. }
  512. else if (hasQuestItems(player, SALAMANDER_CHARM))
  513. {
  514. if (getQuestItemsCount(player, FLAME_CRYSTAL) < 5)
  515. {
  516. htmltext = "30411-02.html";
  517. }
  518. else
  519. {
  520. takeItems(player, FLAME_CRYSTAL, -1);
  521. giveItems(player, TONE_OF_FIRE, 1);
  522. takeItems(player, SALAMANDER_CHARM, 1);
  523. if (hasQuestItems(player, TONE_OF_WATER, TONE_OF_WIND, TONE_OF_EARTH))
  524. {
  525. qs.setCond(6, true);
  526. }
  527. htmltext = "30411-03.html";
  528. }
  529. }
  530. else if (hasQuestItems(player, TONE_OF_FIRE) && !hasQuestItems(player, SALAMANDER_CHARM))
  531. {
  532. htmltext = "30411-04.html";
  533. }
  534. }
  535. break;
  536. }
  537. case WIND_SYLPH:
  538. {
  539. if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  540. {
  541. if (!hasAtLeastOneQuestItem(player, TONE_OF_WIND, SYLPH_CHARM))
  542. {
  543. htmltext = "30412-01.html";
  544. }
  545. else if (hasQuestItems(player, SYLPH_CHARM))
  546. {
  547. if ((getQuestItemsCount(player, HARPYS_FEATHER) >= 20) && (getQuestItemsCount(player, WYRMS_WINGBONE) >= 10) && (getQuestItemsCount(player, WINDSUS_MANE) >= 10))
  548. {
  549. takeItems(player, HARPYS_FEATHER, -1);
  550. takeItems(player, WYRMS_WINGBONE, -1);
  551. takeItems(player, WINDSUS_MANE, -1);
  552. giveItems(player, TONE_OF_WIND, 1);
  553. takeItems(player, SYLPH_CHARM, 1);
  554. if (hasQuestItems(player, TONE_OF_WATER, TONE_OF_FIRE, TONE_OF_EARTH))
  555. {
  556. qs.setCond(6, true);
  557. }
  558. htmltext = "30412-04.html";
  559. }
  560. else
  561. {
  562. htmltext = "30412-03.html";
  563. }
  564. }
  565. else if (hasQuestItems(player, TONE_OF_WIND) && !hasQuestItems(player, SYLPH_CHARM))
  566. {
  567. htmltext = "30412-05.html";
  568. }
  569. }
  570. break;
  571. }
  572. case WATER_UNDINE:
  573. {
  574. if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  575. {
  576. if (!hasAtLeastOneQuestItem(player, TONE_OF_WATER, UNDINE_CHARM))
  577. {
  578. htmltext = "30413-01.html";
  579. giveItems(player, UNDINE_CHARM, 1);
  580. }
  581. else if (hasQuestItems(player, UNDINE_CHARM))
  582. {
  583. if (getQuestItemsCount(player, DAZZLING_DROP) < 20)
  584. {
  585. htmltext = "30413-02.html";
  586. }
  587. else
  588. {
  589. takeItems(player, DAZZLING_DROP, -1);
  590. giveItems(player, TONE_OF_WATER, 1);
  591. takeItems(player, UNDINE_CHARM, 1);
  592. if (hasQuestItems(player, TONE_OF_FIRE, TONE_OF_WIND, TONE_OF_EARTH))
  593. {
  594. qs.setCond(6, true);
  595. }
  596. htmltext = "30413-03.html";
  597. }
  598. }
  599. else if (hasQuestItems(player, TONE_OF_WATER) && !hasQuestItems(player, UNDINE_CHARM))
  600. {
  601. htmltext = "30413-04.html";
  602. }
  603. }
  604. break;
  605. }
  606. case ELDER_CASIAN:
  607. {
  608. if (hasQuestItems(player, PARINAS_LETTER))
  609. {
  610. htmltext = "30612-01.html";
  611. }
  612. else if (hasQuestItems(player, LILAC_CHARM))
  613. {
  614. if (hasQuestItems(player, GOLDEN_SEED_1ST, GOLDEN_SEED_2ND, GOLDEN_SEED_3RD))
  615. {
  616. htmltext = "30612-04.html";
  617. }
  618. else
  619. {
  620. htmltext = "30612-03.html";
  621. }
  622. }
  623. else if (hasQuestItems(player, SCORE_OF_ELEMENTS))
  624. {
  625. htmltext = "30612-05.html";
  626. }
  627. break;
  628. }
  629. }
  630. }
  631. else if (qs.isCompleted())
  632. {
  633. if (npc.getId() == BARD_RUKAL)
  634. {
  635. htmltext = getAlreadyCompletedMsg(player);
  636. }
  637. }
  638. return htmltext;
  639. }
  640. }