Advertisement
Guest User

Untitled

a guest
Jan 7th, 2012
26
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 114.11 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.npcs.NPC;
  7.  
  8. public class CombatAssistant{
  9.  
  10. private Client c;
  11. public CombatAssistant(Client Client) {
  12. this.c = Client;
  13. }
  14.  
  15.  
  16. public int[][] slayerReqs = {{1648,5},{1612,15},{1643,45},{1618,50},{1624,65},{1610,75},{1613,80},{1615,85},{2783,90}};
  17.  
  18. public boolean goodSlayer(int i) {
  19. for (int j = 0; j < slayerReqs.length; j++) {
  20. if (slayerReqs[j][0] == Server.npcHandler.npcs[i].npcType) {
  21. if (slayerReqs[j][1] > c.playerLevel[c.playerSlayer]) {
  22. c.sendMessage("You need a slayer level of " + slayerReqs[j][1] + " to harm this NPC.");
  23. return false;
  24. }
  25. }
  26. }
  27. return true;
  28. }
  29.  
  30. /**
  31. * Attack Npcs
  32. */
  33. public void attackNpc(int i) {
  34. if (Server.npcHandler.npcs[i] != null) {
  35. if (Server.npcHandler.npcs[i].isDead || Server.npcHandler.npcs[i].MaxHP <= 0) {
  36. c.usingMagic = false;
  37. c.faceUpdate(0);
  38. c.npcIndex = 0;
  39. return;
  40. }
  41. if(c.respawnTimer > 0) {
  42. c.npcIndex = 0;
  43. return;
  44. }
  45. if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.npcs[i].underAttackBy != c.playerId && !Server.npcHandler.npcs[i].inMulti()) {
  46. c.npcIndex = 0;
  47. c.sendMessage("This monster is already in combat.");
  48. return;
  49. }
  50. if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
  51. resetPlayerAttack();
  52. c.sendMessage("I am already under attack.");
  53. return;
  54. }
  55. if (!goodSlayer(i)) {
  56. resetPlayerAttack();
  57. return;
  58. }
  59. if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0) {
  60. resetPlayerAttack();
  61. c.sendMessage("This monster was not spawned for you.");
  62. return;
  63. }
  64. c.followId2 = i;
  65. c.followId = 0;
  66. if(c.attackTimer <= 0) {
  67. boolean usingBow = false;
  68. boolean usingArrows = false;
  69. boolean usingOtherRangeWeapons = false;
  70. boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185;
  71. c.bonusAttack = 0;
  72. c.rangeItemUsed = 0;
  73. c.projectileStage = 0;
  74. if (c.autocasting) {
  75. c.spellId = c.autocastId;
  76. c.usingMagic = true;
  77. }
  78. if(c.spellId > 0) {
  79. c.usingMagic = true;
  80. }
  81. c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  82. c.specAccuracy = 1.0;
  83. c.specDamage = 1.0;
  84. if(!c.usingMagic) {
  85. for (int bowId : c.BOWS) {
  86. if(c.playerEquipment[c.playerWeapon] == bowId) {
  87. usingBow = true;
  88. for (int arrowId : c.ARROWS) {
  89. if(c.playerEquipment[c.playerArrows] == arrowId) {
  90. usingArrows = true;
  91. }
  92. }
  93. }
  94. }
  95.  
  96. for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
  97. if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
  98. usingOtherRangeWeapons = true;
  99. }
  100. }
  101. }
  102. if (armaNpc(i) && !usingCross && !usingBow && !c.usingMagic && !usingCrystalBow() && !usingOtherRangeWeapons) {
  103. resetPlayerAttack();
  104. return;
  105. }
  106. if((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && (usingHally() && !usingOtherRangeWeapons && !usingBow && !c.usingMagic)) ||(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 4) && (usingOtherRangeWeapons && !usingBow && !c.usingMagic)) || (!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1) && (!usingOtherRangeWeapons && !usingHally() && !usingBow && !c.usingMagic)) || ((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 8) && (usingBow || c.usingMagic)))) {
  107. c.attackTimer = 2;
  108. return;
  109. }
  110.  
  111. if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
  112. c.sendMessage("You have run out of arrows!");
  113. c.stopMovement();
  114. c.npcIndex = 0;
  115. return;
  116. }
  117. if(correctBowAndArrows() < c.playerEquipment[c.playerArrows] && Config.CORRECT_ARROWS && usingBow && !usingCrystalBow() && c.playerEquipment[c.playerWeapon] != 9185) {
  118. c.sendMessage("You can't use "+c.getItems().getItemName(c.playerEquipment[c.playerArrows]).toLowerCase()+"s with a "+c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+".");
  119. c.stopMovement();
  120. c.npcIndex = 0;
  121. return;
  122. }
  123.  
  124.  
  125. if (c.playerEquipment[c.playerWeapon] == 9185 && !properBolts()) {
  126. c.sendMessage("You must use bolts with a crossbow.");
  127. c.stopMovement();
  128. resetPlayerAttack();
  129. return;
  130. }
  131.  
  132. if(usingBow || c.usingMagic || usingOtherRangeWeapons || (c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && usingHally())) {
  133. c.stopMovement();
  134. }
  135.  
  136. if(!checkMagicReqs(c.spellId)) {
  137. c.stopMovement();
  138. c.npcIndex = 0;
  139. return;
  140. }
  141.  
  142. c.faceUpdate(i);
  143. //c.specAccuracy = 1.0;
  144. //c.specDamage = 1.0;
  145. Server.npcHandler.npcs[i].underAttackBy = c.playerId;
  146. Server.npcHandler.npcs[i].lastDamageTaken = System.currentTimeMillis();
  147. if(c.usingSpecial && !c.usingMagic) {
  148. if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
  149. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  150. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  151. activateSpecial(c.playerEquipment[c.playerWeapon], i);
  152. return;
  153. } else {
  154. c.sendMessage("You don't have the required special energy to use this attack.");
  155. c.usingSpecial = false;
  156. c.getItems().updateSpecialBar();
  157. c.npcIndex = 0;
  158. return;
  159. }
  160. }
  161. c.specMaxHitIncrease = 0;
  162. if(!c.usingMagic) {
  163. c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
  164. } else {
  165. c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
  166. }
  167. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  168. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  169. if(!usingBow && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
  170. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  171. c.projectileStage = 0;
  172. c.oldNpcIndex = i;
  173. }
  174.  
  175. if(usingBow && !usingOtherRangeWeapons && !c.usingMagic || usingCross) { // range hit delay
  176. if (usingCross)
  177. c.usingBow = true;
  178. if (c.fightMode == 2)
  179. c.attackTimer--;
  180. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  181. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  182. c.gfx100(getRangeStartGFX());
  183. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  184. c.projectileStage = 1;
  185. c.oldNpcIndex = i;
  186. if(c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223) {
  187. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  188. c.crystalBowArrowCount++;
  189. c.lastArrowUsed = 0;
  190. } else {
  191. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  192. c.getItems().deleteArrow();
  193. }
  194. fireProjectileNpc();
  195. }
  196.  
  197.  
  198. if(usingOtherRangeWeapons && !c.usingMagic && !usingBow) { // knives, darts, etc hit delay
  199. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  200. c.getItems().deleteEquipment();
  201. c.gfx100(getRangeStartGFX());
  202. c.lastArrowUsed = 0;
  203. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  204. c.projectileStage = 1;
  205. c.oldNpcIndex = i;
  206. if (c.fightMode == 2)
  207. c.attackTimer--;
  208. fireProjectileNpc();
  209. }
  210.  
  211. if(c.usingMagic) { // magic hit delay
  212. int pX = c.getX();
  213. int pY = c.getY();
  214. int nX = Server.npcHandler.npcs[i].getX();
  215. int nY = Server.npcHandler.npcs[i].getY();
  216. int offX = (pY - nY)* -1;
  217. int offY = (pX - nX)* -1;
  218. c.castingMagic = true;
  219. c.projectileStage = 2;
  220. if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
  221. if(getStartGfxHeight() == 100) {
  222. c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
  223. } else {
  224. c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
  225. }
  226. }
  227. if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
  228. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), i + 1, 50);
  229. }
  230. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  231. c.oldNpcIndex = i;
  232. c.oldSpellId = c.spellId;
  233. c.spellId = 0;
  234. if (!c.autocasting)
  235. c.npcIndex = 0;
  236. }
  237.  
  238. if(usingBow && Config.CRYSTAL_BOW_DEGRADES) { // crystal bow degrading
  239. if(c.playerEquipment[c.playerWeapon] == 4212) { // new crystal bow becomes full bow on the first shot
  240. c.getItems().wearItem(4214, 1, 3);
  241. }
  242.  
  243. if(c.crystalBowArrowCount >= 250){
  244. switch(c.playerEquipment[c.playerWeapon]) {
  245.  
  246. case 4223: // 1/10 bow
  247. c.getItems().wearItem(-1, 1, 3);
  248. c.sendMessage("Your crystal bow has fully degraded.");
  249. if(!c.getItems().addItem(4207, 1)) {
  250. Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
  251. }
  252. c.crystalBowArrowCount = 0;
  253. break;
  254.  
  255. default:
  256. c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
  257. c.sendMessage("Your crystal bow degrades.");
  258. c.crystalBowArrowCount = 0;
  259. break;
  260.  
  261.  
  262. }
  263. }
  264. }
  265. }
  266. }
  267. }
  268.  
  269.  
  270. public void delayedHit(int i) { // npc hit delay
  271. if (Server.npcHandler.npcs[i] != null) {
  272. if (Server.npcHandler.npcs[i].isDead) {
  273. c.npcIndex = 0;
  274. return;
  275. }
  276. Server.npcHandler.npcs[i].facePlayer(c.playerId);
  277.  
  278. if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.getsPulled(i)) {
  279. Server.npcHandler.npcs[i].killerId = c.playerId;
  280. } else if (Server.npcHandler.npcs[i].underAttackBy < 0 && !Server.npcHandler.getsPulled(i)) {
  281. Server.npcHandler.npcs[i].killerId = c.playerId;
  282. }
  283. c.lastNpcAttacked = i;
  284. if(c.projectileStage == 0) { // melee hit damage
  285. applyNpcMeleeDamage(i, 1);
  286. if(c.doubleHit) {
  287. applyNpcMeleeDamage(i, 2);
  288. }
  289. }
  290.  
  291. if(!c.castingMagic && c.projectileStage > 0) { // range hit damage
  292. int damage = Misc.random(rangeMaxHit());
  293. int damage2 = -1;
  294. if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1)
  295. damage2 = Misc.random(rangeMaxHit());
  296. boolean ignoreDef = false;
  297. if (Misc.random(5) == 1 && c.lastArrowUsed == 9243) {
  298. ignoreDef = true;
  299. Server.npcHandler.npcs[i].gfx0(758);
  300. }
  301.  
  302.  
  303. if(Misc.random(Server.npcHandler.npcs[i].defence) > Misc.random(10+calculateRangeAttack()) && !ignoreDef) {
  304. damage = 0;
  305. } else if (Server.npcHandler.npcs[i].npcType == 2881 || Server.npcHandler.npcs[i].npcType == 2883 && !ignoreDef) {
  306. damage = 0;
  307. }
  308.  
  309. if (Misc.random(4) == 1 && c.lastArrowUsed == 9242 && damage > 0) {
  310. Server.npcHandler.npcs[i].gfx0(754);
  311. damage = Server.npcHandler.npcs[i].HP/5;
  312. c.handleHitMask(c.playerLevel[3]/10);
  313. c.dealDamage(c.playerLevel[3]/10);
  314. c.gfx0(754);
  315. }
  316.  
  317. if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
  318. if (Misc.random(Server.npcHandler.npcs[i].defence) > Misc.random(10+calculateRangeAttack()))
  319. damage2 = 0;
  320. }
  321. if (c.dbowSpec) {
  322. Server.npcHandler.npcs[i].gfx100(1100);
  323. if (damage < 8)
  324. damage = 8;
  325. if (damage2 < 8)
  326. damage2 = 8;
  327. c.dbowSpec = false;
  328. }
  329. if (damage > 0 && Misc.random(5) == 1 && c.lastArrowUsed == 9244) {
  330. damage *= 1.45;
  331. Server.npcHandler.npcs[i].gfx0(756);
  332. }
  333.  
  334. if (Server.npcHandler.npcs[i].HP - damage < 0) {
  335. damage = Server.npcHandler.npcs[i].HP;
  336. }
  337. if (Server.npcHandler.npcs[i].HP - damage <= 0 && damage2 > 0) {
  338. damage2 = 0;
  339. }
  340. if(c.fightMode == 3) {
  341. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 4);
  342. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 1);
  343. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  344. c.getPA().refreshSkill(1);
  345. c.getPA().refreshSkill(3);
  346. c.getPA().refreshSkill(4);
  347. } else {
  348. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE), 4);
  349. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  350. c.getPA().refreshSkill(3);
  351. c.getPA().refreshSkill(4);
  352. }
  353. if (damage > 0) {
  354. if (Server.npcHandler.npcs[i].npcType >= 3777 && Server.npcHandler.npcs[i].npcType <= 3780) {
  355. c.pcDamage += damage;
  356. }
  357. }
  358. boolean dropArrows = true;
  359.  
  360. for(int noArrowId : c.NO_ARROW_DROP) {
  361. if(c.lastWeaponUsed == noArrowId) {
  362. dropArrows = false;
  363. break;
  364. }
  365. }
  366. if(dropArrows) {
  367. c.getItems().dropArrowNpc();
  368. }
  369. Server.npcHandler.npcs[i].underAttack = true;
  370. Server.npcHandler.npcs[i].hitDiff = damage;
  371. Server.npcHandler.npcs[i].HP -= damage;
  372. if (damage2 > -1) {
  373. Server.npcHandler.npcs[i].hitDiff2 = damage2;
  374. Server.npcHandler.npcs[i].HP -= damage2;
  375. c.totalDamageDealt += damage2;
  376. }
  377. if (c.killingNpcIndex != c.oldNpcIndex) {
  378. c.totalDamageDealt = 0;
  379. }
  380. c.killingNpcIndex = c.oldNpcIndex;
  381. c.totalDamageDealt += damage;
  382. Server.npcHandler.npcs[i].hitUpdateRequired = true;
  383. if (damage2 > -1)
  384. Server.npcHandler.npcs[i].hitUpdateRequired2 = true;
  385. Server.npcHandler.npcs[i].updateRequired = true;
  386.  
  387. } else if (c.projectileStage > 0) { // magic hit damage
  388. int damage = Misc.random(c.MAGIC_SPELLS[c.oldSpellId][6]);
  389. if(godSpells()) {
  390. if(System.currentTimeMillis() - c.godSpellDelay < Config.GOD_SPELL_CHARGE) {
  391. damage += Misc.random(10);
  392. }
  393. }
  394. boolean magicFailed = false;
  395. //c.npcIndex = 0;
  396. int bonusAttack = getBonusAttack(i);
  397. if (Misc.random(Server.npcHandler.npcs[i].defence) > 10+ Misc.random(mageAtk()) + bonusAttack) {
  398. damage = 0;
  399. magicFailed = true;
  400. } else if (Server.npcHandler.npcs[i].npcType == 2881 || Server.npcHandler.npcs[i].npcType == 2882) {
  401. damage = 0;
  402. magicFailed = true;
  403. }
  404.  
  405. if (Server.npcHandler.npcs[i].HP - damage < 0) {
  406. damage = Server.npcHandler.npcs[i].HP;
  407. }
  408.  
  409. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  410. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  411. c.getPA().refreshSkill(3);
  412. c.getPA().refreshSkill(6);
  413. if (damage > 0) {
  414. if (Server.npcHandler.npcs[i].npcType >= 3777 && Server.npcHandler.npcs[i].npcType <= 3780) {
  415. c.pcDamage += damage;
  416. }
  417. }
  418. if(getEndGfxHeight() == 100 && !magicFailed){ // end GFX
  419. Server.npcHandler.npcs[i].gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  420. } else if (!magicFailed){
  421. Server.npcHandler.npcs[i].gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  422. }
  423.  
  424. if(magicFailed) {
  425. Server.npcHandler.npcs[i].gfx100(85);
  426. }
  427. if(!magicFailed) {
  428. int freezeDelay = getFreezeTime();//freeze
  429. if(freezeDelay > 0 && Server.npcHandler.npcs[i].freezeTimer == 0) {
  430. Server.npcHandler.npcs[i].freezeTimer = freezeDelay;
  431. }
  432. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  433. case 12901:
  434. case 12919: // blood spells
  435. case 12911:
  436. case 12929:
  437. int heal = Misc.random(damage / 2);
  438. if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  439. c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  440. } else {
  441. c.playerLevel[3] += heal;
  442. }
  443. c.getPA().refreshSkill(3);
  444. break;
  445. }
  446.  
  447. }
  448. Server.npcHandler.npcs[i].underAttack = true;
  449. if(c.MAGIC_SPELLS[c.oldSpellId][6] != 0) {
  450. Server.npcHandler.npcs[i].hitDiff = damage;
  451. Server.npcHandler.npcs[i].HP -= damage;
  452. Server.npcHandler.npcs[i].hitUpdateRequired = true;
  453. c.totalDamageDealt += damage;
  454. }
  455. c.killingNpcIndex = c.oldNpcIndex;
  456. Server.npcHandler.npcs[i].updateRequired = true;
  457. c.usingMagic = false;
  458. c.castingMagic = false;
  459. c.oldSpellId = 0;
  460. }
  461. }
  462.  
  463. if(c.bowSpecShot <= 0) {
  464. c.oldNpcIndex = 0;
  465. c.projectileStage = 0;
  466. c.doubleHit = false;
  467. c.lastWeaponUsed = 0;
  468. c.bowSpecShot = 0;
  469. }
  470. if(c.bowSpecShot >= 2) {
  471. c.bowSpecShot = 0;
  472. //c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  473. }
  474. if(c.bowSpecShot == 1) {
  475. fireProjectileNpc();
  476. c.hitDelay = 2;
  477. c.bowSpecShot = 0;
  478. }
  479. }
  480.  
  481.  
  482. public void applyNpcMeleeDamage(int i, int damageMask) {
  483. int damage = Misc.random(calculateMeleeMaxHit());
  484. boolean fullVeracsEffect = c.getPA().fullVeracs() && Misc.random(3) == 1;
  485. if (Server.npcHandler.npcs[i].HP - damage < 0) {
  486. damage = Server.npcHandler.npcs[i].HP;
  487. }
  488.  
  489. if (!fullVeracsEffect) {
  490. if (Misc.random(Server.npcHandler.npcs[i].defence) > 10 + Misc.random(calculateMeleeAttack())) {
  491. damage = 0;
  492. } else if (Server.npcHandler.npcs[i].npcType == 2882 || Server.npcHandler.npcs[i].npcType == 2883) {
  493. damage = 0;
  494. }
  495. }
  496. boolean guthansEffect = false;
  497. if (c.getPA().fullGuthans()) {
  498. if (Misc.random(3) == 1) {
  499. guthansEffect = true;
  500. }
  501. }
  502. if(c.fightMode == 3) {
  503. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 0);
  504. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 1);
  505. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 2);
  506. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  507. c.getPA().refreshSkill(0);
  508. c.getPA().refreshSkill(1);
  509. c.getPA().refreshSkill(2);
  510. c.getPA().refreshSkill(3);
  511. } else {
  512. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE), c.fightMode);
  513. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  514. c.getPA().refreshSkill(c.fightMode);
  515. c.getPA().refreshSkill(3);
  516. }
  517. if (damage > 0) {
  518. if (Server.npcHandler.npcs[i].npcType >= 3777 && Server.npcHandler.npcs[i].npcType <= 3780) {
  519. c.pcDamage += damage;
  520. }
  521. }
  522. if (damage > 0 && guthansEffect) {
  523. c.playerLevel[3] += damage;
  524. if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]))
  525. c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  526. c.getPA().refreshSkill(3);
  527. Server.npcHandler.npcs[i].gfx0(398);
  528. }
  529. Server.npcHandler.npcs[i].underAttack = true;
  530. //Server.npcHandler.npcs[i].killerId = c.playerId;
  531. c.killingNpcIndex = c.npcIndex;
  532. c.lastNpcAttacked = i;
  533. switch (c.specEffect) {
  534. case 4:
  535. if (damage > 0) {
  536. if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3]))
  537. if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]));
  538. else
  539. c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  540. else
  541. c.playerLevel[3] += damage;
  542. c.getPA().refreshSkill(3);
  543. }
  544. break;
  545.  
  546. }
  547. switch(damageMask) {
  548. case 1:
  549. Server.npcHandler.npcs[i].hitDiff = damage;
  550. Server.npcHandler.npcs[i].HP -= damage;
  551. c.totalDamageDealt += damage;
  552. Server.npcHandler.npcs[i].hitUpdateRequired = true;
  553. Server.npcHandler.npcs[i].updateRequired = true;
  554. break;
  555.  
  556. case 2:
  557. Server.npcHandler.npcs[i].hitDiff2 = damage;
  558. Server.npcHandler.npcs[i].HP -= damage;
  559. c.totalDamageDealt += damage;
  560. Server.npcHandler.npcs[i].hitUpdateRequired2 = true;
  561. Server.npcHandler.npcs[i].updateRequired = true;
  562. c.doubleHit = false;
  563. break;
  564.  
  565. }
  566. }
  567.  
  568. public void fireProjectileNpc() {
  569. if(c.oldNpcIndex > 0) {
  570. if(Server.npcHandler.npcs[c.oldNpcIndex] != null) {
  571. c.projectileStage = 2;
  572. int pX = c.getX();
  573. int pY = c.getY();
  574. int nX = Server.npcHandler.npcs[c.oldNpcIndex].getX();
  575. int nY = Server.npcHandler.npcs[c.oldNpcIndex].getY();
  576. int offX = (pY - nY)* -1;
  577. int offY = (pX - nX)* -1;
  578. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 43, 31, c.oldNpcIndex + 1, getStartDelay());
  579. if (usingDbow())
  580. c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 60, 31, c.oldNpcIndex + 1, getStartDelay(), 35);
  581. }
  582. }
  583. }
  584.  
  585.  
  586.  
  587. /**
  588. * Attack Players, same as npc tbh xD
  589. **/
  590.  
  591. public void attackPlayer(int i) {
  592.  
  593. if (Server.playerHandler.players[i] != null) {
  594.  
  595. if (Server.playerHandler.players[i].isDead) {
  596. resetPlayerAttack();
  597. return;
  598. }
  599.  
  600. if(c.respawnTimer > 0 || Server.playerHandler.players[i].respawnTimer > 0) {
  601. resetPlayerAttack();
  602. return;
  603. }
  604.  
  605. /*if (c.teleTimer > 0 || Server.playerHandler.players[i].teleTimer > 0) {
  606. resetPlayerAttack();
  607. return;
  608. }*/
  609.  
  610. if(!c.getCombat().checkReqs()) {
  611. return;
  612. }
  613.  
  614. if (c.getPA().getWearingAmount() < 4 && c.duelStatus < 1) {
  615. c.sendMessage("You must be wearing at least 4 items to attack someone.");
  616. resetPlayerAttack();
  617. return;
  618. }
  619. boolean sameSpot = c.absX == Server.playerHandler.players[i].getX() && c.absY == Server.playerHandler.players[i].getY();
  620. if(!c.goodDistance(Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), c.getX(), c.getY(), 25) && !sameSpot) {
  621. resetPlayerAttack();
  622. return;
  623. }
  624.  
  625. if(Server.playerHandler.players[i].respawnTimer > 0) {
  626. Server.playerHandler.players[i].playerIndex = 0;
  627. resetPlayerAttack();
  628. return;
  629. }
  630.  
  631. if (Server.playerHandler.players[i].heightLevel != c.heightLevel) {
  632. resetPlayerAttack();
  633. return;
  634. }
  635. //c.sendMessage("Made it here0.");
  636. c.followId = i;
  637. c.followId2 = 0;
  638. if(c.attackTimer <= 0) {
  639. c.usingBow = false;
  640. c.specEffect = 0;
  641. c.usingRangeWeapon = false;
  642. c.rangeItemUsed = 0;
  643. boolean usingBow = false;
  644. boolean usingArrows = false;
  645. boolean usingOtherRangeWeapons = false;
  646. boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185;
  647. c.projectileStage = 0;
  648.  
  649. if (c.absX == Server.playerHandler.players[i].absX && c.absY == Server.playerHandler.players[i].absY) {
  650. if (c.freezeTimer > 0) {
  651. resetPlayerAttack();
  652. return;
  653. }
  654. c.followId = i;
  655. c.attackTimer = 0;
  656. return;
  657. }
  658.  
  659. /*if ((c.inPirateHouse() && !Server.playerHandler.players[i].inPirateHouse()) || (Server.playerHandler.players[i].inPirateHouse() && !c.inPirateHouse())) {
  660. resetPlayerAttack();
  661. return;
  662. }*/
  663. //c.sendMessage("Made it here1.");
  664. if(!c.usingMagic) {
  665. for (int bowId : c.BOWS) {
  666. if(c.playerEquipment[c.playerWeapon] == bowId) {
  667. usingBow = true;
  668. for (int arrowId : c.ARROWS) {
  669. if(c.playerEquipment[c.playerArrows] == arrowId) {
  670. usingArrows = true;
  671. }
  672. }
  673. }
  674. }
  675.  
  676. for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
  677. if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
  678. usingOtherRangeWeapons = true;
  679. }
  680. }
  681. }
  682. if (c.autocasting) {
  683. c.spellId = c.autocastId;
  684. c.usingMagic = true;
  685. }
  686. //c.sendMessage("Made it here2.");
  687. if(c.spellId > 0) {
  688. c.usingMagic = true;
  689. }
  690. c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  691.  
  692. if(c.duelRule[9]){
  693. boolean canUseWeapon = false;
  694. for(int funWeapon: Config.FUN_WEAPONS) {
  695. if(c.playerEquipment[c.playerWeapon] == funWeapon) {
  696. canUseWeapon = true;
  697. }
  698. }
  699. if(!canUseWeapon) {
  700. c.sendMessage("You can only use fun weapons in this duel!");
  701. resetPlayerAttack();
  702. return;
  703. }
  704. }
  705. //c.sendMessage("Made it here3.");
  706. if(c.duelRule[2] && (usingBow || usingOtherRangeWeapons)) {
  707. c.sendMessage("Range has been disabled in this duel!");
  708. return;
  709. }
  710. if(c.duelRule[3] && (!usingBow && !usingOtherRangeWeapons && !c.usingMagic)) {
  711. c.sendMessage("Melee has been disabled in this duel!");
  712. return;
  713. }
  714.  
  715. if(c.duelRule[4] && c.usingMagic) {
  716. c.sendMessage("Magic has been disabled in this duel!");
  717. resetPlayerAttack();
  718. return;
  719. }
  720.  
  721. if((!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 4) && (usingOtherRangeWeapons && !usingBow && !c.usingMagic))
  722. || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 2) && (!usingOtherRangeWeapons && usingHally() && !usingBow && !c.usingMagic))
  723. || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), getRequiredDistance()) && (!usingOtherRangeWeapons && !usingHally() && !usingBow && !c.usingMagic))
  724. || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 10) && (usingBow || c.usingMagic))) {
  725. //c.sendMessage("Setting attack timer to 1");
  726. c.attackTimer = 1;
  727. if (!usingBow && !c.usingMagic && !usingOtherRangeWeapons && c.freezeTimer > 0)
  728. resetPlayerAttack();
  729. return;
  730. }
  731.  
  732. if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223) && !c.usingMagic) {
  733. c.sendMessage("You have run out of arrows!");
  734. c.stopMovement();
  735. resetPlayerAttack();
  736. return;
  737. }
  738. if(correctBowAndArrows() < c.playerEquipment[c.playerArrows] && Config.CORRECT_ARROWS && usingBow && !usingCrystalBow() && c.playerEquipment[c.playerWeapon] != 9185 && !c.usingMagic) {
  739. c.sendMessage("You can't use "+c.getItems().getItemName(c.playerEquipment[c.playerArrows]).toLowerCase()+"s with a "+c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+".");
  740. c.stopMovement();
  741. resetPlayerAttack();
  742. return;
  743. }
  744. if (c.playerEquipment[c.playerWeapon] == 9185 && !properBolts() && !c.usingMagic) {
  745. c.sendMessage("You must use bolts with a crossbow.");
  746. c.stopMovement();
  747. resetPlayerAttack();
  748. return;
  749. }
  750.  
  751.  
  752. if(usingBow || c.usingMagic || usingOtherRangeWeapons || usingHally()) {
  753. c.stopMovement();
  754. }
  755.  
  756. if(!checkMagicReqs(c.spellId)) {
  757. c.stopMovement();
  758. resetPlayerAttack();
  759. return;
  760. }
  761.  
  762. c.faceUpdate(i+32768);
  763.  
  764. if(c.duelStatus != 5) {
  765. if(!c.attackedPlayers.contains(c.playerIndex) && !Server.playerHandler.players[c.playerIndex].attackedPlayers.contains(c.playerId)) {
  766. c.attackedPlayers.add(c.playerIndex);
  767. c.isSkulled = true;
  768. c.skullTimer = Config.SKULL_TIMER;
  769. c.headIconPk = 0;
  770. c.getPA().requestUpdates();
  771. }
  772. }
  773. c.specAccuracy = 1.0;
  774. c.specDamage = 1.0;
  775. c.delayedDamage = c.delayedDamage2 = 0;
  776. if(c.usingSpecial && !c.usingMagic) {
  777. if(c.duelRule[10] && c.duelStatus == 5) {
  778. c.sendMessage("Special attacks have been disabled during this duel!");
  779. c.usingSpecial = false;
  780. c.getItems().updateSpecialBar();
  781. resetPlayerAttack();
  782. return;
  783. }
  784. if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
  785. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  786. activateSpecial(c.playerEquipment[c.playerWeapon], i);
  787. c.followId = c.playerIndex;
  788. return;
  789. } else {
  790. c.sendMessage("You don't have the required special energy to use this attack.");
  791. c.usingSpecial = false;
  792. c.getItems().updateSpecialBar();
  793. c.playerIndex = 0;
  794. return;
  795. }
  796. }
  797.  
  798. if(!c.usingMagic) {
  799. c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
  800. c.mageFollow = false;
  801. } else {
  802. c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
  803. c.mageFollow = true;
  804. c.followId = c.playerIndex;
  805. }
  806. Server.playerHandler.players[i].underAttackBy = c.playerId;
  807. Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  808. Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  809. Server.playerHandler.players[i].killerId = c.playerId;
  810. c.lastArrowUsed = 0;
  811. c.rangeItemUsed = 0;
  812. if(!usingBow && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
  813. c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  814. c.getPA().followPlayer();
  815. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  816. c.delayedDamage = Misc.random(calculateMeleeMaxHit());
  817. c.projectileStage = 0;
  818. c.oldPlayerIndex = i;
  819. }
  820.  
  821. if(usingBow && !usingOtherRangeWeapons && !c.usingMagic || usingCross) { // range hit delay
  822. if(c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223) {
  823. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  824. c.crystalBowArrowCount++;
  825. } else {
  826. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  827. c.getItems().deleteArrow();
  828. }
  829. if (c.fightMode == 2)
  830. c.attackTimer--;
  831. if (usingCross)
  832. c.usingBow = true;
  833. c.usingBow = true;
  834. c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  835. c.getPA().followPlayer();
  836. c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  837. c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  838. c.gfx100(getRangeStartGFX());
  839. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  840. c.projectileStage = 1;
  841. c.oldPlayerIndex = i;
  842. fireProjectilePlayer();
  843. }
  844.  
  845. if(usingOtherRangeWeapons) { // knives, darts, etc hit delay
  846. c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  847. c.getItems().deleteEquipment();
  848. c.usingRangeWeapon = true;
  849. c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  850. c.getPA().followPlayer();
  851. c.gfx100(getRangeStartGFX());
  852. if (c.fightMode == 2)
  853. c.attackTimer--;
  854. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  855. c.projectileStage = 1;
  856. c.oldPlayerIndex = i;
  857. fireProjectilePlayer();
  858. }
  859.  
  860. if(c.usingMagic) { // magic hit delay
  861. int pX = c.getX();
  862. int pY = c.getY();
  863. int nX = Server.playerHandler.players[i].getX();
  864. int nY = Server.playerHandler.players[i].getY();
  865. int offX = (pY - nY)* -1;
  866. int offY = (pX - nX)* -1;
  867. c.castingMagic = true;
  868. c.projectileStage = 2;
  869. if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
  870. if(getStartGfxHeight() == 100) {
  871. c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
  872. } else {
  873. c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
  874. }
  875. }
  876. if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
  877. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), -i - 1, getStartDelay());
  878. }
  879. if (c.autocastId > 0) {
  880. c.followId = c.playerIndex;
  881. c.followDistance = 5;
  882. }
  883. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  884. c.oldPlayerIndex = i;
  885. c.oldSpellId = c.spellId;
  886. c.spellId = 0;
  887. Client o = (Client)Server.playerHandler.players[i];
  888. if(c.MAGIC_SPELLS[c.oldSpellId][0] == 12891 && o.isMoving) {
  889. //c.sendMessage("Barrage projectile..");
  890. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 85, 368, 25, 25, -i - 1, getStartDelay());
  891. }
  892. if(Misc.random(o.getCombat().mageDef()) > Misc.random(mageAtk())) {
  893. c.magicFailed = true;
  894. } else {
  895. c.magicFailed = false;
  896. }
  897. int freezeDelay = getFreezeTime();//freeze time
  898. if(freezeDelay > 0 && Server.playerHandler.players[i].freezeTimer <= -3 && !c.magicFailed) {
  899. Server.playerHandler.players[i].freezeTimer = freezeDelay;
  900. o.resetWalkingQueue();
  901. o.sendMessage("You have been frozen.");
  902. o.frozenBy = c.playerId;
  903. }
  904. if (!c.autocasting && c.spellId <= 0)
  905. c.playerIndex = 0;
  906. }
  907.  
  908. if(usingBow && Config.CRYSTAL_BOW_DEGRADES) { // crystal bow degrading
  909. if(c.playerEquipment[c.playerWeapon] == 4212) { // new crystal bow becomes full bow on the first shot
  910. c.getItems().wearItem(4214, 1, 3);
  911. }
  912.  
  913. if(c.crystalBowArrowCount >= 250){
  914. switch(c.playerEquipment[c.playerWeapon]) {
  915.  
  916. case 4223: // 1/10 bow
  917. c.getItems().wearItem(-1, 1, 3);
  918. c.sendMessage("Your crystal bow has fully degraded.");
  919. if(!c.getItems().addItem(4207, 1)) {
  920. Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
  921. }
  922. c.crystalBowArrowCount = 0;
  923. break;
  924.  
  925. default:
  926. c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
  927. c.sendMessage("Your crystal bow degrades.");
  928. c.crystalBowArrowCount = 0;
  929. break;
  930. }
  931. }
  932. }
  933. }
  934. }
  935. }
  936.  
  937. public boolean usingCrystalBow() {
  938. return c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223;
  939. }
  940.  
  941. public void appendVengeance(int otherPlayer, int damage) {
  942. if (damage <= 0)
  943. return;
  944. Player o = Server.playerHandler.players[otherPlayer];
  945. o.forcedText = "Taste Vengeance!";
  946. o.forcedChatUpdateRequired = true;
  947. o.updateRequired = true;
  948. o.vengOn = false;
  949. if ((o.playerLevel[3] - damage) > 0) {
  950. damage = (int)(damage * 0.75);
  951. if (damage > c.playerLevel[3]) {
  952. damage = c.playerLevel[3];
  953. }
  954. c.setHitDiff2(damage);
  955. c.setHitUpdateRequired2(true);
  956. c.playerLevel[3] -= damage;
  957. c.getPA().refreshSkill(3);
  958. }
  959. c.updateRequired = true;
  960. }
  961.  
  962. public void playerDelayedHit(int i) {
  963. if (Server.playerHandler.players[i] != null) {
  964. if (Server.playerHandler.players[i].isDead || c.isDead || Server.playerHandler.players[i].playerLevel[3] <= 0 || c.playerLevel[3] <= 0) {
  965. c.playerIndex = 0;
  966. return;
  967. }
  968. if (Server.playerHandler.players[i].respawnTimer > 0) {
  969. c.faceUpdate(0);
  970. c.playerIndex = 0;
  971. return;
  972. }
  973. Client o = (Client) Server.playerHandler.players[i];
  974. o.getPA().removeAllWindows();
  975. if (o.playerIndex <= 0 && o.npcIndex <= 0) {
  976. if (o.autoRet == 1) {
  977. o.playerIndex = c.playerId;
  978. }
  979. }
  980. if(o.attackTimer <= 3 || o.attackTimer == 0 && o.playerIndex == 0 && !c.castingMagic) { // block animation
  981. o.startAnimation(o.getCombat().getBlockEmote());
  982. }
  983. if(o.inTrade) {
  984. o.getTradeAndDuel().declineTrade();
  985. }
  986. if(c.projectileStage == 0) { // melee hit damage
  987. applyPlayerMeleeDamage(i, 1);
  988. if(c.doubleHit) {
  989. applyPlayerMeleeDamage(i, 2);
  990. }
  991. }
  992.  
  993. if(!c.castingMagic && c.projectileStage > 0) { // range hit damage
  994. int damage = Misc.random(rangeMaxHit());
  995. int damage2 = -1;
  996. if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1)
  997. damage2 = Misc.random(rangeMaxHit());
  998. boolean ignoreDef = false;
  999. if (Misc.random(4) == 1 && c.lastArrowUsed == 9243) {
  1000. ignoreDef = true;
  1001. o.gfx0(758);
  1002. }
  1003. if(Misc.random(10+o.getCombat().calculateRangeDefence()) > Misc.random(10+calculateRangeAttack()) && !ignoreDef) {
  1004. damage = 0;
  1005. }
  1006. if (Misc.random(4) == 1 && c.lastArrowUsed == 9242 && damage > 0) {
  1007. Server.playerHandler.players[i].gfx0(754);
  1008. damage = Server.npcHandler.npcs[i].HP/5;
  1009. c.handleHitMask(c.playerLevel[3]/10);
  1010. c.dealDamage(c.playerLevel[3]/10);
  1011. c.gfx0(754);
  1012. }
  1013.  
  1014. if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
  1015. if (Misc.random(10+o.getCombat().calculateRangeDefence()) > Misc.random(10+calculateRangeAttack()))
  1016. damage2 = 0;
  1017. }
  1018.  
  1019. if (c.dbowSpec) {
  1020. o.gfx100(1100);
  1021. if (damage < 8)
  1022. damage = 8;
  1023. if (damage2 < 8)
  1024. damage2 = 8;
  1025. c.dbowSpec = false;
  1026. }
  1027. if (damage > 0 && Misc.random(5) == 1 && c.lastArrowUsed == 9244) {
  1028. damage *= 1.45;
  1029. o.gfx0(756);
  1030. }
  1031. if(o.prayerActive[17] && System.currentTimeMillis() - o.protRangeDelay > 1500) { // if prayer active reduce damage by half
  1032. damage = (int)damage * 60 / 100;
  1033. if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1)
  1034. damage2 = (int)damage2 * 60 / 100;
  1035. }
  1036. if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  1037. damage = Server.playerHandler.players[i].playerLevel[3];
  1038. }
  1039. if (Server.playerHandler.players[i].playerLevel[3] - damage - damage2 < 0) {
  1040. damage2 = Server.playerHandler.players[i].playerLevel[3] - damage;
  1041. }
  1042. if (damage < 0)
  1043. damage = 0;
  1044. if (damage2 < 0 && damage2 != -1)
  1045. damage2 = 0;
  1046. if (o.vengOn) {
  1047. appendVengeance(i, damage);
  1048. appendVengeance(i, damage2);
  1049. }
  1050. if (damage > 0)
  1051. applyRecoil(damage, i);
  1052. if (damage2 > 0)
  1053. applyRecoil(damage2, i);
  1054. if(c.fightMode == 3) {
  1055. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 4);
  1056. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 1);
  1057. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  1058. c.getPA().refreshSkill(1);
  1059. c.getPA().refreshSkill(3);
  1060. c.getPA().refreshSkill(4);
  1061. } else {
  1062. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE), 4);
  1063. c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  1064. c.getPA().refreshSkill(3);
  1065. c.getPA().refreshSkill(4);
  1066. }
  1067. boolean dropArrows = true;
  1068.  
  1069. for(int noArrowId : c.NO_ARROW_DROP) {
  1070. if(c.lastWeaponUsed == noArrowId) {
  1071. dropArrows = false;
  1072. break;
  1073. }
  1074. }
  1075. if(dropArrows) {
  1076. c.getItems().dropArrowPlayer();
  1077. }
  1078. Server.playerHandler.players[i].underAttackBy = c.playerId;
  1079. Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1080. Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1081. Server.playerHandler.players[i].killerId = c.playerId;
  1082. //Server.playerHandler.players[i].setHitDiff(damage);
  1083. //Server.playerHandler.players[i].playerLevel[3] -= damage;
  1084. Server.playerHandler.players[i].dealDamage(damage);
  1085. Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  1086. c.killedBy = Server.playerHandler.players[i].playerId;
  1087. Server.playerHandler.players[i].handleHitMask(damage);
  1088. if (damage2 != -1) {
  1089. //Server.playerHandler.players[i].playerLevel[3] -= damage2;
  1090. Server.playerHandler.players[i].dealDamage(damage2);
  1091. Server.playerHandler.players[i].damageTaken[c.playerId] += damage2;
  1092. Server.playerHandler.players[i].handleHitMask(damage2);
  1093.  
  1094. }
  1095. o.getPA().refreshSkill(3);
  1096.  
  1097. //Server.playerHandler.players[i].setHitUpdateRequired(true);
  1098. Server.playerHandler.players[i].updateRequired = true;
  1099. applySmite(i, damage);
  1100. if (damage2 != -1)
  1101. applySmite(i, damage2);
  1102.  
  1103. } else if (c.projectileStage > 0) { // magic hit damage
  1104. int damage = Misc.random(c.MAGIC_SPELLS[c.oldSpellId][6]);
  1105. if(godSpells()) {
  1106. if(System.currentTimeMillis() - c.godSpellDelay < Config.GOD_SPELL_CHARGE) {
  1107. damage += 10;
  1108. }
  1109. }
  1110. //c.playerIndex = 0;
  1111. if (c.magicFailed)
  1112. damage = 0;
  1113.  
  1114. if(o.prayerActive[16] && System.currentTimeMillis() - o.protMageDelay > 1500) { // if prayer active reduce damage by half
  1115. damage = (int)damage * 60 / 100;
  1116. }
  1117. if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  1118. damage = Server.playerHandler.players[i].playerLevel[3];
  1119. }
  1120. if (o.vengOn)
  1121. appendVengeance(i, damage);
  1122. if (damage > 0)
  1123. applyRecoil(damage, i);
  1124. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  1125. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  1126. c.getPA().refreshSkill(3);
  1127. c.getPA().refreshSkill(6);
  1128.  
  1129. if(getEndGfxHeight() == 100 && !c.magicFailed){ // end GFX
  1130. Server.playerHandler.players[i].gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1131. } else if (!c.magicFailed){
  1132. Server.playerHandler.players[i].gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1133. } else if(c.magicFailed) {
  1134. Server.playerHandler.players[i].gfx100(85);
  1135. }
  1136.  
  1137. if(!c.magicFailed) {
  1138. if(System.currentTimeMillis() - Server.playerHandler.players[i].reduceStat > 35000) {
  1139. Server.playerHandler.players[i].reduceStat = System.currentTimeMillis();
  1140. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  1141. case 12987:
  1142. case 13011:
  1143. case 12999:
  1144. case 13023:
  1145. Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 10) / 100);
  1146. break;
  1147. }
  1148. }
  1149.  
  1150. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  1151. case 12445: //teleblock
  1152. if (System.currentTimeMillis() - o.teleBlockDelay > o.teleBlockLength) {
  1153. o.teleBlockDelay = System.currentTimeMillis();
  1154. o.sendMessage("You have been teleblocked.");
  1155. if (o.prayerActive[16] && System.currentTimeMillis() - o.protMageDelay > 1500)
  1156. o.teleBlockLength = 150000;
  1157. else
  1158. o.teleBlockLength = 300000;
  1159. }
  1160. break;
  1161.  
  1162. case 12901:
  1163. case 12919: // blood spells
  1164. case 12911:
  1165. case 12929:
  1166. int heal = (int)(damage / 4);
  1167. if(c.playerLevel[3] + heal > c.getPA().getLevelForXP(c.playerXP[3])) {
  1168. c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  1169. } else {
  1170. c.playerLevel[3] += heal;
  1171. }
  1172. c.getPA().refreshSkill(3);
  1173. break;
  1174.  
  1175. case 1153:
  1176. Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 5) / 100);
  1177. o.sendMessage("Your attack level has been reduced!");
  1178. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1179. o.getPA().refreshSkill(0);
  1180. break;
  1181.  
  1182. case 1157:
  1183. Server.playerHandler.players[i].playerLevel[2] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[2]) * 5) / 100);
  1184. o.sendMessage("Your strength level has been reduced!");
  1185. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1186. o.getPA().refreshSkill(2);
  1187. break;
  1188.  
  1189. case 1161:
  1190. Server.playerHandler.players[i].playerLevel[1] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[1]) * 5) / 100);
  1191. o.sendMessage("Your defence level has been reduced!");
  1192. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1193. o.getPA().refreshSkill(1);
  1194. break;
  1195.  
  1196. case 1542:
  1197. Server.playerHandler.players[i].playerLevel[1] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[1]) * 10) / 100);
  1198. o.sendMessage("Your defence level has been reduced!");
  1199. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1200. o.getPA().refreshSkill(1);
  1201. break;
  1202.  
  1203. case 1543:
  1204. Server.playerHandler.players[i].playerLevel[2] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[2]) * 10) / 100);
  1205. o.sendMessage("Your strength level has been reduced!");
  1206. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1207. o.getPA().refreshSkill(2);
  1208. break;
  1209.  
  1210. case 1562:
  1211. Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 10) / 100);
  1212. o.sendMessage("Your attack level has been reduced!");
  1213. Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1214. o.getPA().refreshSkill(0);
  1215. break;
  1216. }
  1217. }
  1218.  
  1219. Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1220. Server.playerHandler.players[i].underAttackBy = c.playerId;
  1221. Server.playerHandler.players[i].killerId = c.playerId;
  1222. Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1223. if(c.MAGIC_SPELLS[c.oldSpellId][6] != 0) {
  1224. //Server.playerHandler.players[i].playerLevel[3] -= damage;
  1225. Server.playerHandler.players[i].dealDamage(damage);
  1226. Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  1227. c.totalPlayerDamageDealt += damage;
  1228. if (!c.magicFailed) {
  1229. //Server.playerHandler.players[i].setHitDiff(damage);
  1230. //Server.playerHandler.players[i].setHitUpdateRequired(true);
  1231. Server.playerHandler.players[i].handleHitMask(damage);
  1232. }
  1233. }
  1234. applySmite(i, damage);
  1235. c.killedBy = Server.playerHandler.players[i].playerId;
  1236. o.getPA().refreshSkill(3);
  1237. Server.playerHandler.players[i].updateRequired = true;
  1238. c.usingMagic = false;
  1239. c.castingMagic = false;
  1240. if (o.inMulti() && multis()) {
  1241. c.barrageCount = 0;
  1242. for (int j = 0; j < Server.playerHandler.players.length; j++) {
  1243. if (Server.playerHandler.players[j] != null) {
  1244. if (j == o.playerId)
  1245. continue;
  1246. if (c.barrageCount >= 9)
  1247. break;
  1248. if (o.goodDistance(o.getX(), o.getY(), Server.playerHandler.players[j].getX(), Server.playerHandler.players[j].getY(), 1))
  1249. appendMultiBarrage(j, c.magicFailed);
  1250. }
  1251. }
  1252. }
  1253. c.getPA().refreshSkill(3);
  1254. c.getPA().refreshSkill(6);
  1255. c.oldSpellId = 0;
  1256. }
  1257. }
  1258. c.getPA().requestUpdates();
  1259. int oldindex = c.oldPlayerIndex;
  1260. if(c.bowSpecShot <= 0) {
  1261. c.oldPlayerIndex = 0;
  1262. c.projectileStage = 0;
  1263. c.lastWeaponUsed = 0;
  1264. c.doubleHit = false;
  1265. c.bowSpecShot = 0;
  1266. }
  1267. if(c.bowSpecShot != 0) {
  1268. c.bowSpecShot = 0;
  1269. }
  1270. }
  1271.  
  1272. public boolean multis() {
  1273. switch (c.MAGIC_SPELLS[c.oldSpellId][0]) {
  1274. case 12891:
  1275. case 12881:
  1276. case 13011:
  1277. case 13023:
  1278. case 12919: // blood spells
  1279. case 12929:
  1280. case 12963:
  1281. case 12975:
  1282. return true;
  1283. }
  1284. return false;
  1285.  
  1286. }
  1287. public void appendMultiBarrage(int playerId, boolean splashed) {
  1288. if (Server.playerHandler.players[playerId] != null) {
  1289. Client c2 = (Client)Server.playerHandler.players[playerId];
  1290. if (c2.isDead || c2.respawnTimer > 0)
  1291. return;
  1292. if (checkMultiBarrageReqs(playerId)) {
  1293. c.barrageCount++;
  1294. if (Misc.random(mageAtk()) > Misc.random(mageDef()) && !c.magicFailed) {
  1295. if(getEndGfxHeight() == 100){ // end GFX
  1296. c2.gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1297. } else {
  1298. c2.gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1299. }
  1300. int damage = Misc.random(c.MAGIC_SPELLS[c.oldSpellId][6]);
  1301. if (c2.prayerActive[12]) {
  1302. damage *= (int)(.60);
  1303. }
  1304. if (c2.playerLevel[3] - damage < 0) {
  1305. damage = c2.playerLevel[3];
  1306. }
  1307. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  1308. c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  1309. //Server.playerHandler.players[playerId].setHitDiff(damage);
  1310. //Server.playerHandler.players[playerId].setHitUpdateRequired(true);
  1311. Server.playerHandler.players[playerId].handleHitMask(damage);
  1312. //Server.playerHandler.players[playerId].playerLevel[3] -= damage;
  1313. Server.playerHandler.players[playerId].dealDamage(damage);
  1314. Server.playerHandler.players[playerId].damageTaken[c.playerId] += damage;
  1315. c2.getPA().refreshSkill(3);
  1316. c.totalPlayerDamageDealt += damage;
  1317. multiSpellEffect(playerId, damage);
  1318. } else {
  1319. c2.gfx100(85);
  1320. }
  1321. }
  1322. }
  1323. }
  1324.  
  1325. public void multiSpellEffect(int playerId, int damage) {
  1326. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  1327. case 13011:
  1328. case 13023:
  1329. if(System.currentTimeMillis() - Server.playerHandler.players[playerId].reduceStat > 35000) {
  1330. Server.playerHandler.players[playerId].reduceStat = System.currentTimeMillis();
  1331. Server.playerHandler.players[playerId].playerLevel[0] -= ((Server.playerHandler.players[playerId].getLevelForXP(Server.playerHandler.players[playerId].playerXP[0]) * 10) / 100);
  1332. }
  1333. break;
  1334. case 12919: // blood spells
  1335. case 12929:
  1336. int heal = (int)(damage / 4);
  1337. if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  1338. c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  1339. } else {
  1340. c.playerLevel[3] += heal;
  1341. }
  1342. c.getPA().refreshSkill(3);
  1343. break;
  1344. case 12891:
  1345. case 12881:
  1346. if (Server.playerHandler.players[playerId].freezeTimer < -4) {
  1347. Server.playerHandler.players[playerId].freezeTimer = getFreezeTime();
  1348. Server.playerHandler.players[playerId].stopMovement();
  1349. }
  1350. break;
  1351. }
  1352. }
  1353.  
  1354. public void applyPlayerMeleeDamage(int i, int damageMask){
  1355. Client o = (Client) Server.playerHandler.players[i];
  1356. if(o == null) {
  1357. return;
  1358. }
  1359. int damage = 0;
  1360. boolean veracsEffect = false;
  1361. boolean guthansEffect = false;
  1362. if (c.getPA().fullVeracs()) {
  1363. if (Misc.random(4) == 1) {
  1364. veracsEffect = true;
  1365. }
  1366. }
  1367. if (c.getPA().fullGuthans()) {
  1368. if (Misc.random(4) == 1) {
  1369. guthansEffect = true;
  1370. }
  1371. }
  1372. if (damageMask == 1) {
  1373. damage = c.delayedDamage;
  1374. c.delayedDamage = 0;
  1375. } else {
  1376. damage = c.delayedDamage2;
  1377. c.delayedDamage2 = 0;
  1378. }
  1379. if(Misc.random(o.getCombat().calculateMeleeDefence()) > Misc.random(calculateMeleeAttack()) && !veracsEffect) {
  1380. damage = 0;
  1381. c.bonusAttack = 0;
  1382. } else if (c.playerEquipment[c.playerWeapon] == 5698 && o.poisonDamage <= 0 && Misc.random(3) == 1) {
  1383. o.getPA().appendPoison(13);
  1384. c.bonusAttack += damage/3;
  1385. } else {
  1386. c.bonusAttack += damage/3;
  1387. }
  1388. if(o.prayerActive[18] && System.currentTimeMillis() - o.protMeleeDelay > 1500 && !veracsEffect) { // if prayer active reduce damage by 40%
  1389. damage = (int)damage * 60 / 100;
  1390. }
  1391. if (c.maxNextHit) {
  1392. damage = calculateMeleeMaxHit();
  1393. }
  1394. if (damage > 0 && guthansEffect) {
  1395. c.playerLevel[3] += damage;
  1396. if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]))
  1397. c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  1398. c.getPA().refreshSkill(3);
  1399. o.gfx0(398);
  1400. }
  1401. if (c.ssSpec && damageMask == 2) {
  1402. damage = 5 + Misc.random(11);
  1403. c.ssSpec = false;
  1404. }
  1405. if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  1406. damage = Server.playerHandler.players[i].playerLevel[3];
  1407. }
  1408. if (o.vengOn && damage > 0)
  1409. appendVengeance(i, damage);
  1410. if (damage > 0)
  1411. applyRecoil(damage, i);
  1412. switch(c.specEffect) {
  1413. case 1: // dragon scimmy special
  1414. if(damage > 0) {
  1415. if(o.prayerActive[16] || o.prayerActive[17] || o.prayerActive[18]) {
  1416. o.headIcon = -1;
  1417. o.getPA().sendFrame36(c.PRAYER_GLOW[16], 0);
  1418. o.getPA().sendFrame36(c.PRAYER_GLOW[17], 0);
  1419. o.getPA().sendFrame36(c.PRAYER_GLOW[18], 0);
  1420. }
  1421. o.sendMessage("You have been injured!");
  1422. o.stopPrayerDelay = System.currentTimeMillis();
  1423. o.prayerActive[16] = false;
  1424. o.prayerActive[17] = false;
  1425. o.prayerActive[18] = false;
  1426. o.getPA().requestUpdates();
  1427. }
  1428. break;
  1429. case 2:
  1430. if (damage > 0) {
  1431. if (o.freezeTimer <= 0)
  1432. o.freezeTimer = 30;
  1433. o.gfx0(369);
  1434. o.sendMessage("You have been frozen.");
  1435. o.frozenBy = c.playerId;
  1436. o.stopMovement();
  1437. c.sendMessage("You freeze your enemy.");
  1438. }
  1439. break;
  1440. case 3:
  1441. if (damage > 0) {
  1442. o.playerLevel[1] -= damage;
  1443. o.sendMessage("You feel weak.");
  1444. if (o.playerLevel[1] < 1)
  1445. o.playerLevel[1] = 1;
  1446. o.getPA().refreshSkill(1);
  1447. }
  1448. break;
  1449. case 4:
  1450. if (damage > 0) {
  1451. if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3]))
  1452. if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]));
  1453. else
  1454. c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  1455. else
  1456. c.playerLevel[3] += damage;
  1457. c.getPA().refreshSkill(3);
  1458. }
  1459. break;
  1460. }
  1461. c.specEffect = 0;
  1462. if(c.fightMode == 3) {
  1463. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 0);
  1464. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 1);
  1465. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 2);
  1466. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  1467. c.getPA().refreshSkill(0);
  1468. c.getPA().refreshSkill(1);
  1469. c.getPA().refreshSkill(2);
  1470. c.getPA().refreshSkill(3);
  1471. } else {
  1472. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE), c.fightMode);
  1473. c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  1474. c.getPA().refreshSkill(c.fightMode);
  1475. c.getPA().refreshSkill(3);
  1476. }
  1477. Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1478. Server.playerHandler.players[i].underAttackBy = c.playerId;
  1479. Server.playerHandler.players[i].killerId = c.playerId;
  1480. Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1481. if (c.killedBy != Server.playerHandler.players[i].playerId)
  1482. c.totalPlayerDamageDealt = 0;
  1483. c.killedBy = Server.playerHandler.players[i].playerId;
  1484. applySmite(i, damage);
  1485. switch(damageMask) {
  1486. case 1:
  1487. /*if (!Server.playerHandler.players[i].getHitUpdateRequired()){
  1488. Server.playerHandler.players[i].setHitDiff(damage);
  1489. Server.playerHandler.players[i].setHitUpdateRequired(true);
  1490. } else {
  1491. Server.playerHandler.players[i].setHitDiff2(damage);
  1492. Server.playerHandler.players[i].setHitUpdateRequired2(true);
  1493. }*/
  1494. //Server.playerHandler.players[i].playerLevel[3] -= damage;
  1495. Server.playerHandler.players[i].dealDamage(damage);
  1496. Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  1497. c.totalPlayerDamageDealt += damage;
  1498. Server.playerHandler.players[i].updateRequired = true;
  1499. o.getPA().refreshSkill(3);
  1500. break;
  1501.  
  1502. case 2:
  1503. /*if (!Server.playerHandler.players[i].getHitUpdateRequired2()){
  1504. Server.playerHandler.players[i].setHitDiff2(damage);
  1505. Server.playerHandler.players[i].setHitUpdateRequired2(true);
  1506. } else {
  1507. Server.playerHandler.players[i].setHitDiff(damage);
  1508. Server.playerHandler.players[i].setHitUpdateRequired(true);
  1509. }*/
  1510. //Server.playerHandler.players[i].playerLevel[3] -= damage;
  1511. Server.playerHandler.players[i].dealDamage(damage);
  1512. Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  1513. c.totalPlayerDamageDealt += damage;
  1514. Server.playerHandler.players[i].updateRequired = true;
  1515. c.doubleHit = false;
  1516. o.getPA().refreshSkill(3);
  1517. break;
  1518. }
  1519. Server.playerHandler.players[i].handleHitMask(damage);
  1520. }
  1521.  
  1522. public void applySmite(int index, int damage) {
  1523. if (!c.prayerActive[23])
  1524. return;
  1525. if (damage <= 0)
  1526. return;
  1527. if (Server.playerHandler.players[index] != null) {
  1528. Client c2 = (Client)Server.playerHandler.players[index];
  1529. c2.playerLevel[5] -= (int)(damage/4);
  1530. if (c2.playerLevel[5] <= 0) {
  1531. c2.playerLevel[5] = 0;
  1532. c2.getCombat().resetPrayers();
  1533. }
  1534. c2.getPA().refreshSkill(5);
  1535. }
  1536.  
  1537. }
  1538.  
  1539. public void fireProjectilePlayer() {
  1540. if(c.oldPlayerIndex > 0) {
  1541. if(Server.playerHandler.players[c.oldPlayerIndex] != null) {
  1542. c.projectileStage = 2;
  1543. int pX = c.getX();
  1544. int pY = c.getY();
  1545. int oX = Server.playerHandler.players[c.oldPlayerIndex].getX();
  1546. int oY = Server.playerHandler.players[c.oldPlayerIndex].getY();
  1547. int offX = (pY - oY)* -1;
  1548. int offY = (pX - oX)* -1;
  1549. if (!c.msbSpec)
  1550. c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 43, 31, - c.oldPlayerIndex - 1, getStartDelay());
  1551. else if (c.msbSpec) {
  1552. c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 43, 31, - c.oldPlayerIndex - 1, getStartDelay(), 10);
  1553. c.msbSpec = false;
  1554. }
  1555. if (usingDbow())
  1556. c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 60, 31, - c.oldPlayerIndex - 1, getStartDelay(), 35);
  1557. }
  1558. }
  1559. }
  1560.  
  1561. public boolean usingDbow() {
  1562. return c.playerEquipment[c.playerWeapon] == 11235;
  1563. }
  1564.  
  1565.  
  1566.  
  1567.  
  1568.  
  1569. /**Prayer**/
  1570.  
  1571. public void activatePrayer(int i) {
  1572. if(c.duelRule[7]){
  1573. for(int p = 0; p < c.PRAYER.length; p++) { // reset prayer glows
  1574. c.prayerActive[p] = false;
  1575. c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);
  1576. }
  1577. c.sendMessage("Prayer has been disabled in this duel!");
  1578. return;
  1579. }
  1580. if (i == 24 && c.playerLevel[1] < 65) {
  1581. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  1582. c.sendMessage("You may not use this prayer yet.");
  1583. return;
  1584. }
  1585. if (i == 25 && c.playerLevel[1] < 70) {
  1586. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  1587. c.sendMessage("You may not use this prayer yet.");
  1588. return;
  1589. }
  1590. int[] defPray = {0,5,13,24,25};
  1591. int[] strPray = {1,6,14,24,25};
  1592. int[] atkPray = {2,7,15,24,25};
  1593. int[] rangePray = {3,11,19};
  1594. int[] magePray = {4,12,20};
  1595.  
  1596. if(c.playerLevel[5] > 0 || !Config.PRAYER_POINTS_REQUIRED){
  1597. if(c.getPA().getLevelForXP(c.playerXP[5]) >= c.PRAYER_LEVEL_REQUIRED[i] || !Config.PRAYER_LEVEL_REQUIRED) {
  1598. boolean headIcon = false;
  1599. switch(i) {
  1600. case 0:
  1601. case 5:
  1602. case 13:
  1603. if(c.prayerActive[i] == false) {
  1604. for (int j = 0; j < defPray.length; j++) {
  1605. if (defPray[j] != i) {
  1606. c.prayerActive[defPray[j]] = false;
  1607. c.getPA().sendFrame36(c.PRAYER_GLOW[defPray[j]], 0);
  1608. }
  1609. }
  1610. }
  1611. break;
  1612.  
  1613. case 1:
  1614. case 6:
  1615. case 14:
  1616. if(c.prayerActive[i] == false) {
  1617. for (int j = 0; j < strPray.length; j++) {
  1618. if (strPray[j] != i) {
  1619. c.prayerActive[strPray[j]] = false;
  1620. c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  1621. }
  1622. }
  1623. for (int j = 0; j < rangePray.length; j++) {
  1624. if (rangePray[j] != i) {
  1625. c.prayerActive[rangePray[j]] = false;
  1626. c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  1627. }
  1628. }
  1629. for (int j = 0; j < magePray.length; j++) {
  1630. if (magePray[j] != i) {
  1631. c.prayerActive[magePray[j]] = false;
  1632. c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  1633. }
  1634. }
  1635. }
  1636. break;
  1637.  
  1638. case 2:
  1639. case 7:
  1640. case 15:
  1641. if(c.prayerActive[i] == false) {
  1642. for (int j = 0; j < atkPray.length; j++) {
  1643. if (atkPray[j] != i) {
  1644. c.prayerActive[atkPray[j]] = false;
  1645. c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  1646. }
  1647. }
  1648. for (int j = 0; j < rangePray.length; j++) {
  1649. if (rangePray[j] != i) {
  1650. c.prayerActive[rangePray[j]] = false;
  1651. c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  1652. }
  1653. }
  1654. for (int j = 0; j < magePray.length; j++) {
  1655. if (magePray[j] != i) {
  1656. c.prayerActive[magePray[j]] = false;
  1657. c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  1658. }
  1659. }
  1660. }
  1661. break;
  1662.  
  1663. case 3://range prays
  1664. case 11:
  1665. case 19:
  1666. if(c.prayerActive[i] == false) {
  1667. for (int j = 0; j < atkPray.length; j++) {
  1668. if (atkPray[j] != i) {
  1669. c.prayerActive[atkPray[j]] = false;
  1670. c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  1671. }
  1672. }
  1673. for (int j = 0; j < strPray.length; j++) {
  1674. if (strPray[j] != i) {
  1675. c.prayerActive[strPray[j]] = false;
  1676. c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  1677. }
  1678. }
  1679. for (int j = 0; j < rangePray.length; j++) {
  1680. if (rangePray[j] != i) {
  1681. c.prayerActive[rangePray[j]] = false;
  1682. c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  1683. }
  1684. }
  1685. for (int j = 0; j < magePray.length; j++) {
  1686. if (magePray[j] != i) {
  1687. c.prayerActive[magePray[j]] = false;
  1688. c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  1689. }
  1690. }
  1691. }
  1692. break;
  1693. case 4:
  1694. case 12:
  1695. case 20:
  1696. if(c.prayerActive[i] == false) {
  1697. for (int j = 0; j < atkPray.length; j++) {
  1698. if (atkPray[j] != i) {
  1699. c.prayerActive[atkPray[j]] = false;
  1700. c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  1701. }
  1702. }
  1703. for (int j = 0; j < strPray.length; j++) {
  1704. if (strPray[j] != i) {
  1705. c.prayerActive[strPray[j]] = false;
  1706. c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  1707. }
  1708. }
  1709. for (int j = 0; j < rangePray.length; j++) {
  1710. if (rangePray[j] != i) {
  1711. c.prayerActive[rangePray[j]] = false;
  1712. c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  1713. }
  1714. }
  1715. for (int j = 0; j < magePray.length; j++) {
  1716. if (magePray[j] != i) {
  1717. c.prayerActive[magePray[j]] = false;
  1718. c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  1719. }
  1720. }
  1721. }
  1722. break;
  1723. case 10:
  1724. c.lastProtItem = System.currentTimeMillis();
  1725. break;
  1726.  
  1727.  
  1728. case 16:
  1729. case 17:
  1730. case 18:
  1731. if(System.currentTimeMillis() - c.stopPrayerDelay < 5000) {
  1732. c.sendMessage("You have been injured and can't use this prayer!");
  1733. c.getPA().sendFrame36(c.PRAYER_GLOW[16], 0);
  1734. c.getPA().sendFrame36(c.PRAYER_GLOW[17], 0);
  1735. c.getPA().sendFrame36(c.PRAYER_GLOW[18], 0);
  1736. return;
  1737. }
  1738. if (i == 16)
  1739. c.protMageDelay = System.currentTimeMillis();
  1740. else if (i == 17)
  1741. c.protRangeDelay = System.currentTimeMillis();
  1742. else if (i == 18)
  1743. c.protMeleeDelay = System.currentTimeMillis();
  1744. case 21:
  1745. case 22:
  1746. case 23:
  1747. headIcon = true;
  1748. for(int p = 16; p < 24; p++) {
  1749. if(i != p && p != 19 && p != 20) {
  1750. c.prayerActive[p] = false;
  1751. c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);
  1752. }
  1753. }
  1754. break;
  1755. case 24:
  1756. case 25:
  1757. if (c.prayerActive[i] == false) {
  1758. for (int j = 0; j < atkPray.length; j++) {
  1759. if (atkPray[j] != i) {
  1760. c.prayerActive[atkPray[j]] = false;
  1761. c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  1762. }
  1763. }
  1764. for (int j = 0; j < strPray.length; j++) {
  1765. if (strPray[j] != i) {
  1766. c.prayerActive[strPray[j]] = false;
  1767. c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  1768. }
  1769. }
  1770. for (int j = 0; j < rangePray.length; j++) {
  1771. if (rangePray[j] != i) {
  1772. c.prayerActive[rangePray[j]] = false;
  1773. c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  1774. }
  1775. }
  1776. for (int j = 0; j < magePray.length; j++) {
  1777. if (magePray[j] != i) {
  1778. c.prayerActive[magePray[j]] = false;
  1779. c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  1780. }
  1781. }
  1782. for (int j = 0; j < defPray.length; j++) {
  1783. if (defPray[j] != i) {
  1784. c.prayerActive[defPray[j]] = false;
  1785. c.getPA().sendFrame36(c.PRAYER_GLOW[defPray[j]], 0);
  1786. }
  1787. }
  1788. }
  1789. break;
  1790. }
  1791.  
  1792. if(!headIcon) {
  1793. if(c.prayerActive[i] == false) {
  1794. c.prayerActive[i] = true;
  1795. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 1);
  1796. } else {
  1797. c.prayerActive[i] = false;
  1798. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  1799. }
  1800. } else {
  1801. if(c.prayerActive[i] == false) {
  1802. c.prayerActive[i] = true;
  1803. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 1);
  1804. c.headIcon = c.PRAYER_HEAD_ICONS[i];
  1805. c.getPA().requestUpdates();
  1806. } else {
  1807. c.prayerActive[i] = false;
  1808. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  1809. c.headIcon = -1;
  1810. c.getPA().requestUpdates();
  1811. }
  1812. }
  1813. } else {
  1814. c.getPA().sendFrame36(c.PRAYER_GLOW[i],0);
  1815. c.getPA().sendFrame126("You need a @blu@Prayer level of "+c.PRAYER_LEVEL_REQUIRED[i]+" to use "+c.PRAYER_NAME[i]+".", 357);
  1816. c.getPA().sendFrame126("Click here to continue", 358);
  1817. c.getPA().sendFrame164(356);
  1818. }
  1819. } else {
  1820. c.getPA().sendFrame36(c.PRAYER_GLOW[i],0);
  1821. c.sendMessage("You have run out of prayer points!");
  1822. }
  1823.  
  1824. }
  1825.  
  1826. /**
  1827. *Specials
  1828. **/
  1829.  
  1830. public void activateSpecial(int weapon, int i){
  1831. if(Server.npcHandler.npcs[i] == null && c.npcIndex > 0) {
  1832. return;
  1833. }
  1834. if(Server.playerHandler.players[i] == null && c.playerIndex > 0) {
  1835. return;
  1836. }
  1837. c.doubleHit = false;
  1838. c.specEffect = 0;
  1839. c.projectileStage = 0;
  1840. c.specMaxHitIncrease = 2;
  1841. if(c.npcIndex > 0) {
  1842. c.oldNpcIndex = i;
  1843. } else if (c.playerIndex > 0){
  1844. c.oldPlayerIndex = i;
  1845. Server.playerHandler.players[i].underAttackBy = c.playerId;
  1846. Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1847. Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1848. Server.playerHandler.players[i].killerId = c.playerId;
  1849. }
  1850.  
  1851. switch(weapon) {
  1852.  
  1853. case 14484:
  1854. c.gfx0(1950);
  1855. c.startAnimation(10961);
  1856. c.specAccuracy = 9.9;
  1857. c.clawDamage = 0;
  1858. c.specDamage = 1.10;
  1859. if (c.playerIndex > 0) {
  1860. Client o = (Client) Server.playerHandler.players[c.playerIndex];
  1861. if (Misc.random(calculateMeleeAttack()) > Misc.random(o.getCombat().calculateMeleeDefence())) {
  1862. c.clawDamage = Misc.random(calculateMeleeMaxHit() + 5);
  1863. } else {
  1864. c.clawDamage = Misc.random(calculateMeleeMaxHit() + 5);
  1865. }
  1866. c.clawIndex = c.playerIndex;
  1867. c.clawType = 1;
  1868. } else if (c.npcIndex > 0) {
  1869. NPC n = Server.npcHandler.npcs[c.npcIndex];
  1870. if (Misc.random(calculateMeleeAttack()) > Misc.random(n.defence)) {
  1871. c.clawDamage = Misc.random(calculateMeleeMaxHit() + Misc.random(6));
  1872. } else {
  1873. c.clawDamage = Misc.random(calculateMeleeMaxHit() /2);
  1874. }
  1875. c.clawIndex = c.npcIndex;
  1876. c.clawType = 2;
  1877. }
  1878.  
  1879. case 1305: // dragon long
  1880. c.gfx100(248);
  1881. c.startAnimation(1058);
  1882. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1883. c.specAccuracy = 1.10;
  1884. c.specDamage = 1.20;
  1885. break;
  1886.  
  1887. case 1215: // dragon daggers
  1888. case 1231:
  1889. case 5680:
  1890. case 5698:
  1891. c.gfx100(252);
  1892. c.startAnimation(1062);
  1893. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1894. c.doubleHit = true;
  1895. c.specAccuracy = 1.30;
  1896. c.specDamage = 1.05;
  1897. break;
  1898.  
  1899. case 11730:
  1900. c.gfx100(1224);
  1901. c.startAnimation(811);
  1902. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1903. c.doubleHit = true;
  1904. c.ssSpec = true;
  1905. c.specAccuracy = 1.30;
  1906. break;
  1907.  
  1908. case 4151: // whip
  1909. if(Server.npcHandler.npcs[i] != null) {
  1910. Server.npcHandler.npcs[i].gfx100(341);
  1911. }
  1912. c.specAccuracy = 1.10;
  1913. c.startAnimation(1658);
  1914. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1915. break;
  1916.  
  1917. case 11694: // ags
  1918. c.startAnimation(4304);
  1919. c.specDamage = 1.25;
  1920. c.specAccuracy = 1.85;
  1921. c.gfx0(1222);
  1922. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1923. break;
  1924. case 11700:
  1925. c.startAnimation(4302);
  1926. c.gfx0(1221);
  1927. c.specAccuracy = 1.25;
  1928. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1929. c.specEffect = 2;
  1930. break;
  1931.  
  1932. case 11696:
  1933. c.startAnimation(4301);
  1934. c.gfx0(1223);
  1935. c.specDamage = 1.10;
  1936. c.specAccuracy = 1.5;
  1937. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1938. c.specEffect = 3;
  1939. break;
  1940.  
  1941. case 11698:
  1942. c.startAnimation(4303);
  1943. c.gfx0(1220);
  1944. c.specAccuracy = 1.25;
  1945. c.specEffect = 4;
  1946. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1947. break;
  1948.  
  1949. case 1249:
  1950. c.startAnimation(405);
  1951. c.gfx100(253);
  1952. if (c.playerIndex > 0) {
  1953. Client o = (Client)Server.playerHandler.players[i];
  1954. o.getPA().getSpeared(c.absX, c.absY);
  1955. }
  1956. break;
  1957.  
  1958. case 3204: // d hally
  1959. c.gfx100(282);
  1960. c.startAnimation(1203);
  1961. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1962. if(Server.npcHandler.npcs[i] != null && c.npcIndex > 0) {
  1963. if(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1)){
  1964. c.doubleHit = true;
  1965. }
  1966. }
  1967. if(Server.playerHandler.players[i] != null && c.playerIndex > 0) {
  1968. if(!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(),Server.playerHandler.players[i].getY(), 1)){
  1969. c.doubleHit = true;
  1970. c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  1971. }
  1972. }
  1973. break;
  1974.  
  1975. case 4153: // maul
  1976. c.startAnimation(1667);
  1977. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1978. /*if (c.playerIndex > 0)
  1979. gmaulPlayer(i);
  1980. else
  1981. gmaulNpc(i);*/
  1982. c.gfx100(337);
  1983. break;
  1984.  
  1985. case 4587: // dscimmy
  1986. c.gfx100(347);
  1987. c.specEffect = 1;
  1988. c.startAnimation(1872);
  1989. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1990. break;
  1991.  
  1992. case 1434: // mace
  1993. c.startAnimation(1060);
  1994. c.gfx100(251);
  1995. c.specMaxHitIncrease = 3;
  1996. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase())+1;
  1997. c.specDamage = 1.35;
  1998. c.specAccuracy = 1.15;
  1999. break;
  2000.  
  2001. case 859: // magic long
  2002. c.usingBow = true;
  2003. c.bowSpecShot = 3;
  2004. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  2005. c.getItems().deleteArrow();
  2006. c.lastWeaponUsed = weapon;
  2007. c.startAnimation(426);
  2008. c.gfx100(250);
  2009. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  2010. c.projectileStage = 1;
  2011. if (c.fightMode == 2)
  2012. c.attackTimer--;
  2013. break;
  2014.  
  2015. case 861: // magic short
  2016. c.usingBow = true;
  2017. c.bowSpecShot = 1;
  2018. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  2019. c.getItems().deleteArrow();
  2020. c.lastWeaponUsed = weapon;
  2021. c.startAnimation(1074);
  2022. c.hitDelay = 3;
  2023. c.projectileStage = 1;
  2024. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  2025. if (c.fightMode == 2)
  2026. c.attackTimer--;
  2027. if (c.playerIndex > 0)
  2028. fireProjectilePlayer();
  2029. else if (c.npcIndex > 0)
  2030. fireProjectileNpc();
  2031. break;
  2032.  
  2033. case 11235: // dark bow
  2034. c.usingBow = true;
  2035. c.dbowSpec = true;
  2036. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  2037. c.getItems().deleteArrow();
  2038. c.getItems().deleteArrow();
  2039. c.lastWeaponUsed = weapon;
  2040. c.hitDelay = 3;
  2041. c.startAnimation(426);
  2042. c.projectileStage = 1;
  2043. c.gfx100(getRangeStartGFX());
  2044. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  2045. if (c.fightMode == 2)
  2046. c.attackTimer--;
  2047. if (c.playerIndex > 0)
  2048. fireProjectilePlayer();
  2049. else if (c.npcIndex > 0)
  2050. fireProjectileNpc();
  2051. c.specAccuracy = 1.75;
  2052. c.specDamage = 1.50;
  2053. break;
  2054. }
  2055. c.delayedDamage = Misc.random(calculateMeleeMaxHit());
  2056. c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  2057. c.usingSpecial = false;
  2058. c.getItems().updateSpecialBar();
  2059. }
  2060.  
  2061.  
  2062. public boolean checkSpecAmount(int weapon) {
  2063. switch(weapon) {
  2064. case 1249:
  2065. case 1215:
  2066. case 1231:
  2067. case 5680:
  2068. case 5698:
  2069. case 1305:
  2070. case 1434:
  2071. if(c.specAmount >= 2.5) {
  2072. c.specAmount -= 2.5;
  2073. c.getItems().addSpecialBar(weapon);
  2074. return true;
  2075. }
  2076. return false;
  2077.  
  2078. case 4151:
  2079. case 11694:
  2080. case 11698:
  2081. case 14484:
  2082. case 4153:
  2083. if(c.specAmount >= 5) {
  2084. c.specAmount -= 5;
  2085. c.getItems().addSpecialBar(weapon);
  2086. return true;
  2087. }
  2088. return false;
  2089.  
  2090. case 3204:
  2091. if(c.specAmount >= 3) {
  2092. c.specAmount -= 3;
  2093. c.getItems().addSpecialBar(weapon);
  2094. return true;
  2095. }
  2096. return false;
  2097.  
  2098. case 1377:
  2099. case 11696:
  2100. case 11730:
  2101. if(c.specAmount >= 10) {
  2102. c.specAmount -= 10;
  2103. c.getItems().addSpecialBar(weapon);
  2104. return true;
  2105. }
  2106. return false;
  2107.  
  2108. case 4587:
  2109. case 859:
  2110. case 861:
  2111. case 11235:
  2112. case 11700:
  2113. if(c.specAmount >= 5.5) {
  2114. c.specAmount -= 5.5;
  2115. c.getItems().addSpecialBar(weapon);
  2116. return true;
  2117. }
  2118. return false;
  2119.  
  2120.  
  2121. default:
  2122. return true; // incase u want to test a weapon
  2123. }
  2124. }
  2125.  
  2126. public void resetPlayerAttack() {
  2127. c.usingMagic = false;
  2128. c.npcIndex = 0;
  2129. c.faceUpdate(0);
  2130. c.playerIndex = 0;
  2131. c.getPA().resetFollow();
  2132. //c.sendMessage("Reset attack.");
  2133. }
  2134.  
  2135. public int getCombatDifference(int combat1, int combat2) {
  2136. if(combat1 > combat2) {
  2137. return (combat1 - combat2);
  2138. }
  2139. if(combat2 > combat1) {
  2140. return (combat2 - combat1);
  2141. }
  2142. return 0;
  2143. }
  2144.  
  2145. /**
  2146. *Get killer id
  2147. **/
  2148.  
  2149. public int getKillerId(int playerId) {
  2150. int oldDamage = 0;
  2151. int count = 0;
  2152. int killerId = 0;
  2153. for (int i = 1; i < Config.MAX_PLAYERS; i++) {
  2154. if (Server.playerHandler.players[i] != null) {
  2155. if(Server.playerHandler.players[i].killedBy == playerId) {
  2156. if (Server.playerHandler.players[i].withinDistance(Server.playerHandler.players[playerId])) {
  2157. if(Server.playerHandler.players[i].totalPlayerDamageDealt > oldDamage) {
  2158. oldDamage = Server.playerHandler.players[i].totalPlayerDamageDealt;
  2159. killerId = i;
  2160. }
  2161. }
  2162. Server.playerHandler.players[i].totalPlayerDamageDealt = 0;
  2163. Server.playerHandler.players[i].killedBy = 0;
  2164. }
  2165. }
  2166. }
  2167. return killerId;
  2168. }
  2169.  
  2170.  
  2171.  
  2172. double[] prayerData = {
  2173. 1, // Thick Skin.
  2174. 1, // Burst of Strength.
  2175. 1, // Clarity of Thought.
  2176. 1, // Sharp Eye.
  2177. 1, // Mystic Will.
  2178. 2, // Rock Skin.
  2179. 2, // SuperHuman Strength.
  2180. 2, // Improved Reflexes.
  2181. 0.4, // Rapid restore.
  2182. 0.6, // Rapid Heal.
  2183. 0.6, // Protect Items.
  2184. 1.5, // Hawk eye.
  2185. 2, // Mystic Lore.
  2186. 4, // Steel Skin.
  2187. 4, // Ultimate Strength.
  2188. 4, // Incredible Reflexes.
  2189. 4, // Protect from Magic.
  2190. 4, // Protect from Missiles.
  2191. 4, // Protect from Melee.
  2192. 4, // Eagle Eye.
  2193. 4, // Mystic Might.
  2194. 1, // Retribution.
  2195. 2, // Redemption.
  2196. 6, // Smite.
  2197. 8, // Chivalry.
  2198. 8, // Piety.
  2199. };
  2200.  
  2201. public void handlePrayerDrain() {
  2202. c.usingPrayer = false;
  2203. double toRemove = 0.0;
  2204. for (int j = 0; j < prayerData.length; j++) {
  2205. if (c.prayerActive[j]) {
  2206. toRemove += prayerData[j]/20;
  2207. c.usingPrayer = true;
  2208. }
  2209. }
  2210. if (toRemove > 0) {
  2211. toRemove /= (1 + (0.035 * c.playerBonus[11]));
  2212. }
  2213. c.prayerPoint -= toRemove;
  2214. if (c.prayerPoint <= 0) {
  2215. c.prayerPoint = 1.0 + c.prayerPoint;
  2216. reducePrayerLevel();
  2217. }
  2218.  
  2219. }
  2220.  
  2221. public void reducePrayerLevel() {
  2222. if(c.playerLevel[5] - 1 > 0) {
  2223. c.playerLevel[5] -= 1;
  2224. } else {
  2225. c.sendMessage("You have run out of prayer points!");
  2226. c.playerLevel[5] = 0;
  2227. resetPrayers();
  2228. c.prayerId = -1;
  2229. }
  2230. c.getPA().refreshSkill(5);
  2231. }
  2232.  
  2233. public void resetPrayers() {
  2234. for(int i = 0; i < c.prayerActive.length; i++) {
  2235. c.prayerActive[i] = false;
  2236. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  2237. }
  2238. c.headIcon = -1;
  2239. c.getPA().requestUpdates();
  2240. }
  2241.  
  2242. /**
  2243. * Wildy and duel info
  2244. **/
  2245.  
  2246. public boolean checkReqs() {
  2247. if(Server.playerHandler.players[c.playerIndex] == null) {
  2248. return false;
  2249. }
  2250. if (c.playerIndex == c.playerId)
  2251. return false;
  2252. if (c.inPits && Server.playerHandler.players[c.playerIndex].inPits)
  2253. return true;
  2254. if(Server.playerHandler.players[c.playerIndex].inDuelArena() && c.duelStatus != 5 && !c.usingMagic) {
  2255. if(c.arenas() || c.duelStatus == 5) {
  2256. c.sendMessage("You can't challenge inside the arena!");
  2257. return false;
  2258. }
  2259. c.getTradeAndDuel().requestDuel(c.playerIndex);
  2260. return false;
  2261. }
  2262. if(c.duelStatus == 5 && Server.playerHandler.players[c.playerIndex].duelStatus == 5) {
  2263. if(Server.playerHandler.players[c.playerIndex].duelingWith == c.getId()) {
  2264. return true;
  2265. } else {
  2266. c.sendMessage("This isn't your opponent!");
  2267. return false;
  2268. }
  2269. }
  2270. if(!Server.playerHandler.players[c.playerIndex].inWild()) {
  2271. c.sendMessage("That player is not in the wilderness.");
  2272. c.stopMovement();
  2273. c.getCombat().resetPlayerAttack();
  2274. return false;
  2275. }
  2276. if(!c.inWild()) {
  2277. c.sendMessage("You are not in the wilderness.");
  2278. c.stopMovement();
  2279. c.getCombat().resetPlayerAttack();
  2280. return false;
  2281. }
  2282.  
  2283. if(c.safeZone()) {
  2284. c.sendMessage("You are standing in a safe zone.");
  2285. c.stopMovement();
  2286. c.getCombat().resetPlayerAttack();
  2287. return false;
  2288. }
  2289. if(!c.inFunPk()){
  2290. if(Config.COMBAT_LEVEL_DIFFERENCE) {
  2291. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[c.playerIndex].combatLevel);
  2292. if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[c.playerIndex].wildLevel) {
  2293. c.sendMessage("Your combat level difference is too great to attack that player here.");
  2294. c.stopMovement();
  2295. c.getCombat().resetPlayerAttack();
  2296. return false;
  2297. }
  2298. }
  2299. }
  2300.  
  2301. if(Config.COMBAT_LEVEL_DIFFERENCE) {
  2302. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[c.playerIndex].combatLevel);
  2303. if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[c.playerIndex].wildLevel) {
  2304. c.sendMessage("Your combat level difference is too great to attack that player here.");
  2305. c.stopMovement();
  2306. c.getCombat().resetPlayerAttack();
  2307. return false;
  2308. }
  2309. }
  2310.  
  2311. if(Config.SINGLE_AND_MULTI_ZONES) {
  2312. if(!Server.playerHandler.players[c.playerIndex].inMulti()) { // single combat zones
  2313. if(Server.playerHandler.players[c.playerIndex].underAttackBy != c.playerId && Server.playerHandler.players[c.playerIndex].underAttackBy != 0) {
  2314. c.sendMessage("That player is already in combat.");
  2315. c.stopMovement();
  2316. c.getCombat().resetPlayerAttack();
  2317. return false;
  2318. }
  2319. if(Server.playerHandler.players[c.playerIndex].playerId != c.underAttackBy && c.underAttackBy != 0 || c.underAttackBy2 > 0) {
  2320. c.sendMessage("You are already in combat.");
  2321. c.stopMovement();
  2322. c.getCombat().resetPlayerAttack();
  2323. return false;
  2324. }
  2325. }
  2326. }
  2327. return true;
  2328. }
  2329.  
  2330. public boolean checkMultiBarrageReqs(int i) {
  2331. if(Server.playerHandler.players[i] == null) {
  2332. return false;
  2333. }
  2334. if (i == c.playerId)
  2335. return false;
  2336. if (c.inPits && Server.playerHandler.players[i].inPits)
  2337. return true;
  2338. if(!Server.playerHandler.players[i].inWild()) {
  2339. return false;
  2340. }
  2341. if(Config.COMBAT_LEVEL_DIFFERENCE) {
  2342. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[i].combatLevel);
  2343. if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[i].wildLevel) {
  2344. c.sendMessage("Your combat level difference is too great to attack that player here.");
  2345. return false;
  2346. }
  2347. }
  2348.  
  2349. if(Config.SINGLE_AND_MULTI_ZONES) {
  2350. if(!Server.playerHandler.players[i].inMulti()) { // single combat zones
  2351. if(Server.playerHandler.players[i].underAttackBy != c.playerId && Server.playerHandler.players[i].underAttackBy != 0) {
  2352. return false;
  2353. }
  2354. if(Server.playerHandler.players[i].playerId != c.underAttackBy && c.underAttackBy != 0) {
  2355. c.sendMessage("You are already in combat.");
  2356. return false;
  2357. }
  2358. }
  2359. }
  2360. return true;
  2361. }
  2362.  
  2363. /**
  2364. *Weapon stand, walk, run, etc emotes
  2365. **/
  2366.  
  2367. public void getPlayerAnimIndex(String weaponName){
  2368. c.playerStandIndex = 0x328;
  2369. c.playerTurnIndex = 0x337;
  2370. c.playerWalkIndex = 0x333;
  2371. c.playerTurn180Index = 0x334;
  2372. c.playerTurn90CWIndex = 0x335;
  2373. c.playerTurn90CCWIndex = 0x336;
  2374. c.playerRunIndex = 0x338;
  2375.  
  2376. if(weaponName.contains("halberd") || weaponName.contains("guthan")) {
  2377. c.playerStandIndex = 809;
  2378. c.playerWalkIndex = 1146;
  2379. c.playerRunIndex = 1210;
  2380. return;
  2381. }
  2382. if(weaponName.contains("dharok")) {
  2383. c.playerStandIndex = 0x811;
  2384. c.playerWalkIndex = 0x67F;
  2385. c.playerRunIndex = 0x680;
  2386. return;
  2387. }
  2388. if(weaponName.contains("ahrim")) {
  2389. c.playerStandIndex = 809;
  2390. c.playerWalkIndex = 1146;
  2391. c.playerRunIndex = 1210;
  2392. return;
  2393. }
  2394. if(weaponName.contains("verac")) {
  2395. c.playerStandIndex = 1832;
  2396. c.playerWalkIndex = 1830;
  2397. c.playerRunIndex = 1831;
  2398. return;
  2399. }
  2400. if (weaponName.contains("wand") || weaponName.contains("staff")) {
  2401. c.playerStandIndex = 809;
  2402. c.playerRunIndex = 1210;
  2403. c.playerWalkIndex = 1146;
  2404. return;
  2405. }
  2406. if(weaponName.contains("karil")) {
  2407. c.playerStandIndex = 2074;
  2408. c.playerWalkIndex = 2076;
  2409. c.playerRunIndex = 2077;
  2410. return;
  2411. }
  2412. if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("saradomin sw")) {
  2413. c.playerStandIndex = 4300;
  2414. c.playerWalkIndex = 4306;
  2415. c.playerRunIndex = 4305;
  2416. return;
  2417. }
  2418. if(weaponName.contains("bow")) {
  2419. c.playerStandIndex = 808;
  2420. c.playerWalkIndex = 819;
  2421. c.playerRunIndex = 824;
  2422. return;
  2423. }
  2424.  
  2425. switch(c.playerEquipment[c.playerWeapon]) {
  2426. case 4151:
  2427. c.playerStandIndex = 1832;
  2428. c.playerWalkIndex = 1660;
  2429. c.playerRunIndex = 1661;
  2430. break;
  2431. case 6528:
  2432. c.playerStandIndex = 0x811;
  2433. c.playerWalkIndex = 2064;
  2434. c.playerRunIndex = 1664;
  2435. break;
  2436. case 4153:
  2437. c.playerStandIndex = 1662;
  2438. c.playerWalkIndex = 1663;
  2439. c.playerRunIndex = 1664;
  2440. break;
  2441. case 11694:
  2442. case 11696:
  2443. case 11730:
  2444. case 11698:
  2445. case 11700:
  2446. c.playerStandIndex = 4300;
  2447. c.playerWalkIndex = 4306;
  2448. c.playerRunIndex = 4305;
  2449. break;
  2450. case 1305:
  2451. c.playerStandIndex = 809;
  2452. break;
  2453. }
  2454. }
  2455.  
  2456. /**
  2457. * Weapon emotes
  2458. **/
  2459.  
  2460. public int getWepAnim(String weaponName) {
  2461. if(c.playerEquipment[c.playerWeapon] <= 0) {
  2462. switch(c.fightMode) {
  2463. case 0:
  2464. return 422;
  2465. case 2:
  2466. return 423;
  2467. case 1:
  2468. return 451;
  2469. }
  2470. }
  2471. if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe")){
  2472. return 806;
  2473. }
  2474. if(weaponName.contains("halberd")) {
  2475. return 440;
  2476. }
  2477. if(weaponName.startsWith("dragon dagger")) {
  2478. return 402;
  2479. }
  2480. if(weaponName.endsWith("dagger")) {
  2481. return 412;
  2482. }
  2483. if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("aradomin sword")) {
  2484. return 4307;
  2485. }
  2486. if(weaponName.contains("sword")) {
  2487. return 451;
  2488. }
  2489. if(weaponName.contains("karil")) {
  2490. return 2075;
  2491. }
  2492. if(weaponName.contains("bow") && !weaponName.contains("'bow")) {
  2493. return 426;
  2494. }
  2495. if (weaponName.contains("'bow"))
  2496. return 4230;
  2497.  
  2498. switch(c.playerEquipment[c.playerWeapon]) { // if you don't want to use strings
  2499. case 6522:
  2500. return 2614;
  2501. case 4153: // granite maul
  2502. return 1665;
  2503. case 4726: // guthan
  2504. return 2080;
  2505. case 4747: // torag
  2506. return 0x814;
  2507. case 4718: // dharok
  2508. return 2067;
  2509. case 4710: // ahrim
  2510. return 406;
  2511. case 4755: // verac
  2512. return 2062;
  2513. case 4734: // karil
  2514. return 2075;
  2515. case 4151:
  2516. return 1658;
  2517. case 14484:
  2518. return 393;
  2519. case 6528:
  2520. return 2661;
  2521. default:
  2522. return 451;
  2523. }
  2524. }
  2525.  
  2526. /**
  2527. * Block emotes
  2528. */
  2529. public int getBlockEmote() {
  2530. if (c.playerEquipment[c.playerShield] >= 8844 && c.playerEquipment[c.playerShield] <= 8850) {
  2531. return 4177;
  2532. }
  2533. switch(c.playerEquipment[c.playerWeapon]) {
  2534. case 4755:
  2535. return 2063;
  2536.  
  2537. case 4153:
  2538. return 1666;
  2539.  
  2540. case 4151:
  2541. return 1659;
  2542.  
  2543.  
  2544. case 11694:
  2545. case 11698:
  2546. case 11700:
  2547. case 11696:
  2548. case 11730:
  2549. case 14484:
  2550. return -1;
  2551. default:
  2552. return 404;
  2553. }
  2554. }
  2555.  
  2556. /**
  2557. * Weapon and magic attack speed!
  2558. **/
  2559.  
  2560. public int getAttackDelay(String s) {
  2561. if(c.usingMagic) {
  2562. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  2563. case 12871: // ice blitz
  2564. case 13023: // shadow barrage
  2565. case 12891: // ice barrage
  2566. return 5;
  2567.  
  2568. default:
  2569. return 5;
  2570. }
  2571. }
  2572. if(c.playerEquipment[c.playerWeapon] == -1)
  2573. return 4;//unarmed
  2574.  
  2575. switch (c.playerEquipment[c.playerWeapon]) {
  2576. case 11235:
  2577. return 9;
  2578. case 11730:
  2579. return 4;
  2580. case 6528:
  2581. return 7;
  2582. case 14484:
  2583. return 5;
  2584. }
  2585.  
  2586. if(s.endsWith("greataxe"))
  2587. return 7;
  2588. else if(s.equals("torags hammers"))
  2589. return 5;
  2590. else if(s.equals("guthans warspear"))
  2591. return 5;
  2592. else if(s.equals("veracs flail"))
  2593. return 5;
  2594. else if(s.equals("ahrims staff"))
  2595. return 6;
  2596. else if(s.contains("staff")){
  2597. if(s.contains("zamarok") || s.contains("guthix") || s.contains("saradomian") || s.contains("slayer") || s.contains("ancient"))
  2598. return 4;
  2599. else
  2600. return 5;
  2601. } else if(s.contains("bow")){
  2602. if(s.contains("composite") || s.equals("seercull"))
  2603. return 5;
  2604. else if (s.contains("aril"))
  2605. return 4;
  2606. else if(s.contains("Ogre"))
  2607. return 8;
  2608. else if(s.contains("short") || s.contains("hunt") || s.contains("sword"))
  2609. return 4;
  2610. else if(s.contains("long") || s.contains("crystal"))
  2611. return 6;
  2612. else if(s.contains("'bow"))
  2613. return 7;
  2614.  
  2615. return 5;
  2616. }
  2617. else if(s.contains("dagger"))
  2618. return 4;
  2619. else if(s.contains("godsword") || s.contains("2h"))
  2620. return 6;
  2621. else if(s.contains("longsword"))
  2622. return 5;
  2623. else if(s.contains("sword"))
  2624. return 4;
  2625. else if(s.contains("scimitar"))
  2626. return 4;
  2627. else if(s.contains("mace"))
  2628. return 5;
  2629. else if(s.contains("battleaxe"))
  2630. return 6;
  2631. else if(s.contains("pickaxe"))
  2632. return 5;
  2633. else if(s.contains("thrownaxe"))
  2634. return 5;
  2635. else if(s.contains("axe"))
  2636. return 5;
  2637. else if(s.contains("warhammer"))
  2638. return 6;
  2639. else if(s.contains("2h"))
  2640. return 7;
  2641. else if(s.contains("spear"))
  2642. return 5;
  2643. else if(s.contains("claw"))
  2644. return 4;
  2645. else if(s.contains("halberd"))
  2646. return 7;
  2647.  
  2648. //sara sword, 2400ms
  2649. else if(s.equals("granite maul"))
  2650. return 7;
  2651. else if(s.equals("toktz-xil-ak"))//sword
  2652. return 4;
  2653. else if(s.equals("tzhaar-ket-em"))//mace
  2654. return 5;
  2655. else if(s.equals("tzhaar-ket-om"))//maul
  2656. return 7;
  2657. else if(s.equals("toktz-xil-ek"))//knife
  2658. return 4;
  2659. else if(s.equals("toktz-xil-ul"))//rings
  2660. return 4;
  2661. else if(s.equals("toktz-mej-tal"))//staff
  2662. return 6;
  2663. else if(s.contains("whip"))
  2664. return 4;
  2665. else if(s.contains("dart"))
  2666. return 3;
  2667. else if(s.contains("knife"))
  2668. return 3;
  2669. else if(s.contains("javelin"))
  2670. return 6;
  2671. return 5;
  2672. }
  2673. /**
  2674. * How long it takes to hit your enemy
  2675. **/
  2676. public int getHitDelay(String weaponName) {
  2677. if(c.usingMagic) {
  2678. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  2679. case 12891:
  2680. return 4;
  2681. case 12871:
  2682. return 6;
  2683. default:
  2684. return 4;
  2685. }
  2686. } else {
  2687.  
  2688. if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe")){
  2689. return 3;
  2690. }
  2691. if(weaponName.contains("cross") || weaponName.contains("c'bow")) {
  2692. return 4;
  2693. }
  2694. if(weaponName.contains("bow") && !c.dbowSpec) {
  2695. return 4;
  2696. } else if (c.dbowSpec) {
  2697. return 4;
  2698. }
  2699.  
  2700. switch(c.playerEquipment[c.playerWeapon]) {
  2701. case 6522: // Toktz-xil-ul
  2702. return 3;
  2703. default:
  2704. return 2;
  2705. }
  2706. }
  2707. }
  2708.  
  2709. public int getRequiredDistance() {
  2710. if (c.followId > 0 && c.freezeTimer <= 0 && !c.isMoving)
  2711. return 2;
  2712. else if(c.followId > 0 && c.freezeTimer <= 0 && c.isMoving) {
  2713. return 3;
  2714. } else {
  2715. return 1;
  2716. }
  2717. }
  2718.  
  2719. public boolean usingHally() {
  2720. switch(c.playerEquipment[c.playerWeapon]) {
  2721. case 3190:
  2722. case 3192:
  2723. case 3194:
  2724. case 3196:
  2725. case 3198:
  2726. case 3200:
  2727. case 3202:
  2728. case 3204:
  2729. return true;
  2730.  
  2731. default:
  2732. return false;
  2733. }
  2734. }
  2735.  
  2736. /**
  2737. * Melee
  2738. **/
  2739.  
  2740. public int calculateMeleeAttack() {
  2741. int attackLevel = c.playerLevel[0];
  2742. //2, 5, 11, 18, 19
  2743. if (c.prayerActive[2]) {
  2744. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.05;
  2745. } else if (c.prayerActive[7]) {
  2746. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  2747. } else if (c.prayerActive[15]) {
  2748. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15;
  2749. } else if (c.prayerActive[24]) {
  2750. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15;
  2751. } else if (c.prayerActive[25]) {
  2752. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.2;
  2753. }
  2754. if (c.fullVoidMelee())
  2755. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  2756. attackLevel *= c.specAccuracy;
  2757. //c.sendMessage("Attack: " + (attackLevel + (c.playerBonus[bestMeleeAtk()] * 2)));
  2758. int i = c.playerBonus[bestMeleeAtk()];
  2759. i += c.bonusAttack;
  2760. if (c.playerEquipment[c.playerAmulet] == 11128 && c.playerEquipment[c.playerWeapon] == 6528) {
  2761. i *= 1.30;
  2762. }
  2763. return (int)(attackLevel + (attackLevel * 0.15) + (i + i * 0.05));
  2764. }
  2765. public int bestMeleeAtk()
  2766. {
  2767. if(c.playerBonus[0] > c.playerBonus[1] && c.playerBonus[0] > c.playerBonus[2])
  2768. return 0;
  2769. if(c.playerBonus[1] > c.playerBonus[0] && c.playerBonus[1] > c.playerBonus[2])
  2770. return 1;
  2771. return c.playerBonus[2] <= c.playerBonus[1] || c.playerBonus[2] <= c.playerBonus[0] ? 0 : 2;
  2772. }
  2773.  
  2774. public int calculateMeleeMaxHit() {
  2775. double maxHit = 0;
  2776. int strBonus = c.playerBonus[10];
  2777. int strength = c.playerLevel[2];
  2778. int lvlForXP = c.getLevelForXP(c.playerXP[2]);
  2779. if(c.prayerActive[1]) {
  2780. strength += (int)(lvlForXP * .05);
  2781. } else
  2782. if(c.prayerActive[6]) {
  2783. strength += (int)(lvlForXP * .10);
  2784. } else
  2785. if(c.prayerActive[14]) {
  2786. strength += (int)(lvlForXP * .15);
  2787. } else
  2788. if(c.prayerActive[24]) {
  2789. strength += (int)(lvlForXP * .18);
  2790. } else
  2791. if(c.prayerActive[25]) {
  2792. strength += (int)(lvlForXP * .23);
  2793. }
  2794. if(c.playerEquipment[c.playerHat] == 2526 && c.playerEquipment[c.playerChest] == 2520 && c.playerEquipment[c.playerLegs] == 2522) {
  2795. maxHit += (maxHit * 10 / 100);
  2796. }
  2797. maxHit += 1.05D + (double)(strBonus * strength) * 0.00175D;
  2798. maxHit += (double)strength * 0.11D;
  2799. if(c.playerEquipment[c.playerWeapon] == 4718 && c.playerEquipment[c.playerHat] == 4716 && c.playerEquipment[c.playerChest] == 4720 && c.playerEquipment[c.playerLegs] == 4722) {
  2800. maxHit += (c.getPA().getLevelForXP(c.playerXP[3]) - c.playerLevel[3]) / 2;
  2801. }
  2802. if (c.specDamage > 1)
  2803. maxHit = (int)(maxHit * c.specDamage);
  2804. if (maxHit < 0)
  2805. maxHit = 1;
  2806. if (c.fullVoidMelee())
  2807. maxHit = (int)(maxHit * 1.10);
  2808. if (c.playerEquipment[c.playerAmulet] == 11128 && c.playerEquipment[c.playerWeapon] == 6528) {
  2809. maxHit *= 1.20;
  2810. }
  2811. return (int)Math.floor(maxHit);
  2812. }
  2813.  
  2814.  
  2815. public int calculateMeleeDefence()
  2816. {
  2817. int defenceLevel = c.playerLevel[1];
  2818. int i = c.playerBonus[bestMeleeDef()];
  2819. if (c.prayerActive[0]) {
  2820. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  2821. } else if (c.prayerActive[5]) {
  2822. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  2823. } else if (c.prayerActive[13]) {
  2824. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  2825. } else if (c.prayerActive[24]) {
  2826. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  2827. } else if (c.prayerActive[25]) {
  2828. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  2829. }
  2830. return (int)(defenceLevel + (defenceLevel * 0.15) + (i + i * 0.05));
  2831. }
  2832.  
  2833. public int bestMeleeDef()
  2834. {
  2835. if(c.playerBonus[5] > c.playerBonus[6] && c.playerBonus[5] > c.playerBonus[7])
  2836. return 5;
  2837. if(c.playerBonus[6] > c.playerBonus[5] && c.playerBonus[6] > c.playerBonus[7])
  2838. return 6;
  2839. return c.playerBonus[7] <= c.playerBonus[5] || c.playerBonus[7] <= c.playerBonus[6] ? 5 : 7;
  2840. }
  2841.  
  2842. /**
  2843. * Range
  2844. **/
  2845.  
  2846. public int calculateRangeAttack() {
  2847. int attackLevel = c.playerLevel[4];
  2848. attackLevel *= c.specAccuracy;
  2849. if (c.fullVoidRange())
  2850. attackLevel += c.getLevelForXP(c.playerXP[c.playerRanged]) * 0.1;
  2851. if (c.prayerActive[3])
  2852. attackLevel *= 1.05;
  2853. else if (c.prayerActive[11])
  2854. attackLevel *= 1.10;
  2855. else if (c.prayerActive[19])
  2856. attackLevel *= 1.15;
  2857. //dbow spec
  2858. if (c.fullVoidRange() && c.specAccuracy > 1.15) {
  2859. attackLevel *= 1.75;
  2860. }
  2861. return (int) (attackLevel + (c.playerBonus[4] * 1.95));
  2862. }
  2863.  
  2864. public int calculateRangeDefence() {
  2865. int defenceLevel = c.playerLevel[1];
  2866. if (c.prayerActive[0]) {
  2867. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  2868. } else if (c.prayerActive[5]) {
  2869. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  2870. } else if (c.prayerActive[13]) {
  2871. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  2872. } else if (c.prayerActive[24]) {
  2873. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  2874. } else if (c.prayerActive[25]) {
  2875. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  2876. }
  2877. return (int) (defenceLevel + c.playerBonus[9] + (c.playerBonus[9] / 2));
  2878. }
  2879.  
  2880. public boolean usingBolts() {
  2881. return c.playerEquipment[c.playerArrows] >= 9130 && c.playerEquipment[c.playerArrows] <= 9145 || c.playerEquipment[c.playerArrows] >= 9230 && c.playerEquipment[c.playerArrows] <= 9245;
  2882. }
  2883. public int rangeMaxHit() {
  2884. int rangeLevel = c.playerLevel[4];
  2885. double modifier = 1.0;
  2886. double wtf = c.specDamage;
  2887. int itemUsed = c.usingBow ? c.lastArrowUsed : c.lastWeaponUsed;
  2888. if (c.prayerActive[3])
  2889. modifier += 0.05;
  2890. else if (c.prayerActive[11])
  2891. modifier += 0.10;
  2892. else if (c.prayerActive[19])
  2893. modifier += 0.15;
  2894. if (c.fullVoidRange())
  2895. modifier += 0.20;
  2896. double c = modifier * rangeLevel;
  2897. int rangeStr = getRangeStr(itemUsed);
  2898. double max =(c + 8) * (rangeStr + 64) / 640;
  2899. if (wtf != 1)
  2900. max *= wtf;
  2901. if (max < 1)
  2902. max = 1;
  2903. return (int)max;
  2904. }
  2905.  
  2906. public int getRangeStr(int i) {
  2907. if (i == 4214)
  2908. return 70;
  2909. switch (i) {
  2910. //bronze to rune bolts
  2911. case 877:
  2912. return 10;
  2913. case 9140:
  2914. return 46;
  2915. case 9141:
  2916. return 64;
  2917. case 9142:
  2918. case 9241:
  2919. case 9240:
  2920. return 82;
  2921. case 9143:
  2922. case 9243:
  2923. case 9242:
  2924. return 100;
  2925. case 9144:
  2926. case 9244:
  2927. case 9245:
  2928. return 115;
  2929. //bronze to dragon arrows
  2930. case 882:
  2931. return 7;
  2932. case 884:
  2933. return 10;
  2934. case 886:
  2935. return 16;
  2936. case 888:
  2937. return 22;
  2938. case 890:
  2939. return 31;
  2940. case 892:
  2941. case 4740:
  2942. return 49;
  2943. case 11212:
  2944. return 60;
  2945. //knifes
  2946. case 864:
  2947. return 3;
  2948. case 863:
  2949. return 4;
  2950. case 865:
  2951. return 7;
  2952. case 866:
  2953. return 10;
  2954. case 867:
  2955. return 14;
  2956. case 868:
  2957. return 24;
  2958. }
  2959. return 0;
  2960. }
  2961.  
  2962. /*public int rangeMaxHit() {
  2963. int rangehit = 0;
  2964. rangehit += c.playerLevel[4] / 7.5;
  2965. int weapon = c.lastWeaponUsed;
  2966. int Arrows = c.lastArrowUsed;
  2967. if (weapon == 4223) {//Cbow 1/10
  2968. rangehit = 2;
  2969. rangehit += c.playerLevel[4] / 7;
  2970. } else if (weapon == 4222) {//Cbow 2/10
  2971. rangehit = 3;
  2972. rangehit += c.playerLevel[4] / 7;
  2973. } else if (weapon == 4221) {//Cbow 3/10
  2974. rangehit = 3;
  2975. rangehit += c.playerLevel[4] / 6.5;
  2976. } else if (weapon == 4220) {//Cbow 4/10
  2977. rangehit = 4;
  2978. rangehit += c.playerLevel[4] / 6.5;
  2979. } else if (weapon == 4219) {//Cbow 5/10
  2980. rangehit = 4;
  2981. rangehit += c.playerLevel[4] / 6;
  2982. } else if (weapon == 4218) {//Cbow 6/10
  2983. rangehit = 5;
  2984. rangehit += c.playerLevel[4] / 6;
  2985. } else if (weapon == 4217) {//Cbow 7/10
  2986. rangehit = 5;
  2987. rangehit += c.playerLevel[4] / 5.5;
  2988. } else if (weapon == 4216) {//Cbow 8/10
  2989. rangehit = 6;
  2990. rangehit += c.playerLevel[4] / 5.5;
  2991. } else if (weapon == 4215) {//Cbow 9/10
  2992. rangehit = 6;
  2993. rangehit += c.playerLevel[4] / 5;
  2994. } else if (weapon == 4214) {//Cbow Full
  2995. rangehit = 7;
  2996. rangehit += c.playerLevel[4] / 5;
  2997. } else if (weapon == 6522) {
  2998. rangehit = 5;
  2999. rangehit += c.playerLevel[4] / 6;
  3000. } else if (weapon == 9029) {//dragon darts
  3001. rangehit = 8;
  3002. rangehit += c.playerLevel[4] / 10;
  3003. } else if (weapon == 811 || weapon == 868) {//rune darts
  3004. rangehit = 2;
  3005. rangehit += c.playerLevel[4] / 8.5;
  3006. } else if (weapon == 810 || weapon == 867) {//adamant darts
  3007. rangehit = 2;
  3008. rangehit += c.playerLevel[4] / 9;
  3009. } else if (weapon == 809 || weapon == 866) {//mithril darts
  3010. rangehit = 2;
  3011. rangehit += c.playerLevel[4] / 9.5;
  3012. } else if (weapon == 808 || weapon == 865) {//Steel darts
  3013. rangehit = 2;
  3014. rangehit += c.playerLevel[4] / 10;
  3015. } else if (weapon == 807 || weapon == 863) {//Iron darts
  3016. rangehit = 2;
  3017. rangehit += c.playerLevel[4] / 10.5;
  3018. } else if (weapon == 806 || weapon == 864) {//Bronze darts
  3019. rangehit = 1;
  3020. rangehit += c.playerLevel[4] / 11;
  3021. } else if (Arrows == 4740 && weapon == 4734) {//BoltRacks
  3022. rangehit = 3;
  3023. rangehit += c.playerLevel[4] / 6;
  3024. } else if (Arrows == 11212) {//dragon arrows
  3025. rangehit = 4;
  3026. rangehit += c.playerLevel[4] / 5.5;
  3027. } else if (Arrows == 892) {//rune arrows
  3028. rangehit = 3;
  3029. rangehit += c.playerLevel[4] / 6;
  3030. } else if (Arrows == 890) {//adamant arrows
  3031. rangehit = 2;
  3032. rangehit += c.playerLevel[4] / 7;
  3033. } else if (Arrows == 888) {//mithril arrows
  3034. rangehit = 2;
  3035. rangehit += c.playerLevel[4] / 7.5;
  3036. } else if (Arrows == 886) {//steel arrows
  3037. rangehit = 2;
  3038. rangehit += c.playerLevel[4] / 8;
  3039. } else if (Arrows == 884) {//Iron arrows
  3040. rangehit = 2;
  3041. rangehit += c.playerLevel[4] / 9;
  3042. } else if (Arrows == 882) {//Bronze arrows
  3043. rangehit = 1;
  3044. rangehit += c.playerLevel[4] / 9.5;
  3045. } else if (Arrows == 9244) {
  3046. rangehit = 8;
  3047. rangehit += c.playerLevel[4] / 3;
  3048. } else if (Arrows == 9139) {
  3049. rangehit = 12;
  3050. rangehit += c.playerLevel[4] / 4;
  3051. } else if (Arrows == 9140) {
  3052. rangehit = 2;
  3053. rangehit += c.playerLevel[4] / 7;
  3054. } else if (Arrows == 9141) {
  3055. rangehit = 3;
  3056. rangehit += c.playerLevel[4] / 6;
  3057. } else if (Arrows == 9142) {
  3058. rangehit = 4;
  3059. rangehit += c.playerLevel[4] / 6;
  3060. } else if (Arrows == 9143) {
  3061. rangehit = 7;
  3062. rangehit += c.playerLevel[4] / 5;
  3063. } else if (Arrows == 9144) {
  3064. rangehit = 7;
  3065. rangehit += c.playerLevel[4] / 4.5;
  3066. }
  3067. int bonus = 0;
  3068. bonus -= rangehit / 10;
  3069. rangehit += bonus;
  3070. if (c.specDamage != 1)
  3071. rangehit *= c.specDamage;
  3072. if (rangehit == 0)
  3073. rangehit++;
  3074. if (c.fullVoidRange()) {
  3075. rangehit *= 1.10;
  3076. }
  3077. if (c.prayerActive[3])
  3078. rangehit *= 1.05;
  3079. else if (c.prayerActive[11])
  3080. rangehit *= 1.10;
  3081. else if (c.prayerActive[19])
  3082. rangehit *= 1.15;
  3083. return rangehit;
  3084. }*/
  3085.  
  3086. public boolean properBolts() {
  3087. return c.playerEquipment[c.playerArrows] >= 9140 && c.playerEquipment[c.playerArrows] <= 9144
  3088. || c.playerEquipment[c.playerArrows] >= 9240 && c.playerEquipment[c.playerArrows] <= 9244;
  3089. }
  3090.  
  3091. public int correctBowAndArrows() {
  3092. if (usingBolts())
  3093. return -1;
  3094. switch(c.playerEquipment[c.playerWeapon]) {
  3095.  
  3096. case 839:
  3097. case 841:
  3098. return 882;
  3099.  
  3100. case 843:
  3101. case 845:
  3102. return 884;
  3103.  
  3104. case 847:
  3105. case 849:
  3106. return 886;
  3107.  
  3108. case 851:
  3109. case 853:
  3110. return 888;
  3111.  
  3112. case 855:
  3113. case 857:
  3114. return 890;
  3115.  
  3116. case 859:
  3117. case 861:
  3118. return 892;
  3119.  
  3120. case 4734:
  3121. case 4935:
  3122. case 4936:
  3123. case 4937:
  3124. return 4740;
  3125.  
  3126. case 11235:
  3127. return 11212;
  3128. }
  3129. return -1;
  3130. }
  3131.  
  3132. public int getRangeStartGFX() {
  3133. switch(c.rangeItemUsed) {
  3134.  
  3135. case 863:
  3136. return 220;
  3137. case 864:
  3138. return 219;
  3139. case 865:
  3140. return 221;
  3141. case 866: // knives
  3142. return 223;
  3143. case 867:
  3144. return 224;
  3145. case 868:
  3146. return 225;
  3147. case 869:
  3148. return 222;
  3149.  
  3150. case 806:
  3151. return 232;
  3152. case 807:
  3153. return 233;
  3154. case 808:
  3155. return 234;
  3156. case 809: // darts
  3157. return 235;
  3158. case 810:
  3159. return 236;
  3160. case 811:
  3161. return 237;
  3162.  
  3163. case 825:
  3164. return 206;
  3165. case 826:
  3166. return 207;
  3167. case 827: // javelin
  3168. return 208;
  3169. case 828:
  3170. return 209;
  3171. case 829:
  3172. return 210;
  3173. case 830:
  3174. return 211;
  3175.  
  3176. case 800:
  3177. return 42;
  3178. case 801:
  3179. return 43;
  3180. case 802:
  3181. return 44; // axes
  3182. case 803:
  3183. return 45;
  3184. case 804:
  3185. return 46;
  3186. case 805:
  3187. return 48;
  3188.  
  3189. case 882:
  3190. return 19;
  3191.  
  3192. case 884:
  3193. return 18;
  3194.  
  3195. case 886:
  3196. return 20;
  3197.  
  3198. case 888:
  3199. return 21;
  3200.  
  3201. case 890:
  3202. return 22;
  3203.  
  3204. case 892:
  3205. return 24;
  3206.  
  3207. case 11212:
  3208. return 26;
  3209.  
  3210. case 4212:
  3211. case 4214:
  3212. case 4215:
  3213. case 4216:
  3214. case 4217:
  3215. case 4218:
  3216. case 4219:
  3217. case 4220:
  3218. case 4221:
  3219. case 4222:
  3220. case 4223:
  3221. return 250;
  3222.  
  3223. }
  3224. return -1;
  3225. }
  3226.  
  3227. public int getRangeProjectileGFX() {
  3228. if (c.dbowSpec) {
  3229. return 672;
  3230. }
  3231. if(c.bowSpecShot > 0) {
  3232. switch(c.rangeItemUsed) {
  3233. default:
  3234. return 249;
  3235. }
  3236. }
  3237. if (c.playerEquipment[c.playerWeapon] == 9185)
  3238. return 27;
  3239. switch(c.rangeItemUsed) {
  3240.  
  3241. case 863:
  3242. return 213;
  3243. case 864:
  3244. return 212;
  3245. case 865:
  3246. return 214;
  3247. case 866: // knives
  3248. return 216;
  3249. case 867:
  3250. return 217;
  3251. case 868:
  3252. return 218;
  3253. case 869:
  3254. return 215;
  3255.  
  3256. case 806:
  3257. return 226;
  3258. case 807:
  3259. return 227;
  3260. case 808:
  3261. return 228;
  3262. case 809: // darts
  3263. return 229;
  3264. case 810:
  3265. return 230;
  3266. case 811:
  3267. return 231;
  3268.  
  3269. case 825:
  3270. return 200;
  3271. case 826:
  3272. return 201;
  3273. case 827: // javelin
  3274. return 202;
  3275. case 828:
  3276. return 203;
  3277. case 829:
  3278. return 204;
  3279. case 830:
  3280. return 205;
  3281.  
  3282. case 6522: // Toktz-xil-ul
  3283. return 442;
  3284.  
  3285. case 800:
  3286. return 36;
  3287. case 801:
  3288. return 35;
  3289. case 802:
  3290. return 37; // axes
  3291. case 803:
  3292. return 38;
  3293. case 804:
  3294. return 39;
  3295. case 805:
  3296. return 40;
  3297.  
  3298. case 882:
  3299. return 10;
  3300.  
  3301. case 884:
  3302. return 9;
  3303.  
  3304. case 886:
  3305. return 11;
  3306.  
  3307. case 888:
  3308. return 12;
  3309.  
  3310. case 890:
  3311. return 13;
  3312.  
  3313. case 892:
  3314. return 15;
  3315.  
  3316. case 11212:
  3317. return 17;
  3318.  
  3319. case 4740: // bolt rack
  3320. return 27;
  3321.  
  3322.  
  3323.  
  3324. case 4212:
  3325. case 4214:
  3326. case 4215:
  3327. case 4216:
  3328. case 4217:
  3329. case 4218:
  3330. case 4219:
  3331. case 4220:
  3332. case 4221:
  3333. case 4222:
  3334. case 4223:
  3335. return 249;
  3336.  
  3337.  
  3338. }
  3339. return -1;
  3340. }
  3341.  
  3342. public int getProjectileSpeed() {
  3343. if (c.dbowSpec)
  3344. return 100;
  3345. return 70;
  3346. }
  3347.  
  3348. public int getProjectileShowDelay() {
  3349. switch(c.playerEquipment[c.playerWeapon]) {
  3350. case 863:
  3351. case 864:
  3352. case 865:
  3353. case 866: // knives
  3354. case 867:
  3355. case 868:
  3356. case 869:
  3357.  
  3358. case 806:
  3359. case 807:
  3360. case 808:
  3361. case 809: // darts
  3362. case 810:
  3363. case 811:
  3364.  
  3365. case 825:
  3366. case 826:
  3367. case 827: // javelin
  3368. case 828:
  3369. case 829:
  3370. case 830:
  3371.  
  3372. case 800:
  3373. case 801:
  3374. case 802:
  3375. case 803: // axes
  3376. case 804:
  3377. case 805:
  3378.  
  3379. case 4734:
  3380. case 9185:
  3381. case 4935:
  3382. case 4936:
  3383. case 4937:
  3384. return 15;
  3385.  
  3386.  
  3387. default:
  3388. return 5;
  3389. }
  3390. }
  3391.  
  3392. /**
  3393. *MAGIC
  3394. **/
  3395.  
  3396. public int mageAtk()
  3397. {
  3398. int attackLevel = c.playerLevel[6];
  3399. if (c.fullVoidMage())
  3400. attackLevel += c.getLevelForXP(c.playerXP[6]) * 0.2;
  3401. if (c.prayerActive[4])
  3402. attackLevel *= 1.05;
  3403. else if (c.prayerActive[12])
  3404. attackLevel *= 1.10;
  3405. else if (c.prayerActive[20])
  3406. attackLevel *= 1.15;
  3407. return (int) (attackLevel + (c.playerBonus[3] * 2));
  3408. }
  3409. public int mageDef()
  3410. {
  3411. int defenceLevel = c.playerLevel[1]/2 + c.playerLevel[6]/2;
  3412. if (c.prayerActive[0]) {
  3413. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  3414. } else if (c.prayerActive[3]) {
  3415. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  3416. } else if (c.prayerActive[9]) {
  3417. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  3418. } else if (c.prayerActive[18]) {
  3419. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  3420. } else if (c.prayerActive[19]) {
  3421. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  3422. }
  3423. return (int) (defenceLevel + c.playerBonus[8] + (c.playerBonus[8] / 3));
  3424. }
  3425.  
  3426. public boolean wearingStaff(int runeId) {
  3427. int wep = c.playerEquipment[c.playerWeapon];
  3428. switch (runeId) {
  3429. case 554:
  3430. if (wep == 1387)
  3431. return true;
  3432. break;
  3433. case 555:
  3434. if (wep == 1383)
  3435. return true;
  3436. break;
  3437. case 556:
  3438. if (wep == 1381)
  3439. return true;
  3440. break;
  3441. case 557:
  3442. if (wep == 1385)
  3443. return true;
  3444. break;
  3445. }
  3446. return false;
  3447. }
  3448.  
  3449. public boolean checkMagicReqs(int spell) {
  3450. if(c.usingMagic && Config.RUNES_REQUIRED) { // check for runes
  3451. if((!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][8], c.MAGIC_SPELLS[spell][9]) && !wearingStaff(c.MAGIC_SPELLS[spell][8])) ||
  3452. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][10], c.MAGIC_SPELLS[spell][11]) && !wearingStaff(c.MAGIC_SPELLS[spell][10])) ||
  3453. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][12], c.MAGIC_SPELLS[spell][13]) && !wearingStaff(c.MAGIC_SPELLS[spell][12])) ||
  3454. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][14], c.MAGIC_SPELLS[spell][15]) && !wearingStaff(c.MAGIC_SPELLS[spell][14]))){
  3455. c.sendMessage("You don't have the required runes to cast this spell.");
  3456. return false;
  3457. }
  3458. }
  3459.  
  3460. if(c.usingMagic && c.playerIndex > 0) {
  3461. if(Server.playerHandler.players[c.playerIndex] != null) {
  3462. for(int r = 0; r < c.REDUCE_SPELLS.length; r++){ // reducing spells, confuse etc
  3463. if(Server.playerHandler.players[c.playerIndex].REDUCE_SPELLS[r] == c.MAGIC_SPELLS[spell][0]) {
  3464. c.reduceSpellId = r;
  3465. if((System.currentTimeMillis() - Server.playerHandler.players[c.playerIndex].reduceSpellDelay[c.reduceSpellId]) > Server.playerHandler.players[c.playerIndex].REDUCE_SPELL_TIME[c.reduceSpellId]) {
  3466. Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = true;
  3467. } else {
  3468. Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = false;
  3469. }
  3470. break;
  3471. }
  3472. }
  3473. if(!Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId]) {
  3474. c.sendMessage("That player is currently immune to this spell.");
  3475. c.usingMagic = false;
  3476. c.stopMovement();
  3477. resetPlayerAttack();
  3478. return false;
  3479. }
  3480. }
  3481. }
  3482.  
  3483. int staffRequired = getStaffNeeded();
  3484. if(c.usingMagic && staffRequired > 0 && Config.RUNES_REQUIRED) { // staff required
  3485. if(c.playerEquipment[c.playerWeapon] != staffRequired) {
  3486. c.sendMessage("You need a "+c.getItems().getItemName(staffRequired).toLowerCase()+" to cast this spell.");
  3487. return false;
  3488. }
  3489. }
  3490.  
  3491. if(c.usingMagic && Config.MAGIC_LEVEL_REQUIRED) { // check magic level
  3492. if(c.playerLevel[6] < c.MAGIC_SPELLS[spell][1]) {
  3493. c.sendMessage("You need to have a magic level of " +c.MAGIC_SPELLS[spell][1]+" to cast this spell.");
  3494. return false;
  3495. }
  3496. }
  3497. if(c.usingMagic && Config.RUNES_REQUIRED) {
  3498. if(c.MAGIC_SPELLS[spell][8] > 0) { // deleting runes
  3499. if (!wearingStaff(c.MAGIC_SPELLS[spell][8]))
  3500. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][8], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][8]), c.MAGIC_SPELLS[spell][9]);
  3501. }
  3502. if(c.MAGIC_SPELLS[spell][10] > 0) {
  3503. if (!wearingStaff(c.MAGIC_SPELLS[spell][10]))
  3504. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][10], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][10]), c.MAGIC_SPELLS[spell][11]);
  3505. }
  3506. if(c.MAGIC_SPELLS[spell][12] > 0) {
  3507. if (!wearingStaff(c.MAGIC_SPELLS[spell][12]))
  3508. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][12], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][12]), c.MAGIC_SPELLS[spell][13]);
  3509. }
  3510. if(c.MAGIC_SPELLS[spell][14] > 0) {
  3511. if (!wearingStaff(c.MAGIC_SPELLS[spell][14]))
  3512. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][14], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][14]), c.MAGIC_SPELLS[spell][15]);
  3513. }
  3514. }
  3515. return true;
  3516. }
  3517.  
  3518.  
  3519. public int getFreezeTime() {
  3520. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  3521. case 1572:
  3522. case 12861: // ice rush
  3523. return 10;
  3524.  
  3525. case 1582:
  3526. case 12881: // ice burst
  3527. return 17;
  3528.  
  3529. case 1592:
  3530. case 12871: // ice blitz
  3531. return 25;
  3532.  
  3533. case 12891: // ice barrage
  3534. return 33;
  3535.  
  3536. default:
  3537. return 0;
  3538. }
  3539. }
  3540.  
  3541. public void freezePlayer(int i) {
  3542.  
  3543.  
  3544. }
  3545.  
  3546. public int getStartHeight() {
  3547. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3548. case 1562: // stun
  3549. return 25;
  3550.  
  3551. case 12939:// smoke rush
  3552. return 35;
  3553.  
  3554. case 12987: // shadow rush
  3555. return 38;
  3556.  
  3557. case 12861: // ice rush
  3558. return 15;
  3559.  
  3560. case 12951: // smoke blitz
  3561. return 38;
  3562.  
  3563. case 12999: // shadow blitz
  3564. return 25;
  3565.  
  3566. case 12911: // blood blitz
  3567. return 25;
  3568.  
  3569. default:
  3570. return 43;
  3571. }
  3572. }
  3573.  
  3574.  
  3575.  
  3576. public int getEndHeight() {
  3577. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3578. case 1562: // stun
  3579. return 10;
  3580.  
  3581. case 12939: // smoke rush
  3582. return 20;
  3583.  
  3584. case 12987: // shadow rush
  3585. return 28;
  3586.  
  3587. case 12861: // ice rush
  3588. return 10;
  3589.  
  3590. case 12951: // smoke blitz
  3591. return 28;
  3592.  
  3593. case 12999: // shadow blitz
  3594. return 15;
  3595.  
  3596. case 12911: // blood blitz
  3597. return 10;
  3598.  
  3599. default:
  3600. return 31;
  3601. }
  3602. }
  3603.  
  3604. public int getStartDelay() {
  3605. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3606. case 1539:
  3607. return 60;
  3608.  
  3609. default:
  3610. return 53;
  3611. }
  3612. }
  3613.  
  3614. public int getStaffNeeded() {
  3615. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3616. case 1539:
  3617. return 1409;
  3618.  
  3619. case 12037:
  3620. return 4170;
  3621.  
  3622. case 1190:
  3623. return 2415;
  3624.  
  3625. case 1191:
  3626. return 2416;
  3627.  
  3628. case 1192:
  3629. return 2417;
  3630.  
  3631. default:
  3632. return 0;
  3633. }
  3634. }
  3635.  
  3636. public boolean godSpells() {
  3637. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3638. case 1190:
  3639. return true;
  3640.  
  3641. case 1191:
  3642. return true;
  3643.  
  3644. case 1192:
  3645. return true;
  3646.  
  3647. default:
  3648. return false;
  3649. }
  3650. }
  3651.  
  3652. public int getEndGfxHeight() {
  3653. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  3654. case 12987:
  3655. case 12901:
  3656. case 12861:
  3657. case 12445:
  3658. case 1192:
  3659. case 13011:
  3660. case 12919:
  3661. case 12881:
  3662. case 12999:
  3663. case 12911:
  3664. case 12871:
  3665. case 13023:
  3666. case 12929:
  3667. case 12891:
  3668. return 0;
  3669.  
  3670. default:
  3671. return 100;
  3672. }
  3673. }
  3674.  
  3675. public int getStartGfxHeight() {
  3676. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3677. case 12871:
  3678. case 12891:
  3679. return 0;
  3680.  
  3681. default:
  3682. return 100;
  3683. }
  3684. }
  3685.  
  3686. public void handleDfs() {
  3687. if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  3688. if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  3689. int damage = Misc.random(15) + 5;
  3690. c.startAnimation(2836);
  3691. c.gfx0(600);
  3692. Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  3693. Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  3694. Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  3695. Server.playerHandler.players[c.playerIndex].updateRequired = true;
  3696. c.dfsDelay = System.currentTimeMillis();
  3697. } else {
  3698. c.sendMessage("I should be in combat before using this.");
  3699. }
  3700. } else {
  3701. c.sendMessage("My shield hasn't finished recharging yet.");
  3702. }
  3703. }
  3704.  
  3705. public void handleDfsNPC() {
  3706. if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  3707. if (c.npcIndex > 0 && Server.npcHandler.npcs[c.npcIndex] != null) {
  3708. int damage = Misc.random(15) + 5;
  3709. c.startAnimation(2836);
  3710. c.gfx0(600);
  3711. Server.npcHandler.npcs[c.npcIndex].HP -= damage;
  3712. Server.npcHandler.npcs[c.npcIndex].hitDiff2 = damage;
  3713. Server.npcHandler.npcs[c.npcIndex].hitUpdateRequired2 = true;
  3714. Server.npcHandler.npcs[c.npcIndex].updateRequired = true;
  3715. c.dfsDelay = System.currentTimeMillis();
  3716. } else {
  3717. c.sendMessage("I should be in combat before using this.");
  3718. }
  3719. } else {
  3720. c.sendMessage("My shield hasn't finished recharging yet.");
  3721. }
  3722. }
  3723.  
  3724. public void applyRecoil(int damage, int i) {
  3725. if (damage > 0 && Server.playerHandler.players[i].playerEquipment[c.playerRing] == 2550) {
  3726. int recDamage = damage/10 + 1;
  3727. if (!c.getHitUpdateRequired()) {
  3728. c.setHitDiff(recDamage);
  3729. c.setHitUpdateRequired(true);
  3730. } else if (!c.getHitUpdateRequired2()) {
  3731. c.setHitDiff2(recDamage);
  3732. c.setHitUpdateRequired2(true);
  3733. }
  3734. c.dealDamage(recDamage);
  3735. c.updateRequired = true;
  3736. }
  3737. }
  3738.  
  3739. public int getBonusAttack(int i) {
  3740. switch (Server.npcHandler.npcs[i].npcType) {
  3741. case 2883:
  3742. return Misc.random(50) + 30;
  3743. case 2026:
  3744. case 2027:
  3745. case 2029:
  3746. case 2030:
  3747. return Misc.random(50) + 30;
  3748. }
  3749. return 0;
  3750. }
  3751.  
  3752.  
  3753.  
  3754. public void handleGmaulPlayer() {
  3755. if (c.playerIndex > 0) {
  3756. Client o = (Client)Server.playerHandler.players[c.playerIndex];
  3757. if (c.goodDistance(c.getX(), c.getY(), o.getX(), o.getY(), getRequiredDistance())) {
  3758. if (checkReqs()) {
  3759. if (checkSpecAmount(4153)) {
  3760. boolean hit = Misc.random(calculateMeleeAttack()) > Misc.random(o.getCombat().calculateMeleeDefence());
  3761. int damage = 0;
  3762. if (hit)
  3763. damage = Misc.random(calculateMeleeMaxHit());
  3764. if (o.prayerActive[18] && System.currentTimeMillis() - o.protMeleeDelay > 1500)
  3765. damage *= .6;
  3766. o.handleHitMask(damage);
  3767. c.startAnimation(1667);
  3768. c.gfx100(337);
  3769. o.dealDamage(damage);
  3770. }
  3771. }
  3772. }
  3773. }
  3774. }
  3775.  
  3776. public boolean armaNpc(int i) {
  3777. switch (Server.npcHandler.npcs[i].npcType) {
  3778. case 2558:
  3779. case 2559:
  3780. case 2560:
  3781. case 2561:
  3782. return true;
  3783. }
  3784. return false;
  3785. }
  3786.  
  3787. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement