Q00501_ProofOfClanAlliance.java 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  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.Q00501_ProofOfClanAlliance;
  20. import java.util.ArrayList;
  21. import java.util.Arrays;
  22. import java.util.List;
  23. import com.l2jserver.gameserver.model.L2Clan;
  24. import com.l2jserver.gameserver.model.Location;
  25. import com.l2jserver.gameserver.model.actor.L2Character;
  26. import com.l2jserver.gameserver.model.actor.L2Npc;
  27. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  28. import com.l2jserver.gameserver.model.holders.SkillHolder;
  29. import com.l2jserver.gameserver.model.itemcontainer.Inventory;
  30. import com.l2jserver.gameserver.model.quest.Quest;
  31. import com.l2jserver.gameserver.model.quest.QuestState;
  32. import com.l2jserver.gameserver.model.quest.State;
  33. import com.l2jserver.gameserver.model.skills.AbnormalType;
  34. import com.l2jserver.gameserver.network.NpcStringId;
  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. * Proof of Clan Alliance (501)
  40. * @author Zoey76
  41. */
  42. public final class Q00501_ProofOfClanAlliance extends Quest
  43. {
  44. // NPCs
  45. private static final int SIR_KRISTOF_RODEMAI = 30756;
  46. private static final int STATUE_OF_OFFERING = 30757;
  47. private static final int ATHREA = 30758;
  48. private static final int KALIS = 30759;
  49. // Monsters
  50. private static final int OEL_MAHUM_WITCH_DOCTOR = 20576;
  51. private static final int HARIT_LIZARDMAN_SHAMAN = 20644;
  52. private static final int VANOR_SILENOS_SHAMAN = 20685;
  53. private static final int BOX_OF_ATHREA_1 = 27173;
  54. private static final int BOX_OF_ATHREA_2 = 27174;
  55. private static final int BOX_OF_ATHREA_3 = 27175;
  56. private static final int BOX_OF_ATHREA_4 = 27176;
  57. private static final int BOX_OF_ATHREA_5 = 27177;
  58. // Items
  59. private static final int HERB_OF_HARIT = 3832;
  60. private static final int HERB_OF_VANOR = 3833;
  61. private static final int HERB_OF_OEL_MAHUM = 3834;
  62. private static final int BLOOD_OF_EVA = 3835;
  63. private static final int ATHREAS_COIN = 3836;
  64. private static final int SYMBOL_OF_LOYALTY = 3837;
  65. private static final int ANTIDOTE_RECIPE_LIST = 3872;
  66. private static final int VOUCHER_OF_FAITH = 3873;
  67. private static final int ALLIANCE_MANIFESTO = 3874;
  68. private static final int POTION_OF_RECOVERY = 3889;
  69. // Skills
  70. private static final SkillHolder POISON_OF_DEATH = new SkillHolder(4082, 1);
  71. private static final SkillHolder DIE_YOU_FOOL = new SkillHolder(4083, 1);
  72. // Locations
  73. // @formatter:off
  74. private static final List<Location> LOCS = Arrays.asList(
  75. new Location(102273, 103433, -3512),
  76. new Location(102190, 103379, -3524),
  77. new Location(102107, 103325, -3533),
  78. new Location(102024, 103271, -3500),
  79. new Location(102327, 103350, -3511),
  80. new Location(102244, 103296, -3518),
  81. new Location(102161, 103242, -3529),
  82. new Location(102078, 103188, -3500),
  83. new Location(102381, 103267, -3538),
  84. new Location(102298, 103213, -3532),
  85. new Location(102215, 103159, -3520),
  86. new Location(102132, 103105, -3513),
  87. new Location(102435, 103184, -3515),
  88. new Location(102352, 103130, -3522),
  89. new Location(102269, 103076, -3533),
  90. new Location(102186, 103022, -3541));
  91. // @formatter:on
  92. // Misc
  93. private static final int CLAN_MIN_LEVEL = 3;
  94. private static final int CLAN_MEMBER_MIN_LEVEL = 40;
  95. private static final int ADENA_TO_RESTART_GAME = 10000;
  96. public Q00501_ProofOfClanAlliance()
  97. {
  98. super(501, Q00501_ProofOfClanAlliance.class.getSimpleName(), "Proof of Clan Alliance");
  99. addStartNpc(SIR_KRISTOF_RODEMAI, STATUE_OF_OFFERING);
  100. addTalkId(SIR_KRISTOF_RODEMAI, STATUE_OF_OFFERING, ATHREA, KALIS);
  101. addKillId(OEL_MAHUM_WITCH_DOCTOR, HARIT_LIZARDMAN_SHAMAN, VANOR_SILENOS_SHAMAN, BOX_OF_ATHREA_1, BOX_OF_ATHREA_2, BOX_OF_ATHREA_3, BOX_OF_ATHREA_4, BOX_OF_ATHREA_5);
  102. registerQuestItems(ANTIDOTE_RECIPE_LIST, VOUCHER_OF_FAITH, HERB_OF_HARIT, HERB_OF_VANOR, HERB_OF_OEL_MAHUM, BLOOD_OF_EVA, ATHREAS_COIN, SYMBOL_OF_LOYALTY);
  103. }
  104. @Override
  105. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  106. {
  107. final QuestState qs = getQuestState(player, false);
  108. if (qs == null)
  109. {
  110. return null;
  111. }
  112. String htmltext = null;
  113. switch (event)
  114. {
  115. case "30756-06.html":
  116. case "30756-08.html":
  117. case "30757-05.html":
  118. case "30758-02.html":
  119. case "30758-04.html":
  120. case "30759-02.html":
  121. case "30759-04.html":
  122. {
  123. htmltext = event;
  124. break;
  125. }
  126. case "30756-07.html":
  127. {
  128. if (qs.isCreated() && player.isClanLeader() && (player.getClan().getLevel() == CLAN_MIN_LEVEL))
  129. {
  130. qs.startQuest();
  131. qs.setMemoState(1);
  132. htmltext = event;
  133. }
  134. break;
  135. }
  136. case "30757-04.html":
  137. {
  138. if (getRandom(10) > 5)
  139. {
  140. if (qs.getInt("flag") != 2501)
  141. {
  142. giveItems(player, SYMBOL_OF_LOYALTY, 1);
  143. qs.set("flag", 2501);
  144. }
  145. htmltext = event;
  146. }
  147. else
  148. {
  149. npc.setTarget(player);
  150. npc.doCast(DIE_YOU_FOOL.getSkill());
  151. startQuestTimer("SYMBOL_OF_LOYALTY", 4000, npc, player);
  152. htmltext = "30757-03.html";
  153. }
  154. break;
  155. }
  156. case "30758-03.html":
  157. {
  158. final QuestState lqs = getLeaderQuestState(player, getName());
  159. if (lqs != null)
  160. {
  161. if (npc.getSummonedNpcCount() < 4)
  162. {
  163. lqs.setMemoState(4);
  164. lqs.set("flag", 0);
  165. npc.setScriptValue(0);
  166. for (Location loc : LOCS)
  167. {
  168. final L2Npc box = addSpawn(npc, getRandom(BOX_OF_ATHREA_1, BOX_OF_ATHREA_5), loc, false, 300000);
  169. box.disableCoreAI(true);
  170. box.setIsNoRndWalk(true);
  171. }
  172. htmltext = event;
  173. }
  174. else
  175. {
  176. htmltext = "30758-03a.html";
  177. }
  178. }
  179. break;
  180. }
  181. case "30758-07.html":
  182. {
  183. if (player.getAdena() >= ADENA_TO_RESTART_GAME)
  184. {
  185. if (npc.getSummonedNpcCount() < 4)
  186. {
  187. takeItems(player, Inventory.ADENA_ID, ADENA_TO_RESTART_GAME);
  188. }
  189. htmltext = event;
  190. }
  191. else
  192. {
  193. htmltext = "30758-06.html";
  194. }
  195. break;
  196. }
  197. case "30759-03.html":
  198. {
  199. if (qs.isMemoState(1))
  200. {
  201. qs.setCond(2, true);
  202. qs.setMemoState(2);
  203. htmltext = event;
  204. }
  205. break;
  206. }
  207. case "30759-07.html":
  208. {
  209. if (qs.isMemoState(2) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3))
  210. {
  211. takeItems(player, SYMBOL_OF_LOYALTY, -1);
  212. giveItems(player, ANTIDOTE_RECIPE_LIST, 1);
  213. npc.setTarget(player);
  214. npc.doCast(POISON_OF_DEATH.getSkill());
  215. qs.setCond(3, true);
  216. qs.setMemoState(3);
  217. htmltext = event;
  218. }
  219. break;
  220. }
  221. case "SYMBOL_OF_LOYALTY":
  222. {
  223. if (player.isDead() && (qs.getInt("flag") != 2501))
  224. {
  225. giveItems(player, SYMBOL_OF_LOYALTY, 1);
  226. qs.set("flag", 2501);
  227. }
  228. break;
  229. }
  230. }
  231. return htmltext;
  232. }
  233. @Override
  234. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  235. {
  236. final QuestState qs = getRandomPartyMemberState(killer, -1, 3, npc);
  237. if (qs == null)
  238. {
  239. return super.onKill(npc, killer, isSummon);
  240. }
  241. final L2PcInstance player = qs.getPlayer();
  242. final QuestState lqs = getLeaderQuestState(player, getName());
  243. if (lqs != null)
  244. {
  245. switch (npc.getId())
  246. {
  247. case OEL_MAHUM_WITCH_DOCTOR:
  248. {
  249. if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
  250. {
  251. giveItemRandomly(player, npc, HERB_OF_OEL_MAHUM, 1, 0, 1.0, true);
  252. }
  253. break;
  254. }
  255. case HARIT_LIZARDMAN_SHAMAN:
  256. {
  257. if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
  258. {
  259. giveItemRandomly(player, npc, HERB_OF_HARIT, 1, 0, 1.0, true);
  260. }
  261. break;
  262. }
  263. case VANOR_SILENOS_SHAMAN:
  264. {
  265. if ((getRandom(10) == 1) && (lqs.getMemoState() >= 3) && (lqs.getMemoState() < 6))
  266. {
  267. giveItemRandomly(player, npc, HERB_OF_VANOR, 1, 0, 1.0, true);
  268. }
  269. break;
  270. }
  271. case BOX_OF_ATHREA_1:
  272. case BOX_OF_ATHREA_2:
  273. case BOX_OF_ATHREA_3:
  274. case BOX_OF_ATHREA_4:
  275. case BOX_OF_ATHREA_5:
  276. {
  277. final L2Character summoner = npc.getSummoner();
  278. if ((summoner != null) && summoner.isNpc() && lqs.isMemoState(4))
  279. {
  280. final L2Npc arthea = (L2Npc) summoner;
  281. if ((lqs.getInt("flag") == 3) && arthea.isScriptValue(15))
  282. {
  283. lqs.set("flag", lqs.getInt("flag") + 1);
  284. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
  285. }
  286. else if ((lqs.getInt("flag") == 2) && arthea.isScriptValue(14))
  287. {
  288. lqs.set("flag", lqs.getInt("flag") + 1);
  289. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
  290. }
  291. else if ((lqs.getInt("flag") == 1) && arthea.isScriptValue(13))
  292. {
  293. lqs.set("flag", lqs.getInt("flag") + 1);
  294. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
  295. }
  296. else if ((lqs.getInt("flag") == 0) && arthea.isScriptValue(12))
  297. {
  298. lqs.set("flag", lqs.getInt("flag") + 1);
  299. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
  300. }
  301. else if (lqs.getInt("flag") < 4)
  302. {
  303. if (getRandom(4) == 0)
  304. {
  305. lqs.set("flag", lqs.getInt("flag") + 1);
  306. npc.broadcastPacket(new NpcSay(npc, Say2.NPC_ALL, NpcStringId.BINGO));
  307. }
  308. }
  309. arthea.setScriptValue(arthea.getScriptValue() + 1);
  310. }
  311. break;
  312. }
  313. }
  314. }
  315. return super.onKill(npc, killer, isSummon);
  316. }
  317. @Override
  318. public String onTalk(L2Npc npc, L2PcInstance player)
  319. {
  320. final QuestState qs = getQuestState(player, true);
  321. final QuestState lqs = getLeaderQuestState(player, getName());
  322. String htmltext = getNoQuestMsg(player);
  323. switch (npc.getId())
  324. {
  325. case SIR_KRISTOF_RODEMAI:
  326. {
  327. switch (qs.getState())
  328. {
  329. case State.CREATED:
  330. {
  331. if (player.isClanLeader())
  332. {
  333. final L2Clan clan = player.getClan();
  334. if (clan.getLevel() < CLAN_MIN_LEVEL)
  335. {
  336. htmltext = "30756-01.html";
  337. }
  338. else if (clan.getLevel() == CLAN_MIN_LEVEL)
  339. {
  340. if (hasQuestItems(player, ALLIANCE_MANIFESTO))
  341. {
  342. htmltext = "30756-03.html";
  343. }
  344. else
  345. {
  346. htmltext = "30756-04.html";
  347. }
  348. }
  349. else
  350. {
  351. htmltext = "30756-02.html";
  352. }
  353. }
  354. else
  355. {
  356. htmltext = "30756-05.html";
  357. }
  358. break;
  359. }
  360. case State.STARTED:
  361. {
  362. if (qs.isMemoState(6) && hasQuestItems(player, VOUCHER_OF_FAITH))
  363. {
  364. takeItems(player, VOUCHER_OF_FAITH, -1);
  365. giveItems(player, ALLIANCE_MANIFESTO, 1);
  366. addExpAndSp(player, 0, 120000);
  367. qs.exitQuest(false);
  368. htmltext = "30756-09.html";
  369. }
  370. else
  371. {
  372. htmltext = "30756-10.html";
  373. }
  374. break;
  375. }
  376. }
  377. break;
  378. }
  379. case STATUE_OF_OFFERING:
  380. {
  381. if ((lqs != null) && lqs.isMemoState(2))
  382. {
  383. if (!player.isClanLeader())
  384. {
  385. if (player.getLevel() >= CLAN_MEMBER_MIN_LEVEL)
  386. {
  387. htmltext = (qs.getInt("flag") != 2501) ? "30757-01.html" : "30757-01b.html";
  388. }
  389. else
  390. {
  391. htmltext = "30757-02.html";
  392. }
  393. }
  394. else
  395. {
  396. htmltext = "30757-01a.html";
  397. }
  398. }
  399. else
  400. {
  401. htmltext = "30757-06.html";
  402. }
  403. break;
  404. }
  405. case ATHREA:
  406. {
  407. if (lqs != null)
  408. {
  409. switch (lqs.getMemoState())
  410. {
  411. case 3:
  412. {
  413. if (hasQuestItems(lqs.getPlayer(), ANTIDOTE_RECIPE_LIST) && !hasQuestItems(lqs.getPlayer(), BLOOD_OF_EVA))
  414. {
  415. lqs.set("flag", 0);
  416. htmltext = "30758-01.html";
  417. }
  418. break;
  419. }
  420. case 4:
  421. {
  422. if (lqs.getInt("flag") < 4)
  423. {
  424. htmltext = "30758-05.html";
  425. }
  426. else
  427. {
  428. giveItems(player, BLOOD_OF_EVA, 1);
  429. lqs.setMemoState(5);
  430. htmltext = "30758-08.html";
  431. }
  432. break;
  433. }
  434. case 5:
  435. {
  436. htmltext = "30758-09.html";
  437. break;
  438. }
  439. }
  440. }
  441. break;
  442. }
  443. case KALIS:
  444. {
  445. if (qs.isMemoState(1) && !hasQuestItems(player, SYMBOL_OF_LOYALTY))
  446. {
  447. htmltext = "30759-01.html";
  448. }
  449. else if (qs.isMemoState(2) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) < 3))
  450. {
  451. htmltext = "30759-05.html";
  452. }
  453. else if ((getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3) && !hasAbnormal(player))
  454. {
  455. htmltext = "30759-06.html";
  456. }
  457. else if (qs.isMemoState(5) && hasQuestItems(player, BLOOD_OF_EVA) && hasQuestItems(player, HERB_OF_VANOR) && hasQuestItems(player, HERB_OF_HARIT) && hasQuestItems(player, HERB_OF_OEL_MAHUM) && hasAbnormal(player))
  458. {
  459. giveItems(player, VOUCHER_OF_FAITH, 1);
  460. giveItems(player, POTION_OF_RECOVERY, 1);
  461. takeItems(player, BLOOD_OF_EVA, -1);
  462. takeItems(player, ANTIDOTE_RECIPE_LIST, -1);
  463. takeItems(player, HERB_OF_OEL_MAHUM, -1);
  464. takeItems(player, HERB_OF_HARIT, -1);
  465. takeItems(player, HERB_OF_VANOR, -1);
  466. qs.setCond(4, true);
  467. qs.setMemoState(6);
  468. htmltext = "30759-08.html";
  469. }
  470. else if ((qs.isMemoState(3) || qs.isMemoState(4) || qs.isMemoState(5)) && !hasAbnormal(player))
  471. {
  472. takeItems(player, ANTIDOTE_RECIPE_LIST, -1);
  473. qs.setMemoState(1);
  474. htmltext = "30759-09.html";
  475. }
  476. else if ((qs.getMemoState() < 6) && (getQuestItemsCount(player, SYMBOL_OF_LOYALTY) >= 3) && !hasAtLeastOneQuestItem(player, BLOOD_OF_EVA, HERB_OF_VANOR, HERB_OF_HARIT, HERB_OF_OEL_MAHUM) && hasAbnormal(player))
  477. {
  478. htmltext = "30759-10.html";
  479. }
  480. else if (qs.isMemoState(6))
  481. {
  482. htmltext = "30759-11.html";
  483. }
  484. else if ((lqs != null) && !player.isClanLeader())
  485. {
  486. htmltext = "30759-12.html";
  487. }
  488. break;
  489. }
  490. }
  491. return htmltext;
  492. }
  493. /**
  494. * Verifies if the player has the poison.
  495. * @param player the player to check
  496. * @return {@code true} if the player has {@link AbnormalType#FATAL_POISON} abnormal
  497. */
  498. private static boolean hasAbnormal(L2PcInstance player)
  499. {
  500. return player.getEffectList().getBuffInfoByAbnormalType(AbnormalType.FATAL_POISON) != null;
  501. }
  502. /**
  503. * Gets the clan leader's quest state.
  504. * @param player the player
  505. * @param quest the quest name
  506. * @return the clan leader's quest state
  507. */
  508. private static QuestState getLeaderQuestState(L2PcInstance player, String quest)
  509. {
  510. if (player.getClan() != null)
  511. {
  512. final L2PcInstance leader = player.getClan().getLeader().getPlayerInstance();
  513. if (leader != null)
  514. {
  515. return leader.getQuestState(quest);
  516. }
  517. }
  518. return null;
  519. }
  520. @Override
  521. public QuestState getRandomPartyMemberState(L2PcInstance player, int condition, int playerChance, L2Npc target)
  522. {
  523. if ((player == null) || (playerChance < 1))
  524. {
  525. return null;
  526. }
  527. QuestState qs = getQuestState(player, false);
  528. if (!player.isInParty())
  529. {
  530. if (!Util.checkIfInRange(1500, player, target, true))
  531. {
  532. return null;
  533. }
  534. return qs;
  535. }
  536. final List<QuestState> candidates = new ArrayList<>();
  537. if ((qs != null) && (playerChance > 0))
  538. {
  539. for (int i = 0; i < playerChance; i++)
  540. {
  541. candidates.add(qs);
  542. }
  543. }
  544. for (L2PcInstance member : player.getParty().getMembers())
  545. {
  546. if (member == player)
  547. {
  548. continue;
  549. }
  550. qs = getQuestState(member, false);
  551. if (qs != null)
  552. {
  553. candidates.add(qs);
  554. }
  555. }
  556. if (candidates.isEmpty())
  557. {
  558. return null;
  559. }
  560. qs = candidates.get(getRandom(candidates.size()));
  561. if (!Util.checkIfInRange(1500, qs.getPlayer(), target, true))
  562. {
  563. return null;
  564. }
  565. return qs;
  566. }
  567. }