armark1ng

Untitled

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