SagasSuperClass.java 28 KB

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