Advertisement
Guest User

NPCHandler.java

a guest
Apr 6th, 2014
15
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 59.33 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.  
  8. import server.clip.region.*;
  9.  
  10. import java.util.ArrayList;
  11.  
  12. import server.Config;
  13. import server.Server;
  14. import server.model.players.Client;
  15. import server.model.players.Player;
  16. import server.model.players.PlayerHandler;
  17. import server.util.Misc;
  18.  
  19. public class NPCHandler {
  20. public static int maxNPCs = 10000;
  21. public static int maxListedNPCs = 10000;
  22. public static int maxNPCDrops = 10000;
  23. public static NPC npcs[] = new NPC[maxNPCs];
  24. //public static NPCList NpcList[] = new NPCList[maxListedNPCs];
  25.  
  26. public NPCHandler() {
  27. for (int i = 0; i < maxNPCs; i++) {
  28. npcs[i] = null;
  29. NPCDefinitions.getDefinitions()[i] = null;
  30. }
  31.  
  32. loadNPCList("./Data/CFG/npc.cfg");
  33. loadAutoSpawn("./Data/CFG/spawn-config.cfg");
  34. // System.out.println("NPC Spawns Loaded");
  35. }
  36.  
  37. public void multiAttackGfx(int i, int gfx) {
  38. if (npcs[i].projectileId < 0)
  39. return;
  40. for (int j = 0; j < PlayerHandler.players.length; j++) {
  41. if (PlayerHandler.players[j] != null) {
  42. Client c = (Client)PlayerHandler.players[j];
  43. if (Player.heightLevel != npcs[i].heightLevel)
  44. continue;
  45. if (PlayerHandler.players[j].goodDistance(c.absX, c.absY, npcs[i].absX, npcs[i].absY, 15)) {
  46. int nX = NPCHandler.npcs[i].getX() + offset(i);
  47. int nY = NPCHandler.npcs[i].getY() + offset(i);
  48. int pX = c.getX();
  49. int pY = c.getY();
  50. int offX = (nY - pY)* -1;
  51. int offY = (nX - pX)* -1;
  52. c.getPA().createPlayersProjectile(nX, nY, offX, offY, 50, getProjectileSpeed(i), npcs[i].projectileId, 43, 31, -c.getId() - 1, 65);
  53. }
  54. }
  55. }
  56. }
  57.  
  58. public boolean switchesAttackers(int i) {
  59. switch(npcs[i].npcType) {
  60. case 2551:
  61. case 2552:
  62. case 2553:
  63. case 2559:
  64. case 2560:
  65. case 2561:
  66. case 2563:
  67. case 2564:
  68. case 2565:
  69. case 2892:
  70. case 2894:
  71. return true;
  72.  
  73. }
  74.  
  75. return false;
  76. }
  77.  
  78. public void multiAttackDamage(int i) {
  79. int max = getMaxHit(i);
  80. for (int j = 0; j < PlayerHandler.players.length; j++) {
  81. if (PlayerHandler.players[j] != null) {
  82. Client c = (Client)PlayerHandler.players[j];
  83. if (c.isDead || Player.heightLevel != npcs[i].heightLevel)
  84. continue;
  85. if (PlayerHandler.players[j].goodDistance(c.absX, c.absY, npcs[i].absX, npcs[i].absY, 15)) {
  86. if (npcs[i].attackType == 2) {
  87. if (!c.prayerActive[16]) {
  88. if (Misc.random(500) + 200 > Misc.random(c.getCombat().mageDef())) {
  89. int dam = Misc.random(max);
  90. c.dealDamage(dam);
  91. c.handleHitMask(dam);
  92. } else {
  93. c.dealDamage(0);
  94. c.handleHitMask(0);
  95. }
  96. } else {
  97. c.dealDamage(0);
  98. c.handleHitMask(0);
  99. }
  100. } else if (npcs[i].attackType == 1) {
  101. if (!c.prayerActive[17]) {
  102. int dam = Misc.random(max);
  103. if (Misc.random(500) + 200 > Misc.random(c.getCombat().calculateRangeDefence())) {
  104. c.dealDamage(dam);
  105. c.handleHitMask(dam);
  106. } else {
  107. c.dealDamage(0);
  108. c.handleHitMask(0);
  109. }
  110. } else {
  111. c.dealDamage(0);
  112. c.handleHitMask(0);
  113. }
  114. }
  115. if (npcs[i].endGfx > 0) {
  116. c.gfx0(npcs[i].endGfx);
  117. }
  118. }
  119. c.getPA().refreshSkill(3);
  120. }
  121. }
  122. }
  123.  
  124. public int getClosePlayer(int i) {
  125. for (int j = 0; j < PlayerHandler.players.length; j++) {
  126. if (PlayerHandler.players[j] != null) {
  127. if (j == npcs[i].spawnedBy)
  128. return j;
  129. if (goodDistance(PlayerHandler.players[j].absX, PlayerHandler.players[j].absY, npcs[i].absX, npcs[i].absY, 2 + distanceRequired(i) + followDistance(i)) || isFightCaveNpc(i)) {
  130. if ((PlayerHandler.players[j].underAttackBy <= 0 && PlayerHandler.players[j].underAttackBy2 <= 0) || PlayerHandler.players[j].inMulti())
  131. if (Player.heightLevel == npcs[i].heightLevel)
  132. return j;
  133. }
  134. }
  135. }
  136. return 0;
  137. }
  138.  
  139. public int getCloseRandomPlayer(int i) {
  140. ArrayList<Integer> players = new ArrayList<Integer>();
  141. for (int j = 0; j < PlayerHandler.players.length; j++) {
  142. if (PlayerHandler.players[j] != null) {
  143. if (goodDistance(PlayerHandler.players[j].absX, PlayerHandler.players[j].absY, npcs[i].absX, npcs[i].absY, 2 + distanceRequired(i) + followDistance(i)) || isFightCaveNpc(i)) {
  144. if ((PlayerHandler.players[j].underAttackBy <= 0 && PlayerHandler.players[j].underAttackBy2 <= 0) || PlayerHandler.players[j].inMulti())
  145. if (Player.heightLevel == npcs[i].heightLevel)
  146. players.add(j);
  147. }
  148. }
  149. }
  150. if (players.size() > 0)
  151. return players.get(Misc.random(players.size() -1));
  152. else
  153. return 0;
  154. }
  155.  
  156. public int npcSize(int i) {
  157. switch (npcs[i].npcType) {
  158. case 2883:
  159. case 2882:
  160. case 2881:
  161. return 3;
  162. }
  163. return 0;
  164. }
  165.  
  166. public boolean isAggressive(int i) {
  167. switch (npcs[i].npcType) {
  168. case 2550:
  169. case 2551:
  170. case 2552:
  171. case 2553:
  172. case 2558:
  173. case 2559:
  174. case 2560:
  175. case 2561:
  176. case 2562:
  177. case 2563:
  178. case 2564:
  179. case 2565:
  180. case 2892:
  181. case 2894:
  182. case 2881:
  183. case 2882:
  184. case 2883:
  185. case 2035:
  186. return true;
  187. }
  188. if (npcs[i].inWild() && npcs[i].MaxHP > 0)
  189. return true;
  190. if (isFightCaveNpc(i))
  191. return true;
  192. return false;
  193. }
  194.  
  195. public boolean isFightCaveNpc(int i) {
  196. switch (npcs[i].npcType) {
  197. case 2627:
  198. case 2630:
  199. case 2631:
  200. case 2741:
  201. case 2743:
  202. case 2745:
  203. return true;
  204. }
  205. return false;
  206. }
  207.  
  208. /**
  209. * Summon npc, barrows, etc
  210. **/
  211. public void spawnNpc(final Client c, int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence, boolean attackPlayer, boolean headIcon) {
  212. // first, search for a free slot
  213. int slot = -1;
  214. for (int i = 1; i < maxNPCs; i++) {
  215. if (npcs[i] == null) {
  216. slot = i;
  217. break;
  218. }
  219. }
  220. if(slot == -1) {
  221. //Misc.println("No Free Slot");
  222. return; // no free slot found
  223. }
  224. final NPC newNPC = new NPC(slot, npcType);
  225. newNPC.absX = x;
  226. newNPC.absY = y;
  227. newNPC.makeX = x;
  228. newNPC.makeY = y;
  229. newNPC.heightLevel = heightLevel;
  230. newNPC.walkingType = WalkingType;
  231. newNPC.HP = HP;
  232. newNPC.MaxHP = HP;
  233. newNPC.maxHit = maxHit;
  234. newNPC.attack = attack;
  235. newNPC.defence = defence;
  236. newNPC.spawnedBy = c.getId();
  237. newNPC.dagColor = getDagColor(npcType);
  238. if(headIcon)
  239. c.getPA().drawHeadicon(1, slot, 0, 0);
  240. if(attackPlayer) {
  241. newNPC.underAttack = true;
  242. if(c != null) {
  243. /*if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] != newNPC.npcType) {
  244. if(newNPC.npcType == 2025 || newNPC.npcType == 2026 || newNPC.npcType == 2027 || newNPC.npcType == 2028 || newNPC.npcType == 2029 || newNPC.npcType == 2030) {
  245. newNPC.forceChat("You dare disturb my rest!");
  246. }
  247. }
  248. if(server.model.minigames.Barrows.COFFIN_AND_BROTHERS[c.randomCoffin][1] == newNPC.npcType) {
  249. newNPC.forceChat("You dare steal from us!");
  250. }*/
  251.  
  252. newNPC.killerId = c.playerId;
  253. }
  254. }
  255. npcs[slot] = newNPC;
  256. }
  257.  
  258. public String getDagColor(int npcType) {
  259. int dags[] = {
  260. 1351, 1352, 1356, 1353, 1354, 1355
  261. };
  262. String colors[] = {
  263. "white", "blue", "brown", "red", "orange", "green"
  264. };
  265. for(int i = 0; i < dags.length; i++) {
  266. if(npcType == dags[i]) {
  267. return colors[i];
  268. }
  269. }
  270. return "";
  271. }
  272.  
  273. public void getDtLastKill(int i) {
  274. int dtNpcs[] = {
  275. 1975, 1914, 1977, 1913
  276. };
  277. for(int dtNpc : dtNpcs) {
  278. if(npcs[i].npcType == dtNpc) {
  279. Client p = (Client) PlayerHandler.players[npcs[i].killedBy];
  280. if(p != null) {
  281. p.lastDtKill = dtNpc;
  282. }
  283. }
  284. }
  285. }
  286.  
  287. public void checkDt(int i) {
  288. if(npcs[i] != null) {
  289.  
  290. }
  291. }
  292.  
  293. public void checkHfd(int i) {
  294. int dags[] = {
  295. 1351, 1352, 1356,
  296. 1353, 1354, 1355
  297. };
  298. for(int j = 0; j < dags.length; j++) {
  299. if(npcs[i].npcType == dags[j]) {
  300. Client c = (Client) PlayerHandler.players[npcs[i].killedBy];
  301. if(c != null) {
  302. c.horrorFromDeep = 2;
  303. c.sendMessage("You have completed Horror from the Deep.");
  304. if(c.questPoints == 3) {
  305. //c.getShops().addQuestCape();
  306. }
  307. c.getPA().loadQuests();
  308. }
  309. if(npcs[i] != null) {
  310. npcs[i].absX = 0;
  311. npcs[i].absY = 0;
  312. npcs[i] = null;
  313. break;
  314. }
  315. }
  316. }
  317. }
  318.  
  319. public void checkRfd(int i) {
  320. if(npcs[i] != null) {
  321. int playerId = npcs[i].killedBy;
  322. if(PlayerHandler.players[playerId] != null) {
  323. Client c = (Client) PlayerHandler.players[playerId];
  324. if(c.roundNpc == 2 && !c.spawned) {
  325. spawnNpc(c, 3494, 1899, 5354, Player.heightLevel, 1, 210, 24, 70, 60, true, true);
  326. c.spawned = true;
  327. } else if(c.roundNpc == 3 && !c.spawned) {
  328. spawnNpc(c, 3495, 1899, 5354, Player.heightLevel, 1, 240, 15, 70, 60, true, true);
  329. c.spawned = true;
  330. } else if(c.roundNpc == 4 && !c.spawned) {
  331. spawnNpc(c, 3496, 1899, 5354, Player.heightLevel, 1, 140, 19, 70, 60, true, true);
  332. c.spawned = true;
  333. } else if(c.roundNpc == 5) {
  334. c.getPA().movePlayer(3218, 9621, 0);
  335. c.getDH().sendDialogues(30, 608);
  336. c.roundNpc = 0;
  337. c.questPoints++;
  338. if(c.questPoints == 3) {
  339. //c.getShops().addQuestCape();
  340. }
  341. c.getPA().loadQuests();
  342. }
  343. }
  344. }
  345. }
  346.  
  347.  
  348.  
  349.  
  350. /**
  351. * Emotes
  352. **/
  353.  
  354. public static int getAttackEmote(int i) {
  355. switch(NPCHandler.npcs[i].npcType) {
  356. case 1618:
  357. return 1552;
  358. case 419: //zombie
  359. case 420:
  360. case 421:
  361. case 422:
  362. case 423:
  363. case 424:
  364. return 5568;
  365. case 438:
  366. case 439:
  367. case 440:
  368. case 441:
  369. case 442: // Tree spirit
  370. case 443:
  371. return 94;
  372. case 391:
  373. case 392:
  374. case 393:
  375. case 394:
  376. case 395://river troll
  377. case 396:
  378. return 284;
  379. case 413:
  380. case 414:
  381. case 415:
  382. case 416:
  383. case 417://rock golem
  384. case 418:
  385. return 153;
  386. case 112: //moss
  387. return 4658;
  388. case 103: //ghost
  389. return 5540;
  390. case 78: //bats
  391. return 4915;
  392. case 1612: //banshee
  393. return 1523;
  394. case 2783: //dark beast
  395. return 2731;
  396. case 6248:
  397. return 6376;
  398. case 6250:
  399. return 7018;
  400. case 6261:
  401. case 6263:
  402. case 6265:
  403. return 6154;
  404. case 6204:
  405. case 6206:
  406. case 6208:
  407. return 6945;
  408. case 49:
  409. return 6579;
  410. case 6247:
  411. return 6964;
  412. case 6203:
  413. return 6945;
  414. case 6223:
  415. case 6225:
  416. case 6227:
  417. return 6953;
  418. case 6222:
  419. return 6976;
  420. case 6267:
  421. return 359;
  422. case 6268:
  423. return 2930;
  424. case 6269:
  425. return 4652;
  426. case 6270:
  427. return 4652;
  428. case 6271:
  429. return 4320;
  430. case 6272:
  431. return 4320;
  432. case 6273:
  433. return 4320;
  434. case 6274:
  435. return 4320;
  436. case 1459:
  437. return 1402;
  438. case 6260:
  439. if (npcs[i].attackType == 0)
  440. return 7060;
  441. else
  442. return 7063;
  443. case 86:
  444. case 87:
  445. return 4933;
  446. case 5176://Ogre Shaman
  447. case 5181://Ogre Shaman
  448. case 5184://Ogre Shaman
  449. case 5187://Ogre Shaman
  450. case 5190://Ogre Shaman
  451. case 5193://Ogre Shaman
  452. return 359;
  453.  
  454. case 2892:
  455. case 2894:
  456. return 2868;
  457. case 2627:
  458. return 2621;
  459. case 2630:
  460. return 2625;
  461. case 2631:
  462. return 2633;
  463. case 2741:
  464. return 2637;
  465. case 2746:
  466. return 2637;
  467. case 2607:
  468. return 2611;
  469. case 2743://360
  470. return 2647;
  471. case 5247:
  472. return 5411;
  473. case 13: //wizards
  474. return 711;
  475.  
  476. case 655:
  477. return 5532;
  478.  
  479. case 1624:
  480. return 1557;
  481.  
  482. case 1648:
  483. return 1590;
  484.  
  485.  
  486. case 1615: //abby demon
  487. return 1537;
  488.  
  489. case 1613: //nech
  490. return 1528;
  491.  
  492. case 1610: case 1611: //garg
  493. return 1519;
  494.  
  495. case 1616: //basilisk
  496. return 1546;
  497.  
  498. //case 459: //skele
  499. //return 260;
  500.  
  501. case 50://drags
  502. return 80;
  503. case 53:
  504. case 54:
  505. case 55:
  506. case 941:
  507. case 1590:
  508. case 1591:
  509. case 1592:
  510. return 80;
  511. case 124: //earth warrior
  512. return 390;
  513.  
  514. case 803: //monk
  515. return 422;
  516.  
  517. case 52: //baby drag
  518. return 25;
  519.  
  520. case 58: //Shadow Spider
  521. case 59: //Giant Spider
  522. case 60: //Giant Spider
  523. case 61: //Spider
  524. case 62: //Jungle Spider
  525. case 63: //Deadly Red Spider
  526. case 64: //Ice Spider
  527. case 134:
  528. return 143;
  529.  
  530. case 105: //Bear
  531. case 106://Bear
  532. return 41;
  533.  
  534. case 412:
  535. //case 78:
  536. return 30;
  537.  
  538. case 2033: //rat
  539. return 138;
  540.  
  541. case 2031: // bloodworm
  542. return 2070;
  543.  
  544. case 1769:
  545. case 1770:
  546. case 1771:
  547. case 1772:
  548. case 1773:
  549. case 101: // goblin
  550. return 6184;
  551.  
  552. case 1767:
  553. case 397:
  554. case 1766:
  555. case 1768:
  556. case 81: // cow
  557. return 5849;
  558.  
  559. case 21: // hero
  560. return 451;
  561.  
  562. case 41: // chicken
  563. return 55;
  564.  
  565. case 9: // guard
  566. case 32: // guard
  567. case 20: // paladin
  568. return 451;
  569.  
  570. case 1338: // dagannoth
  571. case 1340:
  572. case 1342:
  573.  
  574. return 1341;
  575.  
  576. case 19: // white knight
  577. return 406;
  578.  
  579. case 110:
  580. case 111: // ice giant
  581. case 117:
  582. return 4651;
  583.  
  584. case 2452:
  585. return 1312;
  586.  
  587. case 2889:
  588. return 2859;
  589.  
  590. case 118:
  591. case 119:
  592. return 99;
  593.  
  594. case 82://Lesser Demon
  595. case 83://Greater Demon
  596. case 84://Black Demon
  597. case 1472://jungle demon
  598. return 64;
  599.  
  600. case 1267:
  601. case 1265:
  602. return 1312;
  603.  
  604. case 125: // ice warrior
  605. case 178:
  606. return 451;
  607.  
  608. case 1153: //Kalphite Worker
  609. case 1154: //Kalphite Soldier
  610. case 1155: //Kalphite guardian
  611. case 1156: //Kalphite worker
  612. case 1157: //Kalphite guardian
  613. return 1184;
  614.  
  615. case 123:
  616. case 122:
  617. return 164;
  618.  
  619. case 2028: // karil
  620. return 2075;
  621.  
  622. case 2025: // ahrim
  623. return 729;
  624.  
  625. case 2026: // dharok
  626. return 2067;
  627.  
  628. case 2027: // guthan
  629. return 2080;
  630.  
  631. case 2029: // torag
  632. return 0x814;
  633.  
  634. case 2030: // verac
  635. return 2062;
  636.  
  637. case 2881: //supreme
  638. return 2855;
  639.  
  640. case 2882: //prime
  641. return 2854;
  642.  
  643. case 2883: //rex
  644. return 2851;
  645. case 5666:
  646. int test = Misc.random(2);
  647. if(test == 2) {
  648. return 5895;
  649. } else if(test == 1) {
  650. return 5894;
  651. } else {
  652. return 5896;
  653. }
  654.  
  655. case 3200:
  656. return 3146;
  657.  
  658. case 2745:
  659. if (npcs[i].attackType == 2)
  660. return 2656;
  661. else if (npcs[i].attackType == 1)
  662. return 2652;
  663. else if (npcs[i].attackType == 0)
  664. return 2655;
  665.  
  666.  
  667. default:
  668. return 0x326;
  669. }
  670. }
  671.  
  672.  
  673.  
  674.  
  675. public int getDeadEmote(int i) {
  676. switch(npcs[i].npcType) {
  677. case 5176://Ogre Shaman
  678. case 5181://Ogre Shaman
  679. case 5184://Ogre Shaman
  680. case 5187://Ogre Shaman
  681. case 5190://Ogre Shaman
  682. case 5193://Ogre Shaman
  683. return 361;
  684. case 438:
  685. case 439:
  686. case 440:
  687. case 441:
  688. case 442: // Tree spirit
  689. case 443:
  690. return 97;
  691. case 391:
  692. case 392:
  693. case 393:
  694. case 394:
  695. case 395://river troll
  696. case 396:
  697. return 287;
  698. case 413:
  699. case 414:
  700. case 415:
  701. case 416:
  702. case 417://rock golem
  703. case 418:
  704. return 156;
  705. case 419://zombie
  706. case 420:
  707. case 421:
  708. case 422:
  709. case 423:
  710. case 424:
  711. return 5569;
  712. // begin new updates
  713. case 112: //moss
  714. return 4659;
  715. case 103: //ghost
  716. return 5542;
  717. case 78: //bats
  718. return 4917;
  719. //end
  720. case 6223:
  721. case 6225:
  722. case 6227:
  723. return 6956;
  724. case 6248:
  725. return 6377;
  726. case 6250:
  727. return 7016;
  728. case 6261:
  729. case 6263:
  730. case 6265:
  731. return 6156;
  732. case 6204:
  733. case 6206:
  734. case 6208:
  735. return 6946;
  736. case 6142:
  737. return 1;
  738. case 6143:
  739. return 1;
  740. case 6144:
  741. return 1;
  742. case 6145:
  743. return 1;
  744. case 1265://RockCrab
  745. return 1314;
  746. case 914://Battle Mage
  747. return 196;
  748. case 3742://Ravager
  749. case 3743:
  750. case 3744:
  751. case 3745:
  752. case 3746:
  753. return 3916;
  754. case 3772://Brawler
  755. case 3773:
  756. case 3774:
  757. case 3775:
  758. case 3776:
  759. return 3894;
  760. case 49:
  761. return 6576;
  762. case 6247:
  763. return 6965;
  764. case 6203:
  765. return 6945;
  766. case 6260:
  767. return 7062;
  768. case 6222:
  769. return 6975;
  770. case 6267:
  771. return 357;
  772. case 6268:
  773. return 2938;
  774. case 6269:
  775. return 4653;
  776. case 6270:
  777. return 4653;
  778. case 6271:
  779. return 4321;
  780. case 6272:
  781. return 4321;
  782. case 6273:
  783. return 4321;
  784. case 6274:
  785. return 4321;
  786. case 117:
  787. return 4651;
  788. case 1459:
  789. return 1404;
  790. case 1612: //banshee
  791. return 1524;
  792. case 2559:
  793. case 2560:
  794. case 2561:
  795. return 6956;
  796. case 2607:
  797. return 2607;
  798. case 2627:
  799. return 2620;
  800. case 2630:
  801. return 2627;
  802. case 2631:
  803. return 2630;
  804. case 2738:
  805. return 2627;
  806. case 2741:
  807. return 2638;
  808. case 2746:
  809. return 2638;
  810. case 2743:
  811. return 2646;
  812. case 2745:
  813. return 2654;
  814. case 3777:
  815. case 3778:
  816. case 3779:
  817. case 3780:
  818. return -1;
  819. case 5666:
  820. return 5898;
  821. case 3200:
  822. return 3147;
  823. case 2035: //spider
  824. return 146;
  825. case 2033: //rat
  826. return 141;
  827. case 2031: // bloodvel
  828. return 2073;
  829. case 1769:
  830. case 1770:
  831. case 1771:
  832. case 1772:
  833. case 1773:
  834. case 101: //goblin
  835. return 6182;
  836. case 1767:
  837. case 397:
  838. case 1766:
  839. case 1768:
  840. case 81: // cow
  841. return 5851;
  842. case 41: // chicken
  843. return 57;
  844. case 1338: // dagannoth
  845. case 1340:
  846. case 1342:
  847. return 1342;
  848. case 2881:
  849. case 2882:
  850. case 2883:
  851. return 2856;
  852. case 111: // ice giant
  853. return 131;
  854. case 125: // ice warrior
  855. return 843;
  856. case 751://Zombies!!
  857. return 302;
  858. case 1626:
  859. case 1627:
  860. case 1628:
  861. case 1629:
  862. case 1630:
  863. case 1631:
  864. case 1632: //turoth!
  865. return 1597;
  866. case 1616: //basilisk
  867. return 1548;
  868. case 1653: //hand
  869. return 1590;
  870. case 82://demons
  871. case 83:
  872. case 84:
  873. return 67;
  874. case 1605://abby spec
  875. return 1508;
  876. case 51://baby drags
  877. case 52:
  878. case 1589:
  879. case 3376:
  880. return 28;
  881. case 1610:
  882. case 1611:
  883. return 1518;
  884. case 1618:
  885. case 1619:
  886. return 1553;
  887. case 1620:
  888. case 1621:
  889. return 1563;
  890. case 2783:
  891. return 2732;
  892. case 1615:
  893. return 1538;
  894. case 1624:
  895. return 1558;
  896. case 1613:
  897. return 1530;
  898. case 1633:
  899. case 1634:
  900. case 1635:
  901. case 1636:
  902. return 1580;
  903. case 1648:
  904. case 1649:
  905. case 1650:
  906. case 1651:
  907. case 1652:
  908. case 1654:
  909. case 1655:
  910. case 1656:
  911. case 1657:
  912. return 1590;
  913. case 100:
  914. case 102:
  915. return 313;
  916. case 105:
  917. case 106:
  918. return 44;
  919. case 412:
  920. //case 78:
  921. return 36;
  922. case 122:
  923. case 123:
  924. return 167;
  925. case 58:
  926. case 59:
  927. case 60:
  928. case 61:
  929. case 62:
  930. case 63:
  931. case 64:
  932. case 134:
  933. return 146;
  934. case 1153:
  935. case 1154:
  936. case 1155:
  937. case 1156:
  938. case 1157:
  939. return 1190;
  940. //case 103:
  941. case 104:
  942. return 5534;
  943. case 118:
  944. case 119:
  945. return 102;
  946. case 50://drags
  947. return 92;
  948. case 53:
  949. case 54:
  950. case 55:
  951. case 941:
  952. case 1590:
  953. case 1591:
  954. case 1592:
  955. return 92;
  956. default:
  957. return 2304;
  958. }
  959. }
  960.  
  961. /**
  962. * Attack delays
  963. **/
  964. public int getNpcDelay(int i) {
  965. switch(npcs[i].npcType) {
  966. case 2025:
  967. case 2028:
  968. return 7;
  969.  
  970. case 2745:
  971. return 8;
  972.  
  973. case 2558:
  974. case 2559:
  975. case 2560:
  976. case 2561:
  977. case 6260:
  978. return 6;
  979. //saradomin gw boss
  980. case 2562:
  981. return 2;
  982.  
  983. default:
  984. return 5;
  985. }
  986. }
  987.  
  988. /**
  989. * Hit delays
  990. **/
  991. public int getHitDelay(int i) {
  992. switch(npcs[i].npcType) {
  993. case 2881:
  994. case 2882:
  995. case 3200:
  996. case 2892:
  997. case 2894:
  998. return 3;
  999.  
  1000. case 2743:
  1001. case 2631:
  1002. case 2558:
  1003. case 2559:
  1004. case 2560:
  1005. return 3;
  1006.  
  1007. case 2745:
  1008. if (npcs[i].attackType == 1 || npcs[i].attackType == 2)
  1009. return 5;
  1010. else
  1011. return 2;
  1012.  
  1013. case 2025:
  1014. return 4;
  1015. case 2028:
  1016. return 3;
  1017.  
  1018. default:
  1019. return 2;
  1020. }
  1021. }
  1022.  
  1023. /**
  1024. * Npc respawn time
  1025. **/
  1026. public int getRespawnTime(int i) {
  1027. switch(npcs[i].npcType) {
  1028. case 2881:
  1029. case 2882:
  1030. case 2883:
  1031. case 2558:
  1032. case 2559:
  1033. case 2560:
  1034. case 2561:
  1035. case 2562:
  1036. case 2563:
  1037. case 2564:
  1038. case 6260:
  1039. case 6222:
  1040. case 6203:
  1041. case 6247:
  1042. return 60;
  1043. case 3777:
  1044. case 3778:
  1045. case 3779:
  1046. case 3780:
  1047. return 500;
  1048. default:
  1049. return 25;
  1050. }
  1051. }
  1052.  
  1053.  
  1054.  
  1055.  
  1056. public void newNPC(int npcType, int x, int y, int heightLevel, int WalkingType, int HP, int maxHit, int attack, int defence) {
  1057. // first, search for a free slot
  1058. int slot = -1;
  1059. for (int i = 1; i < maxNPCs; i++) {
  1060. if (npcs[i] == null) {
  1061. slot = i;
  1062. break;
  1063. }
  1064. }
  1065.  
  1066. if(slot == -1) return; // no free slot found
  1067.  
  1068. NPC newNPC = new NPC(slot, npcType);
  1069. newNPC.absX = x;
  1070. newNPC.absY = y;
  1071. newNPC.makeX = x;
  1072. newNPC.makeY = y;
  1073. newNPC.heightLevel = heightLevel;
  1074. newNPC.walkingType = WalkingType;
  1075. newNPC.HP = HP;
  1076. newNPC.MaxHP = HP;
  1077. newNPC.maxHit = maxHit;
  1078. newNPC.attack = attack;
  1079. newNPC.defence = defence;
  1080. npcs[slot] = newNPC;
  1081. }
  1082.  
  1083. public void newNPCList(int npcType, String npcName, int combat, int HP) {
  1084.  
  1085. NPCDefinitions newNPCList = new NPCDefinitions(npcType);
  1086. newNPCList.setNpcName(npcName);
  1087. newNPCList.setNpcCombat(combat);
  1088. newNPCList.setNpcHealth(HP);
  1089. NPCDefinitions.getDefinitions()[npcType] = newNPCList;
  1090. }
  1091.  
  1092. public void handleClipping(int i) {
  1093. NPC npc = npcs[i];
  1094. if(npc.moveX == 1 && npc.moveY == 1) {
  1095. if((Region.getClipping(npc.absX + 1, npc.absY + 1, npc.heightLevel) & 0x12801e0) != 0) {
  1096. npc.moveX = 0; npc.moveY = 0;
  1097. if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) == 0)
  1098. npc.moveY = 1;
  1099. else
  1100. npc.moveX = 1;
  1101. }
  1102. } else if(npc.moveX == -1 && npc.moveY == -1) {
  1103. if((Region.getClipping(npc.absX - 1, npc.absY - 1, npc.heightLevel) & 0x128010e) != 0) {
  1104. npc.moveX = 0; npc.moveY = 0;
  1105. if((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) == 0)
  1106. npc.moveY = -1;
  1107. else
  1108. npc.moveX = -1;
  1109. }
  1110. } else if(npc.moveX == 1 && npc.moveY == -1) {
  1111. if((Region.getClipping(npc.absX + 1, npc.absY - 1, npc.heightLevel) & 0x1280183) != 0) {
  1112. npc.moveX = 0; npc.moveY = 0;
  1113. if((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) == 0)
  1114. npc.moveY = -1;
  1115. else
  1116. npc.moveX = 1;
  1117. }
  1118. } else if(npc.moveX == -1 && npc.moveY == 1) {
  1119. if((Region.getClipping(npc.absX - 1, npc.absY + 1, npc.heightLevel) & 0x128013) != 0) {
  1120. npc.moveX = 0; npc.moveY = 0;
  1121. if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) == 0)
  1122. npc.moveY = 1;
  1123. else
  1124. npc.moveX = -1;
  1125. }
  1126. } //Checking Diagonal movement.
  1127.  
  1128. if (npc.moveY == -1 ) {
  1129. if ((Region.getClipping(npc.absX, npc.absY - 1, npc.heightLevel) & 0x1280102) != 0)
  1130. npc.moveY = 0;
  1131. } else if( npc.moveY == 1) {
  1132. if((Region.getClipping(npc.absX, npc.absY + 1, npc.heightLevel) & 0x1280120) != 0)
  1133. npc.moveY = 0;
  1134. } //Checking Y movement.
  1135. if(npc.moveX == 1) {
  1136. if((Region.getClipping(npc.absX + 1, npc.absY, npc.heightLevel) & 0x1280180) != 0)
  1137. npc.moveX = 0;
  1138. } else if(npc.moveX == -1) {
  1139. if((Region.getClipping(npc.absX - 1, npc.absY, npc.heightLevel) & 0x1280108) != 0)
  1140. npc.moveX = 0;
  1141. } //Checking X movement.
  1142. }
  1143.  
  1144. public void process() {
  1145. for (int i = 0; i < maxNPCs; i++) {
  1146. if (npcs[i] == null) continue;
  1147. npcs[i].clearUpdateFlags();
  1148.  
  1149. }
  1150.  
  1151. for (int i = 0; i < maxNPCs; i++) {
  1152. if (npcs[i] != null) {
  1153. if (npcs[i].actionTimer > 0) {
  1154. npcs[i].actionTimer--;
  1155. }
  1156.  
  1157.  
  1158. //if(npcs[i].npcType == 945) {
  1159. // npcs[i].forcedText = "I'm noob";
  1160. //npcs[i].forcedChatRequired = true;
  1161. // npcs[i].updateRequired = true;
  1162. //}
  1163.  
  1164. if (npcs[i].freezeTimer > 0) {
  1165. npcs[i].freezeTimer--;
  1166. }
  1167.  
  1168. if (npcs[i].hitDelayTimer > 0) {
  1169. npcs[i].hitDelayTimer--;
  1170. }
  1171.  
  1172. if (npcs[i].hitDelayTimer == 1) {
  1173. npcs[i].hitDelayTimer = 0;
  1174. applyDamage(i);
  1175. }
  1176.  
  1177. if(npcs[i].attackTimer > 0) {
  1178. npcs[i].attackTimer--;
  1179. }
  1180.  
  1181. if(npcs[i].spawnedBy > 0) { // delete summons npc
  1182. if(PlayerHandler.players[npcs[i].spawnedBy] == null
  1183. || Player.heightLevel != npcs[i].heightLevel
  1184. || PlayerHandler.players[npcs[i].spawnedBy].respawnTimer > 0
  1185. || !PlayerHandler.players[npcs[i].spawnedBy].goodDistance(npcs[i].getX(), npcs[i].getY(), PlayerHandler.players[npcs[i].spawnedBy].getX(), PlayerHandler.players[npcs[i].spawnedBy].getY(), 20)) {
  1186.  
  1187. if(PlayerHandler.players[npcs[i].spawnedBy] != null) {
  1188. for(int o = 0; o < PlayerHandler.players[npcs[i].spawnedBy].barrowsNpcs.length; o++){
  1189. if(npcs[i].npcType == PlayerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][0]) {
  1190. if (PlayerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] == 1)
  1191. PlayerHandler.players[npcs[i].spawnedBy].barrowsNpcs[o][1] = 0;
  1192. }
  1193. }
  1194. }
  1195. npcs[i] = null;
  1196. }
  1197. }
  1198. if (npcs[i] == null) continue;
  1199. if (npcs[i].lastX != npcs[i].getX()
  1200. || npcs[i].lastY != npcs[i].getY()) {
  1201. npcs[i].lastX = npcs[i].getX();
  1202. npcs[i].lastY = npcs[i].getY();
  1203. }
  1204.  
  1205. /**
  1206. * Attacking player
  1207. **/
  1208. if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && !switchesAttackers(i)) {
  1209. npcs[i].killerId = getCloseRandomPlayer(i);
  1210. } else if (isAggressive(i) && !npcs[i].underAttack && !npcs[i].isDead && switchesAttackers(i)) {
  1211. npcs[i].killerId = getCloseRandomPlayer(i);
  1212. }
  1213.  
  1214. if (System.currentTimeMillis() - npcs[i].lastDamageTaken > 5000)
  1215. npcs[i].underAttackBy = 0;
  1216.  
  1217. if((npcs[i].killerId > 0 || npcs[i].underAttack) && !npcs[i].walkingHome && retaliates(npcs[i].npcType)) {
  1218. if(!npcs[i].isDead) {
  1219. int p = npcs[i].killerId;
  1220. if(PlayerHandler.players[p] != null) {
  1221. Client c = (Client) PlayerHandler.players[p];
  1222. followPlayer(i, c.playerId);
  1223. if (npcs[i] == null) continue;
  1224. if(npcs[i].attackTimer == 0) {
  1225. attackPlayer(c, i);
  1226. }
  1227. } else {
  1228. npcs[i].killerId = 0;
  1229. npcs[i].underAttack = false;
  1230. npcs[i].facePlayer(0);
  1231. }
  1232. }
  1233. }
  1234.  
  1235.  
  1236.  
  1237. /**
  1238. * Random walking and walking home
  1239. **/
  1240. if (npcs[i] == null) continue;
  1241. if((!npcs[i].underAttack || npcs[i].walkingHome) && npcs[i].randomWalk && !npcs[i].isDead) {
  1242. npcs[i].facePlayer(0);
  1243. npcs[i].killerId = 0;
  1244. if(npcs[i].spawnedBy == 0) {
  1245. 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)) {
  1246. npcs[i].walkingHome = true;
  1247. }
  1248. }
  1249.  
  1250. if (npcs[i].walkingHome && npcs[i].absX == npcs[i].makeX && npcs[i].absY == npcs[i].makeY) {
  1251. npcs[i].walkingHome = false;
  1252. } else if(npcs[i].walkingHome) {
  1253. npcs[i].moveX = GetMove(npcs[i].absX, npcs[i].makeX);
  1254. npcs[i].moveY = GetMove(npcs[i].absY, npcs[i].makeY);
  1255. handleClipping(i);
  1256. npcs[i].getNextNPCMovement(i);
  1257. npcs[i].updateRequired = true;
  1258. }
  1259. if(npcs[i].walkingType == 1) {
  1260. if(Misc.random(3)== 1 && !npcs[i].walkingHome) {
  1261. int MoveX = 0;
  1262. int MoveY = 0;
  1263. int Rnd = Misc.random(9);
  1264. if (Rnd == 1) {
  1265. MoveX = 1;
  1266. MoveY = 1;
  1267. } else if (Rnd == 2) {
  1268. MoveX = -1;
  1269. } else if (Rnd == 3) {
  1270. MoveY = -1;
  1271. } else if (Rnd == 4) {
  1272. MoveX = 1;
  1273. } else if (Rnd == 5) {
  1274. MoveY = 1;
  1275. } else if (Rnd == 6) {
  1276. MoveX = -1;
  1277. MoveY = -1;
  1278. } else if (Rnd == 7) {
  1279. MoveX = -1;
  1280. MoveY = 1;
  1281. } else if (Rnd == 8) {
  1282. MoveX = 1;
  1283. MoveY = -1;
  1284. }
  1285.  
  1286. if (MoveX == 1) {
  1287. if (npcs[i].absX + MoveX < npcs[i].makeX + 1) {
  1288. npcs[i].moveX = MoveX;
  1289. } else {
  1290. npcs[i].moveX = 0;
  1291. }
  1292. }
  1293.  
  1294. if (MoveX == -1) {
  1295. if (npcs[i].absX - MoveX > npcs[i].makeX - 1) {
  1296. npcs[i].moveX = MoveX;
  1297. } else {
  1298. npcs[i].moveX = 0;
  1299. }
  1300. }
  1301.  
  1302. if(MoveY == 1) {
  1303. if(npcs[i].absY + MoveY < npcs[i].makeY + 1) {
  1304. npcs[i].moveY = MoveY;
  1305. } else {
  1306. npcs[i].moveY = 0;
  1307. }
  1308. }
  1309.  
  1310. if(MoveY == -1) {
  1311. if(npcs[i].absY - MoveY > npcs[i].makeY - 1) {
  1312. npcs[i].moveY = MoveY;
  1313. } else {
  1314. npcs[i].moveY = 0;
  1315. }
  1316. }
  1317.  
  1318.  
  1319. int x = (npcs[i].absX + npcs[i].moveX);
  1320. int y = (npcs[i].absY + npcs[i].moveY);
  1321.  
  1322. //if (npcs[i].heightLevel, npcs[i].absX, npcs[i].absY, x, y, 0))
  1323. handleClipping(i);
  1324. npcs[i].getNextNPCMovement(i);
  1325. //else
  1326. //{
  1327. //npcs[i].moveX = 0;
  1328. //npcs[i].moveY = 0;
  1329. //}
  1330. npcs[i].updateRequired = true;
  1331. }
  1332. }
  1333. }
  1334.  
  1335.  
  1336. if (npcs[i].isDead == true) {
  1337. if (npcs[i].actionTimer == 0 && npcs[i].applyDead == false && npcs[i].needRespawn == false) {
  1338. npcs[i].updateRequired = true;
  1339. npcs[i].facePlayer(0);
  1340. npcs[i].killedBy = getNpcKillerId(i);
  1341. npcs[i].animNumber = getDeadEmote(i); // dead emote
  1342. npcs[i].animUpdateRequired = true;
  1343. npcs[i].freezeTimer = 0;
  1344. npcs[i].applyDead = true;
  1345. killedBarrow(i);
  1346. npcs[i].actionTimer = 4; // delete time
  1347. resetPlayersInCombat(i);
  1348. npcs[i].dagColor = "";
  1349. getDtLastKill(i);
  1350. } else if (npcs[i].actionTimer == 0 && npcs[i].applyDead == true && npcs[i].needRespawn == false) {
  1351. npcs[i].needRespawn = true;
  1352. npcs[i].actionTimer = getRespawnTime(i); // respawn time
  1353. dropItems(i); // npc drops items!
  1354. appendSlayerExperience(i);
  1355. appendKillCount(i);
  1356. //appendJailKc(i);
  1357. npcs[i].absX = npcs[i].makeX;
  1358. npcs[i].absY = npcs[i].makeY;
  1359. npcs[i].HP = npcs[i].MaxHP;
  1360. npcs[i].animNumber = 0x328;
  1361. npcs[i].updateRequired = true;
  1362. npcs[i].animUpdateRequired = true;
  1363. /*if (npcs[i].npcType == 2745) {
  1364. handleJadDeath(i);
  1365. }*/
  1366. } else if (npcs[i].actionTimer == 0 && npcs[i].needRespawn == true) {
  1367. Client player = (Client) PlayerHandler.players[npcs[i].spawnedBy];
  1368. if(player != null) {
  1369. checkDt(i);
  1370. checkHfd(i);
  1371. checkRfd(i);
  1372. npcs[i] = null;
  1373. } else {
  1374. int old1 = npcs[i].npcType;
  1375. int old2 = npcs[i].makeX;
  1376. int old3 = npcs[i].makeY;
  1377. int old4 = npcs[i].heightLevel;
  1378. int old5 = npcs[i].walkingType;
  1379. int old6 = npcs[i].MaxHP;
  1380. int old7 = npcs[i].maxHit;
  1381. int old8 = npcs[i].attack;
  1382. int old9 = npcs[i].defence;
  1383.  
  1384. npcs[i] = null;
  1385. newNPC(old1, old2, old3, old4, old5, old6, old7, old8, old9);
  1386. }
  1387. }
  1388. }
  1389. }
  1390. }
  1391. }
  1392.  
  1393. public boolean getsPulled(int i) {
  1394. switch (npcs[i].npcType) {
  1395. case 6260:
  1396. if (npcs[i].firstAttacker > 0)
  1397. return false;
  1398. break;
  1399. }
  1400. return true;
  1401. }
  1402.  
  1403. public boolean multiAttacks(int i) {
  1404. switch (npcs[i].npcType) {
  1405. case 2558:
  1406. return true;
  1407. case 2562:
  1408. if (npcs[i].attackType == 2)
  1409. return true;
  1410. case 6260:
  1411. if (npcs[i].attackType == 1)
  1412. return true;
  1413. default:
  1414. return false;
  1415. }
  1416.  
  1417.  
  1418. }
  1419.  
  1420. /**
  1421. * Npc killer id?
  1422. **/
  1423.  
  1424. public int getNpcKillerId(int npcId) {
  1425. int oldDamage = 0;
  1426. int count = 0;
  1427. int killerId = 0;
  1428. for (int p = 1; p < Config.MAX_PLAYERS; p++) {
  1429. if (PlayerHandler.players[p] != null) {
  1430. if(PlayerHandler.players[p].lastNpcAttacked == npcId) {
  1431. if(PlayerHandler.players[p].totalDamageDealt > oldDamage) {
  1432. oldDamage = PlayerHandler.players[p].totalDamageDealt;
  1433. killerId = p;
  1434. }
  1435. PlayerHandler.players[p].totalDamageDealt = 0;
  1436. }
  1437. }
  1438. }
  1439. return killerId;
  1440. }
  1441.  
  1442. /**
  1443. *
  1444. */
  1445. private void killedBarrow(int i) {
  1446. Client c = (Client)PlayerHandler.players[npcs[i].killedBy];
  1447. if(c != null) {
  1448. for(int o = 0; o < c.barrowsNpcs.length; o++){
  1449. if(npcs[i].npcType == c.barrowsNpcs[o][0]) {
  1450. c.barrowsNpcs[o][1] = 2; // 2 for dead
  1451. c.barrowsKillCount++;
  1452. }
  1453. }
  1454. }
  1455. }
  1456.  
  1457. private void killedTzhaar(int i) {
  1458. final Client c2 = (Client)PlayerHandler.players[npcs[i].spawnedBy];
  1459. c2.tzhaarKilled++;
  1460. if (c2.tzhaarKilled == c2.tzhaarToKill) {
  1461. c2.sendMessage("STARTING EVENT");
  1462. c2.waveId++;
  1463.  
  1464. if (c2 != null) {
  1465. Server.fightCaves.spawnNextWave(c2);
  1466. }
  1467.  
  1468. }
  1469. }
  1470.  
  1471. public void handleJadDeath(int i) {
  1472. Client c = (Client)PlayerHandler.players[npcs[i].spawnedBy];
  1473. c.getItems().addItem(6570,1);
  1474. c.sendMessage("Congratulations on completing the fight caves minigame!");
  1475. c.getPA().resetTzhaar();
  1476. c.waveId = 300;
  1477. }
  1478.  
  1479.  
  1480. /**
  1481. * Dropping Items!
  1482. **/
  1483.  
  1484.  
  1485. public void dropItems(int i) {
  1486. int npc = 0;
  1487. boolean dropped = false;
  1488. Client c = (Client)PlayerHandler.players[npcs[i].killedBy];
  1489. if(c != null) {
  1490. /*for(int o = 0; o < c.barrowsNpcs.length; o++){
  1491. if(npcs[i].npcType == c.barrowsNpcs[o][0]) {
  1492. c.barrowsNpcs[o][1] = 2; // 2 for dead
  1493. //c.barrowsKillCount++;
  1494. }
  1495. }*/
  1496. if (npcs[i].npcType == 912 || npcs[i].npcType == 913 || npcs[i].npcType == 914)
  1497. c.magePoints += 1;
  1498. for(npc = 0; npc < Config.NPC_DROPS.length; npc++){
  1499. if(npcs[i].npcType == Config.NPC_DROPS[npc][0]) {
  1500. if(Misc.random(Config.NPC_DROPS[npc][3]) == 0) {
  1501. if(Misc.random(Config.NPC_DROPS[npc][3]) != 0 && dropped == false) {
  1502. Server.itemHandler.createGroundItem(c, Config.NPC_DROPS[npc][1], npcs[i].absX, npcs[i].absY, Config.NPC_DROPS[npc][2], c.playerId);
  1503. dropped = true;
  1504. return;
  1505. }
  1506. if (c.clanId >= 0)
  1507. Server.clanChat.handleLootShare(c, Config.NPC_DROPS[npc][1], Config.NPC_DROPS[npc][2]);
  1508. Server.itemHandler.createGroundItem(c, Config.NPC_DROPS[npc][1], npcs[i].absX, npcs[i].absY, Config.NPC_DROPS[npc][2], c.playerId);
  1509. }
  1510. }
  1511. }
  1512. }
  1513. }
  1514.  
  1515. public void appendKillCount(int i) {
  1516. Client c = (Client)PlayerHandler.players[npcs[i].killedBy];
  1517. if(c != null) {
  1518. int[] kcMonsters = {122,49,2558,2559,2560,2561,2550,2551,2552,2553,2562,2563,2564,2565};
  1519. for (int j : kcMonsters) {
  1520. if (npcs[i].npcType == j) {
  1521. if (c.killCount < 20) {
  1522. //c.killCount++;
  1523. //c.sendMessage("Killcount: " + c.killCount);
  1524. } else {
  1525. //c.sendMessage("You already have 20 kill count");
  1526. }
  1527. break;
  1528. }
  1529. }
  1530. }
  1531. }
  1532.  
  1533.  
  1534.  
  1535.  
  1536.  
  1537. //id of bones dropped by npcs
  1538. public int boneDrop(int type) {
  1539. switch (type) {
  1540. case 1://normal bones
  1541. case 9:
  1542. case 100:
  1543. case 12:
  1544. case 17:
  1545. case 803:
  1546. case 18:
  1547. case 81:
  1548. case 101:
  1549. case 41:
  1550. case 19:
  1551. case 90:
  1552. case 75:
  1553. case 86:
  1554. case 78:
  1555. case 912:
  1556. case 913:
  1557. case 914:
  1558. case 1648:
  1559. case 1643:
  1560. case 1618:
  1561. case 1624:
  1562. case 181:
  1563. case 119:
  1564. case 49:
  1565. case 26:
  1566. case 1341:
  1567. return 526;
  1568. case 117:
  1569. return 532;//big bones
  1570. case 50://drags
  1571. case 53:
  1572. case 54:
  1573. case 55:
  1574. case 941:
  1575. case 1590:
  1576. case 1591:
  1577. case 1592:
  1578. return 536;
  1579. case 84:
  1580. case 1615:
  1581. case 1613:
  1582. case 82:
  1583. case 3200:
  1584. return 592;
  1585. case 2881:
  1586. case 2882:
  1587. case 2883:
  1588. return 6729;
  1589. default:
  1590. return -1;
  1591. }
  1592. }
  1593.  
  1594. public int getStackedDropAmount(int itemId, int npcId) {
  1595. switch (itemId) {
  1596. case 995:
  1597. switch (npcId) {
  1598. case 1:
  1599. return 50+ Misc.random(50);
  1600. case 9:
  1601. return 133 + Misc.random(100);
  1602. case 1624:
  1603. return 1000 + Misc.random(300);
  1604. case 1618:
  1605. return 1000 + Misc.random(300);
  1606. case 1643:
  1607. return 1000 + Misc.random(300);
  1608. case 1610:
  1609. return 1000 + Misc.random(1000);
  1610. case 1613:
  1611. return 1500 + Misc.random(1250);
  1612. case 1615:
  1613. return 3000;
  1614. case 18:
  1615. return 500;
  1616. case 101:
  1617. return 60;
  1618. case 913:
  1619. case 912:
  1620. case 914:
  1621. return 750 + Misc.random(500);
  1622. case 1612:
  1623. return 250 + Misc.random(500);
  1624. case 1648:
  1625. return 250 + Misc.random(250);
  1626. case 90:
  1627. return 200;
  1628. case 82:
  1629. return 1000 + Misc.random(455);
  1630. case 52:
  1631. return 400 + Misc.random(200);
  1632. case 49:
  1633. return 1500 + Misc.random(2000);
  1634. case 1341:
  1635. return 1500 + Misc.random(500);
  1636. case 26:
  1637. return 500 + Misc.random(100);
  1638. case 20:
  1639. return 750 + Misc.random(100);
  1640. case 21:
  1641. return 890 + Misc.random(125);
  1642. case 117:
  1643. return 500 + Misc.random(250);
  1644. case 2607:
  1645. return 500 + Misc.random(350);
  1646. }
  1647. break;
  1648. case 11212:
  1649. return 10 + Misc.random(4);
  1650. case 565:
  1651. case 561:
  1652. return 10;
  1653. case 560:
  1654. case 563:
  1655. case 562:
  1656. return 15;
  1657. case 555:
  1658. case 554:
  1659. case 556:
  1660. case 557:
  1661. return 20;
  1662. case 892:
  1663. return 40;
  1664. case 886:
  1665. return 100;
  1666. case 6522:
  1667. return 6 + Misc.random(5);
  1668.  
  1669. }
  1670.  
  1671. return 1;
  1672. }
  1673.  
  1674. /**
  1675. * Slayer Experience
  1676. **/
  1677. public void appendSlayerExperience(int i) {
  1678. int npc = 0;
  1679. Client c = (Client)PlayerHandler.players[npcs[i].killedBy];
  1680. if(c != null) {
  1681. if (c.slayerTask == npcs[i].npcType){
  1682. c.taskAmount--;
  1683. c.getPA().addSkillXP(npcs[i].MaxHP * Config.SLAYER_EXPERIENCE, 18);
  1684. c.getPA().sendFrame126("@whi@Task: @gre@"+ c.taskAmount +" "+Server.npcHandler.getNpcListName(c.slayerTask)+ " ", 7383);
  1685. if (c.taskAmount <= 0) {
  1686. if (c.combatLevel < 50) {
  1687. c.getPA().addSkillXP((npcs[i].MaxHP * 8) * Config.SLAYER_EXPERIENCE, 18);
  1688. c.slayerTask = -1;
  1689. c.slayerPoints += 5;
  1690. c.getPA().sendFrame126("@whi@Slayer Points: @gre@"+ c.slayerPoints + " ", 7339);
  1691. c.sendMessage("You completed your low slayer task. Please see a slayer master to get a new one.");
  1692. c.sendMessage("Also you have received @red@5 @bla@slayer points for this.");
  1693. } else if (c.combatLevel >= 50 && c.combatLevel <= 90) {
  1694. c.getPA().addSkillXP((npcs[i].MaxHP * 12) * Config.SLAYER_EXPERIENCE, 18);
  1695. c.slayerTask = -1;
  1696. c.slayerPoints += 10;
  1697. c.getPA().sendFrame126("@whi@Slayer Points: @gre@"+ c.slayerPoints + " ", 7339);
  1698. c.sendMessage("You completed @blu@medium@bla@ your slayer task. Please see a slayer master to get a new one.");
  1699. c.sendMessage("Also you have received @blu@10 @bla@slayer points for this.");
  1700. } else if (c.combatLevel > 90 && c.combatLevel <= 126) {
  1701. c.getPA().addSkillXP((npcs[i].MaxHP * 12) * Config.SLAYER_EXPERIENCE, 18);
  1702. c.slayerTask = -1;
  1703. c.slayerPoints += 15;
  1704. c.getPA().sendFrame126("@whi@Slayer Points: @gre@"+ c.slayerPoints + " ", 7339);
  1705. c.sendMessage("You completed @red@high@bla@ your slayer task. Please see a slayer master to get a new one.");
  1706. c.sendMessage("Also you have received @red@15 @bla@slayer points for this.");
  1707. }
  1708. }
  1709. }
  1710. }
  1711. }
  1712.  
  1713. /**
  1714. * Resets players in combat
  1715. */
  1716.  
  1717. public void resetPlayersInCombat(int i) {
  1718. for (int j = 0; j < PlayerHandler.players.length; j++) {
  1719. if (PlayerHandler.players[j] != null)
  1720. if (PlayerHandler.players[j].underAttackBy2 == i)
  1721. PlayerHandler.players[j].underAttackBy2 = 0;
  1722. }
  1723. }
  1724.  
  1725. /**
  1726. * Npc names
  1727. **/
  1728.  
  1729. public String getNpcName(int npcId) {
  1730. if(npcId <= -1) {
  1731. return "None";
  1732. }
  1733. if(NPCDefinitions.getDefinitions()[npcId] == null) {
  1734. return "None";
  1735. }
  1736. return NPCDefinitions.getDefinitions()[npcId].getNpcName();
  1737. }
  1738.  
  1739. /**
  1740. * Npc Follow Player
  1741. **/
  1742.  
  1743. public int GetMove(int Place1,int Place2) {
  1744. if ((Place1 - Place2) == 0) {
  1745. return 0;
  1746. } else if ((Place1 - Place2) < 0) {
  1747. return 1;
  1748. } else if ((Place1 - Place2) > 0) {
  1749. return -1;
  1750. }
  1751. return 0;
  1752. }
  1753.  
  1754. public boolean followPlayer(int i) {
  1755. switch (npcs[i].npcType) {
  1756. case 2892:
  1757. case 2894:
  1758. case 6260:
  1759. /*case 2030:
  1760. case 2029:
  1761. case 2028:
  1762. case 2027:
  1763. case 2026:
  1764. case 2025:*/
  1765. return false;
  1766. }
  1767. return true;
  1768. }
  1769.  
  1770. public void followPlayer(int i, int playerId) {
  1771. if (PlayerHandler.players[playerId] == null) {
  1772. return;
  1773. }
  1774. if (PlayerHandler.players[playerId].respawnTimer > 0) {
  1775. npcs[i].facePlayer(0);
  1776. npcs[i].randomWalk = true;
  1777. npcs[i].underAttack = false;
  1778. return;
  1779. }
  1780.  
  1781. if (!followPlayer(i)) {
  1782. npcs[i].facePlayer(playerId);
  1783. return;
  1784. }
  1785.  
  1786. int playerX = PlayerHandler.players[playerId].absX;
  1787. int playerY = PlayerHandler.players[playerId].absY;
  1788. npcs[i].randomWalk = false;
  1789. if (goodDistance(npcs[i].getX(), npcs[i].getY(), playerX, playerY, distanceRequired(i)))
  1790. return;
  1791. 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))) {
  1792. if(npcs[i].heightLevel == Player.heightLevel) {
  1793. if(PlayerHandler.players[playerId] != null && npcs[i] != null) {
  1794. if(playerY < npcs[i].absY) {
  1795. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1796. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1797. } else if(playerY > npcs[i].absY) {
  1798. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1799. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1800. } else if(playerX < npcs[i].absX) {
  1801. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1802. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1803. } else if(playerX > npcs[i].absX) {
  1804. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1805. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1806. } else if(playerX == npcs[i].absX || playerY == npcs[i].absY) {
  1807. int o = Misc.random(3);
  1808. switch(o) {
  1809. case 0:
  1810. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1811. npcs[i].moveY = GetMove(npcs[i].absY, playerY+1);
  1812. break;
  1813.  
  1814. case 1:
  1815. npcs[i].moveX = GetMove(npcs[i].absX, playerX);
  1816. npcs[i].moveY = GetMove(npcs[i].absY, playerY-1);
  1817. break;
  1818.  
  1819. case 2:
  1820. npcs[i].moveX = GetMove(npcs[i].absX, playerX+1);
  1821. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1822. break;
  1823.  
  1824. case 3:
  1825. npcs[i].moveX = GetMove(npcs[i].absX, playerX-1);
  1826. npcs[i].moveY = GetMove(npcs[i].absY, playerY);
  1827. break;
  1828. }
  1829. }
  1830. int x = (npcs[i].absX + npcs[i].moveX);
  1831. int y = (npcs[i].absY + npcs[i].moveY);
  1832. npcs[i].facePlayer(playerId);
  1833. //if (checkClipping(i))
  1834. handleClipping(i);
  1835. npcs[i].getNextNPCMovement(i);
  1836. /*else {
  1837. npcs[i].moveX = 0;
  1838. npcs[i].moveY = 0;
  1839. }*/
  1840. npcs[i].facePlayer(playerId);
  1841. npcs[i].updateRequired = true;
  1842. }
  1843. }
  1844. } else {
  1845. npcs[i].facePlayer(0);
  1846. npcs[i].randomWalk = true;
  1847. npcs[i].underAttack = false;
  1848. }
  1849. }
  1850.  
  1851.  
  1852. /**
  1853. * load spell
  1854. **/
  1855. public void loadSpell2(int i) {
  1856. npcs[i].attackType = 3;
  1857. int random = Misc.random(3);
  1858. if (random == 0) {
  1859. npcs[i].projectileId = 393; //red
  1860. npcs[i].endGfx = 430;
  1861. } else if (random == 1) {
  1862. npcs[i].projectileId = 394; //green
  1863. npcs[i].endGfx = 429;
  1864. } else if (random == 2) {
  1865. npcs[i].projectileId = 395; //white
  1866. npcs[i].endGfx = 431;
  1867. } else if (random == 3) {
  1868. npcs[i].projectileId = 396; //blue
  1869. npcs[i].endGfx = 428;
  1870. }
  1871. }
  1872.  
  1873. public void loadSpell(int i) {
  1874. switch(npcs[i].npcType) {
  1875. case 2892:
  1876. npcs[i].projectileId = 94;
  1877. npcs[i].attackType = 2;
  1878. npcs[i].endGfx = 95;
  1879. break;
  1880. case 2894:
  1881. npcs[i].projectileId = 298;
  1882. npcs[i].attackType = 1;
  1883. break;
  1884. case 50:
  1885. int random = Misc.random(4);
  1886. if (random == 0) {
  1887. npcs[i].projectileId = 393; //red
  1888. npcs[i].endGfx = 430;
  1889. npcs[i].attackType = 3;
  1890. } else if (random == 1) {
  1891. npcs[i].projectileId = 394; //green
  1892. npcs[i].endGfx = 429;
  1893. npcs[i].attackType = 3;
  1894. } else if (random == 2) {
  1895. npcs[i].projectileId = 395; //white
  1896. npcs[i].endGfx = 431;
  1897. npcs[i].attackType = 3;
  1898. } else if (random == 3) {
  1899. npcs[i].projectileId = 396; //blue
  1900. npcs[i].endGfx = 428;
  1901. npcs[i].attackType = 3;
  1902. } else if (random == 4) {
  1903. npcs[i].projectileId = -1; //melee
  1904. npcs[i].endGfx = -1;
  1905. npcs[i].attackType = 0;
  1906. }
  1907. break;
  1908. //arma npcs
  1909. case 2561:
  1910. npcs[i].attackType = 0;
  1911. break;
  1912. case 2560:
  1913. npcs[i].attackType = 1;
  1914. npcs[i].projectileId = 1190;
  1915. break;
  1916. case 2559:
  1917. npcs[i].attackType = 2;
  1918. npcs[i].projectileId = 1203;
  1919. break;
  1920. case 2558:
  1921. random = Misc.random(1);
  1922. npcs[i].attackType = 1 + random;
  1923. if (npcs[i].attackType == 1) {
  1924. npcs[i].projectileId = 1197;
  1925. } else {
  1926. npcs[i].attackType = 2;
  1927. npcs[i].projectileId = 1198;
  1928. }
  1929. break;
  1930. //sara npcs
  1931. case 2562: //sara
  1932. random = Misc.random(1);
  1933. if (random == 0) {
  1934. npcs[i].attackType = 2;
  1935. npcs[i].endGfx = 1224;
  1936. npcs[i].projectileId = -1;
  1937. } else if (random == 1)
  1938. npcs[i].attackType = 0;
  1939. break;
  1940. case 2563: //star
  1941. npcs[i].attackType = 0;
  1942. break;
  1943. case 2564: //growler
  1944. npcs[i].attackType = 2;
  1945. npcs[i].projectileId = 1203;
  1946. break;
  1947. case 2565: //bree
  1948. npcs[i].attackType = 1;
  1949. npcs[i].projectileId = 9;
  1950. break;
  1951. //bandos npcs
  1952. case 6260:
  1953. random = Misc.random(2);
  1954. if (random == 0 || random == 1)
  1955. npcs[i].attackType = 0;
  1956. else {
  1957. npcs[i].attackType = 1;
  1958. npcs[i].endGfx = 1211;
  1959. npcs[i].projectileId = 288;
  1960. }
  1961. break;
  1962. case 2551:
  1963. npcs[i].attackType = 0;
  1964. break;
  1965. case 2552:
  1966. npcs[i].attackType = 2;
  1967. npcs[i].projectileId = 1203;
  1968. break;
  1969. case 2553:
  1970. npcs[i].attackType = 1;
  1971. npcs[i].projectileId = 1206;
  1972. break;
  1973. case 2025:
  1974. npcs[i].attackType = 2;
  1975. int r = Misc.random(3);
  1976. if(r == 0) {
  1977. npcs[i].gfx100(158);
  1978. npcs[i].projectileId = 159;
  1979. npcs[i].endGfx = 160;
  1980. }
  1981. if(r == 1) {
  1982. npcs[i].gfx100(161);
  1983. npcs[i].projectileId = 162;
  1984. npcs[i].endGfx = 163;
  1985. }
  1986. if(r == 2) {
  1987. npcs[i].gfx100(164);
  1988. npcs[i].projectileId = 165;
  1989. npcs[i].endGfx = 166;
  1990. }
  1991. if(r == 3) {
  1992. npcs[i].gfx100(155);
  1993. npcs[i].projectileId = 156;
  1994. }
  1995. break;
  1996. case 2881://supreme
  1997. npcs[i].attackType = 1;
  1998. npcs[i].projectileId = 298;
  1999. break;
  2000.  
  2001. case 2882://prime
  2002. npcs[i].attackType = 2;
  2003. npcs[i].projectileId = 162;
  2004. npcs[i].endGfx = 477;
  2005. break;
  2006.  
  2007. case 2028:
  2008. npcs[i].attackType = 1;
  2009. npcs[i].projectileId = 27;
  2010. break;
  2011.  
  2012. case 3200:
  2013. int r2 = Misc.random(1);
  2014. if (r2 == 0) {
  2015. npcs[i].attackType = 1;
  2016. npcs[i].gfx100(550);
  2017. npcs[i].projectileId = 551;
  2018. npcs[i].endGfx = 552;
  2019. } else {
  2020. npcs[i].attackType = 2;
  2021. npcs[i].gfx100(553);
  2022. npcs[i].projectileId = 554;
  2023. npcs[i].endGfx = 555;
  2024. }
  2025. break;
  2026. case 2745:
  2027. int r3 = 0;
  2028. if (goodDistance(npcs[i].absX, npcs[i].absY, PlayerHandler.players[npcs[i].spawnedBy].absX, PlayerHandler.players[npcs[i].spawnedBy].absY, 1))
  2029. r3 = Misc.random(2);
  2030. else
  2031. r3 = Misc.random(1);
  2032. if (r3 == 0) {
  2033. npcs[i].attackType = 2;
  2034. npcs[i].endGfx = 157;
  2035. npcs[i].projectileId = 448;
  2036. } else if (r3 == 1) {
  2037. npcs[i].attackType = 1;
  2038. npcs[i].endGfx = 451;
  2039. npcs[i].projectileId = -1;
  2040. } else if (r3 == 2) {
  2041. npcs[i].attackType = 0;
  2042. npcs[i].projectileId = -1;
  2043. }
  2044. break;
  2045. case 2743:
  2046. npcs[i].attackType = 2;
  2047. npcs[i].projectileId = 445;
  2048. npcs[i].endGfx = 446;
  2049. break;
  2050.  
  2051. case 2631:
  2052. npcs[i].attackType = 1;
  2053. npcs[i].projectileId = 443;
  2054. break;
  2055. }
  2056. }
  2057.  
  2058. /**
  2059. * Distanced required to attack
  2060. **/
  2061. public int distanceRequired(int i) {
  2062. switch(npcs[i].npcType) {
  2063. case 2025:
  2064. case 2028:
  2065. return 6;
  2066. case 50:
  2067. case 2562:
  2068. return 2;
  2069. case 2881://dag kings
  2070. case 2882:
  2071. case 3200://chaos ele
  2072. case 2743:
  2073. case 2631:
  2074. case 2745:
  2075. return 8;
  2076. case 2883://rex
  2077. return 1;
  2078. case 2552:
  2079. case 2553:
  2080. case 2556:
  2081. case 2557:
  2082. case 2558:
  2083. case 2559:
  2084. case 2560:
  2085. case 2564:
  2086. case 2565:
  2087. return 9;
  2088. //things around dags
  2089. case 2892:
  2090. case 2894:
  2091. return 10;
  2092. default:
  2093. return 1;
  2094. }
  2095. }
  2096.  
  2097. public int followDistance(int i) {
  2098. switch (npcs[i].npcType) {
  2099. case 6260:
  2100. case 2551:
  2101. case 2562:
  2102. case 2563:
  2103. return 8;
  2104. case 2883:
  2105. return 4;
  2106. case 2881:
  2107. case 2882:
  2108. return 1;
  2109.  
  2110. }
  2111. return 0;
  2112.  
  2113.  
  2114. }
  2115.  
  2116. public int getProjectileSpeed(int i) {
  2117. switch(npcs[i].npcType) {
  2118. case 2881:
  2119. case 2882:
  2120. case 3200:
  2121. return 85;
  2122.  
  2123. case 2745:
  2124. return 130;
  2125.  
  2126. case 50:
  2127. return 90;
  2128.  
  2129. case 2025:
  2130. return 85;
  2131.  
  2132. case 2028:
  2133. return 80;
  2134.  
  2135. default:
  2136. return 85;
  2137. }
  2138. }
  2139.  
  2140. /**
  2141. *NPC Attacking Player
  2142. **/
  2143.  
  2144. public void attackPlayer(Client c, int i) {
  2145. if (npcs[i].lastX != npcs[i].getX()
  2146. || npcs[i].lastY != npcs[i].getY()) {
  2147. return;
  2148. }
  2149. if(npcs[i] != null) {
  2150. if (npcs[i].isDead)
  2151. return;
  2152. if (!npcs[i].inMulti() && npcs[i].underAttackBy > 0 && npcs[i].underAttackBy != c.playerId) {
  2153. npcs[i].killerId = 0;
  2154. return;
  2155. }
  2156. if (!npcs[i].inMulti() && (c.underAttackBy > 0 || (c.underAttackBy2 > 0 && c.underAttackBy2 != i))) {
  2157. npcs[i].killerId = 0;
  2158. return;
  2159. }
  2160. if (npcs[i].heightLevel != Player.heightLevel) {
  2161. npcs[i].killerId = 0;
  2162. return;
  2163. }
  2164. npcs[i].facePlayer(c.playerId);
  2165. boolean special = false;//specialCase(c,i);
  2166. if(goodDistance(npcs[i].getX(), npcs[i].getY(), c.getX(), c.getY(), distanceRequired(i)) || special) {
  2167. if(c.respawnTimer <= 0) {
  2168. npcs[i].facePlayer(c.playerId);
  2169. npcs[i].attackTimer = getNpcDelay(i);
  2170. npcs[i].hitDelayTimer = getHitDelay(i);
  2171. npcs[i].attackType = 0;
  2172. if (special)
  2173. loadSpell2(i);
  2174. else
  2175. loadSpell(i);
  2176. if (npcs[i].attackType == 3)
  2177. npcs[i].hitDelayTimer += 2;
  2178. if (multiAttacks(i)) {
  2179. multiAttackGfx(i, npcs[i].projectileId);
  2180. startAnimation(getAttackEmote(i), i);
  2181. npcs[i].oldIndex = c.playerId;
  2182. return;
  2183. }
  2184. if(npcs[i].projectileId > 0) {
  2185. int nX = NPCHandler.npcs[i].getX() + offset(i);
  2186. int nY = NPCHandler.npcs[i].getY() + offset(i);
  2187. int pX = c.getX();
  2188. int pY = c.getY();
  2189. int offX = (nY - pY)* -1;
  2190. int offY = (nX - pX)* -1;
  2191. c.getPA().createPlayersProjectile(nX, nY, offX, offY, 50, getProjectileSpeed(i), npcs[i].projectileId, 43, 31, -c.getId() - 1, 65);
  2192. }
  2193. c.underAttackBy2 = i;
  2194. c.singleCombatDelay2 = System.currentTimeMillis();
  2195. npcs[i].oldIndex = c.playerId;
  2196. startAnimation(getAttackEmote(i), i);
  2197. c.getPA().removeAllWindows();
  2198. if(c.teleporting) {
  2199. c.startAnimation(65535);
  2200. c.teleporting = false;
  2201. c.isRunning = false;
  2202. c.gfx0(-1);
  2203. c.startAnimation(-1);
  2204. }
  2205. }
  2206. }
  2207. }
  2208. }
  2209.  
  2210. public int offset(int i) {
  2211. switch (npcs[i].npcType) {
  2212. case 50:
  2213. return 2;
  2214. case 2881:
  2215. case 2882:
  2216. return 1;
  2217. case 2745:
  2218. case 2743:
  2219. return 1;
  2220. }
  2221. return 0;
  2222. }
  2223.  
  2224. public boolean specialCase(Client c, int i) { //responsible for npcs that much
  2225. 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)))
  2226. return true;
  2227. return false;
  2228. }
  2229.  
  2230. public boolean retaliates(int npcType) {
  2231. return npcType < 3777 || npcType > 3780 && !(npcType >= 2440 && npcType <= 2446);
  2232. }
  2233.  
  2234. public void applyDamage(int i) {
  2235. if(npcs[i] != null) {
  2236. if(PlayerHandler.players[npcs[i].oldIndex] == null) {
  2237. return;
  2238. }
  2239. if (npcs[i].isDead)
  2240. return;
  2241. Client c = (Client) PlayerHandler.players[npcs[i].oldIndex];
  2242. if (multiAttacks(i)) {
  2243. multiAttackDamage(i);
  2244. return;
  2245. }
  2246. if (c.playerIndex <= 0 && c.npcIndex <= 0)
  2247. if (c.autoRet == 1)
  2248. c.npcIndex = i;
  2249. if(c.attackTimer <= 3 || c.attackTimer == 0 && c.npcIndex == 0 && c.oldNpcIndex == 0) {
  2250. c.startAnimation(c.getCombat().getBlockEmote());
  2251. }
  2252. if(c.respawnTimer <= 0) {
  2253. int damage = 0;
  2254. if(npcs[i].attackType == 0) {
  2255. damage = Misc.random(npcs[i].maxHit);
  2256. if (10 + Misc.random(c.getCombat().calculateMeleeDefence()) > Misc.random(NPCHandler.npcs[i].attack)) {
  2257. damage = 0;
  2258. }
  2259. if(c.prayerActive[18]) { // protect from melee
  2260. damage = 0;
  2261. }
  2262. if (c.playerLevel[3] - damage < 0) {
  2263. damage = c.playerLevel[3];
  2264. }
  2265. }
  2266.  
  2267. if(npcs[i].attackType == 1) { // range
  2268. damage = Misc.random(npcs[i].maxHit);
  2269. if (10 + Misc.random(c.getCombat().calculateRangeDefence()) > Misc.random(NPCHandler.npcs[i].attack)) {
  2270. damage = 0;
  2271. }
  2272. if(c.prayerActive[17]) { // protect from range
  2273. damage = 0;
  2274. }
  2275. if (c.playerLevel[3] - damage < 0) {
  2276. damage = c.playerLevel[3];
  2277. }
  2278. }
  2279.  
  2280. if(npcs[i].attackType == 2) { // magic
  2281. damage = Misc.random(npcs[i].maxHit);
  2282. boolean magicFailed = false;
  2283. if (10 + Misc.random(c.getCombat().mageDef()) > Misc.random(NPCHandler.npcs[i].attack)) {
  2284. damage = 0;
  2285. magicFailed = true;
  2286. }
  2287. if(c.prayerActive[16]) { // protect from magic
  2288. damage = 0;
  2289. magicFailed = true;
  2290. }
  2291. if (c.playerLevel[3] - damage < 0) {
  2292. damage = c.playerLevel[3];
  2293. }
  2294. if(npcs[i].endGfx > 0 && (!magicFailed || isFightCaveNpc(i))) {
  2295. c.gfx100(npcs[i].endGfx);
  2296. } else {
  2297. c.gfx100(85);
  2298. }
  2299. }
  2300.  
  2301. if (npcs[i].attackType == 3) { //fire breath
  2302. int anti = c.getPA().antiFire();
  2303. if (anti == 0) {
  2304. damage = Misc.random(30) + 10;
  2305. c.sendMessage("You are badly burnt by the dragon fire!");
  2306. } else if (anti == 1)
  2307. damage = Misc.random(20);
  2308. else if (anti == 2)
  2309. damage = Misc.random(5);
  2310. if (c.playerLevel[3] - damage < 0)
  2311. damage = c.playerLevel[3];
  2312. c.gfx100(npcs[i].endGfx);
  2313. }
  2314. handleSpecialEffects(c, i, damage);
  2315. c.logoutDelay = System.currentTimeMillis(); // logout delay
  2316. //c.setHitDiff(damage);
  2317. c.handleHitMask(damage);
  2318. c.playerLevel[3] -= damage;
  2319. c.getPA().refreshSkill(3);
  2320. c.updateRequired = true;
  2321. //c.setHitUpdateRequired(true);
  2322. }
  2323. }
  2324. }
  2325.  
  2326. public void handleSpecialEffects(Client c, int i, int damage) {
  2327. if (npcs[i].npcType == 2892 || npcs[i].npcType == 2894) {
  2328. if (damage > 0) {
  2329. if (c != null) {
  2330. if (c.playerLevel[5] > 0) {
  2331. c.playerLevel[5]--;
  2332. c.getPA().refreshSkill(5);
  2333. c.getPA().appendPoison(12);
  2334. }
  2335. }
  2336. }
  2337. }
  2338.  
  2339. }
  2340.  
  2341. public static void startAnimation(int animId, int i) {
  2342. npcs[i].animNumber = animId;
  2343. npcs[i].animUpdateRequired = true;
  2344. npcs[i].updateRequired = true;
  2345. }
  2346.  
  2347. public NPC[] getNPCs() {
  2348. return npcs;
  2349. }
  2350.  
  2351. public boolean goodDistance(int objectX, int objectY, int playerX, int playerY, int distance) {
  2352. return ((objectX-playerX <= distance && objectX-playerX >= -distance) && (objectY-playerY <= distance && objectY-playerY >= -distance));
  2353. }
  2354.  
  2355.  
  2356. public int getMaxHit(int i) {
  2357. switch (npcs[i].npcType) {
  2358. case 2558:
  2359. if (npcs[i].attackType == 2)
  2360. return 28;
  2361. else
  2362. return 68;
  2363. case 2562:
  2364. return 31;
  2365. case 6260:
  2366. return 36;
  2367. }
  2368. return 1;
  2369. }
  2370.  
  2371.  
  2372. public boolean loadAutoSpawn(String FileName) {
  2373. String line = "";
  2374. String token = "";
  2375. String token2 = "";
  2376. String token2_2 = "";
  2377. String[] token3 = new String[10];
  2378. boolean EndOfFile = false;
  2379. int ReadMode = 0;
  2380. BufferedReader characterfile = null;
  2381. try {
  2382. characterfile = new BufferedReader(new FileReader("./"+FileName));
  2383. } catch(FileNotFoundException fileex) {
  2384. Misc.println(FileName+": file not found.");
  2385. return false;
  2386. }
  2387. try {
  2388. line = characterfile.readLine();
  2389. } catch(IOException ioexception) {
  2390. Misc.println(FileName+": error loading file.");
  2391. return false;
  2392. }
  2393. while(EndOfFile == false && line != null) {
  2394. line = line.trim();
  2395. int spot = line.indexOf("=");
  2396. if (spot > -1) {
  2397. token = line.substring(0, spot);
  2398. token = token.trim();
  2399. token2 = line.substring(spot + 1);
  2400. token2 = token2.trim();
  2401. token2_2 = token2.replaceAll("\t\t", "\t");
  2402. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2403. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2404. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2405. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2406. token3 = token2_2.split("\t");
  2407. if (token.equals("spawn")) {
  2408. 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]));
  2409.  
  2410. }
  2411. } else {
  2412. if (line.equals("[ENDOFSPAWNLIST]")) {
  2413. try { characterfile.close(); } catch(IOException ioexception) { }
  2414. return true;
  2415. }
  2416. }
  2417. try {
  2418. line = characterfile.readLine();
  2419. } catch(IOException ioexception1) { EndOfFile = true; }
  2420. }
  2421. try { characterfile.close(); } catch(IOException ioexception) { }
  2422. return false;
  2423. }
  2424.  
  2425. public int getNpcListHP(int npcId) {
  2426. if(npcId <= -1) {
  2427. return 0;
  2428. }
  2429. if(NPCDefinitions.getDefinitions()[npcId] == null) {
  2430. return 0;
  2431. }
  2432. return NPCDefinitions.getDefinitions()[npcId].getNpcHealth();
  2433.  
  2434. }
  2435.  
  2436. public String getNpcListName(int npcId) {
  2437. if(npcId <= -1) {
  2438. return "None";
  2439. }
  2440. if(NPCDefinitions.getDefinitions()[npcId] == null) {
  2441. return "None";
  2442. }
  2443. return NPCDefinitions.getDefinitions()[npcId].getNpcName();
  2444. }
  2445.  
  2446. public boolean loadNPCList(String FileName) {
  2447. String line = "";
  2448. String token = "";
  2449. String token2 = "";
  2450. String token2_2 = "";
  2451. String[] token3 = new String[10];
  2452. boolean EndOfFile = false;
  2453. int ReadMode = 0;
  2454. BufferedReader characterfile = null;
  2455. try {
  2456. characterfile = new BufferedReader(new FileReader("./"+FileName));
  2457. } catch(FileNotFoundException fileex) {
  2458. Misc.println(FileName+": file not found.");
  2459. return false;
  2460. }
  2461. try {
  2462. line = characterfile.readLine();
  2463. } catch(IOException ioexception) {
  2464. Misc.println(FileName+": error loading file.");
  2465. return false;
  2466. }
  2467. while(EndOfFile == false && line != null) {
  2468. line = line.trim();
  2469. int spot = line.indexOf("=");
  2470. if (spot > -1) {
  2471. token = line.substring(0, spot);
  2472. token = token.trim();
  2473. token2 = line.substring(spot + 1);
  2474. token2 = token2.trim();
  2475. token2_2 = token2.replaceAll("\t\t", "\t");
  2476. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2477. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2478. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2479. token2_2 = token2_2.replaceAll("\t\t", "\t");
  2480. token3 = token2_2.split("\t");
  2481. if (token.equals("npc")) {
  2482. newNPCList(Integer.parseInt(token3[0]), token3[1], Integer.parseInt(token3[2]), Integer.parseInt(token3[3]));
  2483. }
  2484. } else {
  2485. if (line.equals("[ENDOFNPCLIST]")) {
  2486. try { characterfile.close(); } catch(IOException ioexception) { }
  2487. return true;
  2488. }
  2489. }
  2490. try {
  2491. line = characterfile.readLine();
  2492. } catch(IOException ioexception1) { EndOfFile = true; }
  2493. }
  2494. try { characterfile.close(); } catch(IOException ioexception) { }
  2495. return false;
  2496. }
  2497.  
  2498.  
  2499. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement