Guest User

Untitled

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