Guest User

Untitled

a guest
Apr 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 23.93 KB | None | 0 0
  1. package server.model.players;
  2.  
  3. import server.Config;
  4. import server.Server;
  5. import server.util.Misc;
  6. import server.model.players.Client;
  7. import server.model.players.PlayerSave;
  8. import server.model.players.Player;
  9. import server.event.EventManager;
  10. import server.model.npcs.NPC;
  11. import server.model.npcs.NPCHandler;
  12. import server.event.EventContainer;
  13. import server.event.Event;
  14. import java.util.Random;
  15.  
  16.  
  17. public class CombatAssistant{
  18.  
  19. private Client c;
  20. public CombatAssistant(Client Client) {
  21. this.c = Client;
  22. }
  23.  
  24. private final Random random = new Random();
  25.  
  26. public int[][] slayerReqs = {{1648,5},{1612,15},{1643,45},{1618,50},{1624,65},{1610,75},{1613,80},{1615,85},{2783,90},{3590,95},{3592,85},{3591,85},{5666,96},{1472,90}};
  27.  
  28. public boolean goodSlayer(int i) {
  29. for (int j = 0; j < slayerReqs.length; j++) {
  30. if (slayerReqs[j][0] == Server.npcHandler.npcs[i].npcType) {
  31. if (slayerReqs[j][1] > c.playerLevel[c.playerSlayer]) {
  32. c.sendMessage("You need a slayer level of " + slayerReqs[j][1] + " to harm this NPC.");
  33. return false;
  34. }
  35. }
  36. }
  37. return true;
  38. }
  39.  
  40. public int getHitType(boolean range, boolean magic) {
  41. if(range)
  42. return 2;
  43. if(magic)
  44. return 3;
  45. return 1;
  46. }
  47.  
  48. /*
  49. *Multi Barrage
  50. */
  51. public void multiSpellOnNPC(int originalNpc) {
  52. //c.PlayerAttType = 2;
  53. if (!multis() || !c.inMulti())
  54. return;
  55. NPC o2 = (NPC) NPCHandler.npcs[originalNpc];
  56. int origX = o2.absX;
  57. int origY = o2.absY;
  58. for (int indx = 0; indx < NPCHandler.maxNPCs; indx++) {
  59. if (NPCHandler.npcs[indx] != null) {
  60. NPC o = (NPC) NPCHandler.npcs[indx];
  61. if (!(o.absX >= origX - 2 && o.absX <= origX + 2
  62. && o.absY >= origY - 2 && o.absY <= origY + 2)
  63. || !o.inMulti())
  64. continue;
  65. if (!checkNpcReq(indx) || indx == originalNpc)
  66. continue;
  67. int bonusAttack = getBonusAttack(indx);
  68. if (Misc.random(NPCHandler.npcs[indx].defence) > 10
  69. + Misc.random(mageAtk()) + bonusAttack) {
  70. if (getEndGfxHeight() == 100) { // end GFX
  71. o.gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  72. } else {
  73. o.gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  74. }
  75. int damage = Misc.random(finalMagicDamage(c));
  76. c.getPA().addSkillXP(
  77. (c.MAGIC_SPELLS[c.oldSpellId][7] + damage
  78. * Config.MAGIC_EXP_RATE), 6);
  79. c.getPA().addSkillXP(
  80. (c.MAGIC_SPELLS[c.oldSpellId][7] + damage
  81. * Config.MAGIC_EXP_RATE / 3), 3);
  82. spellEffects(damage, indx);
  83. setColorMasks(damage, finalMagicDamage(c), 1);
  84. if (damage > -1) {
  85. NPCHandler.npcs[indx].hitDiff = damage;
  86. NPCHandler.npcs[indx].HP -= damage;
  87. NPCHandler.npcs[indx].hitUpdateRequired = true;
  88. c.totalDamageDealt += damage;
  89. }
  90. } else {
  91. int damage = 0;
  92. o.gfx100(85);
  93. NPCHandler.npcs[indx].hitDiff = damage;
  94. NPCHandler.npcs[indx].hitUpdateRequired = true;
  95. c.totalDamageDealt += damage;
  96. }
  97. }
  98. }
  99. }
  100.  
  101. public void multiSpellOnPlayer(int originalPlayer) {
  102. if (!multis() || !c.inMulti())
  103. return;
  104. //c.PlayerAttType = 2;
  105. Client o2 = (Client) PlayerHandler.players[originalPlayer];
  106. int origX = o2.absX;
  107. int origY = o2.absY;
  108. for (int indx = 0; indx < Config.MAX_PLAYERS; indx++) {
  109. if (PlayerHandler.players[indx] != null) {
  110. Client o = (Client) PlayerHandler.players[indx];
  111. if (!(o.absX >= origX - 2 && o.absX <= origX + 2
  112. && o.absY >= origY - 2 && o.absY <= origY + 2)
  113. || !o.inMulti())
  114. continue;
  115. if (!checkPlayerReq(indx) || indx == originalPlayer
  116. || indx == c.playerId)
  117. continue;
  118. if (Misc.random(o.getCombat().mageDef()) > Misc
  119. .random(mageAtk())) {
  120. if (getEndGfxHeight() == 100) { // end GFX
  121. o.gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  122. } else {
  123. o.gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  124. }
  125. int damage = Misc.random(finalMagicDamage(c));
  126. if(damage > 20) { // Soak Mage
  127. o.soaked = (int) (damage * getBonus(o, ABSORB_MAGIC_BONUS));
  128. damage -= o.soaked;
  129. }
  130. c.getPA().addSkillXP(
  131. (c.MAGIC_SPELLS[c.oldSpellId][7] + damage
  132. * Config.MAGIC_EXP_RATE), 6);
  133. c.getPA().addSkillXP(
  134. (c.MAGIC_SPELLS[c.oldSpellId][7] + damage
  135. * Config.MAGIC_EXP_RATE / 3), 3);
  136. spellEffects(damage, indx);
  137. hitPlayer(indx, damage);
  138. } else {
  139. o.gfx100(85);
  140. hitPlayer(indx, 0);
  141. }
  142. }
  143. }
  144. }
  145.  
  146. public void spellEffects(int damage, int indx) {
  147. switch (c.MAGIC_SPELLS[c.oldSpellId][0]) {
  148. case 12901:
  149. case 12919:
  150. case 12911:
  151. case 12929:
  152. int heal = Misc.random(damage / 2);
  153. if (c.playerLevel[3] + heal >= c.getPA().getLevelForXP(
  154. c.playerXP[3])) {
  155. c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  156. } else {
  157. c.playerLevel[3] += heal;
  158. }
  159. c.getPA().refreshSkill(3);
  160. break;
  161. }
  162. int freezeDelay = getFreezeTime();
  163. if (c.playerIndex > 0) {
  164. if(freezeDelay > 0 && PlayerHandler.players[indx].freezeTimer == 0)
  165. PlayerHandler.players[indx].freezeTimer = freezeDelay;
  166. } else if (c.npcIndex > 0) {
  167. if(freezeDelay > 0 && NPCHandler.npcs[indx].freezeTimer == 0)
  168. NPCHandler.npcs[indx].freezeTimer = freezeDelay;
  169. }
  170. }
  171.  
  172. public void hitPlayer(int damage, int i) {
  173. Client o = (Client) PlayerHandler.players[i];
  174. if(o == null)
  175. return;
  176. o.setHitDiff(damage);
  177. o.setHitUpdateRequired(true);
  178. o.dealDamage(damage);
  179. o.updateRequired = true;
  180. o.underAttackBy = c.playerId;
  181. o.logoutDelay = System.currentTimeMillis();
  182. o.singleCombatDelay = System.currentTimeMillis();
  183. }
  184.  
  185. public boolean checkNpcReq(int i) {
  186. if (NPCHandler.npcs[i].isDead || NPCHandler.npcs[i].MaxHP <= 0) {
  187. c.usingMagic = false;
  188. c.faceUpdate(0);
  189. c.npcIndex = 0;
  190. return false;
  191. }
  192. if(c.respawnTimer > 0) {
  193. c.npcIndex = 0;
  194. return false;
  195. }
  196. if (NPCHandler.npcs[i].underAttackBy > 0 && NPCHandler.npcs[i].underAttackBy != c.playerId && !NPCHandler.npcs[i].inMulti()) {
  197. c.npcIndex = 0;
  198. c.sendMessage("This monster is already in combat.");
  199. return false;
  200. }
  201. if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
  202. resetPlayerAttack();
  203. c.sendMessage("I am already under attack.");
  204. return false;
  205. }
  206. if (!goodSlayer(i)) {
  207. resetPlayerAttack();
  208. return false;
  209. }
  210.  
  211. if (NPCHandler.npcs[i].npcType == 6258) {
  212. if (92 > c.getLevelForXP(c.playerXP[c.playerPrayer])) {
  213. c.sendMessage("You need a prayer level of 92 to harm this NPC.");
  214. resetPlayerAttack();
  215. return false;
  216. }
  217. }
  218. if (NPCHandler.npcs[i].spawnedBy != c.playerId && NPCHandler.npcs[i].spawnedBy > 0) {
  219. resetPlayerAttack();
  220. c.sendMessage("This monster was not spawned for you.");
  221. return false;
  222. }
  223. return true;
  224. }
  225.  
  226. public boolean checkPlayerReq(int i) {
  227. if (PlayerHandler.players[i].isDead) {
  228. resetPlayerAttack();
  229. return false;
  230. }
  231.  
  232. if(c.respawnTimer > 0 || PlayerHandler.players[i].respawnTimer > 0) {
  233. resetPlayerAttack();
  234. return false;
  235. }
  236.  
  237. /*if (c.teleTimer > 0 || Server.playerHandler.players[i].teleTimer > 0) {
  238. resetPlayerAttack();
  239. return;
  240. }*/
  241.  
  242. if(!c.getCombat().checkReqs()) {
  243. return false;
  244. }
  245.  
  246. if(c.playerRights == 2){
  247. c.sendMessage("Staff are not allowed to pk");
  248. c.sendMessage("Your account has been blacklisted for an owner to see");
  249. return false;
  250. }
  251.  
  252. if (c.getPA().getWearingAmount() < 4 && c.duelStatus < 1) {
  253. c.sendMessage("You must be wearing at least 4 items to attack someone.");
  254. resetPlayerAttack();
  255. return false;
  256. }
  257. boolean sameSpot = c.absX == PlayerHandler.players[i].getX() && c.absY == PlayerHandler.players[i].getY();
  258. if(!c.goodDistance(PlayerHandler.players[i].getX(), PlayerHandler.players[i].getY(), c.getX(), c.getY(), 25) && !sameSpot) {
  259. resetPlayerAttack();
  260. return false;
  261. }
  262. if(PlayerHandler.players[i].respawnTimer > 0) {
  263. PlayerHandler.players[i].playerIndex = 0;
  264. resetPlayerAttack();
  265. return false;
  266. }
  267.  
  268. if (PlayerHandler.players[i].heightLevel != c.heightLevel) {
  269. resetPlayerAttack();
  270. return false;
  271. }
  272. return true;
  273. }
  274.  
  275.  
  276. /**
  277. * Attack Npcs
  278. */
  279. public void attackNpc(int i) {
  280. if (Server.npcHandler.npcs[i] != null) {
  281. if (Server.npcHandler.npcs[i].isDead || Server.npcHandler.npcs[i].MaxHP <= 0) {
  282. c.usingMagic = false;
  283. c.faceUpdate(0);
  284. c.npcIndex = 0;
  285. return;
  286. }
  287.  
  288. if (c.playerEquipment[c.playerWeapon] == 15241) {
  289. c.gfx0(2138);
  290. }
  291. if(c.playerEquipment[c.playerWeapon] == 15241 && 15243 != c.playerEquipment[c.playerArrows]){
  292. c.sendMessage("You can't use Hand Cannon without the shots! (You dumb?)");
  293. return;
  294. }
  295.  
  296. if (Server.npcHandler.npcs[i].summon == true) {
  297. if(Server.npcHandler.npcs[i].index != c.playerId || c.wildLevel == 0) {
  298. resetPlayerAttack();
  299. c.sendMessage("You cannot attack this monster.");
  300.  
  301. //c.sendMessage("This is "+Server.npcHandler.npcz[i]+" NPC.");
  302. return;
  303. }
  304. }
  305.  
  306.  
  307. if(c.specEffect == 4) {
  308. c.specEffect = 0;
  309. }
  310. if (c.inWG()) {
  311. resetPlayerAttack();
  312. c.stopMovement();
  313. return;
  314. }
  315. if (Server.npcHandler.npcs[i].npcType == 1000 || Server.npcHandler.npcs[i].npcType == 1001 || Server.npcHandler.npcs[i].npcType == 3100 || Server.npcHandler.npcs[i].npcType == 1002 || Server.npcHandler.npcs[i].npcType == 1003) {
  316. resetPlayerAttack();
  317. c.stopMovement();
  318. return; // Bandos
  319. }
  320.  
  321. if (Server.npcHandler.npcs[i].npcType == 3104) {
  322. c.sendMessage("You must click the gate before attacking the Corporeal Beast!");
  323. resetPlayerAttack();
  324. c.stopMovement();
  325. return; // Corporeal beast *fake*
  326. }
  327.  
  328. if (Server.npcHandler.npcs[i].npcType == 1004 || Server.npcHandler.npcs[i].npcType == 1005 || Server.npcHandler.npcs[i].npcType == 1006 || Server.npcHandler.npcs[i].npcType == 1007) {
  329. resetPlayerAttack();
  330. c.stopMovement();
  331. return; // Arma
  332. }
  333. if (Server.npcHandler.npcs[i].npcType == 1008 || Server.npcHandler.npcs[i].npcType == 1009 || Server.npcHandler.npcs[i].npcType == 1010 || Server.npcHandler.npcs[i].npcType == 1011) {
  334. resetPlayerAttack();
  335. c.stopMovement();
  336. return; // Zammy
  337. }
  338. if (Server.npcHandler.npcs[i].npcType == 1012 || Server.npcHandler.npcs[i].npcType == 1013 || Server.npcHandler.npcs[i].npcType == 1014 || Server.npcHandler.npcs[i].npcType == 1015) {
  339. resetPlayerAttack();
  340. c.stopMovement();
  341. return; // Sara
  342. }
  343. if(c.respawnTimer > 0) {
  344. c.npcIndex = 0;
  345. return;
  346. }
  347. if (!goodSlayer(i)) {
  348. resetPlayerAttack();
  349. return;
  350. }
  351. if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0 && Server.npcHandler.npcs[i].summon != true) {
  352. resetPlayerAttack();
  353. c.sendMessage("This monster was not spawned for you.");
  354. return;
  355. }
  356. if(Server.npcHandler.npcs[i].summoner == true) {
  357. c.sendMessage("You cannot attack your own npc idiot.");
  358. resetPlayerAttack();
  359. return;
  360. }
  361. if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
  362. resetPlayerAttack();
  363. c.sendMessage("I am already under attack.");
  364. return;
  365. }
  366. if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.npcs[i].underAttackBy != c.playerId && !Server.npcHandler.npcs[i].inMulti()) {
  367. c.npcIndex = 0;
  368. c.sendMessage("This monster is already in combat.");
  369. return;
  370. }
  371. if (Server.npcHandler.npcs[i].inMulti() && c.lastsummon > 0) {
  372. Server.npcHandler.attackNPC(i, c.summoningnpcid);
  373. }
  374.  
  375.  
  376.  
  377. if (!goodSlayer(i)) {
  378. resetPlayerAttack();
  379. return;
  380. }
  381. if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0) {
  382. resetPlayerAttack();
  383. c.sendMessage("This monster was not spawned for you.");
  384. return;
  385. }
  386. if(c.attackTimer <= 0) {
  387. boolean usingBow = false;
  388. boolean usingArrows = false;
  389. boolean usingOtherRangeWeapons = false;
  390. boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185 || c.playerEquipment[c.playerWeapon] == 18357;
  391. c.bonusAttack = 0;
  392. c.rangeItemUsed = 0;
  393. c.projectileStage = 0;
  394. //c.SaveGame();
  395. if (c.autocasting) {
  396. c.spellId = c.autocastId;
  397. c.usingMagic = true;
  398. }
  399. if(c.spellId > 0) {
  400. c.usingMagic = true;
  401. }
  402. c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  403. c.specAccuracy = 1.0;
  404. c.specDamage = 1.0;
  405. if(!c.usingMagic) {
  406. for (int bowId : c.BOWS) {
  407. if(c.playerEquipment[c.playerWeapon] == bowId) {
  408. usingBow = true;
  409. for (int arrowId : c.ARROWS) {
  410. if(c.playerEquipment[c.playerArrows] == arrowId) {
  411. usingArrows = true;
  412. c.gfx100(getRangeStartGFX());
  413. }
  414. }
  415. }
  416. }
  417.  
  418. for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
  419. if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
  420. usingOtherRangeWeapons = true;
  421. }
  422. }
  423. }
  424.  
  425. c.typeOfDamageMask = getHitType(usingBow || usingOtherRangeWeapons || usingCross, c.usingMagic);
  426. c.typeOfDamageMask2 = getHitType(usingBow || usingOtherRangeWeapons || usingCross, c.usingMagic);
  427.  
  428. if (armaNpc(i) && !usingCross && !usingBow && !c.usingMagic && !usingCrystalBow() && !usingOtherRangeWeapons) {
  429. resetPlayerAttack();
  430. c.sendMessage("You can only Range/Mage Armadyl creeps!");
  431. return;
  432. }
  433. if((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && (usingHally() && !usingOtherRangeWeapons && !usingBow && !usingCross && !c.usingMagic)) ||(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 4) && (usingOtherRangeWeapons && !usingCross && !usingBow && !c.usingMagic)) || (!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1) && (!usingOtherRangeWeapons && !usingHally() && !usingCross && !usingBow && !c.usingMagic)) || ((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 8) && (usingBow || usingCross || c.usingMagic)))) {
  434. c.attackTimer = 2;
  435. return;
  436. }
  437.  
  438. if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
  439. if(c.playerEquipment[c.playerWeapon] == 15241)
  440. c.sendMessage("You have run out of Shots!");
  441. else
  442. c.sendMessage("You have run out of arrows!");
  443. c.stopMovement();
  444. c.npcIndex = 0;
  445. return;
  446. }
  447.  
  448. if(usingBow || usingCross || c.usingMagic || usingOtherRangeWeapons || (c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && usingHally())) {
  449. c.stopMovement();
  450. }
  451.  
  452. if(!checkMagicReqs(c.spellId)) {
  453. c.stopMovement();
  454. c.npcIndex = 0;
  455. return;
  456. }
  457.  
  458. c.faceUpdate(i);
  459. //c.specAccuracy = 1.0;
  460. //c.specDamage = 1.0;
  461. Server.npcHandler.npcs[i].underAttackBy = c.playerId;
  462. Server.npcHandler.npcs[i].lastDamageTaken = System.currentTimeMillis();
  463. if(c.usingSpecial && !c.usingMagic) {
  464. if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
  465. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  466. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  467. activateSpecial(c.playerEquipment[c.playerWeapon], i);
  468. return;
  469. } else {
  470. c.sendMessage("You don't have the required special energy to use this attack.");
  471. c.usingSpecial = false;
  472. c.getItems().updateSpecialBar();
  473. c.npcIndex = 0;
  474. return;
  475. }
  476. }
  477. if(usingBow || c.usingMagic || usingOtherRangeWeapons || c.playerEquipment[c.playerWeapon] == 15241) {
  478. c.mageFollow = true;
  479. } else {
  480. c.mageFollow = false;
  481. }
  482. c.specMaxHitIncrease = 0;
  483. if(!c.usingMagic) {
  484. c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
  485. } else {
  486. c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
  487. }
  488. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  489. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  490. if(!usingBow && !usingCross && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
  491. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  492. c.projectileStage = 0;
  493. c.oldNpcIndex = i;
  494. }
  495.  
  496. if(usingBow && !usingOtherRangeWeapons && !c.usingMagic || usingCross || c.playerEquipment[c.playerWeapon] == 15241) { // range hit delay
  497. if (usingCross)
  498. c.usingBow = true;
  499. if (c.fightMode == 2)
  500. c.attackTimer--;
  501. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  502. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  503. c.gfx100(getRangeStartGFX());
  504. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  505. c.projectileStage = 1;
  506. c.oldNpcIndex = i;
  507. if(c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223) {
  508. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  509. //c.crystalBowArrowCount++;
  510. c.lastArrowUsed = 0;
  511. } else {
  512. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  513. c.getItems().deleteArrow();
  514. }
  515. fireProjectileNpc();
  516. }
  517.  
  518. if(usingBow && usingCross && c.usingMagic && usingOtherRangeWeapons) {
  519. c.getPA().followNpc();
  520. c.stopMovement();
  521. } else {
  522. c.followId = 0;
  523. c.followId2 = i;
  524. }
  525.  
  526.  
  527. if(usingOtherRangeWeapons && !c.usingMagic && !usingCross && !usingBow) { // knives, darts, etc hit delay
  528. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  529. c.getItems().deleteEquipment();
  530. c.gfx100(getRangeStartGFX());
  531. c.lastArrowUsed = 0;
  532. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  533. c.projectileStage = 1;
  534. c.oldNpcIndex = i;
  535. if (c.fightMode == 2)
  536. c.attackTimer--;
  537. fireProjectileNpc();
  538. }
  539.  
  540. if(c.usingMagic) { // magic hit delay
  541. int pX = c.getX();
  542. int pY = c.getY();
  543. int nX = Server.npcHandler.npcs[i].getX();
  544. int nY = Server.npcHandler.npcs[i].getY();
  545. int offX = (pY - nY)* -1;
  546. int offY = (pX - nX)* -1;
  547. c.castingMagic = true;
  548. c.projectileStage = 2;
  549. if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
  550. if(getStartGfxHeight() == 100) {
  551. c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
  552. } else {
  553. c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
  554. }
  555. }
  556. if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
  557. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), i + 1, 50);
  558. }
  559. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  560. c.oldNpcIndex = i;
  561. c.oldSpellId = c.spellId;
  562. c.spellId = 0;
  563. if (!c.autocasting)
  564. c.npcIndex = 0;
  565. }
  566. if(c.curseActive[18]) { // SoulSplit GFX's - CAUSES CRASH
  567. if(c.oldNpcIndex > 0) {
  568. if(Server.npcHandler.npcs[c.oldNpcIndex] != null) {
  569. try {
  570. if(c.curseActive[18] && !c.prayerActive[23] && c.playerLevel[3] <= 99) {
  571. int heal = 1;
  572. if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  573. c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  574. } else {
  575. c.playerLevel[3] += heal;
  576. }
  577. c.getPA().refreshSkill(3);
  578. }
  579. final int pX = c.getX();
  580. final int pY = c.getY();
  581. final int nX = Server.npcHandler.npcs[c.oldNpcIndex].getX();
  582. final int nY = Server.npcHandler.npcs[c.oldNpcIndex].getY();
  583. final int offX = (pY - nY)* -1;
  584. final int offY = (pX - nX)* -1;
  585. c.SSPLIT = true;
  586. c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2263, 9, 9, c.oldNpcIndex + 1, 24, 0);
  587. EventManager.getSingleton().addEvent(new Event() {
  588. public void execute(EventContainer b) {
  589. c.SSPLIT = false;
  590. b.stop();
  591. }
  592. }, 500);
  593. /*EventManager.getSingleton().addEvent(new Event() { // CAUSES CRASH
  594. public void execute(EventContainer b) {
  595. //c.getPA().createPlayersProjectile2(nX, nY, offX, offY, 50, 50, 2263, 9, 9, - c.playerId - 1, 24, 0);
  596. b.stop();
  597. }
  598. }, 800);*/
  599. } catch (Exception e) {
  600. e.printStackTrace();
  601. }
  602. }
  603. }
  604. }
  605.  
  606. if(c.crystalBowArrowCount >= 250){
  607. switch(c.playerEquipment[c.playerWeapon]) {
  608.  
  609. case 4223: // 1/10 bow
  610. c.getItems().wearItem(-1, 1, 3);
  611. c.sendMessage("Your crystal bow has fully degraded.");
  612. if(!c.getItems().addItem(4207, 1)) {
  613. Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
  614. }
  615. c.crystalBowArrowCount = 0;
  616. break;
  617.  
  618. default:
  619. c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
  620. c.sendMessage("Your crystal bow degrades.");
  621. c.crystalBowArrowCount = 0;
  622. break;
  623.  
  624.  
  625. }
  626. }
  627. }
  628. }
  629. }
  630.  
  631.  
  632. public void delayedHit(int i) { // npc hit delay
  633. if (Server.npcHandler.npcs[i] != null) {
  634. if (Server.npcHandler.npcs[i].isDead) {
  635. c.npcIndex = 0;
  636. return;
  637. }
  638. Server.npcHandler.npcs[i].facePlayer(c.playerId);
  639.  
  640. if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.getsPulled(i)) {
  641. Server.npcHandler.npcs[i].killerId = c.playerId;
  642. } else if (Server.npcHandler.npcs[i].underAttackBy < 0 && !Server.npcHandler.getsPulled(i)) {
  643. Server.npcHandler.npcs[i].killerId = c.playerId;
  644. }
  645. c.lastNpcAttacked = i;
  646. if(c.projectileStage == 0 && !c.usingMagic && !c.castingMagic) { // melee hit damage
  647. if (!c.usingClaws)
  648. applyNpcMeleeDamage(i, 1, Misc.random(calculateMeleeMaxHit()));
  649. if(c.doubleHit && !c.usingClaws) {
  650. applyNpcMeleeDamage(i, 2, Misc.random(calculateMeleeMaxHit()));
  651. }
  652. if(c.doubleHit && c.usingClaws) {
  653. c.delayedDamage = c.clawDamage;
  654. c.delayedDamage2 = c.clawDamage/2;
  655. applyNpcMeleeDamage(i, 1, c.clawDamage);
  656. applyNpcMeleeDamage(i, 2, c.clawDamage/2);
  657. }
  658. }
  659.  
  660. if(!c.castingMagic && c.projectileStage > 0) { // range hit damage
  661. int damage = Misc.random(rangeMaxHit());
  662. int damage2 = -1;
  663. if (c.lastWeaponUsed == 14481 || c.lastWeaponUsed == 15704 || c.lastWeaponUsed == 11235 || c.lastWeaponUsed == 15702 || c.lastWeaponUsed == 15701 || c.lastWeaponUsed == 15703 || c.lastWeaponUsed == 14482 || c.lastWeaponUsed == 19143 || c.lastWeaponUsed == 19146 || c.lastWeaponUsed == 19149 || c.bowSpecShot == 1)
  664. damage2 = Misc.random(rangeMaxHit());
  665. boolean ignoreDef = false;
  666. if (Misc.random(5) == 1 && c.lastArrowUsed == 9243 && c.playerEquipment[c.playerWeapon] == 9185) {
  667. ignoreDef = true;
  668. Server.npcHandler.npcs[i].gfx0(758);
  669. }
  670. if (Misc.random(4) == 1 && c.lastArrowUsed == 9245 && c.playerEquipment[c.playerWeapon] == 18357) {
  671. ignoreDef = true;
  672. Server.npcHandler.npcs[i].gfx0(753);
  673. }
  674.  
  675.  
  676. if(Misc.random(Server.npcHandler.npcs[i].defence) > Misc.random(10+calculateRangeAttack()) && !ignoreDef) {
  677. damage = 0;
  678. } else if (Server.npcHandler.npcs[i].npcType == 2881 || Server.npcHandler.npcs[i].npcType == 2883 || Server.npcHandler.npcs[i].npcType == 3340 && !ignoreDef) {
  679. damage = 0;
  680. }
  681.  
  682. if (Misc.random(4) == 1 && c.lastArrowUsed == 9242 && damage > 0 && c.playerEquipment[c.playerWeapon] == 9185 || c.playerEquipment[c.playerWeapon] == 18357) {
  683. damage = Server.npcHandler.npcs[i].HP/5;
  684. //c.handleHitMask(c.playerLevel[3]/10);
  685. }
  686.  
  687.  
  688.  
  689. if (c.lastWeaponUsed == 15701 || c.lastWeaponUsed == 15702 || c.lastWeaponUsed == 11235 || c.lastWeaponUsed == 15703 || c.lastWeaponUsed == 15704 || c.lastWeaponUsed == 19143 || c.lastWeaponUsed == 19146 || c.lastWeaponUsed == 19149 || c.bowSpecS
Add Comment
Please, Sign In to add comment