Guest User

Untitled

a guest
Sep 22nd, 2018
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.22 KB | None | 0 0
  1. package com.rs.game.npc.combat.impl;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5.  
  6. import com.rs.cache.loaders.NPCDefinitions;
  7. import com.rs.game.Animation;
  8. import com.rs.game.Entity;
  9. import com.rs.game.ForceMovement;
  10. import com.rs.game.ForceTalk;
  11. import com.rs.game.Graphics;
  12. import com.rs.game.Hit;
  13. import com.rs.game.Hit.HitLook;
  14. import com.rs.game.World;
  15. import com.rs.game.WorldObject;
  16. import com.rs.game.WorldTile;
  17. import com.rs.game.npc.NPC;
  18. import com.rs.game.npc.combat.CombatScript;
  19. import com.rs.game.npc.combat.NPCCombatDefinitions;
  20. import com.rs.game.npc.godwars.zaros.Nex;
  21. import com.rs.game.player.Player;
  22. import com.rs.game.player.cutscenes.NexCutScene;
  23. import com.rs.game.tasks.WorldTask;
  24. import com.rs.game.tasks.WorldTasksManager;
  25. import com.rs.utils.Utils;
  26.  
  27. public class NexCombat extends CombatScript {
  28.  
  29. @Override
  30. public Object[] getKeys() {
  31. return new Object[] { "Nex" };
  32. }
  33.  
  34. public WorldTile[] NO_ESCAPE_TELEPORTS = { new WorldTile(2924, 5213, 0), // north
  35. new WorldTile(2934, 5202, 0), // east,
  36. new WorldTile(2924, 5192, 0), // south
  37. new WorldTile(2913, 5202, 0), }; // west
  38.  
  39. @Override
  40. public int attack(final NPC npc, final Entity target) {
  41. final NPCCombatDefinitions defs = npc.getCombatDefinitions();
  42. final Nex nex = (Nex) npc;
  43. int size = npc.getSize();
  44. // attacks close only
  45. if (nex.isFollowTarget()) {
  46. int distanceX = target.getX() - npc.getX();
  47. int distanceY = target.getY() - npc.getY();
  48. if (distanceX > size || distanceX < -1 || distanceY > size
  49. || distanceY < -1)
  50. return 0;
  51. nex.setFollowTarget(Utils.getRandom(1) == 0);
  52. // first stage close attacks
  53. if (nex.getStage() == 2 && nex.getTemporaryAttributtes().get("AttackCount") != null)
  54. if ((Integer) nex.getTemporaryAttributtes().get("AttackCount") == 4) {
  55. nex.getTemporaryAttributtes().remove("AttackCount");
  56. nex.killBloodReavers();
  57. npc.setNextForceTalk(new ForceTalk(
  58. "A siphon will solve this!"));
  59. nex.playSound(3317, 2);
  60. npc.setNextAnimation(new Animation(6948));
  61. npc.setNextGraphics(new Graphics(1201));
  62. nex.setDoingSiphon(true);
  63. int bloodReaverSize = NPCDefinitions
  64. .getNPCDefinitions(13458).size;
  65. int respawnedBloodReaverCount = 0;
  66. int maxMinions = Utils.getRandom(2);
  67. if (maxMinions != 0) {
  68. int[][] dirs = Utils
  69. .getCoordOffsetsNear(bloodReaverSize);
  70. for (int dir = 0; dir < dirs[0].length; dir++) {
  71. final WorldTile tile = new WorldTile(new WorldTile(
  72. target.getX() + dirs[0][dir], target.getY()
  73. + dirs[1][dir], target.getPlane()));
  74. if (World.canMoveNPC(tile.getPlane(), tile.getX(),
  75. tile.getY(), bloodReaverSize)) { // if found
  76. // done
  77. nex.getBloodReavers()[respawnedBloodReaverCount++] = new NPC(
  78. 13458, tile, -1, true, true);
  79. if (respawnedBloodReaverCount == maxMinions)
  80. break;
  81. }
  82. }
  83. }
  84. WorldTasksManager.schedule(new WorldTask() {
  85. @Override
  86. public void run() {
  87. nex.setDoingSiphon(false);
  88. }
  89. }, 8);
  90. return defs.getAttackDelay();
  91. }
  92. if (nex.getAttacksStage() == 0) {
  93. // virus 1/3 probability every 1min
  94. if (nex.getLastVirus() < Utils.currentTimeMillis()
  95. && Utils.getRandom(2) == 0) {
  96. nex.setLastVirus(Utils.currentTimeMillis() + 60000);
  97. npc.setNextForceTalk(new ForceTalk(
  98. "Let the virus flow through you."));
  99. nex.playSound(3296, 2);
  100. npc.setNextAnimation(new Animation(6987));
  101. nex.sendVirusAttack(new ArrayList<Entity>(),
  102. npc.getPossibleTargets(), target);
  103. return defs.getAttackDelay();
  104. }
  105. }
  106. // no escape, 1/10 probability doing it
  107. if (nex.getStage() == 0 && Utils.getRandom(10) == 1) {
  108. npc.setNextForceTalk(new ForceTalk("There is..."));
  109. nex.playSound(3294, 2);
  110. npc.setCantInteract(true);
  111. npc.getCombat().removeTarget();
  112. final int idx = Utils.random(NO_ESCAPE_TELEPORTS.length);
  113. final WorldTile dir = NO_ESCAPE_TELEPORTS[idx];
  114. final WorldTile center = new WorldTile(2924, 5202, 0);
  115. WorldTasksManager.schedule(new WorldTask() {
  116. private int count;
  117.  
  118. @Override
  119. public void run() {
  120. if (count == 0) {
  121. npc.setNextAnimation(new Animation(6321));
  122. npc.setNextGraphics(new Graphics(1216));
  123. } else if (count == 1) {
  124. nex.setNextWorldTile(dir);
  125. nex.setNextForceTalk(new ForceTalk("NO ESCAPE!"));
  126. nex.playSound(3292, 2);
  127. nex.setNextForceMovement(new ForceMovement(dir, 1,
  128. center, 3, idx == 3 ? 1 : idx == 2 ? 0
  129. : idx == 1 ? 3 : 2));
  130. for (Entity entity : nex.calculatePossibleTargets(
  131. center, dir, idx == 0 || idx == 2)) {
  132. if (entity instanceof Player) {
  133. Player player = (Player) entity;
  134. player.getCutscenesManager().play(
  135. new NexCutScene(dir, idx));
  136. player.applyHit(new Hit(
  137. npc,
  138. Utils.getRandom(nex.getStage() == 4 ? 800
  139. : 650),
  140. HitLook.REGULAR_DAMAGE));
  141. player.setNextAnimation(new Animation(10070));
  142. player.setNextForceMovement(new ForceMovement(
  143. player, 1, idx == 3 ? 3
  144. : idx == 2 ? 2
  145. : idx == 1 ? 1 : 0));
  146. }
  147. }
  148. } else if (count == 3) {
  149. nex.setNextWorldTile(center);
  150. } else if (count == 4) {
  151. nex.setTarget(target);
  152. npc.setCantInteract(false);
  153. stop();
  154. }
  155. count++;
  156. }
  157. }, 0, 1);
  158. return defs.getAttackDelay();
  159. }
  160. // normal melee attack
  161. int damage = getRandomMaxHit(npc, defs.getMaxHit(),
  162. NPCCombatDefinitions.MELEE, target);
  163. delayHit(npc, 0, target, getMeleeHit(npc, damage));
  164. npc.setNextAnimation(new Animation(defs.getAttackEmote()));
  165. return defs.getAttackDelay();
  166. // far attacks
  167. } else {
  168. nex.setFollowTarget(Utils.getRandom(1) == 0);
  169. // drag a player to center
  170. if (Utils.getRandom(15) == 0) {
  171. int distance = 0;
  172. Entity settedTarget = null;
  173. for (Entity t : npc.getPossibleTargets()) {
  174. if (t instanceof Player) {
  175. int thisDistance = Utils.getDistance(t.getX(),
  176. t.getY(), npc.getX(), npc.getY());
  177. if (settedTarget == null || thisDistance > distance) {
  178. distance = thisDistance;
  179. settedTarget = t;
  180. }
  181. }
  182. }
  183. if (settedTarget != null && distance > 10) {
  184. final Player player = (Player) settedTarget;
  185. //player.addStopDelay(3);
  186. player.setNextAnimation(new Animation(14386));
  187. player.setNextForceMovement(new ForceMovement(nex, 2, Utils
  188. .getMoveDirection(
  189. npc.getCoordFaceX(player.getSize())
  190. - player.getX(),
  191. npc.getCoordFaceY(player.getSize())
  192. - player.getY())));
  193. npc.setNextAnimation(new Animation(6986));
  194. npc.setTarget(player);
  195. player.setNextAnimation(new Animation(-1));
  196. WorldTasksManager.schedule(new WorldTask() {
  197. @Override
  198. public void run() {
  199. player.setNextWorldTile(nex);
  200. player.getPackets()
  201. .sendGameMessage(
  202. "You've been injured and you can't use protective curses!");
  203. player.setPrayerDelay(Utils.getRandom(20000) + 5);// random
  204. // 20
  205. // seconds
  206. player.getPackets().sendGameMessage(
  207. "You're stunned.");
  208. }
  209. });
  210. return defs.getAttackDelay();
  211. }
  212. }
  213. // first stage close attacks
  214. if (nex.getAttacksStage() == 0) {
  215. npc.setNextAnimation(new Animation(6987));
  216. for (Entity t : npc.getPossibleTargets()) {
  217. World.sendProjectile(npc, t, 471, 41, 16, 41, 35, 16, 0);
  218. int damage = getRandomMaxHit(npc, defs.getMaxHit(),
  219. NPCCombatDefinitions.MAGE, t);
  220. delayHit(npc, 1, t, getMagicHit(npc, damage));
  221. if (damage > 0 && Utils.getRandom(5) == 0) // 1/6
  222. // probability
  223. // poisoning
  224. t.getPoison().makePoisoned(80);
  225. }
  226. return defs.getAttackDelay();
  227. } else if (nex.getAttacksStage() == 1) {
  228. if (!nex.isEmbracedShadow()) {
  229. nex.setEmbracedShadow(true);
  230. npc.setNextForceTalk(new ForceTalk("Embrace darkness!"));
  231. nex.playSound(3322, 2);
  232. npc.setNextAnimation(new Animation(6355));
  233. npc.setNextGraphics(new Graphics(1217));
  234. WorldTasksManager.schedule(new WorldTask() {
  235. @Override
  236. public void run() {
  237. if (nex.getAttacksStage() != 1 || nex.hasFinished()) {
  238. for (Entity entity : nex.getPossibleTargets()) {
  239. if (entity instanceof Player) {
  240. Player player = (Player) entity;
  241. //player.getPackets().sendGlobalConfig(
  242. //1435, 255);
  243. //TODO Find new nex darkness.
  244. player.Send("Information : dark phase under developement.");
  245. }
  246. }
  247. stop();
  248. return;
  249. }
  250. if (Utils.getRandom(2) == 0) {
  251. for (Entity entity : nex.getPossibleTargets()) {
  252. if (entity instanceof Player) {
  253. Player player = (Player) entity;
  254. int distance = Utils.getDistance(
  255. player.getX(), player.getY(),
  256. npc.getX(), npc.getY());
  257. if (distance > 30)
  258. distance = 30;
  259. //player.getPackets().sendGlobalConfig(
  260. //1435, (distance * 255 / 30));
  261. }
  262. }
  263. }
  264. }
  265. }, 0, 0);
  266. return defs.getAttackDelay();
  267. }
  268. if (!nex.isTrapsSettedUp() && Utils.getRandom(2) == 0) {
  269. nex.setTrapsSettedUp(true);
  270. npc.setNextForceTalk(new ForceTalk("Fear the Shadow!"));
  271. nex.playSound(3314, 2);
  272. npc.setNextAnimation(new Animation(6984));
  273. npc.setNextGraphics(new Graphics(1215));
  274. ArrayList<Entity> possibleTargets = nex
  275. .getPossibleTargets();
  276. final HashMap<String, int[]> tiles = new HashMap<String, int[]>();
  277. for (Entity t : possibleTargets) {
  278. if(!t.withinDistance(nex, 10))
  279. continue;
  280. String key = t.getX() + "_" + t.getY();
  281. if (!tiles.containsKey(t.getX() + "_" + t.getY())) {
  282. tiles.put(key, new int[] { t.getX(), t.getY() });
  283. World.spawnTemporaryObject(new WorldObject(57261,
  284. 10, 0, t.getX(), t.getY(), 0), 2400);
  285. }
  286. }
  287. WorldTasksManager.schedule(new WorldTask() {
  288. private boolean firstCall;
  289.  
  290. @Override
  291. public void run() {
  292. if (!firstCall) {
  293. ArrayList<Entity> possibleTargets = nex
  294. .getPossibleTargets();
  295. for (int[] tile : tiles.values()) {
  296. World.sendGraphics(null, new Graphics(383),
  297. new WorldTile(tile[0], tile[1], 0));
  298. for (Entity t : possibleTargets)
  299. if (t.getX() == tile[0]
  300. && t.getY() == tile[1])
  301. t.applyHit(new Hit(npc, Utils
  302. .getRandom(400) + 400,
  303. HitLook.REGULAR_DAMAGE));
  304. }
  305. firstCall = true;
  306. } else {
  307. nex.setTrapsSettedUp(false);
  308. stop();
  309. }
  310. }
  311.  
  312. }, 3, 3);
  313. return defs.getAttackDelay();
  314. }
  315. npc.setNextAnimation(new Animation(6987));
  316. for (final Entity t : npc.getPossibleTargets()) {
  317. int distance = Utils.getDistance(t.getX(), t.getY(),
  318. npc.getX(), npc.getY());
  319. if (distance <= 10) {
  320. int damage = 800 - (distance * 800 / 11);
  321. World.sendProjectile(npc, t, 380, 41, 16, 41, 35, 16, 0);
  322. delayHit(
  323. npc,
  324. 1,
  325. t,
  326. getRangeHit(
  327. npc,
  328. getRandomMaxHit(npc, damage,
  329. NPCCombatDefinitions.RANGE, t)));
  330. WorldTasksManager.schedule(new WorldTask() {
  331. @Override
  332. public void run() {
  333. t.setNextGraphics(new Graphics(471));
  334. }
  335. }, 1);
  336. }
  337. }
  338. return defs.getAttackDelay();
  339. } else if (nex.getAttacksStage() == 2) {
  340. if (Utils.getRandom(4) == 0 && target instanceof Player && nex.getTemporaryAttributtes().get("AttackCount") == null) {
  341. nex.getTemporaryAttributtes().put("AttackCount", 0);
  342. npc.setNextForceTalk(new ForceTalk(
  343. "I demand a blood sacrifice!"));
  344. nex.playSound(3293, 2);
  345. final Player player = (Player) target;
  346. player.getAppearence().setGlowRed(true);
  347. player.getPackets().sendGameMessage(
  348. "Nex has marked you as a sacrifice, RUN!");
  349. final int x = player.getX();
  350. final int y = player.getY();
  351. WorldTasksManager.schedule(new WorldTask() {
  352. @Override
  353. public void run() {
  354. player.getAppearence().setGlowRed(false);
  355. if (x == player.getX() && y == player.getY()) {
  356. player.getPackets()
  357. .sendGameMessage(
  358. "You didn't make it far enough in time - Nex fires a punishing attack!");
  359. npc.setNextAnimation(new Animation(6987));
  360. for (final Entity t : npc.getPossibleTargets()) {
  361. World.sendProjectile(npc, t, 374, 41, 16,
  362. 41, 35, 16, 0);
  363. final int damage = getRandomMaxHit(npc,
  364. 290, NPCCombatDefinitions.MAGE, t);
  365. delayHit(npc, 1, t,
  366. getMagicHit(npc, damage));
  367. WorldTasksManager.schedule(new WorldTask() {
  368. @Override
  369. public void run() {
  370. t.setNextGraphics(new Graphics(376));
  371. nex.heal(damage / 4);
  372. if (t instanceof Player) {
  373. Player p = (Player) t;
  374. p.getPrayer()
  375. .drainPrayerOnHalf();
  376. }
  377. }
  378. }, 1);
  379. }
  380. }
  381. }
  382. }, defs.getAttackDelay());
  383. nex.getTemporaryAttributtes().put("AttackCount", 0);
  384. return defs.getAttackDelay() * 2;
  385. }
  386.  
  387. npc.setNextAnimation(new Animation(6986));
  388. World.sendProjectile(npc, target, 374, 41, 16, 41, 35, 16, 0);
  389. delayHit(
  390. npc,
  391. 1,
  392. target,
  393. getMagicHit(
  394. npc,
  395. getRandomMaxHit(npc, defs.getMaxHit(),
  396. NPCCombatDefinitions.MAGE, target)));
  397. return defs.getAttackDelay();
  398. } else if (nex.getAttacksStage() == 3) {
  399. int nexAttack = Utils.getRandom(4);
  400. if (!nex.isTrapsSettedUp() && nexAttack == 0) {
  401. nex.setTrapsSettedUp(true);
  402. npc.setNextForceTalk(new ForceTalk("Die now, in the prison of ice!"));
  403. ArrayList<Entity> possibleTargets = nex
  404. .getPossibleTargets();
  405. final HashMap<String, int[]> tiles = new HashMap<String, int[]>();
  406.  
  407. Player t = (Player) possibleTargets.get(Utils.getRandom(possibleTargets.size() - 1));
  408. String key = t.getX() + "_" + t.getY();
  409. if (!tiles.containsKey(t.getX() + "_" + t.getY())) {
  410. tiles.put(key, new int[] { t.getX(), t.getY() });
  411. World.spawnTemporaryObject(new WorldObject(57263,
  412. 10, 0, t.getX() + 1, t.getY(), 0), 5000);
  413. World.spawnTemporaryObject(new WorldObject(57263,
  414. 10, 0, t.getX() - 1, t.getY(), 0), 5000);
  415. World.spawnTemporaryObject(new WorldObject(57263,
  416. 10, 0, t.getX(), t.getY() + 1, 0), 5000);
  417. World.spawnTemporaryObject(new WorldObject(57263,
  418. 10, 0, t.getX(), t.getY() - 1, 0), 5000);
  419. World.spawnTemporaryObject(new WorldObject(57263,
  420. 10, 0, t.getX() - 1, t.getY() - 1, 0), 5000);
  421. World.spawnTemporaryObject(new WorldObject(57263,
  422. 10, 0, t.getX() + 1, t.getY() + 1, 0), 5000);
  423. World.spawnTemporaryObject(new WorldObject(57263,
  424. 10, 0, t.getX() + 1, t.getY() - 1, 0), 5000);
  425. World.spawnTemporaryObject(new WorldObject(57263,
  426. 10, 0, t.getX() - 1, t.getY() + 1, 0), 5000);
  427. t.getTemporaryAttributtes().put("IcePrison", possibleTargets.size() == 1 && Utils.getRandom(2) == 1 ? true : false);
  428. nex.getTemporaryAttributtes().put("IcePrison", t);
  429. t.setFreezeDelay(-1);
  430.  
  431. }
  432. WorldTasksManager.schedule(new WorldTask() {
  433. private boolean firstCall;
  434.  
  435. @Override
  436. public void run() {
  437. if (!firstCall) {
  438. ArrayList<Entity> possibleTargets = nex
  439. .getPossibleTargets();
  440. for (int[] tile : tiles.values()) {
  441. for (Entity t : possibleTargets)
  442. if (t.getX() == tile[0]
  443. && t.getY() == tile[1]) {
  444. t.applyHit(new Hit(npc, Utils
  445. .getRandom(300) + 300,
  446. HitLook.REGULAR_DAMAGE));
  447. t.setNextGraphics(new Graphics(369));
  448. t.getTemporaryAttributtes().remove("IcePrison");
  449. }
  450. }
  451. firstCall = true;
  452. } else {
  453. Player p = (Player)nex.getTemporaryAttributtes().get("IcePrison");
  454. if(p != null)
  455. p.getTemporaryAttributtes().remove("IcePrison");
  456. nex.getTemporaryAttributtes().remove("IcePrison");
  457. nex.setTrapsSettedUp(false);
  458. stop();
  459. }
  460. }
  461.  
  462. }, 7, 7);
  463. return defs.getAttackDelay();
  464. } else if(!nex.isTrapsSettedUp() && nexAttack == 1) {//containment
  465. nex.setTrapsSettedUp(true);
  466. npc.setNextForceTalk(new ForceTalk("Contain this!"));
  467. nex.addFreezeDelay(8000);
  468. ArrayList<Entity> possibleTargets = nex
  469. .getPossibleTargets();
  470. final HashMap<String, int[]> tiles = new HashMap<String, int[]>();
  471.  
  472. int x = nex.getX();
  473. int y = nex.getY();
  474.  
  475. final WorldTile[] coords = { new WorldTile(x, y + 2, 0),
  476. new WorldTile(x, y - 2, 0),
  477. new WorldTile(x + 2, y, 0),
  478. new WorldTile(x - 2, y, 0),
  479. new WorldTile(x + 2, y + 2, 0),
  480. new WorldTile(x - 2, y - 2, 0),
  481. new WorldTile(x - 2, y + 2, 0),
  482. new WorldTile(x + 2, y - 2, 0),
  483. new WorldTile(x + 2, y + 1, 0),
  484. new WorldTile(x + 2, y - 1, 0),
  485. new WorldTile(x - 2, y + 1, 0),
  486. new WorldTile(x - 2, y - 1, 0),
  487. new WorldTile(x - 2, y + 1, 0),
  488. new WorldTile(x - 2, y - 1, 0),
  489. new WorldTile(x + 1, y - 2, 0),
  490. new WorldTile(x - 1, y - 2, 0),
  491. new WorldTile(x + 1, y + 2, 0),
  492. new WorldTile(x + 1, y + 2, 0)};
  493.  
  494. WorldTasksManager.schedule(new WorldTask() {
  495.  
  496. @Override
  497. public void run() {
  498. for(WorldTile tile : coords) {
  499. String key = tile.getX() + "_" + tile.getY();
  500. if (!tiles.containsKey(tile.getX() + "_" + tile.getY())) {
  501. if(!World.checkWalkStep(tile.getPlane(), tile.getX(), tile.getY(), 0, 0))
  502. continue;
  503. tiles.put(key, new int[] { tile.getX(), tile.getY() });
  504. World.spawnTemporaryObject(new WorldObject(57262,
  505. 10, 0, tile.getX(), tile.getY(), 0), 5000);
  506.  
  507. }
  508. }
  509. stop();
  510. }
  511.  
  512. }, 3, 3);
  513.  
  514. WorldTasksManager.schedule(new WorldTask() {
  515. private boolean firstCall;
  516.  
  517. @Override
  518. public void run() {
  519. if (!firstCall) {
  520. ArrayList<Entity> possibleTargets = nex
  521. .getPossibleTargets();
  522. for (Entity t : possibleTargets)
  523. if(t.withinDistance(nex, 2))
  524. t.applyHit(new Hit(npc, Utils
  525. .getRandom(200) + 200,
  526. HitLook.REGULAR_DAMAGE));
  527. firstCall = true;
  528. } else {
  529. nex.setTrapsSettedUp(false);
  530. stop();
  531. }
  532. }
  533.  
  534. }, 7, 7);
  535. return defs.getAttackDelay();
  536. } else {
  537. npc.setNextAnimation(new Animation(6986));
  538. for (final Entity t : npc.getPossibleTargets()) {
  539. if(t.getTemporaryAttributtes().get("IcePrison") != null)
  540. continue;
  541. World.sendProjectile(npc, t, 362, 41, 16, 41, 35, 16, 0);
  542. int damage = getRandomMaxHit(npc, defs.getMaxHit(),
  543. NPCCombatDefinitions.MAGE, t);
  544. delayHit(npc, 1, t, getMagicHit(npc, damage));
  545. if (damage > 0 && Utils.getRandom(5) == 0) {// 1/6
  546. // probability
  547. // freezing
  548. WorldTasksManager.schedule(new WorldTask() {
  549. @Override
  550. public void run() {
  551. t.addFreezeDelay(18000);
  552. t.setNextGraphics(new Graphics(369));
  553. }
  554. }, 2);
  555.  
  556. }
  557. }
  558. return defs.getAttackDelay();
  559. }
  560. } else if (nex.getAttacksStage() == 4) {
  561. npc.setNextAnimation(new Animation(6987));
  562. for (Entity t : npc.getPossibleTargets()) {
  563. World.sendProjectile(npc, t, 471, 41, 16, 41, 35, 16, 0);
  564. int damage = getRandomMaxHit(npc, defs.getMaxHit(),
  565. NPCCombatDefinitions.MAGE, t);
  566. delayHit(npc, 1, t, getMagicHit(npc, damage));
  567. }
  568. return defs.getAttackDelay();
  569. }
  570. }
  571. return defs.getAttackDelay();
  572. }
  573. }
Add Comment
Please, Sign In to add comment