Guest User

Untitled

a guest
Oct 17th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 94.18 KB | None | 0 0
  1. package server.model.npcs;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileNotFoundException;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import java.util.ArrayList;
  8.  
  9. import server.Config;
  10. import server.Server;
  11. import server.model.players.Client;
  12. import server.model.minigames.PestControl;
  13. import server.util.Misc;
  14. import server.world.map.VirtualWorld;
  15. import server.event.EventManager;
  16. import server.event.Event;
  17. import server.event.EventContainer;
  18.  
  19. public class NPCHandler {
  20. public static int maxNPCs = 10000;
  21. public static int maxListedNPCs = 10000;
  22. public static int random;
  23. public static int maxNPCDrops = 10000;
  24.  
  25.  
  26. public String[] voidKnightTalk = {
  27. "We must not fail!",
  28. "Take down the portals",
  29. "The Void Knights will not fall!",
  30. "Hail the Void Knights!",
  31. "We are beating these scum!"
  32. };
  33.  
  34.  
  35. public static NPC npcs[] = new NPC[maxNPCs];
  36. public static NPCList NpcList[] = new NPCList[maxListedNPCs];
  37. public NPCHandler() {
  38. for(int i = 0; i < maxNPCs; i++) {
  39. npcs[i] = null;
  40. }
  41. for(int i = 0; i < maxListedNPCs; i++) {
  42. NpcList[i] = null;
  43. }
  44. loadNPCList("./Data/CFG/npc.cfg");
  45. loadAutoSpawn("./Data/CFG/spawn-config.cfg");
  46. }
  47.  
  48.  
  49. public void Summon(Client c, int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, boolean attackPlayer, int attack, int defence) {
  50.  
  51.  
  52. // first, search for a free slot
  53. int slot = -1;
  54. for (int i = 1; i < maxNPCs; i++) {
  55. if (npcs[i] == null) {
  56. slot = i;
  57. break;
  58. }
  59. }
  60. if(slot == -1) {
  61. //Misc.println("No Free Slot");
  62. return; // no free slot found
  63. }
  64. NPC newNPC = new NPC(slot, npcType);
  65. newNPC.absX = x;
  66. newNPC.absY = y;
  67. newNPC.makeX = x;
  68. newNPC.makeY = y;
  69. newNPC.heightLevel = heightLevel;
  70. newNPC.walkingType = WalkingType;
  71. newNPC.HP = HP;
  72. newNPC.MaxHP = HP;
  73. newNPC.maxHit = maxHit;
  74. newNPC.attack = attack;
  75. newNPC.defence = defence;
  76.  
  77. newNPC.spawnedBy = c.getId();
  78.  
  79. newNPC.followPlayer = c.getId();
  80. // followPlayer(npcType, c.getId());
  81. newNPC.summon = true;
  82. c.lastsummon = npcType;
  83. c.summon = true;
  84. newNPC.gfx0(1315);
  85. c.summoningnpcid = slot;
  86. newNPC.npcslot = slot;
  87.  
  88.  
  89. if(attackPlayer) {
  90. newNPC.underAttack = true;
  91. if(c != null) {
  92. if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] != newNPC.npcType) {
  93. if(newNPC.npcType == 2025 || newNPC.npcType == 2026 || newNPC.npcType == 2027 || newNPC.npcType == 2028 || newNPC.npcType == 2029 || newNPC.npcType == 2030) {
  94. newNPC.forceChat("You dare disturb my rest!");
  95. }
  96. }
  97. if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] == newNPC.npcType) {
  98. newNPC.forceChat("You dare steal from us!");
  99. }
  100.  
  101. newNPC.killerId = c.playerId;
  102. }
  103. }
  104. npcs[slot] = newNPC;
  105. }
  106.  
  107.  
  108. /*public void spawnNpc3(Client c, int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence, boolean attackPlayer, boolean headIcon, boolean summonFollow) {
  109. // first, search for a free slot
  110. int slot = -1;
  111. for (int i = 1; i < maxNPCs; i++) {
  112. if (npcs[i] == null) {
  113. slot = i;
  114. break;
  115. }
  116. }
  117. if(slot == -1) {
  118. //Misc.println("No Free Slot");
  119. return; // no free slot found
  120. }
  121. NPC newNPC = new NPC(slot, npcType);
  122. newNPC.absX = x;
  123. newNPC.absY = y;
  124. newNPC.makeX = x;
  125. newNPC.makeY = y;
  126. newNPC.heightLevel = heightLevel;
  127. newNPC.walkingType = WalkingType;
  128. newNPC.HP = HP;
  129. newNPC.MaxHP = HP;
  130. newNPC.maxHit = maxHit;
  131. newNPC.attack = attack;
  132. newNPC.defence = defence;
  133. newNPC.spawnedBy = c.getId();
  134. newNPC.underAttack = true;
  135. newNPC.facePlayer(c.playerId);
  136. if(headIcon)
  137. c.getPA().drawHeadicon(1, slot, 0, 0);
  138. if (summonFollow) {
  139. newNPC.summoner = true;
  140. newNPC.summonedBy = c.playerId;
  141. c.summonId = npcType;
  142. c.hasNpc = true;
  143. }
  144. if(attackPlayer) {
  145. newNPC.underAttack = true;
  146. if(c != null) {
  147. newNPC.killerId = c.playerId;
  148. }
  149. }
  150. npcs[slot] = newNPC;
  151. }*/
  152.  
  153. public void appendJailKc(int i) {
  154. Client c = (Client)Server.playerHandler.players[npcs[i].killedBy];
  155. if(c != null) {
  156. int[] Jail = {
  157. 132
  158. };
  159. for (int j : Jail) {
  160. if (npcs[i].npcType == j) {
  161. c.monkeyk0ed++;
  162. c.sendMessage("You now have "+c.monkeyk0ed+" Monkey kills!");
  163. } else {
  164. c.sendMessage("Woah man slow down.. you already have 20 monkey kills..");
  165. break;
  166. }
  167. }
  168. }
  169. }
  170.  
  171. public void multiAttackGfx(int i, int gfx) {
  172. if (npcs[i].projectileId < 0)
  173. return;
  174. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  175. if (Server.playerHandler.players[j] != null) {
  176. Client c = (Client)Server.playerHandler.players[j];
  177. if (c.heightLevel != npcs[i].heightLevel)
  178. continue;
  179. if (Server.playerHandler.players[j].goodDistance(c.absX, c.absY, npcs[i].absX, npcs[i].absY, 15)) {
  180. int nX = Server.npcHandler.npcs[i].getX() + offset(i);
  181. int nY = Server.npcHandler.npcs[i].getY() + offset(i);
  182. int pX = c.getX();
  183. int pY = c.getY();
  184. int offX = (nY - pY)* -1;
  185. int offY = (nX - pX)* -1;
  186. c.getPA().createPlayersProjectile(nX, nY, offX, offY, 50, getProjectileSpeed(i), npcs[i].projectileId, 43, 31, -c.getId() - 1, 65);
  187. }
  188. }
  189. }
  190. }
  191.  
  192. public boolean switchesAttackers(int i) {
  193. switch(npcs[i].npcType) {
  194. case 6261:
  195. case 6263:
  196. case 6265:
  197. case 6223:
  198. case 6225:
  199. case 6227:
  200. case 6248:
  201. case 6250:
  202. case 8133:
  203. case 6252:
  204. case 2892:
  205. case 2894:
  206. case 50:
  207. case 6206:
  208. case 6208:
  209. case 6204:
  210. return true;
  211.  
  212. }
  213.  
  214. return false;
  215. }
  216. public boolean ArmadylKC(int i) {
  217. switch(npcs[i].npcType) {
  218. case 6222:
  219. case 6223:
  220. case 6225:
  221. case 6230:
  222. case 6239: // Aviansie
  223. case 6227:
  224. case 6232:
  225. case 6229:
  226. case 6233:
  227. case 6231:
  228. return true;
  229.  
  230. }
  231.  
  232. return false;
  233. }
  234. public boolean BandosKC(int i) {
  235. switch(npcs[i].npcType) {
  236. case 6260:
  237. case 6261:
  238. case 6263:
  239. case 6265:
  240. case 6277:
  241. case 6269:
  242. case 6270:
  243. case 3247:
  244. case 6276:
  245. case 6272:
  246. case 6274:
  247. case 6278:
  248. return true;
  249.  
  250. }
  251.  
  252. return false;
  253. }
  254. public boolean ZammyKC(int i) {
  255. switch(npcs[i].npcType) {
  256. case 6203:
  257. case 6204:
  258. case 6206:
  259. case 6208:
  260. case 6219:
  261. case 6218:
  262. case 6212:
  263. case 3248:
  264. case 6220:
  265. case 6221:
  266. return true;
  267.  
  268. }
  269.  
  270. return false;
  271. }
  272. public boolean SaraKC(int i) {
  273. switch(npcs[i].npcType) {
  274. case 6247:
  275. case 6248:
  276. case 6250:
  277. case 6254:
  278. case 6252:
  279. case 6257:
  280. case 6255:
  281. case 6256:
  282. case 6258:
  283. return true;
  284.  
  285. }
  286.  
  287. return false;
  288. }
  289. public int getNpcDeleteTime(int i) {
  290. switch(npcs[i].npcType) {
  291. case 1265:
  292. case 90:
  293. case 1648:
  294. case 1341:
  295. case 1851:
  296. case 1857:
  297. case 1854:
  298. return 2;
  299. case 82:
  300. return 3;
  301. case 103:
  302.  
  303. return 0;
  304. case 117:
  305. return 6;
  306. default:
  307. return 4;
  308. }
  309. }
  310.  
  311. public void multiAttackDamage(int i) {
  312. int max = getMaxHit(i);
  313. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  314. if (Server.playerHandler.players[j] != null) {
  315. Client c = (Client)Server.playerHandler.players[j];
  316. if (c.isDead || c.heightLevel != npcs[i].heightLevel)
  317. continue;
  318. if (Server.playerHandler.players[j].goodDistance(c.absX, c.absY, npcs[i].absX, npcs[i].absY, 15)) {
  319. if (npcs[i].attackType == 2) {
  320. if (!c.prayerActive[16] && !c.curseActive[7]) {
  321. if (Misc.random(500) + 200 > Misc.random(c.getCombat().mageDef())) {
  322. int dam = Misc.random(max);
  323. c.dealDamage(dam);
  324. c.handleHitMask(dam);
  325. } else {
  326. c.dealDamage(0);
  327. c.handleHitMask(0);
  328. }
  329. } else {
  330. c.dealDamage(0);
  331. c.handleHitMask(0);
  332. }
  333. } else if (npcs[i].attackType == 1) {
  334. if (!c.prayerActive[17] && !c.curseActive[8]) {
  335. int dam = Misc.random(max);
  336. if (Misc.random(500) + 200 > Misc.random(c.getCombat().calculateRangeDefence())) {
  337. c.dealDamage(dam);
  338. c.handleHitMask(dam);
  339. } else {
  340. c.dealDamage(0);
  341. c.handleHitMask(0);
  342. }
  343. } else {
  344. c.dealDamage(0);
  345. c.handleHitMask(0);
  346. }
  347. }
  348. if (npcs[i].endGfx > 0) {
  349. c.gfx0(npcs[i].endGfx);
  350. }
  351. }
  352. c.getPA().refreshSkill(3);
  353. }
  354. }
  355. }
  356.  
  357. public int getClosePlayer(int i) {
  358. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  359. if (Server.playerHandler.players[j] != null) {
  360. if (j == npcs[i].spawnedBy)
  361. return j;
  362. if (goodDistance(Server.playerHandler.players[j].absX, Server.playerHandler.players[j].absY, npcs[i].absX, npcs[i].absY, 2 + distanceRequired(i) + followDistance(i)) || isFightCaveNpc(i) || isRFDNpc(i)) {
  363. if ((Server.playerHandler.players[j].underAttackBy <= 0 && Server.playerHandler.players[j].underAttackBy2 <= 0) || Server.playerHandler.players[j].inMulti())
  364. if (Server.playerHandler.players[j].heightLevel == npcs[i].heightLevel)
  365. return j;
  366. }
  367. }
  368. }
  369. return 0;
  370. }
  371.  
  372. public int getCloseRandomPlayer(int i) {
  373. ArrayList<Integer> players = new ArrayList<Integer>();
  374. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  375. if (Server.playerHandler.players[j] != null) {
  376. if (goodDistance(Server.playerHandler.players[j].absX, Server.playerHandler.players[j].absY, npcs[i].absX, npcs[i].absY, 2 + distanceRequired(i) + followDistance(i)) || isFightCaveNpc(i) || isRFDNpc(i)) {
  377. if ((Server.playerHandler.players[j].underAttackBy <= 0 && Server.playerHandler.players[j].underAttackBy2 <= 0) || Server.playerHandler.players[j].inMulti())
  378. if (Server.playerHandler.players[j].heightLevel == npcs[i].heightLevel)
  379. players.add(j);
  380. }
  381. }
  382. }
  383. if (players.size() > 0)
  384. return players.get(Misc.random(players.size() -1));
  385. else
  386. return 0;
  387. }
  388.  
  389. public int npcSize(int i) {
  390. switch (npcs[i].npcType) {
  391. case 2883:
  392. case 2882:
  393. case 2881:
  394. case 3493:
  395. return 3;
  396. case 3494:
  397. return 5;
  398. }
  399. return 0;
  400. }
  401.  
  402. public boolean isAggressive(int i) {
  403. switch (npcs[i].npcType) {
  404. case 6260:
  405. case 6261:
  406. case 6263:
  407. case 6265:
  408. case 6222:
  409. case 6223:
  410. case 6225:
  411. case 6227:
  412. case 6247:
  413. case 6248:
  414. case 6250:
  415. case 6252:
  416. case 1158:
  417. case 1160:
  418. case 1154:
  419. case 1157:
  420. case 1156:
  421. case 795:
  422.  
  423. case 8133:
  424. case 3101:
  425. case 3102:
  426. case 5666:
  427. case 3103:
  428.  
  429. case 2892:
  430. case 2894:
  431. case 2881:
  432. case 50:
  433. case 2882:
  434. case 2883:
  435.  
  436. case 6203:
  437. case 6206:
  438. case 6208:
  439. case 6204:
  440. return true;
  441. }
  442. if (npcs[i].inWild() && npcs[i].MaxHP > 0 && npcs[i].npcType != 941)
  443. return false;
  444. if (isFightCaveNpc(i))
  445. return true;
  446. if (isRFDNpc(i))
  447. return true;
  448. return false;
  449. }
  450.  
  451. public boolean isFightCaveNpc(int i) {
  452. switch (npcs[i].npcType) {
  453. case 2627:
  454. case 2630:
  455. case 2631:
  456. case 2741:
  457. case 2743:
  458. case 2745:
  459. return true;
  460. }
  461. return false;
  462. }
  463.  
  464. public boolean isRFDNpc(int i) {
  465. switch (npcs[i].npcType) {
  466. case 3493:
  467. case 3494:
  468. case 3495:
  469. case 3496:
  470. case 3491:
  471. return true;
  472. }
  473. return false;
  474. }
  475.  
  476. public boolean isRFDNpc2(int i) {
  477. switch (npcs[i].npcType) {
  478. case 3495:
  479. return true;
  480. }
  481. return false;
  482. }
  483.  
  484. /**
  485. * Summon npc, barrows, etc
  486. **/
  487. public void spawnNpc(Client c, int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence, boolean attackPlayer, boolean headIcon) {
  488. int slot = -1;
  489. for (int i = 1; i < maxNPCs; i++) {
  490. if (npcs[i] == null) {
  491. slot = i;
  492. break;
  493. }
  494. }
  495. if(slot == -1) {
  496. return;
  497. }
  498. NPC newNPC = new NPC(slot, npcType);
  499. newNPC.absX = x;
  500. newNPC.absY = y;
  501. newNPC.makeX = x;
  502. newNPC.makeY = y;
  503. newNPC.heightLevel = heightLevel;
  504. newNPC.walkingType = WalkingType;
  505. newNPC.HP = HP;
  506. newNPC.MaxHP = HP;
  507. newNPC.maxHit = maxHit;
  508. newNPC.attack = attack;
  509. newNPC.defence = defence;
  510. newNPC.spawnedBy = c.getId();
  511. if(headIcon)
  512. c.getPA().drawHeadicon(1, slot, 0, 0);
  513. if(attackPlayer) {
  514. newNPC.underAttack = true;
  515. if(c != null) {
  516. if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] != newNPC.npcType) {
  517. if(newNPC.npcType == 2025 || newNPC.npcType == 2026 || newNPC.npcType == 2027 || newNPC.npcType == 2028 || newNPC.npcType == 2029 || newNPC.npcType == 2030) {
  518. newNPC.forceChat("You dare disturb my rest!");
  519. }
  520. }
  521. if (newNPC.npcType >= 4278 && newNPC.npcType <= 4284) {
  522. newNPC.forceAnim(4410);
  523. newNPC.forceChat("I'M ALIVE!");
  524. }
  525. if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] == newNPC.npcType) {
  526. newNPC.forceChat("You dare steal from us!");
  527. }
  528.  
  529. newNPC.killerId = c.playerId;
  530. }
  531. }
  532. npcs[slot] = newNPC;
  533. }
  534.  
  535. public void spawnNpc2(int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence) {
  536. int slot = -1;
  537. for (int i = 1; i < maxNPCs; i++) {
  538. if (npcs[i] == null) {
  539. slot = i;
  540. break;
  541. }
  542. }
  543. if(slot == -1) {
  544. return;
  545. }
  546. NPC newNPC = new NPC(slot, npcType);
  547. newNPC.absX = x;
  548. newNPC.absY = y;
  549. newNPC.makeX = x;
  550. newNPC.makeY = y;
  551. newNPC.heightLevel = heightLevel;
  552. newNPC.walkingType = WalkingType;
  553. newNPC.HP = HP;
  554. newNPC.MaxHP = HP;
  555. newNPC.maxHit = maxHit;
  556. newNPC.attack = attack;
  557. newNPC.defence = defence;
  558. npcs[slot] = newNPC;
  559. }
  560.  
  561. public static void spawnNewNPC(int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence, boolean needSpawn) {
  562. int slot = -1;
  563. for (int i = 1; i < maxNPCs; i++) {
  564. if (npcs[i] == null) {
  565. slot = i;
  566. break;
  567. }
  568. }
  569. if(slot == -1) {
  570. return;
  571. }
  572. NPC newNPC = new NPC(slot, npcType);
  573. newNPC.absX = x;
  574. newNPC.absY = y;
  575. newNPC.makeX = x;
  576. newNPC.makeY = y;
  577. newNPC.heightLevel = heightLevel;
  578. newNPC.walkingType = WalkingType;
  579. newNPC.HP = HP;
  580. newNPC.MaxHP = HP;
  581. newNPC.maxHit = maxHit;
  582. newNPC.attack = attack;
  583. newNPC.defence = defence;
  584. newNPC.NeedsRespawn = needSpawn;
  585. npcs[slot] = newNPC;
  586. if (newNPC.npcType == 1160) {
  587. newNPC.startAnim(1181);//spawn anim
  588. }
  589. }
  590.  
  591.  
  592.  
  593. /**
  594. * Emotes
  595. **/
  596. public static int getAttackEmote(int i) {
  597. switch(Server.npcHandler.npcs[i].npcType) {
  598.  
  599. case 6795:
  600. return 1010;
  601.  
  602.  
  603.  
  604. case 10775:
  605. return 13151;
  606.  
  607. case 2037:
  608. return 5485;
  609.  
  610. case 6797:
  611. return 8104;
  612.  
  613. case 6799:
  614. return 8069;
  615.  
  616. case 6801:
  617. return 7853;
  618.  
  619. case 6803:
  620. return 8159;
  621.  
  622. case 6805:
  623. return 7786;
  624.  
  625. case 6807:
  626. return 8148;
  627.  
  628. case 6810:
  629. return 7970;
  630.  
  631. case 6812:
  632. return 7935;
  633.  
  634. case 6814:
  635. return 7741;
  636.  
  637. case 6816:
  638. return 8288;
  639.  
  640. case 6819:
  641. return 7667;
  642.  
  643. case 6821:
  644. return 7680;
  645.  
  646.  
  647. case 6823:
  648. return 6376;
  649.  
  650.  
  651. case 6826:
  652. return 5387;
  653.  
  654.  
  655. case 6828:
  656. return 8208;
  657.  
  658.  
  659. case 6830:
  660. return 8292;
  661. case 6832:
  662. return 7795;
  663. case 6834:
  664. return 8248;
  665. case 6836:
  666. return 8275;
  667. case 6838:
  668. return 6254;
  669. case 6856:
  670. return 4921;
  671. case 6858:
  672. return 5327;
  673.  
  674. case 6860:
  675. case 6862:
  676. case 6864:
  677. return 7656;
  678.  
  679. case 6868:
  680. return 7896;
  681.  
  682. case 6870:
  683. return 8303;
  684.  
  685.  
  686. case 6872:
  687. return 7769;
  688.  
  689. case 6874:
  690. return 5782;
  691.  
  692. case 6890:
  693. return 7260;
  694.  
  695. case 7330:
  696. return 8223;
  697.  
  698. case 7332:
  699. return 8032;
  700.  
  701. case 7338:
  702. return 5228;
  703.  
  704. case 7352:
  705. return 8234;
  706.  
  707. case 7354:
  708. return 7755;
  709.  
  710. case 7355:
  711. return 7834;
  712.  
  713. case 7358:
  714. return 7844;
  715.  
  716. case 7359:
  717. return 8183;
  718.  
  719. case 7362:
  720. return 8257;
  721.  
  722. case 7364:
  723. case 7366:
  724. return 5228;
  725.  
  726. case 7368:
  727. case 7369:
  728.  
  729. return 8130;
  730.  
  731. case 7371:
  732. return 8093;
  733.  
  734. case 7374:
  735. return 7994;
  736.  
  737. case 7376:
  738. return 7946;
  739.  
  740.  
  741. case 6260:
  742. if (npcs[i].attackType == 0)
  743. return 7060;
  744. else
  745. return 7063;
  746. ///Kq
  747. case 1158:
  748. case 3835:
  749. if (npcs[i].attackType == 0)
  750. return 6241;
  751. else
  752. return 6240;
  753. case 1160:
  754. case 3836:
  755. if (npcs[i].attackType == 0)
  756. return 6235;
  757. else
  758. return 6234;
  759.  
  760. case 2892:
  761.  
  762. case 2894:
  763. return 2868;
  764. case 2627:
  765. return 2621;
  766. case 2630:
  767. return 2625;
  768. case 2631:
  769. return 2633;
  770. case 2741:
  771. return 2637;
  772. case 2746:
  773. return 2637;
  774. case 2607:
  775. return 2611;
  776. case 2743://360
  777. return 2647;
  778.  
  779. //bandos gwd
  780. case 6261:
  781. case 6263:
  782. case 6265:
  783. return 6154;
  784. case 6267:
  785. return 361;
  786. case 6268:
  787. return 2930;
  788. case 6269:
  789. case 6270:
  790. return 4652;
  791. case 6271:
  792. case 6272:
  793. case 6273:
  794. case 6274:
  795. return 4320;
  796. case 6275:
  797. return 164;
  798. case 6276:
  799. case 6277:
  800. case 6278:
  801. return 4320;
  802. case 6279:
  803. case 6280:
  804. return 6184;
  805. case 6281:
  806. return 6134;
  807. case 6282:
  808. return 6188;
  809. case 6283:
  810. return 6184;
  811.  
  812. //end of gwd
  813. //zammy gwd
  814. case 6203:
  815. return 6945;
  816. case 6204:
  817. case 6206:
  818. case 6208:
  819. return 64;
  820. case 6210:
  821. return 6581;
  822. case 6211:
  823. return 169;
  824. case 6212:
  825. case 6213:
  826. return 6536;
  827. case 6215:
  828. return 1552;
  829. case 6216:
  830. case 6217:
  831. return 1582;
  832. case 6218:
  833. return 4300;
  834. //end of zammy gwd
  835. //arma gwd
  836. case 6222:
  837. return 6973;
  838. case 6225:
  839. return 6953;
  840. case 6223:
  841. return 6954;
  842. case 6227:
  843. return 6953;
  844. //spiritual mages
  845. case 6229:
  846. case 6230:
  847. case 6231:
  848. return 6954;
  849. //aviansies
  850. case 6232:
  851. case 6233:
  852. case 6234:
  853. case 6235:
  854. case 6236:
  855. case 6237:
  856. case 6238:
  857. case 6239:
  858. case 6240:
  859. case 6241:
  860. case 6242:
  861. case 6243:
  862. case 6244:
  863. case 6245:
  864. case 6246:
  865. return 6953;
  866. //end of arma gwd
  867.  
  868. //sara gwd
  869. case 6247:
  870. if (npcs[i].attackType == 2)
  871. return 6967;
  872. else
  873. return 6964;
  874.  
  875.  
  876. case 10057:
  877. if (npcs[i].attackType == 1)
  878. return 10817;
  879. else
  880. return 10816;
  881.  
  882.  
  883. case 6248:
  884. return 6376;
  885. case 6250:
  886. return 7018;
  887. case 6252:
  888. return 7009;
  889. //end of sara gwd
  890.  
  891. case 13: //wizards
  892. return 711;
  893.  
  894. case 103:
  895. return 123;
  896.  
  897. case 1624:
  898. return 1557;
  899.  
  900. case 1648:
  901. return 1590;
  902.  
  903. case 2783: //dark beast
  904. return 2731;
  905.  
  906. case 1615: //abby demon
  907. return 1537;
  908.  
  909. case 1613: //nech
  910. return 1528;
  911.  
  912. case 1610: case 1611: //garg
  913. return 1519;
  914.  
  915. case 1616: //basilisk
  916. return 1546;
  917.  
  918. case 90: //skele
  919. return 260;
  920.  
  921. case 50://drags
  922. case 53:
  923.  
  924. case 54:
  925. case 55:
  926. case 941:
  927. case 1590:
  928. case 1591:
  929. case 1592:
  930. return 80;
  931.  
  932. case 124: //earth warrior
  933. return 390;
  934.  
  935. case 803: //monk
  936. return 422;
  937.  
  938. case 52: //baby drag
  939. return 25;
  940.  
  941. case 58: //Shadow Spider
  942. case 59: //Giant Spider
  943. case 60: //Giant Spider
  944. case 61: //Spider
  945. case 62: //Jungle Spider
  946. case 63: //Deadly Red Spider
  947. case 64: //Ice Spider
  948. case 134:
  949. return 143;
  950.  
  951. case 105: //Bear
  952. case 106: //Bear
  953. return 41;
  954.  
  955. case 412:
  956. case 78:
  957. return 30;
  958.  
  959. case 2033: //rat
  960. return 138;
  961.  
  962. case 2031: // bloodworm
  963. return 2070;
  964.  
  965. case 101: // goblin
  966. return 309;
  967.  
  968. case 81: // cow
  969. return 0x03B;
  970.  
  971. case 21: // hero
  972. return 451;
  973.  
  974. case 41: // chicken
  975. return 55;
  976.  
  977. case 9: // guard
  978. case 32: // guard
  979. case 20: // paladin
  980. return 451;
  981.  
  982. case 1338: // dagannoth
  983. case 1340:
  984. case 1342:
  985. return 1341;
  986.  
  987. case 19: // white knight
  988. return 406;
  989.  
  990. case 110:
  991. case 111: // ice giant
  992. case 112:
  993. case 117:
  994. return 128;
  995.  
  996. case 2452:
  997. return 1312;
  998.  
  999. case 2889:
  1000. return 2859;
  1001.  
  1002. case 118:
  1003. case 119:
  1004. return 99;
  1005.  
  1006. case 82://Lesser Demon
  1007. case 83://Greater Demon
  1008. case 84://Black Demon
  1009. case 1472://jungle demon
  1010. return 64;
  1011.  
  1012. case 1267:
  1013. case 1265:
  1014. return 1312;
  1015.  
  1016. case 125: // ice warrior
  1017. case 178:
  1018. return 451;
  1019.  
  1020. case 1153: //Kalphite Worker
  1021. case 1154: //Kalphite Soldier
  1022. case 1155: //Kalphite guardian
  1023. case 1156: //Kalphite worker
  1024. case 1157: //Kalphite guardian
  1025. return 1184;
  1026.  
  1027. case 123:
  1028. case 122:
  1029. return 164;
  1030.  
  1031.  
  1032.  
  1033.  
  1034. case 7334:
  1035. return 8172;
  1036. case 7336:
  1037. return 7871;
  1038. case 5228:
  1039. return 5228;
  1040.  
  1041. case 7340:
  1042. return 7879;
  1043.  
  1044. case 7342:
  1045. return 7879;
  1046.  
  1047. case 7344:
  1048. return 8183;
  1049.  
  1050. case 7346:
  1051. return 8048;
  1052.  
  1053. case 7348:
  1054. return 5989;
  1055.  
  1056.  
  1057. case 7350:
  1058. return 7693;
  1059.  
  1060.  
  1061. case 2028: // karil
  1062. return 2075;
  1063.  
  1064. case 2025: // ahrim
  1065. return 729;
  1066.  
  1067. case 2026: // dharok
  1068. return 2067;
  1069.  
  1070. case 2027: // guthan
  1071. return 2080;
  1072.  
  1073. case 2029: // torag
  1074. return 0x814;
  1075.  
  1076. case 2030: // verac
  1077. return 2062;
  1078.  
  1079. case 2881: //supreme
  1080. return 2855;
  1081.  
  1082. case 2882: //prime
  1083. return 2854;
  1084.  
  1085. case 2883: //rex
  1086. return 2851;
  1087.  
  1088. case 3340: // giant mole test
  1089. return 3312;
  1090.  
  1091. case 3200:
  1092. return 3146;
  1093.  
  1094. case 3847:
  1095. if (npcs[i].attackType == 2)
  1096. return 3992;
  1097. if (npcs[i].attackType == 1)
  1098. return 3992;
  1099.  
  1100. case 8349://tormented demon
  1101. if (npcs[i].attackType == 2)
  1102. return 10917;
  1103. else if (npcs[i].attackType == 1)
  1104. return 10918;
  1105. else if (npcs[i].attackType == 0)
  1106. return 10922;
  1107.  
  1108.  
  1109.  
  1110.  
  1111.  
  1112. case 8133://corp beast
  1113. if (npcs[i].attackType == 2)
  1114. return 10053;
  1115. else if (npcs[i].attackType == 1)
  1116. return 10059;
  1117. else if (npcs[i].attackType == 0)
  1118. return 10057;
  1119. case 10127:
  1120. if (npcs[i].attackType == 2)
  1121. return 13176;
  1122. else if (npcs[i].attackType == 0)
  1123. return 13169;
  1124.  
  1125. case 9947:
  1126. if (npcs[i].attackType == 2)
  1127. return 13770;
  1128. else if (npcs[i].attackType == 0)
  1129. return 13771;
  1130.  
  1131. case 10141://corp beast
  1132. if (npcs[i].attackType == 2)
  1133. return 10053;
  1134. else if (npcs[i].attackType == 0)
  1135. return 13599;
  1136. else if (npcs[i].attackType == 1)
  1137. return 13603;
  1138.  
  1139.  
  1140. case 2745:
  1141. if (npcs[i].attackType == 2)
  1142. return 9300;
  1143. else if (npcs[i].attackType == 1)
  1144. return 9276;
  1145. else if (npcs[i].attackType == 0)
  1146. return 9277;
  1147. case 655:
  1148. return 129;
  1149.  
  1150. default:
  1151. return 0x326;
  1152. }
  1153. }
  1154.  
  1155.  
  1156. public int getDeadEmote(int i) {
  1157. switch(npcs[i].npcType) {
  1158. case 8133: // corp beast
  1159. return 10059;
  1160. case 10141:
  1161. return 13602;
  1162. case 10127:
  1163. return 13171;
  1164. case 10057:
  1165. return 10815;
  1166. case 8349: // torm demon
  1167. return 10924;
  1168. //sara gwd
  1169. case 6247:
  1170. return 6965;
  1171. case 10775:
  1172. return 13153;
  1173. case 9947:
  1174. return 13772;
  1175. case 6248:
  1176. return 6377;
  1177. case 6250:
  1178. return 7016;
  1179. case 6252:
  1180. return 7011;
  1181. //bandos gwd
  1182. case 6261:
  1183. case 6263:
  1184. case 6265:
  1185. return 6156;
  1186. case 6260:
  1187. return 7062;
  1188. case 2892:
  1189. case 2894:
  1190. return 2865;
  1191. case 1612: //banshee
  1192. return 1524;
  1193. case 6203: //zammy gwd
  1194. return 6946;
  1195. case 6204:
  1196. case 6206:
  1197. case 6208:
  1198. return 67;
  1199. case 6222:
  1200. return 6975;
  1201. case 6223:
  1202. case 6225:
  1203. case 6227:
  1204. return 6956;
  1205. case 2607:
  1206. return 2607;
  1207. case 2627:
  1208. return 2620;
  1209. case 2630:
  1210. return 2627;
  1211. case 2631:
  1212. return 2630;
  1213. case 2738:
  1214. return 2627;
  1215. case 2741:
  1216. return 2638;
  1217. case 2746:
  1218. return 2638;
  1219. case 2743:
  1220. return 2646;
  1221. case 2745:
  1222. return 2654;
  1223.  
  1224. case 3200:
  1225. return 3147;
  1226.  
  1227. case 3847:
  1228. return 3993;
  1229.  
  1230. case 2035: //spider
  1231. return 146;
  1232.  
  1233. case 2033: //rat
  1234. return 141;
  1235.  
  1236. case 2031: // bloodvel
  1237. return 2073;
  1238.  
  1239. case 101: //goblin
  1240. return 313;
  1241.  
  1242. case 81: // cow
  1243. return 0x03E;
  1244.  
  1245. case 41: // chicken
  1246. return 57;
  1247.  
  1248. case 1338: // dagannoth
  1249. case 1340:
  1250. case 1342:
  1251. return 1342;
  1252.  
  1253. case 2881:
  1254. case 2882:
  1255. case 2883:
  1256. return 2856;
  1257.  
  1258. case 111: // ice giant
  1259. return 131;
  1260.  
  1261. case 125: // ice warrior
  1262. return 843;
  1263.  
  1264. case 751://Zombies!!
  1265. return 302;
  1266.  
  1267. case 1626:
  1268. case 1627:
  1269. case 1628:
  1270. case 1629:
  1271. case 1630:
  1272. case 1631:
  1273. case 1632: //turoth!
  1274. return 1597;
  1275.  
  1276. case 1616: //basilisk
  1277. return 1548;
  1278.  
  1279. case 1653: //hand
  1280. return 1590;
  1281.  
  1282. case 82://demons
  1283. case 83:
  1284. case 84:
  1285. return 67;
  1286.  
  1287. case 1605://abby spec
  1288. return 1508;
  1289.  
  1290. case 51://baby drags
  1291. case 52:
  1292. case 1589:
  1293. case 3376:
  1294. return 28;
  1295.  
  1296. case 1610:
  1297. case 1611:
  1298. return 1518;
  1299.  
  1300. case 1618:
  1301. case 1619:
  1302. return 1553;
  1303.  
  1304. case 1620: case 1621:
  1305. return 1563;
  1306.  
  1307. case 2783:
  1308. return 2733;
  1309.  
  1310. case 1615:
  1311. return 1538;
  1312.  
  1313. case 1624:
  1314. return 1558;
  1315.  
  1316. case 1613:
  1317. return 1530;
  1318.  
  1319. case 1633: case 1634: case 1635: case 1636:
  1320. return 1580;
  1321.  
  1322. case 1648: case 1649: case 1650: case 1651: case 1652: case 1654: case 1655: case 1656: case 1657:
  1323. return 1590;
  1324.  
  1325. case 100: case 102:
  1326. return 313;
  1327.  
  1328. case 105:
  1329. case 106:
  1330. return 44;
  1331.  
  1332. case 412:
  1333. case 78:
  1334. return 36;
  1335.  
  1336. case 122:
  1337. case 123:
  1338. return 167;
  1339.  
  1340. case 58: case 59: case 60: case 61: case 62: case 63: case 64: case 134:
  1341. return 146;
  1342.  
  1343. case 1153: case 1154: case 1155: case 1156: case 1157:
  1344. return 1190;
  1345.  
  1346. case 103: case 104:
  1347. return 123;
  1348.  
  1349. case 118: case 119:
  1350. return 102;
  1351.  
  1352. case 3340:
  1353. return 3310;
  1354.  
  1355.  
  1356. case 50://drags
  1357. case 53:
  1358. case 54:
  1359.  
  1360. case 55:
  1361. case 941:
  1362. case 1590:
  1363. case 1591:
  1364. case 1592:
  1365. return 92;
  1366.  
  1367.  
  1368. case 1158:
  1369. case 3835:
  1370. return 6242;
  1371. case 1160:
  1372. case 3836:
  1373. return 6233;
  1374.  
  1375.  
  1376. default:
  1377. return 2304;
  1378. }
  1379. }
  1380. public boolean AttackNPC(int NPCID) {
  1381. if (Server.npcHandler.npcs[npcs[NPCID].attacknpc] != null) {
  1382. int EnemyX = Server.npcHandler.npcs[npcs[NPCID].attacknpc].absX;
  1383. int EnemyY = Server.npcHandler.npcs[npcs[NPCID].attacknpc].absY;
  1384. int EnemyHP = Server.npcHandler.npcs[npcs[NPCID].attacknpc].HP;
  1385. int hitDiff = 0;
  1386.  
  1387. hitDiff = Misc.random(npcs[NPCID].maxHit);
  1388. if (goodDistance(EnemyX, EnemyY, npcs[NPCID].absX,npcs[NPCID].absY, 1) == true) {
  1389. if (Server.npcHandler.npcs[npcs[NPCID].attacknpc].isDead == true) {
  1390. //ResetAttackNPC(NPCID);
  1391. // npcs[NPCID].textUpdate = "Oh yeah I win!";
  1392. // npcs[NPCID].textUpdateRequired = true;
  1393. npcs[NPCID].animNumber = 2103;
  1394. npcs[NPCID].animUpdateRequired = true;
  1395. npcs[NPCID].updateRequired = true;
  1396. } else {
  1397. if ((EnemyHP - hitDiff) < 0) {
  1398. hitDiff = EnemyHP;
  1399. }
  1400. if (npcs[NPCID].npcType == 9)
  1401. npcs[NPCID].animNumber = 386;
  1402. if (npcs[NPCID].npcType == 3200)
  1403. npcs[NPCID].animNumber = 0x326; // drags: chaos ele
  1404. // emote ( YESSS )
  1405. if ((npcs[NPCID].npcType == 1605)
  1406. || (npcs[NPCID].npcType == 1472)) {
  1407. npcs[NPCID].animNumber = 386; // drags: abberant
  1408. // spector death ( YAY )
  1409. }
  1410. npcs[NPCID].animUpdateRequired = true;
  1411. npcs[NPCID].updateRequired = true;
  1412. Server.npcHandler.npcs[npcs[NPCID].attacknpc].hitDiff = hitDiff;
  1413. Server.npcHandler.npcs[npcs[NPCID].attacknpc].attacknpc = NPCID;
  1414. Server.npcHandler.npcs[npcs[NPCID].attacknpc].updateRequired = true;
  1415. Server.npcHandler.npcs[npcs[NPCID].attacknpc].hitUpdateRequired = true;
  1416. npcs[NPCID].actionTimer = 7;
  1417. return true;
  1418. }
  1419. }
  1420. }
  1421. return false;
  1422. }
  1423.  
  1424. public void attackNPC(int c, int i) {
  1425. if(npcs[i] != null) {
  1426. if (npcs[i].isDead)
  1427. return;
  1428. if (!npcs[i].inMulti() && npcs[i].underAttackBy > 0 && npcs[i].underAttackBy != npcs[c].npcId) {
  1429. npcs[i].killerId = 0;
  1430. return;
  1431. }
  1432. if (!npcs[i].inMulti() && (npcs[c].underAttackBy > 0 || (npcs[c].underAttackBy2 > 0 && npcs[c].underAttackBy2 != i))) {
  1433. npcs[i].killerId = 0;
  1434. return;
  1435. }
  1436. if (npcs[i].heightLevel != npcs[c].heightLevel) {
  1437. npcs[i].killerId = 0;
  1438. return;
  1439. }
  1440. follownpc(i, c);
  1441. npcs[i].facePlayer(npcs[c].npcId);
  1442. npcs[i].facenpc(npcs[c].npcId);
  1443. boolean special = false;//specialCase(c,i);
  1444. if(goodDistance(npcs[i].getX(), npcs[i].getY(), npcs[c].getX(), npcs[c].getY(), distanceRequired(i)) || special) {
  1445. if(npcs[c].actionTimer <= 0) {
  1446. npcs[i].facePlayer(npcs[c].npcId);
  1447. npcs[i].attackTimer = getNpcDelay(i);
  1448. npcs[i].hitDelayTimer = getHitDelay(i);
  1449. npcs[i].attackType = 0;
  1450.  
  1451. if (special)
  1452. loadSpell2(i);
  1453. else
  1454.  
  1455. loadSpell(i);
  1456.  
  1457.  
  1458.  
  1459.  
  1460. npcs[c].underAttackBy2 = i;
  1461. npcs[c].actionTimer = 7;
  1462. npcs[i].actionTimer = 5;
  1463. int damg = Misc.random(npcs[i].maxHit);
  1464. npcs[c].handleHitMask(damg);
  1465. npcs[c].HP -= damg;
  1466. npcs[c].hitUpdateRequired2 = true;
  1467. npcs[c].hitUpdateRequired = true;
  1468.  
  1469. npcs[i].oldIndexNPC = npcs[c].npcId;
  1470. startAnimation(getAttackEmote(i), i);
  1471. //c.getPA().removeAllWindows();
  1472. }
  1473. }
  1474. }
  1475. }
  1476. public void attacknpc(int i) {
  1477. if(npcs[i] != null) {
  1478. if (npcs[i].isDead)
  1479. return;
  1480. if (!npcs[i].inMulti() && npcs[i].underAttackBy > 0) {
  1481. npcs[i].killerId = 0;
  1482. return;
  1483. }
  1484.  
  1485.  
  1486.  
  1487.  
  1488. boolean special = false;//specialCase(c,i);
  1489. if(goodDistance(npcs[i].getX(), npcs[i].getY(), Server.npcHandler.npcs[npcs[i].attacknpc].getX(), Server.npcHandler.npcs[npcs[i].attacknpc].getY(), 1) || special) {
  1490. if(npcs[i].actionTimer <= 0 && npcs[i].isDead == false && Server.npcHandler.npcs[npcs[i].attacknpc].isDead == false)
  1491. {
  1492.  
  1493. npcs[i].facePlayer(Server.npcHandler.npcs[npcs[i].attacknpc].npcId);
  1494. Server.npcHandler.npcs[npcs[i].attacknpc].facePlayer(npcs[i].npcId);
  1495. npcs[i].attackTimer = getNpcDelay(i);
  1496. npcs[i].hitDelayTimer = getHitDelay(i);
  1497. npcs[i].attackType = 0;
  1498. if (special)
  1499. loadSpell2(i);
  1500. else
  1501. loadSpell(i);
  1502. if (npcs[i].attackType == 3)
  1503. npcs[i].hitDelayTimer += 2;
  1504. if (multiAttacks(i)) {
  1505. multiAttackGfx(i, npcs[i].projectileId);
  1506. startAnimation(getAttackEmote(i), i);
  1507. npcs[i].oldIndex = Server.npcHandler.npcs[npcs[i].attacknpc].npcId;
  1508. return;
  1509. }
  1510. //if(npcs[i].projectileId > 0) {
  1511. //int nX = Server.npcHandler.npcs[i].getX() + offset(i);
  1512. //int nY = Server.npcHandler.npcs[i].getY() + offset(i);
  1513. //int pX = npcs[othernpc].getX();
  1514. //int pY = npcs[othernpc].getY();
  1515. //int offX = (nY - pY)* -1;
  1516. //int offY = (nX - pX)* -1;
  1517. //npcs[othernpc].createPlayersProjectile(nX, nY, offX, offY, 50, getProjectileSpeed(i), npcs[i].projectileId, 43, 31, -c.getId() - 1, 65);
  1518. //}
  1519. Server.npcHandler.npcs[npcs[i].attacknpc].handleHitMask(Misc.random(npcs[i].maxHit));
  1520. if(Server.npcHandler.npcs[npcs[i].attacknpc].actionTimer <= 0 && npcs[i].isDead == false && Server.npcHandler.npcs[npcs[i].attacknpc].isDead == false)
  1521. {
  1522.  
  1523. Server.npcHandler.npcs[npcs[i].attacknpc].actionTimer = 7;
  1524. Server.npcHandler.npcs[npcs[i].attacknpc].handleHitMask(Misc.random(Server.npcHandler.npcs[npcs[i].attacknpc].maxHit));
  1525. startAnimation(getAttackEmote(npcs[i].attacknpc), npcs[i].attacknpc);
  1526. }
  1527. npcs[i].actionTimer = 7;
  1528. npcs[i].npcIndex = Server.npcHandler.npcs[npcs[i].attacknpc].npcId;
  1529. //npcs[i].facenpc(Server.npcHandler.npcs[npcs[i].attacknpc].npcId);
  1530. //Server.npcHandler.npcs[npcs[i].attacknpc].facenpc(npcs[i].npcId);
  1531. startAnimation(getAttackEmote(i), i);
  1532. Server.npcHandler.npcs[npcs[i].attacknpc].attacknpc = i;
  1533.  
  1534.  
  1535. }
  1536. }
  1537. }
  1538. }
  1539. /**
  1540. * Attack delays
  1541. **/
  1542. public int getNpcDelay(int i) {
  1543. switch(npcs[i].npcType) {
  1544. case 2025:
  1545. case 2028:
  1546. return 7;
  1547. case 1158:
  1548. case 1160:
  1549. return 6;
  1550. case 8133: // Corporeal beast
  1551. case 3101: // Melee
  1552. case 3102: // Range
  1553. case 3103: // Mage
  1554. return 7;
  1555. case 8349: case 8350: case 8351:
  1556. if (npcs[i].attackType == 2)
  1557. return 4;
  1558. else if (npcs[i].attackType == 1)
  1559. return 6;
  1560. else if (npcs[i].attackType == 0)
  1561. return 7;
  1562. case 3495:
  1563. return 3;
  1564. case 2745:
  1565. return 8;
  1566. case 50:
  1567. case 53:
  1568. case 54:
  1569. case 55:
  1570. case 941:
  1571. case 1590:
  1572. case 1591:
  1573. case 1592:
  1574. return 8;
  1575.  
  1576. case 6222:
  1577. case 6223:
  1578. case 6206:
  1579. case 6208:
  1580. case 6204:
  1581. case 6225:
  1582. case 6227:
  1583. case 6260:
  1584. return 6;
  1585. //saradomin gw boss
  1586. case 6247:
  1587. return 3;
  1588.  
  1589. default:
  1590. return 5;
  1591. }
  1592. }
  1593.  
  1594. /**
  1595. * Hit delays
  1596. **/
  1597. public int getHitDelay(int i) {
  1598. switch(npcs[i].npcType) {
  1599. case 2881:
  1600. case 2882:
  1601. case 3200:
  1602. case 2892:
  1603. case 2894:
  1604. case 6208:
  1605. case 6206:
  1606. case 6203:
  1607. return 3;
  1608. case 1158:
  1609. case 1160:
  1610. if (npcs[i].attackType == 1 || npcs[i].attackType == 2)
  1611. return 3;
  1612. else
  1613. return 2;
  1614. case 2743:
  1615. case 2631:
  1616. case 6222:
  1617. case 6223:
  1618. case 6225:
  1619.  
  1620. case 6239: // Aviansie
  1621. case 6230:
  1622. case 6233:
  1623. case 6232:
  1624. case 6276:
  1625. case 6257:
  1626. case 6221:
  1627.  
  1628. return 3;
  1629.  
  1630. case 2745:
  1631. if (npcs[i].attackType == 1 || npcs[i].attackType == 2) {
  1632. return 5;
  1633. } else {
  1634. return 2;
  1635. }
  1636. case 2025:
  1637. return 4;
  1638. case 2028:
  1639. return 3;
  1640. case 3495:
  1641. return 2;
  1642.  
  1643. default:
  1644. return 2;
  1645. }
  1646. }
  1647.  
  1648. /**
  1649. * Npc respawn time
  1650. **/
  1651. public int getRespawnTime(int i) {
  1652. switch(npcs[i].npcType) {
  1653. case 6261:
  1654. case 6263:
  1655. case 6265:
  1656. case 8349: case 8350: case 8351:
  1657. return 100;
  1658. case 1158:
  1659. return 200;
  1660. case 6203:
  1661. case 6204:
  1662. case 6206:
  1663. case 2881:
  1664. case 2882:
  1665. case 2883:
  1666. case 6222:
  1667. case 6223:
  1668. case 6225:
  1669. case 6227:
  1670. case 6247:
  1671. case 6248:
  1672. case 6250:
  1673. case 6260:
  1674. case 6208:
  1675. return 125;
  1676. case 8133: // Corporeal beast
  1677. case 3101: // Melee
  1678. case 3102: // Range
  1679. case 3103: // Mage
  1680. return 140;
  1681.  
  1682. case 3247: // Godwars
  1683. case 6270:
  1684. case 6219:
  1685. case 6255:
  1686. case 6229:
  1687. case 6277:
  1688. case 6233:
  1689. case 6232:
  1690. case 6218:
  1691. case 6269:
  1692. case 3248:
  1693. case 6212:
  1694. case 6220:
  1695. case 6276:
  1696. case 6256:
  1697. case 6239: // Aviansie
  1698. case 6230:
  1699. case 6221:
  1700. case 6231:
  1701. case 6257:
  1702. case 6278:
  1703. case 6272:
  1704. case 6274:
  1705. case 6254:
  1706. case 6258:
  1707. return 80;
  1708. case 50://drags
  1709. case 53:
  1710. case 54:
  1711. case 55:
  1712. case 941:
  1713. case 1590:
  1714. case 1591:
  1715. case 4291: // Cyclops
  1716. case 4292: // Ice cyclops
  1717. case 1592:
  1718. return 110;
  1719. case 6142:
  1720. case 6143:
  1721. case 6144:
  1722. case 6145:
  1723. return 500;
  1724. default:
  1725. return 500;
  1726. }
  1727. }
  1728.  
  1729.  
  1730.  
  1731. public void newNPC(int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence) {
  1732. int slot = -1;
  1733. for (int i = 1; i < maxNPCs; i++) {
  1734. if (npcs[i] == null) {
  1735. slot = i;
  1736. break;
  1737. }
  1738. }
  1739. if(slot == -1)
  1740. return;
  1741. NPC newNPC = new NPC(slot, npcType);
  1742. newNPC.absX = x;
  1743. newNPC.absY = y;
  1744. newNPC.makeX = x;
  1745. newNPC.makeY = y;
  1746. newNPC.heightLevel = heightLevel;
  1747. newNPC.walkingType = WalkingType;
  1748. newNPC.HP = HP;
  1749. newNPC.MaxHP = HP;
  1750. newNPC.maxHit = maxHit;
  1751. newNPC.attack = attack;
  1752. newNPC.defence = defence;
  1753. npcs[slot] = newNPC;
  1754. }
  1755.  
  1756. public void newNPCList(int npcType, String npcName, int combat, int HP) {
  1757. int slot = -1;
  1758. for (int i = 0; i < maxListedNPCs; i++) {
  1759. if (NpcList[i] == null) {
  1760. slot = i;
  1761. break;
  1762. }
  1763. }
  1764. if(slot == -1)
  1765. return;
  1766. NPCList newNPCList = new NPCList(npcType);
  1767. newNPCList.npcName = npcName;
  1768. newNPCList.npcCombat = combat;
  1769. newNPCList.npcHealth = HP;
  1770. NpcList[slot] = newNPCList;
  1771. }
  1772.  
  1773.  
  1774.  
  1775. public void process() {
  1776.  
  1777.  
  1778. for (int i = 0; i < maxNPCs; i++) {
  1779. if (npcs[i] == null) continue;
  1780. npcs[i].clearUpdateFlags();
  1781.  
  1782. }
  1783.  
  1784. for (int i = 0; i < maxNPCs; i++) {
  1785. if (npcs[i] != null) {
  1786.  
  1787.  
  1788.  
  1789.  
  1790.  
  1791. if(npcs[i].summon == true) {
  1792. Client c = (Client)Server.playerHandler.players[npcs[i].spawnedBy];
  1793.  
  1794.  
  1795. if(c != null && c.npcIndex > 0) {
  1796.  
  1797. follownpc(i, c.npcIndex);
  1798. }
  1799.  
  1800. if(c != null && c.playerIndex < 1 && npcs[i].summon == true) {
  1801. if(!npcs[i].underAttack) {
  1802. if(!Server.playerHandler.players[npcs[i].spawnedBy].goodDistance(npcs[i].getX(), npcs[i].getY(), Server.playerHandler.players[npcs[i].spawnedBy].getX(), Server.playerHandler.players[npcs[i].spawnedBy].getY(), 2) && c.npcIndex < 1)
  1803. followPlayer(i, c.playerId);
  1804. }
  1805. } else {
  1806. if(c != null && npcs[i].summon == true) {
  1807. if(!Server.playerHandler.players[npcs[i].spawnedBy].goodDistance(npcs[i].getX(), npcs[i].getY(), Server.playerHandler.players[npcs[i].spawnedBy].getX(), Server.playerHandler.players[npcs[i].spawnedBy].getY(), 5) && c.playerIndex < 1 || c.npcIndex < 1)
  1808. {
  1809. followPlayer(i, c.playerId);
  1810. }
  1811. }
  1812.  
  1813. }
  1814.  
  1815.  
  1816. if(c != null && c.lastsummon > 0 && !Server.playerHandler.players[npcs[i].spawnedBy].goodDistance(npcs[i].getX(), npcs[i].getY(), Server.playerHandler.players[npcs[i].spawnedBy].getX(), Server.playerHandler.players[npcs[i].spawnedBy].getY(), 10) && npcs[i].summon == true && !npcs[i].isDead)
  1817. {
  1818.  
  1819. npcs[i].isDead = true;
  1820. npcs[i].applyDead = true;
  1821. c.Summoning.SummonNewNPC(c.lastsummon);
  1822. npcs[i].gfx0(1315);
  1823. npcs[i].underAttackBy2 = -1;
  1824. npcs[i].updateRequired = true;
  1825. npcs[i].dirUpdateRequired = true;
  1826. npcs[i].getNextWalkingDirection();
  1827. }
  1828.  
  1829.  
  1830. if(c != null && c.lastsummon < 0 || c == null)
  1831. {
  1832. npcs[i].isDead = true;
  1833. npcs[i].applyDead = true;
  1834. npcs[i].summon = false;
  1835. npcs[i].underAttackBy2 = -1;
  1836. }
  1837.  
  1838.  
  1839. if(c != null && npcs[i].actionTimer < 1 && npcs[i].summon == true)
  1840. {
  1841. if(c.playerIndex > 0)
  1842. {
  1843. Client o = (Client)Server.playerHandler.players[c.playerIndex];
  1844. if(o != null) {
  1845. if(npcs[i].IsAttackingPerson = true && o.inMulti())
  1846. {
  1847. followPlayer(i, o.playerId);
  1848. attackPlayer(o, i);
  1849. npcs[i].index = o.playerId;
  1850. npcs[i].actionTimer = 7;
  1851. }
  1852. }
  1853. }
  1854. }
  1855.  
  1856. }
  1857.  
  1858. if (npcs[i].npcType == 3782 && PestControl.gameStarted){
  1859. if (Misc.random(10) == 4)
  1860. npcs[i].forceChat(voidKnightTalk[Misc.random3(voidKnightTalk.length)]);
  1861. }
  1862.  
  1863. if (npcs[i].actionTimer > 0) {
  1864. npcs[i].actionTimer--;
  1865. }
  1866.  
  1867. if (npcs[i].freezeTimer > 0) {
  1868. npcs[i].freezeTimer--;
  1869. }
  1870.  
  1871. if (npcs[i].hitDelayTimer > 0) {
  1872. npcs[i].hitDelayTimer--;
  1873. }
  1874.  
  1875. if (npcs[i].hitDelayTimer == 1) {
  1876. npcs[i].hitDelayTimer = 0;
  1877. applyDamage(i);
  1878. }
  1879.  
  1880. if(npcs[i].attackTimer > 0) {
  1881. npcs[i].attackTimer--;
  1882. }
  1883.  
  1884. if(npcs[i].spawnedBy > 0) { // delete summons npc
  1885. if(Server.playerHandler.players[npcs[i].spawnedBy] == null
  1886. || Server.playerHandler.players[npcs[i].spawnedBy].heightLevel != npcs[i].heightLevel
  1887. || Server.playerHandler.players[npcs[i].spawnedBy].respawnTimer > 0
  1888. || !Server.playerHandler.players[npcs[i].spawnedBy].goodDistance(npcs[i].getX(), npcs[i].getY(), Server.playerHandler.players[npcs[i].spawnedBy].getX(), Server.playerHandler.players[npcs[i].spawnedBy].getY(), 10)) {
  1889.  
  1890. if(Server.playerHandler.players[npcs[i].spawnedBy] != null) {
  1891. for(int o = 0; o < Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs.length; o++){
  1892. if(npcs[i].npcType == Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][0]) {
  1893. if (Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] == 1)
  1894. Server.playerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] = 0;
  1895. }
  1896. }
  1897. }
  1898. npcs[i] = null;
  1899. }
  1900. }
  1901. if (npcs[i] == null) continue;
  1902.  
  1903. /**
  1904. * Attacking player
  1905. **/
  1906. if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && !switchesAttackers(i)) {
  1907. npcs[i].killerId = getCloseRandomPlayer(i);
  1908. } else if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && switchesAttackers(i)) {
  1909. npcs[i].killerId = getCloseRandomPlayer(i);
  1910. }
  1911.  
  1912. if (System.currentTimeMillis() - npcs[i].lastDamageTaken > 5000)
  1913. npcs[i].underAttackBy = 0;
  1914.  
  1915. if((npcs[i].killerId > 0 || npcs[i].underAttack) && !npcs[i].walkingHome && retaliates(npcs[i].npcType)) {
  1916. if(!npcs[i].isDead) {
  1917. int p = npcs[i].killerId;
  1918. if(Server.playerHandler.players[p] != null) {
  1919. Client c = (Client) Server.playerHandler.players[p];
  1920. followPlayer(i, c.playerId);
  1921. if (npcs[i] == null) continue;
  1922. if(npcs[i].attackTimer == 0) {
  1923. if(c != null) {
  1924. attackPlayer(c, i);
  1925. } else {
  1926. npcs[i].killerId = 0;
  1927. npcs[i].underAttack = false;
  1928. npcs[i].facePlayer(0);
  1929. }
  1930. }
  1931. } else {
  1932. npcs[i].killerId = 0;
  1933. npcs[i].underAttack = false;
  1934. npcs[i].facePlayer(0);
  1935. }
  1936. }
  1937. }
  1938. /**
  1939. * Random walking and walking home
  1940. **/
  1941. if (npcs[i] == null) continue;
  1942. if((!npcs[i].underAttack || npcs[i].walkingHome) && npcs[i].randomWalk && !npcs[i].isDead) {
  1943. npcs[i].facePlayer(0);
  1944. npcs[i].killerId = 0;
  1945. if(npcs[i].spawnedBy == 0) {
  1946. if((npcs[i].absX > npcs[i].makeX + Config.NPC_RANDOM_WALK_DISTANCE) || (npcs[i].absX < npcs[i].makeX - Config.NPC_RANDOM_WALK_DISTANCE) || (npcs[i].absY > npcs[i].makeY + Config.NPC_RANDOM_WALK_DISTANCE) || (npcs[i].absY < npcs[i].makeY - Config.NPC_RANDOM_WALK_DISTANCE)) {
  1947. npcs[i].walkingHome = true;
  1948. }
  1949. }
  1950.  
  1951. if (npcs[i].walkingHome && npcs[i].absX == npcs[i].makeX && npcs[i].absY == npcs[i].makeY) {
  1952. npcs[i].walkingHome = false;
  1953. } else if(npcs[i].walkingHome) {
  1954. npcs[i].moveX = GetMove(npcs[i].absX, npcs[i].makeX);
  1955. npcs[i].moveY = GetMove(npcs[i].absY, npcs[i].makeY);
  1956. npcs[i].getNextNPCMovement(i);
  1957. npcs[i].updateRequired = true;
  1958. }
  1959. if(npcs[i].walkingType == 1) {
  1960. if(Misc.random(3)== 1 && !npcs[i].walkingHome) {
  1961. int MoveX = 0;
  1962. int MoveY = 0;
  1963. int Rnd = Misc.random(9);
  1964. if (Rnd == 1) {
  1965. MoveX = 1;
  1966. MoveY = 1;
  1967. } else if (Rnd == 2) {
  1968. MoveX = -1;
  1969. } else if (Rnd == 3) {
  1970. MoveY = -1;
  1971. } else if (Rnd == 4) {
  1972. MoveX = 1;
  1973. } else if (Rnd == 5) {
  1974. MoveY = 1;
  1975. } else if (Rnd == 6) {
  1976. MoveX = -1;
  1977. MoveY = -1;
  1978. } else if (Rnd == 7) {
  1979. MoveX = -1;
  1980. MoveY = 1;
  1981. } else if (Rnd == 8) {
  1982. MoveX = 1;
  1983. MoveY = -1;
  1984. }
  1985.  
  1986. if (MoveX == 1) {
  1987. if (npcs[i].absX + MoveX < npcs[i].makeX + 1) {
  1988. npcs[i].moveX = MoveX;
  1989. } else {
  1990. npcs[i].moveX = 0;
  1991. }
  1992. }
  1993.  
  1994. if (MoveX == -1) {
  1995. if (npcs[i].absX - MoveX > npcs[i].makeX - 1) {
  1996. npcs[i].moveX = MoveX;
  1997. } else {
  1998. npcs[i].moveX = 0;
  1999. }
  2000. }
  2001.  
  2002. if(MoveY == 1) {
  2003. if(npcs[i].absY + MoveY < npcs[i].makeY + 1) {
  2004. npcs[i].moveY = MoveY;
  2005. } else {
  2006. npcs[i].moveY = 0;
  2007. }
  2008. }
  2009.  
  2010. if(MoveY == -1) {
  2011. if(npcs[i].absY - MoveY > npcs[i].makeY - 1) {
  2012. npcs[i].moveY = MoveY;
  2013. } else {
  2014. npcs[i].moveY = 0;
  2015. }
  2016. }
  2017.  
  2018.  
  2019. int x = (npcs[i].absX + npcs[i].moveX);
  2020. int y = (npcs[i].absY + npcs[i].moveY);
  2021. if (VirtualWorld.I(npcs[i].heightLevel, npcs[i].absX, npcs[i].absY, x, y, 0))
  2022. npcs[i].getNextNPCMovement(i);
  2023. else
  2024. {
  2025. npcs[i].moveX = 0;
  2026. npcs[i].moveY = 0;
  2027. }
  2028. npcs[i].updateRequired = true;
  2029. }
  2030. }
  2031. }
  2032.  
  2033. if (npcs[i].isDead == true) {
  2034. if (npcs[i].actionTimer == 0 && npcs[i].applyDead == false && npcs[i].needRespawn == false) {
  2035. npcs[i].updateRequired = true;
  2036. npcs[i].facePlayer(0);
  2037. npcs[i].killedBy = getNpcKillerId(i);
  2038. npcs[i].animNumber = getDeadEmote(i); // dead emote
  2039. npcs[i].animUpdateRequired = true;
  2040. npcs[i].freezeTimer = 0;
  2041. npcs[i].applyDead = true;
  2042. killedBarrow(i);
  2043. if (isFightCaveNpc(i))
  2044. killedTzhaar(i);
  2045. if(npcs[i].summon == true)
  2046. npcs[i].summon = false;
  2047. npcs[i].actionTimer = 4; // delete time
  2048. resetPlayersInCombat(i);
  2049. /*if (npcs[i].npcType == 1158){
  2050. handleKalpite(i);
  2051. }*/
  2052.  
  2053.  
  2054. } else if (npcs[i] != null && npcs[i].actionTimer == 0 && npcs[i].applyDead == true && npcs[i].needRespawn == false) {
  2055. //if (npcs[i] != null) {
  2056. npcs[i].needRespawn = true;
  2057. npcs[i].actionTimer = getRespawnTime(i); // respawn time
  2058. dropItems(i); // npc drops items!
  2059. appendSlayerExperience(i);
  2060. //appendKillCount(i);
  2061. npcs[i].absX = npcs[i].makeX;
  2062. npcs[i].absY = npcs[i].makeY;
  2063. npcs[i].HP = npcs[i].MaxHP;
  2064. npcs[i].animNumber = 0x328;
  2065. npcs[i].updateRequired = true;
  2066. npcs[i].animUpdateRequired = true;
  2067. if (npcs[i].npcType >= 2440 && npcs[i].npcType <= 2446) {
  2068. Server.objectManager.removeObject(npcs[i].absX, npcs[i].absY);
  2069. }
  2070. if (npcs[i].npcType == 2745) {
  2071. if (npcs[i].npcType == 6142 || npcs[i].npcType == 6143 || npcs[i].npcType == 6144 || npcs[i].npcType == 6145) {//etc
  2072. npcs[i].needRespawn = false;
  2073. return;
  2074. }
  2075. handleJadDeath(i);
  2076. }
  2077. if (npcs[i].npcType == 3491) {
  2078. handleRFDDeath(i);
  2079. }
  2080.  
  2081. if (npcs[i] != null && npcs[i].npcType != 1158){
  2082. if (!npcs[i].needRespawn){
  2083. npcs[i] = null;
  2084. for (int j = 1; j < Config.MAX_PLAYERS; j++) {
  2085. if (Server.playerHandler.players[j] != null) {
  2086. Server.playerHandler.players[j].RebuildNPCList = true;
  2087. }
  2088. }
  2089. continue;
  2090. }
  2091. npcs[i].needRespawn = true;
  2092. npcs[i].actionTimer = 30;
  2093. npcs[i].absX = npcs[i].makeX;
  2094. npcs[i].absY = npcs[i].makeY;
  2095. } else if (npcs[i] != null && npcs[i].npcType == 1158) {
  2096. npcs[i] = null;
  2097. for (int j = 1; j < Config.MAX_PLAYERS; j++) {
  2098. if (Server.playerHandler.players[j] != null){
  2099. Server.playerHandler.players[j].RebuildNPCList = true;
  2100. }
  2101. }
  2102. }
  2103.  
  2104. } else if (npcs[i].actionTimer == 0 && npcs[i].needRespawn == true) {
  2105. if(npcs[i].spawnedBy > 0) {
  2106. npcs[i] = null;
  2107. } else {
  2108. /*if (npcs[i].actionTimer <= 0 && npcs[i].needRespawn && npcs[i].NeedsRespawn) {
  2109. for (int j = 1; j < Config.MAX_PLAYERS; j++) {
  2110. if (Server.playerHandler.players[j] != null) {
  2111. Server.playerHandler.players[j].RebuildNPCList = true;
  2112. }
  2113. }*/
  2114. int type = npcs[i].npcType;
  2115. if (type == 1160)
  2116. type = 1158;
  2117. int x = npcs[i].makeX;
  2118. int y = npcs[i].makeY;
  2119. int height = npcs[i].heightLevel;
  2120. int walk = npcs[i].walkingType;
  2121. int mHp = npcs[i].MaxHP;
  2122. int mHit = npcs[i].maxHit;
  2123. int attack = npcs[i].attack;
  2124. int defence = npcs[i].defence;
  2125.  
  2126. npcs[i] = null;
  2127. newNPC(type, x, y, height, walk, mHp, mHit, attack, defence);
  2128. }
  2129. }
  2130. }
  2131. }
  2132. }
  2133. }
  2134.  
  2135. public boolean getsPulled(int i) {
  2136. switch (npcs[i].npcType) {
  2137. case 6260:
  2138. if (npcs[i].firstAttacker > 0)
  2139. return false;
  2140. break;
  2141. }
  2142. return true;
  2143. }
  2144.  
  2145. public boolean multiAttacks(int i) {
  2146. switch (npcs[i].npcType) {
  2147. case 6222://bandos?
  2148. return true;
  2149.  
  2150. case 8133: // Corporeal beast
  2151. if (npcs[i].attackType == 2)
  2152. return true;
  2153.  
  2154. case 6247://saradomin?
  2155. if (npcs[i].attackType == 2)
  2156. return true;
  2157.  
  2158. case 6260://armadyl?
  2159. if (npcs[i].attackType == 1)
  2160. return true;
  2161.  
  2162. default:
  2163. return false;
  2164. }
  2165.  
  2166.  
  2167. }
  2168.  
  2169. /**
  2170. * Npc killer id?
  2171. **/
  2172.  
  2173. public int getNpcKillerId(int npcId) {
  2174. int oldDamage = 0;
  2175. int count = 0;
  2176. int killerId = 0;
  2177. for (int p = 1; p < Config.MAX_PLAYERS; p++) {
  2178. if (Server.playerHandler.players[p] != null) {
  2179. if(Server.playerHandler.players[p].lastNpcAttacked == npcId) {
  2180. if(Server.playerHandler.players[p].totalDamageDealt > oldDamage) {
  2181. oldDamage = Server.playerHandler.players[p].totalDamageDealt;
  2182. killerId = p;
  2183. }
  2184. Server.playerHandler.players[p].totalDamageDealt = 0;
  2185. }
  2186. }
  2187. }
  2188. return killerId;
  2189. }
  2190.  
  2191. /**
  2192. *
  2193. */
  2194. private void killedBarrow(int i) {
  2195. Client c = (Client)Server.playerHandler.players[npcs[i].killedBy];
  2196. if(c != null) {
  2197. for(int o = 0; o < c.barrowsNpcs.length; o++){
  2198. if(npcs[i].npcType == c.barrowsNpcs[o][0]) {
  2199. c.barrowsNpcs[o][1] = 2; // 2 for dead
  2200. c.barrowsKillCount++;
  2201.  
  2202. }
  2203. }
  2204. }
  2205. }
  2206.  
  2207.  
  2208.  
  2209. private void killedTzhaar(int i) {
  2210. final Client c2 = (Client)Server.playerHandler.players[npcs[i].spawnedBy];
  2211. c2.tzhaarKilled++;
  2212. //System.out.println("To kill: " + c2.tzhaarToKill + " killed: " + c2.tzhaarKilled);
  2213. if (c2.tzhaarKilled == c2.tzhaarToKill) {
  2214. //c2.sendMessage("STARTING EVENT");
  2215. c2.waveId++;
  2216. EventManager.getSingleton().addEvent(new Event() {
  2217. public void execute(EventContainer c) {
  2218. if (c2 != null) {
  2219. Server.fightCaves.spawnNextWave(c2);
  2220. }
  2221. c.stop();
  2222. }
  2223. }, 7500);
  2224.  
  2225. }
  2226. }
  2227.  
  2228. private void killedRFD(int i) {
  2229. final Client c2 = (Client)Server.playerHandler.players[npcs[i].spawnedBy];
  2230. c2.RFDKilled++;
  2231. //System.out.println("To kill: " + c2.RFDToKill + " killed: " + c2.RFDKilled);
  2232. if (c2.RFDKilled == c2.RFDToKill) {
  2233. //c2.sendMessage("STARTING EVENT");
  2234. c2.waveId++;
  2235. EventManager.getSingleton().addEvent(new Event() {
  2236. public void execute(EventContainer c) {
  2237. if (c2 != null) {
  2238. Server.rfd.spawnNextWave(c2);
  2239. }
  2240. c.stop();
  2241. }
  2242. }, 7500);
  2243.  
  2244. }
  2245. }
  2246.  
  2247. public void handleJadDeath(int i) {
  2248. Client c = (Client)Server.playerHandler.players[npcs[i].spawnedBy];
  2249. c.getItems().addItem(6570,1);
  2250. c.sendMessage("Congratulations on completing the fight caves minigame!");
  2251. c.getPA().resetTzhaar();
  2252. c.waveId = 300;
  2253. }
  2254.  
  2255. public void handleRFDDeath(int i) {
  2256. Client c = (Client)Server.playerHandler.players[npcs[i].spawnedBy];
  2257. c.sendMessage("Congratulations you have completed the RFD minigame!");
  2258. c.getPA().resetRFD();
  2259. c.waveId = 300;
  2260. }
  2261.  
  2262.  
  2263. /**
  2264. * Dropping Items!
  2265. **/
  2266. public boolean rareDrops(int i) {
  2267. return Misc.random(NPCDrops.dropRarity.get(npcs[i].npcType)) == 0;
  2268. }
  2269.  
  2270.  
  2271. public void dropItems(int i) {
  2272. int npc = 0;
  2273. //long start = System.currentTimeMillis();
  2274. Client c = (Client)Server.playerHandler.players[npcs[i].killedBy];
  2275. if(c != null) {
  2276. if (npcs[i].npcType == 912 || npcs[i].npcType == 913 || npcs[i].npcType == 914)
  2277. c.magePoints += 1;
  2278. if (NPCDrops.constantDrops.get(npcs[i].npcType) != null) {
  2279. for (int item : NPCDrops.constantDrops.get(npcs[i].npcType)) {
  2280. Server.itemHandler.createGroundItem(c, item, npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2281. //if (c.clanId >= 0)
  2282. //Server.clanChat.handleLootShare(c, item, 1);
  2283. }
  2284. }
  2285. if(npcs[i].npcType > 0) {
  2286. int random2 = Misc.random(8);
  2287. if(random2 == 4) {
  2288. Server.itemHandler.createGroundItem(c, 12158, npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2289. }
  2290. if(random2 == 3) {
  2291. Server.itemHandler.createGroundItem(c, 12159, npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2292. }
  2293. if(random2 == 2) {
  2294. Server.itemHandler.createGroundItem(c, 12160, npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2295. }
  2296.  
  2297. if(random2 == 1) {
  2298. Server.itemHandler.createGroundItem(c, 12163, npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2299. }
  2300. }
  2301.  
  2302. if ((npcs[i].npcType == 4278 || npcs[i].npcType == 4279 || npcs[i].npcType == 4280 || npcs[i].npcType == 4281 || npcs[i].npcType == 4282 || npcs[i].npcType == 4283 || npcs[i].npcType == 4284)) {
  2303. c.sendMessage("You gain some tokens.");
  2304. }
  2305. if(npcs[i].npcType == 4291 || npcs[i].npcType == 4292 && c.inCyclops) {
  2306. int random2 = Misc.random(25);
  2307. if(random2 == 1) {
  2308. Server.itemHandler.createGroundItem(c, c.getWarriorsGuild().getCyclopsDrop(c), npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2309. }
  2310. }
  2311. int[] tokens = {10, 20, 30, 40, 50, 60, 70};
  2312. if (npcs[i].npcType >= 4278 && npcs[i].npcType <= 4284) {
  2313. c.getWarriorsGuild().setSpawned(false);
  2314. //Server.itemHandler.createGroundItem(c, tokens[npcs[i].npcType - 4278], npcs[i].absX, npcs[i].absY, 1, c.playerId);
  2315. }
  2316. if (npcs[i].npcType == 4278) {
  2317. c.getItems().addItem(8851, 5);
  2318. }
  2319. if (ArmadylKC(i)) {
  2320. c.Arma += 1;
  2321. //c.getPA().sendFrame126(""+c.Arma+"", 16216);
  2322. }
  2323. if (npcs[i].npcType == 132) {
  2324. appendJailKc(i);
  2325. }
  2326. if (BandosKC(i)) {
  2327. c.Band += 1;
  2328. //c.getPA().sendFrame126(""+c.Bandos+"", 16217);
  2329. }
  2330. if (SaraKC(i)) {
  2331. c.Sara += 1;
  2332. //c.getPA().sendFrame126(""+c.Sara+"", 16218);
  2333. }
  2334. if (ZammyKC(i)) {
  2335. c.Zammy += 1;
  2336. //c.getPA().sendFrame126(""+c.Zammy+"", 16219);
  2337. }
  2338. if (npcs[i].npcType == 3493) {
  2339. c.Agrith = true;
  2340. }
  2341. if (npcs[i].npcType == 3494) {
  2342. c.Flambeed = true;
  2343. }
  2344. if (npcs[i].npcType == 3495) {
  2345. c.Karamel = true;
  2346. }
  2347. if (npcs[i].npcType == 3496) {
  2348. c.Dessourt = true;
  2349. }
  2350. if (npcs[i].npcType == 3491) {
  2351. c.Culin = true;
  2352. }
  2353. if (npcs[i].npcType == 4279) {
  2354. c.getItems().addItem(8851, 10);
  2355. }
  2356. if (npcs[i].npcType == 4280) {
  2357. c.getItems().addItem(8851, 15);
  2358. }
  2359. if (npcs[i].npcType == 4281) {
  2360. c.getItems().addItem(8851, 20);
  2361. }
  2362. if (npcs[i].npcType == 4282) {
  2363. c.getItems().addItem(8851, 25);
  2364. }
  2365. if (npcs[i].npcType == 4283) {
  2366. c.getItems().addItem(8851, 30);
  2367. }
  2368. if (npcs[i].npcType == 4284) {
  2369. c.getItems().addItem(8851, 40);
  2370. }
  2371.  
  2372. if (NPCDrops.dropRarity.get(npcs[i].npcType) != null) {
  2373. if (rareDrops(i)) {
  2374. try {
  2375. int random = Misc.random(NPCDrops.rareDrops.get(npcs[i].npcType).length-1);
  2376. if (c.CSLS == 3) {
  2377. if (c.clanId >= 0)
  2378. Server.clanChat.handleCoinShare(c, NPCDrops.rareDrops.get(npcs[i].npcType)[random][0], NPCDrops.rareDrops.get(npcs[i].npcType)[random][1]);
  2379. return;
  2380. }
  2381. if (c.CSLS == 1) {
  2382. if (c.clanId >= 0)
  2383. Server.clanChat.handleLootShare(c, NPCDrops.rareDrops.get(npcs[i].npcType)[random][0], NPCDrops.rareDrops.get(npcs[i].npcType)[random][1]);
  2384. Server.itemHandler.createGroundItem(c, NPCDrops.rareDrops.get(npcs[i].npcType)[random][0], npcs[i].absX, npcs[i].absY, NPCDrops.rareDrops.get(npcs[i].npcType)[random][1], c.playerId);
  2385. return;
  2386. }
  2387. Server.itemHandler.createGroundItem(c, NPCDrops.rareDrops.get(npcs[i].npcType)[random][0], npcs[i].absX, npcs[i].absY, NPCDrops.rareDrops.get(npcs[i].npcType)[random][1], c.playerId);
  2388. } catch(Exception ex) {
  2389. ex.printStackTrace();
  2390. }
  2391. } else {
  2392. int random = Misc.random(NPCDrops.normalDrops.get(npcs[i].npcType).length-1);
  2393.  
  2394. Server.itemHandler.createGroundItem(c, NPCDrops.normalDrops.get(npcs[i].npcType)[random][0], npcs[i].absX, npcs[i].absY, NPCDrops.normalDrops.get(npcs[i].npcType)[random][1], c.playerId);
  2395. //Server.clanChat.handleLootShare(c, NPCDrops.normalDrops.get(npcs[i].npcType)[random][0], NPCDrops.normalDrops.get(npcs[i].npcType)[random][1]);
  2396. }
  2397. }
  2398.  
  2399. }
  2400.  
  2401. //System.out.println("Took: " + (System.currentTimeMillis() - start));
  2402. }
  2403.  
  2404.  
  2405.  
  2406.  
  2407.  
  2408. //id of bones dropped by npcs
  2409. public int boneDrop(int type) {
  2410. switch (type) {
  2411. case 1://normal bones
  2412. case 9:
  2413. case 100:
  2414. case 12:
  2415. case 17:
  2416. case 803:
  2417. case 18:
  2418. case 81:
  2419. case 101:
  2420. case 41:
  2421. case 19:
  2422. case 90:
  2423. case 75:
  2424. case 86:
  2425. case 78:
  2426. case 912:
  2427. case 913:
  2428. case 914:
  2429. case 1648:
  2430. case 1643:
  2431. case 1618:
  2432. case 1624:
  2433. case 181:
  2434. case 119:
  2435. case 49:
  2436. case 26:
  2437. case 1341:
  2438.  
  2439.  
  2440. case 3247:
  2441. case 6233:
  2442. case 6232:
  2443. case 3248:
  2444. case 6212:
  2445. case 6254:
  2446. case 6258:
  2447. return 526;
  2448. case 117:
  2449. case 6270: // Cyclops
  2450. case 6269: // Ice cyclops
  2451. case 4291: // Cyclops
  2452. case 4292: // Ice cyclops
  2453. return 532;//big bones
  2454. case 50://drags
  2455. case 53:
  2456. case 54:
  2457. case 55:
  2458. case 941:
  2459. case 1590:
  2460. case 1591:
  2461. case 1592:
  2462. case 6218:
  2463. case 6272:
  2464. case 6274:
  2465. return 536;
  2466. case 84:
  2467. case 1615:
  2468. case 1613:
  2469. case 82:
  2470. case 3200:
  2471. case 6208:
  2472. case 6206:
  2473. case 6204:
  2474. case 6203:
  2475. return 592;
  2476. case 2881:
  2477. case 2882:
  2478. case 2883:
  2479. return 6729;
  2480. default:
  2481. return -1;
  2482. }
  2483. }
  2484.  
  2485. public int getStackedDropAmount(int itemId, int npcId) {
  2486. switch (itemId) {
  2487. case 995:
  2488. switch (npcId) {
  2489. case 1:
  2490. return 50+ Misc.random(50);
  2491. case 9:
  2492. return 133 + Misc.random(100);
  2493. case 1624:
  2494. return 1000 + Misc.random(300);
  2495. case 1618:
  2496. return 1000 + Misc.random(300);
  2497. case 1643:
  2498. return 1000 + Misc.random(300);
  2499. case 1610:
  2500. return 1000 + Misc.random(1000);
  2501. case 1613:
  2502. return 1500 + Misc.random(1250);
  2503. case 1615:
  2504. return 3000;
  2505. case 18:
  2506. return 500;
  2507. case 101:
  2508. return 60;
  2509. case 913:
  2510. case 912:
  2511. case 914:
  2512. return 750 + Misc.random(500);
  2513. case 1612:
  2514. return 250 + Misc.random(500);
  2515. case 1648:
  2516. return 250 + Misc.random(250);
  2517. case 90:
  2518. return 200;
  2519. case 82:
  2520. return 1000 + Misc.random(455);
  2521. case 52:
  2522. return 400 + Misc.random(200);
  2523. case 49:
  2524. return 1500 + Misc.random(2000);
  2525. case 1341:
  2526. return 1500 + Misc.random(500);
  2527. case 26:
  2528. return 500 + Misc.random(100);
  2529. case 20:
  2530. return 750 + Misc.random(100);
  2531. case 21:
  2532. return 890 + Misc.random(125);
  2533. case 117:
  2534. return 500 + Misc.random(250);
  2535. case 2607:
  2536. return 500 + Misc.random(350);
  2537. }
  2538. break;
  2539. case 11212:
  2540. return 10 + Misc.random(4);
  2541. case 565:
  2542. case 561:
  2543. return 10;
  2544. case 560:
  2545. case 563:
  2546. case 562:
  2547. return 15;
  2548. case 555:
  2549. case 554:
  2550. case 556:
  2551. case 557:
  2552. return 20;
  2553. case 892:
  2554. return 40;
  2555. case 886:
  2556. return 100;
  2557. case 6522:
  2558. return 6 + Misc.random(5);
  2559.  
  2560. }
  2561.  
  2562. return 1;
  2563. }
  2564.  
  2565. /**
  2566. * Slayer Experience
  2567. **/
  2568.  
  2569. public void appendSlayerExperience(int i) {
  2570. int npc = 0;
  2571. Client c = (Client)Server.playerHandler.players[npcs[i].killedBy];
  2572. if(c != null) {
  2573. if (c.slayerTask == npcs[i].npcType ){
  2574. c.taskAmount--;
  2575. c.getPA().addSkillXP(npcs[i].MaxHP * Config.SLAYER_EXPERIENCE, 18);
  2576. if (c.taskAmount <= 0 ) {
  2577. if (npcs[i].npcType == 1645 || npcs[i].npcType == 1591 || npcs[i].npcType == 1618 || npcs[i].npcType == 1643 || npcs[i].npcType == 941 || npcs[i].npcType == 119 || npcs[i].npcType == 82 || npcs[i].npcType == 52 || npcs[i].npcType == 1612 || npcs[i].npcType == 117 || npcs[i].npcType == 1265 || npcs[i].npcType == 112 || npcs[i].npcType == 125) {
  2578. c.getPA().addSkillXP((npcs[i].MaxHP * 10) * Config.SLAYER_EXPERIENCE, 18);
  2579. c.pkPoints += 10;
  2580. c.slayerTask = -1;
  2581. c.sendMessage("You completed your MEDIUM slayer task. Please see a slayer master to get a new one.");
  2582. c.sendMessage("You receive 10 PKP");
  2583. }
  2584. if (npcs[i].npcType == 1624 || npcs[i].npcType == 1610 || npcs[i].npcType == 1592 || npcs[i].npcType == 1613 || npcs[i].npcType == 1615 || npcs[i].npcType == 55 || npcs[i].npcType == 84 || npcs[i].npcType == 49 || npcs[i].npcType == 1618 || npcs[i].npcType == 941 || npcs[i].npcType == 82 || npcs[i].npcType == 2783 || npcs[i].npcType == 1341) {
  2585. c.getPA().addSkillXP((npcs[i].MaxHP * 12) * Config.SLAYER_EXPERIENCE, 18);
  2586. c.pkPoints += 15;
  2587. c.slayerTask = -1;
  2588. c.sendMessage("You completed your HARD slayer task. Please see a slayer master to get a new one.");
  2589. c.sendMessage("You receive 15 PKP");
  2590. }
  2591. if (npcs[i].npcType == 1648 || npcs[i].npcType == 117 || npcs[i].npcType == 1265 || npcs[i].npcType == 90 || npcs[i].npcType == 103 || npcs[i].npcType == 78 || npcs[i].npcType == 119 || npcs[i].npcType == 18 || npcs[i].npcType == 101 || npcs[i].npcType == 1265 || npcs[i].npcType == 181) {
  2592. c.getPA().addSkillXP((npcs[i].MaxHP * 8) * Config.SLAYER_EXPERIENCE, 18);
  2593. c.pkPoints += 5;
  2594. c.slayerTask = -1;
  2595. c.sendMessage("You completed your EASY slayer task. Please see a slayer master to get a new one.");
  2596. c.sendMessage("You receive 5 PKP");
  2597. }
  2598.  
  2599. }
  2600.  
  2601. }
  2602. }
  2603. }
  2604.  
  2605.  
  2606.  
  2607.  
  2608.  
  2609. /**
  2610. * Resets players in combat
  2611. */
  2612.  
  2613. public void resetPlayersInCombat(int i) {
  2614. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  2615. if (Server.playerHandler.players[j] != null)
  2616. if (Server.playerHandler.players[j].underAttackBy2 == i)
  2617. Server.playerHandler.players[j].underAttackBy2 = 0;
  2618. }
  2619. }
  2620.  
  2621.  
  2622. /**
  2623. * Npc Follow Player
  2624. **/
  2625.  
  2626. public int GetMove(int Place1,int Place2) {
  2627. if ((Place1 - Place2) == 0) {
  2628. return 0;
  2629. } else if ((Place1 - Place2) < 0) {
  2630. return 1;
  2631. } else if ((Place1 - Place2) > 0) {
  2632. return -1;
  2633. }
  2634. return 0;
  2635. }
  2636.  
  2637. public boolean followPlayer(int i) {
  2638. switch (npcs[i].npcType) {
  2639. case 2892:
  2640. case 2894:
  2641. return false;
  2642. }
  2643. return true;
  2644. }
  2645.  
  2646. public void followPlayer(int i, int playerId) {
  2647. if (Server.playerHandler.players[playerId] == null) {
  2648. return;
  2649. }
  2650. if (Server.playerHandler.players[playerId].respawnTimer > 0) {
  2651. npcs[i].facePlayer(0);
  2652. npcs[i].randomWalk = true;
  2653. npcs[i].underAttack = false;
  2654. return;
  2655. }
  2656.  
  2657. if (!followPlayer(i)) {
  2658. npcs[i].facePlayer(playerId);
  2659. return;
  2660. }
  2661.  
  2662. if(!goodDistance(npcs[i].getX(), npcs[i].getY(), Server.playerHandler.players[playerId].getX(), Server.playerHandler.players[playerId].getY(), 1) && npcs[i].npcType == 10127 && npcs[i].attackType == 0) {
  2663. npcs[i].attackType = 2;
  2664. return;
  2665. }
  2666.  
  2667. int playerX = Server.playerHandler.players[playerId].absX;
  2668. int playerY = Server.playerHandler.players[playerId].absY;
  2669. npcs[i].randomWalk = false;
  2670. if (goodDistance(npcs[i].getX(), npcs[i].getY(), playerX, playerY, distanceRequired(i)))
  2671. return;
  2672.  
  2673.  
  2674.  
  2675. if((npcs[i].spawnedBy > 0) || ((npcs[i].absX < npcs[i].makeX + Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absX > npcs[i].makeX - Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absY < npcs[i].makeY + Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absY > npcs[i].makeY - Config.NPC_FOLLOW_DISTANCE))) {
  2676. if(npcs[i].heightLevel == Server.playerHandler.players[playerId].heightLevel) {
  2677. if(Server.playerHandler.players[playerId] != null && npcs[i] != null) {
  2678. if(playerY < npcs[i].absY) {
  2679. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2680. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2681. } else if(playerY > npcs[i].absY) {
  2682. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2683. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2684. } else if(playerX < npcs[i].absX) {
  2685. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2686. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2687. } else if(playerX > npcs[i].absX) {
  2688. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2689. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2690. } else if(playerX == npcs[i].absX || playerY == npcs[i].absY) {
  2691. int o = Misc.random(3);
  2692. switch(o) {
  2693. case 0:
  2694. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2695. npcs[i].moveY = GetMove(npcs[i].absY, playerY+1);
  2696. break;
  2697.  
  2698. case 1:
  2699. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  2700. npcs[i].moveY = GetMove(npcs[i].absY, playerY-1);
  2701. break;
  2702.  
  2703. case 2:
  2704. npcs[i].moveX = GetMove(npcs[i].absX, playerX+1);
  2705. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2706. break;
  2707.  
  2708. case 3:
  2709. npcs[i].moveX = GetMove(npcs[i].absX, playerX-1);
  2710. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  2711. break;
  2712. }
  2713. }
  2714. int x = (npcs[i].absX + npcs[i].moveX);
  2715. int y = (npcs[i].absY + npcs[i].moveY);
  2716. npcs[i].facePlayer(playerId);
  2717. if (checkClipping(i))
  2718. npcs[i].getNextNPCMovement(i);
  2719. else {
  2720. npcs[i].moveX = 0;
  2721. npcs[i].moveY = 0;
  2722. }
  2723. npcs[i].facePlayer(playerId);
  2724. npcs[i].updateRequired = true;
  2725. }
  2726. }
  2727. } else {
  2728. npcs[i].facePlayer(0);
  2729. npcs[i].randomWalk = true;
  2730. npcs[i].underAttack = false;
  2731. }
  2732. }
  2733.  
  2734. public void follownpc(int i, int playerId) {
  2735. if (npcs[playerId] == null) {
  2736. return;
  2737. }
  2738.  
  2739.  
  2740. if (!followPlayer(i)) {
  2741. npcs[i].facePlayer(playerId);
  2742. return;
  2743. }
  2744.  
  2745. if(!goodDistance(npcs[i].getX(), npcs[i].getY(), npcs[playerId].getX(), npcs[playerId].getY(), 1) && npcs[i].npcType == 10127 && npcs[i].attackType == 0) {
  2746. npcs[i].attackType = 2;
  2747. return;
  2748. }
  2749.  
  2750.  
  2751. npcs[i].randomWalk = false;
  2752.  
  2753. if (goodDistance(npcs[i].getX(), npcs[i].getY(), npcs[playerId].absX, npcs[playerId].absY, distanceRequired(i)))
  2754. return;
  2755.  
  2756.  
  2757.  
  2758. if((npcs[i].spawnedBy > 0) || ((npcs[i].absX < npcs[i].makeX + Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absX > npcs[i].makeX - Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absY < npcs[i].makeY + Config.NPC_FOLLOW_DISTANCE) && (npcs[i].absY > npcs[i].makeY - Config.NPC_FOLLOW_DISTANCE))) {
  2759. if(npcs[i].heightLevel == npcs[playerId].heightLevel) {
  2760. if(npcs[playerId] != null && npcs[i] != null) {
  2761. if(npcs[playerId].absY < npcs[i].absY) {
  2762. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2763. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2764. } else if(npcs[playerId].absY > npcs[i].absY) {
  2765. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2766. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2767. } else if(npcs[playerId].absX < npcs[i].absX) {
  2768. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2769. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2770. } else if(npcs[playerId].absX > npcs[i].absX) {
  2771. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2772. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2773. } else if(npcs[playerId].absX == npcs[i].absX || npcs[playerId].absY == npcs[i].absY) {
  2774. int o = Misc.random(3);
  2775. switch(o) {
  2776. case 0:
  2777. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2778. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY+1);
  2779. break;
  2780.  
  2781. case 1:
  2782. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX);
  2783. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY-1);
  2784. break;
  2785.  
  2786. case 2:
  2787. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX+1);
  2788. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2789. break;
  2790.  
  2791. case 3:
  2792. npcs[i].moveX = GetMove(npcs[i].absX, npcs[playerId].absX-1);
  2793. npcs[i].moveY = GetMove(npcs[i].absY, npcs[playerId].absY);
  2794. break;
  2795. }
  2796. }
  2797. int x = (npcs[i].absX + npcs[i].moveX);
  2798. int y = (npcs[i].absY + npcs[i].moveY);
  2799. npcs[i].facePlayer(playerId);
  2800. if (checkClipping(i))
  2801. npcs[i].getNextNPCMovement(i);
  2802. else {
  2803. npcs[i].moveX = 0;
  2804. npcs[i].moveY = 0;
  2805. }
  2806. npcs[i].facePlayer(playerId);
  2807. npcs[i].updateRequired = true;
  2808. }
  2809. }
  2810. } else {
  2811. npcs[i].facePlayer(0);
  2812. npcs[i].randomWalk = true;
  2813. npcs[i].underAttack = false;
  2814. }
  2815. }
  2816.  
  2817.  
  2818. public boolean checkClipping(int i) {
  2819. NPC npc = npcs[i];
  2820. int size = npcSize(i);
  2821.  
  2822. for (int x = 0; x < size; x++) {
  2823. for (int y = 0; y < size; y++) {
  2824. if (!VirtualWorld.I(npc.heightLevel, npc.absX + x, npc.absY + y, npc.absX + npc.moveX, npc.absY + npc.moveY, 0))
  2825. return false;
  2826. }
  2827. }
  2828. return true;
  2829. }
  2830.  
  2831. private Client v;
  2832. public NPCHandler(Client Client) {
  2833. this.v = Client;
  2834. }
  2835.  
  2836. /**
  2837. * load spell
  2838. **/
  2839. public void loadSpell2(int i) {
  2840. npcs[i].attackType = 3;
  2841. int random = Misc.random(3);
  2842. if (random == 0) {
  2843. npcs[i].projectileId = 393; //red
  2844. npcs[i].endGfx = 430;
  2845. } else if (random == 1) {
  2846. npcs[i].projectileId = 394; //green
  2847. npcs[i].endGfx = 429;
  2848. } else if (random == 2) {
  2849. npcs[i].projectileId = 395; //white
  2850. npcs[i].endGfx = 431;
  2851. } else if (random == 3) {
  2852. npcs[i].projectileId = 396; //blue
  2853. npcs[i].endGfx = 428;
  2854. }
  2855. }
  2856.  
  2857. public void loadSpell(int i) {
  2858. Client c = (Client) Server.playerHandler.players[npcs[i].killerId];
  2859. switch(npcs[i].npcType) {
  2860. case 2892:
  2861. npcs[i].projectileId = 94;
  2862. npcs[i].attackType = 2;
  2863. npcs[i].endGfx = 95;
  2864. break;
  2865. //kalphite queen form 1
  2866. case 1158:
  2867. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  2868. if (Server.playerHandler.players[j] != null) {
  2869.  
  2870. int kq1 = 0;
  2871. if (goodDistance(npcs[i].absX, npcs[i].absY, c.absX, c.absY, 2))
  2872. kq1 = Misc.random(2);
  2873. else
  2874. kq1 = Misc.random(1);
  2875. if (kq1 == 0) {
  2876. npcs[i].projectileId = 280; //mage
  2877. npcs[i].endGfx = 281;
  2878. npcs[i].attackType = 2;
  2879. } else if (kq1 == 1) {
  2880. npcs[i].attackType = 1; // range
  2881. npcs[i].endGfx = 281;
  2882. npcs[i].projectileId = 473;
  2883. } else if (kq1 == 2) {
  2884. npcs[i].attackType = 0; // melee
  2885. npcs[i].projectileId = -1;
  2886. }
  2887. }
  2888. }
  2889. break;
  2890.  
  2891. //kalphite queen form 2
  2892. case 1160:
  2893. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  2894. if (Server.playerHandler.players[j] != null) {
  2895.  
  2896. int kq1 = 0;
  2897. if (goodDistance(npcs[i].absX, npcs[i].absY, c.absX, c.absY, 2))
  2898. kq1 = Misc.random(2);
  2899. else
  2900. kq1 = Misc.random(1);
  2901. if (kq1 == 0) {
  2902. npcs[i].projectileId = 280; //mage
  2903. npcs[i].endGfx = 281;
  2904. npcs[i].attackType = 2;
  2905. } else if (kq1 == 1) {
  2906. npcs[i].attackType = 1; // range
  2907. npcs[i].endGfx = 281;
  2908. npcs[i].projectileId = 473;
  2909. } else if (kq1 == 2) {
  2910. npcs[i].attackType = 0; // melee
  2911. npcs[i].projectileId = -1;
  2912. }
  2913. }
  2914. }
  2915.  
  2916. break;
  2917. case 2894:
  2918. npcs[i].projectileId = 298;
  2919. npcs[i].attackType = 1;
  2920. break;
  2921. case 6203:
  2922. random = Misc.random(2);
  2923. if (random == 0 || random == 1) {
  2924. npcs[i].attackType = 0;
  2925. npcs[i].projectileId = -1;
  2926. } else {
  2927. npcs[i].attackType = 2;
  2928. npcs[i].projectileId = 1211;
  2929. }
  2930. break;
  2931. case 5666:
  2932. random = Misc.random(1);
  2933. if (random == 0) {
  2934. npcs[i].attackType = 1;
  2935. } else {
  2936. npcs[i].attackType = 2;
  2937.  
  2938. }
  2939. break;
  2940. case 6206:
  2941. npcs[i].attackType = 1;
  2942. npcs[i].projectileId = 1209;
  2943. break;
  2944. case 6208:
  2945. npcs[i].attackType = 2;
  2946. npcs[i].projectileId = 1213;
  2947. break;
  2948. case 6256:
  2949. npcs[i].attackType = 1;
  2950. npcs[i].projectileId = 16;
  2951. break;
  2952. case 6220:
  2953. npcs[i].attackType = 1;
  2954. npcs[i].projectileId = 17;
  2955. break;
  2956. case 50:
  2957. int r5 = 0;
  2958. if (goodDistance(npcs[i].absX, npcs[i].absY, Server.playerHandler.players[npcs[i].killerId].absX, Server.playerHandler.players[npcs[i].killerId].absY, 2))
  2959. r5 = Misc.random(5);
  2960. else
  2961. r5 = Misc.random(3);
  2962. if (r5 == 0) {
  2963. npcs[i].projectileId = 393; //red
  2964. npcs[i].attackType = 3;
  2965. } else if (r5 == 1) {
  2966. npcs[i].projectileId = 394; //green
  2967. npcs[i].attackType = 2;
  2968. if(c.poisonDamage <= 0) {
  2969. c.getPA().appendPoison(8);
  2970. }
  2971. } else if (r5 == 2) {
  2972. npcs[i].projectileId = 395; //white
  2973. npcs[i].attackType = 2;
  2974. if(c.freezeTimer <= 0) {
  2975. c.freezeTimer = 19;
  2976. c.sendMessage("You have been Frozen!");
  2977. }
  2978. } else if (r5 == 3) {
  2979. npcs[i].projectileId = 396; //blue
  2980. npcs[i].attackType = 2;
  2981. } else if (r5 == 4) {
  2982. npcs[i].projectileId = -1; //melee
  2983. npcs[i].attackType = 0;
  2984. } else if (r5 == 5) {
  2985. npcs[i].projectileId = -1; //melee
  2986. npcs[i].attackType = 0;
  2987. }
  2988. break;
  2989. case 53:
  2990. case 54:
  2991. case 55:
  2992. case 941:
  2993. case 1590:
  2994. case 1591:
  2995. case 1592:
  2996. int r6 = 0;
  2997. if (goodDistance(npcs[i].absX, npcs[i].absY, Server.playerHandler.players[npcs[i].killerId].absX, Server.playerHandler.players[npcs[i].killerId].absY, 2))
  2998. r6 = Misc.random(2);
  2999. else
  3000. r6 = Misc.random(1);
  3001. if (r6 == 0) {
  3002. npcs[i].projectileId = 393; //red
  3003. npcs[i].attackType = 3;
  3004. } else if (r6 == 1) {
  3005. npcs[i].projectileId = 393; //red
  3006. npcs[i].attackType = 3;
  3007. } else if (r6 == 2) {
  3008. npcs[i].projectileId = -1; //melee
  3009. npcs[i].attackType = 0;
  3010. }
  3011. break;
  3012. //arma npcs
  3013. case 6227://kilisa
  3014. npcs[i].attackType = 0;
  3015. break;
  3016. case 6225://geerin
  3017. case 6233:
  3018. case 6230:
  3019. npcs[i].attackType = 1;
  3020. npcs[i].projectileId = 1190;
  3021. break;
  3022. case 6239:
  3023. npcs[i].attackType = 1;
  3024. npcs[i].projectileId = 1191;
  3025. break;
  3026. case 6232:
  3027. npcs[i].attackType = 1;
  3028. npcs[i].projectileId = 1191;
  3029. break;
  3030. case 6276:
  3031. npcs[i].attackType = 1;
  3032. npcs[i].projectileId = 1195;
  3033. break;
  3034. case 6223://skree
  3035. npcs[i].attackType = 2;
  3036. npcs[i].projectileId = 1199;
  3037. break;
  3038. case 6257://saradomin strike
  3039. npcs[i].attackType = 2;
  3040. npcs[i].endGfx = 76;
  3041. break;
  3042. case 6221://zamorak strike
  3043. npcs[i].attackType = 2;
  3044. npcs[i].endGfx = 78;
  3045. break;
  3046. case 6231://arma
  3047. npcs[i].attackType = 2;
  3048. npcs[i].projectileId = 1199;
  3049. break;
  3050. case 6222://kree
  3051. random = Misc.random(1);
  3052. npcs[i].attackType = 1 + random;
  3053. if (npcs[i].attackType == 1) {
  3054. npcs[i].projectileId = 1197;
  3055. } else {
  3056. npcs[i].attackType = 2;
  3057. npcs[i].projectileId = 1198;
  3058. }
  3059. break;
  3060. //sara npcs
  3061. case 6247: //sara
  3062. random = Misc.random(1);
  3063. if (random == 0) {
  3064. npcs[i].attackType = 2;
  3065. npcs[i].endGfx = 1224;
  3066. npcs[i].projectileId = -1;
  3067. } else if (random == 1)
  3068. npcs[i].attackType = 0;
  3069. break;
  3070. case 6248: //star
  3071. npcs[i].attackType = 0;
  3072. break;
  3073. case 6250: //growler
  3074. npcs[i].attackType = 2;
  3075. npcs[i].projectileId = 1203;
  3076. break;
  3077. case 6252: //bree
  3078. npcs[i].attackType = 1;
  3079. npcs[i].projectileId = 9;
  3080. break;
  3081. //bandos npcs
  3082. case 6260://bandos
  3083. random = Misc.random(2);
  3084. if (random == 0 || random == 1) {
  3085. npcs[i].attackType = 0;
  3086. } else {
  3087. npcs[i].attackType = 1;
  3088. //npcs[i].projectileId = 1200;
  3089. }
  3090. break;
  3091. case 9463:
  3092. random = Misc.random(2);
  3093. if (random == 0 || random == 1)
  3094. npcs[i].attackType = 0;
  3095. else {
  3096. c.freezeTimer = 20;
  3097. npcs[i].attackType = 2;
  3098. c.sendMessage("The Strykewyrm Used His Ice Bite And Froze You!");
  3099. }
  3100. break;
  3101. case 9467:
  3102. random = Misc.random(2);
  3103. if (random == 0 || random == 1)
  3104. npcs[i].attackType = 0;
  3105. else {
  3106. if(c.poisonDamage <= 0) {
  3107. c.getPA().appendPoison(12);
  3108. npcs[i].attackType = 2;
  3109. c.sendMessage("The Strykewyrm Used His Poison Bite, And Poisend You!");
  3110. }
  3111. }
  3112. case 9465:
  3113. random = Misc.random(2);
  3114. if (random == 0 || random == 1)
  3115. npcs[i].attackType = 0;
  3116. else {
  3117. c.playerLevel[5] -= (c.playerLevel[5] * .22);
  3118. npcs[i].attackType = 2;
  3119. c.sendMessage("The Strykewyrm Drained Your Prayer Points!");
  3120. c.getPA().refreshSkill(5);
  3121. }
  3122. break;
  3123. case 795:
  3124. random = Misc.random(2);
  3125. if (random == 0 || random == 1)
  3126. npcs[i].attackType = 0;
  3127. else {
  3128. c.gfx0(369);
  3129. npcs[i].forceChat("Muhahaha");
  3130. c.freezeTimer = 15;
  3131. npcs[i].attackType = 2;
  3132. }
  3133. break;
  3134. case 3495:
  3135. random = Misc.random(2);
  3136. if (random == 0 || random == 1)
  3137. npcs[i].attackType = 0;
  3138. else {
  3139. c.gfx0(369);
  3140. npcs[i].forceChat("Semolina-Go!");
  3141. c.freezeTimer = 10;
  3142. npcs[i].attackType = 2;
  3143. }
  3144. break;
  3145. case 3493:
  3146. random = Misc.random(2);
  3147. if (random == 0 || random == 1) {
  3148. npcs[i].attackType = 0;
  3149. npcs[i].projectileId = -1;
  3150. } else {
  3151. npcs[i].gfx100(129);
  3152. npcs[i].projectileId = 130;
  3153. npcs[i].endGfx = 131;
  3154. npcs[i].attackType = 2;
  3155. }
  3156. break;
  3157. case 3496:
  3158. random = Misc.random(2);
  3159. if (random == 0 || random == 1) {
  3160. npcs[i].attackType = 0;
  3161. npcs[i].projectileId = -1;
  3162. } else {
  3163. npcs[i].forceChat("Hssssssssssss");
  3164. npcs[i].gfx100(550);
  3165. npcs[i].projectileId = 551;
  3166. npcs[i].endGfx = 552;
  3167. npcs[i].attackType = 2;
  3168. }
  3169. break;
  3170. case 3491:
  3171. npcs[i].projectileId = 106;
  3172. npcs[i].attackType = 2;
  3173. break;
  3174. case 6261://strongstack
  3175. npcs[i].attackType = 0;
  3176. break;
  3177. case 6263://steelwill
  3178. npcs[i].attackType = 2;
  3179. npcs[i].projectileId = 1203;
  3180. break;
  3181. case 6265://grimspike
  3182. npcs[i].attackType = 1;
  3183. npcs[i].projectileId = 1206;
  3184. break;
  3185. case 2025:
  3186. npcs[i].attackType = 2;
  3187. int r = Misc.random(3);
  3188. if(r == 0) {
  3189. npcs[i].gfx100(158);
  3190. npcs[i].projectileId = 159;
  3191. npcs[i].endGfx = 160;
  3192. }
  3193. if(r == 1) {
  3194. npcs[i].gfx100(161);
  3195. npcs[i].projectileId = 162;
  3196. npcs[i].endGfx = 163;
  3197. }
  3198. if(r == 2) {
  3199. npcs[i].gfx100(164);
  3200. npcs[i].projectileId = 165;
  3201. npcs[i].endGfx = 166;
  3202. }
  3203. if(r == 3) {
  3204. npcs[i].gfx100(155);
  3205. npcs[i].projectileId = 156;
  3206. }
  3207. break;
  3208. case 2881://supreme
  3209. npcs[i].attackType = 1;
  3210. npcs[i].projectileId = 298;
  3211. break;
  3212.  
  3213. case 2882://prime
  3214. npcs[i].attackType = 2;
  3215. npcs[i].projectileId = 162;
  3216. npcs[i].endGfx = 477;
  3217. break;
  3218.  
  3219. case 2028:
  3220. npcs[i].attackType = 1;
  3221. npcs[i].projectileId = 27;
  3222. break;
  3223.  
  3224. case 3200:
  3225. int r2 = Misc.random(1);
  3226. if (r2 == 0) {
  3227. npcs[i].attackType = 1;
  3228. npcs[i].gfx100(550);
  3229. npcs[i].projectileId = 551;
  3230. npcs[i].endGfx = 552;
  3231. } else {
  3232. npcs[i].attackType = 2;
  3233. npcs[i].gfx100(553);
  3234. npcs[i].projectileId = 554;
  3235. npcs[i].endGfx = 555;
  3236. }
  3237. break;
  3238. case 2745:
  3239. int r3 = 0;
  3240. if (goodDistance(npcs[i].absX, npcs[i].absY, Server.playerHandler.players[npcs[i].spawnedBy].absX, Server.playerHandler.players[npcs[i].spawnedBy].absY, 1))
  3241. r3 = Misc.random(2);
  3242. else
  3243. r3 = Misc.random(1);
  3244. if (r3 == 0) {
  3245. npcs[i].attackType = 2;
  3246. npcs[i].endGfx = 157;
  3247. npcs[i].projectileId = 1627;
  3248. } else if (r3 == 1) {
  3249. npcs[i].attackType = 1;
  3250. npcs[i].endGfx = 451;
  3251. npcs[i].gfx100(1625);
  3252. npcs[i].projectileId = -1;
  3253. } else if (r3 == 2) {
  3254. npcs[i].attackType = 0;
  3255. npcs[i].projectileId = -1;
  3256. }
  3257. break;
  3258. case 8133:
  3259. if (goodDistance(npcs[i].absX, npcs[i].absY, Server.playerHandler.players[npcs[i].killerId].absX, Server.playerHandler.players[npcs[i].killerId].absY, 3))
  3260. r3 = Misc.random(2);
  3261. else
  3262. r3 = Misc.random(1);
  3263. if (r3 == 0) {
  3264. npcs[i].attackType = 2;
  3265. npcs[i].endGfx = -1;
  3266. npcs[i].projectileId = 1828;
  3267. } else if (r3 == 1) {
  3268. npcs[i].attackType = 1;
  3269. npcs[i].endGfx = -1;
  3270. npcs[i].projectileId = 1839;
  3271. } else if (r3 == 2) {
  3272. npcs[i].attackType = 0;
  3273. npcs[i].gfx100(1834);
  3274. npcs[i].projectileId = -1;
  3275. }
  3276. break;
  3277. case 3102:
  3278. npcs[i].attackType = 1;
  3279. npcs[i].projectileId = 1839;
  3280. break;
  3281. case 3103:
  3282. npcs[i].attackType = 2;
  3283. npcs[i].projectileId = 1828;
  3284. break;
  3285. case 8349: case 8350: case 8351:
  3286. if (goodDistance(npcs[i].absX, npcs[i].absY, Server.playerHandler.players[npcs[i].killerId].absX, Server.playerHandler.players[npcs[i].killerId].absY, 2))
  3287. r3 = Misc.random(2);
  3288. else
  3289. r3 = Misc.random(1);
  3290. if (r3 == 0) {
  3291. npcs[i].attackType = 2;
  3292. npcs[i].gfx100(1885);
  3293. npcs[i].projectileId = 1884;
  3294. } else if (r3 == 1) {
  3295. npcs[i].attackType = 1;
  3296. npcs[i].projectileId = 1889;
  3297. } else if (r3 == 2) {
  3298. npcs[i].attackType = 0;
  3299. npcs[i].gfx100(1886);
  3300. npcs[i].projectileId = -1;
  3301. }
  3302. break;
  3303. case 2743:
  3304. npcs[i].attackType = 2;
  3305. npcs[i].projectileId = 445;
  3306. npcs[i].endGfx = 446;
  3307. break;
  3308.  
  3309. case 2631:
  3310. npcs[i].attackType = 1;
  3311. npcs[i].projectileId = 443;
  3312. break;
  3313. }
  3314. }
  3315.  
  3316. /**
  3317. * Distanced required to attack
  3318. **/
  3319. public int distanceRequired(int i) {
  3320. switch(npcs[i].npcType) {
  3321. case 2025:
  3322. case 2028:
  3323. return 6;
  3324. case 53:
  3325. case 54:
  3326. case 55:
  3327. case 941:
  3328. case 1590:
  3329. case 1591:
  3330. case 1592:
  3331. return 2;
  3332. case 1158:
  3333. case 1160:
  3334. return 8;
  3335. case 6247:
  3336. return 2;
  3337. case 2881://dag kings
  3338. case 2882:
  3339. case 3200://chaos ele
  3340. case 2743:
  3341. case 2631:
  3342. case 2745:
  3343. case 50:
  3344. return 8;
  3345. case 6220:
  3346. case 6276:
  3347. case 6256:
  3348. case 6230:
  3349. case 6239: // Aviansie
  3350. case 6221:
  3351. case 6231:
  3352. case 6257:
  3353. case 6278:
  3354. case 8133:
  3355. case 6233:
  3356. case 6232:
  3357. return 5;
  3358. case 3102:
  3359. case 3103:
  3360. return 2;
  3361. case 8349: case 8350: case 8351:
  3362. return 1;
  3363. case 2883://rex
  3364. case 4291: // Cyclops
  3365. case 4292: // Ice cyclops
  3366. return 2;
  3367. case 6263:
  3368. case 6265:
  3369. case 6206:
  3370. case 6208:
  3371. case 6222:
  3372. case 6223:
  3373. case 6225:
  3374. case 6250:
  3375. case 6252:
  3376. return 15;
  3377. //things around dags
  3378. case 2892:
  3379. case 2894:
  3380. return 10;
  3381. default:
  3382. return 1;
  3383. }
  3384. }
  3385.  
  3386.  
  3387.  
  3388. public int followDistance(int i) {
  3389. switch (npcs[i].npcType) {
  3390. case 6260:
  3391. case 6261:
  3392. case 6247:
  3393. case 6248:
  3394. case 6223:
  3395. case 6225:
  3396. case 6227:
  3397. case 6203:
  3398. case 6204:
  3399. case 6206:
  3400. case 6208:
  3401. case 6250:
  3402. case 6252:
  3403. case 6263:
  3404. case 8133:
  3405. case 6265:
  3406. return 15;
  3407. case 3247:
  3408. case 6270:
  3409. case 6219:
  3410. case 6255:
  3411. case 6229:
  3412. case 6277:
  3413. case 6233:
  3414. case 6232:
  3415. case 6218:
  3416. case 6269:
  3417. case 3248:
  3418. case 6212:
  3419. case 6220:
  3420. case 6276:
  3421. case 6256:
  3422. case 6230:
  3423. case 6239:
  3424. case 6221:
  3425. case 6231:
  3426. case 6257:
  3427. case 6278:
  3428. case 6272:
  3429. case 6274:
  3430. case 6254:
  3431. case 4291: // Cyclops
  3432. case 4292: // Ice cyclops
  3433. case 6258:
  3434. case 8349: case 8350: case 8351:
  3435. return 7;
  3436. case 50:
  3437. return 18;
  3438. case 2883:
  3439. return 4;
  3440. case 2881:
  3441. case 2882:
  3442. return 1;
  3443.  
  3444. }
  3445. return 0;
  3446.  
  3447.  
  3448. }
  3449.  
  3450. public int getProjectileSpeed(int i) {
  3451. switch(npcs[i].npcType) {
  3452. case 2881:
  3453. case 2882:
  3454. case 3200:
  3455. return 85;
  3456.  
  3457. case 2745:
  3458. return 115;
  3459. case 1158:
  3460. case 1160:
  3461. return 90;
  3462.  
  3463. case 50:
  3464. case 53:
  3465. case 54:
  3466. case 55:
  3467. case 941:
  3468. case 1590:
  3469. case 1591:
  3470. case 1592:
  3471. return 85;
  3472.  
  3473. case 2025:
  3474. return 85;
  3475.  
  3476. case 3493:
  3477. return 85;
  3478.  
  3479. case 2028:
  3480. return 80;
  3481.  
  3482. default:
  3483. return 85;
  3484. }
  3485. }
  3486.  
  3487. /**
  3488. *NPC Attacking Player
  3489. **/
  3490.  
  3491. public void attackPlayer(Client c, int i) {
  3492. if(npcs[i] != null) {
  3493. if (npcs[i].isDead)
  3494. return;
  3495. if (!npcs[i].inMulti() && npcs[i].underAttackBy > 0 && npcs[i].underAttackBy != c.playerId) {
  3496. npcs[i].killerId = 0;
  3497. return;
  3498. }
  3499. if (!npcs[i].inMulti() && (c.underAttackBy > 0 || (c.underAttackBy2 > 0 && c.underAttackBy2 != i))) {
  3500. npcs[i].killerId = 0;
  3501. return;
  3502. }
  3503. if (npcs[i].heightLevel != c.heightLevel) {
  3504. npcs[i].killerId = 0;
  3505. return;
  3506. }
  3507. if (!goodDistance(npcs[i].getX(), npcs[i].getY(), c.getY(), c.getX(), 1) && npcs[i].npcType == 8133 && npcs[i].attackType == 0)
  3508. {
  3509. npcs[i].attackType = 1+Misc.random(1);
  3510. return;
  3511. }
  3512.  
  3513.  
  3514.  
  3515. if (!goodDistance(npcs[i].getX(), npcs[i].getY(), c.getY(), c.getX(), 1) && npcs[i].npcType == 10127 && npcs[i].attackType == 0)
  3516. {
  3517. npcs[i].attackType = 2;
  3518. return;
  3519. }
  3520.  
  3521.  
  3522. if (!goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), 1) && npcs[i].npcType == 8349 && npcs[i].attackType == 0)
  3523. {
  3524. npcs[i].attackType = 1+Misc.random(1);
  3525. return;
  3526. }
  3527. npcs[i].facePlayer(c.playerId);
  3528. boolean special = false;//specialCase(c,i);
  3529. if(goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), distanceRequired(i)) || special) {
  3530. if(c.respawnTimer <= 0) {
  3531. npcs[i].facePlayer(c.playerId);
  3532. npcs[i].attackTimer = getNpcDelay(i);
  3533. npcs[i].hitDelayTimer = getHitDelay(i);
  3534. npcs[i].attackType = 0;
  3535. if (special)
  3536. loadSpell2(i);
  3537. else
  3538. loadSpell(i);
  3539. if (npcs[i].attackType == 3)
  3540. npcs[i].hitDelayTimer += 2;
  3541. if (multiAttacks(i)) {
  3542. multiAttackGfx(i, npcs[i].projectileId);
  3543. startAnimation(getAttackEmote(i), i);
  3544. npcs[i].oldIndex = c.playerId;
  3545. return;
  3546. }
  3547. if(npcs[i].projectileId > 0) {
  3548. int nX = Server.npcHandler.npcs[i].getX() + offset(i);
  3549. int nY = Server.npcHandler.npcs[i].getY() + offset(i);
  3550. int pX = c.getX();
  3551. int pY = c.getY();
  3552. int offX = (nY - pY)* -1;
  3553. int offY = (nX - pX)* -1;
  3554. c.getPA().createPlayersProjectile(nX, nY, offX, offY, 50, getProjectileSpeed(i), npcs[i].projectileId, 43, 31, -c.getId() - 1, 65);
  3555. }
  3556. c.underAttackBy2 = i;
  3557. c.singleCombatDelay2 = System.currentTimeMillis();
  3558. npcs[i].oldIndex = c.playerId;
  3559. startAnimation(getAttackEmote(i), i);
  3560. c.getPA().removeAllWindows();
  3561. }
  3562. }
  3563. }
  3564. }
  3565.  
  3566. public int offset(int i) {
  3567. switch (npcs[i].npcType) {
  3568. case 2881:
  3569. case 2882:
  3570. return 1;
  3571. case 2745:
  3572. case 8349: case 8350: case 8351:
  3573. case 2743:
  3574. case 8133:
  3575. case 50:
  3576. return 1;
  3577. case 1158:
  3578. case 1160:
  3579. return 2;
  3580. }
  3581. return 0;
  3582. }
  3583.  
  3584. public boolean specialCase(Client c, int i) { //responsible for npcs that much
  3585. if (goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), 8) && !goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), distanceRequired(i)))
  3586. return true;
  3587. return false;
  3588. }
  3589.  
  3590. public boolean retaliates(int npcType) {
  3591. return npcType < 6142 || npcType > 6145 && !(npcType >= 2440 && npcType <= 2446);
  3592. }
  3593.  
  3594. public void applyDamage(int i) {
  3595. if(npcs[i] != null) {
  3596. if(Server.playerHandler.players[npcs[i].oldIndex] == null) {
  3597. return;
  3598. }
  3599. if (npcs[i].isDead)
  3600. return;
  3601. Client c = (Client) Server.playerHandler.players[npcs[i].oldIndex];
  3602. if (multiAttacks(i)) {
  3603. multiAttackDamage(i);
  3604. return;
  3605. }
  3606. if (c.playerIndex <= 0 && c.npcIndex <= 0)
  3607. if (c.autoRet == 1)
  3608. c.npcIndex = i;
  3609. if(c.attackTimer <= 3 || c.attackTimer == 0 && c.npcIndex == 0 && c.oldNpcIndex == 0) {
  3610. c.startAnimation(c.getCombat().getBlockEmote());
  3611. }
  3612. if(c.respawnTimer <= 0) {
  3613. int damage = 0;
  3614. if(npcs[i].attackType == 0) {
  3615. damage = Misc.random(npcs[i].maxHit);
  3616. if (10 + Misc.random(c.getCombat().calculateMeleeDefence()) > Misc.random(Server.npcHandler.npcs[i].attack)) {
  3617. damage = 0;
  3618. }
  3619. if(c.prayerActive[18] || c.curseActive[9]) { // protect from melee
  3620. damage = 0;
  3621. }
  3622. if(c.SolProtect >= 1) { // protect from melee
  3623. damage = (int)damage / 2;
  3624. }
  3625. if (c.playerEquipment[c.playerShield] == 13740) {
  3626. damage = (int)damage * 70 / 100;
  3627. }
  3628. if (c.playerEquipment[c.playerShield] == 13742) {
  3629. if(Misc.random(4) == 3) {
  3630. damage = (int)damage * 65 / 100;
  3631. }
  3632. }
  3633. if (c.playerLevel[3] - damage < 0) {
  3634. damage = c.playerLevel[3];
  3635. }
  3636. }
  3637.  
  3638. if(npcs[i].attackType == 1) { // range
  3639. damage = Misc.random(npcs[i].maxHit);
  3640. if (10 + Misc.random(c.getCombat().calculateRangeDefence()) > Misc.random(Server.npcHandler.npcs[i].attack)) {
  3641. damage = 0;
  3642. }
  3643. if(c.prayerActive[17] || c.curseActive[8]) { // protect from range
  3644. damage = 0;
  3645. }
  3646. if(c.SolProtect >= 1) { // protect from melee
  3647. damage = (int)damage / 2;
  3648. }
  3649. if (c.playerEquipment[c.playerShield] == 13740) {
  3650. damage = (int)damage * 70 / 100;
  3651. }
  3652. if (c.playerEquipment[c.playerShield] == 13742) {
  3653. if(Misc.random(4) == 3) {
  3654. damage = (int)damage * 65 / 100;
  3655. }
  3656. }
  3657. if (c.playerLevel[3] - damage < 0) {
  3658. damage = c.playerLevel[3];
  3659. }
  3660. }
  3661.  
  3662. if(npcs[i].attackType == 2) { // magic
  3663. damage = Misc.random(npcs[i].maxHit);
  3664. boolean magicFailed = false;
  3665. if (10 + Misc.random(c.getCombat().mageDef()) > Misc.random(Server.npcHandler.npcs[i].attack)) {
  3666. damage = 0;
  3667. magicFailed = true;
  3668. }
  3669. if(c.prayerActive[16] || c.curseActive[7]) { // protect from magic
  3670. damage = 0;
  3671. magicFailed = true;
  3672. }
  3673. if(c.SolProtect >= 1) { // protect from melee
  3674. damage = (int)damage / 2;
  3675. }
  3676. if (c.playerEquipment[c.playerShield] == 13740) {
  3677. damage = (int)damage * 70 / 100;
  3678. }
  3679. if (c.playerEquipment[c.playerShield] == 13742) {
  3680. if(Misc.random(4) == 3) {
  3681. damage = (int)damage * 65 / 100;
  3682. }
  3683. }
  3684. if (c.playerLevel[3] - damage < 0) {
  3685. damage = c.playerLevel[3];
  3686. }
  3687. if (damage == 0 && !isRFDNpc2(i)) {
  3688. c.gfx100(85);
  3689. }
  3690. if(npcs[i].endGfx > 0 && (!magicFailed || isFightCaveNpc(i))) {
  3691. c.gfx100(npcs[i].endGfx);
  3692. } else {
  3693. //c.gfx100(85);
  3694. }
  3695. }
  3696.  
  3697. if (npcs[i].attackType == 3) { //fire breath
  3698. int anti = c.getPA().antiFire();
  3699. if (anti == 0) {
  3700. damage = Misc.random(30) + 10;
  3701. c.sendMessage("You are badly burnt by the dragon fire!");
  3702. c.getCombat().addCharge(c);
  3703. } else if (anti == 1)
  3704. damage = Misc.random(12);
  3705.  
  3706. else if (anti == 2)
  3707. damage = Misc.random(6);
  3708.  
  3709. if (c.playerLevel[3] - damage < 0)
  3710. damage = c.playerLevel[3];
  3711. //c.gfx100(npcs[i].endGfx);
  3712. }
  3713. handleSpecialEffects(c, i, damage);
  3714. if (c.vengOn && damage > 0) {
  3715. c.getCombat().appendVengeanceNPC(i, damage);
  3716. }
  3717. c.logoutDelay = System.currentTimeMillis(); // logout delay
  3718. //c.setHitDiff(damage);
  3719. c.handleHitMask(damage);
  3720. c.playerLevel[3] -= damage;
  3721. c.getPA().refreshSkill(3);
  3722. c.updateRequired = true;
  3723. //c.setHitUpdateRequired(true);
  3724. }
  3725. }
  3726. }
  3727.  
  3728. public void handleSpecialEffects(Client c, int i, int damage) {
  3729. if (npcs[i].npcType == 2892 || npcs[i].npcType == 2894) {
  3730. if (damage > 0) {
  3731. if (c != null) {
  3732. if (c.playerLevel[5] > 0) {
  3733. c.playerLevel[5]--;
  3734. c.getPA().refreshSkill(5);
  3735. c.getPA().appendPoison(12);
  3736. }
  3737. }
  3738. }
  3739. }
  3740.  
  3741. }
  3742.  
  3743.  
  3744.  
  3745. public void startAnimation(int animId, int i) {
  3746. npcs[i].animNumber = animId;
  3747. npcs[i].animUpdateRequired = true;
  3748. npcs[i].updateRequired = true;
  3749. }
  3750.  
  3751. public boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
  3752. for (int i = 0; i <= distance; i++) {
  3753. for (int j = 0; j <= distance; j++) {
  3754. if ((objectX + i) == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
  3755. return true;
  3756. } else if ((objectX - i) == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
  3757. return true;
  3758. } else if (objectX == playerX && ((objectY + j) == playerY || (objectY - j) == playerY || objectY == playerY)) {
  3759. return true;
  3760. }
  3761. }
  3762. }
  3763. return false;
  3764. }
  3765.  
  3766.  
  3767. public int getMaxHit(int i) {
  3768. switch (npcs[i].npcType) {
  3769. case 6222:
  3770. if (npcs[i].attackType == 2)
  3771. return 28;
  3772. else
  3773. return 68;
  3774. case 8133:
  3775. if (npcs[i].attackType == 0)
  3776. return 48;
  3777. else
  3778. if (npcs[i].attackType == 1)
  3779. return 48;
  3780. else
  3781. if (npcs[i].attackType == 2)
  3782. return 60;
  3783. case 6203:
  3784. if (npcs[i].attackType == 0)
  3785. return 40;
  3786. else
  3787. return 35;
  3788. case 8349: case 8350: case 8351:
  3789. if (npcs[i].attackType == 0)
  3790. return 20;
  3791. else
  3792. return 27;
  3793. case 6247:
  3794. return 31;
  3795. case 6260:
  3796. return 36;
  3797. }
  3798. return 1;
  3799. }
  3800.  
  3801.  
  3802. public boolean loadAutoSpawn(String FileName) {
  3803. String line = "";
  3804. String token = "";
  3805. String token2 = "";
  3806. String token2_2 = "";
  3807. String[] token3 = new String[10];
  3808. boolean EndOfFile = false;
  3809. int ReadMode = 0;
  3810. BufferedReader characterfile = null;
  3811. try {
  3812. characterfile = new BufferedReader(new FileReader("./"+FileName));
  3813. } catch(FileNotFoundException fileex) {
  3814. Misc.println(FileName+": file not found.");
  3815. return false;
  3816. }
  3817. try {
  3818. line = characterfile.readLine();
  3819. } catch(IOException ioexception) {
  3820. Misc.println(FileName+": error loading file.");
  3821. return false;
  3822. }
  3823. while(EndOfFile == false && line != null) {
  3824. line = line.trim();
  3825. int spot = line.indexOf("=");
  3826. if (spot > -1) {
  3827. token = line.substring(0, spot);
  3828. token = token.trim();
  3829. token2 = line.substring(spot + 1);
  3830. token2 = token2.trim();
  3831. token2_2 = token2.replaceAll("\t\t", "\t");
  3832. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3833. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3834. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3835. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3836. token3 = token2_2.split("\t");
  3837. if (token.equals("spawn")) {
  3838. newNPC(Integer.parseInt(token3[0]), Integer.parseInt(token3[1]), Integer.parseInt(token3[2]), Integer.parseInt(token3[3]), Integer.parseInt(token3[4]), getNpcListHP(Integer.parseInt(token3[0])), Integer.parseInt(token3[5]), Integer.parseInt(token3[6]), Integer.parseInt(token3[7]));
  3839.  
  3840. }
  3841. } else {
  3842. if (line.equals("[ENDOFSPAWNLIST]")) {
  3843. try { characterfile.close(); } catch(IOException ioexception) { }
  3844. return true;
  3845. }
  3846. }
  3847. try {
  3848. line = characterfile.readLine();
  3849. } catch(IOException ioexception1) { EndOfFile = true; }
  3850. }
  3851. try { characterfile.close(); } catch(IOException ioexception) { }
  3852. return false;
  3853. }
  3854.  
  3855. public int getNpcListHP(int npcId) {
  3856. for (int i = 0; i < maxListedNPCs; i++) {
  3857. if (NpcList[i] != null) {
  3858. if (NpcList[i].npcId == npcId) {
  3859. return NpcList[i].npcHealth;
  3860. }
  3861. }
  3862. }
  3863. return 0;
  3864. }
  3865.  
  3866. public String getNpcListName(int npcId) {
  3867. for (int i = 0; i < maxListedNPCs; i++) {
  3868. if (NpcList[i] != null) {
  3869. if (NpcList[i].npcId == npcId) {
  3870. return NpcList[i].npcName;
  3871. }
  3872. }
  3873. }
  3874. return "nothing";
  3875. }
  3876.  
  3877. public boolean loadNPCList(String FileName) {
  3878. String line = "";
  3879. String token = "";
  3880. String token2 = "";
  3881. String token2_2 = "";
  3882. String[] token3 = new String[10];
  3883. boolean EndOfFile = false;
  3884. int ReadMode = 0;
  3885. BufferedReader characterfile = null;
  3886. try {
  3887. characterfile = new BufferedReader(new FileReader("./"+FileName));
  3888. } catch(FileNotFoundException fileex) {
  3889. Misc.println(FileName+": file not found.");
  3890. return false;
  3891. }
  3892. try {
  3893. line = characterfile.readLine();
  3894. } catch(IOException ioexception) {
  3895. Misc.println(FileName+": error loading file.");
  3896. return false;
  3897. }
  3898. while(EndOfFile == false && line != null) {
  3899. line = line.trim();
  3900. int spot = line.indexOf("=");
  3901. if (spot > -1) {
  3902. token = line.substring(0, spot);
  3903. token = token.trim();
  3904. token2 = line.substring(spot + 1);
  3905. token2 = token2.trim();
  3906. token2_2 = token2.replaceAll("\t\t", "\t");
  3907. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3908. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3909. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3910. token2_2 = token2_2.replaceAll("\t\t", "\t");
  3911. token3 = token2_2.split("\t");
  3912. if (token.equals("npc")) {
  3913. newNPCList(Integer.parseInt(token3[0]), token3[1], Integer.parseInt(token3[2]), Integer.parseInt(token3[3]));
  3914. }
  3915. } else {
  3916. if (line.equals("[ENDOFNPCLIST]")) {
  3917. try { characterfile.close(); } catch(IOException ioexception) { }
  3918. return true;
  3919. }
  3920. }
  3921. try {
  3922. line = characterfile.readLine();
  3923. } catch(IOException ioexception1) { EndOfFile = true; }
  3924. }
  3925. try { characterfile.close(); } catch(IOException ioexception) { }
  3926. return false;
  3927. }
  3928.  
  3929.  
  3930. }
Add Comment
Please, Sign In to add comment