Beleth.java 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. /*
  2. * This program is free software: you can redistribute it and/or modify it under
  3. * the terms of the GNU General Public License as published by the Free Software
  4. * Foundation, either version 3 of the License, or (at your option) any later
  5. * version.
  6. *
  7. * This program is distributed in the hope that it will be useful, but WITHOUT
  8. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  10. * details.
  11. *
  12. * You should have received a copy of the GNU General Public License along with
  13. * this program. If not, see <http://www.gnu.org/licenses/>.
  14. */
  15. package ai.individual;
  16. import java.util.ArrayList;
  17. import java.util.concurrent.ScheduledFuture;
  18. import ai.group_template.L2AttackableAIScript;
  19. import com.l2jserver.Config;
  20. import com.l2jserver.gameserver.ThreadPoolManager;
  21. import com.l2jserver.gameserver.ai.CtrlIntention;
  22. import com.l2jserver.gameserver.datatables.DoorTable;
  23. import com.l2jserver.gameserver.datatables.NpcTable;
  24. import com.l2jserver.gameserver.datatables.SkillTable;
  25. import com.l2jserver.gameserver.instancemanager.GrandBossManager;
  26. import com.l2jserver.gameserver.instancemanager.ZoneManager;
  27. import com.l2jserver.gameserver.model.L2Object;
  28. import com.l2jserver.gameserver.model.L2Skill;
  29. import com.l2jserver.gameserver.model.L2Spawn;
  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.L2DoorInstance;
  34. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  35. import com.l2jserver.gameserver.model.zone.L2ZoneType;
  36. import com.l2jserver.gameserver.network.serverpackets.CreatureSay;
  37. import com.l2jserver.gameserver.network.serverpackets.DoorStatusUpdate;
  38. import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse;
  39. import com.l2jserver.gameserver.network.serverpackets.SocialAction;
  40. import com.l2jserver.gameserver.network.serverpackets.SpecialCamera;
  41. import com.l2jserver.gameserver.network.serverpackets.StaticObject;
  42. import com.l2jserver.gameserver.templates.StatsSet;
  43. import com.l2jserver.gameserver.templates.chars.L2NpcTemplate;
  44. import com.l2jserver.gameserver.templates.skills.L2SkillType;
  45. import com.l2jserver.gameserver.util.Util;
  46. import com.l2jserver.util.Rnd;
  47. /**
  48. * Beleth's AI.
  49. * @author Treat
  50. */
  51. public class Beleth extends L2AttackableAIScript
  52. {
  53. private static L2Npc camera;
  54. private static L2Npc camera2;
  55. private static L2Npc camera3;
  56. private static L2Npc camera4;
  57. private static L2Npc beleth;
  58. private static L2Npc priest;
  59. private static L2ZoneType _zone = null;
  60. private static L2PcInstance belethKiller;
  61. private static boolean debug = false;
  62. private static boolean movie = false;
  63. private static boolean attacked = false;
  64. private static int allowObjectId = 0;
  65. private static int killed = 0;
  66. private static ScheduledFuture<?> spawnTimer = null;
  67. private static ArrayList<L2Npc> minions = new ArrayList<L2Npc>();
  68. private static L2Skill Bleed = SkillTable.getInstance().getInfo(5495, 1);
  69. private static L2Skill Fireball = SkillTable.getInstance().getInfo(5496, 1);
  70. private static L2Skill HornOfRising = SkillTable.getInstance().getInfo(5497, 1);
  71. private static L2Skill Lightening = SkillTable.getInstance().getInfo(5499, 1);
  72. public Beleth(int id, String name, String descr)
  73. {
  74. super(id, name, descr);
  75. _zone = ZoneManager.getInstance().getZoneById(12018);
  76. addEnterZoneId(12018);
  77. registerMobs(new int[]
  78. {
  79. 29118, 29119
  80. });
  81. addStartNpc(32470);
  82. addTalkId(32470);
  83. addFirstTalkId(29128);
  84. StatsSet info = GrandBossManager.getInstance().getStatsSet(29118);
  85. int status = GrandBossManager.getInstance().getBossStatus(29118);
  86. if (status == 3)
  87. {
  88. long temp = (info.getLong("respawn_time") - System.currentTimeMillis());
  89. if (temp > 0)
  90. {
  91. ThreadPoolManager.getInstance().scheduleGeneral(new unlock(), temp);
  92. }
  93. else
  94. {
  95. GrandBossManager.getInstance().setBossStatus(29118, 0);
  96. }
  97. }
  98. else
  99. {
  100. GrandBossManager.getInstance().setBossStatus(29118, 0);
  101. }
  102. DoorTable.getInstance().getDoor(20240001).openMe();
  103. }
  104. private static L2Npc spawn(int npcId, int[] loc, int instanceId)
  105. {
  106. try
  107. {
  108. L2NpcTemplate template = NpcTable.getInstance().getTemplate(npcId);
  109. if (template != null)
  110. {
  111. L2Spawn spawn = new L2Spawn(template);
  112. spawn.setInstanceId(instanceId);
  113. spawn.setHeading(loc[3]);
  114. spawn.setLocx(loc[0]);
  115. spawn.setLocy(loc[1]);
  116. spawn.setLocz(loc[2] + 20);
  117. spawn.setAmount(spawn.getAmount() + 1);
  118. return spawn.doSpawn();
  119. }
  120. }
  121. catch (Exception ignored)
  122. {
  123. }
  124. return null;
  125. }
  126. public static void startSpawnTask()
  127. {
  128. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(1), debug ? 10000 : 300000);
  129. }
  130. private static class unlock implements Runnable
  131. {
  132. @Override
  133. public void run()
  134. {
  135. GrandBossManager.getInstance().setBossStatus(29118, 0);
  136. DoorTable.getInstance().getDoor(20240001).openMe();
  137. }
  138. }
  139. private static class Cast implements Runnable
  140. {
  141. L2Skill _skill;
  142. L2Npc _npc;
  143. public Cast(L2Skill skill, L2Npc npc)
  144. {
  145. _skill = skill;
  146. _npc = npc;
  147. }
  148. @Override
  149. public void run()
  150. {
  151. _npc.getAI().setIntention(CtrlIntention.AI_INTENTION_ACTIVE);
  152. if ((_npc != null) && !_npc.isDead() && !_npc.isCastingNow())
  153. {
  154. _npc.doCast(_skill);
  155. }
  156. }
  157. }
  158. private static class Spawn implements Runnable
  159. {
  160. private int _taskId = 0;
  161. public Spawn(int taskId)
  162. {
  163. _taskId = taskId;
  164. }
  165. @Override
  166. public void run()
  167. {
  168. try
  169. {
  170. int instanceId = 0;
  171. switch (_taskId)
  172. {
  173. case 1:
  174. movie = true;
  175. for (L2Character npc : _zone.getCharactersInsideArray())
  176. {
  177. if (npc instanceof L2Npc)
  178. {
  179. npc.deleteMe();
  180. }
  181. }
  182. camera = spawn(29120, new int[]
  183. {
  184. 16323, 213142, -9357, 0
  185. }, instanceId);
  186. camera2 = spawn(29121, new int[]
  187. {
  188. 16323, 210741, -9357, 0
  189. }, instanceId);
  190. camera3 = spawn(29122, new int[]
  191. {
  192. 16323, 213170, -9357, 0
  193. }, instanceId);
  194. camera4 = spawn(29123, new int[]
  195. {
  196. 16323, 214917, -9356, 0
  197. }, instanceId);
  198. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
  199. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 75, -25, 0, 2500, 0, 0, 1, 0));
  200. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(2), 300);
  201. break;
  202. case 2:
  203. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 1800, -45, -45, 5000, 5000, 0, 0, 1, 0));
  204. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(3), 4900);
  205. break;
  206. case 3:
  207. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 2500, -120, -45, 5000, 5000, 0, 0, 1, 0));
  208. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(4), 4900);
  209. break;
  210. case 4:
  211. _zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2200, 130, 0, 0, 1500, -20, 15, 1, 0));
  212. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(5), 1400);
  213. break;
  214. case 5:
  215. _zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 2300, 100, 0, 2000, 4500, 0, 10, 1, 0));
  216. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(6), 2500);
  217. break;
  218. case 6:
  219. L2DoorInstance door = DoorTable.getInstance().getDoor(20240001);
  220. door.closeMe();
  221. _zone.broadcastPacket(new StaticObject(door, false));
  222. _zone.broadcastPacket(new DoorStatusUpdate(door));
  223. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(7), 1700);
  224. break;
  225. case 7:
  226. _zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1500, 210, 0, 0, 1500, 0, 0, 1, 0));
  227. _zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 5000, 6500, 0, 10, 1, 0));
  228. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(8), 6000);
  229. break;
  230. case 8:
  231. spawn(29125, new int[]
  232. {
  233. 16323, 214917, -9356, 0
  234. }, instanceId);
  235. _zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 900, 255, 0, 0, 1500, 0, 10, 1, 0));
  236. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(9), 1000);
  237. break;
  238. case 9:
  239. _zone.broadcastPacket(new SpecialCamera(camera4.getObjectId(), 1000, 255, 0, 7000, 17000, 0, 25, 1, 0));
  240. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(10), 3000);
  241. break;
  242. case 10:
  243. beleth = spawn(29118, new int[]
  244. {
  245. 16321, 214211, -9352, 49369
  246. }, instanceId);
  247. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(11), 200);
  248. break;
  249. case 11:
  250. _zone.broadcastPacket(new SocialAction(beleth, 1));
  251. for (int i = 0; i < 6; i++)
  252. {
  253. int x = (int) ((150 * Math.cos(i * 1.046666667)) + 16323);
  254. int y = (int) ((150 * Math.sin(i * 1.046666667)) + 213059);
  255. L2Npc minion = spawn(29119, new int[]
  256. {
  257. x, y, -9357, 49152
  258. }, beleth.getInstanceId());
  259. minion.setShowSummonAnimation(true);
  260. minion.decayMe();
  261. minions.add(minion);
  262. }
  263. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(12), 6800);
  264. break;
  265. case 12:
  266. _zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 0, 270, -5, 0, 4000, 0, 0, 1, 0));
  267. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(13), 3500);
  268. break;
  269. case 13:
  270. _zone.broadcastPacket(new SpecialCamera(beleth.getObjectId(), 800, 270, 10, 3000, 6000, 0, 0, 1, 0));
  271. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(14), 5000);
  272. break;
  273. case 14:
  274. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
  275. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 0, 5000, 0, 0, 1, 0));
  276. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(15), 100);
  277. break;
  278. case 15:
  279. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 100, 270, 15, 3000, 6000, 0, 5, 1, 0));
  280. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(16), 1400);
  281. break;
  282. case 16:
  283. beleth.teleToLocation(16323, 213059, -9357, 49152, false);
  284. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(17), 200);
  285. break;
  286. case 17:
  287. _zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5532, 1, 2000, 0));
  288. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(18), 2000);
  289. break;
  290. case 18:
  291. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 700, 270, 20, 1500, 8000, 0, 0, 1, 0));
  292. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(19), 6900);
  293. break;
  294. case 19:
  295. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 260, 0, 0, 4000, 0, 0, 1, 0));
  296. for (L2Npc blth : minions)
  297. {
  298. blth.spawnMe();
  299. }
  300. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(20), 3000);
  301. break;
  302. case 20:
  303. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 40, 280, 0, 0, 4000, 5, 0, 1, 0));
  304. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(21), 3000);
  305. break;
  306. case 21:
  307. _zone.broadcastPacket(new SpecialCamera(camera3.getObjectId(), 5, 250, 5, 0, 13000, 20, 15, 1, 0));
  308. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(22), 1000);
  309. break;
  310. case 22:
  311. _zone.broadcastPacket(new SocialAction(beleth, 3));
  312. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(23), 4000);
  313. break;
  314. case 23:
  315. _zone.broadcastPacket(new MagicSkillUse(beleth, beleth, 5533, 1, 2000, 0));
  316. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(24), 6800);
  317. break;
  318. case 24:
  319. beleth.deleteMe();
  320. for (L2Npc bel : minions)
  321. {
  322. bel.deleteMe();
  323. }
  324. minions.clear();
  325. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(25), 1000);
  326. break;
  327. case 25:
  328. camera.deleteMe();
  329. camera2.deleteMe();
  330. camera3.deleteMe();
  331. camera4.deleteMe();
  332. movie = false;
  333. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
  334. break;
  335. case 26:
  336. if (spawnTimer != null)
  337. {
  338. spawnTimer.cancel(false);
  339. spawnTimer = null;
  340. }
  341. SpawnBeleths();
  342. break;
  343. case 27:
  344. beleth.doDie(null);
  345. camera = spawn(29122, new int[]
  346. {
  347. 16323, 213170, -9357, 0
  348. }, instanceId);
  349. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
  350. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 290, 25, 0, 10000, 0, 0, 1, 0));
  351. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 110, 25, 4000, 10000, 0, 0, 1, 0));
  352. _zone.broadcastPacket(new SocialAction(beleth, 5));
  353. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(28), 4000);
  354. break;
  355. case 28:
  356. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 25, 4000, 5000, 0, 0, 1, 0));
  357. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(29), 4500);
  358. break;
  359. case 29:
  360. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 400, 295, 10, 4000, 11000, 0, 25, 1, 0));
  361. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(30), 9000);
  362. break;
  363. case 30:
  364. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 1000, 0, 0, 1, 0));
  365. _zone.broadcastPacket(new SpecialCamera(camera.getObjectId(), 250, 90, 25, 0, 10000, 0, 0, 1, 0));
  366. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(31), 2000);
  367. break;
  368. case 31:
  369. priest.spawnMe();
  370. beleth.deleteMe();
  371. camera2 = spawn(29121, new int[]
  372. {
  373. 14056, 213170, -9357, 0
  374. }, instanceId);
  375. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(32), 3500);
  376. break;
  377. case 32:
  378. _zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
  379. _zone.broadcastPacket(new SpecialCamera(camera2.getObjectId(), 800, 180, 0, 0, 4000, 0, 10, 1, 0));
  380. L2DoorInstance door2 = DoorTable.getInstance().getDoor(20240002);
  381. door2.openMe();
  382. _zone.broadcastPacket(new StaticObject(door2, false));
  383. _zone.broadcastPacket(new DoorStatusUpdate(door2));
  384. DoorTable.getInstance().getDoor(20240003).openMe();
  385. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(33), 4000);
  386. break;
  387. case 33:
  388. camera.deleteMe();
  389. camera2.deleteMe();
  390. movie = false;
  391. break;
  392. case 333:
  393. beleth = spawn(29118, new int[]
  394. {
  395. 16323, 213170, -9357, 49152
  396. }, 0);
  397. break;
  398. }
  399. }
  400. catch (Exception e)
  401. {
  402. e.printStackTrace();
  403. }
  404. }
  405. }
  406. @Override
  407. public String onEnterZone(L2Character character, L2ZoneType zone)
  408. {
  409. if (((character instanceof L2PcInstance) && (GrandBossManager.getInstance().getBossStatus(29118) == 1)) || (debug && (GrandBossManager.getInstance().getBossStatus(29118) != 2) && (character instanceof L2PcInstance)))
  410. {
  411. startSpawnTask();
  412. GrandBossManager.getInstance().setBossStatus(29118, 2);
  413. }
  414. return null;
  415. }
  416. @Override
  417. public String onKill(L2Npc npc, L2PcInstance player, boolean isPet)
  418. {
  419. if ((npc.getNpcId() == 29118) && (player != null))
  420. {
  421. if (player.getParty() != null)
  422. {
  423. if (player.getParty().getCommandChannel() != null)
  424. {
  425. belethKiller = player.getParty().getCommandChannel().getChannelLeader();
  426. }
  427. else
  428. {
  429. belethKiller = player.getParty().getLeader();
  430. }
  431. }
  432. else
  433. {
  434. belethKiller = player;
  435. }
  436. GrandBossManager.getInstance().setBossStatus(29118, 3);
  437. long respawnTime = (long) Config.INTERVAL_OF_BELETH_SPAWN + Rnd.get(Config.RANDOM_OF_BELETH_SPAWN);
  438. StatsSet info = GrandBossManager.getInstance().getStatsSet(29118);
  439. info.set("respawn_time", System.currentTimeMillis() + respawnTime);
  440. GrandBossManager.getInstance().setStatsSet(29118, info);
  441. ThreadPoolManager.getInstance().scheduleGeneral(new unlock(), respawnTime);
  442. deleteAll();
  443. if (npc != null)
  444. {
  445. npc.deleteMe();
  446. }
  447. movie = true;
  448. beleth = spawn(29118, new int[]
  449. {
  450. 16323, 213170, -9357, 49152
  451. }, 0);
  452. beleth.setIsInvul(true);
  453. beleth.setIsImmobilized(true);
  454. beleth.disableAllSkills();
  455. priest = spawn(29128, new int[]
  456. {
  457. beleth.getX(), beleth.getY(), beleth.getZ(), beleth.getHeading()
  458. }, 0);
  459. priest.setShowSummonAnimation(true);
  460. priest.decayMe();
  461. spawn(32470, new int[]
  462. {
  463. 12470, 215607, -9381, 49152
  464. }, 0);
  465. ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(27), 1000);
  466. }
  467. else if (npc.getNpcId() == 29119)
  468. {
  469. if (npc.getObjectId() == allowObjectId)
  470. {
  471. minions.remove(npc);
  472. killed++;
  473. if (killed >= 5)
  474. {
  475. deleteAll();
  476. spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(333), 60000);
  477. }
  478. else
  479. {
  480. allowObjectId = minions.get(Rnd.get(minions.size())).getObjectId();
  481. attacked = false;
  482. }
  483. }
  484. else if (spawnTimer == null)
  485. {
  486. deleteAll();
  487. spawnTimer = ThreadPoolManager.getInstance().scheduleGeneral(new Spawn(26), 60000);
  488. killed = 0;
  489. }
  490. npc.abortCast();
  491. npc.setTarget(null);
  492. npc.deleteMe();
  493. }
  494. return null;
  495. }
  496. @Override
  497. public String onSkillSee(L2Npc npc, L2PcInstance player, L2Skill skill, L2Object[] targets, boolean isPet)
  498. {
  499. if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && (skill.getSkillType() == L2SkillType.HEAL) && (Rnd.get(100) < 80))
  500. {
  501. npc.setTarget(player);
  502. npc.doCast(HornOfRising);
  503. }
  504. return null;
  505. }
  506. @Override
  507. public String onAttack(L2Npc npc, L2PcInstance player, int damage, boolean isPet)
  508. {
  509. if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
  510. {
  511. if ((npc.getObjectId() == allowObjectId) && !attacked)
  512. {
  513. attacked = true;
  514. L2Npc fakeBeleth = minions.get(Rnd.get(minions.size()));
  515. while (fakeBeleth.getObjectId() == allowObjectId)
  516. {
  517. fakeBeleth = minions.get(Rnd.get(minions.size()));
  518. }
  519. _zone.broadcastPacket(new CreatureSay(fakeBeleth.getObjectId(), 0, fakeBeleth.getName(), "Miss text."));
  520. }
  521. if (Rnd.get(100) < 40)
  522. {
  523. return null;
  524. }
  525. final double distance = Math.sqrt(npc.getPlanDistanceSq(player.getX(), player.getY()));
  526. if ((distance > 500) || (Rnd.get(100) < 80))
  527. {
  528. for (L2Npc beleth : minions)
  529. {
  530. if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, player, false) && !beleth.isCastingNow())
  531. {
  532. beleth.setTarget(player);
  533. beleth.doCast(Fireball);
  534. }
  535. }
  536. if ((beleth != null) && !beleth.isDead() && Util.checkIfInRange(900, beleth, player, false) && !beleth.isCastingNow())
  537. {
  538. beleth.setTarget(player);
  539. beleth.doCast(Fireball);
  540. }
  541. }
  542. else if ((npc != null) && !npc.isDead() && !npc.isCastingNow())
  543. {
  544. if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
  545. {
  546. npc.doCast(Lightening);
  547. return null;
  548. }
  549. ((L2Attackable) npc).clearAggroList();
  550. }
  551. }
  552. return null;
  553. }
  554. @Override
  555. public String onSpellFinished(L2Npc npc, L2PcInstance player, L2Skill skill)
  556. {
  557. if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow())
  558. {
  559. if ((player != null) && !player.isDead())
  560. {
  561. final double distance2 = Math.sqrt(npc.getPlanDistanceSq(player.getX(), player.getY()));
  562. if ((distance2 > 890) && !npc.isMovementDisabled())
  563. {
  564. npc.setTarget(player);
  565. npc.getAI().setIntention(CtrlIntention.AI_INTENTION_FOLLOW, player);
  566. int speed = npc.isRunning() ? npc.getRunSpeed() : npc.getWalkSpeed();
  567. int time = (int) (((distance2 - 890) / speed) * 1000);
  568. ThreadPoolManager.getInstance().scheduleGeneral(new Cast(Fireball, npc), time);
  569. }
  570. else if (distance2 < 890)
  571. {
  572. npc.setTarget(player);
  573. npc.doCast(Fireball);
  574. }
  575. return null;
  576. }
  577. if (Rnd.get(100) < 40)
  578. {
  579. if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
  580. {
  581. npc.doCast(Lightening);
  582. return null;
  583. }
  584. }
  585. for (L2PcInstance plr : npc.getKnownList().getKnownPlayersInRadius(950))
  586. {
  587. npc.setTarget(plr);
  588. npc.doCast(Fireball);
  589. return null;
  590. }
  591. ((L2Attackable) npc).clearAggroList();
  592. }
  593. return null;
  594. }
  595. @Override
  596. public String onAggroRangeEnter(L2Npc npc, L2PcInstance player, boolean isPet)
  597. {
  598. if ((npc != null) && !npc.isDead() && ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119)) && !npc.isCastingNow() && !movie)
  599. {
  600. if (Rnd.get(100) < 40)
  601. {
  602. if (!npc.getKnownList().getKnownPlayersInRadius(200).isEmpty())
  603. {
  604. npc.doCast(Bleed);
  605. return null;
  606. }
  607. }
  608. npc.setTarget(player);
  609. npc.doCast(Fireball);
  610. }
  611. return null;
  612. }
  613. @Override
  614. public String onSpawn(L2Npc npc)
  615. {
  616. if ((npc.getNpcId() == 29118) || (npc.getNpcId() == 29119))
  617. {
  618. npc.setRunning();
  619. if (!movie && !npc.getKnownList().getKnownPlayersInRadius(300).isEmpty() && (Rnd.get(100) < 60))
  620. {
  621. npc.doCast(Bleed);
  622. }
  623. if (npc.getNpcId() == 29118)
  624. {
  625. npc.getSpawn().setRespawnDelay(0);// setOnKillDelay
  626. }
  627. }
  628. return null;
  629. }
  630. @Override
  631. public String onTalk(L2Npc npc, L2PcInstance player)
  632. {
  633. if ((belethKiller != null) && (player.getObjectId() == belethKiller.getObjectId()))
  634. {
  635. player.addItem("Kill Beleth", 10314, 1, null, true);// giveItems(10314, 1, 0)
  636. belethKiller = null;
  637. return "<html><body>Stone Coffin:<br> You open the lid and are immediately flooded by a dark and gloomy aura. It appears that something is happening...</body></html>";
  638. }
  639. else
  640. {
  641. return "<html><body>Stone Coffin:<br> The lid doesn't budge - it seems to be held firmly in place by some unknown force. This coffin must be the object that Beleth bequeaths to the leader of the attacking forces.";
  642. }
  643. }
  644. @Override
  645. public String onFirstTalk(L2Npc npc, L2PcInstance player)
  646. {
  647. return null;
  648. }
  649. private static void deleteAll()
  650. {
  651. if ((minions != null) && !minions.isEmpty())
  652. {
  653. for (L2Npc npc : minions)
  654. {
  655. if ((npc == null) || npc.isDead())
  656. {
  657. continue;
  658. }
  659. npc.abortCast();
  660. npc.setTarget(null);
  661. npc.getAI().setIntention(CtrlIntention.AI_INTENTION_IDLE);
  662. npc.deleteMe();
  663. }
  664. }
  665. minions.clear();
  666. allowObjectId = 0;
  667. attacked = false;
  668. }
  669. private static void SpawnBeleths()
  670. {
  671. int a = 0;
  672. L2Npc npc;
  673. for (int i = 0; i < 16; i++)
  674. {
  675. a++;
  676. int x = (int) ((650 * Math.cos(i * 0.39)) + 16323);
  677. int y = (int) ((650 * Math.sin(i * 0.39)) + 213170);
  678. npc = spawn(29119, new int[]
  679. {
  680. x, y, -9357, 49152
  681. }, 0);
  682. minions.add(npc);
  683. if (a >= 2)
  684. {
  685. npc.setIsOverloaded(true);
  686. a = 0;
  687. }
  688. }
  689. int[] xm = new int[16];
  690. int[] ym = new int[16];
  691. for (int i = 0; i < 4; i++)
  692. {
  693. xm[i] = (int) ((1700 * Math.cos((i * 1.57) + 0.78)) + 16323);
  694. ym[i] = (int) ((1700 * Math.sin((i * 1.57) + 0.78)) + 213170);
  695. npc = spawn(29119, new int[]
  696. {
  697. xm[i], ym[i], -9357, 49152
  698. }, 0);
  699. npc.setIsOverloaded(true);
  700. minions.add(npc);
  701. }
  702. xm[4] = (xm[0] + xm[1]) / 2;
  703. ym[4] = (ym[0] + ym[1]) / 2;
  704. npc = spawn(29119, new int[]
  705. {
  706. xm[4], ym[4], -9357, 49152
  707. }, 0);
  708. npc.setIsOverloaded(true);
  709. minions.add(npc);
  710. xm[5] = (xm[1] + xm[2]) / 2;
  711. ym[5] = (ym[1] + ym[2]) / 2;
  712. npc = spawn(29119, new int[]
  713. {
  714. xm[5], ym[5], -9357, 49152
  715. }, 0);
  716. npc.setIsOverloaded(true);
  717. minions.add(npc);
  718. xm[6] = (xm[2] + xm[3]) / 2;
  719. ym[6] = (ym[2] + ym[3]) / 2;
  720. npc = spawn(29119, new int[]
  721. {
  722. xm[6], ym[6], -9357, 49152
  723. }, 0);
  724. npc.setIsOverloaded(true);
  725. minions.add(npc);
  726. xm[7] = (xm[3] + xm[0]) / 2;
  727. ym[7] = (ym[3] + ym[0]) / 2;
  728. npc = spawn(29119, new int[]
  729. {
  730. xm[7], ym[7], -9357, 49152
  731. }, 0);
  732. npc.setIsOverloaded(true);
  733. minions.add(npc);
  734. xm[8] = (xm[0] + xm[4]) / 2;
  735. ym[8] = (ym[0] + ym[4]) / 2;
  736. minions.add(spawn(29119, new int[]
  737. {
  738. xm[8], ym[8], -9357, 49152
  739. }, 0));
  740. xm[9] = (xm[4] + xm[1]) / 2;
  741. ym[9] = (ym[4] + ym[1]) / 2;
  742. minions.add(spawn(29119, new int[]
  743. {
  744. xm[9], ym[9], -9357, 49152
  745. }, 0));
  746. xm[10] = (xm[1] + xm[5]) / 2;
  747. ym[10] = (ym[1] + ym[5]) / 2;
  748. minions.add(spawn(29119, new int[]
  749. {
  750. xm[10], ym[10], -9357, 49152
  751. }, 0));
  752. xm[11] = (xm[5] + xm[2]) / 2;
  753. ym[11] = (ym[5] + ym[2]) / 2;
  754. minions.add(spawn(29119, new int[]
  755. {
  756. xm[11], ym[11], -9357, 49152
  757. }, 0));
  758. xm[12] = (xm[2] + xm[6]) / 2;
  759. ym[12] = (ym[2] + ym[6]) / 2;
  760. minions.add(spawn(29119, new int[]
  761. {
  762. xm[12], ym[12], -9357, 49152
  763. }, 0));
  764. xm[13] = (xm[6] + xm[3]) / 2;
  765. ym[13] = (ym[6] + ym[3]) / 2;
  766. minions.add(spawn(29119, new int[]
  767. {
  768. xm[13], ym[13], -9357, 49152
  769. }, 0));
  770. xm[14] = (xm[3] + xm[7]) / 2;
  771. ym[14] = (ym[3] + ym[7]) / 2;
  772. minions.add(spawn(29119, new int[]
  773. {
  774. xm[14], ym[14], -9357, 49152
  775. }, 0));
  776. xm[15] = (xm[7] + xm[0]) / 2;
  777. ym[15] = (ym[7] + ym[0]) / 2;
  778. minions.add(spawn(29119, new int[]
  779. {
  780. xm[15], ym[15], -9357, 49152
  781. }, 0));
  782. allowObjectId = minions.get(Rnd.get(minions.size())).getObjectId();
  783. attacked = false;
  784. }
  785. public static void main(String[] args)
  786. {
  787. new Beleth(-1, "Beleth", "ai");
  788. }
  789. }