Advertisement
Guest User

Untitled

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