Q00619_RelicsOfTheOldEmpire.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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.Q00619_RelicsOfTheOldEmpire;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import com.l2jserver.gameserver.model.actor.L2Npc;
  23. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  24. import com.l2jserver.gameserver.model.quest.Quest;
  25. import com.l2jserver.gameserver.model.quest.QuestState;
  26. import com.l2jserver.gameserver.util.Util;
  27. /**
  28. * Relics of the Old Empire (619)
  29. * @author Adry_85, jurchiks
  30. */
  31. public final class Q00619_RelicsOfTheOldEmpire extends Quest
  32. {
  33. private static final class DropInfo
  34. {
  35. public final double _dropChance;
  36. public final int _doubleItemChance;
  37. public final boolean _dropEntrancePass;
  38. public DropInfo(double dropChance, int doubleItemChance, boolean dropEntrancePass)
  39. {
  40. _dropChance = dropChance;
  41. _doubleItemChance = doubleItemChance;
  42. _dropEntrancePass = dropEntrancePass;
  43. }
  44. public double getDropChance()
  45. {
  46. return _dropChance;
  47. }
  48. public int getDoubleItemChance()
  49. {
  50. return _doubleItemChance;
  51. }
  52. public boolean getDropEntrancePass()
  53. {
  54. return _dropEntrancePass;
  55. }
  56. }
  57. // NPC
  58. private static final int GHOST_OF_ADVENTURER = 31538;
  59. // Items
  60. private static final int ENTRANCE_PASS_TO_THE_SEPULCHER = 7075;
  61. private static final int BROKEN_RELIC_PART = 7254;
  62. // Misc
  63. private static final int MIN_LEVEL = 74;
  64. private static final int REQUIRED_RELIC_COUNT = 1000;
  65. // Reward
  66. private static final int[] RECIPES =
  67. {
  68. 6881, // Recipe: Forgotten Blade (60%)
  69. 6883, // Recipe: Basalt Battlehammer (60%)
  70. 6885, // Recipe: Imperial Staff (60%)
  71. 6887, // Recipe: Angel Slayer (60%)
  72. 6891, // Recipe: Dragon Hunter Axe (60%)
  73. 6893, // Recipe: Saint Spear (60%)
  74. 6895, // Recipe: Demon Splinter (60%)
  75. 6897, // Recipe: Heavens Divider (60%)
  76. 6899, // Recipe: Arcana Mace (60%)
  77. 7580, // Recipe: Draconic Bow (60%)
  78. };
  79. // Mobs
  80. private static final Map<Integer, DropInfo> MOBS = new HashMap<>();
  81. static
  82. {
  83. MOBS.put(21396, new DropInfo(0.51, 0, true)); // carrion_scarab
  84. MOBS.put(21397, new DropInfo(0.50, 0, true)); // carrion_scarab_a
  85. MOBS.put(21398, new DropInfo(0.95, 0, true)); // soldier_scarab
  86. MOBS.put(21399, new DropInfo(0.84, 0, true)); // soldier_scarab_a
  87. MOBS.put(21400, new DropInfo(0.76, 0, true)); // hexa_beetle
  88. MOBS.put(21401, new DropInfo(0.67, 0, true)); // hexa_beetle_a
  89. MOBS.put(21402, new DropInfo(0.69, 0, true)); // katraxith
  90. MOBS.put(21403, new DropInfo(0.80, 0, true)); // katraxith_a
  91. MOBS.put(21404, new DropInfo(0.90, 0, true)); // tera_beetle
  92. MOBS.put(21405, new DropInfo(0.64, 0, true)); // tera_beetle_a
  93. MOBS.put(21406, new DropInfo(0.87, 0, true)); // imperial_knight
  94. MOBS.put(21407, new DropInfo(0.56, 0, true)); // imperial_knight_a
  95. MOBS.put(21408, new DropInfo(0.82, 0, true)); // imperial_guard
  96. MOBS.put(21409, new DropInfo(0.92, 0, true)); // imperial_guard_a
  97. MOBS.put(21410, new DropInfo(0.81, 0, true)); // guardian_scarab
  98. MOBS.put(21411, new DropInfo(0.66, 0, true)); // guardian_scarab_a
  99. MOBS.put(21412, new DropInfo(1.00, 6, true)); // ustralith
  100. MOBS.put(21413, new DropInfo(0.81, 0, true)); // ustralith_a
  101. MOBS.put(21414, new DropInfo(0.79, 0, true)); // imperial_assassin
  102. MOBS.put(21415, new DropInfo(0.80, 0, true)); // imperial_assassin_a
  103. MOBS.put(21416, new DropInfo(0.82, 0, true)); // imperial_warlord
  104. MOBS.put(21417, new DropInfo(1.00, 27, true)); // imperial_warlord_a
  105. MOBS.put(21418, new DropInfo(0.66, 0, true)); // imperial_highguard
  106. MOBS.put(21419, new DropInfo(0.67, 0, true)); // imperial_highguard_a
  107. MOBS.put(21420, new DropInfo(0.82, 0, true)); // ashuras
  108. MOBS.put(21421, new DropInfo(0.77, 0, true)); // ashuras_a
  109. MOBS.put(21422, new DropInfo(0.88, 0, true)); // imperial_dancer
  110. MOBS.put(21423, new DropInfo(0.94, 0, true)); // imperial_dancer_a
  111. MOBS.put(21424, new DropInfo(1.00, 19, true)); // ashikenas
  112. MOBS.put(21425, new DropInfo(1.00, 21, true)); // ashikenas_a
  113. MOBS.put(21426, new DropInfo(1.00, 8, true)); // abraxian
  114. MOBS.put(21427, new DropInfo(0.74, 0, true)); // abraxian_a
  115. MOBS.put(21428, new DropInfo(0.76, 0, true)); // hasturan
  116. MOBS.put(21429, new DropInfo(0.80, 0, true)); // hasturan_a
  117. MOBS.put(21430, new DropInfo(1.00, 10, true)); // ahrimanes
  118. MOBS.put(21431, new DropInfo(0.94, 0, true)); // ahrimanes_a
  119. MOBS.put(21432, new DropInfo(1.00, 34, true)); // chakram_beetle
  120. MOBS.put(21433, new DropInfo(1.00, 34, true)); // jamadhr_beetle
  121. MOBS.put(21434, new DropInfo(1.00, 90, true)); // priest_of_blood
  122. MOBS.put(21435, new DropInfo(1.00, 60, true)); // sacrifice_guide
  123. MOBS.put(21436, new DropInfo(1.00, 66, true)); // sacrifice_bearer
  124. MOBS.put(21437, new DropInfo(0.69, 0, true)); // sacrifice_scarab
  125. MOBS.put(21798, new DropInfo(0.33, 0, true)); // guard_skeleton_2d
  126. MOBS.put(21799, new DropInfo(0.61, 0, true)); // guard_skeleton_3d
  127. MOBS.put(21800, new DropInfo(0.31, 0, true)); // guard_undead
  128. MOBS.put(18120, new DropInfo(1.00, 28, false)); // r11_roomboss_strong
  129. MOBS.put(18121, new DropInfo(1.00, 21, false)); // r11_roomboss_weak
  130. MOBS.put(18122, new DropInfo(0.93, 0, false)); // r11_roomboss_teleport
  131. MOBS.put(18123, new DropInfo(1.00, 28, false)); // r12_roomboss_strong
  132. MOBS.put(18124, new DropInfo(1.00, 21, false)); // r12_roomboss_weak
  133. MOBS.put(18125, new DropInfo(0.93, 0, false)); // r12_roomboss_teleport
  134. MOBS.put(18126, new DropInfo(1.00, 28, false)); // r13_roomboss_strong
  135. MOBS.put(18127, new DropInfo(1.00, 21, false)); // r13_roomboss_weak
  136. MOBS.put(18128, new DropInfo(0.93, 0, false)); // r13_roomboss_teleport
  137. MOBS.put(18129, new DropInfo(1.00, 28, false)); // r14_roomboss_strong
  138. MOBS.put(18130, new DropInfo(1.00, 21, false)); // r14_roomboss_weak
  139. MOBS.put(18131, new DropInfo(0.93, 0, false)); // r14_roomboss_teleport
  140. MOBS.put(18132, new DropInfo(1.00, 30, false)); // r1_beatle_healer
  141. MOBS.put(18133, new DropInfo(1.00, 20, false)); // r1_scorpion_warrior
  142. MOBS.put(18134, new DropInfo(0.90, 0, false)); // r1_warrior_longatk1_h
  143. MOBS.put(18135, new DropInfo(1.00, 20, false)); // r1_warrior_longatk2
  144. MOBS.put(18136, new DropInfo(1.00, 20, false)); // r1_warrior_selfbuff
  145. MOBS.put(18137, new DropInfo(0.89, 0, false)); // r1_wizard_h
  146. MOBS.put(18138, new DropInfo(1.00, 19, false)); // r1_wizard_clanbuff
  147. MOBS.put(18139, new DropInfo(1.00, 17, false)); // r1_wizard_debuff
  148. MOBS.put(18140, new DropInfo(1.00, 19, false)); // r1_wizard_selfbuff
  149. MOBS.put(18141, new DropInfo(0.76, 0, false)); // r21_scarab_roombosss
  150. MOBS.put(18142, new DropInfo(0.76, 0, false)); // r22_scarab_roombosss
  151. MOBS.put(18143, new DropInfo(0.76, 0, false)); // r23_scarab_roombosss
  152. MOBS.put(18144, new DropInfo(0.76, 0, false)); // r24_scarab_roombosss
  153. MOBS.put(18145, new DropInfo(0.65, 0, false)); // r2_wizard_clanbuff
  154. MOBS.put(18146, new DropInfo(0.66, 0, false)); // r2_warrior_longatk2
  155. MOBS.put(18147, new DropInfo(0.62, 0, false)); // r2_wizard
  156. MOBS.put(18148, new DropInfo(0.72, 0, false)); // r2_warrior
  157. MOBS.put(18149, new DropInfo(0.63, 0, false)); // r2_bomb
  158. MOBS.put(18166, new DropInfo(0.92, 0, false)); // r3_warrior
  159. MOBS.put(18167, new DropInfo(0.92, 0, false)); // r3_warrior_longatk1_h
  160. MOBS.put(18168, new DropInfo(0.93, 0, false)); // r3_warrior_longatk2
  161. MOBS.put(18169, new DropInfo(0.90, 0, false)); // r3_warrior_selfbuff
  162. MOBS.put(18170, new DropInfo(0.90, 0, false)); // r3_wizard_h
  163. MOBS.put(18171, new DropInfo(0.94, 0, false)); // r3_wizard_clanbuff
  164. MOBS.put(18172, new DropInfo(0.89, 0, false)); // r3_wizard_selfbuff
  165. MOBS.put(18173, new DropInfo(0.99, 0, false)); // r41_roomboss_strong
  166. MOBS.put(18174, new DropInfo(1.00, 22, false)); // r41_roomboss_weak
  167. MOBS.put(18175, new DropInfo(0.93, 0, false)); // r41_roomboss_teleport
  168. MOBS.put(18176, new DropInfo(0.99, 0, false)); // r42_roomboss_strong
  169. MOBS.put(18177, new DropInfo(1.00, 22, false)); // r42_roomboss_weak
  170. MOBS.put(18178, new DropInfo(0.93, 0, false)); // r42_roomboss_teleport
  171. MOBS.put(18179, new DropInfo(0.99, 0, false)); // r43_roomboss_strong
  172. MOBS.put(18180, new DropInfo(1.00, 22, false)); // r43_roomboss_weak
  173. MOBS.put(18181, new DropInfo(0.93, 0, false)); // r43_roomboss_teleport
  174. MOBS.put(18183, new DropInfo(1.00, 22, false)); // r44_roomboss_weak
  175. MOBS.put(18183, new DropInfo(0.99, 0, false)); // r44_roomboss_strong
  176. MOBS.put(18184, new DropInfo(0.93, 0, false)); // r44_roomboss_teleport
  177. MOBS.put(18185, new DropInfo(1.00, 23, false)); // r4_healer_srddmagic
  178. MOBS.put(18186, new DropInfo(1.00, 24, false)); // r4_hearler_srdebuff
  179. MOBS.put(18187, new DropInfo(1.00, 20, false)); // r4_warrior
  180. MOBS.put(18188, new DropInfo(0.90, 0, false)); // r4_warrior_longatk1_h
  181. MOBS.put(18189, new DropInfo(1.00, 20, false)); // r4_warrior_longatk2
  182. MOBS.put(18190, new DropInfo(1.00, 20, false)); // r4_warrior_selfbuff
  183. MOBS.put(18191, new DropInfo(0.89, 0, false)); // r4_wizard_h
  184. MOBS.put(18192, new DropInfo(1.00, 19, false)); // r4_wizard_clanbuff
  185. MOBS.put(18193, new DropInfo(1.00, 17, false)); // r4_wizard_debuff
  186. MOBS.put(18194, new DropInfo(1.00, 19, false)); // r4_wizard_selfbuff
  187. MOBS.put(18195, new DropInfo(0.91, 0, false)); // r4_bomb
  188. MOBS.put(18220, new DropInfo(1.00, 24, false)); // r5_healer1
  189. MOBS.put(18221, new DropInfo(1.00, 27, false)); // r5_healer2
  190. MOBS.put(18222, new DropInfo(1.00, 21, false)); // r5_warrior
  191. MOBS.put(18223, new DropInfo(0.90, 0, false)); // r5_warrior_longatk1_h
  192. MOBS.put(18224, new DropInfo(1.00, 22, false)); // r5_warrior_longatk2
  193. MOBS.put(18225, new DropInfo(1.00, 21, false)); // r5_warrior_sbuff
  194. MOBS.put(18226, new DropInfo(0.89, 0, false)); // r5_wizard_h
  195. MOBS.put(18227, new DropInfo(1.00, 53, false)); // r5_wizard_clanbuff
  196. MOBS.put(18228, new DropInfo(1.00, 15, false)); // r5_wizard_debuff
  197. MOBS.put(18229, new DropInfo(1.00, 19, false)); // r5_wizard_slefbuff
  198. MOBS.put(18230, new DropInfo(0.49, 0, false)); // r5_bomb
  199. }
  200. // @formatter:off
  201. private static final int[] ARCHON_OF_HALISHA =
  202. {
  203. 18212, 18213, 18214, 18215, 18216, 18217, 18218, 18219
  204. };
  205. // @formatter:on
  206. public Q00619_RelicsOfTheOldEmpire()
  207. {
  208. super(619, Q00619_RelicsOfTheOldEmpire.class.getSimpleName(), "Relics of the Old Empire");
  209. addStartNpc(GHOST_OF_ADVENTURER);
  210. addTalkId(GHOST_OF_ADVENTURER);
  211. addKillId(MOBS.keySet());
  212. addKillId(ARCHON_OF_HALISHA);
  213. registerQuestItems(BROKEN_RELIC_PART);
  214. }
  215. @Override
  216. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  217. {
  218. final QuestState st = getQuestState(player, false);
  219. if (st == null)
  220. {
  221. return null;
  222. }
  223. String htmltext = null;
  224. switch (event)
  225. {
  226. case "31538-02.htm":
  227. {
  228. st.startQuest();
  229. htmltext = event;
  230. break;
  231. }
  232. case "31538-05.html":
  233. {
  234. htmltext = event;
  235. break;
  236. }
  237. case "31538-06.html":
  238. {
  239. if (st.getQuestItemsCount(BROKEN_RELIC_PART) >= REQUIRED_RELIC_COUNT)
  240. {
  241. st.rewardItems(RECIPES[getRandom(RECIPES.length)], 1);
  242. st.takeItems(BROKEN_RELIC_PART, REQUIRED_RELIC_COUNT);
  243. htmltext = event;
  244. }
  245. break;
  246. }
  247. case "31538-08.html":
  248. {
  249. st.exitQuest(true, true);
  250. htmltext = event;
  251. break;
  252. }
  253. }
  254. return htmltext;
  255. }
  256. @Override
  257. public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
  258. {
  259. final QuestState st = getRandomPartyMemberState(player, -1, 3, npc);
  260. if (st != null)
  261. {
  262. int npcId = npc.getId();
  263. if (Util.contains(ARCHON_OF_HALISHA, npcId))
  264. {
  265. final int itemCount = ((getRandom(100) < 79) ? 4 : 3);
  266. st.giveItemRandomly(npc, BROKEN_RELIC_PART, itemCount, 0, 1.0, true);
  267. }
  268. else
  269. {
  270. final DropInfo info = MOBS.get(npcId);
  271. final int itemCount;
  272. if (info.getDoubleItemChance() > 0)
  273. {
  274. itemCount = ((getRandom(100) < info.getDoubleItemChance()) ? 2 : 1);
  275. }
  276. else
  277. {
  278. itemCount = 1;
  279. }
  280. st.giveItemRandomly(npc, BROKEN_RELIC_PART, itemCount, 0, info.getDropChance(), true);
  281. if (info.getDropEntrancePass())
  282. {
  283. st.giveItemRandomly(npc, ENTRANCE_PASS_TO_THE_SEPULCHER, 1, 0, 1.0 / 30, false);
  284. }
  285. }
  286. }
  287. return super.onKill(npc, player, isSummon);
  288. }
  289. @Override
  290. public String onTalk(L2Npc npc, L2PcInstance player)
  291. {
  292. final QuestState st = getQuestState(player, true);
  293. String htmltext = getNoQuestMsg(player);
  294. if (st == null)
  295. {
  296. return htmltext;
  297. }
  298. if (st.isCreated())
  299. {
  300. htmltext = ((player.getLevel() >= MIN_LEVEL) ? "31538-01.htm" : "31538-03.html");
  301. }
  302. else if (st.isStarted())
  303. {
  304. htmltext = ((getQuestItemsCount(player, BROKEN_RELIC_PART) >= REQUIRED_RELIC_COUNT) ? "31538-04.html" : "31538-07.html");
  305. }
  306. return htmltext;
  307. }
  308. }