Baium.java 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792
  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 ai.individual.Baium;
  20. import ai.npc.AbstractNpcAI;
  21. import com.l2jserver.Config;
  22. import com.l2jserver.gameserver.ai.CtrlIntention;
  23. import com.l2jserver.gameserver.enums.CategoryType;
  24. import com.l2jserver.gameserver.enums.MountType;
  25. import com.l2jserver.gameserver.instancemanager.GrandBossManager;
  26. import com.l2jserver.gameserver.instancemanager.ZoneManager;
  27. import com.l2jserver.gameserver.model.Location;
  28. import com.l2jserver.gameserver.model.StatsSet;
  29. import com.l2jserver.gameserver.model.actor.L2Attackable;
  30. import com.l2jserver.gameserver.model.actor.L2Character;
  31. import com.l2jserver.gameserver.model.actor.L2Npc;
  32. import com.l2jserver.gameserver.model.actor.L2Playable;
  33. import com.l2jserver.gameserver.model.actor.instance.L2GrandBossInstance;
  34. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  35. import com.l2jserver.gameserver.model.holders.SkillHolder;
  36. import com.l2jserver.gameserver.model.skills.Skill;
  37. import com.l2jserver.gameserver.model.variables.NpcVariables;
  38. import com.l2jserver.gameserver.model.zone.type.L2NoRestartZone;
  39. import com.l2jserver.gameserver.network.NpcStringId;
  40. import com.l2jserver.gameserver.network.clientpackets.Say2;
  41. import com.l2jserver.gameserver.network.serverpackets.Earthquake;
  42. import com.l2jserver.gameserver.network.serverpackets.ExShowScreenMessage;
  43. import com.l2jserver.gameserver.network.serverpackets.PlaySound;
  44. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  45. import com.l2jserver.gameserver.util.Util;
  46. /**
  47. * Baium AI.
  48. * @author St3eT
  49. */
  50. public final class Baium extends AbstractNpcAI
  51. {
  52. // NPCs
  53. private static final int BAIUM = 29020; // Baium
  54. private static final int BAIUM_STONE = 29025; // Baium
  55. private static final int ANG_VORTEX = 31862; // Angelic Vortex
  56. private static final int ARCHANGEL = 29021; // Archangel
  57. private static final int TELE_CUBE = 31842; // Teleportation Cubic
  58. // Skills
  59. private static final SkillHolder BAIUM_ATTACK = new SkillHolder(4127, 1); // Baium: General Attack
  60. private static final SkillHolder ENERGY_WAVE = new SkillHolder(4128, 1); // Wind Of Force
  61. private static final SkillHolder EARTH_QUAKE = new SkillHolder(4129, 1); // Earthquake
  62. private static final SkillHolder THUNDERBOLT = new SkillHolder(4130, 1); // Striking of Thunderbolt
  63. private static final SkillHolder GROUP_HOLD = new SkillHolder(4131, 1); // Stun
  64. private static final SkillHolder SPEAR_ATTACK = new SkillHolder(4132, 1); // Spear: Pound the Ground
  65. private static final SkillHolder ANGEL_HEAL = new SkillHolder(4133, 1); // Angel Heal
  66. private static final SkillHolder HEAL_OF_BAIUM = new SkillHolder(4135, 1); // Baium Heal
  67. private static final SkillHolder BAIUM_PRESENT = new SkillHolder(4136, 1); // Baium's Gift
  68. private static final SkillHolder ANTI_STRIDER = new SkillHolder(4258, 1); // Hinder Strider
  69. // Items
  70. private static final int FABRIC = 4295; // Blooded Fabric
  71. // Zone
  72. private static final L2NoRestartZone zone = ZoneManager.getInstance().getZoneById(70051, L2NoRestartZone.class); // Baium zone
  73. // Status
  74. private static final int ALIVE = 0;
  75. private static final int WAITING = 1;
  76. private static final int IN_FIGHT = 2;
  77. private static final int DEAD = 3;
  78. // Locations
  79. private static final Location BAIUM_GIFT_LOC = new Location(115910, 17337, 10105);
  80. private static final Location BAIUM_LOC = new Location(116033, 17447, 10107, -25348);
  81. private static final Location TELEPORT_CUBIC_LOC = new Location(115017, 15549, 10090);
  82. private static final Location TELEPORT_IN_LOC = new Location(114077, 15882, 10078);
  83. private static final Location[] TELEPORT_OUT_LOC =
  84. {
  85. new Location(108784, 16000, -4928),
  86. new Location(113824, 10448, -5164),
  87. new Location(115488, 22096, -5168),
  88. };
  89. private static final Location[] ARCHANGEL_LOC =
  90. {
  91. new Location(115792, 16608, 10136, 0),
  92. new Location(115168, 17200, 10136, 0),
  93. new Location(115780, 15564, 10136, 13620),
  94. new Location(114880, 16236, 10136, 5400),
  95. new Location(114239, 17168, 10136, -1992)
  96. };
  97. // Misc
  98. private L2GrandBossInstance _baium = null;
  99. private static long _lastAttack = 0;
  100. private static L2PcInstance _standbyPlayer = null;
  101. private Baium()
  102. {
  103. super(Baium.class.getSimpleName(), "ai/individual");
  104. addFirstTalkId(ANG_VORTEX);
  105. addTalkId(ANG_VORTEX, TELE_CUBE, BAIUM_STONE);
  106. addStartNpc(ANG_VORTEX, TELE_CUBE, BAIUM_STONE);
  107. addAttackId(BAIUM, ARCHANGEL);
  108. addKillId(BAIUM);
  109. addSeeCreatureId(BAIUM);
  110. addSpellFinishedId(BAIUM);
  111. final StatsSet info = GrandBossManager.getInstance().getStatsSet(BAIUM);
  112. final int curr_hp = info.getInt("currentHP");
  113. final int curr_mp = info.getInt("currentMP");
  114. final int loc_x = info.getInt("loc_x");
  115. final int loc_y = info.getInt("loc_y");
  116. final int loc_z = info.getInt("loc_z");
  117. final int heading = info.getInt("heading");
  118. final long respawnTime = info.getLong("respawn_time");
  119. switch (getStatus())
  120. {
  121. case WAITING:
  122. {
  123. setStatus(ALIVE);
  124. }
  125. case ALIVE:
  126. {
  127. addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
  128. break;
  129. }
  130. case IN_FIGHT:
  131. {
  132. _baium = (L2GrandBossInstance) addSpawn(BAIUM, loc_x, loc_y, loc_z, heading, false, 0);
  133. _baium.setCurrentHpMp(curr_hp, curr_mp);
  134. _lastAttack = System.currentTimeMillis();
  135. addBoss(_baium);
  136. for (Location loc : ARCHANGEL_LOC)
  137. {
  138. final L2Npc archangel = addSpawn(ARCHANGEL, loc, false, 0, true);
  139. startQuestTimer("SELECT_TARGET", 5000, archangel, null);
  140. }
  141. startQuestTimer("CHECK_ATTACK", 60000, _baium, null);
  142. break;
  143. }
  144. case DEAD:
  145. {
  146. final long remain = respawnTime - System.currentTimeMillis();
  147. if (remain > 0)
  148. {
  149. startQuestTimer("CLEAR_STATUS", remain, null, null);
  150. }
  151. else
  152. {
  153. notifyEvent("CLEAR_STATUS", null, null);
  154. }
  155. break;
  156. }
  157. }
  158. }
  159. @Override
  160. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  161. {
  162. switch (event)
  163. {
  164. case "31862-04.html":
  165. {
  166. return event;
  167. }
  168. case "enter":
  169. {
  170. String htmltext = null;
  171. if (getStatus() == DEAD)
  172. {
  173. htmltext = "31862-03.html";
  174. }
  175. else if (getStatus() == IN_FIGHT)
  176. {
  177. htmltext = "31862-02.html";
  178. }
  179. else if (!hasQuestItems(player, FABRIC))
  180. {
  181. htmltext = "31862-01.html";
  182. }
  183. else
  184. {
  185. takeItems(player, FABRIC, 1);
  186. player.teleToLocation(TELEPORT_IN_LOC);
  187. }
  188. return htmltext;
  189. }
  190. case "teleportOut":
  191. {
  192. final Location destination = TELEPORT_OUT_LOC[getRandom(TELEPORT_OUT_LOC.length)];
  193. player.teleToLocation(destination.getX() + getRandom(100), destination.getY() + getRandom(100), destination.getZ());
  194. break;
  195. }
  196. case "wakeUp":
  197. {
  198. if (getStatus() == ALIVE)
  199. {
  200. npc.deleteMe();
  201. setStatus(IN_FIGHT);
  202. _baium = (L2GrandBossInstance) addSpawn(BAIUM, BAIUM_LOC, false, 0);
  203. _baium.disableCoreAI(true);
  204. addBoss(_baium);
  205. _lastAttack = System.currentTimeMillis();
  206. startQuestTimer("WAKEUP_ACTION", 50, _baium, null);
  207. startQuestTimer("MANAGE_EARTHQUAKE", 2000, _baium, null);
  208. startQuestTimer("CHECK_ATTACK", 60000, _baium, null);
  209. }
  210. break;
  211. }
  212. case "WAKEUP_ACTION":
  213. {
  214. if (npc != null)
  215. {
  216. zone.broadcastPacket(new SocialAction(_baium.getObjectId(), 2));
  217. }
  218. break;
  219. }
  220. case "MANAGE_EARTHQUAKE":
  221. {
  222. if (npc != null)
  223. {
  224. zone.broadcastPacket(new Earthquake(npc.getX(), npc.getY(), npc.getZ(), 40, 10));
  225. zone.broadcastPacket(new PlaySound("BS02_A"));
  226. startQuestTimer("SOCIAL_ACTION", 8000, npc, player);
  227. }
  228. break;
  229. }
  230. case "SOCIAL_ACTION":
  231. {
  232. if (npc != null)
  233. {
  234. zone.broadcastPacket(new SocialAction(npc.getObjectId(), 3));
  235. startQuestTimer("PLAYER_PORT", 6000, npc, player);
  236. }
  237. break;
  238. }
  239. case "PLAYER_PORT":
  240. {
  241. if (npc != null)
  242. {
  243. if ((player != null) && player.isInsideRadius(npc, 16000, true, false))
  244. {
  245. player.teleToLocation(BAIUM_GIFT_LOC);
  246. startQuestTimer("PLAYER_KILL", 3000, npc, player);
  247. }
  248. else if ((_standbyPlayer != null) && _standbyPlayer.isInsideRadius(npc, 16000, true, false))
  249. {
  250. _standbyPlayer.teleToLocation(BAIUM_GIFT_LOC);
  251. startQuestTimer("PLAYER_KILL", 3000, npc, _standbyPlayer);
  252. }
  253. }
  254. break;
  255. }
  256. case "PLAYER_KILL":
  257. {
  258. if ((player != null) && player.isInsideRadius(npc, 16000, true, false))
  259. {
  260. zone.broadcastPacket(new SocialAction(npc.getObjectId(), 1));
  261. broadcastNpcSay(npc, Say2.NPC_ALL, player.getName() + ", How dare you wake me! Now you shall die!"); // TODO: replace with NpcStringId when are done core support
  262. npc.setTarget(player);
  263. npc.doCast(BAIUM_PRESENT.getSkill());
  264. }
  265. for (L2PcInstance players : zone.getPlayersInside())
  266. {
  267. if (players.isHero())
  268. {
  269. zone.broadcastPacket(new ExShowScreenMessage(NpcStringId.NOT_EVEN_THE_GODS_THEMSELVES_COULD_TOUCH_ME_BUT_YOU_S1_YOU_DARE_CHALLENGE_ME_IGNORANT_MORTAL, 2, 4000, players.getName()));
  270. break;
  271. }
  272. }
  273. startQuestTimer("SPAWN_ARCHANGEL", 8000, npc, null);
  274. break;
  275. }
  276. case "SPAWN_ARCHANGEL":
  277. {
  278. _baium.disableCoreAI(false);
  279. for (Location loc : ARCHANGEL_LOC)
  280. {
  281. final L2Npc archangel = addSpawn(ARCHANGEL, loc, false, 0, true);
  282. startQuestTimer("SELECT_TARGET", 5000, archangel, null);
  283. }
  284. if ((player != null) && !player.isDead())
  285. {
  286. attackPlayer((L2Attackable) npc, player);
  287. }
  288. else if ((_standbyPlayer != null) && !_standbyPlayer.isDead())
  289. {
  290. attackPlayer((L2Attackable) npc, _standbyPlayer);
  291. }
  292. else
  293. {
  294. for (L2Character characters : npc.getKnownList().getKnownCharactersInRadius(2000))
  295. {
  296. if ((characters != null) && characters.isPlayer() && zone.isInsideZone(characters) && !characters.isDead())
  297. {
  298. attackPlayer((L2Attackable) npc, (L2Playable) characters);
  299. break;
  300. }
  301. }
  302. }
  303. break;
  304. }
  305. case "SELECT_TARGET":
  306. {
  307. if (npc != null)
  308. {
  309. final L2Attackable mob = (L2Attackable) npc;
  310. final L2Character mostHated = mob.getMostHated();
  311. if ((_baium == null) || _baium.isDead())
  312. {
  313. mob.deleteMe();
  314. break;
  315. }
  316. if ((mostHated != null) && mostHated.isPlayer() && zone.isInsideZone(mostHated))
  317. {
  318. if (mob.getTarget() != mostHated)
  319. {
  320. mob.clearAggroList();
  321. }
  322. attackPlayer(mob, (L2Playable) mostHated);
  323. }
  324. else
  325. {
  326. boolean found = false;
  327. for (L2Character characters : mob.getKnownList().getKnownCharactersInRadius(1000))
  328. {
  329. if ((characters != null) && characters.isPlayable() && zone.isInsideZone(characters) && !characters.isDead())
  330. {
  331. if (mob.getTarget() != characters)
  332. {
  333. mob.clearAggroList();
  334. }
  335. attackPlayer(mob, (L2Playable) characters);
  336. found = true;
  337. break;
  338. }
  339. }
  340. if (!found)
  341. {
  342. if (mob.isInsideRadius(_baium, 40, true, false))
  343. {
  344. if (mob.getTarget() != _baium)
  345. {
  346. mob.clearAggroList();
  347. }
  348. mob.setIsRunning(true);
  349. mob.addDamageHate(_baium, 0, 999);
  350. mob.getAI().setIntention(CtrlIntention.AI_INTENTION_ATTACK, _baium);
  351. }
  352. else
  353. {
  354. mob.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, _baium);
  355. }
  356. }
  357. }
  358. startQuestTimer("SELECT_TARGET", 5000, npc, null);
  359. }
  360. break;
  361. }
  362. case "CHECK_ATTACK":
  363. {
  364. if ((npc != null) && ((_lastAttack + 1800000) < System.currentTimeMillis()))
  365. {
  366. notifyEvent("CLEAR_ZONE", null, null);
  367. addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
  368. setStatus(ALIVE);
  369. }
  370. else if (npc != null)
  371. {
  372. if (((_lastAttack + 300000) < System.currentTimeMillis()) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.75)))
  373. {
  374. npc.setTarget(npc);
  375. npc.doCast(HEAL_OF_BAIUM.getSkill());
  376. }
  377. startQuestTimer("CHECK_ATTACK", 60000, npc, null);
  378. }
  379. break;
  380. }
  381. case "CLEAR_STATUS":
  382. {
  383. setStatus(ALIVE);
  384. addSpawn(BAIUM_STONE, BAIUM_LOC, false, 0);
  385. break;
  386. }
  387. case "CLEAR_ZONE":
  388. {
  389. for (L2Character charInside : zone.getCharactersInside())
  390. {
  391. if (charInside != null)
  392. {
  393. if (charInside.isNpc())
  394. {
  395. charInside.deleteMe();
  396. }
  397. else if (charInside.isPlayer())
  398. {
  399. notifyEvent("teleportOut", null, (L2PcInstance) charInside);
  400. }
  401. }
  402. }
  403. break;
  404. }
  405. case "RESPAWN_BAIUM":
  406. {
  407. if (getStatus() == DEAD)
  408. {
  409. setRespawn(0);
  410. cancelQuestTimer("CLEAR_STATUS", null, null);
  411. notifyEvent("CLEAR_STATUS", null, null);
  412. }
  413. else
  414. {
  415. player.sendMessage(getClass().getSimpleName() + ": You cant respawn Baium while Baium is alive!");
  416. }
  417. break;
  418. }
  419. case "ABORT_FIGHT":
  420. {
  421. if (getStatus() == IN_FIGHT)
  422. {
  423. _baium = null;
  424. notifyEvent("CLEAR_ZONE", null, null);
  425. notifyEvent("CLEAR_STATUS", null, null);
  426. player.sendMessage(getClass().getSimpleName() + ": Aborting fight!");
  427. }
  428. else
  429. {
  430. player.sendMessage(getClass().getSimpleName() + ": You cant abort attack right now!");
  431. }
  432. cancelQuestTimers("CHECK_ATTACK");
  433. cancelQuestTimers("SELECT_TARGET");
  434. break;
  435. }
  436. case "DESPAWN_MINIONS":
  437. {
  438. if (getStatus() == IN_FIGHT)
  439. {
  440. for (L2Character charInside : zone.getCharactersInside())
  441. {
  442. if ((charInside != null) && charInside.isNpc() && (charInside.getId() == ARCHANGEL))
  443. {
  444. charInside.deleteMe();
  445. }
  446. }
  447. if (player != null)
  448. {
  449. player.sendMessage(getClass().getSimpleName() + ": All archangels has been deleted!");
  450. }
  451. }
  452. else if (player != null)
  453. {
  454. player.sendMessage(getClass().getSimpleName() + ": You cant despawn archangels right now!");
  455. }
  456. break;
  457. }
  458. case "MANAGE_SKILLS":
  459. {
  460. if (npc != null)
  461. {
  462. manageSkills(npc);
  463. }
  464. break;
  465. }
  466. }
  467. return super.onAdvEvent(event, npc, player);
  468. }
  469. @Override
  470. public String onAttack(L2Npc npc, L2PcInstance attacker, int damage, boolean isSummon, Skill skill)
  471. {
  472. _lastAttack = System.currentTimeMillis();
  473. if (npc.getId() == BAIUM)
  474. {
  475. if ((attacker.getMountType() == MountType.STRIDER) && !attacker.isAffectedBySkill(ANTI_STRIDER.getSkillId()))
  476. {
  477. if (!npc.isSkillDisabled(ANTI_STRIDER.getSkill()))
  478. {
  479. npc.setTarget(attacker);
  480. npc.doCast(ANTI_STRIDER.getSkill());
  481. }
  482. }
  483. if (skill == null)
  484. {
  485. refreshAiParams(attacker, npc, (damage * 1000));
  486. }
  487. else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
  488. {
  489. refreshAiParams(attacker, npc, ((damage / 3) * 100));
  490. }
  491. else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
  492. {
  493. refreshAiParams(attacker, npc, (damage * 20));
  494. }
  495. else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
  496. {
  497. refreshAiParams(attacker, npc, (damage * 10));
  498. }
  499. else
  500. {
  501. refreshAiParams(attacker, npc, ((damage / 3) * 20));
  502. }
  503. manageSkills(npc);
  504. }
  505. else
  506. {
  507. final L2Attackable mob = (L2Attackable) npc;
  508. final L2Character mostHated = mob.getMostHated();
  509. if ((getRandom(100) < 10) && mob.checkDoCastConditions(SPEAR_ATTACK.getSkill()))
  510. {
  511. if ((mostHated != null) && (npc.calculateDistance(mostHated, true, false) < 1000) && zone.isCharacterInZone(mostHated))
  512. {
  513. mob.setTarget(mostHated);
  514. mob.doCast(SPEAR_ATTACK.getSkill());
  515. }
  516. else if (zone.isCharacterInZone(attacker))
  517. {
  518. mob.setTarget(attacker);
  519. mob.doCast(SPEAR_ATTACK.getSkill());
  520. }
  521. }
  522. if ((getRandom(100) < 5) && (npc.getCurrentHp() < (npc.getMaxHp() * 0.5)) && mob.checkDoCastConditions(ANGEL_HEAL.getSkill()))
  523. {
  524. npc.setTarget(npc);
  525. npc.doCast(ANGEL_HEAL.getSkill());
  526. }
  527. }
  528. return super.onAttack(npc, attacker, damage, isSummon, skill);
  529. }
  530. @Override
  531. public String onKill(L2Npc npc, L2PcInstance killer, boolean isSummon)
  532. {
  533. if (zone.isCharacterInZone(killer))
  534. {
  535. setStatus(DEAD);
  536. addSpawn(TELE_CUBE, TELEPORT_CUBIC_LOC, false, 900000);
  537. zone.broadcastPacket(new PlaySound("BS01_D"));
  538. long respawnTime = (Config.BAIUM_SPAWN_INTERVAL + getRandom(-Config.BAIUM_SPAWN_RANDOM, Config.BAIUM_SPAWN_RANDOM)) * 3600000;
  539. setRespawn(respawnTime);
  540. startQuestTimer("CLEAR_STATUS", respawnTime, null, null);
  541. startQuestTimer("CLEAR_ZONE", 900000, null, null);
  542. cancelQuestTimer("CHECK_ATTACK", npc, null);
  543. }
  544. return super.onKill(npc, killer, isSummon);
  545. }
  546. @Override
  547. public String onSeeCreature(L2Npc npc, L2Character creature, boolean isSummon)
  548. {
  549. if (!zone.isInsideZone(creature) || (creature.isNpc() && (creature.getId() == BAIUM_STONE)))
  550. {
  551. return super.onSeeCreature(npc, creature, isSummon);
  552. }
  553. if (creature.isPlayer() && !creature.isDead() && (_standbyPlayer == null))
  554. {
  555. _standbyPlayer = (L2PcInstance) creature;
  556. }
  557. if (creature.isInCategory(CategoryType.CLERIC_GROUP))
  558. {
  559. if (npc.getCurrentHp() < (npc.getMaxHp() * 0.25))
  560. {
  561. refreshAiParams(creature, npc, 10000);
  562. }
  563. else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.5))
  564. {
  565. refreshAiParams(creature, npc, 10000, 6000);
  566. }
  567. else if (npc.getCurrentHp() < (npc.getMaxHp() * 0.75))
  568. {
  569. refreshAiParams(creature, npc, 10000, 3000);
  570. }
  571. else
  572. {
  573. refreshAiParams(creature, npc, 10000, 2000);
  574. }
  575. }
  576. else
  577. {
  578. refreshAiParams(creature, npc, 10000, 1000);
  579. }
  580. manageSkills(npc);
  581. return super.onSeeCreature(npc, creature, isSummon);
  582. }
  583. @Override
  584. public String onSpellFinished(L2Npc npc, L2PcInstance player, Skill skill)
  585. {
  586. startQuestTimer("MANAGE_SKILLS", 1000, npc, null);
  587. if (!zone.isCharacterInZone(npc) && (_baium != null))
  588. {
  589. _baium.teleToLocation(BAIUM_LOC);
  590. }
  591. return super.onSpellFinished(npc, player, skill);
  592. }
  593. @Override
  594. public boolean unload(boolean removeFromList)
  595. {
  596. if (_baium != null)
  597. {
  598. _baium.deleteMe();
  599. }
  600. return super.unload(removeFromList);
  601. }
  602. private final void refreshAiParams(L2Character attacker, L2Npc npc, int damage)
  603. {
  604. refreshAiParams(attacker, npc, damage, damage);
  605. }
  606. private final void refreshAiParams(L2Character attacker, L2Npc npc, int damage, int aggro)
  607. {
  608. final int newAggroVal = damage + getRandom(3000);
  609. final int aggroVal = aggro + 1000;
  610. final NpcVariables vars = npc.getVariables();
  611. for (int i = 0; i < 3; i++)
  612. {
  613. if (attacker == vars.getObject("c_quest" + i, L2Character.class))
  614. {
  615. if (vars.getInt("i_quest" + i) < aggroVal)
  616. {
  617. vars.set("i_quest" + i, newAggroVal);
  618. }
  619. return;
  620. }
  621. }
  622. final int index = Util.getIndexOfMinValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
  623. vars.set("i_quest" + index, newAggroVal);
  624. vars.set("c_quest" + index, attacker);
  625. }
  626. private int getStatus()
  627. {
  628. return GrandBossManager.getInstance().getBossStatus(BAIUM);
  629. }
  630. private void addBoss(L2GrandBossInstance grandboss)
  631. {
  632. GrandBossManager.getInstance().addBoss(grandboss);
  633. }
  634. private void setStatus(int status)
  635. {
  636. GrandBossManager.getInstance().setBossStatus(BAIUM, status);
  637. }
  638. private void setRespawn(long respawnTime)
  639. {
  640. GrandBossManager.getInstance().getStatsSet(BAIUM).set("respawn_time", (System.currentTimeMillis() + respawnTime));
  641. }
  642. private void manageSkills(L2Npc npc)
  643. {
  644. if (npc.isCastingNow() || npc.isCoreAIDisabled() || !npc.isInCombat())
  645. {
  646. return;
  647. }
  648. final NpcVariables vars = npc.getVariables();
  649. for (int i = 0; i < 3; i++)
  650. {
  651. final L2Character attacker = vars.getObject("c_quest" + i, L2Character.class);
  652. if ((attacker == null) || ((npc.calculateDistance(attacker, true, false) > 9000) || attacker.isDead()))
  653. {
  654. vars.set("i_quest" + i, 0);
  655. }
  656. }
  657. final int index = Util.getIndexOfMaxValue(vars.getInt("i_quest0"), vars.getInt("i_quest1"), vars.getInt("i_quest2"));
  658. final L2Character player = vars.getObject("c_quest" + index, L2Character.class);
  659. final int i2 = vars.getInt("i_quest" + index);
  660. if ((i2 > 0) && (getRandom(100) < 70))
  661. {
  662. vars.set("i_quest" + index, 500);
  663. }
  664. SkillHolder skillToCast = null;
  665. if ((player != null) && !player.isDead())
  666. {
  667. if (npc.getCurrentHp() > (npc.getMaxHp() * 0.75))
  668. {
  669. if (getRandom(100) < 10)
  670. {
  671. skillToCast = ENERGY_WAVE;
  672. }
  673. else if (getRandom(100) < 10)
  674. {
  675. skillToCast = EARTH_QUAKE;
  676. }
  677. else
  678. {
  679. skillToCast = BAIUM_ATTACK;
  680. }
  681. }
  682. else if (npc.getCurrentHp() > (npc.getMaxHp() * 0.5))
  683. {
  684. if (getRandom(100) < 10)
  685. {
  686. skillToCast = GROUP_HOLD;
  687. }
  688. else if (getRandom(100) < 10)
  689. {
  690. skillToCast = ENERGY_WAVE;
  691. }
  692. else if (getRandom(100) < 10)
  693. {
  694. skillToCast = EARTH_QUAKE;
  695. }
  696. else
  697. {
  698. skillToCast = BAIUM_ATTACK;
  699. }
  700. }
  701. else if (npc.getCurrentHp() > (npc.getMaxHp() * 0.25))
  702. {
  703. if (getRandom(100) < 10)
  704. {
  705. skillToCast = THUNDERBOLT;
  706. }
  707. else if (getRandom(100) < 10)
  708. {
  709. skillToCast = GROUP_HOLD;
  710. }
  711. else if (getRandom(100) < 10)
  712. {
  713. skillToCast = ENERGY_WAVE;
  714. }
  715. else if (getRandom(100) < 10)
  716. {
  717. skillToCast = EARTH_QUAKE;
  718. }
  719. else
  720. {
  721. skillToCast = BAIUM_ATTACK;
  722. }
  723. }
  724. else if (getRandom(100) < 10)
  725. {
  726. skillToCast = THUNDERBOLT;
  727. }
  728. else if (getRandom(100) < 10)
  729. {
  730. skillToCast = GROUP_HOLD;
  731. }
  732. else if (getRandom(100) < 10)
  733. {
  734. skillToCast = ENERGY_WAVE;
  735. }
  736. else if (getRandom(100) < 10)
  737. {
  738. skillToCast = EARTH_QUAKE;
  739. }
  740. else
  741. {
  742. skillToCast = BAIUM_ATTACK;
  743. }
  744. }
  745. if ((skillToCast != null) && npc.checkDoCastConditions(skillToCast.getSkill()))
  746. {
  747. npc.setTarget(player);
  748. npc.doCast(skillToCast.getSkill());
  749. }
  750. }
  751. public static void main(String[] args)
  752. {
  753. new Baium();
  754. }
  755. }