armark1ng

Untitled

Jun 11th, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.37 KB | None | 0 0
  1. package com.rs.game;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Map;
  6. import java.util.Set;
  7. import java.util.concurrent.ConcurrentHashMap;
  8. import java.util.concurrent.ConcurrentLinkedQueue;
  9. import java.util.concurrent.CopyOnWriteArrayList;
  10. import java.util.concurrent.atomic.AtomicInteger;
  11.  
  12. import com.rs.Settings;
  13. import com.rs.cache.loaders.AnimationDefinitions;
  14. import com.rs.cache.loaders.ObjectDefinitions;
  15. import com.rs.game.EffectsManager.Effect;
  16. import com.rs.game.EffectsManager.EffectType;
  17. import com.rs.game.Hit.HitLook;
  18. import com.rs.game.map.MapUtils;
  19. import com.rs.game.map.MapUtils.Structure;
  20. import com.rs.game.npc.NPC;
  21. import com.rs.game.npc.familiar.Familiar;
  22. import com.rs.game.npc.nomad.Nomad;
  23. import com.rs.game.npc.qbd.TorturedSoul;
  24. import com.rs.game.player.Player;
  25. import com.rs.game.route.RouteFinder;
  26. import com.rs.game.route.strategy.EntityStrategy;
  27. import com.rs.game.route.strategy.FixedTileStrategy;
  28. import com.rs.game.route.strategy.ObjectStrategy;
  29. import com.rs.game.tasks.WorldTask;
  30. import com.rs.game.tasks.WorldTasksManager;
  31. import com.rs.utils.Utils;
  32.  
  33. public abstract class Entity extends WorldTile {
  34.  
  35. private static final long serialVersionUID = -3372926325008880753L;
  36. private final static AtomicInteger hashCodeGenerator = new AtomicInteger();
  37.  
  38. // transient stuff
  39. private transient int index;
  40. private transient int lastRegionId; // the last region the entity was at
  41. private transient int sceneBaseChunkId;
  42. private transient CopyOnWriteArrayList<Integer> mapRegionsIds; // called by
  43. // more than
  44. // 1thread
  45. // so
  46. // concurent
  47. private transient int direction;
  48. private transient WorldTile lastWorldTile;
  49. private transient WorldTile nextWorldTile;
  50. private transient int nextWalkDirection;
  51. private transient int nextRunDirection;
  52. private transient Rectangle nextFaceWorldTile;
  53. private transient int mapSize; // default 0, can be setted other value
  54. // usefull on
  55. private transient boolean teleported;
  56. private transient ConcurrentLinkedQueue<Object[]> walkSteps;// called by
  57. // more
  58. // than 1thread
  59. // so concurent
  60. private transient ConcurrentLinkedQueue<Hit> receivedHits;
  61. private transient Map<Entity, Integer> receivedDamage;
  62. private transient boolean finished; // if removed
  63. // entity masks
  64. private transient Colour nextColour;
  65. private transient Animation nextAnimation;
  66. private transient Graphics nextGraphics1;
  67. private transient Graphics nextGraphics2;
  68. private transient Graphics nextGraphics3;
  69. private transient Graphics nextGraphics4;
  70. private transient ArrayList<Hit> nextHits;
  71. private transient ArrayList<HitBar> nextHitBars;
  72. private transient ForceMovement nextForceMovement;
  73. private transient ForceTalk nextForceTalk;
  74. private transient int nextFaceEntity;
  75. private transient int lastFaceEntity;
  76. private transient boolean needTargetInformationUpdate;
  77.  
  78. private transient Entity attackedBy; // whos attacking you, used for single
  79. private transient long attackedByDelay; // delay till someone else can
  80. private transient long attackingDelay; // tells youre attacking someone
  81. // attack you
  82. private transient boolean isAtDynamicRegion;
  83. private transient long lastAnimationEnd;
  84. private transient long findTargetDelay;
  85. private transient ConcurrentHashMap<Object, Object> temporaryAttributes;
  86. private transient int hashCode;
  87.  
  88. // saving stuff
  89. private int hitpoints;
  90. // static maps
  91. private boolean run;
  92. private EffectsManager effectsManager;
  93.  
  94. // creates Entity and saved classes
  95. public Entity(WorldTile tile) {
  96. super(tile);
  97. effectsManager = new EffectsManager();
  98. }
  99.  
  100. @Override
  101. public int hashCode() {
  102. return hashCode;
  103. }
  104.  
  105. public final void initEntity() {
  106. hashCode = hashCodeGenerator.getAndIncrement();
  107. mapRegionsIds = new CopyOnWriteArrayList<Integer>();
  108. walkSteps = new ConcurrentLinkedQueue<Object[]>();
  109. receivedHits = new ConcurrentLinkedQueue<Hit>();
  110. receivedDamage = new ConcurrentHashMap<Entity, Integer>();
  111. temporaryAttributes = new ConcurrentHashMap<Object, Object>();
  112. nextHits = new ArrayList<Hit>();
  113. nextHitBars = new ArrayList<HitBar>();
  114. nextWalkDirection = nextRunDirection - 1;
  115. lastFaceEntity = -1;
  116. nextFaceEntity = -2;
  117. effectsManager.setEntity(this);
  118. }
  119.  
  120. public int getReceivedDamage(Entity source) {
  121. int receivedDamage = 0;
  122. for (Hit hit : receivedHits) {
  123. if (hit.getSource() != source)
  124. continue;
  125. receivedDamage += hit.getDamage();
  126. }
  127. return receivedDamage;
  128. }
  129.  
  130. public int getClientIndex() {
  131. return index + (this instanceof Player ? 32768 : 0);
  132. }
  133.  
  134. public void applyHit(Hit hit) {
  135. if (isDead())
  136. return;
  137. Entity source = hit.getSource();
  138. if (source != null)
  139. hit = source.handleOutgoingHit(hit, this);
  140. // todo damage for who gets drop
  141. receivedHits.add(hit); // added hit first because, soaking added after,
  142. // if applyhit used right there shouldnt be any
  143. // problem
  144. handleIngoingHit(hit);
  145. }
  146.  
  147. /**
  148. * Where the hit came from.
  149. *
  150. * @param hit
  151. * The hit.
  152. */
  153. @Deprecated
  154. public Hit handleOutgoingHit(Hit hit, Entity target) {
  155. // EMPTY
  156. return hit;
  157. }
  158.  
  159. public abstract void handleIngoingHit(Hit hit);
  160.  
  161. public void reset(boolean attributes) {
  162. setHitpoints(getMaxHitpoints());
  163. receivedHits.clear();
  164. resetCombat();
  165. walkSteps.clear();
  166. effectsManager.resetEffects();
  167. resetReceivedDamage();
  168. setAttackedBy(null);
  169. setAttackedByDelay(0);
  170. setAttackingDelay(0);
  171. if (attributes)
  172. temporaryAttributes.clear();
  173. }
  174.  
  175. public void reset() {
  176. reset(true);
  177. }
  178.  
  179. public void resetCombat() {
  180. attackedBy = null;
  181. attackedByDelay = 0;
  182. effectsManager.removeEffect(EffectType.BOUND);
  183. effectsManager.removeEffect(EffectType.BOUND_IMMUNITY);
  184. }
  185.  
  186. public void processReceivedHits() {
  187. if (this instanceof Player) {
  188. if (((Player) this).getEmotesManager().getNextEmoteEnd() >= Utils.currentTimeMillis())
  189. return;
  190. }
  191. Hit hit;
  192. int count = 0;
  193. while ((hit = receivedHits.poll()) != null && count++ < 10)
  194. processHit(hit);
  195. }
  196.  
  197. public void processHit(Hit hit) {
  198. if (isDead())
  199. return;
  200. removeHitpoints(hit);
  201. nextHits.add(hit);
  202. if (nextHitBars.isEmpty())
  203. addHitBars();
  204. }
  205.  
  206. public void addHitBars() {
  207. nextHitBars.add(new EntityHitBar(this));
  208. }
  209.  
  210. public void resetReceivedHits() {
  211. nextHits.clear();
  212. receivedHits.clear();
  213. }
  214.  
  215. public void removeHitpoints(final Hit hit) {
  216. if (isDead() || hit.getLook() == HitLook.ABSORB_DAMAGE || hit.getLook() == HitLook.HEALED_DAMAGE)
  217. return;
  218. if (hit.getDamage() > hitpoints)
  219. hit.setDamage(hitpoints);
  220. addReceivedDamage(hit.getSource(), hit.getDamage());
  221. setHitpoints(hitpoints - hit.getDamage());
  222. if (hitpoints <= 0)
  223. sendDeath(hit.getSource());
  224. }
  225.  
  226. public void resetReceivedDamage() {
  227. receivedDamage.clear();
  228. }
  229.  
  230. public void reduceDamage(Entity entity) {
  231. int dmg = getDamageReceived(entity);
  232. if (dmg != -1)
  233. receivedDamage.put(entity, dmg / 5);
  234. }
  235.  
  236. public Set<Entity> getReceivedDamageSources() {
  237. return receivedDamage.keySet();
  238. }
  239.  
  240. public Map<Entity, Integer> getReceivedDamage() {
  241. return receivedDamage;
  242. }
  243.  
  244. public int getTotalDamageReceived() {
  245. int totalDmg = 0;
  246. for (Integer i : receivedDamage.values())
  247. totalDmg += i;
  248. return totalDmg;
  249. }
  250.  
  251. public Player getMostDamageReceivedSourcePlayer() {
  252. Player player = null;
  253. int damage = -1;
  254. for (Entity source : receivedDamage.keySet()) {
  255. if (!(source instanceof Player))
  256. continue;
  257. Integer d = receivedDamage.get(source);
  258. if (d == null || source.hasFinished()) {
  259. receivedDamage.remove(source);
  260. continue;
  261. }
  262. if (d > damage) {
  263. player = (Player) source;
  264. damage = d;
  265. }
  266. }
  267. return player;
  268. }
  269.  
  270. public int getDamageReceived(Entity source) {
  271. Integer d = receivedDamage.get(source);
  272. if (d == null || source.hasFinished()) {
  273. receivedDamage.remove(source);
  274. return -1;
  275. }
  276. return d;
  277. }
  278.  
  279. public void processReceivedDamage() {
  280. if (isDead())
  281. return;
  282. for (Entity source : receivedDamage.keySet()) {
  283. Integer damage = receivedDamage.get(source);
  284. if (damage == null || source.hasFinished()) {
  285. receivedDamage.remove(source);
  286. continue;
  287. }
  288. damage--;
  289. if (damage == 0) {
  290. receivedDamage.remove(source);
  291. continue;
  292. }
  293. receivedDamage.put(source, damage);
  294. }
  295. }
  296.  
  297. public void addReceivedDamage(Entity source, int amount) {
  298. if (source == null || source == this)
  299. return;
  300. if (source instanceof Familiar)
  301. source = ((Familiar) source).getOwner();
  302. Integer damage = receivedDamage.get(source);
  303. damage = damage == null ? amount : damage + amount;
  304. if (damage < 0)
  305. receivedDamage.remove(source);
  306. else
  307. receivedDamage.put(source, damage);
  308. }
  309.  
  310. public void heal(int amount) {
  311. heal(amount, 0);
  312. }
  313.  
  314. public void heal(int amount, int extra) {
  315. heal(amount, extra, 0);
  316. }
  317.  
  318. public void heal(int amount, int extra, int delay) {
  319. heal(amount, extra, delay, false);
  320. }
  321.  
  322. public void heal(int amount, int extra, int delay, boolean displayMark) {
  323. if (isDead())
  324. return;
  325. boolean aboveMaxHP = hitpoints + amount >= getMaxHitpoints() + extra;
  326. int hp = aboveMaxHP ? getMaxHitpoints() + extra : hitpoints + amount;
  327. if (hitpoints > hp)
  328. return;
  329. if (displayMark) {
  330. int damage = hp - hitpoints;
  331. if (damage > 0)
  332. applyHit(new Hit(this, damage, HitLook.HEALED_DAMAGE, delay));
  333. }
  334. setHitpoints(hp);
  335. }
  336.  
  337. public boolean hasWalkSteps() {
  338. return !walkSteps.isEmpty();
  339. }
  340.  
  341. public abstract void sendDeath(Entity source);
  342.  
  343. public Entity getCurrentFaceEntity() {
  344. return lastFaceEntity >= 0 ? (lastFaceEntity >= 32768 ? World.getPlayers().get(lastFaceEntity - 32768) : World
  345. .getNPCs().get(lastFaceEntity)) : null;
  346. }
  347.  
  348. public void processMovement() {
  349. lastWorldTile = new WorldTile(this);
  350. if (lastFaceEntity >= 0) {
  351. Entity target = lastFaceEntity >= 32768 ? World.getPlayers().get(lastFaceEntity - 32768) : World.getNPCs()
  352. .get(lastFaceEntity);
  353. if (target != null) {
  354. int size = target.getSize();
  355. updateAngle(target, size, size);
  356. }
  357. // direction =
  358. // Utils.getFaceDirection(target.getCoordFaceX(target.getSize()) -
  359. // getCoordFaceX(getSize()), target.getCoordFaceY(target.getSize())
  360. // - getCoordFaceY(getSize()));
  361. }
  362. nextWalkDirection = nextRunDirection = -1;
  363. if (nextWorldTile != null) {
  364. // int lastPlane = getPlane();
  365. setLocation(nextWorldTile);
  366. nextWorldTile = null;
  367. teleported = true;
  368. // not required anymore due to new gpi change
  369. /*
  370. * if (this instanceof Player && ((Player)
  371. * this).getTemporaryMoveType() == -1) ((Player)
  372. * this).setTemporaryMoveType(Player.TELE_MOVE_TYPE);
  373. */
  374. World.updateEntityRegion(this);
  375. if (needMapUpdate())
  376. loadMapRegions();
  377. /*
  378. * else if (this instanceof Player && lastPlane != getPlane())
  379. * ((Player) this).setClientHasntLoadedMapRegion();
  380. */
  381. resetWalkSteps();
  382. return;
  383. }
  384. teleported = false;
  385. if (walkSteps.isEmpty())
  386. return;
  387. if (this instanceof Player) { // emotes are special on rs, when using
  388. // one u will walk once emote done
  389. if (((Player) this).getEmotesManager().getNextEmoteEnd() >= Utils.currentTimeMillis())
  390. return;
  391. }
  392. if (this instanceof TorturedSoul) { // waste of process power personaly
  393. // but meh.
  394. if (((TorturedSoul) this).switchWalkStep()) {
  395. return;
  396. }
  397. }
  398. if (this instanceof Player && ((Player) this).getRunEnergy() <= 0)
  399. setRun(false);
  400. for (int stepCount = 0; stepCount < (run ? 2 : 1); stepCount++) {
  401. Object[] nextStep = getNextWalkStep();
  402. if (nextStep == null)
  403. break;
  404. int dir = (int) nextStep[0];
  405. if (((boolean) nextStep[3] && !World.checkWalkStep(getPlane(), getX(), getY(), dir, getSize()))
  406. || (this instanceof NPC && !canWalkNPC(getX() + Utils.DIRECTION_DELTA_X[dir], getY()
  407. + Utils.DIRECTION_DELTA_Y[dir])) || !canMove(dir)) {
  408. resetWalkSteps();
  409. break;
  410. }
  411. if (stepCount == 0)
  412. nextWalkDirection = dir;
  413. else
  414. nextRunDirection = dir;
  415. moveLocation(Utils.DIRECTION_DELTA_X[dir], Utils.DIRECTION_DELTA_Y[dir], 0);
  416. if (run && stepCount == 0) { // fixes impossible steps
  417. Object[] previewStep = previewNextWalkStep();
  418. if (previewStep == null)
  419. break;
  420. int previewDir = (int) previewStep[0];
  421. if (Utils.getPlayerRunningDirection(Utils.DIRECTION_DELTA_X[dir] + Utils.DIRECTION_DELTA_X[previewDir],
  422. Utils.DIRECTION_DELTA_Y[dir] + Utils.DIRECTION_DELTA_Y[previewDir]) == -1)
  423. break;
  424. }
  425. }
  426. World.updateEntityRegion(this);
  427. if (needMapUpdate())
  428. loadMapRegions();
  429. }
  430.  
  431. public abstract boolean canMove(int dir);
  432.  
  433. @Override
  434. public void moveLocation(int xOffset, int yOffset, int planeOffset) {
  435. super.moveLocation(xOffset, yOffset, planeOffset);
  436. direction = Utils.getAngle(xOffset, yOffset);
  437. }
  438.  
  439. private boolean needMapUpdate() {
  440. return needMapUpdate(this);
  441. }
  442.  
  443. public boolean needMapUpdate(WorldTile tile) {
  444. int baseChunk[] = MapUtils.decode(Structure.CHUNK, sceneBaseChunkId);
  445. // chunks length - offset. if within 16 tiles of border it updates map
  446. int limit = Settings.MAP_SIZES[mapSize] / 8 - 2;
  447.  
  448. int offsetX = tile.getChunkX() - baseChunk[0];
  449. int offsetY = tile.getChunkY() - baseChunk[1];
  450.  
  451. return offsetX < 2 || offsetX >= limit || offsetY < 2 || offsetY >= limit;
  452. }
  453.  
  454. // normal walk steps method
  455. public boolean addWalkSteps(int destX, int destY) {
  456. return addWalkSteps(destX, destY, -1);
  457. }
  458.  
  459. public boolean clipedProjectile(WorldTile tile, boolean checkClose) {
  460. if (tile instanceof Entity) {
  461. Entity e = (Entity) tile;
  462. WorldTile me = this;
  463. if (tile instanceof NPC) {
  464. NPC n = (NPC) tile;
  465. tile = n.getMiddleWorldTile();
  466. } else if (this instanceof NPC) {
  467. NPC n = (NPC) this;
  468. me = n.getMiddleWorldTile();
  469. }
  470. return clipedProjectile(tile, checkClose, 1) || e.clipedProjectile(me, checkClose, 1);
  471. }
  472. return clipedProjectile(tile, checkClose, 1);
  473. }
  474.  
  475. public boolean clipedProjectile(WorldTile tile, boolean checkClose, int size) {
  476. int myX = getX();
  477. int myY = getY();
  478. if (this instanceof NPC) {
  479. NPC n = (NPC) this;
  480. WorldTile thist = n.getMiddleWorldTile();
  481. myX = thist.getX();
  482. myY = thist.getY();
  483. }
  484. int destX = tile.getX();
  485. int destY = tile.getY();
  486. if (myX == destX && destY == myY)
  487. return true;
  488. int lastTileX = myX;
  489. int lastTileY = myY;
  490. while (true) {
  491. if (myX < destX)
  492. myX++;
  493. else if (myX > destX)
  494. myX--;
  495. if (myY < destY)
  496. myY++;
  497. else if (myY > destY)
  498. myY--;
  499. int dir = Utils.getMoveDirection(myX - lastTileX, myY - lastTileY);
  500. if (dir == -1)
  501. return false;
  502. if (checkClose) {
  503. if (!World.checkWalkStep(getPlane(), lastTileX, lastTileY, dir, size))
  504. return false;
  505. } else if (!World.checkProjectileStep(getPlane(), lastTileX, lastTileY, dir, size))
  506. return false;
  507. lastTileX = myX;
  508. lastTileY = myY;
  509. if (lastTileX == destX && lastTileY == destY)
  510. return true;
  511. }
  512. }
  513.  
  514. public boolean calcFollow(WorldTile target, boolean inteligent) {
  515. return calcFollow(target, -1, true, inteligent);
  516. }
  517.  
  518. // checks collisions
  519. public boolean canWalkNPC(int toX, int toY) {
  520. // stucking nomad is part of strategy
  521. if (this instanceof Familiar || this instanceof Nomad || ((NPC) this).isIntelligentRouteFinder()
  522. || ((NPC) this).isForceWalking())
  523. return true;
  524. int size = getSize();
  525. for (int regionId : getMapRegionsIds()) {
  526. List<Integer> npcIndexes = World.getRegion(regionId).getNPCsIndexes();
  527. if (npcIndexes != null/* && npcIndexes.size() < 100 */) {
  528. for (int npcIndex : npcIndexes) {
  529. NPC target = World.getNPCs().get(npcIndex);
  530. if (target == null || target == this || target.isDead() || target.hasFinished()
  531. || target.getPlane() != getPlane() || target instanceof Familiar)
  532. continue;
  533. int targetSize = target.getSize();
  534. // npc is under this target so skip checking it
  535. if (Utils.colides(this, target))
  536. continue;
  537. WorldTile tile = new WorldTile(target);
  538. // has to be checked aswell, cuz other one assumes npc will
  539. // manage to move no matter what
  540. if (Utils.colides(toX, toY, size, tile.getX(), tile.getY(), targetSize))
  541. return false;
  542. if (target.getNextWalkDirection() != -1) {
  543. tile.moveLocation(Utils.DIRECTION_DELTA_X[target.getNextWalkDirection()],
  544. Utils.DIRECTION_DELTA_Y[target.getNextWalkDirection()], 0);
  545. if (target.getNextRunDirection() != -1)
  546. tile.moveLocation(Utils.DIRECTION_DELTA_X[target.getNextRunDirection()],
  547. Utils.DIRECTION_DELTA_Y[target.getNextRunDirection()], 0);
  548. // target is at x,y
  549. if (Utils.colides(toX, toY, size, tile.getX(), tile.getY(), targetSize))
  550. return false;
  551. }
  552. }
  553. }
  554. }
  555. return true;
  556. }
  557.  
  558. public WorldTile getMiddleWorldTile() {
  559. int size = getSize();
  560. return size == 1 ? this : new WorldTile(getCoordFaceX(size), getCoordFaceY(size), getPlane());
  561. }
  562.  
  563. public static boolean findBasicRoute(Entity src, WorldTile dest, int maxStepsCount, boolean calculate) {
  564. int[] srcPos = src.getLastWalkTile();
  565. int[] destPos = { dest.getX(), dest.getY() };
  566. int srcSize = src.getSize();
  567. // set destSize to 0 to walk under it else follows
  568. int destSize = dest instanceof Entity ? ((Entity) dest).getSize() : 1;
  569. int[] destScenePos = { destPos[0] + destSize - 1, destPos[1] + destSize - 1 };// Arrays.copyOf(destPos,
  570. // 2);//destSize
  571. // ==
  572. // 1
  573. // ?
  574. // Arrays.copyOf(destPos,
  575. // 2)
  576. // :
  577. // new
  578. // int[]
  579. // {WorldTile.getCoordFaceX(destPos[0],
  580. // destSize,
  581. // destSize,
  582. // -1),
  583. // WorldTile.getCoordFaceY(destPos[1],
  584. // destSize,
  585. // destSize,
  586. // -1)};
  587. while (maxStepsCount-- != 0) {
  588. int[] srcScenePos = { srcPos[0] + srcSize - 1, srcPos[1] + srcSize - 1 };// srcSize
  589. // ==
  590. // 1
  591. // ?
  592. // Arrays.copyOf(srcPos,
  593. // 2)
  594. // :
  595. // new
  596. // int[]
  597. // {
  598. // WorldTile.getCoordFaceX(srcPos[0],
  599. // srcSize,
  600. // srcSize,
  601. // -1),
  602. // WorldTile.getCoordFaceY(srcPos[1],
  603. // srcSize,
  604. // srcSize,
  605. // -1)};
  606. if (!Utils.isOnRange(srcPos[0], srcPos[1], srcSize, destPos[0], destPos[1], destSize, 0)) {
  607. if (srcScenePos[0] < destScenePos[0] && srcScenePos[1] < destScenePos[1]
  608. && src.addWalkStep(srcPos[0] + 1, srcPos[1] + 1, srcPos[0], srcPos[1], true)) {
  609. srcPos[0]++;
  610. srcPos[1]++;
  611. continue;
  612. }
  613. if (srcScenePos[0] > destScenePos[0] && srcScenePos[1] > destScenePos[1]
  614. && src.addWalkStep(srcPos[0] - 1, srcPos[1] - 1, srcPos[0], srcPos[1], true)) {
  615. srcPos[0]--;
  616. srcPos[1]--;
  617. continue;
  618. }
  619. if (srcScenePos[0] < destScenePos[0] && srcScenePos[1] > destScenePos[1]
  620. && src.addWalkStep(srcPos[0] + 1, srcPos[1] - 1, srcPos[0], srcPos[1], true)) {
  621. srcPos[0]++;
  622. srcPos[1]--;
  623. continue;
  624. }
  625. if (srcScenePos[0] > destScenePos[0] && srcScenePos[1] < destScenePos[1]
  626. && src.addWalkStep(srcPos[0] - 1, srcPos[1] + 1, srcPos[0], srcPos[1], true)) {
  627. srcPos[0]--;
  628. srcPos[1]++;
  629. continue;
  630. }
  631. if (srcScenePos[0] < destScenePos[0]
  632. && src.addWalkStep(srcPos[0] + 1, srcPos[1], srcPos[0], srcPos[1], true)) {
  633. srcPos[0]++;
  634. continue;
  635. }
  636. if (srcScenePos[0] > destScenePos[0]
  637. && src.addWalkStep(srcPos[0] - 1, srcPos[1], srcPos[0], srcPos[1], true)) {
  638. srcPos[0]--;
  639. continue;
  640. }
  641. if (srcScenePos[1] < destScenePos[1]
  642. && src.addWalkStep(srcPos[0], srcPos[1] + 1, srcPos[0], srcPos[1], true)) {
  643. srcPos[1]++;
  644. continue;
  645. }
  646. if (srcScenePos[1] > destScenePos[1]
  647. && src.addWalkStep(srcPos[0], srcPos[1] - 1, srcPos[0], srcPos[1], true)) {
  648. srcPos[1]--;
  649. continue;
  650. }
  651. return false;
  652. }
  653. break; // for now nothing between break and return
  654. }
  655. return true;
  656. }
  657.  
  658. // used for normal npc follow int maxStepsCount, boolean calculate used to
  659. // save mem on normal path
  660. public boolean calcFollow(WorldTile target, int maxStepsCount, boolean calculate, boolean inteligent) {
  661. if (inteligent) {
  662. int steps = RouteFinder.findRoute(RouteFinder.WALK_ROUTEFINDER, getX(), getY(), getPlane(), getSize(),
  663. target instanceof WorldObject ? new ObjectStrategy((WorldObject) target)
  664. : target instanceof Entity ? new EntityStrategy((Entity) target) : new FixedTileStrategy(
  665. target.getX(), target.getY()), true);
  666. if (steps == -1)
  667. return false;
  668. if (steps == 0)
  669. return true;
  670. int[] bufferX = RouteFinder.getLastPathBufferX();
  671. int[] bufferY = RouteFinder.getLastPathBufferY();
  672. for (int step = steps - 1; step >= 0; step--) {
  673. if (!addWalkSteps(bufferX[step], bufferY[step], 25, true))
  674. break;
  675. }
  676. return true;
  677. }
  678. return findBasicRoute(this, target, maxStepsCount, true);
  679. /*
  680. * else if (true == true) { //just keeping old code
  681. * System.out.println("test"); return findBasicRoute(this, (Entity)
  682. * target, maxStepsCount, true); }
  683. *
  684. * int[] lastTile = getLastWalkTile(); int myX = lastTile[0]; int myY =
  685. * lastTile[1]; int stepCount = 0; int size = getSize(); int destX =
  686. * target.getX(); int destY = target.getY(); int sizeX = target
  687. * instanceof WorldObject ?
  688. * ((WorldObject)target).getDefinitions().getSizeX() :
  689. * ((Entity)target).getSize(); int sizeY = target instanceof WorldObject
  690. * ? ((WorldObject)target).getDefinitions().getSizeY() : sizeX; while
  691. * (true) { stepCount++; int myRealX = myX; int myRealY = myY; if
  692. * (Utils.isOnRange(myX, myY, size, destX, destY, sizeX, 0)) return
  693. * true; if (myX < destX) myX++; else if (myX > destX) myX--; if (myY <
  694. * destY) myY++; else if (myY > destY) myY--; if ((this instanceof NPC
  695. * && !canWalkNPC(myX, myY)) || !addWalkStep(myX, myY, lastTile[0],
  696. * lastTile[1], true)) { if (!calculate) return false; myX = myRealX;
  697. * myY = myRealY; int[] myT = calculatedStep(myRealX, myRealY, destX,
  698. * destY, lastTile[0], lastTile[1], sizeX, sizeY); if (myT == null)
  699. * return false; myX = myT[0]; myY = myT[1]; } if (stepCount ==
  700. * maxStepsCount) return true; lastTile[0] = myX; lastTile[1] = myY; if
  701. * (lastTile[0] == destX && lastTile[1] == destY) return true; }
  702. */
  703. }
  704.  
  705. // used for normal npc follow
  706. @SuppressWarnings("unused")
  707. private int[] calculatedStep(int myX, int myY, int destX, int destY, int lastX, int lastY, int sizeX, int sizeY) {
  708. if (myX < destX) {
  709. myX++;
  710. if ((this instanceof NPC && !canWalkNPC(myX, myY)) || !addWalkStep(myX, myY, lastX, lastY, true))
  711. myX--;
  712. else if (!(myX - destX > sizeX || myX - destX < -1 || myY - destY > sizeY || myY - destY < -1)) {
  713. if (myX == lastX || myY == lastY)
  714. return null;
  715. return new int[] { myX, myY };
  716. }
  717. } else if (myX > destX) {
  718. myX--;
  719. if ((this instanceof NPC && !canWalkNPC(myX, myY)) || !addWalkStep(myX, myY, lastX, lastY, true))
  720. myX++;
  721. else if (!(myX - destX > sizeX || myX - destX < -1 || myY - destY > sizeY || myY - destY < -1)) {
  722. if (myX == lastX || myY == lastY)
  723. return null;
  724. return new int[] { myX, myY };
  725. }
  726. }
  727. if (myY < destY) {
  728. myY++;
  729. if ((this instanceof NPC && !canWalkNPC(myX, myY)) || !addWalkStep(myX, myY, lastX, lastY, true))
  730. myY--;
  731. else if (!(myX - destX > sizeX || myX - destX < -1 || myY - destY > sizeY || myY - destY < -1)) {
  732. if (myX == lastX || myY == lastY)
  733. return null;
  734. return new int[] { myX, myY };
  735. }
  736. } else if (myY > destY) {
  737. myY--;
  738. if ((this instanceof NPC && !canWalkNPC(myX, myY)) || !addWalkStep(myX, myY, lastX, lastY, true)) {
  739. myY++;
  740. } else if (!(myX - destX > sizeX || myX - destX < -1 || myY - destY > sizeY || myY - destY < -1)) {
  741. if (myX == lastX || myY == lastY)
  742. return null;
  743. return new int[] { myX, myY };
  744. }
  745. }
  746. if (myX == lastX || myY == lastY)
  747. return null;
  748. return new int[] { myX, myY };
  749. }
  750.  
  751. /*
  752. * return added all steps
  753. */
  754. public boolean addWalkSteps(final int destX, final int destY, int maxStepsCount) {
  755. return addWalkSteps(destX, destY, maxStepsCount, true);
  756. }
  757.  
  758. /*
  759. * return added all steps
  760. */
  761. public boolean addWalkSteps(final int destX, final int destY, int maxStepsCount, boolean check) {
  762. int[] lastTile = getLastWalkTile();
  763. int myX = lastTile[0];
  764. int myY = lastTile[1];
  765. int stepCount = 0;
  766. while (true) {
  767. stepCount++;
  768. if (myX < destX)
  769. myX++;
  770. else if (myX > destX)
  771. myX--;
  772. if (myY < destY)
  773. myY++;
  774. else if (myY > destY)
  775. myY--;
  776. if (!addWalkStep(myX, myY, lastTile[0], lastTile[1], check))
  777. return false;
  778. if (stepCount == maxStepsCount)
  779. return true;
  780. lastTile[0] = myX;
  781. lastTile[1] = myY;
  782. if (lastTile[0] == destX && lastTile[1] == destY)
  783. return true;
  784. }
  785. }
  786.  
  787. public abstract int[] getBonuses();
  788.  
  789. private int[] getLastWalkTile() {
  790. Object[] objects = walkSteps.toArray();
  791. if (objects.length == 0)
  792. return new int[] { getX(), getY() };
  793. Object step[] = (Object[]) objects[objects.length - 1];
  794. return new int[] { (int) step[1], (int) step[2] };
  795. }
  796.  
  797. public boolean addWalkStep(int nextX, int nextY, int lastX, int lastY, boolean check) {
  798. int dir = Utils.getMoveDirection(nextX - lastX, nextY - lastY);
  799. if (dir == -1)
  800. return false;
  801. if (check
  802. && !World.checkWalkStep(getPlane(), lastX, lastY, dir, getSize())
  803. || (this instanceof NPC && !canWalkNPC(getX() + Utils.DIRECTION_DELTA_X[dir], getY()
  804. + Utils.DIRECTION_DELTA_Y[dir])))// double check must be
  805. // done sadly cuz of
  806. // npc under check, can
  807. // be improved later to
  808. // only check when we
  809. // want
  810. return false;
  811. if (this instanceof Player) {
  812. if (!((Player) this).getControlerManager().addWalkStep(lastX, lastY, nextX, nextY))
  813. return false;
  814. }
  815. walkSteps.add(new Object[] { dir, nextX, nextY, check });
  816. return true;
  817. }
  818.  
  819. public ConcurrentLinkedQueue<Object[]> getWalkSteps() {
  820. return walkSteps;
  821. }
  822.  
  823. public void resetWalkSteps() {
  824. walkSteps.clear();
  825. }
  826.  
  827. private Object[] getNextWalkStep() {
  828. Object[] step = walkSteps.poll();
  829. if (step == null)
  830. return null;
  831. return step;
  832. }
  833.  
  834. private Object[] previewNextWalkStep() {
  835. Object[] step = walkSteps.peek();
  836. if (step == null)
  837. return null;
  838. return step;
  839. }
  840.  
  841. public boolean restoreHitPoints() {
  842. int maxHp = getMaxHitpoints();
  843. // hp doesnt go down in rs when above max it seems
  844. /*
  845. * if (hitpoints > maxHp) { if (this instanceof Player) { Player player
  846. * = (Player) this; if (player.getPrayer().usingPrayer(1, 9) &&
  847. * Utils.random(100) <= 15) return false; } setHitpoints(hitpoints - 1);
  848. * return true; } else
  849. */if (hitpoints < maxHp) {
  850. if (this instanceof Player && World.isSafeZone(this))
  851. setHitpoints(maxHp - hitpoints < 1000 ? maxHp : (hitpoints + 1000));
  852. else
  853. setHitpoints(hitpoints + 1);
  854. // done differently now
  855. /*
  856. * if (this instanceof Player) { Player player = (Player) this; if
  857. * (player.getPrayer().usingPrayer(0, 9) && hitpoints < maxHp)
  858. * setHitpoints(hitpoints + 1); else if
  859. * (player.getPrayer().usingPrayer(0, 26) && hitpoints < maxHp)
  860. * setHitpoints(hitpoints + (hitpoints + 4 > maxHp ? maxHp -
  861. * hitpoints : 4));
  862. *
  863. * }
  864. */
  865. return true;
  866. }
  867. return false;
  868. }
  869.  
  870. public int getHealRestoreRate() {
  871. return 10;
  872. }
  873.  
  874. public boolean needMasksUpdate() {
  875. return nextColour != null || nextFaceEntity != -2 || nextAnimation != null || nextGraphics1 != null
  876. || nextGraphics2 != null || nextGraphics3 != null || nextGraphics4 != null
  877. || (nextWalkDirection == -1 && nextRunDirection == -1 && nextFaceWorldTile != null)
  878. || !nextHits.isEmpty() || !nextHitBars.isEmpty() || nextForceMovement != null || nextForceTalk != null
  879. || needTargetInformationUpdate;
  880. }
  881.  
  882. public boolean isDead() {
  883. return hitpoints == 0;
  884. }
  885.  
  886. public void resetMasks() {
  887. nextAnimation = null;
  888. nextGraphics1 = null;
  889. nextGraphics2 = null;
  890. nextGraphics3 = null;
  891. nextGraphics4 = null;
  892. if (nextWalkDirection == -1)
  893. nextFaceWorldTile = null;
  894. nextForceMovement = null;
  895. nextForceTalk = null;
  896. nextColour = null;
  897. nextFaceEntity = -2;
  898. nextHits.clear();
  899. nextHitBars.clear();
  900. needTargetInformationUpdate = false;
  901. }
  902.  
  903. public abstract void finish();
  904.  
  905. public abstract int getMaxHitpoints();
  906.  
  907. public void processEntityUpdate() {
  908. processMovement();
  909. processReceivedHits();
  910. processReceivedDamage();
  911. }
  912.  
  913. public void processEntity() {
  914. effectsManager.processEffects();
  915. }
  916.  
  917. public void loadMapRegions() {
  918. mapRegionsIds.clear();
  919. isAtDynamicRegion = false;
  920. int chunkX = getChunkX();
  921. int chunkY = getChunkY();
  922. int sceneChunksRadio = Settings.MAP_SIZES[mapSize] / 16; // 16 cuz a
  923. // chunk is 8.
  924. // radio is
  925. // half
  926. int sceneBaseChunkX = (chunkX - sceneChunksRadio);
  927. int sceneBaseChunkY = (chunkY - sceneChunksRadio);
  928. if (sceneBaseChunkX < 0)
  929. sceneBaseChunkX = 0;
  930. if (sceneBaseChunkY < 0)
  931. sceneBaseChunkY = 0;
  932. int fromRegionX = sceneBaseChunkX / 8; // doesnt go negative.
  933. int fromRegionY = sceneBaseChunkY / 8;
  934. int toRegionX = (chunkX + sceneChunksRadio) / 8;
  935. int toRegionY = (chunkY + sceneChunksRadio) / 8;
  936.  
  937. for (int regionX = fromRegionX; regionX <= toRegionX; regionX++)
  938. for (int regionY = fromRegionY; regionY <= toRegionY; regionY++) {
  939. int regionId = MapUtils.encode(Structure.REGION, regionX, regionY);
  940. if (World.getRegion(regionId, this instanceof Player) instanceof DynamicRegion)
  941. isAtDynamicRegion = true;
  942. mapRegionsIds.add(regionId);
  943. }
  944. sceneBaseChunkId = MapUtils.encode(Structure.CHUNK, sceneBaseChunkX, sceneBaseChunkY);
  945. }
  946.  
  947. public void setIndex(int index) {
  948. this.index = index;
  949. }
  950.  
  951. public int getIndex() {
  952. return index;
  953. }
  954.  
  955. public int getHitpoints() {
  956. return hitpoints;
  957. }
  958.  
  959. public void setHitpoints(int hitpoints) {
  960. if (hitpoints == this.hitpoints)
  961. return;
  962. this.hitpoints = hitpoints;
  963. needTargetInformationUpdate = true;
  964. }
  965.  
  966. public void setLastRegionId(int lastRegionId) {
  967. this.lastRegionId = lastRegionId;
  968. }
  969.  
  970. public int getLastRegionId() {
  971. return lastRegionId;
  972. }
  973.  
  974. public int getMapSize() {
  975. return mapSize;
  976. }
  977.  
  978. public void setMapSize(int size) {
  979. this.mapSize = size;
  980. loadMapRegions();
  981. }
  982.  
  983. public CopyOnWriteArrayList<Integer> getMapRegionsIds() {
  984. return mapRegionsIds;
  985. }
  986.  
  987. public void setNextAnimation(Animation nextAnimation) {
  988. if (nextAnimation != null && nextAnimation.getIds()[0] >= 0)
  989. lastAnimationEnd = Utils.currentTimeMillis()
  990. + AnimationDefinitions.getAnimationDefinitions(nextAnimation.getIds()[0]).getEmoteTime()
  991. + (nextAnimation.getDelay() * 10);
  992. this.nextAnimation = nextAnimation;
  993. }
  994.  
  995. public void setNextAnimationNoPriority(Animation nextAnimation) {
  996. // adding 1 tick cuz of emote delays
  997. if (lastAnimationEnd + 600 >= Utils.currentTimeMillis())
  998. return;
  999. setNextAnimation(nextAnimation);
  1000. }
  1001.  
  1002. public Animation getNextAnimation() {
  1003. return nextAnimation;
  1004. }
  1005.  
  1006. public void setNextGraphics(Graphics nextGraphics) {
  1007. if (nextGraphics == null) {
  1008. if (nextGraphics4 != null)
  1009. nextGraphics4 = null;
  1010. else if (nextGraphics3 != null)
  1011. nextGraphics3 = null;
  1012. else if (nextGraphics2 != null)
  1013. nextGraphics2 = null;
  1014. else
  1015. nextGraphics1 = null;
  1016. } else {
  1017. if (nextGraphics.equals(nextGraphics1) || nextGraphics.equals(nextGraphics2)
  1018. || nextGraphics.equals(nextGraphics3) || nextGraphics.equals(nextGraphics4))
  1019. return;
  1020. if (nextGraphics1 == null)
  1021. nextGraphics1 = nextGraphics;
  1022. else if (nextGraphics2 == null)
  1023. nextGraphics2 = nextGraphics;
  1024. else if (nextGraphics3 == null)
  1025. nextGraphics3 = nextGraphics;
  1026. else if (nextGraphics4 == null)
  1027. nextGraphics4 = nextGraphics;
  1028. }
  1029. }
  1030.  
  1031. public Graphics getNextGraphics1() {
  1032. return nextGraphics1;
  1033. }
  1034.  
  1035. public Graphics getNextGraphics2() {
  1036. return nextGraphics2;
  1037. }
  1038.  
  1039. public Graphics getNextGraphics3() {
  1040. return nextGraphics3;
  1041. }
  1042.  
  1043. public Graphics getNextGraphics4() {
  1044. return nextGraphics4;
  1045. }
  1046.  
  1047. public void setDirection(int direction) {
  1048. this.direction = direction;
  1049. }
  1050.  
  1051. public int getDirection() {
  1052. return direction;
  1053. }
  1054.  
  1055. public void setFinished(boolean finished) {
  1056. this.finished = finished;
  1057. }
  1058.  
  1059. public boolean hasFinished() {
  1060. return finished;
  1061. }
  1062.  
  1063. public void setNextWorldTile(WorldTile nextWorldTile) {
  1064. this.nextWorldTile = nextWorldTile;
  1065. }
  1066.  
  1067. public WorldTile getNextWorldTile() {
  1068. return nextWorldTile;
  1069. }
  1070.  
  1071. public boolean hasTeleported() {
  1072. return teleported;
  1073. }
  1074.  
  1075. public int getSceneBaseChunkId() {
  1076. return sceneBaseChunkId;
  1077. }
  1078.  
  1079. public int getNextWalkDirection() {
  1080. return nextWalkDirection;
  1081. }
  1082.  
  1083. public int getNextRunDirection() {
  1084. return nextRunDirection;
  1085. }
  1086.  
  1087. public void setRun(boolean run) {
  1088. this.run = run;
  1089. }
  1090.  
  1091. public boolean getRun() {
  1092. return run;
  1093. }
  1094.  
  1095. public Rectangle getNextFaceWorldTile() {
  1096. return nextFaceWorldTile;
  1097. }
  1098.  
  1099. // @Deprecated used to face simply a tiel
  1100. // "use setNextFaceRectanglePrecise(tile, 1, 1)
  1101. public void setNextFaceWorldTile(WorldTile nextFaceWorldTile) {
  1102. // who the hell made setNextFaceworldTile() ??!!! fucking incorrect
  1103. // calcs.....
  1104. // also the thing you guys call direction is actually angle
  1105. setNextFaceRectanglePrecise(nextFaceWorldTile, 1, 1);
  1106. }
  1107.  
  1108. public void setNextFaceRectanglePrecise(WorldTile base, int sizeX, int sizeY) {
  1109. if (nextFaceWorldTile != null && nextFaceWorldTile.getX() == base.getX()
  1110. && nextFaceWorldTile.getY() == base.getY() && nextFaceWorldTile.getSizeX() == sizeX
  1111. && nextFaceWorldTile.getSizeY() == sizeY)
  1112. return;
  1113. nextFaceWorldTile = new Rectangle(base.getX(), base.getY(), sizeX, sizeY);
  1114. updateAngle(base, sizeX, sizeY);
  1115. }
  1116.  
  1117. /*
  1118. * avoid using it :p
  1119. */
  1120. @Deprecated
  1121. public void updateAngle(WorldTile base, int sizeX, int sizeY) {
  1122. WorldTile from = nextWorldTile != null ? nextWorldTile : this;
  1123. int srcX = (from.getX() * 512) + (getSize() * 256);
  1124. int srcY = (from.getY() * 512) + (getSize() * 256);
  1125. int dstX = (base.getX() * 512) + (sizeX * 256);
  1126. int dstY = (base.getY() * 512) + (sizeY * 256);
  1127. int deltaX = srcX - dstX;
  1128. int deltaY = srcY - dstY;
  1129. direction = deltaX != 0 || deltaY != 0 ? (int) (Math.atan2((double) deltaX, (double) deltaY) * 2607.5945876176133) & 0x3FFF
  1130. : 0;
  1131. }
  1132.  
  1133. public abstract int getSize();
  1134.  
  1135. public void cancelFaceEntityNoCheck() {
  1136. nextFaceEntity = -2;
  1137. lastFaceEntity = -1;
  1138. }
  1139.  
  1140. public void setNextFaceEntity(Entity entity) {
  1141. if (entity == null) {
  1142. nextFaceEntity = -1;
  1143. lastFaceEntity = -1;
  1144. } else {
  1145. nextFaceEntity = entity.getClientIndex();
  1146. lastFaceEntity = nextFaceEntity;
  1147. }
  1148. }
  1149.  
  1150. public int getNextFaceEntity() {
  1151. return nextFaceEntity;
  1152. }
  1153.  
  1154. /*
  1155. * override this for npcs
  1156. */
  1157. public boolean isStunImmune() {
  1158. return effectsManager.hasActiveEffect(EffectType.ANTICIPATION)
  1159. || effectsManager.hasActiveEffect(EffectType.FREEDOM);
  1160. }
  1161.  
  1162. public int getLastFaceEntity() {
  1163. return lastFaceEntity;
  1164. }
  1165.  
  1166. public boolean isBoundImmune() {
  1167. // size 2+ = too big to be frozen
  1168. return effectsManager.hasActiveEffect(EffectType.FREEDOM)
  1169. || effectsManager.hasActiveEffect(EffectType.BOUND_IMMUNITY) || getSize() > 2;
  1170. }
  1171.  
  1172. public abstract double getMagePrayerMultiplier();
  1173.  
  1174. public abstract double getRangePrayerMultiplier();
  1175.  
  1176. public abstract double getMeleePrayerMultiplier();
  1177.  
  1178. public Entity getAttackedBy() {
  1179. return attackedBy;
  1180. }
  1181.  
  1182. public void setAttackedBy(Entity attackedBy) {
  1183. this.attackedBy = attackedBy;
  1184. }
  1185.  
  1186. public long getAttackedByDelay() {
  1187. return attackedByDelay;
  1188. }
  1189.  
  1190. public void setAttackedByDelay(long attackedByDelay) {
  1191. this.attackedByDelay = attackedByDelay;
  1192. }
  1193.  
  1194. public boolean isAtDynamicRegion() {
  1195. return isAtDynamicRegion;
  1196. }
  1197.  
  1198. public ForceMovement getNextForceMovement() {
  1199. return nextForceMovement;
  1200. }
  1201.  
  1202. public void setNextForceMovement(ForceMovement nextForceMovement) {
  1203. this.nextForceMovement = nextForceMovement;
  1204. }
  1205.  
  1206. public EffectsManager getEffectsManager() {
  1207. return effectsManager;
  1208. }
  1209.  
  1210. public ForceTalk getNextForceTalk() {
  1211. return nextForceTalk;
  1212. }
  1213.  
  1214. public void setNextForceTalk(ForceTalk nextForceTalk) {
  1215. this.nextForceTalk = nextForceTalk;
  1216. }
  1217.  
  1218. public void faceEntity(Entity target) {
  1219. // setNextFaceWorldTile(new
  1220. // WorldTile(target.getCoordFaceX(target.getSize()),
  1221. // target.getCoordFaceY(target.getSize()), target.getPlane()));
  1222. setNextFaceRectanglePrecise(new WorldTile(target.getX(), target.getY(), target.getPlane()), target.getSize(),
  1223. target.getSize());
  1224. }
  1225.  
  1226. public void faceObject(WorldObject object) {
  1227. ObjectDefinitions def = object.getDefinitions();
  1228. int x = -1, y = -1;
  1229. int sizeX = 1, sizeY = 1;
  1230. if (object.getType() == 0) { // wall
  1231. if (object.getRotation() == 0) { // west
  1232. x = object.getX() - 1;
  1233. y = object.getY();
  1234. } else if (object.getRotation() == 1) { // north
  1235. x = object.getX();
  1236. y = object.getY() + 1;
  1237. } else if (object.getRotation() == 2) { // east
  1238. x = object.getX() + 1;
  1239. y = object.getY();
  1240. } else if (object.getRotation() == 3) { // south
  1241. x = object.getX();
  1242. y = object.getY() - 1;
  1243. }
  1244. } else if (object.getType() == 1 || object.getType() == 2) { // corner
  1245. // and
  1246. // cornerwall
  1247. if (object.getRotation() == 0) { // nw
  1248. x = object.getX() - 1;
  1249. y = object.getY() + 1;
  1250. } else if (object.getRotation() == 1) { // ne
  1251. x = object.getX() + 1;
  1252. y = object.getY() + 1;
  1253. } else if (object.getRotation() == 2) { // se
  1254. x = object.getX() + 1;
  1255. y = object.getY() - 1;
  1256. } else if (object.getRotation() == 3) { // sw
  1257. x = object.getX() - 1;
  1258. y = object.getY() - 1;
  1259. }
  1260. } else if (object.getType() == 3) { // inverted corner
  1261. if (object.getRotation() == 0) { // se
  1262. x = object.getX() + 1;
  1263. y = object.getY() - 1;
  1264. } else if (object.getRotation() == 1) { // sw
  1265. x = object.getX() - 1;
  1266. y = object.getY() - 1;
  1267. } else if (object.getRotation() == 2) { // nw
  1268. x = object.getX() - 1;
  1269. y = object.getY() + 1;
  1270. } else if (object.getRotation() == 3) { // ne
  1271. x = object.getX() + 1;
  1272. y = object.getY() + 1;
  1273. }
  1274. } else if (object.getType() < 10) { // walldeco's
  1275. if (object.getRotation() == 0) { // west
  1276. x = object.getX() - 1;
  1277. y = object.getY();
  1278. } else if (object.getRotation() == 1) { // north
  1279. x = object.getX();
  1280. y = object.getY() + 1;
  1281. } else if (object.getRotation() == 2) { // east
  1282. x = object.getX() + 1;
  1283. y = object.getY();
  1284. } else if (object.getRotation() == 3) { // south
  1285. x = object.getX();
  1286. y = object.getY() - 1;
  1287. }
  1288. } else if (object.getType() == 10 || object.getType() == 11 || object.getType() == 22) { // multisized
  1289. // rect
  1290. // objs
  1291. if (object.getRotation() == 0 || object.getRotation() == 2) {
  1292. x = object.getX();
  1293. y = object.getY();
  1294. sizeX = def.getSizeX();
  1295. sizeY = def.getSizeY();
  1296. } else {
  1297. x = object.getX();
  1298. y = object.getY();
  1299. sizeX = def.getSizeY();
  1300. sizeY = def.getSizeX();
  1301. }
  1302. } else {
  1303. // rest
  1304. x = object.getX();
  1305. y = object.getY();
  1306. }
  1307.  
  1308. setNextFaceRectanglePrecise(new WorldTile(x, y, getPlane()), sizeX, sizeY);
  1309. }
  1310.  
  1311. public long getLastAnimationEnd() {
  1312. return lastAnimationEnd;
  1313. }
  1314.  
  1315. public ConcurrentHashMap<Object, Object> getTemporaryAttributtes() {
  1316. return temporaryAttributes;
  1317. }
  1318.  
  1319. public WorldTile getLastWorldTile() {
  1320. return lastWorldTile;
  1321. }
  1322.  
  1323. public ArrayList<Hit> getNextHits() {
  1324. return nextHits;
  1325. }
  1326.  
  1327. public void playSoundEffect(int soundId) {
  1328. for (int regionId : getMapRegionsIds()) {
  1329. List<Integer> playerIndexes = World.getRegion(regionId).getPlayerIndexes();
  1330. if (playerIndexes != null) {
  1331. for (int playerIndex : playerIndexes) {
  1332. Player player = World.getPlayers().get(playerIndex);
  1333. if (player == null || !player.isRunning() || !withinDistance(player))
  1334. continue;
  1335. player.getPackets().sendSoundEffect(soundId);
  1336. }
  1337. }
  1338. }
  1339. }
  1340.  
  1341. public long getFindTargetDelay() {
  1342. return findTargetDelay;
  1343. }
  1344.  
  1345. public void setFindTargetDelay(long findTargetDelay) {
  1346. this.findTargetDelay = findTargetDelay;
  1347. }
  1348.  
  1349. public void sendSoulSplit(final Hit hit, final Entity user) {
  1350.  
  1351. if (hit.getDamage() > 0) {
  1352. Projectile projectile = World.sendProjectileNew(this, user, 2263, 11, 11, 30, -1, 20, 0);
  1353. if (this instanceof Player)
  1354. ((Player) Entity.this).getPrayer().drainPrayer(hit.getDamage() / 85);
  1355. WorldTasksManager.schedule(new WorldTask() {
  1356. @Override
  1357. public void run() {
  1358. setNextGraphics(new Graphics(2264));
  1359. }
  1360. });
  1361. WorldTasksManager.schedule(new WorldTask() {
  1362. @Override
  1363. public void run() {
  1364. if (user.isDead())
  1365. return;
  1366. user.heal(
  1367. (int) (hit.getDamage() > 2000 ? (200 + ((hit.getDamage() - 2000) * 0.05))
  1368. : hit.getDamage() * 0.1), 0, 0, false);
  1369. }
  1370. }, Utils.projectileTimeToCycles(projectile.getEndTime()));
  1371. }
  1372. }
  1373.  
  1374. public ArrayList<HitBar> getNextHitBars() {
  1375. return nextHitBars;
  1376. }
  1377.  
  1378. public long getAttackingDelay() {
  1379. return attackingDelay;
  1380. }
  1381.  
  1382. public void setAttackingDelay(long attackingDelay) {
  1383. this.attackingDelay = attackingDelay;
  1384. }
  1385.  
  1386. public boolean isUnderCombat() {
  1387. return getAttackedByDelay() + 6000 >= Utils.currentTimeMillis()
  1388. || getAttackingDelay() + 6000 >= Utils.currentTimeMillis();
  1389. }
  1390.  
  1391. public abstract String getName();
  1392.  
  1393. public abstract int getCombatLevel();
  1394.  
  1395. public boolean isNeedTargetInformationUpdate() {
  1396. return needTargetInformationUpdate;
  1397. }
  1398.  
  1399. public boolean isPoisonImmune() {
  1400. return false;
  1401. }
  1402.  
  1403. public boolean isBound() {
  1404. return effectsManager.hasActiveEffect(EffectType.BOUND)
  1405. || effectsManager.hasActiveEffect(EffectType.BINDING_SHOT);
  1406. }
  1407.  
  1408. public boolean isStunned() {
  1409. return effectsManager.hasActiveEffect(EffectType.STUNNED);
  1410. }
  1411.  
  1412. public void setStunDelay(int delay) {
  1413. effectsManager.startEffect(new Effect(EffectType.STUNNED, delay));
  1414. }
  1415.  
  1416. public void setBoundDelay(int delay) {
  1417. setBoundDelay(delay, false);
  1418. }
  1419.  
  1420. public void setBoundDelay(int delay, boolean frozen) {
  1421. setBoundDelay(delay, frozen, 3);
  1422. }
  1423.  
  1424. public void setBoundDelay(int delay, boolean frozen, int immunityDelay) {
  1425. effectsManager.startEffect(new Effect(EffectType.BOUND, delay, frozen, immunityDelay));
  1426. }
  1427.  
  1428. public abstract void giveXP();
  1429.  
  1430. public Colour getNextColour() {
  1431. return nextColour;
  1432. }
  1433.  
  1434. public void setNextColour(Colour nextColour) {
  1435. this.nextColour = nextColour;
  1436. }
  1437.  
  1438. private boolean cantDoDefenceEmote;
  1439.  
  1440. public boolean isCantDoDefenceEmote() {
  1441. return cantDoDefenceEmote;
  1442. }
  1443.  
  1444. public void setCantDoDefenceEmote(boolean cantDoDefenceEmote) {
  1445. this.cantDoDefenceEmote = cantDoDefenceEmote;
  1446. }
  1447. }
Advertisement
Add Comment
Please, Sign In to add comment