DisciplesNecropolisPast.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  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 instances.DisciplesNecropolisPast;
  20. import instances.AbstractInstance;
  21. import java.util.ArrayList;
  22. import java.util.HashMap;
  23. import java.util.List;
  24. import java.util.Map;
  25. import quests.Q00196_SevenSignsSealOfTheEmperor.Q00196_SevenSignsSealOfTheEmperor;
  26. import com.l2jserver.gameserver.instancemanager.InstanceManager;
  27. import com.l2jserver.gameserver.model.Location;
  28. import com.l2jserver.gameserver.model.actor.L2Npc;
  29. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  30. import com.l2jserver.gameserver.model.holders.SkillHolder;
  31. import com.l2jserver.gameserver.model.instancezone.InstanceWorld;
  32. import com.l2jserver.gameserver.model.quest.QuestState;
  33. import com.l2jserver.gameserver.network.NpcStringId;
  34. import com.l2jserver.gameserver.network.SystemMessageId;
  35. import com.l2jserver.gameserver.network.clientpackets.Say2;
  36. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  37. import com.l2jserver.gameserver.util.Util;
  38. /**
  39. * Disciple's Necropolis Past instance zone.
  40. * @author Adry_85
  41. */
  42. public final class DisciplesNecropolisPast extends AbstractInstance
  43. {
  44. protected class DNPWorld extends InstanceWorld
  45. {
  46. protected final List<L2Npc> anakimGroup = new ArrayList<>();
  47. protected final List<L2Npc> lilithGroup = new ArrayList<>();
  48. protected int countKill = 0;
  49. }
  50. // NPCs
  51. private static final int SEAL_DEVICE = 27384;
  52. private static final int PROMISE_OF_MAMMON = 32585;
  53. private static final int SHUNAIMAN = 32586;
  54. private static final int LEON = 32587;
  55. private static final int DISCIPLES_GATEKEEPER = 32657;
  56. private static final int LILITH = 32715;
  57. private static final int LILITHS_STEWARD = 32716;
  58. private static final int LILITHS_ELITE = 32717;
  59. private static final int ANAKIM = 32718;
  60. private static final int ANAKIMS_GUARDIAN = 32719;
  61. private static final int ANAKIMS_GUARD = 32720;
  62. private static final int ANAKIMS_EXECUTOR = 32721;
  63. private static final int LILIM_BUTCHER = 27371;
  64. private static final int LILIM_MAGUS = 27372;
  65. private static final int LILIM_KNIGHT_ERRANT = 27373;
  66. private static final int SHILENS_EVIL_THOUGHTS1 = 27374;
  67. private static final int SHILENS_EVIL_THOUGHTS2 = 27375;
  68. private static final int LILIM_KNIGHT = 27376;
  69. private static final int LILIM_SLAYER = 27377;
  70. private static final int LILIM_GREAT_MAGUS = 27378;
  71. private static final int LILIM_GUARD_KNIGHT = 27379;
  72. // Items
  73. private static final int SACRED_SWORD_OF_EINHASAD = 15310;
  74. private static final int SEAL_OF_BINDING = 13846;
  75. // Skills
  76. private static final SkillHolder SEAL_ISOLATION = new SkillHolder(5980, 3);
  77. private static final Map<Integer, SkillHolder> SKILLS = new HashMap<>();
  78. static
  79. {
  80. SKILLS.put(32715, new SkillHolder(6187, 1)); // Presentation - Lilith Battle
  81. SKILLS.put(32716, new SkillHolder(6188, 1)); // Presentation - Lilith's Steward Battle1
  82. SKILLS.put(32717, new SkillHolder(6190, 1)); // Presentation - Lilith's Bodyguards Battle1
  83. SKILLS.put(32718, new SkillHolder(6191, 1)); // Presentation - Anakim Battle
  84. SKILLS.put(32719, new SkillHolder(6192, 1)); // Presentation - Anakim's Guardian Battle1
  85. SKILLS.put(32720, new SkillHolder(6194, 1)); // Presentation - Anakim's Guard Battle
  86. SKILLS.put(32721, new SkillHolder(6195, 1)); // Presentation - Anakim's Executor Battle
  87. }
  88. // Locations
  89. private static final Location ENTER = new Location(-89554, 216078, -7488, 0, 0);
  90. private static final Location EXIT = new Location(171895, -17501, -4903, 0, 0);
  91. // NpcStringId
  92. private static final NpcStringId[] LILITH_SHOUT =
  93. {
  94. NpcStringId.HOW_DARE_YOU_TRY_TO_CONTEND_AGAINST_ME_IN_STRENGTH_RIDICULOUS,
  95. NpcStringId.ANAKIM_IN_THE_NAME_OF_GREAT_SHILIEN_I_WILL_CUT_YOUR_THROAT,
  96. NpcStringId.YOU_CANNOT_BE_THE_MATCH_OF_LILITH_I_LL_TEACH_YOU_A_LESSON
  97. };
  98. // Misc
  99. private static final int TEMPLATE_ID = 112;
  100. private static final int DOOR_1 = 17240102;
  101. private static final int DOOR_2 = 17240104;
  102. private static final int DOOR_3 = 17240106;
  103. private static final int DOOR_4 = 17240108;
  104. private static final int DOOR_5 = 17240110;
  105. private static final int DISCIPLES_NECROPOLIS_DOOR = 17240111;
  106. private static final Map<Integer, Location> LILITH_SPAWN = new HashMap<>();
  107. private static final Map<Integer, Location> ANAKIM_SPAWN = new HashMap<>();
  108. static
  109. {
  110. LILITH_SPAWN.put(LILITH, new Location(-83175, 217021, -7504, 49151));
  111. LILITH_SPAWN.put(LILITHS_STEWARD, new Location(-83327, 216938, -7492, 50768));
  112. LILITH_SPAWN.put(LILITHS_ELITE, new Location(-83003, 216909, -7492, 4827));
  113. ANAKIM_SPAWN.put(ANAKIM, new Location(-83179, 216479, -7504, 16384));
  114. ANAKIM_SPAWN.put(ANAKIMS_GUARDIAN, new Location(-83321, 216507, -7492, 16166));
  115. ANAKIM_SPAWN.put(ANAKIMS_GUARD, new Location(-83086, 216519, -7495, 15910));
  116. ANAKIM_SPAWN.put(ANAKIMS_EXECUTOR, new Location(-83031, 216604, -7492, 17071));
  117. }
  118. public DisciplesNecropolisPast()
  119. {
  120. super(DisciplesNecropolisPast.class.getSimpleName());
  121. addAttackId(SEAL_DEVICE);
  122. addFirstTalkId(SHUNAIMAN, LEON, DISCIPLES_GATEKEEPER);
  123. addKillId(LILIM_BUTCHER, LILIM_MAGUS, LILIM_KNIGHT_ERRANT, LILIM_KNIGHT, SHILENS_EVIL_THOUGHTS1, SHILENS_EVIL_THOUGHTS2, LILIM_SLAYER, LILIM_GREAT_MAGUS, LILIM_GUARD_KNIGHT);
  124. addAggroRangeEnterId(LILIM_BUTCHER, LILIM_MAGUS, LILIM_KNIGHT_ERRANT, LILIM_KNIGHT, SHILENS_EVIL_THOUGHTS1, SHILENS_EVIL_THOUGHTS2, LILIM_SLAYER, LILIM_GREAT_MAGUS, LILIM_GUARD_KNIGHT);
  125. addSpawnId(SEAL_DEVICE);
  126. addStartNpc(PROMISE_OF_MAMMON);
  127. addTalkId(PROMISE_OF_MAMMON, SHUNAIMAN, LEON, DISCIPLES_GATEKEEPER);
  128. }
  129. protected void spawnNPC(DNPWorld world)
  130. {
  131. for (Map.Entry<Integer, Location> entry : LILITH_SPAWN.entrySet())
  132. {
  133. final L2Npc npc = addSpawn(entry.getKey(), entry.getValue(), false, 0, false, world.getInstanceId());
  134. world.lilithGroup.add(npc);
  135. }
  136. for (Map.Entry<Integer, Location> entry : ANAKIM_SPAWN.entrySet())
  137. {
  138. final L2Npc enpc = addSpawn(entry.getKey(), entry.getValue(), false, 0, false, world.getInstanceId());
  139. world.anakimGroup.add(enpc);
  140. }
  141. }
  142. private synchronized void checkDoors(L2Npc npc, DNPWorld world)
  143. {
  144. world.countKill++;
  145. switch (world.countKill)
  146. {
  147. case 4:
  148. openDoor(DOOR_1, world.getInstanceId());
  149. break;
  150. case 10:
  151. openDoor(DOOR_2, world.getInstanceId());
  152. break;
  153. case 18:
  154. openDoor(DOOR_3, world.getInstanceId());
  155. break;
  156. case 28:
  157. openDoor(DOOR_4, world.getInstanceId());
  158. break;
  159. case 40:
  160. openDoor(DOOR_5, world.getInstanceId());
  161. break;
  162. }
  163. }
  164. @Override
  165. public void onEnterInstance(L2PcInstance player, InstanceWorld world, boolean firstEntrance)
  166. {
  167. if (firstEntrance)
  168. {
  169. spawnNPC((DNPWorld) world);
  170. world.addAllowed(player.getObjectId());
  171. }
  172. teleportPlayer(player, ENTER, world.getInstanceId());
  173. }
  174. private void makeCast(L2Npc npc, List<L2Npc> targets)
  175. {
  176. npc.setTarget(targets.get(getRandom(targets.size())));
  177. if (SKILLS.containsKey(npc.getId()))
  178. {
  179. npc.doCast(SKILLS.get(npc.getId()).getSkill());
  180. }
  181. }
  182. @Override
  183. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  184. {
  185. final InstanceWorld tmpworld = InstanceManager.getInstance().getPlayerWorld(player);
  186. if (tmpworld instanceof DNPWorld)
  187. {
  188. final DNPWorld world = (DNPWorld) tmpworld;
  189. switch (event)
  190. {
  191. case "FINISH":
  192. {
  193. if (getQuestItemsCount(player, SEAL_OF_BINDING) >= 4)
  194. {
  195. player.showQuestMovie(13);
  196. startQuestTimer("TELEPORT", 27000, null, player);
  197. }
  198. break;
  199. }
  200. case "TELEPORT":
  201. {
  202. player.teleToLocation(ENTER, 0);
  203. break;
  204. }
  205. case "FIGHT":
  206. {
  207. for (L2Npc caster : world.anakimGroup)
  208. {
  209. if ((caster != null) && !caster.isCastingNow())
  210. {
  211. makeCast(caster, world.lilithGroup);
  212. }
  213. if ((caster != null) && (caster.getId() == ANAKIM))
  214. {
  215. if (caster.isScriptValue(0))
  216. {
  217. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), NpcStringId.YOU_SUCH_A_FOOL_THE_VICTORY_OVER_THIS_WAR_BELONGS_TO_SHILIEN));
  218. caster.setScriptValue(1);
  219. }
  220. else if (getRandom(100) < 10)
  221. {
  222. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), LILITH_SHOUT[getRandom(3)]));
  223. }
  224. }
  225. }
  226. for (L2Npc caster : world.lilithGroup)
  227. {
  228. if ((caster != null) && !caster.isCastingNow())
  229. {
  230. makeCast(caster, world.anakimGroup);
  231. }
  232. if ((caster != null) && (caster.getId() == 32715))
  233. {
  234. if (caster.isScriptValue(0))
  235. {
  236. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), NpcStringId.FOR_THE_ETERNITY_OF_EINHASAD));
  237. if (Util.checkIfInRange(2000, caster, player, true))
  238. {
  239. player.sendPacket(new NpcSay(caster.getObjectId(), Say2.TELL, caster.getId(), NpcStringId.MY_POWERS_WEAKENING_HURRY_AND_TURN_ON_THE_SEALING_DEVICE));
  240. }
  241. caster.setScriptValue(1);
  242. }
  243. else if (getRandom(100) < 10)
  244. {
  245. switch (getRandom(3))
  246. {
  247. case 0:
  248. {
  249. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), NpcStringId.DEAR_SHILLIENS_OFFSPRINGS_YOU_ARE_NOT_CAPABLE_OF_CONFRONTING_US));
  250. if (Util.checkIfInRange(2000, caster, player, true))
  251. {
  252. player.sendPacket(new NpcSay(caster.getObjectId(), Say2.TELL, caster.getId(), NpcStringId.ALL_4_SEALING_DEVICES_MUST_BE_TURNED_ON));
  253. }
  254. break;
  255. }
  256. case 1:
  257. {
  258. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), NpcStringId.ILL_SHOW_YOU_THE_REAL_POWER_OF_EINHASAD));
  259. if (Util.checkIfInRange(2000, caster, player, true))
  260. {
  261. player.sendPacket(new NpcSay(caster.getObjectId(), Say2.TELL, caster.getId(), NpcStringId.LILITHS_ATTACK_IS_GETTING_STRONGER_GO_AHEAD_AND_TURN_IT_ON));
  262. }
  263. break;
  264. }
  265. case 2:
  266. {
  267. caster.broadcastPacket(new NpcSay(caster.getObjectId(), Say2.NPC_SHOUT, caster.getId(), NpcStringId.DEAR_MILITARY_FORCE_OF_LIGHT_GO_DESTROY_THE_OFFSPRINGS_OF_SHILLIEN));
  268. if (Util.checkIfInRange(2000, caster, player, true))
  269. {
  270. player.sendPacket(new NpcSay(caster.getObjectId(), Say2.TELL, caster.getId(), NpcStringId.DEAR_S1_GIVE_ME_MORE_STRENGTH).addStringParameter(player.getName()));
  271. }
  272. break;
  273. }
  274. }
  275. }
  276. }
  277. startQuestTimer("FIGHT", 1000, null, player);
  278. }
  279. break;
  280. }
  281. }
  282. }
  283. return super.onAdvEvent(event, npc, player);
  284. }
  285. @Override
  286. public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isSummon)
  287. {
  288. switch (npc.getId())
  289. {
  290. case LILIM_BUTCHER:
  291. case LILIM_GUARD_KNIGHT:
  292. {
  293. if (npc.isScriptValue(0))
  294. {
  295. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.THIS_PLACE_ONCE_BELONGED_TO_LORD_SHILEN));
  296. npc.setScriptValue(1);
  297. }
  298. break;
  299. }
  300. case LILIM_MAGUS:
  301. case LILIM_GREAT_MAGUS:
  302. {
  303. if (npc.isScriptValue(0))
  304. {
  305. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.WHO_DARES_ENTER_THIS_PLACE));
  306. npc.setScriptValue(1);
  307. }
  308. break;
  309. }
  310. case LILIM_KNIGHT_ERRANT:
  311. case LILIM_KNIGHT:
  312. {
  313. if (npc.isScriptValue(0))
  314. {
  315. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.THOSE_WHO_ARE_AFRAID_SHOULD_GET_AWAY_AND_THOSE_WHO_ARE_BRAVE_SHOULD_FIGHT));
  316. npc.setScriptValue(1);
  317. }
  318. break;
  319. }
  320. case LILIM_SLAYER:
  321. {
  322. if (npc.isScriptValue(0))
  323. {
  324. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.LEAVE_NOW));
  325. npc.setScriptValue(1);
  326. }
  327. break;
  328. }
  329. }
  330. return super.onAggroRangeEnter(npc, player, isSummon);
  331. }
  332. @Override
  333. public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon)
  334. {
  335. InstanceWorld tmpworld = InstanceManager.getInstance().getPlayerWorld(player);
  336. if (tmpworld instanceof DNPWorld)
  337. {
  338. if (npc.isScriptValue(0))
  339. {
  340. if (npc.getCurrentHp() < (npc.getMaxHp() * 0.1))
  341. {
  342. giveItems(player, SEAL_OF_BINDING, 1);
  343. player.sendPacket(SystemMessageId.THE_SEALING_DEVICE_ACTIVATION_COMPLETE);
  344. npc.setScriptValue(1);
  345. startQuestTimer("FINISH", 1000, npc, player);
  346. cancelQuestTimer("FIGHT", npc, player);
  347. }
  348. }
  349. if (getRandom(100) < 50)
  350. {
  351. npc.doCast(SEAL_ISOLATION.getSkill());
  352. }
  353. }
  354. return super.onAttack(npc, player, damage, isSummon);
  355. }
  356. @Override
  357. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  358. {
  359. return npc.getId() + ".htm";
  360. }
  361. @Override
  362. public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
  363. {
  364. final InstanceWorld tmpworld = InstanceManager.getInstance().getPlayerWorld(player);
  365. if (tmpworld instanceof DNPWorld)
  366. {
  367. final DNPWorld world = (DNPWorld) tmpworld;
  368. checkDoors(npc, world);
  369. }
  370. switch (npc.getId())
  371. {
  372. case LILIM_MAGUS:
  373. case LILIM_GREAT_MAGUS:
  374. {
  375. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.LORD_SHILEN_SOME_DAY_YOU_WILL_ACCOMPLISH_THIS_MISSION));
  376. break;
  377. }
  378. case LILIM_KNIGHT_ERRANT:
  379. case LILIM_KNIGHT:
  380. case LILIM_GUARD_KNIGHT:
  381. {
  382. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.WHY_ARE_YOU_GETTING_IN_OUR_WAY));
  383. break;
  384. }
  385. case LILIM_SLAYER:
  386. {
  387. npc.broadcastPacket(new NpcSay(npc.getObjectId(), Say2.NPC_ALL, npc.getId(), NpcStringId.FOR_SHILEN));
  388. break;
  389. }
  390. }
  391. return super.onKill(npc, player, isSummon);
  392. }
  393. @Override
  394. public final String onSpawn(L2Npc npc)
  395. {
  396. npc.setIsMortal(false);
  397. return super.onSpawn(npc);
  398. }
  399. @Override
  400. public String onTalk(L2Npc npc, L2PcInstance talker)
  401. {
  402. final QuestState qs = talker.getQuestState(Q00196_SevenSignsSealOfTheEmperor.class.getSimpleName());
  403. String htmltext = getNoQuestMsg(talker);
  404. if (qs == null)
  405. {
  406. return htmltext;
  407. }
  408. switch (npc.getId())
  409. {
  410. case PROMISE_OF_MAMMON:
  411. {
  412. if (qs.isCond(3) || qs.isCond(4))
  413. {
  414. enterInstance(talker, new DNPWorld(), "DisciplesNecropolisPast.xml", TEMPLATE_ID);
  415. return "";
  416. }
  417. break;
  418. }
  419. case LEON:
  420. {
  421. if (qs.getCond() >= 3)
  422. {
  423. takeItems(talker, SACRED_SWORD_OF_EINHASAD, -1);
  424. InstanceWorld world = InstanceManager.getInstance().getPlayerWorld(talker);
  425. world.removeAllowed(talker.getObjectId());
  426. talker.teleToLocation(EXIT, 0);
  427. htmltext = "32587-01.html";
  428. }
  429. break;
  430. }
  431. case DISCIPLES_GATEKEEPER:
  432. {
  433. if (qs.getCond() >= 3)
  434. {
  435. InstanceWorld tmpworld = InstanceManager.getInstance().getWorld(npc.getInstanceId());
  436. if (tmpworld instanceof DNPWorld)
  437. {
  438. DNPWorld world = (DNPWorld) tmpworld;
  439. openDoor(DISCIPLES_NECROPOLIS_DOOR, world.getInstanceId());
  440. talker.showQuestMovie(12);
  441. startQuestTimer("FIGHT", 1000, null, talker);
  442. }
  443. }
  444. break;
  445. }
  446. }
  447. return htmltext;
  448. }
  449. }