AbstractSagaQuest.java 26 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036
  1. /*
  2. * Copyright (C) 2004-2014 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;
  20. import java.util.ArrayList;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import com.l2jserver.Config;
  25. import com.l2jserver.gameserver.ai.CtrlIntention;
  26. import com.l2jserver.gameserver.model.L2Object;
  27. import com.l2jserver.gameserver.model.L2Party;
  28. import com.l2jserver.gameserver.model.L2World;
  29. import com.l2jserver.gameserver.model.Location;
  30. import com.l2jserver.gameserver.model.actor.L2Attackable;
  31. import com.l2jserver.gameserver.model.actor.L2Character;
  32. import com.l2jserver.gameserver.model.actor.L2Npc;
  33. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  34. import com.l2jserver.gameserver.model.quest.Quest;
  35. import com.l2jserver.gameserver.model.quest.QuestState;
  36. import com.l2jserver.gameserver.model.skills.Skill;
  37. import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
  38. import com.l2jserver.gameserver.network.serverpackets.NpcSay;
  39. /**
  40. * Abstract Saga quest.
  41. * @author Kerberos
  42. */
  43. public abstract class AbstractSagaQuest extends Quest
  44. {
  45. protected int[] _npc;
  46. protected int[] Items;
  47. protected int[] Mob;
  48. protected int[] classid;
  49. protected int[] prevclass;
  50. protected Location[] npcSpawnLocations;
  51. protected String[] Text;
  52. private static final Map<L2Npc, Integer> SPAWN_LIST = new HashMap<>();
  53. // @formatter:off
  54. private static int[][] QuestClass =
  55. {
  56. { 0x7f }, { 0x80, 0x81 }, { 0x82 }, { 0x05 }, { 0x14 }, { 0x15 },
  57. { 0x02 }, { 0x03 }, { 0x2e }, { 0x30 }, { 0x33 }, { 0x34 }, { 0x08 },
  58. { 0x17 }, { 0x24 }, { 0x09 }, { 0x18 }, { 0x25 }, { 0x10 }, { 0x11 },
  59. { 0x1e }, { 0x0c }, { 0x1b }, { 0x28 }, { 0x0e }, { 0x1c }, { 0x29 },
  60. { 0x0d }, { 0x06 }, { 0x22 }, { 0x21 }, { 0x2b }, { 0x37 }, { 0x39 }
  61. };
  62. // @formatter:on
  63. public AbstractSagaQuest(int questId, String name, String descr)
  64. {
  65. super(questId, name, descr);
  66. }
  67. private QuestState findQuest(L2PcInstance player)
  68. {
  69. QuestState st = player.getQuestState(getName());
  70. if (st != null)
  71. {
  72. if (getId() == 68)
  73. {
  74. for (int q = 0; q < 2; q++)
  75. {
  76. if (player.getClassId().getId() == QuestClass[1][q])
  77. {
  78. return st;
  79. }
  80. }
  81. }
  82. else if (player.getClassId().getId() == QuestClass[getId() - 67][0])
  83. {
  84. return st;
  85. }
  86. }
  87. return null;
  88. }
  89. private QuestState findRightState(L2Npc npc)
  90. {
  91. L2PcInstance player = null;
  92. QuestState st = null;
  93. if (SPAWN_LIST.containsKey(npc))
  94. {
  95. player = L2World.getInstance().getPlayer(SPAWN_LIST.get(npc));
  96. if (player != null)
  97. {
  98. st = player.getQuestState(getName());
  99. }
  100. }
  101. return st;
  102. }
  103. private int getClassId(L2PcInstance player)
  104. {
  105. if (player.getClassId().getId() == 0x81)
  106. {
  107. return classid[1];
  108. }
  109. return classid[0];
  110. }
  111. private int getPrevClass(L2PcInstance player)
  112. {
  113. if (player.getClassId().getId() == 0x81)
  114. {
  115. if (prevclass.length == 1)
  116. {
  117. return -1;
  118. }
  119. return prevclass[1];
  120. }
  121. return prevclass[0];
  122. }
  123. private void giveHalishaMark(QuestState st2)
  124. {
  125. if (st2.getInt("spawned") == 0)
  126. {
  127. if (st2.getQuestItemsCount(Items[3]) >= 700)
  128. {
  129. st2.takeItems(Items[3], 20);
  130. int xx = st2.getPlayer().getX();
  131. int yy = st2.getPlayer().getY();
  132. int zz = st2.getPlayer().getZ();
  133. L2Npc Archon = st2.addSpawn(Mob[1], xx, yy, zz);
  134. addSpawn(st2, Archon);
  135. st2.set("spawned", "1");
  136. st2.startQuestTimer("Archon Hellisha has despawned", 600000, Archon);
  137. autoChat(Archon, Text[13].replace("PLAYERNAME", st2.getPlayer().getName()));
  138. ((L2Attackable) Archon).addDamageHate(st2.getPlayer(), 0, 99999);
  139. Archon.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, st2.getPlayer(), null);
  140. }
  141. else
  142. {
  143. st2.giveItems(Items[3], getRandom(1, 4));
  144. }
  145. }
  146. }
  147. @Override
  148. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  149. {
  150. QuestState st = player.getQuestState(getName());
  151. String htmltext = null;
  152. if (st != null)
  153. {
  154. switch (event)
  155. {
  156. case "0-011.htm":
  157. case "0-012.htm":
  158. case "0-013.htm":
  159. case "0-014.htm":
  160. case "0-015.htm":
  161. htmltext = event;
  162. break;
  163. case "accept":
  164. st.startQuest();
  165. giveItems(player, Items[10], 1);
  166. htmltext = "0-03.htm";
  167. break;
  168. case "0-1":
  169. if (player.getLevel() < 76)
  170. {
  171. htmltext = "0-02.htm";
  172. if (st.isCreated())
  173. {
  174. st.exitQuest(true);
  175. }
  176. }
  177. else
  178. {
  179. htmltext = "0-05.htm";
  180. }
  181. break;
  182. case "0-2":
  183. if (player.getLevel() < 76)
  184. {
  185. takeItems(player, Items[10], -1);
  186. st.setCond(20, true);
  187. htmltext = "0-08.htm";
  188. }
  189. else
  190. {
  191. takeItems(player, Items[10], -1);
  192. addExpAndSp(player, 2299404, 0);
  193. giveAdena(player, 5000000, true);
  194. giveItems(player, 6622, 1);
  195. int Class = getClassId(player);
  196. int prevClass = getPrevClass(player);
  197. player.setClassId(Class);
  198. if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
  199. {
  200. player.setBaseClass(Class);
  201. }
  202. player.broadcastUserInfo();
  203. cast(npc, player, 4339, 1);
  204. st.exitQuest(false);
  205. htmltext = "0-07.htm";
  206. }
  207. break;
  208. case "1-3":
  209. st.setCond(3);
  210. htmltext = "1-05.htm";
  211. break;
  212. case "1-4":
  213. st.setCond(4);
  214. takeItems(player, Items[0], 1);
  215. if (Items[11] != 0)
  216. {
  217. takeItems(player, Items[11], 1);
  218. }
  219. giveItems(player, Items[1], 1);
  220. htmltext = "1-06.htm";
  221. break;
  222. case "2-1":
  223. st.setCond(2);
  224. htmltext = "2-05.htm";
  225. break;
  226. case "2-2":
  227. st.setCond(5);
  228. takeItems(player, Items[1], 1);
  229. giveItems(player, Items[4], 1);
  230. htmltext = "2-06.htm";
  231. break;
  232. case "3-5":
  233. htmltext = "3-07.htm";
  234. break;
  235. case "3-6":
  236. st.setCond(11);
  237. htmltext = "3-02.htm";
  238. break;
  239. case "3-7":
  240. st.setCond(12);
  241. htmltext = "3-03.htm";
  242. break;
  243. case "3-8":
  244. st.setCond(13);
  245. takeItems(player, Items[2], 1);
  246. giveItems(player, Items[7], 1);
  247. htmltext = "3-08.htm";
  248. break;
  249. case "4-1":
  250. htmltext = "4-010.htm";
  251. break;
  252. case "4-2":
  253. giveItems(player, Items[9], 1);
  254. st.setCond(18, true);
  255. htmltext = "4-011.htm";
  256. break;
  257. case "4-3":
  258. giveItems(player, Items[9], 1);
  259. st.setCond(18, true);
  260. autoChat(npc, Text[13].replace("PLAYERNAME", player.getName()));
  261. st.set("Quest0", "0");
  262. cancelQuestTimer("Mob_2 has despawned", npc, player);
  263. DeleteSpawn(st, npc);
  264. return null;
  265. case "5-1":
  266. st.setCond(6, true);
  267. takeItems(player, Items[4], 1);
  268. cast(npc, player, 4546, 1);
  269. htmltext = "5-02.htm";
  270. break;
  271. case "6-1":
  272. st.setCond(8, true);
  273. takeItems(player, Items[5], 1);
  274. cast(npc, player, 4546, 1);
  275. htmltext = "6-03.htm";
  276. break;
  277. case "7-1":
  278. if (st.getInt("spawned") == 1)
  279. {
  280. htmltext = "7-03.htm";
  281. }
  282. else if (st.getInt("spawned") == 0)
  283. {
  284. L2Npc Mob_1 = addSpawn(Mob[0], npcSpawnLocations[0], false, 0);
  285. st.set("spawned", "1");
  286. st.startQuestTimer("Mob_1 Timer 1", 500, Mob_1);
  287. st.startQuestTimer("Mob_1 has despawned", 300000, Mob_1);
  288. addSpawn(st, Mob_1);
  289. htmltext = "7-02.htm";
  290. }
  291. else
  292. {
  293. htmltext = "7-04.htm";
  294. }
  295. break;
  296. case "7-2":
  297. st.setCond(10, true);
  298. takeItems(player, Items[6], 1);
  299. cast(npc, player, 4546, 1);
  300. htmltext = "7-06.htm";
  301. break;
  302. case "8-1":
  303. st.setCond(14, true);
  304. takeItems(player, Items[7], 1);
  305. cast(npc, player, 4546, 1);
  306. htmltext = "8-02.htm";
  307. break;
  308. case "9-1":
  309. st.setCond(17, true);
  310. takeItems(player, Items[8], 1);
  311. cast(npc, player, 4546, 1);
  312. htmltext = "9-03.htm";
  313. break;
  314. case "10-1":
  315. if (st.getInt("Quest0") == 0)
  316. {
  317. L2Npc Mob_3 = addSpawn(Mob[2], npcSpawnLocations[1], false, 0);
  318. L2Npc Mob_2 = addSpawn(_npc[4], npcSpawnLocations[2], false, 0);
  319. addSpawn(st, Mob_3);
  320. addSpawn(st, Mob_2);
  321. st.set("Mob_2", String.valueOf(Mob_2.getObjectId()));
  322. st.set("Quest0", "1");
  323. st.set("Quest1", "45");
  324. st.startRepeatingQuestTimer("Mob_3 Timer 1", 500, Mob_3);
  325. st.startQuestTimer("Mob_3 has despawned", 59000, Mob_3);
  326. st.startQuestTimer("Mob_2 Timer 1", 500, Mob_2);
  327. st.startQuestTimer("Mob_2 has despawned", 60000, Mob_2);
  328. htmltext = "10-02.htm";
  329. }
  330. else if (st.getInt("Quest1") == 45)
  331. {
  332. htmltext = "10-03.htm";
  333. }
  334. else
  335. {
  336. htmltext = "10-04.htm";
  337. }
  338. break;
  339. case "10-2":
  340. st.setCond(19, true);
  341. takeItems(player, Items[9], 1);
  342. cast(npc, player, 4546, 1);
  343. htmltext = "10-06.htm";
  344. break;
  345. case "11-9":
  346. st.setCond(15);
  347. htmltext = "11-03.htm";
  348. break;
  349. case "Mob_1 Timer 1":
  350. autoChat(npc, Text[0].replace("PLAYERNAME", player.getName()));
  351. return null;
  352. case "Mob_1 has despawned":
  353. autoChat(npc, Text[1].replace("PLAYERNAME", player.getName()));
  354. st.set("spawned", "0");
  355. DeleteSpawn(st, npc);
  356. return null;
  357. case "Archon Hellisha has despawned":
  358. autoChat(npc, Text[6].replace("PLAYERNAME", player.getName()));
  359. st.set("spawned", "0");
  360. DeleteSpawn(st, npc);
  361. return null;
  362. case "Mob_3 Timer 1":
  363. L2Npc Mob_2 = FindSpawn(player, (L2Npc) L2World.getInstance().findObject(st.getInt("Mob_2")));
  364. if (npc.getKnownList().knowsObject(Mob_2))
  365. {
  366. ((L2Attackable) npc).addDamageHate(Mob_2, 0, 99999);
  367. npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, Mob_2, null);
  368. Mob_2.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, npc, null);
  369. autoChat(npc, Text[14].replace("PLAYERNAME", player.getName()));
  370. cancelQuestTimer("Mob_3 Timer 1", npc, player);
  371. }
  372. return null;
  373. case "Mob_3 has despawned":
  374. autoChat(npc, Text[15].replace("PLAYERNAME", player.getName()));
  375. st.set("Quest0", "2");
  376. DeleteSpawn(st, npc);
  377. return null;
  378. case "Mob_2 Timer 1":
  379. autoChat(npc, Text[7].replace("PLAYERNAME", player.getName()));
  380. st.startQuestTimer("Mob_2 Timer 2", 1500, npc);
  381. if (st.getInt("Quest1") == 45)
  382. {
  383. st.set("Quest1", "0");
  384. }
  385. return null;
  386. case "Mob_2 Timer 2":
  387. autoChat(npc, Text[8].replace("PLAYERNAME", player.getName()));
  388. st.startQuestTimer("Mob_2 Timer 3", 10000, npc);
  389. return null;
  390. case "Mob_2 Timer 3":
  391. if (st.getInt("Quest0") == 0)
  392. {
  393. st.startQuestTimer("Mob_2 Timer 3", 13000, npc);
  394. if (getRandomBoolean())
  395. {
  396. autoChat(npc, Text[9].replace("PLAYERNAME", player.getName()));
  397. }
  398. else
  399. {
  400. autoChat(npc, Text[10].replace("PLAYERNAME", player.getName()));
  401. }
  402. }
  403. return null;
  404. case "Mob_2 has despawned":
  405. st.set("Quest1", String.valueOf(st.getInt("Quest1") + 1));
  406. if ((st.getInt("Quest0") == 1) || (st.getInt("Quest0") == 2) || (st.getInt("Quest1") > 3))
  407. {
  408. st.set("Quest0", "0");
  409. // TODO this IF will never be true
  410. if (st.getInt("Quest0") == 1)
  411. {
  412. autoChat(npc, Text[11].replace("PLAYERNAME", player.getName()));
  413. }
  414. else
  415. {
  416. autoChat(npc, Text[12].replace("PLAYERNAME", player.getName()));
  417. }
  418. DeleteSpawn(st, npc);
  419. }
  420. else
  421. {
  422. st.startQuestTimer("Mob_2 has despawned", 1000, npc);
  423. }
  424. return null;
  425. }
  426. }
  427. return htmltext;
  428. }
  429. @Override
  430. public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isSummon)
  431. {
  432. QuestState st2 = findRightState(npc);
  433. if (st2 != null)
  434. {
  435. int cond = st2.getCond();
  436. QuestState st = player.getQuestState(getName());
  437. int npcId = npc.getId();
  438. if ((npcId == Mob[2]) && (st == st2) && (cond == 17))
  439. {
  440. int quest0 = st.getInt("Quest0") + 1;
  441. if (quest0 == 1)
  442. {
  443. autoChat(npc, Text[16].replace("PLAYERNAME", player.getName()));
  444. }
  445. if (quest0 > 15)
  446. {
  447. quest0 = 1;
  448. autoChat(npc, Text[17].replace("PLAYERNAME", player.getName()));
  449. cancelQuestTimer("Mob_3 has despawned", npc, st2.getPlayer());
  450. st.set("Tab", "1");
  451. DeleteSpawn(st, npc);
  452. }
  453. st.set("Quest0", Integer.toString(quest0));
  454. }
  455. else if ((npcId == Mob[1]) && (cond == 15))
  456. {
  457. if ((st != st2) || ((st == st2) && player.isInParty()))
  458. {
  459. autoChat(npc, Text[5].replace("PLAYERNAME", player.getName()));
  460. cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
  461. st2.set("spawned", "0");
  462. DeleteSpawn(st2, npc);
  463. }
  464. }
  465. }
  466. return super.onAttack(npc, player, damage, isSummon);
  467. }
  468. @Override
  469. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  470. {
  471. String htmltext = "";
  472. QuestState st = player.getQuestState(getName());
  473. int npcId = npc.getId();
  474. if (st != null)
  475. {
  476. if (npcId == _npc[4])
  477. {
  478. int cond = st.getCond();
  479. if (cond == 17)
  480. {
  481. QuestState st2 = findRightState(npc);
  482. if (st2 != null)
  483. {
  484. player.setLastQuestNpcObject(npc.getObjectId());
  485. int tab = st.getInt("Tab");
  486. int quest0 = st.getInt("Quest0");
  487. if (st == st2)
  488. {
  489. if (tab == 1)
  490. {
  491. if (quest0 == 0)
  492. {
  493. htmltext = "4-04.htm";
  494. }
  495. else if (quest0 == 1)
  496. {
  497. htmltext = "4-06.htm";
  498. }
  499. }
  500. else if (quest0 == 0)
  501. {
  502. htmltext = "4-01.htm";
  503. }
  504. else if (quest0 == 1)
  505. {
  506. htmltext = "4-03.htm";
  507. }
  508. }
  509. else if (tab == 1)
  510. {
  511. if (quest0 == 0)
  512. {
  513. htmltext = "4-05.htm";
  514. }
  515. else if (quest0 == 1)
  516. {
  517. htmltext = "4-07.htm";
  518. }
  519. }
  520. else if (quest0 == 0)
  521. {
  522. htmltext = "4-02.htm";
  523. }
  524. }
  525. }
  526. else if (cond == 18)
  527. {
  528. htmltext = "4-08.htm";
  529. }
  530. }
  531. }
  532. if (htmltext == "")
  533. {
  534. npc.showChatWindow(player);
  535. }
  536. return htmltext;
  537. }
  538. @Override
  539. public String onKill(L2Npc npc, L2PcInstance player, boolean isSummon)
  540. {
  541. int npcId = npc.getId();
  542. QuestState st = player.getQuestState(getName());
  543. for (int Archon_Minion = 21646; Archon_Minion < 21652; Archon_Minion++)
  544. {
  545. if (npcId == Archon_Minion)
  546. {
  547. L2Party party = player.getParty();
  548. if (party != null)
  549. {
  550. List<QuestState> partyQuestMembers = new ArrayList<>();
  551. for (L2PcInstance player1 : party.getMembers())
  552. {
  553. QuestState st1 = findQuest(player1);
  554. if ((st1 != null) && player1.isInsideRadius(player, Config.ALT_PARTY_RANGE2, false, false))
  555. {
  556. if (st1.isCond(15))
  557. {
  558. partyQuestMembers.add(st1);
  559. }
  560. }
  561. }
  562. if (partyQuestMembers.size() > 0)
  563. {
  564. QuestState st2 = partyQuestMembers.get(getRandom(partyQuestMembers.size()));
  565. giveHalishaMark(st2);
  566. }
  567. }
  568. else
  569. {
  570. QuestState st1 = findQuest(player);
  571. if (st1 != null)
  572. {
  573. if (st1.isCond(15))
  574. {
  575. giveHalishaMark(st1);
  576. }
  577. }
  578. }
  579. return super.onKill(npc, player, isSummon);
  580. }
  581. }
  582. int[] Archon_Hellisha_Norm =
  583. {
  584. 18212,
  585. 18214,
  586. 18215,
  587. 18216,
  588. 18218
  589. };
  590. for (int element : Archon_Hellisha_Norm)
  591. {
  592. if (npcId == element)
  593. {
  594. QuestState st1 = findQuest(player);
  595. if (st1 != null)
  596. {
  597. if (st1.isCond(15))
  598. {
  599. // This is just a guess....not really sure what it actually says, if anything
  600. autoChat(npc, Text[4].replace("PLAYERNAME", st1.getPlayer().getName()));
  601. st1.giveItems(Items[8], 1);
  602. st1.takeItems(Items[3], -1);
  603. st1.setCond(16, true);
  604. }
  605. }
  606. return super.onKill(npc, player, isSummon);
  607. }
  608. }
  609. for (int Guardian_Angel = 27214; Guardian_Angel < 27217; Guardian_Angel++)
  610. {
  611. if (npcId == Guardian_Angel)
  612. {
  613. QuestState st1 = findQuest(player);
  614. if ((st1 != null) && st1.isCond(6))
  615. {
  616. int kills = st1.getInt("kills");
  617. if (kills < 9)
  618. {
  619. st1.set("kills", Integer.toString(kills + 1));
  620. }
  621. else
  622. {
  623. st1.giveItems(Items[5], 1);
  624. st.setCond(7, true);
  625. }
  626. }
  627. return super.onKill(npc, player, isSummon);
  628. }
  629. }
  630. if ((st != null) && (npcId != Mob[2]))
  631. {
  632. QuestState st2 = findRightState(npc);
  633. if (st2 != null)
  634. {
  635. int cond = st.getCond();
  636. if ((npcId == Mob[0]) && (cond == 8))
  637. {
  638. if (!player.isInParty())
  639. {
  640. if (st == st2)
  641. {
  642. autoChat(npc, Text[12].replace("PLAYERNAME", player.getName()));
  643. giveItems(player, Items[6], 1);
  644. st.setCond(9, true);
  645. }
  646. }
  647. cancelQuestTimer("Mob_1 has despawned", npc, st2.getPlayer());
  648. st2.set("spawned", "0");
  649. DeleteSpawn(st2, npc);
  650. }
  651. else if ((npcId == Mob[1]) && (cond == 15))
  652. {
  653. if (!player.isInParty())
  654. {
  655. if (st == st2)
  656. {
  657. autoChat(npc, Text[4].replace("PLAYERNAME", player.getName()));
  658. giveItems(player, Items[8], 1);
  659. takeItems(player, Items[3], -1);
  660. st.setCond(16, true);
  661. }
  662. else
  663. {
  664. autoChat(npc, Text[5].replace("PLAYERNAME", player.getName()));
  665. }
  666. }
  667. cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
  668. st2.set("spawned", "0");
  669. DeleteSpawn(st2, npc);
  670. }
  671. }
  672. }
  673. else if (npcId == Mob[0])
  674. {
  675. st = findRightState(npc);
  676. if (st != null)
  677. {
  678. cancelQuestTimer("Mob_1 has despawned", npc, st.getPlayer());
  679. st.set("spawned", "0");
  680. DeleteSpawn(st, npc);
  681. }
  682. }
  683. else if (npcId == Mob[1])
  684. {
  685. st = findRightState(npc);
  686. if (st != null)
  687. {
  688. cancelQuestTimer("Archon Hellisha has despawned", npc, st.getPlayer());
  689. st.set("spawned", "0");
  690. DeleteSpawn(st, npc);
  691. }
  692. }
  693. return super.onKill(npc, player, isSummon);
  694. }
  695. @Override
  696. public String onSkillSee(L2Npc npc, L2PcInstance player, Skill skill, L2Object[] targets, boolean isSummon)
  697. {
  698. if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) != player.getObjectId()))
  699. {
  700. L2PcInstance quest_player = (L2PcInstance) L2World.getInstance().findObject(SPAWN_LIST.get(npc));
  701. if (quest_player == null)
  702. {
  703. return null;
  704. }
  705. for (L2Object obj : targets)
  706. {
  707. if ((obj == quest_player) || (obj == npc))
  708. {
  709. QuestState st2 = findRightState(npc);
  710. if (st2 == null)
  711. {
  712. return null;
  713. }
  714. autoChat(npc, Text[5].replace("PLAYERNAME", player.getName()));
  715. cancelQuestTimer("Archon Hellisha has despawned", npc, st2.getPlayer());
  716. st2.set("spawned", "0");
  717. DeleteSpawn(st2, npc);
  718. }
  719. }
  720. }
  721. return super.onSkillSee(npc, player, skill, targets, isSummon);
  722. }
  723. @Override
  724. public String onTalk(L2Npc npc, L2PcInstance player)
  725. {
  726. String htmltext = getNoQuestMsg(player);
  727. QuestState st = player.getQuestState(getName());
  728. if (st != null)
  729. {
  730. int npcId = npc.getId();
  731. if ((npcId == _npc[0]) && st.isCompleted())
  732. {
  733. htmltext = getAlreadyCompletedMsg(player);
  734. }
  735. else if (player.getClassId().getId() == getPrevClass(player))
  736. {
  737. switch (st.getCond())
  738. {
  739. case 0:
  740. if (npcId == _npc[0])
  741. {
  742. htmltext = "0-01.htm";
  743. }
  744. break;
  745. case 1:
  746. if (npcId == _npc[0])
  747. {
  748. htmltext = "0-04.htm";
  749. }
  750. else if (npcId == _npc[2])
  751. {
  752. htmltext = "2-01.htm";
  753. }
  754. break;
  755. case 2:
  756. if (npcId == _npc[2])
  757. {
  758. htmltext = "2-02.htm";
  759. }
  760. else if (npcId == _npc[1])
  761. {
  762. htmltext = "1-01.htm";
  763. }
  764. break;
  765. case 3:
  766. if ((npcId == _npc[1]) && hasQuestItems(player, Items[0]))
  767. {
  768. if ((Items[11] == 0) || hasQuestItems(player, Items[11]))
  769. {
  770. htmltext = "1-03.htm";
  771. }
  772. else
  773. {
  774. htmltext = "1-02.htm";
  775. }
  776. }
  777. break;
  778. case 4:
  779. if (npcId == _npc[1])
  780. {
  781. htmltext = "1-04.htm";
  782. }
  783. else if (npcId == _npc[2])
  784. {
  785. htmltext = "2-03.htm";
  786. }
  787. break;
  788. case 5:
  789. if (npcId == _npc[2])
  790. {
  791. htmltext = "2-04.htm";
  792. }
  793. else if (npcId == _npc[5])
  794. {
  795. htmltext = "5-01.htm";
  796. }
  797. break;
  798. case 6:
  799. if (npcId == _npc[5])
  800. {
  801. htmltext = "5-03.htm";
  802. }
  803. else if (npcId == _npc[6])
  804. {
  805. htmltext = "6-01.htm";
  806. }
  807. break;
  808. case 7:
  809. if (npcId == _npc[6])
  810. {
  811. htmltext = "6-02.htm";
  812. }
  813. break;
  814. case 8:
  815. if (npcId == _npc[6])
  816. {
  817. htmltext = "6-04.htm";
  818. }
  819. else if (npcId == _npc[7])
  820. {
  821. htmltext = "7-01.htm";
  822. }
  823. break;
  824. case 9:
  825. if (npcId == _npc[7])
  826. {
  827. htmltext = "7-05.htm";
  828. }
  829. break;
  830. case 10:
  831. if (npcId == _npc[7])
  832. {
  833. htmltext = "7-07.htm";
  834. }
  835. else if (npcId == _npc[3])
  836. {
  837. htmltext = "3-01.htm";
  838. }
  839. break;
  840. case 11:
  841. case 12:
  842. if (npcId == _npc[3])
  843. {
  844. if (hasQuestItems(player, Items[2]))
  845. {
  846. htmltext = "3-05.htm";
  847. }
  848. else
  849. {
  850. htmltext = "3-04.htm";
  851. }
  852. }
  853. break;
  854. case 13:
  855. if (npcId == _npc[3])
  856. {
  857. htmltext = "3-06.htm";
  858. }
  859. else if (npcId == _npc[8])
  860. {
  861. htmltext = "8-01.htm";
  862. }
  863. break;
  864. case 14:
  865. if (npcId == _npc[8])
  866. {
  867. htmltext = "8-03.htm";
  868. }
  869. else if (npcId == _npc[11])
  870. {
  871. htmltext = "11-01.htm";
  872. }
  873. break;
  874. case 15:
  875. if (npcId == _npc[11])
  876. {
  877. htmltext = "11-02.htm";
  878. }
  879. else if (npcId == _npc[9])
  880. {
  881. htmltext = "9-01.htm";
  882. }
  883. break;
  884. case 16:
  885. if (npcId == _npc[9])
  886. {
  887. htmltext = "9-02.htm";
  888. }
  889. break;
  890. case 17:
  891. if (npcId == _npc[9])
  892. {
  893. htmltext = "9-04.htm";
  894. }
  895. else if (npcId == _npc[10])
  896. {
  897. htmltext = "10-01.htm";
  898. }
  899. break;
  900. case 18:
  901. if (npcId == _npc[10])
  902. {
  903. htmltext = "10-05.htm";
  904. }
  905. break;
  906. case 19:
  907. if (npcId == _npc[10])
  908. {
  909. htmltext = "10-07.htm";
  910. }
  911. else if (npcId == _npc[0])
  912. {
  913. htmltext = "0-06.htm";
  914. }
  915. break;
  916. case 20:
  917. if (npcId == _npc[0])
  918. {
  919. if (player.getLevel() >= 76)
  920. {
  921. htmltext = "0-09.htm";
  922. if ((getClassId(player) < 131) || (getClassId(player) > 135)) // in Kamael quests, npc wants to chat for a bit before changing class
  923. {
  924. st.exitQuest(false);
  925. addExpAndSp(player, 2299404, 0);
  926. giveAdena(player, 5000000, true);
  927. giveItems(player, 6622, 1); // XXX rewardItems?
  928. int classId = getClassId(player);
  929. int prevClass = getPrevClass(player);
  930. player.setClassId(classId);
  931. if (!player.isSubClassActive() && (player.getBaseClass() == prevClass))
  932. {
  933. player.setBaseClass(classId);
  934. }
  935. player.broadcastUserInfo();
  936. cast(npc, player, 4339, 1);
  937. }
  938. }
  939. else
  940. {
  941. htmltext = "0-010.htm";
  942. }
  943. }
  944. break;
  945. }
  946. }
  947. }
  948. return htmltext;
  949. }
  950. public void registerNPCs()
  951. {
  952. addStartNpc(_npc[0]);
  953. addAttackId(Mob[2], Mob[1]);
  954. addSkillSeeId(Mob[1]);
  955. addFirstTalkId(_npc[4]);
  956. addTalkId(_npc);
  957. addKillId(Mob);
  958. final int[] questItemIds = Items.clone();
  959. questItemIds[0] = 0;
  960. questItemIds[2] = 0; // remove Ice Crystal and Divine Stone of Wisdom
  961. registerQuestItems(questItemIds);
  962. for (int Archon_Minion = 21646; Archon_Minion < 21652; Archon_Minion++)
  963. {
  964. addKillId(Archon_Minion);
  965. }
  966. int[] Archon_Hellisha_Norm =
  967. {
  968. 18212,
  969. 18214,
  970. 18215,
  971. 18216,
  972. 18218
  973. };
  974. addKillId(Archon_Hellisha_Norm);
  975. for (int Guardian_Angel = 27214; Guardian_Angel < 27217; Guardian_Angel++)
  976. {
  977. addKillId(Guardian_Angel);
  978. }
  979. }
  980. private static void addSpawn(QuestState st, L2Npc mob)
  981. {
  982. SPAWN_LIST.put(mob, st.getPlayer().getObjectId());
  983. }
  984. private static void autoChat(L2Npc npc, String text)
  985. {
  986. npc.broadcastPacket(new NpcSay(npc.getObjectId(), 0, npc.getId(), text));
  987. }
  988. private static void cast(L2Npc npc, L2Character target, int skillId, int level)
  989. {
  990. target.broadcastPacket(new MagicSkillUse(target, target, skillId, level, 6000, 1));
  991. target.broadcastPacket(new MagicSkillUse(npc, npc, skillId, level, 6000, 1));
  992. }
  993. private static void DeleteSpawn(QuestState st, L2Npc npc)
  994. {
  995. if (SPAWN_LIST.containsKey(npc))
  996. {
  997. SPAWN_LIST.remove(npc);
  998. npc.deleteMe();
  999. }
  1000. }
  1001. private static L2Npc FindSpawn(L2PcInstance player, L2Npc npc)
  1002. {
  1003. if (SPAWN_LIST.containsKey(npc) && (SPAWN_LIST.get(npc) == player.getObjectId()))
  1004. {
  1005. return npc;
  1006. }
  1007. return null;
  1008. }
  1009. }