armark1ng

Untitled

Apr 8th, 2016
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 86.19 KB | None | 0 0
  1. package com.rs.game.npc.vorago;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Collections;
  5. import java.util.List;
  6. import java.util.TimerTask;
  7. import java.util.concurrent.CopyOnWriteArrayList;
  8.  
  9. import com.rs.Settings;
  10. import com.rs.cache.loaders.AnimationDefinitions;
  11. import com.rs.cache.loaders.ClientScriptMap;
  12. import com.rs.cache.loaders.ItemDefinitions;
  13. import com.rs.executor.GameExecutorManager;
  14. import com.rs.game.Animation;
  15. import com.rs.game.Colour;
  16. import com.rs.game.EffectsManager.EffectType;
  17. import com.rs.game.Entity;
  18. import com.rs.game.ForceMovement;
  19. import com.rs.game.ForceTalk;
  20. import com.rs.game.Graphics;
  21. import com.rs.game.Hit;
  22. import com.rs.game.Projectile;
  23. import com.rs.game.World;
  24. import com.rs.game.WorldObject;
  25. import com.rs.game.WorldTile;
  26. import com.rs.game.Hit.HitLook;
  27. import com.rs.game.item.FloorItem;
  28. import com.rs.game.item.Item;
  29. import com.rs.game.map.bossInstance.impl.VoragoInstance;
  30. import com.rs.game.npc.Drop;
  31. import com.rs.game.npc.Drops;
  32. import com.rs.game.npc.NPC;
  33. import com.rs.game.npc.combat.CombatScript;
  34. import com.rs.game.npc.combat.NPCCombatDefinitions;
  35. import com.rs.game.player.ActionBar;
  36. import com.rs.game.player.Equipment;
  37. import com.rs.game.player.Player;
  38. import com.rs.game.player.PurpleBombHitBar;
  39. import com.rs.game.player.TimersManager.RecordKey;
  40. import com.rs.game.player.actions.PlayerCombatNew;
  41. import com.rs.game.player.content.Combat;
  42. import com.rs.game.tasks.WorldTask;
  43. import com.rs.game.tasks.WorldTasksManager;
  44. import com.rs.utils.NPCDrops;
  45. import com.rs.utils.Utils;
  46.  
  47. @SuppressWarnings("serial")
  48. public class Vorago extends NPC {// 89150
  49.  
  50. private transient VoragoInstance instance;
  51. private int phase, phaseProgress, attackProgress, damageWhileDown, bringHimPoints;
  52. private transient Player targetedPlayer;
  53. private transient CopyOnWriteArrayList<Player> phaseKillers;
  54. private WorldObject gravityField;
  55. public FloorItem[] weaponPieces;
  56. private List<List<Drop>> phaseDrops;
  57. private long damageTime;
  58. private int losenWeaponPieceStage;
  59. private WorldObject[] ceilingCollapses;
  60. private WorldObject[] mists;
  61. private WorldObject[] teamSplitSquares;
  62. private int greenBombBounces;
  63. private transient Player greenBombP;
  64. private Scopulus[] scopuli;
  65. private StoneClone[] stoneClones;
  66. private Vitalis[] vitali;
  67. private TheEndBomb[] theEndBombs;
  68. private WorldTile theEndFaceTile;
  69. private int theEndStartIndex, theEndCycles, damageReduction;
  70. private List<WorldTile> unWalkAbleSpots;
  71. private WorldObject waterFall;
  72. public static int[] DEFENSIVE_ABILITY_IDS = { 4, 7, 10, 12, 14 };
  73.  
  74. public static int[] VORAGOES = { 17182, 17183, 17184 };
  75. public WorldTile[] locations = { new WorldTile(3095, 6120, 0), new WorldTile(3104, 6120, 0),
  76. new WorldTile(3112, 6120, 0), new WorldTile(3095, 6111, 0), new WorldTile(3104, 6111, 0),
  77. new WorldTile(3112, 6111, 0), new WorldTile(3095, 6103, 0), new WorldTile(3104, 6103, 0),
  78. new WorldTile(3112, 6103, 0) };
  79.  
  80. public Vorago(int id, WorldTile tile, int mapAreaNameHash, boolean canBeAttackFromOutOfArea, VoragoInstance instance) {
  81. super(id, tile, mapAreaNameHash, canBeAttackFromOutOfArea);
  82. this.instance = instance;
  83. getTemporaryAttributtes().put("VoragoType", 1);
  84. setCantFollowUnderCombat(true);
  85. setForceFollowClose(false);
  86. setIntelligentRouteFinder(true);
  87. setNoDistanceCheck(true);
  88. setCapDamage(12000);
  89. setDropRateFactor(1);
  90. phase = 1;
  91. phaseProgress = 0;
  92. attackProgress = 0;
  93. phaseDrops = new ArrayList<List<Drop>>(5);
  94. phaseKillers = new CopyOnWriteArrayList<Player>();
  95. weaponPieces = new FloorItem[3];
  96. ceilingCollapses = new WorldObject[6];
  97. mists = new WorldObject[9];
  98. teamSplitSquares = new WorldObject[16];
  99. unWalkAbleSpots = new ArrayList<WorldTile>();
  100. theEndBombs = new TheEndBomb[3];
  101. scopuli = new Scopulus[2];
  102. stoneClones = new StoneClone[8];
  103. vitali = new Vitalis[100];
  104. }
  105.  
  106. @Override
  107. public boolean canWalkNPC(int toX, int toY) {
  108. if (phase == 5)
  109. return false;
  110. if (getTemporaryAttributtes().get("BringHimDownClick") != null)
  111. return false;
  112. if (getTemporaryAttributtes().get("CantBeAttacked") != null || getTemporaryAttributtes().get("TheEnd") != null)
  113. return false;
  114. return super.canWalkNPC(toX, toY);
  115. }
  116.  
  117. private int damageCheckCycles;
  118.  
  119. @Override
  120. public void processEntity() {
  121. if (getTemporaryAttributtes().get("BringHimDownClick") != null)
  122. processBringHimDown();
  123. else if (getCombat().getTarget() != null && isCantFollowUnderCombat()
  124. && Utils.colides(this, getCombat().getTarget())
  125. && getTemporaryAttributtes().get("CantBeAttacked") == null
  126. && getTemporaryAttributtes().get("TheEnd") == null)
  127. calcFollow(getCombat().getTarget(), true);
  128. else if (phase == 5 && getHitpoints() != 0) {
  129. WorldTile voragoSpawnLocation = instance.getVoragoSpawnLocation(5);
  130. if (damageCheckCycles == 8) {
  131. int damage = getTemporaryAttributtes().get("damage") == null ? 0 : (int) getTemporaryAttributtes().get(
  132. "damage");
  133. if (damage != 0) {
  134. if (damage > 0) {// push players
  135. int nextX = getX() - 1;
  136. WorldTile nextVoragoTile = new WorldTile(nextX, getY(), getPlane());
  137. setNextWorldTile(nextVoragoTile);
  138. for (Player player : instance.getPlayersOnBattle()) {
  139. if (player == null || player.isDead())
  140. continue;
  141. if (Utils.colides(new WorldTile(nextX, getY(), getPlane()), player, getSize(),
  142. player.getSize())) {
  143. if (nextX == voragoSpawnLocation.getX() - 11) {
  144. player.getTemporaryAttributtes().put("InstantDeath", Boolean.TRUE);
  145. player.sendDeath(this);
  146. } else {
  147. WorldTile next = new WorldTile(player.getX() - 1, player.getY(), player.getPlane());
  148. player.setNextWorldTile(next);
  149. }
  150. }
  151. }
  152. } else if (damage < 0) {// push vorago
  153. int nextX = getX() + 1;
  154. WorldTile nextVoragoTile = new WorldTile(nextX, getY(), getPlane());
  155. if (nextX == voragoSpawnLocation.getX() + 9) {
  156. for (Player player : instance.getPlayersOnBattle()) {
  157. if (player == null || player.isDead())
  158. continue;
  159. player.getPackets().sendGameMessage(
  160. "Only the maul of omens will be enough to finish vorago.");
  161. }
  162. } else {
  163. setNextWorldTile(nextVoragoTile);
  164. }
  165. }
  166. getTemporaryAttributtes().put("damage", 0);
  167. }
  168. damageCheckCycles = 0;
  169. }
  170. damageCheckCycles++;
  171. }
  172. super.processEntity();
  173. }
  174.  
  175. // win coords = 3110 5982 0 (spawnlocation + 8 in x) / death player coords =
  176. // 3091 5982 0(spawnlocation - 11 in x)
  177.  
  178. private double damageRatio = 1.50;
  179.  
  180. @Override
  181. public void handleIngoingHit(Hit hit) {
  182. if (targetedPlayer != null) {
  183. Hit newHit = new Hit(this, hit.getDamage(), hit.getLook());
  184. hit.setDamage(0);
  185. if (hit.isAbility())
  186. newHit.setAbilityMark();
  187. if (hit.isCriticalHit())
  188. newHit.setCriticalMark();
  189. int damage = newHit.getDamage();
  190. if (damage != 0) {
  191. targetedPlayer.applyHit(newHit);
  192. }
  193. if (phase == 5) {
  194. int damageR = getTemporaryAttributtes().get("damage") == null ? 0 : (int) getTemporaryAttributtes()
  195. .get("damage");
  196. getTemporaryAttributtes().put("damage", damageR + (newHit.getDamage()));
  197. }
  198. }
  199. if (getTemporaryAttributtes().get("BringHimDownClick") != null) {
  200. damageWhileDown += hit.getDamage();
  201. } else if (getTemporaryAttributtes().get("ReducedDamage") != null) {
  202. int damage = hit.getDamage() * 1 / 8;
  203. hit.setDamage(damage);
  204. } else if (getTemporaryAttributtes().get("TheEnd") != null) {
  205. int damage = hit.getDamage() * 1 / damageReduction;
  206. hit.setDamage(damage);
  207. } else if (((getHitpoints() - hit.getDamage()) < (getMaxHitpoints() * 0.05)) && !canFinishPhase()) {
  208. setHitpoints((int) (getMaxHitpoints() * 0.3));
  209. } else if (((getHitpoints() - hit.getDamage()) <= 0) && canFinishPhase()) {
  210. sendDeath(hit.getSource());
  211. } else if (phase == 5 && targetedPlayer == null) {
  212. int damage = getTemporaryAttributtes().get("damage") == null ? 0 : (int) getTemporaryAttributtes().get(
  213. "damage");
  214. getTemporaryAttributtes().put("damage", (damage - ((int) (hit.getDamage() / damageRatio))));
  215. }
  216. super.handleIngoingHit(hit);
  217. }
  218.  
  219. @Override
  220. public Hit handleOutgoingHit(Hit hit, Entity target) {
  221. if (phase == 5) {
  222. int damage = getTemporaryAttributtes().get("damage") == null ? 0 : (int) getTemporaryAttributtes().get(
  223. "damage");
  224. getTemporaryAttributtes().put("damage", (damage + ((int) (hit.getDamage() * damageRatio))));
  225. }
  226. return hit;
  227. }
  228.  
  229. @Override
  230. public void processHit(Hit hit) {
  231. if (isDead() || getTemporaryAttributtes().get("BringHimDownClick") == Boolean.TRUE)
  232. return;
  233. if (getTemporaryAttributtes().get("BringHimDownClick") == null)
  234. removeHitpoints(hit);
  235. getNextHits().add(hit);
  236. if (getNextHitBars().isEmpty())
  237. addHitBars();
  238. }
  239.  
  240. @Override
  241. public void sendDeath(Entity source) {
  242. if (phase != 5) {
  243. if (!canFinishPhase())
  244. return;
  245. setCantInteract(true);
  246. setNextFaceEntity(null);
  247. generatePhaseKiller();
  248. giveXP();
  249. reset(true);
  250. setHitpoints(0);
  251. getCombat().reset();
  252. finishPhase();
  253. }
  254. }
  255.  
  256. public void sendRealDeath(Player player) {
  257. generatePhaseKiller();
  258. for (Player players : instance.getPlayersOnBattle()) {
  259. if (players == null || players.isDead() || players == player)
  260. continue;
  261. players.lock();
  262. players.resetCombat();
  263. players.resetWalkSteps();
  264. WorldTile sendTile = new WorldTile(getX() - 1, getY(), getPlane());
  265. players.setNextWorldTile(new WorldTile(sendTile.getX() - Utils.random(5), sendTile.getY(), sendTile
  266. .getPlane()));
  267. }
  268. player.lock();
  269. player.resetCombat();
  270. player.resetWalkSteps();
  271. player.setNextWorldTile(getTile(new WorldTile(3109, 5984, 0)));
  272. player.faceEntity(this);
  273. setCantInteract(true);
  274. resetWalkSteps();
  275. resetCombat();
  276. final NPCCombatDefinitions defs = getCombatDefinitions();
  277. setHitpoints(0);
  278. setNextAnimation(null);
  279. final int deathDelay = defs.getDeathDelay() - 4;
  280. WorldTasksManager.schedule(new WorldTask() {
  281. int loop;
  282.  
  283. @Override
  284. public void run() {
  285. if (loop == 0) {
  286. setNextAnimation(new Animation(defs.getDeathEmote()));
  287. setNextGraphics(new Graphics(4036));
  288. player.setNextAnimation(new Animation(20387));
  289. player.setHasMauledWeek(Settings.VORAGO_ROTATION);
  290. player.getInventory().deleteItem(28606, 1);
  291. } else if (loop >= deathDelay) {
  292. giveXP();
  293. sendDrops();
  294. instance.spawnExitSphere();
  295. reset();
  296. finish();
  297. for (Player players : instance.getPlayersOnBattle()) {
  298. if (players == null || players.isDead())
  299. continue;
  300. players.unlock();
  301. players.getTimersManager().removeTimer(RecordKey.VORAGO);
  302. }
  303. stop();
  304. }
  305. loop++;
  306. }
  307. }, 0, 1);
  308. }
  309.  
  310. public void sendDrops() {
  311. Drops DROPS = NPCDrops.getDrops(getId());
  312. for (int i = 0; i < 5; i++) {
  313. Player phaseKiller = getPhaseKiller(i);
  314. List<Drop> dropL = DROPS
  315. .generateDrops(phaseKiller, getDropRateFactor() * Settings.getDropRate(phaseKiller));
  316. DROPS.addCharms(dropL, getSize());
  317. phaseDrops.add(i, dropL);
  318. }
  319. WorldTile[] dropLocations = { getTile(new WorldTile(3111, 5985, 0)), getTile(new WorldTile(3113, 5985, 0)),
  320. getTile(new WorldTile(3112, 5984, 0)), getTile(new WorldTile(3111, 5983, 0)),
  321. getTile(new WorldTile(3113, 5983, 0)) };
  322. for (int i = 0; i < dropLocations.length; i++) {
  323. WorldTile loc = dropLocations[i];
  324. sendDrops(getPhaseKiller(i), phaseDrops.get(i), loc);
  325. }
  326. }
  327.  
  328. public void sendDrops(Player player, List<Drop> dropL, WorldTile location) {
  329. for (Drop drop : dropL) {
  330. String name = ItemDefinitions.getItemDefinitions(drop.getItemId()).getName().toLowerCase();
  331. if (name.contains("seismic") || name.contains("stone")) {
  332. World.sendNews(
  333. player,
  334. player.getDisplayName() + " has received "
  335. + ItemDefinitions.getItemDefinitions(drop.getItemId()).getName() + " drop!", 2);
  336. }
  337. boolean stackable = ItemDefinitions.getItemDefinitions(drop.getItemId()).isStackable();
  338. Item item = stackable ? new Item(drop.getItemId(), (drop.getMinAmount() * Settings.getDropQuantityRate())
  339. + Utils.random(drop.getExtraAmount() * Settings.getDropQuantityRate())) : new Item(
  340. drop.getItemId(), drop.getMinAmount() + Utils.random(drop.getExtraAmount()));
  341. if (!stackable && item.getAmount() > 1) {
  342. for (int i = 0; i < item.getAmount(); i++)
  343. World.addGroundItem(new Item(item.getId(), 1), location, player, true, 60);
  344. } else
  345. World.addGroundItem(item, location, player, true, 60);
  346. }
  347. }
  348.  
  349. public Player getPhaseKiller(int index) {
  350. Player phaseKiller = phaseKillers.get(index);
  351. if (phaseKiller == null || !instance.playerIsOnBattle(phaseKiller)) {
  352. ArrayList<Player> available = new ArrayList<Player>();
  353. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  354. Player player = instance.getPlayersOnBattle().get(i);
  355. if (player == null || player.isDead())
  356. continue;
  357. available.add(player);
  358. }
  359. Collections.shuffle(available);
  360. return available.get(Utils.random(available.size() - 1));
  361. }
  362. return phaseKiller;
  363. }
  364.  
  365. public void generatePhaseKiller() {
  366. int phase = getPhase() - 1;
  367. int luckyType = Utils.random(3);
  368. Player player = null;
  369. switch (luckyType) {
  370. case 0:// By last agro
  371. player = (Player) getCombat().getTarget();
  372. break;
  373. case 1:// By DPS
  374. int lowestDamage = 0;
  375. int index = 0;
  376. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  377. Player DPS = instance.getPlayersOnBattle().get(i);
  378. if (DPS == null || DPS.isDead())
  379. continue;
  380. int TotalDamage = DPS.getTemporaryAttributtes().get("TotalDamage") == null ? 0 : (int) DPS
  381. .getTemporaryAttributtes().get("TotalDamage");
  382. if (TotalDamage > lowestDamage) {
  383. lowestDamage = TotalDamage;
  384. index = i;
  385. }
  386. }
  387. player = instance.getPlayersOnBattle().get(index);
  388. break;
  389. case 2:// By blue bombs
  390. case 3:
  391. int lowestAmount = 0;
  392. index = 0;
  393. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  394. Player bombTank = instance.getPlayersOnBattle().get(i);
  395. if (bombTank == null || bombTank.isDead())
  396. continue;
  397. int blues = bombTank.getTemporaryAttributtes().get("BlueBombs") == null ? 0 : (int) bombTank
  398. .getTemporaryAttributtes().get("BlueBombs");
  399. if (blues > lowestAmount) {
  400. lowestAmount = blues;
  401. index = i;
  402. }
  403. }
  404. player = instance.getPlayersOnBattle().get(index);
  405. break;
  406. }
  407. if (player == null) {// shouldn't happen but okay random
  408. ArrayList<Player> available = new ArrayList<Player>();
  409. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  410. Player p = instance.getPlayersOnBattle().get(i);
  411. if (p == null || p.isDead())
  412. continue;
  413. available.add(p);
  414. }
  415. Collections.shuffle(available);
  416. player = available.get(Utils.random(available.size() - 1));
  417. }
  418. phaseKillers.add(phase, player);
  419. System.out.println("Generated Player to get drop for phase=" + phase + ", name=" + player.getDisplayName());
  420. for (Player reset : instance.getPlayersOnBattle()) {
  421. if (reset == null || reset.isDead())
  422. continue;
  423. reset.getTemporaryAttributtes().remove("BlueBombs");
  424. reset.getTemporaryAttributtes().remove("TotalDamage");
  425. }
  426. }
  427.  
  428. @Override
  429. public boolean isDead() {// TODO put a method in phase 5 to set dead
  430. return false;
  431. }
  432.  
  433. @Override
  434. public boolean restoreHitPoints() {
  435. int maxHp = getMaxHitpoints();
  436. if (getHitpoints() < maxHp && getHitpoints() != 0) {
  437. setHitpoints(getHitpoints() + 1);
  438. return true;
  439. }
  440. return false;
  441. }
  442.  
  443. @Override
  444. public boolean checkAgressivity() {
  445. if (getTemporaryAttributtes().get("BringHimDownClick") != null
  446. || getTemporaryAttributtes().get("TheEnd") != null)
  447. return false;
  448. if (getTemporaryAttributtes().get("CantBeAttacked") != null) {
  449. if (Settings.VORAGO_ROTATION == 1 && phase == 3)
  450. return true;
  451. return false;
  452. }
  453. ArrayList<Entity> possibleTarget = getPossibleTargets();
  454. if (!possibleTarget.isEmpty()) {
  455. Entity target = possibleTarget.get(Utils.random(possibleTarget.size()));
  456. setTarget(target);
  457. target.setAttackedBy(target);
  458. target.setFindTargetDelay(Utils.currentTimeMillis() + 10000);
  459. return true;
  460. }
  461. return false;
  462. }
  463.  
  464. @Override
  465. public void setTarget(Entity entity) {
  466. if (getTemporaryAttributtes().get("TheEnd") != null)
  467. return;
  468. super.setTarget(entity);
  469. }
  470.  
  471. public void finishPhase() {
  472. WorldTasksManager.schedule(new WorldTask() {
  473. int count = 0;
  474.  
  475. @Override
  476. public void run() {
  477. switch (count) {
  478. case 0:
  479. case 5:
  480. case 11:
  481. jump();
  482. break;
  483. case 17:
  484. setNextAnimation(new Animation(20365));
  485. sendCrackGround();
  486. break;
  487. case 18:
  488. startNextPhase();
  489. stop();
  490. break;
  491. }
  492. count++;
  493. }
  494. }, 0, 1);
  495. }
  496.  
  497. public void startNextPhase() {
  498. phase++;
  499. removeLeftOvers();
  500. for (Player player : instance.getPlayersOnBattle()) {
  501. if (player != null)
  502. player.setNextAnimation(new Animation(20402));
  503. }
  504. WorldTasksManager.schedule(new WorldTask() {
  505. int count = 0;
  506.  
  507. @Override
  508. public void run() {
  509. switch (count) {
  510. case 1:
  511. for (Player player : instance.getPlayersOnBattle()) {
  512. if (player == null)
  513. continue;
  514. WorldTile tile = instance.getSimilarCoords(player, phase);
  515. player.setNextAnimation(new Animation(20401));
  516. player.setNextWorldTile(tile);
  517. if (phase == 5)
  518. player.getTemporaryAttributtes().put("PHASE_5_START", Boolean.TRUE);
  519. }
  520. moveWeaponPieces();
  521. break;
  522. case 4:
  523. if (Settings.VORAGO_ROTATION != 0)
  524. break;
  525. if (phase == 4)
  526. for (WorldObject ceiling : ceilingCollapses) {
  527. if (ceiling == null)
  528. continue;
  529. WorldTile tile = instance.getSimilarCoords(new WorldTile(ceiling.getX(), ceiling.getY(),
  530. ceiling.getPlane()), phase);
  531. ceiling.setLocation(tile);
  532. spawnCeilingCollapse(tile, ceiling);
  533. }
  534. break;
  535. case 10:
  536. WorldTile phaseStartLocation = instance.getVoragoSpawnLocation(phase);
  537. if (Settings.VORAGO_ROTATION == 0 && phase == 4)
  538. removeMiddleCeilingObject();
  539. sendCrashDownAttack(phaseStartLocation);
  540. if (phase == 5) {
  541. for (Player player : instance.getPlayersOnBattle()) {
  542. if (player == null || player.isDead())
  543. continue;
  544. player.getTemporaryAttributtes().remove("PHASE_5_START");
  545. }
  546. }
  547. break;
  548. case 11:
  549. stop();
  550. break;
  551. }
  552. count++;
  553. }
  554. }, 0, 1);
  555. }
  556.  
  557. public void removeLeftOvers() {
  558. removeLeftOvers(false);
  559. }
  560.  
  561. public void removeLeftOvers(boolean finished) {
  562. for (int i = 0; i < ceilingCollapses.length; i++) {
  563. WorldObject ceiling = ceilingCollapses[i];
  564. if (ceiling == null)
  565. continue;
  566. World.removeObject(ceiling);
  567. if (phase == 5 && !finished)
  568. ceilingCollapses[i] = null;
  569. }
  570. for (int i = 0; i < mists.length; i++) {
  571. WorldObject mist = mists[i];
  572. if (mist == null)
  573. continue;
  574. World.removeObject(mist);
  575. mists[i] = null;
  576. }
  577. for (int i = 0; i < theEndBombs.length; i++) {
  578. TheEndBomb bomb = theEndBombs[i];
  579. if (bomb == null)
  580. continue;
  581. World.removeObject(bomb);
  582. theEndBombs[i] = null;
  583. }
  584. for (int i = 0; i < stoneClones.length; i++) {
  585. StoneClone clone = stoneClones[i];
  586. if (clone == null || clone.isDead())
  587. continue;
  588. clone.sendDeath(null);
  589. stoneClones[i] = null;
  590. }
  591. for (int i = 0; i < vitali.length; i++) {
  592. Vitalis vitalis = vitali[i];
  593. if (vitalis == null || vitalis.isDead())
  594. continue;
  595. vitalis.sendDeath(null);
  596. vitali[i] = null;
  597. }
  598. unWalkAbleSpots.clear();
  599. }
  600.  
  601. public void resetOnPhaseStart() {
  602. setHitpoints(getMaxHitpoints());
  603. reset();
  604. setCantInteract(false);
  605. setForceFollowClose(false);
  606. getCombat().setCombatDelay(0);
  607. phaseProgress = 0;
  608. attackProgress = 0;
  609. switch (phase) {
  610. case 2:
  611. getTemporaryAttributtes().put("VoragoType", 1);
  612. transform();
  613. break;
  614. case 3:
  615. switch (Settings.VORAGO_ROTATION) {
  616. case 1:// Scopulus
  617. getTemporaryAttributtes().put("VoragoType", 1);
  618. getTemporaryAttributtes().put("CantBeAttacked",
  619. "Magical Force prevents you from attacking vorago, Try killing his minions instead.");
  620. transform();
  621. break;
  622. case 0:// ceiling
  623. case 2:// Vitalis
  624. case 3:// Green Bomb
  625. getTemporaryAttributtes().put("VoragoType", 1);
  626. transform();
  627. break;
  628. case 4:// Team Split
  629. case 5:// The End
  630. getTemporaryAttributtes().put("CantBeAttackedOnPhaseStart", Boolean.TRUE);
  631. getTemporaryAttributtes().put("VoragoType", 1);
  632. transform();
  633. break;
  634. }
  635. break;
  636. case 4:
  637. getTemporaryAttributtes().put("CantBeAttackedOnPhaseStart", Boolean.TRUE);
  638. getTemporaryAttributtes().put("VoragoType", 1);
  639. transform();
  640. break;
  641. case 5:
  642. if (Settings.VORAGO_ROTATION == 4)
  643. getTemporaryAttributtes().put("CantBeAttackedOnPhaseStart", Boolean.TRUE);
  644. getTemporaryAttributtes().put("VoragoType", 1);
  645. transform();
  646. break;
  647. }
  648. }
  649.  
  650. public void moveWeaponPieces() {
  651. for (int i = 0; i < 3; i++) {
  652. FloorItem weaponPiece = weaponPieces[i];
  653. if (weaponPiece == null)
  654. continue;
  655. World.removeGroundItem(weaponPiece);
  656. weaponPieces[i] = World.addWeaponPiece(new Item(weaponPiece.getId()),
  657. instance.getSimilarCoords(weaponPiece.getTile(), phase));
  658. }
  659. }
  660.  
  661. public void transform() {
  662. int type = (int) getTemporaryAttributtes().get("VoragoType");
  663. switch (type) {
  664. case 0:
  665. setCantFollowUnderCombat(false);
  666. break;
  667. case 1:
  668. setCantFollowUnderCombat(true);
  669. break;
  670. case 2:
  671. setCantFollowUnderCombat(true);
  672. break;
  673. }
  674. if (getId() != VORAGOES[type]) {
  675. setNextNPCTransformation(VORAGOES[type]);
  676. getWalkSteps().clear();
  677. }
  678. }
  679.  
  680. public void sendCrashDownAttack(WorldTile crashDownTile) {
  681. resetOnPhaseStart();
  682. setNextWorldTile(crashDownTile);
  683. setNextAnimation(new Animation(20367, 20367, 20367, -1, 0));
  684. for (Player player : instance.getPlayersOnBattle()) {
  685. if (player == null
  686. || player.isDead()
  687. || !Utils.colides(player.getX(), player.getY(), player.getSize(), crashDownTile.getX(),
  688. crashDownTile.getY(), getSize()))
  689. continue;
  690. player.lock();
  691. player.setNextAnimation(new Animation(20338));
  692. WorldTile toTile = getPushedBackWorldTile(player, crashDownTile, getMoveDirection(player));
  693. player.setNextForceMovement(new ForceMovement(toTile, 1, getMoveDirection(player)));
  694. WorldTasksManager.schedule(new WorldTask() {
  695. @Override
  696. public void run() {
  697. player.unlock();
  698. player.setNextWorldTile(toTile);
  699. }
  700. }, (AnimationDefinitions.getAnimationDefinitions(20338).getEmoteClientCycles() / 30));
  701. }
  702. }
  703.  
  704. public WorldTile getPushedBackWorldTile(WorldTile startLocation, WorldTile voragoLocation, int playerDirection) {
  705. int moveX = (voragoLocation.getX() - startLocation.getX()) + 5;
  706. int moveY = (voragoLocation.getY() - startLocation.getY()) + 5;
  707. switch (playerDirection) {
  708. case ForceMovement.NORTH_EAST:// north-east
  709. return new WorldTile(startLocation.getX() - moveX, startLocation.getY() - moveY, startLocation.getPlane());
  710. case ForceMovement.NORTH_WEST:// north-west
  711. return new WorldTile(startLocation.getX() + moveX, startLocation.getY() - moveY, startLocation.getPlane());
  712. case ForceMovement.SOUTH_WEST:// south-west
  713. return new WorldTile(startLocation.getX() + moveX, startLocation.getY() + moveY, startLocation.getPlane());
  714. case ForceMovement.SOUTH_EAST:// south-east
  715. return new WorldTile(startLocation.getX() - moveX, startLocation.getY() + moveY, startLocation.getPlane());
  716. case ForceMovement.WEST:// west
  717. return new WorldTile(startLocation.getX() + moveX, startLocation.getY(), startLocation.getPlane());
  718. case ForceMovement.EAST:// east
  719. return new WorldTile(startLocation.getX() - moveX, startLocation.getY(), startLocation.getPlane());
  720. case ForceMovement.NORTH:// north
  721. return new WorldTile(startLocation.getX(), startLocation.getY() - moveY, startLocation.getPlane());
  722. case ForceMovement.SOUTH:// south
  723. default:
  724. return new WorldTile(startLocation.getX(), startLocation.getY() + moveY, startLocation.getPlane());
  725. }
  726. }
  727.  
  728. // north-west 0, south-east 0, north-east 1, south-west 1
  729. // Center phase 4 3038, 5982, 0
  730.  
  731. // { -10, 10 } west east
  732. // { 10, -10 } north south
  733.  
  734. public void sendWaterFallAttack() {
  735. if (getTemporaryAttributtes().get("CantBeAttackedOnPhaseStart") != null)
  736. getTemporaryAttributtes().remove("CantBeAttackedOnPhaseStart");
  737. WorldTile center = instance.getVoragoSpawnLocation(4);
  738. WorldTile waterFallLocation = new WorldTile(
  739. (Utils.random(2) == 0 ? (center.getX() - 10) : (center.getX() + 10)),
  740. (Utils.random(2) == 0 ? (center.getY() + 10) : (center.getY() - 10)), center.getPlane());
  741. boolean northWest = ((waterFallLocation.getX() == (center.getX() - 10)) && (waterFallLocation.getY() == (center
  742. .getY() + 10)));
  743. boolean southEast = ((waterFallLocation.getX() == (center.getX() + 10)) && (waterFallLocation.getY() == (center
  744. .getY() - 10)));
  745. boolean northEast = ((waterFallLocation.getX() == (center.getX() + 10)) && (waterFallLocation.getY() == (center
  746. .getY() + 10)));
  747. int rotation = northWest ? 0 : northEast ? 1 : southEast ? 2 : 3;// south-west
  748. waterFall = new WorldObject(84967, 11, rotation, waterFallLocation);
  749. List<WorldTile> safeLocations = new ArrayList<WorldTile>();
  750. int rot = rotation;
  751. int xstart = (rot == 2 || rot == 1) ? waterFallLocation.getX() : (waterFallLocation.getX() + 3);
  752. int ystart = (rot == 0 || rot == 1) ? (waterFallLocation.getY() + 3) : waterFallLocation.getY();
  753. for (int i = 0; i < 4; i++) {
  754. for (int j = 0; j < (4 - i); j++) {
  755. WorldTile tile = new WorldTile((rot == 2 || rot == 1) ? (xstart + j) : (xstart - j),
  756. (rot == 0 || rot == 1) ? (ystart - j) : (ystart + j), 1);
  757. safeLocations.add(tile);
  758. }
  759. xstart = (rot == 2 || rot == 1) ? (xstart + 1) : (xstart - 1);
  760. }
  761. if (Settings.VORAGO_ROTATION == 0)
  762. removeMiddleCeilingObject();
  763. setNextWorldTile(center);
  764. canBeAttackedByAutoRelatie();
  765. setNextAnimation(new Animation(20322));
  766. getTemporaryAttributtes().put("CantBeAttacked", "Vorago is invulnerable as he charges a massive fire attack!");
  767. getTemporaryAttributtes().put("waterfall", Boolean.TRUE);
  768. World.spawnObject(waterFall);
  769. for (Player player : instance.getPlayersOnBattle()) {
  770. if (player == null || player.isDead())
  771. continue;
  772. player.getPackets().sendGameMessage("Vorago's raw power disrupts your defensive abilities!");
  773. for (int i = 0; i < DEFENSIVE_ABILITY_IDS.length; i++) {
  774. int mapId = ClientScriptMap.getMap(ActionBar.CS_DATA_ID[ActionBar.DEFENCE_ABILITY_SHORTCUT - 1])
  775. .getIntValue(DEFENSIVE_ABILITY_IDS[i]);
  776. player.getActionbar().setCooldown(mapId, (int) (player.getActionbar().getCoolDown(mapId) + 19));
  777. }
  778. player.getEffectsManager().removeEffect(EffectType.REFLECT);
  779. player.getEffectsManager().removeEffect(EffectType.RESONANCE);
  780. player.getEffectsManager().removeEffect(EffectType.BARRICADE);
  781. player.getEffectsManager().removeEffect(EffectType.IMMORTALITY);
  782. player.getEffectsManager().removeEffect(EffectType.DEVOTION);
  783. VoragoInstance.sendMessage(player, 1,
  784. "<col=ff0000>Vorago starts to charge all his power into a massive fire attack!");
  785. player.getInterfaceManager().sendFadingInterface(1492);
  786. }
  787. for (int i = 0; i < stoneClones.length; i++) {
  788. StoneClone clone = stoneClones[i];
  789. if (clone == null)
  790. continue;
  791. clone.sendDeath(clone.getTarget());
  792. }
  793. Entity lastTarget = getCombat().getTarget();
  794. getCombat().removeTarget();
  795. cancelFaceEntityNoCheck();
  796. Vorago thisNPC = this;
  797. WorldTasksManager.schedule(new WorldTask() {
  798. int count = 0;
  799.  
  800. @Override
  801. public void run() {
  802. switch (count) {
  803. case 7:
  804. setNextAnimation(new Animation(20323));
  805. break;
  806. case 8:
  807. setNextGraphics(new Graphics(4013));
  808. setNextAnimation(new Animation(20323));
  809. getTemporaryAttributtes().remove("CantBeAttacked");
  810. getTemporaryAttributtes().remove("waterfall");
  811. World.removeObject(waterFall);
  812. phaseProgress++;
  813. for (Player player : instance.getPlayersOnBattle()) {
  814. if (player == null || player.isDead())
  815. continue;
  816. if (!isSafe(new WorldTile(player.getX(), player.getY(), player.getPlane()), safeLocations))
  817. player.applyHit(new Hit(thisNPC, 9000, HitLook.REGULAR_DAMAGE));
  818. player.getInterfaceManager().removeFadingInterface();
  819. }
  820. if (phaseProgress == 3) {
  821. WorldTile tile = instance.randomSpawnTile(null, instance.getVoragoSpawnLocation(phase), 5);
  822. weaponPieces[2] = World.addWeaponPiece(new Item(28604), tile);
  823. }
  824. waterFall = null;
  825. getCombat().setTarget(lastTarget);
  826. stop();
  827. break;
  828. }
  829. count++;
  830. }
  831. }, 0, 1);
  832. }
  833.  
  834. public boolean isSafe(WorldTile player, List<WorldTile> safeLocations) {
  835. for (WorldTile checkTile : safeLocations) {
  836. if (checkTile == null)
  837. continue;
  838. if (checkTile.getX() == player.getX() && checkTile.getY() == player.getY())
  839. return true;
  840. }
  841. return false;
  842. }
  843.  
  844. public boolean cantBeAutoRetaliated() {
  845. if (getTemporaryAttributtes().get("BringHimDownClick") != null
  846. || getTemporaryAttributtes().get("CantBeAttackedOnPhaseStart") != null
  847. || getTemporaryAttributtes().get("TheEnd") != null
  848. || getTemporaryAttributtes().get("CantBeAttacked") != null)
  849. return true;
  850. return false;
  851. }
  852.  
  853. public void spawnStoneClones() {
  854. double maxStoneClones = Math.ceil((double) getPlayerOnBattleCount() / 7.00);
  855. for (int i = 0; i < maxStoneClones; i++) {
  856. Player target = getRandomCloneTarget();
  857. if (target == null)
  858. continue;
  859. int combatType = target.getCombatDefinitions().getType(Equipment.SLOT_WEAPON);
  860. int id = combatType == Combat.MAGIC_TYPE ? 17160 : combatType == Combat.RANGE_TYPE ? 17159 : 17158;
  861. WorldTile spawnTile = instance.randomSpawnTile(null,
  862. new WorldTile(target.getX(), target.getY(), target.getPlane()), 4);
  863. stoneClones[i] = new StoneClone(id, spawnTile, -1, true, this, target);
  864. target.getHintIconsManager().addHintIcon(stoneClones[i], 0, -1, false);
  865. }
  866. }
  867.  
  868. public void sendCloneDeath(Player player) {
  869. for (int i = 0; i < stoneClones.length; i++) {
  870. StoneClone clone = stoneClones[i];
  871. if (clone == null)
  872. continue;
  873. if (clone.getTarget() == player)
  874. stoneClones[i] = null;
  875. }
  876. }
  877.  
  878. public Player getRandomCloneTarget() {
  879. List<Player> availableIndexes = new ArrayList<Player>();
  880. for (int i = 0; i < getVoragoInstance().getPlayersOnBattle().size(); i++) {
  881. Player player = getVoragoInstance().getPlayersOnBattle().get(i);
  882. if (player == null || player.isDead()
  883. || (player == getCombat().getTarget() && getPlayerOnBattleCount() > 1) || hasClone(player))
  884. continue;
  885. availableIndexes.add(player);
  886. }
  887. return availableIndexes.isEmpty() ? null : availableIndexes.get(Utils.random(availableIndexes.size() - 1));
  888. }
  889.  
  890. public boolean hasClone(Player player) {
  891. for (StoneClone stoneClone : stoneClones) {
  892. if (stoneClone == null || stoneClone.isDead())
  893. continue;
  894. if (stoneClone.getTarget() == player)
  895. return true;
  896. }
  897. return false;
  898. }
  899.  
  900. public void sendBringHimDown() {
  901. getTemporaryAttributtes().put("BringHimDownClick", Boolean.TRUE);
  902. setCantDoDefenceEmote(true);
  903. setNextAnimation(new Animation(20382));
  904. damageTime = Utils.currentTimeMillis() + 180000;// 3mins
  905. for (Player player : instance.getPlayersOnBattle()) {
  906. if (player == null || player.isDead())
  907. continue;
  908. player.stopAll();
  909. player.faceEntity(this);
  910. player.getPackets().sendCSVarInteger(2770, getVoragoInstance().getVorago().getBringHimPoints());
  911. player.getTemporaryAttributtes().put("BRINGHIM", Boolean.TRUE);
  912. player.setNextAnimation(getBringHimDownAnimation());
  913. player.getInterfaceManager().sendFadingInterface(1413);
  914. }
  915. }
  916.  
  917. public void processBringHimDown() {
  918. if (getBringHimPoints() >= 200 && getTemporaryAttributtes().get("BringHimDownClick") == Boolean.TRUE) {
  919. getTemporaryAttributtes().put("BringHimDownClick", Boolean.FALSE);
  920. setNextAnimation(new Animation(20383));
  921. WorldTasksManager.schedule(new WorldTask() {
  922. @Override
  923. public void run() {
  924. getTemporaryAttributtes().put("VoragoType", 2);
  925. transform();
  926. finishBringHimDown();
  927. }
  928. }, (AnimationDefinitions.getAnimationDefinitions(20383).getEmoteClientCycles() / 30));
  929. for (Player player : getVoragoInstance().getPlayersOnBattle()) {
  930. if (player == null)
  931. continue;
  932. Vorago thisNPC = this;
  933. player.getTemporaryAttributtes().remove("BRINGHIM");
  934. player.lock();
  935. player.setNextAnimation(new Animation(20400));
  936. player.getInterfaceManager().removeFadingInterface();
  937. WorldTasksManager.schedule(new WorldTask() {
  938. @Override
  939. public void run() {
  940. if (damageTime >= Utils.currentTimeMillis())
  941. player.applyHit(new Hit(thisNPC, 2000, HitLook.REGULAR_DAMAGE));
  942. player.unlock();
  943. }
  944. }, (AnimationDefinitions.getAnimationDefinitions(20400).getEmoteClientCycles() / 30) + 1);
  945. }
  946. }
  947. }
  948.  
  949. public void finishBringHimDown() {
  950. for (Player player : instance.getPlayersOnBattle()) {
  951. if (player == null || player.isDead())
  952. continue;
  953. VoragoInstance.sendMessage(player, 1,
  954. "<col=00ff00>Vorago stumbles! Deal as much damage as possible to loosen the next weapon piece!");
  955. }
  956. int damageRequired = 20000 * getPlayerOnBattleCount();
  957. WorldTasksManager.schedule(new WorldTask() {
  958. @Override
  959. public void run() {
  960. setBringHimPoints(0);
  961. setNextAnimation(new Animation(20362));
  962. WorldTasksManager.schedule(new WorldTask() {
  963. @Override
  964. public void run() {
  965. getTemporaryAttributtes().remove("BringHimDownClick");
  966. getTemporaryAttributtes().put("VoragoType", 1);
  967. transform();
  968. setCantSetTargetAutoRelatio(false);
  969. setCantDoDefenceEmote(false);
  970. }
  971. }, (AnimationDefinitions.getAnimationDefinitions(20362).getEmoteClientCycles() / 30));
  972. int finishType = (losenWeaponPieceStage >= 2 || damageWhileDown >= damageRequired) ? 2
  973. : (damageWhileDown < (damageRequired / 2)) ? 1 : 0;
  974. for (Player player : instance.getPlayersOnBattle()) {
  975. if (player == null || player.isDead())
  976. continue;
  977. player.getPackets().sendCSVarInteger(2770, getVoragoInstance().getVorago().getBringHimPoints());
  978. VoragoInstance
  979. .sendMessage(
  980. player,
  981. 1,
  982. finishType == 2 ? "<col=00ff00>The weapon piece falls from Vorago's body!"
  983. : finishType == 1 ? "<col=ff0000>You didn't do enough damage in time. The weapon piece still looks secure."
  984. : "<col=FF6600>Your strong attacks helps loosen the weapon piece a little more.");
  985. }
  986. phaseProgress = finishType == 2 ? 5 : 1;
  987. if (finishType == 2) {
  988. WorldTile tile = instance.randomSpawnTile(null, instance.getVoragoSpawnLocation(phase), 5);
  989. weaponPieces[1] = World.addWeaponPiece(new Item(28602), tile);
  990. } else if (finishType == 0) {
  991. losenWeaponPieceStage++;
  992. }
  993. damageWhileDown = 0;
  994. stop();
  995. }
  996. }, 30);
  997. }
  998.  
  999. public Animation getBringHimDownAnimation() {
  1000. int points = getBringHimPoints();
  1001. int index = 0;
  1002. if (points >= 167 && points < 200)
  1003. index = 5;
  1004. else if (points >= 134 && points < 167)
  1005. index = 4;
  1006. else if (points >= 101 && points < 134)
  1007. index = 3;
  1008. else if (points >= 68 && points < 101)
  1009. index = 2;
  1010. else if (points >= 35 && points < 68)
  1011. index = 1;
  1012. return new Animation(20394 + index);
  1013. }
  1014.  
  1015. public int getPlayerOnBattleCount() {
  1016. int count = 0;
  1017. for (Player player : instance.getPlayersOnBattle()) {
  1018. if (player == null || player.isDead())
  1019. continue;
  1020. count++;
  1021. }
  1022. return count;
  1023. }
  1024.  
  1025. public void jump() {
  1026. WorldTile jumpLocation = getRandomUsableLocation(null, true);
  1027. NPC thisNPC = this;
  1028. WorldTasksManager.schedule(new WorldTask() {
  1029. int count = 0;
  1030.  
  1031. @Override
  1032. public void run() {
  1033. switch (count) {
  1034. case 1:
  1035. setNextFaceWorldTile(jumpLocation);
  1036. setNextAnimation(new Animation(20365));
  1037. break;
  1038. case 2:
  1039. World.sendGraphics(thisNPC, new Graphics(4037), jumpLocation);
  1040. break;
  1041. case 4:
  1042. setNextAnimation(new Animation(20367));
  1043. setNextWorldTile(new WorldTile(jumpLocation.getX() - 2, jumpLocation.getY() - 2, 0));
  1044. for (Player player : instance.getPlayersOnBattle()) {
  1045. if (player == null || player.isDead())
  1046. continue;
  1047. boolean underRago = Utils.colides(jumpLocation.getX() - 2, jumpLocation.getY() - 2,
  1048. thisNPC.getSize(), player.getX(), player.getY(), player.getSize());
  1049. int distance = Utils.getDistance(player, jumpLocation);
  1050. int damage = underRago ? (distance == 0 ? 5500 : (5500 - (distance * 510))) : (distance > 5 ? 0
  1051. : (5500 * 1 / distance == 0 ? 1 : distance));
  1052. if (damage != 0) {
  1053. if (damage < 1500)
  1054. damage = Utils.random(1500, 3000);
  1055. player.applyHit(new Hit(thisNPC, damage, HitLook.REGULAR_DAMAGE));
  1056. }
  1057. }
  1058. stop();
  1059. break;
  1060. }
  1061. count++;
  1062. }
  1063. }, 0, 1);
  1064. }
  1065.  
  1066. // northEast +6 +6 northwest -6+6 southwest -6-6 southeast +6-6
  1067.  
  1068. public void startTheEnd() {
  1069. if (getTemporaryAttributtes().get("CantBeAttackedOnPhaseStart") != null)
  1070. getTemporaryAttributtes().remove("CantBeAttackedOnPhaseStart");
  1071. getTemporaryAttributtes().put("CantBeAttacked", "Vorago is unvulnerable as he charges a massive smash attack!");
  1072. for (Player player : instance.getPlayersOnBattle()) {
  1073. if (player == null || player.isDead())
  1074. continue;
  1075. player.resetCombat();
  1076. VoragoInstance.sendMessage(player, 1,
  1077. "<col=ff0000>Vorago prepares to suffocate all those who aren't contained!");
  1078. }
  1079. WorldTile voragoLocation = instance.getVoragoSpawnLocation(phase);
  1080. WorldTile center = new WorldTile(voragoLocation.getX() + 2, voragoLocation.getY() + 2,
  1081. voragoLocation.getPlane());
  1082. WorldTile[] locations = {
  1083. new WorldTile(voragoLocation.getX() + 7, voragoLocation.getY() + 7, voragoLocation.getPlane()),
  1084. new WorldTile(voragoLocation.getX() - 6, voragoLocation.getY() + 6, voragoLocation.getPlane()),
  1085. new WorldTile(voragoLocation.getX() - 6, voragoLocation.getY() - 6, voragoLocation.getPlane()),
  1086. new WorldTile(voragoLocation.getX() + 6, voragoLocation.getY() - 6, voragoLocation.getPlane()) };
  1087. theEndStartIndex = Utils.random(locations.length - 1);
  1088. int objectStartIndex = (theEndStartIndex + 3) > (locations.length - 1) ? (theEndStartIndex - 1)
  1089. : (theEndStartIndex + 3);
  1090. int objectId = Utils.random(2) == 0 ? 95042 : 95043;
  1091. int blueBombsAmount = (int) ((getPlayerOnBattleCount() * 0.7) < 5 ? 5 : (getPlayerOnBattleCount() * 0.7));
  1092. int redBombsAmount = (int) ((getPlayerOnBattleCount() * 0.42) < 3 ? 3 : (getPlayerOnBattleCount() * 0.42));
  1093. for (int i = 0; i < 3; i++) {
  1094. int index = (objectStartIndex - i) < 0 ? ((objectStartIndex - i) == -1 ? 3 : 2) : (objectStartIndex - i);
  1095. int id = i == 0 ? 95044 : i == 1 ? objectId : objectId == 95043 ? 95042 : 95043;
  1096. WorldTile loc = new WorldTile(locations[index].getX(), locations[index].getY(), locations[index].getPlane());
  1097. theEndBombs[i] = new TheEndBomb(id, 10, 0, loc, this, id == 95044 ? 1 : id == 95043 ? blueBombsAmount
  1098. : redBombsAmount);
  1099. }
  1100. WorldTile faceTile = new WorldTile(theEndStartIndex == 0 ? locations[theEndStartIndex].getX() + 6
  1101. : theEndStartIndex == 1 || theEndStartIndex == 2 ? locations[theEndStartIndex].getX() - 4
  1102. : locations[theEndStartIndex].getX() + 7,
  1103. theEndStartIndex == 0 ? locations[theEndStartIndex].getY() + 6
  1104. : theEndStartIndex == 1 ? locations[theEndStartIndex].getY() + 7 : locations[theEndStartIndex]
  1105. .getY() - 4, locations[theEndStartIndex].getPlane());
  1106. setNextWorldTile(voragoLocation);
  1107. cancelFaceEntityNoCheck();
  1108. getCombat().removeTarget();
  1109. theEndFaceTile = faceTile;
  1110. setNextFaceWorldTile(theEndFaceTile);
  1111. setNextAnimation(new Animation(25434, 25434, 25434, -1, 0));
  1112. unWalkAbleSpots.clear();
  1113. Vorago thisNPC = this;
  1114. theEndCycles = 3;
  1115. WorldTasksManager.schedule(new WorldTask() {
  1116. int count = 0;
  1117.  
  1118. @Override
  1119. public void run() {
  1120. if (getHitpoints() == 0 || instance.getPlayersOnBattle().isEmpty()) {
  1121. stop();
  1122. return;
  1123. }
  1124. if (getCombat().getTarget() != null && theEndCycles != 0) {
  1125. getCombat().removeTarget();
  1126. getCombat().reset();
  1127. cancelFaceEntityNoCheck();
  1128. setNextFaceWorldTile(theEndFaceTile);
  1129. }
  1130. if (count == 10) {
  1131. for (int i = 0; i < theEndBombs.length; i++) {
  1132. theEndBombs[i].setActive(false);
  1133. World.spawnObject(theEndBombs[i]);
  1134. }
  1135. setNextForceTalk(new ForceTalk("...Za End!"));
  1136. setNextAnimation(new Animation(25435));
  1137. setCantDoDefenceEmote(true);
  1138. getTemporaryAttributtes().remove("CantBeAttacked");
  1139. getTemporaryAttributtes().put("TheEnd", Boolean.TRUE);
  1140. damageReduction = 1;
  1141. for (Player player : instance.getPlayersOnBattle()) {
  1142. if (player == null || player.isDead())
  1143. continue;
  1144. if (isBetweenVoragoHands(player))
  1145. player.getTemporaryAttributtes().remove("Suffocating");
  1146. else
  1147. player.getTemporaryAttributtes().put("Suffocating", 100);
  1148. }
  1149. for (int i = 0; i < 2; i++) {
  1150. for (int j = 0; j < 15; j++) {
  1151. WorldTile unWalkable = new WorldTile(
  1152. i == 0 ? ((theEndStartIndex == 0 || theEndStartIndex == 2) ? (theEndStartIndex == 0 ? (center
  1153. .getX() + j) : (center.getX() - j))
  1154. : center.getX())
  1155. : ((theEndStartIndex == 0 || theEndStartIndex == 2) ? center.getX()
  1156. : (theEndStartIndex == 1 ? (center.getX() - j)
  1157. : (center.getX() + j))),
  1158. i == 0 ? ((theEndStartIndex == 0 || theEndStartIndex == 2) ? center.getY()
  1159. : (theEndStartIndex == 1 ? (center.getY() + j) : (center.getY() - j)))
  1160. : ((theEndStartIndex == 0 || theEndStartIndex == 2) ? (theEndStartIndex == 0 ? (center
  1161. .getY() + j) : (center.getY() - j))
  1162. : center.getY()), getPlane());
  1163. unWalkAbleSpots.add(unWalkable);
  1164. }
  1165. }
  1166. } else if (count == 16)
  1167. setNextAnimation(new Animation(25436, 25436, 25436, -1, 0));
  1168. else if (count == 18)
  1169. unWalkAbleSpots.clear();
  1170. else if (count == 19) {
  1171. setNextAnimation(new Animation(25437));
  1172. for (int i = 0; i < 2; i++) {
  1173. for (int j = 0; j < 15; j++) {
  1174. WorldTile unWalkable = new WorldTile(
  1175. i == 0 ? ((theEndStartIndex == 0 || theEndStartIndex == 2) ? (theEndStartIndex == 0 ? (center
  1176. .getX() + j) : (center.getX() - j))
  1177. : center.getX())
  1178. : ((theEndStartIndex == 0 || theEndStartIndex == 2) ? (theEndStartIndex == 0 ? (center
  1179. .getX() - j) : (center.getX() + j))
  1180. : (center.getX())),
  1181. i == 0 ? ((theEndStartIndex == 0 || theEndStartIndex == 2) ? center.getY()
  1182. : (theEndStartIndex == 1 ? (center.getY() + j) : (center.getY() - j)))
  1183. : ((theEndStartIndex == 0 || theEndStartIndex == 2) ? (center.getY())
  1184. : (theEndStartIndex == 1 ? (center.getY() - j)
  1185. : (center.getY() + j))), getPlane());
  1186. unWalkAbleSpots.add(unWalkable);
  1187. }
  1188. }
  1189. TheEndBomb bomb = getBombBetweenVoragoHands();
  1190. if (bomb != null)
  1191. bomb.setActive(false);
  1192. } else if (count == 27) {
  1193. int nextFaceIndex = (theEndStartIndex + 1) > (locations.length - 1) ? (theEndStartIndex - 3)
  1194. : (theEndStartIndex + 1);
  1195. WorldTile nextFaceTile = new WorldTile(nextFaceIndex == 0 ? locations[nextFaceIndex].getX() + 6
  1196. : nextFaceIndex == 1 || nextFaceIndex == 2 ? locations[nextFaceIndex].getX() - 4
  1197. : locations[nextFaceIndex].getX() + 7,
  1198. nextFaceIndex == 0 ? locations[nextFaceIndex].getY() + 6
  1199. : nextFaceIndex == 1 ? locations[nextFaceIndex].getY() + 7
  1200. : locations[nextFaceIndex].getY() - 4, locations[nextFaceIndex].getPlane());
  1201. setNextAnimation(new Animation(25438, 25438, 25438, -1, 0));
  1202. for (Player player : instance.getPlayersOnBattle()) {
  1203. if (player == null || player.isDead() || !isBetweenVoragoHands(player))
  1204. continue;
  1205. player.lock(2);
  1206. player.setNextAnimation(new Animation(20338));
  1207. WorldTile pushTile = new WorldTile(nextFaceIndex == 0 || nextFaceIndex == 2 ? player.getX()
  1208. : nextFaceTile.getX(), nextFaceIndex == 0 || nextFaceIndex == 2 ? nextFaceTile.getY()
  1209. : player.getY(), player.getPlane());
  1210. player.setNextWorldTile(pushTile);
  1211. player.applyHit(new Hit(thisNPC, 2500, HitLook.REGULAR_DAMAGE));
  1212. }
  1213. setNextFaceWorldTile(nextFaceTile);
  1214. theEndFaceTile = nextFaceTile;
  1215. unWalkAbleSpots.clear();
  1216. for (int i = 0; i < 2; i++) {
  1217. for (int j = 0; j < 15; j++) {
  1218. WorldTile unWalkable = new WorldTile(
  1219. i == 0 ? ((nextFaceIndex == 0 || nextFaceIndex == 2) ? (nextFaceIndex == 0 ? (center
  1220. .getX() + j) : (center.getX() - j))
  1221. : center.getX())
  1222. : ((nextFaceIndex == 0 || nextFaceIndex == 2) ? center.getX()
  1223. : (nextFaceIndex == 1 ? (center.getX() - j) : (center.getX() + j))),
  1224. i == 0 ? ((nextFaceIndex == 0 || nextFaceIndex == 2) ? center.getY()
  1225. : (nextFaceIndex == 1 ? (center.getY() + j) : (center.getY() - j)))
  1226. : ((nextFaceIndex == 0 || nextFaceIndex == 2) ? (nextFaceIndex == 0 ? (center
  1227. .getY() + j) : (center.getY() - j))
  1228. : center.getY()), getPlane());
  1229. unWalkAbleSpots.add(unWalkable);
  1230. }
  1231. }
  1232. } else if (count == 28) {
  1233. setNextAnimation(new Animation(25439));
  1234. for (Player player : instance.getPlayersOnBattle()) {
  1235. if (player == null || player.isDead())
  1236. continue;
  1237. if (isBetweenVoragoHands(player))
  1238. player.getTemporaryAttributtes().remove("Suffocating");
  1239. else if (player.getTemporaryAttributtes().get("Suffocating") == null)
  1240. player.getTemporaryAttributtes().put("Suffocating", 100);
  1241. }
  1242. TheEndBomb bomb = getBombBetweenVoragoHands();
  1243. if (bomb != null) {
  1244. bomb.setActive(true);
  1245. damageReduction = bomb.getId() == 95044 ? 4 : bomb.getId() == 95043 ? 3 : 2;
  1246. }
  1247. } else if (count == 34) {
  1248. theEndCycles--;
  1249. theEndStartIndex++;
  1250. if (theEndCycles == 0) {
  1251. setNextAnimation(new Animation(25440));
  1252. getTemporaryAttributtes().remove("TheEnd");
  1253. for (Player player : instance.getPlayersOnBattle()) {
  1254. if (player == null || player.isDead())
  1255. continue;
  1256. player.getTemporaryAttributtes().remove("Suffocating");
  1257. }
  1258. setCantDoDefenceEmote(false);
  1259. theEndFaceTile = null;
  1260. damageReduction = 1;
  1261. unWalkAbleSpots.clear();
  1262. count = 36;
  1263. return;
  1264. }
  1265. count = 16;
  1266. return;
  1267. } else if (count == 38) {
  1268. launchRemainingBombs();
  1269. stop();
  1270. }
  1271. count++;
  1272. }
  1273. }, 0, 0);
  1274. }
  1275.  
  1276. public boolean canMove(Player player, int nextX, int nextY) {
  1277. if (unWalkAbleSpots == null || getHitpoints() == 0)
  1278. return true;
  1279. for (WorldTile checkTile : unWalkAbleSpots) {
  1280. if (checkTile.getX() == nextX && checkTile.getY() == nextY)
  1281. return false;
  1282. }
  1283. return true;
  1284. }
  1285.  
  1286. public TheEndBomb getBombById(int objectId) {
  1287. for (int i = 0; i < theEndBombs.length; i++) {
  1288. if (theEndBombs[i] == null)
  1289. continue;
  1290. if (theEndBombs[i].getId() == objectId)
  1291. return theEndBombs[i];
  1292. }
  1293. return null;
  1294. }
  1295.  
  1296. public void launchRemainingBombs() {
  1297. TheEndBomb redBomb = getBombById(95042);
  1298. TheEndBomb blueBomb = getBombById(95043);
  1299. TheEndBomb purpleBomb = getBombById(95044);
  1300. int bluesWaves = blueBomb == null ? 0 : (blueBomb.getCharges() / getPlayerOnBattleCount());
  1301. int redsWaves = redBomb == null ? 0 : (redBomb.getCharges() / getPlayerOnBattleCount());
  1302.  
  1303. for (int i = 0; i < bluesWaves; i++) {
  1304. Collections.shuffle(instance.getPlayersOnBattle());
  1305. if (i == (bluesWaves - 1)) {
  1306. World.removeObject(blueBomb);
  1307. }
  1308. WorldTasksManager.schedule(new WorldTask() {
  1309. @Override
  1310. public void run() {
  1311. for (Player player : instance.getPlayersOnBattle()) {
  1312. if (player == null || player.isDead())
  1313. continue;
  1314. if (blueBomb.decreaseCharges())
  1315. sendBlueBombAttack(player, blueBomb, false);
  1316. }
  1317. }
  1318. }, 2);
  1319. }
  1320. for (int i = 0; i < redsWaves; i++) {
  1321. Collections.shuffle(instance.getPlayersOnBattle());
  1322. if (i == (redsWaves - 1)) {
  1323. World.removeObject(redBomb);
  1324. }
  1325. WorldTasksManager.schedule(new WorldTask() {
  1326. @Override
  1327. public void run() {
  1328. for (Player player : instance.getPlayersOnBattle()) {
  1329. if (player == null || player.isDead())
  1330. continue;
  1331. if (redBomb.decreaseCharges())
  1332. sendRedBombAttack(player, redBomb);
  1333. }
  1334. }
  1335. }, 2);
  1336. }
  1337. if (purpleBomb == null)
  1338. return;
  1339. if (purpleBomb.decreaseCharges())
  1340. sendPurpleBombAttack();
  1341. World.removeObject(purpleBomb);
  1342. }
  1343.  
  1344. private int purpleBombCounter;
  1345.  
  1346. public void sendPurpleBombAttack() {
  1347. TheEndBomb purpleBomb = phase == 5 ? null : getBombById(95044);
  1348. purpleBombCounter = 0;
  1349. Collections.shuffle(instance.getPlayersOnBattle());
  1350. Vorago thisNPC = this;
  1351. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  1352. Player player = instance.getPlayersOnBattle().get(i);
  1353. if (player == null || player.isDead())
  1354. continue;
  1355. PurpleBombHitBar bar = new PurpleBombHitBar(player);
  1356. long startTime = Utils.currentTimeMillis();
  1357. long arriveTime = startTime + (55000 + (25000 * purpleBombCounter));
  1358. WorldTile fromLocation = purpleBomb != null ? purpleBomb : new WorldTile(player.getX() - 4, player.getY(),
  1359. player.getPlane());
  1360. double speed = Utils.getProjectileSpeed(fromLocation, player, 5, 20, startTime, arriveTime);
  1361. Projectile projectile = World.sendProjectileNew(fromLocation, player, 5326, 5, 20, 10, speed, 0, 0);
  1362. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 2;
  1363. player.getAppearence().transformIntoNPC(17158);
  1364. GameExecutorManager.fastExecutor.scheduleAtFixedRate(new TimerTask() {
  1365. int count = cycleTime;
  1366. int startPercentage = 0;
  1367.  
  1368. @Override
  1369. public void run() {
  1370. if (!player.getNextHitBars().contains(bar))
  1371. player.getNextHitBars().add(bar);
  1372. VoragoInstance.sendMessage(player, 1, "<col=ff0000>Detonation in: " + count, false);
  1373. int perc = (int) (((double) (startPercentage / (double) cycleTime)) * 100);
  1374. player.getTemporaryAttributtes().put("PurpleBomb", perc);
  1375. startPercentage++;
  1376. count--;
  1377. if (count == 0) {
  1378. player.getAppearence().transformIntoNPC(-1);
  1379. CombatScript.delayHit(thisNPC, 0, player, new Hit(thisNPC, 2000, HitLook.REGULAR_DAMAGE));
  1380. player.setNextGraphics(new Graphics(4024));
  1381. for (Player p2 : instance.getPlayersOnBattle()) {
  1382. if (p2 == null || p2.isDead() || p2 == player || !Utils.isOnRange(player, p2, 1))
  1383. continue;
  1384. CombatScript.delayHit(thisNPC, 0, p2, new Hit(thisNPC, 2000, HitLook.REGULAR_DAMAGE));
  1385. p2.setNextGraphics(new Graphics(4024));
  1386. }
  1387. cancel();
  1388. }
  1389. }
  1390.  
  1391. }, 0, 1000);
  1392. purpleBombCounter++;
  1393. }
  1394. }
  1395.  
  1396. public void handleBombClick(Player player, WorldObject object) {
  1397. if (getHitpoints() == 0)
  1398. return;
  1399. TheEndBomb bomb = (TheEndBomb) object;
  1400. if (bomb == null)
  1401. return;
  1402. if (getTemporaryAttributtes().get("TheEnd") == null || !bomb.isActive()) {
  1403. VoragoInstance.sendMessage(player, 1, "Vorago isn't focusing on making that bomb active right now.");
  1404. return;
  1405. }
  1406. switch (bomb.getId()) {
  1407. case 95042:// red bomb
  1408. if (bomb.decreaseCharges())
  1409. sendRedBombAttack(player, bomb);
  1410. break;
  1411. case 95043:// blue bomb
  1412. if (bomb.decreaseCharges())
  1413. sendBlueBombAttack(player, bomb, true);
  1414. break;
  1415. case 95044:// purple bomb
  1416. if (bomb.decreaseCharges())
  1417. sendPurpleBombAttack();
  1418. break;
  1419. }
  1420. }
  1421.  
  1422. public boolean isBetweenVoragoHands(WorldTile tile) {
  1423. if (theEndFaceTile == null)
  1424. return false;
  1425. WorldTile cornerLocation = new WorldTile(theEndFaceTile.getX(), theEndFaceTile.getY(),
  1426. theEndFaceTile.getPlane());
  1427. WorldTile center = new WorldTile(getX() + 2, getY() + 2, getPlane());
  1428. int smallestX = center.getX() > cornerLocation.getX() ? cornerLocation.getX() : center.getX();
  1429. int largestX = center.getX() < cornerLocation.getX() ? cornerLocation.getX() : center.getX();
  1430. int smallestY = center.getY() > cornerLocation.getY() ? cornerLocation.getY() : center.getY();
  1431. int largestY = center.getY() < cornerLocation.getY() ? cornerLocation.getY() : center.getY();
  1432. return isInSquare(tile, smallestX, largestX, smallestY, largestY);
  1433. }
  1434.  
  1435. public TheEndBomb getBombBetweenVoragoHands() {
  1436. if (theEndFaceTile == null)
  1437. return null;
  1438. WorldTile cornerLocation = new WorldTile(theEndFaceTile.getX(), theEndFaceTile.getY(),
  1439. theEndFaceTile.getPlane());
  1440. WorldTile center = new WorldTile(getX() + 2, getY() + 2, getPlane());
  1441. int smallestX = center.getX() > cornerLocation.getX() ? cornerLocation.getX() : center.getX();
  1442. int largestX = center.getX() < cornerLocation.getX() ? cornerLocation.getX() : center.getX();
  1443. int smallestY = center.getY() > cornerLocation.getY() ? cornerLocation.getY() : center.getY();
  1444. int largestY = center.getY() < cornerLocation.getY() ? cornerLocation.getY() : center.getY();
  1445. int[] bombObjectIds = { 95042, 95043, 95044 };
  1446. for (int i = 0; i < bombObjectIds.length; i++) {
  1447. for (int x = smallestX; x < largestX; x++) {
  1448. for (int y = smallestY; y < largestY; y++) {
  1449. TheEndBomb bomb = (TheEndBomb) World.getObjectWithId(
  1450. new WorldTile(x, y, cornerLocation.getPlane()), bombObjectIds[i]);
  1451. if (bomb == null)
  1452. continue;
  1453. return bomb;
  1454. }
  1455. }
  1456. }
  1457. return null;
  1458. }
  1459.  
  1460. public void sendBlueBombAttack(Player player, WorldTile fromLocation, boolean resetDefinsive) {
  1461. if (resetDefinsive) {
  1462. for (int i = 0; i < DEFENSIVE_ABILITY_IDS.length; i++) {
  1463. int mapId = ClientScriptMap.getMap(ActionBar.CS_DATA_ID[ActionBar.DEFENCE_ABILITY_SHORTCUT - 1])
  1464. .getIntValue(DEFENSIVE_ABILITY_IDS[i]);
  1465. player.getActionbar().setCooldown(mapId, (int) (player.getActionbar().getCoolDown(mapId) + 10));
  1466. }
  1467. player.getEffectsManager().removeEffect(EffectType.REFLECT);
  1468. player.getEffectsManager().removeEffect(EffectType.RESONANCE);
  1469. player.getEffectsManager().removeEffect(EffectType.BARRICADE);
  1470. player.getEffectsManager().removeEffect(EffectType.IMMORTALITY);
  1471. player.getEffectsManager().removeEffect(EffectType.DEVOTION);
  1472. }
  1473. long startTime = Utils.currentTimeMillis();
  1474. long arriveTime = startTime + (15000);// arrives after 3 seconds
  1475. double speed = Utils.getProjectileSpeed(fromLocation, player, 5, 20, startTime, arriveTime);
  1476. Projectile projectile = World.sendProjectileNew(fromLocation, player, 4016, 5, 20, 10, speed, 0, 0);
  1477. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1478. Vorago thisNPC = this;
  1479. GameExecutorManager.fastExecutor.schedule(new TimerTask() {
  1480.  
  1481. @Override
  1482. public void run() {
  1483. int damage = CombatScript.getMaxHit(thisNPC, 5000, NPCCombatDefinitions.MAGE, player);
  1484. player.setNextGraphics(new Graphics(4017));
  1485. CombatScript.delayHit(thisNPC, 0, player, CombatScript.getMagicHit(thisNPC, damage));
  1486. }
  1487. }, (cycleTime * 1000) - 950);
  1488. }
  1489.  
  1490. public void sendRedBombAttack(Player player, WorldTile fromLocation) {
  1491. long startTime = Utils.currentTimeMillis();
  1492. long arriveTime = startTime + (20000);// arrives after 4.2 seconds
  1493. double speed = Utils.getProjectileSpeed(fromLocation, player, 5, 20, startTime, arriveTime);
  1494. Projectile projectile = World.sendProjectileNew(fromLocation, player, 4023, 5, 20, 10, speed, 0, 0);
  1495. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1496. Vorago thisNPC = this;
  1497. GameExecutorManager.fastExecutor.schedule(new TimerTask() {
  1498.  
  1499. @Override
  1500. public void run() {
  1501. for (Player p : instance.getPlayersOnBattle()) {
  1502. if (p == null || p.isDead() || Utils.getDistance(p, player) > 2)
  1503. continue;
  1504. int damage = 2000 + (getPlayersNearby(player, 3) * 1000);
  1505. p.setNextGraphics(new Graphics(4024));
  1506. World.sendGraphics(null, new Graphics(3522), new WorldTile(p.getX(), p.getY(), p.getPlane()));
  1507. for (int i = 0; i < Vorago.DEFENSIVE_ABILITY_IDS.length; i++) {
  1508. int mapId = ClientScriptMap
  1509. .getMap(ActionBar.CS_DATA_ID[ActionBar.DEFENCE_ABILITY_SHORTCUT - 1]).getIntValue(
  1510. Vorago.DEFENSIVE_ABILITY_IDS[i]);
  1511. p.getActionbar().setCooldown(mapId, (int) (p.getActionbar().getCoolDown(mapId) + 4));
  1512. }
  1513. p.getEffectsManager().removeEffect(EffectType.RESONANCE);
  1514. p.getEffectsManager().removeEffect(EffectType.IMMORTALITY);
  1515. p.getEffectsManager().removeEffect(EffectType.DEVOTION);
  1516. p.getEffectsManager().removeEffect(EffectType.REFLECT);
  1517. CombatScript.delayHit(thisNPC, 0, p, new Hit(thisNPC, damage, HitLook.REGULAR_DAMAGE));
  1518. p.getEffectsManager().removeEffect(EffectType.BARRICADE);
  1519. }
  1520. }
  1521. }, (cycleTime * 1000) - 950);
  1522. }
  1523.  
  1524. // north 0 - east - 1 south - 2 west - 3
  1525.  
  1526. public void sendTeamSplit() {
  1527. if (getTemporaryAttributtes().get("CantBeAttackedOnPhaseStart") != null)
  1528. getTemporaryAttributtes().remove("CantBeAttackedOnPhaseStart");
  1529. setNextAnimation(new Animation(20322));
  1530. getTemporaryAttributtes().put("CantBeAttacked", "Vorago is invulnerable as he charges a massive fire attack!");
  1531. WorldTile greenSpawnLocation = getRandomUsableLocation();
  1532. WorldTile redSpawnLocation = getRandomUsableLocation(greenSpawnLocation);
  1533. ArrayList<WorldTile> redSafeLocations = new ArrayList<WorldTile>();
  1534. ArrayList<WorldTile> greenSafeLocations = new ArrayList<WorldTile>();
  1535. int startYGreen = greenSpawnLocation.getY() - 2;
  1536. int startYRed = redSpawnLocation.getY() - 2;
  1537. int index = 0;
  1538. for (int i = 0; i < 4; i++) {
  1539. for (int j = 0; j < 4; j++) {
  1540. WorldTile loc = (index >= 0 && index < 8) ? new WorldTile(redSpawnLocation.getX() + i, startYRed + j,
  1541. redSpawnLocation.getPlane()) : new WorldTile(greenSpawnLocation.getX()
  1542. + ((i >= 2) ? (i - 2) : i), startYGreen + j, greenSpawnLocation.getPlane());
  1543. int rot = (i == 0 || i == 2) ? ((j == 0) ? 0 : (j == 1 || j == 2) ? 3 : 2) : ((j == 0) ? 0
  1544. : (j == 1 || j == 2) ? 1 : 2);
  1545. if ((j == 1 || j == 2) && (index >= 0 && index < 8))
  1546. redSafeLocations.add(loc);
  1547. else if ((j == 1 || j == 2) && (index >= 8))
  1548. greenSafeLocations.add(loc);
  1549. teamSplitSquares[index] = new WorldObject((index >= 0 && index < 8) ? 88882 : 88881, 22, rot, loc);
  1550. World.spawnObject(teamSplitSquares[index]);
  1551. index++;
  1552. }
  1553. }
  1554. ArrayList<Player> players = new ArrayList<Player>();
  1555. int playersCount = 0;
  1556. for (Player player : instance.getPlayersOnBattle()) {
  1557. if (player == null || player.isDead())
  1558. continue;
  1559. players.add(player);
  1560. playersCount++;
  1561. }
  1562. Collections.shuffle(players);
  1563. int playersInTeam = 0;
  1564. boolean redTeam = Utils.random(2) == 0;
  1565. Colour red = new Colour(0, 510, 50, 110, 70, 130);
  1566. Colour green = new Colour(0, 510, 70, 110, 50, 130);
  1567. for (int i = 0; i < playersCount; i += 2) {
  1568. Player player = players.get(i);
  1569. if (player == null || player.isDead())
  1570. continue;
  1571. player.getTemporaryAttributtes().put("TeamSplitRed", redTeam);
  1572. player.setNextColour(redTeam ? red : green);
  1573. playersInTeam++;
  1574. }
  1575. int playersLeft = (playersCount - playersInTeam);
  1576. for (int i = playersLeft; i > 0; i--) {
  1577. for (Player player : players) {
  1578. if (player == null || player.isDead() || player.getTemporaryAttributtes().get("TeamSplitRed") != null)
  1579. continue;
  1580. player.getTemporaryAttributtes().put("TeamSplitRed", !redTeam);
  1581. player.setNextColour(redTeam ? green : red);
  1582. break;
  1583. }
  1584. }
  1585. for (Player player : instance.getPlayersOnBattle()) {
  1586. if (player == null || player.isDead())
  1587. continue;
  1588. player.getPackets().sendGameMessage("Vorago's raw power disrupts your defensive abilities!");
  1589. for (int i = 0; i < DEFENSIVE_ABILITY_IDS.length; i++) {
  1590. int mapId = ClientScriptMap.getMap(ActionBar.CS_DATA_ID[ActionBar.DEFENCE_ABILITY_SHORTCUT - 1])
  1591. .getIntValue(DEFENSIVE_ABILITY_IDS[i]);
  1592. player.getActionbar().setCooldown(mapId, (int) (player.getActionbar().getCoolDown(mapId) + 19));
  1593. }
  1594. player.getEffectsManager().removeEffect(EffectType.REFLECT);
  1595. player.getEffectsManager().removeEffect(EffectType.RESONANCE);
  1596. player.getEffectsManager().removeEffect(EffectType.BARRICADE);
  1597. player.getEffectsManager().removeEffect(EffectType.IMMORTALITY);
  1598. player.getEffectsManager().removeEffect(EffectType.DEVOTION);
  1599. VoragoInstance.sendMessage(player, 1,
  1600. "<col=ff0000>Vorago starts to charge all his power into a massive fire attack!");
  1601. }
  1602. Entity lastTarget = getCombat().getTarget();
  1603. getCombat().removeTarget();
  1604. cancelFaceEntityNoCheck();
  1605. Vorago thisNPC = this;
  1606. WorldTasksManager.schedule(new WorldTask() {
  1607. int count = 0;
  1608.  
  1609. @Override
  1610. public void run() {
  1611. if (getHitpoints() == 0) {
  1612. stop();
  1613. return;
  1614. }
  1615. switch (count) {
  1616. case 12:
  1617. setNextAnimation(new Animation(20323));
  1618. break;
  1619. case 13:
  1620. setNextAnimation(new Animation(20323));
  1621. setNextGraphics(new Graphics(4013));
  1622. setNextFaceEntity(lastTarget == null ? getRandomTarget(new WorldTile(thisNPC), null, 24)
  1623. : lastTarget);
  1624. getTemporaryAttributtes().remove("CantBeAttacked");
  1625. for (Player player : instance.getPlayersOnBattle()) {
  1626. if (player == null || player.isDead())
  1627. continue;
  1628. boolean isInRedTeam = (boolean) player.getTemporaryAttributtes().get("TeamSplitRed");
  1629. if ((isInRedTeam && isSafe(new WorldTile(player.getX(), player.getY(), player.getPlane()),
  1630. redSafeLocations))
  1631. || (!isInRedTeam && isSafe(
  1632. new WorldTile(player.getX(), player.getY(), player.getPlane()),
  1633. greenSafeLocations)))
  1634. continue;
  1635. player.applyHit(new Hit(thisNPC, 8000, HitLook.REGULAR_DAMAGE));
  1636. player.getTemporaryAttributtes().remove("TeamSplitRed");
  1637. }
  1638. getCombat().setTarget(lastTarget);
  1639. break;
  1640. case 14:
  1641. for (int i = 0; i < teamSplitSquares.length; i++) {
  1642. WorldObject square = teamSplitSquares[i];
  1643. if (World.containsObjectWithId(new WorldTile(square), 88882)
  1644. || World.containsObjectWithId(new WorldTile(square), 88881))
  1645. World.removeObject(square);
  1646. teamSplitSquares[i] = null;
  1647. }
  1648. stop();
  1649. break;
  1650. }
  1651. count++;
  1652. }
  1653. }, 0, 0);
  1654. }
  1655.  
  1656. public void sendGreenBomb() {
  1657. setNextAnimation(new Animation(20371));
  1658. setNextGraphics(new Graphics(4268));
  1659. WorldTile voragoSquare = phase == 5 ? this : getVoragoSquare();
  1660. WorldTile mistLocation = phase == 5 ? getTile(new WorldTile(3092, 5984, 0)) : getRandomUsableLocation();
  1661. int distance = Utils.getDistance(voragoSquare, mistLocation);
  1662. double speed = 0.04 + (distance / 24.00);
  1663. Projectile projectile = World.sendProjectileNew(this, mistLocation, 4269, 90, 0, 10, speed, 0, 0);
  1664. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1665. Vorago thisNPC = this;
  1666. greenBombP = null;
  1667. WorldTasksManager.schedule(new WorldTask() {
  1668. @Override
  1669. public void run() {
  1670. if (phase != 5) {
  1671. int index = getAvailableMistIndex();
  1672. if (index != -1) {
  1673. mists[index] = new WorldObject(87322, 10, 0, new WorldTile(mistLocation.getX() - 5,
  1674. mistLocation.getY() - 3, mistLocation.getPlane()));
  1675. World.spawnObject(mists[index]);
  1676. }
  1677. }
  1678. for (Player player : instance.getPlayersOnBattle()) {
  1679. if (player == null || player.isDead())
  1680. continue;
  1681. player.getTemporaryAttributtes().remove("GreenBombed");
  1682. }
  1683. greenBombBounces = (phase == 3) ? 5 : 4;
  1684. greenBombP = getRandomTarget(mistLocation, null, 24);
  1685. VoragoInstance.sendMessage(greenBombP, 1,
  1686. "<col=ff0000>Vorago has sent a green bomb after you. Run!</col>");
  1687. int distance = Utils.getDistance(mistLocation, new WorldTile(greenBombP));
  1688. double speed = 0.02 + (distance / 24.00);
  1689. int angle = (int) Math.round(Math.toDegrees(Math.atan2(
  1690. (mistLocation.getX() * 2 + 1) - (greenBombP.getX() * 2 + greenBombP.getSize()),
  1691. (mistLocation.getY() * 2 + 1) - (greenBombP.getY() * 2 + greenBombP.getSize()))) / 45d) & 0x7;
  1692. Projectile projectile = World.sendProjectileNew(mistLocation, new WorldTile(greenBombP), 4269, 0, 10,
  1693. 10, speed, angle, 0);
  1694. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1695. WorldTasksManager.schedule(new WorldTask() {
  1696. int count = 0;
  1697. int startTime = cycleTime;
  1698.  
  1699. @Override
  1700. public void run() {
  1701. if (greenBombBounces == 0 || getHitpoints() == 0) {
  1702. greenBombP = null;
  1703. for (Player player : instance.getPlayersOnBattle()) {
  1704. if (player == null || player.isDead())
  1705. continue;
  1706. player.getTemporaryAttributtes().remove("GreenBombed");
  1707. }
  1708. stop();
  1709. return;
  1710. }
  1711. if (count == startTime) {
  1712. if (getPlayersNearby(greenBombP, 2) == 0
  1713. || (greenBombP.getTemporaryAttributtes().get("GreenBombed") != null && greenBombBounces != 1)) {
  1714. greenBombP.setNextGraphics(new Graphics(4270));
  1715. greenBombP.applyHit(new Hit(thisNPC, 10000, HitLook.REGULAR_DAMAGE));
  1716. if (greenBombP.getCombatDefinitions().isAutoRelatie() && !greenBombP.hasWalkSteps())
  1717. greenBombP.getActionManager().setAction(new PlayerCombatNew(thisNPC));
  1718. if (phase == 3)
  1719. attackProgress = attackProgress < 10 ? 6 : 16;
  1720. greenBombBounces = 0;
  1721. greenBombP.getTemporaryAttributtes().remove("GreenBombed");
  1722. greenBombP = null;
  1723. stop();
  1724. return;
  1725. }
  1726. for (Player player : instance.getPlayersOnBattle()) {
  1727. if (player == null || player.isDead() || !Utils.isOnRange(player, greenBombP, 0)
  1728. || greenBombBounces == 1)
  1729. continue;
  1730. player.applyHit(new Hit(thisNPC, 1000, HitLook.REGULAR_DAMAGE));
  1731. int perc = player.getCombatDefinitions().getSpecialAttackPercentage();
  1732. if (perc != 0)
  1733. player.getCombatDefinitions().desecreaseSpecialAttack(perc < 10 ? (10 - perc) : 10);
  1734. }
  1735. Player p2 = getRandomTarget(new WorldTile(greenBombP), greenBombP, 2);
  1736. int distance = Utils.getDistance(new WorldTile(greenBombP), new WorldTile(p2));
  1737. double speed = 0.02 + (distance / 24.00);
  1738. int angle = (int) Math
  1739. .round(Math.toDegrees(Math.atan2(
  1740. (greenBombP.getX() * 2 + greenBombP.getSize())
  1741. - (p2.getX() * 2 + p2.getSize()),
  1742. (greenBombP.getY() * 2 + greenBombP.getSize())
  1743. - (p2.getY() * 2 + p2.getSize()))) / 45d) & 0x7;
  1744. Projectile projectile = World.sendProjectileNew(new WorldTile(greenBombP),
  1745. new WorldTile(p2), 4269, 10, 30, 10, speed, angle, 0);
  1746. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1747. count = 0;
  1748. startTime = cycleTime;
  1749. greenBombP.getTemporaryAttributtes().put("GreenBombed", Boolean.TRUE);
  1750. greenBombP = p2;
  1751. greenBombBounces--;
  1752. return;
  1753. }
  1754. count++;
  1755. }
  1756. }, 0, 0);
  1757. }
  1758. }, cycleTime);
  1759. }
  1760.  
  1761. public boolean isUnderMist(Player player) {
  1762. for (WorldObject mist : mists) {
  1763. if (mist == null)
  1764. continue;
  1765. WorldTile centerM = new WorldTile(mist.getX() + 5, mist.getY() + 3, mist.getY());
  1766. if (player.getX() >= (centerM.getX() - 4) && player.getX() <= (centerM.getX() + 4)
  1767. && player.getY() >= (centerM.getY() - 4) && player.getY() <= (centerM.getY() + 4))
  1768. return true;
  1769. }
  1770. return false;
  1771. }
  1772.  
  1773. public int getPlayersNearby(Player target, int withinDistance) {
  1774. int count = 0;
  1775. for (Player player : instance.getPlayersOnBattle()) {
  1776. if (player == null || player.isDead() || Utils.getDistance(target, player) > withinDistance
  1777. || player == target)
  1778. continue;
  1779. count++;
  1780. }
  1781. return count > 5 ? 5 : count;
  1782. }
  1783.  
  1784. public Player getRandomTarget(WorldTile tile, Player exception, int maxDistance) {
  1785. List<Player> availablePlayers = new ArrayList<Player>();
  1786. for (int i = 0; i < instance.getPlayersOnBattle().size(); i++) {
  1787. Player player = instance.getPlayersOnBattle().get(i);
  1788. if (player == null || player.isDead() || (exception != null && player == exception)
  1789. || Utils.getDistance(tile, player) > maxDistance)
  1790. continue;
  1791. availablePlayers.add(player);
  1792. }
  1793. return availablePlayers.isEmpty() ? null : availablePlayers.get(Utils.random(availablePlayers.size() - 1));
  1794. }
  1795.  
  1796. public int getAvailableMistIndex() {
  1797. for (int i = 0; i < mists.length; i++) {
  1798. if (mists[i] == null)
  1799. return i;
  1800. }
  1801. return -1;
  1802. }
  1803.  
  1804. public boolean sendVitalisOrb() {
  1805. if (phase == 5 && !World.checkWalkStep(getPlane(), getX() - 5, getY() + 2, 1, 1))
  1806. return false;
  1807. setNextAnimation(new Animation(20328));
  1808. setNextGraphics(new Graphics(4026));
  1809. WorldTile closestVitalisSpawn = phase == 5 ? new WorldTile(getX() - 5, getY() + 2, getPlane())
  1810. : getVitalisSpawnLocation();
  1811. Projectile projectile = World.sendProjectileNew(this, closestVitalisSpawn, 4027, 0, 0, 10, 0.3, 0, 0);
  1812. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  1813. Vorago thisNPC = this;
  1814. WorldTasksManager.schedule(new WorldTask() {
  1815. int vitalisCount = phase == 5 ? 3 : 5;
  1816.  
  1817. @Override
  1818. public void run() {
  1819. World.sendGraphics(null, new Graphics(4047), closestVitalisSpawn);
  1820. for (Player player : instance.getPlayersOnBattle()) {
  1821. if (player == null
  1822. || player.isDead()
  1823. || !isInSquare(player, closestVitalisSpawn.getX() - 2, closestVitalisSpawn.getX() + 2,
  1824. closestVitalisSpawn.getY() - 2, closestVitalisSpawn.getY() + 2))
  1825. continue;
  1826. vitalisCount--;
  1827. CombatScript.delayHit(thisNPC, 0, player, new Hit(thisNPC, 2000, HitLook.REGULAR_DAMAGE));
  1828. player.setNextGraphics(new Graphics(4028));
  1829. }
  1830. for (int i = 0; i < vitalisCount; i++) {
  1831. WorldTile spawnTile = instance.randomSpawnTile(null, closestVitalisSpawn, phase == 5 ? 1 : 2);
  1832. int index = getAvailableIndex();
  1833. if (index == -1)
  1834. continue;
  1835. vitali[index] = new Vitalis(17157, spawnTile, -1, true, thisNPC);
  1836. vitali[index].setNextAnimation(new Animation(20381));
  1837. }
  1838. }
  1839. }, cycleTime);
  1840. return true;
  1841. }
  1842.  
  1843. public void sendVitalisDeath(Vitalis vitalis) {
  1844. for (int i = 0; i < vitali.length; i++) {
  1845. if (vitali[i] == vitalis)
  1846. vitali[i] = null;
  1847. }
  1848. }
  1849.  
  1850. public int getAvailableIndex() {
  1851. for (int i = 0; i < vitali.length; i++) {
  1852. if (vitali[i] == null)
  1853. return i;
  1854. }
  1855. return -1;
  1856. }
  1857.  
  1858. private boolean isInSquare(WorldTile tile, int smallestX, int largestX, int smallestY, int largestY) {
  1859. return (tile.getX() >= smallestX && tile.getX() <= largestX && tile.getY() >= smallestY && tile.getY() <= largestY);
  1860. }
  1861.  
  1862. private WorldTile getVitalisSpawnLocation() {
  1863. WorldTile[] jumpLocationsPhase = new WorldTile[locations.length];
  1864. for (int i = 0; i < jumpLocationsPhase.length; i++) {
  1865. switch (phase) {
  1866. case 3:
  1867. jumpLocationsPhase[i] = getTile(new WorldTile(locations[i].getX(), locations[i].getY() - 64,
  1868. locations[i].getPlane()));
  1869. break;
  1870. case 4:
  1871. jumpLocationsPhase[i] = getTile(new WorldTile(locations[i].getX() - 64, locations[i].getY() - 128,
  1872. locations[i].getPlane()));
  1873. break;
  1874. }
  1875. }
  1876. WorldTile voragoSquare = getVoragoSquare();
  1877. List<WorldTile> closestLocations = new ArrayList<WorldTile>();
  1878. if (voragoSquare.getX() == jumpLocationsPhase[4].getX() && voragoSquare.getY() == jumpLocationsPhase[4].getY()) {
  1879. closestLocations.add(jumpLocationsPhase[1]);
  1880. closestLocations.add(jumpLocationsPhase[2]);
  1881. closestLocations.add(jumpLocationsPhase[5]);
  1882. } else {
  1883. for (int i = 0; i < jumpLocationsPhase.length; i++) {
  1884. WorldTile close = jumpLocationsPhase[i];
  1885. if (close.getX() == voragoSquare.getX() && close.getY() == voragoSquare.getY())
  1886. continue;
  1887. if (Utils.getDistance(close, voragoSquare) > 12)
  1888. continue;
  1889. closestLocations.add(close);
  1890. }
  1891. }
  1892. return closestLocations.get(Utils.random(closestLocations.size() - 1));
  1893. }
  1894.  
  1895. public WorldTile getVoragoSquare() {
  1896. WorldTile[] jumpLocationsPhase = new WorldTile[locations.length];
  1897. for (int i = 0; i < jumpLocationsPhase.length; i++) {
  1898. switch (phase) {
  1899. case 3:
  1900. jumpLocationsPhase[i] = getTile(new WorldTile(locations[i].getX(), locations[i].getY() - 64,
  1901. locations[i].getPlane()));
  1902. break;
  1903. case 4:
  1904. jumpLocationsPhase[i] = getTile(new WorldTile(locations[i].getX() - 64, locations[i].getY() - 128,
  1905. locations[i].getPlane()));
  1906. break;
  1907. }
  1908. }
  1909. for (int i = 0; i < jumpLocationsPhase.length; i++) {
  1910. WorldTile center = jumpLocationsPhase[i];
  1911. if (getX() >= (center.getX() - 3) && getX() <= (center.getX() + 3) && getY() >= (center.getY() - 3)
  1912. && getY() <= (center.getY() + 3))
  1913. return center;
  1914. }
  1915. return null;
  1916. }
  1917.  
  1918. public void spawnScopuli() {
  1919. WorldTile center = instance.getVoragoSpawnLocation(phase);
  1920. WorldTile spawnLocation = new WorldTile(center.getX() - 2, center.getY() - 4, center.getPlane());
  1921. for (int i = 0; i < scopuli.length; i++) {
  1922. scopuli[i] = new Scopulus(17185, i == 0 ? spawnLocation : new WorldTile(spawnLocation.getX() + 10,
  1923. spawnLocation.getY(), spawnLocation.getPlane()), -1, true, this);
  1924. }
  1925. }
  1926.  
  1927. public void sendScopulusDeath(Scopulus scop) {
  1928. int index = 0;
  1929. for (int i = 0; i < scopuli.length; i++) {
  1930. if (scopuli[i] == scop)
  1931. scopuli[i] = null;
  1932. else
  1933. index = i;
  1934. }
  1935. if (getScopuliCount() == 1) {
  1936. Scopulus aliveScop = scopuli[index];
  1937. if (aliveScop != null && !aliveScop.isDead()) {
  1938. aliveScop.setNextForceTalk(new ForceTalk("RAAAAAAAAGGGGHHH"));
  1939. aliveScop.heal(15000);
  1940. }
  1941. }
  1942. if (getScopuliCount() == 0)
  1943. sendDeath(null);
  1944. }
  1945.  
  1946. public int getScopuliCount() {
  1947. int count = 0;
  1948. for (int i = 0; i < scopuli.length; i++) {
  1949. if (scopuli[i] == null || scopuli[i].isDead())
  1950. continue;
  1951. count++;
  1952. }
  1953. return count;
  1954. }
  1955.  
  1956. public boolean canSendCeilingCollapse() {
  1957. int count = 0;
  1958. for (WorldObject ceiling : ceilingCollapses) {
  1959. if (ceiling == null)
  1960. continue;
  1961. count++;
  1962. }
  1963. return count < 6;
  1964. }
  1965.  
  1966. public boolean sendCeilingCollapse() {
  1967. if (!canSendCeilingCollapse())
  1968. return false;
  1969. setNextAnimation(new Animation(20369));
  1970. WorldTile usableLocation = getRandomUsableLocation();
  1971. WorldTile jumpLocation = getRandomUsableLocation(usableLocation);
  1972. WorldTile ceilingLocation = new WorldTile(usableLocation.getX() - 5, usableLocation.getY() - 3,
  1973. usableLocation.getPlane());
  1974. WorldTasksManager.schedule(new WorldTask() {
  1975. int count = 0;
  1976.  
  1977. @Override
  1978. public void run() {
  1979. switch (count) {
  1980. case 3:
  1981. World.sendGraphics(null, new Graphics(4025), usableLocation);
  1982. break;
  1983. case 5:
  1984. setNextFaceWorldTile(jumpLocation);
  1985. setNextAnimation(new Animation(20365));
  1986. break;
  1987. case 7:
  1988. spawnCeilingCollapse(ceilingLocation);
  1989. setNextAnimation(new Animation(20367));
  1990. setNextWorldTile(new WorldTile(jumpLocation.getX() - 2, jumpLocation.getY() - 2, 0));
  1991. break;
  1992. case 9:
  1993. for (Player player : instance.getPlayersOnBattle()) {
  1994. if (player == null || player.isDead() || !isStuckUnderRock(player, null))
  1995. continue;
  1996. player.lock(1);
  1997. player.setNextWorldTile(new WorldTile(getX(), getY(), getPlane()));
  1998. }
  1999. stop();
  2000. break;
  2001. }
  2002. count++;
  2003. }
  2004.  
  2005. }, 0, 1);
  2006. return true;
  2007. }
  2008.  
  2009. private void spawnCeilingCollapse(WorldTile ceilingLocation) {
  2010. spawnCeilingCollapse(ceilingLocation, null);
  2011. }
  2012.  
  2013. public void spawnCeilingCollapse(WorldTile ceilingLocation, WorldObject ceiling) {
  2014. World.spawnObject(new WorldObject(84963, 10, 3, ceilingLocation));
  2015. Vorago thisNPC = this;
  2016. WorldTasksManager.schedule(new WorldTask() {
  2017. @Override
  2018. public void run() {
  2019. World.removeObject(World.getObjectWithId(ceilingLocation, 84963));
  2020. if (ceiling == null)
  2021. for (int i = 0; i < ceilingCollapses.length; i++) {
  2022. if (ceilingCollapses[i] == null) {
  2023. ceilingCollapses[i] = new WorldObject(84962, 10, 3, ceilingLocation);
  2024. World.spawnObject(ceilingCollapses[i]);
  2025. break;
  2026. }
  2027. }
  2028. else
  2029. World.spawnObject(ceiling);
  2030. int underRock = getPlayersUnderRock(ceilingLocation);
  2031. int damage = (underRock == 0) ? 0 : (8000 / underRock);
  2032. if (damage == 0)
  2033. return;
  2034. for (Player player : instance.getPlayersOnBattle()) {
  2035. if (player == null || player.isDead() || !isStuckUnderRock(player, ceilingLocation))
  2036. continue;
  2037. player.setNextAnimation(new Animation(20338));
  2038. WorldTile toTile = findBestLocation(new WorldTile(player), ceilingLocation);
  2039. if (toTile != null) {
  2040. player.setNextForceMovement(new ForceMovement(toTile, 1, getMoveDirection(player)));
  2041. player.setNextWorldTile(toTile);
  2042. }
  2043. player.applyHit(new Hit(thisNPC, damage, HitLook.REGULAR_DAMAGE));
  2044. }
  2045. }
  2046. }, 0);
  2047. }
  2048.  
  2049. public WorldTile findBestLocation(WorldTile playerL, WorldTile ceilingL) {
  2050. ArrayList<WorldTile> unCheckedTeleTiles = new ArrayList<WorldTile>();
  2051. for (int x = (ceilingL.getX() - 1); x <= ceilingL.getX() + 10; x++) {
  2052. for (int y = (ceilingL.getY() - 1); y <= ceilingL.getY() + 10; y++) {
  2053. unCheckedTeleTiles.add(new WorldTile(x, y, ceilingL.getPlane()));
  2054. }
  2055. }
  2056. ArrayList<WorldTile> checkedTeleTiles = new ArrayList<WorldTile>();
  2057. for (WorldTile checkTile : unCheckedTeleTiles) {
  2058. if (instance.ignoreTile(checkTile)
  2059. || !World.isTileFree(checkTile.getPlane(), checkTile.getX(), checkTile.getY(), 1))
  2060. continue;
  2061. checkedTeleTiles.add(checkTile);
  2062. }
  2063. int farestDistance = Integer.MAX_VALUE;
  2064. int index = 0;
  2065. for (int i = 0; i < checkedTeleTiles.size(); i++) {
  2066. WorldTile checkedTile = checkedTeleTiles.get(i);
  2067. int distance = Utils.getDistance(checkedTile, playerL);
  2068. if (distance < farestDistance) {
  2069. index = i;
  2070. farestDistance = distance;
  2071. }
  2072. }
  2073. return checkedTeleTiles.isEmpty() ? null : checkedTeleTiles.get(index);
  2074. }
  2075.  
  2076. // (3104, 6111, 0)
  2077.  
  2078. public void removeMiddleCeilingObject() {
  2079. WorldTile middleCeilingLocation = getTile(new WorldTile(3035, 5980, 0));
  2080. if (getCeilingIndex(middleCeilingLocation) == -1)
  2081. return;
  2082. WorldObject middleCeiling = ceilingCollapses[getCeilingIndex(middleCeilingLocation)];
  2083. if (middleCeiling == null)
  2084. return;
  2085. World.removeObject(middleCeiling);
  2086. ceilingCollapses[getCeilingIndex(middleCeilingLocation)] = null;
  2087. }
  2088.  
  2089. public boolean isStuckUnderRock(Player player, WorldTile location) {
  2090. if (location != null) {
  2091. if (player.getX() >= (location.getX() + 1) && player.getX() <= (location.getX() + 8)
  2092. && player.getY() >= (location.getY() + 1) && player.getY() <= (location.getY() + 8))
  2093. return true;
  2094. return false;
  2095. }
  2096. for (WorldObject ceiling : ceilingCollapses) {
  2097. if (ceiling == null)
  2098. continue;
  2099. if (player.getX() >= (ceiling.getX() + 1) && player.getX() <= (ceiling.getX() + 8)
  2100. && player.getY() >= (ceiling.getY() + 1) && player.getY() <= (ceiling.getY() + 8))
  2101. return true;
  2102. }
  2103. return false;
  2104. }
  2105.  
  2106. public int getPlayersUnderRock(WorldTile ceilingLocation) {
  2107. int count = 0;
  2108. for (Player player : instance.getPlayersOnBattle()) {
  2109. if (player == null || player.isDead() || !isStuckUnderRock(player, ceilingLocation))
  2110. continue;
  2111. count++;
  2112. }
  2113. return count;
  2114. }
  2115.  
  2116. public int getCeilingIndex(WorldTile tile) {
  2117. for (int i = 0; i < ceilingCollapses.length; i++) {
  2118. WorldObject ceiling = ceilingCollapses[i];
  2119. if (ceiling == null)
  2120. continue;
  2121. if (ceiling.getX() == tile.getX() && ceiling.getY() == tile.getY() && ceiling.getPlane() == tile.getPlane())
  2122. return i;
  2123. }
  2124. return -1;
  2125. }
  2126.  
  2127. public void sendCrackGround() {
  2128. int[] xstart = { 3090, 3026, 3090, 3026 };
  2129. int[] ystart = { 6098, 6034, 6034, 5970 };
  2130. World.spawnObjectTemporary(new WorldObject(84873, 10, 1, getTile(new WorldTile(xstart[phase - 1],
  2131. ystart[phase - 1], 0))), 5000);
  2132. World.spawnObjectTemporary(new WorldObject(84871, 10, 1, getTile(new WorldTile(xstart[phase - 1],
  2133. ystart[phase - 1] + 9, 0))), 5000);
  2134. World.spawnObjectTemporary(new WorldObject(84873, 10, 2, getTile(new WorldTile(xstart[phase - 1],
  2135. ystart[phase - 1] + 18, 0))), 5000);
  2136. World.spawnObjectTemporary(new WorldObject(84871, 10, 0, getTile(new WorldTile(xstart[phase - 1] + 9,
  2137. ystart[phase - 1], 0))), 5000);
  2138. World.spawnObjectTemporary(new WorldObject(84869, 10, 0, getTile(new WorldTile(xstart[phase - 1] + 9,
  2139. ystart[phase - 1] + 9, 0))), 5000);
  2140. World.spawnObjectTemporary(new WorldObject(84871, 10, 2, getTile(new WorldTile(xstart[phase - 1] + 9,
  2141. ystart[phase - 1] + 18, 0))), 5000);
  2142. World.spawnObjectTemporary(new WorldObject(84873, 10, 0, getTile(new WorldTile(xstart[phase - 1] + 18,
  2143. ystart[phase - 1], 0))), 5000);
  2144. World.spawnObjectTemporary(new WorldObject(84871, 10, 3, getTile(new WorldTile(xstart[phase - 1] + 18,
  2145. ystart[phase - 1] + 9, 0))), 5000);
  2146. World.spawnObjectTemporary(new WorldObject(84873, 10, 3, getTile(new WorldTile(xstart[phase - 1] + 18,
  2147. ystart[phase - 1] + 18, 0))), 5000);
  2148. }
  2149.  
  2150. public void spawnGravityField() {
  2151. if (phaseProgress == 5)
  2152. return;
  2153. if (gravityField != null) {
  2154. World.removeObject(gravityField);
  2155. }
  2156. WorldTile wrongLocation = locations[Utils.random(8)];
  2157. WorldTile spawnTile = instance.getTile(new WorldTile(wrongLocation.getX() - 64, wrongLocation.getY() - 64,
  2158. wrongLocation.getPlane()));
  2159. gravityField = new WorldObject(84959, 10, 1, spawnTile);
  2160. World.spawnObject(gravityField);
  2161. }
  2162.  
  2163. public void fireGravityField(Player player) {
  2164. if (player.isLocked())
  2165. return;
  2166. if (player.getTemporaryAttributtes().get("FiringGravityField") != null)
  2167. return;
  2168. if (!Utils.isOnRange(new WorldTile(gravityField.getX(), gravityField.getY(), gravityField.getPlane()), this, 7,
  2169. 1, getSize())) {
  2170. player.getPackets().sendGameMessage("<col=ff0000>Vorago is not close enough!</col>");
  2171. return;
  2172. }
  2173. player.getTemporaryAttributtes().put("FiringGravityField", Boolean.TRUE);
  2174. player.lock(3);
  2175. Projectile projectile = World.sendProjectileNew(new WorldTile(gravityField.getX(), gravityField.getY(), 0),
  2176. this, 4029, 0, 30, 10, 0.5, 30, 1);
  2177. int cycleTime = Utils.projectileTimeToCycles(projectile.getEndTime()) - 1;
  2178. World.removeObject(gravityField);
  2179. phaseProgress++;
  2180. gravityField = null;
  2181. WorldTasksManager.schedule(new WorldTask() {
  2182. @Override
  2183. public void run() {
  2184. setNextGraphics(new Graphics(4030));
  2185. player.getTemporaryAttributtes().remove("FiringGravityField");
  2186. if (phaseProgress == 4) {
  2187. sendBringHimDown();
  2188. }
  2189. }
  2190. }, cycleTime);
  2191. }
  2192.  
  2193. @Override
  2194. public void setFinished(boolean finished) {
  2195. removeLeftOvers();
  2196. super.setFinished(finished);
  2197. }
  2198.  
  2199. public WorldTile getRandomUsableLocation() {
  2200. return getRandomUsableLocation(null);
  2201. }
  2202.  
  2203. public WorldTile getRandomUsableLocation(WorldTile exception) {
  2204. return getRandomUsableLocation(exception, false);
  2205. }
  2206.  
  2207. public WorldTile getRandomUsableLocation(WorldTile exception, boolean atPhaseFinish) {
  2208. WorldTile[] locs = new WorldTile[9];
  2209. for (int i = 0; i < locations.length; i++) {
  2210. switch (phase) {
  2211. case 1:
  2212. locs[i] = getTile(locations[i]);
  2213. break;
  2214. case 2:
  2215. locs[i] = getTile(new WorldTile(locations[i].getX() - 64, locations[i].getY() - 64,
  2216. locations[i].getPlane()));
  2217. break;
  2218. case 3:
  2219. locs[i] = getTile(new WorldTile(locations[i].getX(), locations[i].getY() - 64, locations[i].getPlane()));
  2220. break;
  2221. case 4:
  2222. locs[i] = getTile(new WorldTile(locations[i].getX() - 64, locations[i].getY() - 128,
  2223. locations[i].getPlane()));
  2224. break;
  2225. }
  2226. }
  2227. List<WorldTile> availableLocations = new ArrayList<WorldTile>();
  2228. if (phase == 5) {
  2229. WorldTile[] locationsPhase5 = { getTile(new WorldTile(3092, 5985, 0)),
  2230. getTile(new WorldTile(3094, 5985, 0)), getTile(new WorldTile(3104, 5985, 0)),
  2231. getTile(new WorldTile(3106, 5985, 0)) };
  2232. for (int i = 0; i < locationsPhase5.length; i++) {
  2233. WorldTile checkLocation = locationsPhase5[i];
  2234. if ((exception != null && exception.matches(checkLocation)) || getX() < checkLocation.getX())
  2235. continue;
  2236. availableLocations.add(checkLocation);
  2237. }
  2238. } else {
  2239. for (int i = 0; i < locs.length; i++) {
  2240. WorldTile checkLocation = locs[i];
  2241. if (!atPhaseFinish
  2242. && ((World.containsObjectWithId(new WorldTile(checkLocation.getX() - 5,
  2243. checkLocation.getY() - 3, checkLocation.getPlane()),
  2244. Settings.VORAGO_ROTATION == 0 ? 84962 : 87322) && getAvailableMistIndex() != -1) || (exception != null && checkLocation
  2245. .matches(exception))))
  2246. continue;
  2247. availableLocations.add(checkLocation);
  2248. }
  2249. }
  2250. return availableLocations.get(Utils.random(availableLocations.size() - 1));
  2251. }
  2252.  
  2253. public int getMoveDirection(Player player) {
  2254. switch (player.getDirection()) {
  2255. case 10240:// north-east
  2256. return ForceMovement.NORTH_EAST;
  2257. case 6144:// north-west
  2258. return ForceMovement.NORTH_WEST;
  2259. case 2048:// south-west
  2260. return ForceMovement.SOUTH_WEST;
  2261. case 14336:// south-east
  2262. return ForceMovement.SOUTH_EAST;
  2263. case 4096:// west
  2264. return ForceMovement.WEST;
  2265. case 12288:// east
  2266. return ForceMovement.EAST;
  2267. case 8192:// north
  2268. return ForceMovement.NORTH;
  2269. case 0:// south
  2270. default:
  2271. return ForceMovement.SOUTH;
  2272. }
  2273. }
  2274.  
  2275. public boolean canFinishPhase() {
  2276. switch (phase) {
  2277. case 1:
  2278. return phaseProgress == 1;
  2279. case 2:
  2280. return phaseProgress == 5;
  2281. case 3:
  2282. return phaseProgress == 0;
  2283. case 4:
  2284. return phaseProgress == 3;
  2285. case 5:
  2286. return false;
  2287. }
  2288. return false;
  2289. }
  2290.  
  2291. public int getPhase() {
  2292. return phase;
  2293. }
  2294.  
  2295. public void setPhase(int phase) {
  2296. this.phase = phase;
  2297. }
  2298.  
  2299. public int getPhaseProgress() {
  2300. return phaseProgress;
  2301. }
  2302.  
  2303. public void setPhaseProgress(int phaseProgress) {
  2304. this.phaseProgress = phaseProgress;
  2305. }
  2306.  
  2307. public int getAttackProgress() {
  2308. return attackProgress;
  2309. }
  2310.  
  2311. public void setAttackProgress(int attackProgress) {
  2312. this.attackProgress = attackProgress;
  2313. }
  2314.  
  2315. public WorldObject[] getCeilingColapses() {
  2316. return ceilingCollapses;
  2317. }
  2318.  
  2319. public WorldObject getGravityField() {
  2320. return gravityField;
  2321. }
  2322.  
  2323. public Player getTargetedPlayer() {
  2324. return targetedPlayer;
  2325. }
  2326.  
  2327. public void setTargetedPlayer(Player targetedPlayer) {
  2328. this.targetedPlayer = targetedPlayer;
  2329. }
  2330.  
  2331. public int getBringHimPoints() {
  2332. return bringHimPoints;
  2333. }
  2334.  
  2335. public void setBringHimPoints(int bringHimPoints) {
  2336. this.bringHimPoints = bringHimPoints;
  2337. }
  2338.  
  2339. public WorldTile getTile(WorldTile tile) {
  2340. return instance.getTile(tile);
  2341. }
  2342.  
  2343. public VoragoInstance getVoragoInstance() {
  2344. return instance;
  2345. }
  2346. }
Advertisement
Add Comment
Please, Sign In to add comment