Guest User

Untitled

a guest
May 23rd, 2010
372
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 112.34 KB | None | 0 0
  1. package server.model.players;
  2.  
  3. import server.Config;
  4. import server.Server;
  5. import server.util.Misc;
  6.  
  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. switch(weapon) {
  1851.  
  1852. case 1305: // dragon long
  1853. c.gfx100(248);
  1854. c.startAnimation(1058);
  1855. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1856. c.specAccuracy = 1.10;
  1857. c.specDamage = 1.20;
  1858. break;
  1859.  
  1860. case 1215: // dragon daggers
  1861. case 1231:
  1862. case 5680:
  1863. case 5698:
  1864. c.gfx100(252);
  1865. c.startAnimation(1062);
  1866. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1867. c.doubleHit = true;
  1868. c.specAccuracy = 1.30;
  1869. c.specDamage = 1.05;
  1870. break;
  1871.  
  1872. case 11730:
  1873. c.gfx100(1224);
  1874. c.startAnimation(7072);
  1875. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1876. c.doubleHit = true;
  1877. c.ssSpec = true;
  1878. c.specAccuracy = 1.30;
  1879. break;
  1880.  
  1881. case 4151: // whip
  1882. if(Server.npcHandler.npcs[i] != null) {
  1883. Server.npcHandler.npcs[i].gfx100(341);
  1884. }
  1885. c.specAccuracy = 1.10;
  1886. c.startAnimation(1658);
  1887. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1888. break;
  1889.  
  1890. case 11694: // ags
  1891. c.startAnimation(7074);
  1892. c.specDamage = 1.25;
  1893. c.specAccuracy = 1.85;
  1894. c.gfx0(1222);
  1895. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1896. break;
  1897.  
  1898. case 11700:
  1899. c.startAnimation(7070);
  1900. c.gfx0(1221);
  1901. c.specAccuracy = 1.25;
  1902. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1903. c.specEffect = 2;
  1904. break;
  1905.  
  1906. case 11696:
  1907. c.startAnimation(7073);
  1908. c.gfx0(1223);
  1909. c.specDamage = 1.10;
  1910. c.specAccuracy = 1.5;
  1911. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1912. c.specEffect = 3;
  1913. break;
  1914.  
  1915. case 11698:
  1916. c.startAnimation(7071);
  1917. c.gfx0(1220);
  1918. c.specAccuracy = 1.25;
  1919. c.specEffect = 4;
  1920. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1921. break;
  1922.  
  1923. case 1249:
  1924. c.startAnimation(405);
  1925. c.gfx100(253);
  1926. if (c.playerIndex > 0) {
  1927. Client o = (Client)Server.playerHandler.players[i];
  1928. o.getPA().getSpeared(c.absX, c.absY);
  1929. }
  1930. break;
  1931.  
  1932. case 3204: // d hally
  1933. c.gfx100(282);
  1934. c.startAnimation(1203);
  1935. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1936. if(Server.npcHandler.npcs[i] != null && c.npcIndex > 0) {
  1937. if(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1)){
  1938. c.doubleHit = true;
  1939. }
  1940. }
  1941. if(Server.playerHandler.players[i] != null && c.playerIndex > 0) {
  1942. if(!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(),Server.playerHandler.players[i].getY(), 1)){
  1943. c.doubleHit = true;
  1944. c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  1945. }
  1946. }
  1947. break;
  1948.  
  1949. case 4153: // maul
  1950. c.startAnimation(1667);
  1951. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1952. /*if (c.playerIndex > 0)
  1953. gmaulPlayer(i);
  1954. else
  1955. gmaulNpc(i);*/
  1956. c.gfx100(337);
  1957. break;
  1958.  
  1959. case 4587: // dscimmy
  1960. c.gfx100(347);
  1961. c.specEffect = 1;
  1962. c.startAnimation(1872);
  1963. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1964. break;
  1965.  
  1966. case 1434: // mace
  1967. c.startAnimation(1060);
  1968. c.gfx100(251);
  1969. c.specMaxHitIncrease = 3;
  1970. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase())+1;
  1971. c.specDamage = 1.35;
  1972. c.specAccuracy = 1.15;
  1973. break;
  1974.  
  1975. case 859: // magic long
  1976. c.usingBow = true;
  1977. c.bowSpecShot = 3;
  1978. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  1979. c.getItems().deleteArrow();
  1980. c.lastWeaponUsed = weapon;
  1981. c.startAnimation(426);
  1982. c.gfx100(250);
  1983. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1984. c.projectileStage = 1;
  1985. if (c.fightMode == 2)
  1986. c.attackTimer--;
  1987. break;
  1988.  
  1989. case 861: // magic short
  1990. c.usingBow = true;
  1991. c.bowSpecShot = 1;
  1992. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  1993. c.getItems().deleteArrow();
  1994. c.lastWeaponUsed = weapon;
  1995. c.startAnimation(1074);
  1996. c.hitDelay = 3;
  1997. c.projectileStage = 1;
  1998. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1999. if (c.fightMode == 2)
  2000. c.attackTimer--;
  2001. if (c.playerIndex > 0)
  2002. fireProjectilePlayer();
  2003. else if (c.npcIndex > 0)
  2004. fireProjectileNpc();
  2005. break;
  2006.  
  2007. case 11235: // dark bow
  2008. c.usingBow = true;
  2009. c.dbowSpec = true;
  2010. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  2011. c.getItems().deleteArrow();
  2012. c.getItems().deleteArrow();
  2013. c.lastWeaponUsed = weapon;
  2014. c.hitDelay = 3;
  2015. c.startAnimation(426);
  2016. c.projectileStage = 1;
  2017. c.gfx100(getRangeStartGFX());
  2018. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  2019. if (c.fightMode == 2)
  2020. c.attackTimer--;
  2021. if (c.playerIndex > 0)
  2022. fireProjectilePlayer();
  2023. else if (c.npcIndex > 0)
  2024. fireProjectileNpc();
  2025. c.specAccuracy = 1.75;
  2026. c.specDamage = 1.50;
  2027. break;
  2028. }
  2029. c.delayedDamage = Misc.random(calculateMeleeMaxHit());
  2030. c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  2031. c.usingSpecial = false;
  2032. c.getItems().updateSpecialBar();
  2033. }
  2034.  
  2035.  
  2036. public boolean checkSpecAmount(int weapon) {
  2037. switch(weapon) {
  2038. case 1249:
  2039. case 1215:
  2040. case 1231:
  2041. case 5680:
  2042. case 5698:
  2043. case 1305:
  2044. case 1434:
  2045. if(c.specAmount >= 2.5) {
  2046. c.specAmount -= 2.5;
  2047. c.getItems().addSpecialBar(weapon);
  2048. return true;
  2049. }
  2050. return false;
  2051.  
  2052. case 4151:
  2053. case 11694:
  2054. case 11698:
  2055. case 4153:
  2056. if(c.specAmount >= 5) {
  2057. c.specAmount -= 5;
  2058. c.getItems().addSpecialBar(weapon);
  2059. return true;
  2060. }
  2061. return false;
  2062.  
  2063. case 3204:
  2064. if(c.specAmount >= 3) {
  2065. c.specAmount -= 3;
  2066. c.getItems().addSpecialBar(weapon);
  2067. return true;
  2068. }
  2069. return false;
  2070.  
  2071. case 1377:
  2072. case 11696:
  2073. case 11730:
  2074. if(c.specAmount >= 10) {
  2075. c.specAmount -= 10;
  2076. c.getItems().addSpecialBar(weapon);
  2077. return true;
  2078. }
  2079. return false;
  2080.  
  2081. case 4587:
  2082. case 859:
  2083. case 861:
  2084. case 11235:
  2085. case 11700:
  2086. if(c.specAmount >= 5.5) {
  2087. c.specAmount -= 5.5;
  2088. c.getItems().addSpecialBar(weapon);
  2089. return true;
  2090. }
  2091. return false;
  2092.  
  2093.  
  2094. default:
  2095. return true; // incase u want to test a weapon
  2096. }
  2097. }
  2098.  
  2099. public void resetPlayerAttack() {
  2100. c.usingMagic = false;
  2101. c.npcIndex = 0;
  2102. c.faceUpdate(0);
  2103. c.playerIndex = 0;
  2104. c.getPA().resetFollow();
  2105. //c.sendMessage("Reset attack.");
  2106. }
  2107.  
  2108. public int getCombatDifference(int combat1, int combat2) {
  2109. if(combat1 > combat2) {
  2110. return (combat1 - combat2);
  2111. }
  2112. if(combat2 > combat1) {
  2113. return (combat2 - combat1);
  2114. }
  2115. return 0;
  2116. }
  2117.  
  2118. /**
  2119. *Get killer id
  2120. **/
  2121.  
  2122. public int getKillerId(int playerId) {
  2123. int oldDamage = 0;
  2124. int count = 0;
  2125. int killerId = 0;
  2126. for (int i = 1; i < Config.MAX_PLAYERS; i++) {
  2127. if (Server.playerHandler.players[i] != null) {
  2128. if(Server.playerHandler.players[i].killedBy == playerId) {
  2129. if (Server.playerHandler.players[i].withinDistance(Server.playerHandler.players[playerId])) {
  2130. if(Server.playerHandler.players[i].totalPlayerDamageDealt > oldDamage) {
  2131. oldDamage = Server.playerHandler.players[i].totalPlayerDamageDealt;
  2132. killerId = i;
  2133. }
  2134. }
  2135. Server.playerHandler.players[i].totalPlayerDamageDealt = 0;
  2136. Server.playerHandler.players[i].killedBy = 0;
  2137. }
  2138. }
  2139. }
  2140. return killerId;
  2141. }
  2142.  
  2143.  
  2144.  
  2145. double[] prayerData = {
  2146. 1, // Thick Skin.
  2147. 1, // Burst of Strength.
  2148. 1, // Clarity of Thought.
  2149. 1, // Sharp Eye.
  2150. 1, // Mystic Will.
  2151. 2, // Rock Skin.
  2152. 2, // SuperHuman Strength.
  2153. 2, // Improved Reflexes.
  2154. 0.4, // Rapid restore.
  2155. 0.6, // Rapid Heal.
  2156. 0.6, // Protect Items.
  2157. 1.5, // Hawk eye.
  2158. 2, // Mystic Lore.
  2159. 4, // Steel Skin.
  2160. 4, // Ultimate Strength.
  2161. 4, // Incredible Reflexes.
  2162. 4, // Protect from Magic.
  2163. 4, // Protect from Missiles.
  2164. 4, // Protect from Melee.
  2165. 4, // Eagle Eye.
  2166. 4, // Mystic Might.
  2167. 1, // Retribution.
  2168. 2, // Redemption.
  2169. 6, // Smite.
  2170. 8, // Chivalry.
  2171. 8, // Piety.
  2172. };
  2173.  
  2174. public void handlePrayerDrain() {
  2175. c.usingPrayer = false;
  2176. double toRemove = 0.0;
  2177. for (int j = 0; j < prayerData.length; j++) {
  2178. if (c.prayerActive[j]) {
  2179. toRemove += prayerData[j]/20;
  2180. c.usingPrayer = true;
  2181. }
  2182. }
  2183. if (toRemove > 0) {
  2184. toRemove /= (1 + (0.035 * c.playerBonus[11]));
  2185. }
  2186. c.prayerPoint -= toRemove;
  2187. if (c.prayerPoint <= 0) {
  2188. c.prayerPoint = 1.0 + c.prayerPoint;
  2189. reducePrayerLevel();
  2190. }
  2191.  
  2192. }
  2193.  
  2194. public void reducePrayerLevel() {
  2195. if(c.playerLevel[5] - 1 > 0) {
  2196. c.playerLevel[5] -= 1;
  2197. } else {
  2198. c.sendMessage("You have run out of prayer points!");
  2199. c.playerLevel[5] = 0;
  2200. resetPrayers();
  2201. c.prayerId = -1;
  2202. }
  2203. c.getPA().refreshSkill(5);
  2204. }
  2205.  
  2206. public void resetPrayers() {
  2207. for(int i = 0; i < c.prayerActive.length; i++) {
  2208. c.prayerActive[i] = false;
  2209. c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  2210. }
  2211. c.headIcon = -1;
  2212. c.getPA().requestUpdates();
  2213. }
  2214.  
  2215. /**
  2216. * Wildy and duel info
  2217. **/
  2218.  
  2219. public boolean checkReqs() {
  2220. if(Server.playerHandler.players[c.playerIndex] == null) {
  2221. return false;
  2222. }
  2223. if (c.playerIndex == c.playerId)
  2224. return false;
  2225. if (c.inPits && Server.playerHandler.players[c.playerIndex].inPits)
  2226. return true;
  2227. if(Server.playerHandler.players[c.playerIndex].inDuelArena() && c.duelStatus != 5 && !c.usingMagic) {
  2228. if(c.arenas() || c.duelStatus == 5) {
  2229. c.sendMessage("You can't challenge inside the arena!");
  2230. return false;
  2231. }
  2232. c.getTradeAndDuel().requestDuel(c.playerIndex);
  2233. return false;
  2234. }
  2235. if(c.duelStatus == 5 && Server.playerHandler.players[c.playerIndex].duelStatus == 5) {
  2236. if(Server.playerHandler.players[c.playerIndex].duelingWith == c.getId()) {
  2237. return true;
  2238. } else {
  2239. c.sendMessage("This isn't your opponent!");
  2240. return false;
  2241. }
  2242. }
  2243. if(!Server.playerHandler.players[c.playerIndex].inWild()) {
  2244. c.sendMessage("That player is not in the wilderness.");
  2245. c.stopMovement();
  2246. c.getCombat().resetPlayerAttack();
  2247. return false;
  2248. }
  2249. if(!c.inWild()) {
  2250. c.sendMessage("You are not in the wilderness.");
  2251. c.stopMovement();
  2252. c.getCombat().resetPlayerAttack();
  2253. return false;
  2254. }
  2255. if(Config.COMBAT_LEVEL_DIFFERENCE) {
  2256. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[c.playerIndex].combatLevel);
  2257. if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[c.playerIndex].wildLevel) {
  2258. c.sendMessage("Your combat level difference is too great to attack that player here.");
  2259. c.stopMovement();
  2260. c.getCombat().resetPlayerAttack();
  2261. return false;
  2262. }
  2263. }
  2264.  
  2265. if(Config.SINGLE_AND_MULTI_ZONES) {
  2266. if(!Server.playerHandler.players[c.playerIndex].inMulti()) { // single combat zones
  2267. if(Server.playerHandler.players[c.playerIndex].underAttackBy != c.playerId && Server.playerHandler.players[c.playerIndex].underAttackBy != 0) {
  2268. c.sendMessage("That player is already in combat.");
  2269. c.stopMovement();
  2270. c.getCombat().resetPlayerAttack();
  2271. return false;
  2272. }
  2273. if(Server.playerHandler.players[c.playerIndex].playerId != c.underAttackBy && c.underAttackBy != 0 || c.underAttackBy2 > 0) {
  2274. c.sendMessage("You are already in combat.");
  2275. c.stopMovement();
  2276. c.getCombat().resetPlayerAttack();
  2277. return false;
  2278. }
  2279. }
  2280. }
  2281. return true;
  2282. }
  2283.  
  2284. public boolean checkMultiBarrageReqs(int i) {
  2285. if(Server.playerHandler.players[i] == null) {
  2286. return false;
  2287. }
  2288. if (i == c.playerId)
  2289. return false;
  2290. if (c.inPits && Server.playerHandler.players[i].inPits)
  2291. return true;
  2292. if(!Server.playerHandler.players[i].inWild()) {
  2293. return false;
  2294. }
  2295. if(Config.COMBAT_LEVEL_DIFFERENCE) {
  2296. int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[i].combatLevel);
  2297. if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[i].wildLevel) {
  2298. c.sendMessage("Your combat level difference is too great to attack that player here.");
  2299. return false;
  2300. }
  2301. }
  2302.  
  2303. if(Config.SINGLE_AND_MULTI_ZONES) {
  2304. if(!Server.playerHandler.players[i].inMulti()) { // single combat zones
  2305. if(Server.playerHandler.players[i].underAttackBy != c.playerId && Server.playerHandler.players[i].underAttackBy != 0) {
  2306. return false;
  2307. }
  2308. if(Server.playerHandler.players[i].playerId != c.underAttackBy && c.underAttackBy != 0) {
  2309. c.sendMessage("You are already in combat.");
  2310. return false;
  2311. }
  2312. }
  2313. }
  2314. return true;
  2315. }
  2316.  
  2317. /**
  2318. *Weapon stand, walk, run, etc emotes
  2319. **/
  2320.  
  2321. public void getPlayerAnimIndex(String weaponName){
  2322. c.playerStandIndex = 0x328;
  2323. c.playerTurnIndex = 0x337;
  2324. c.playerWalkIndex = 0x333;
  2325. c.playerTurn180Index = 0x334;
  2326. c.playerTurn90CWIndex = 0x335;
  2327. c.playerTurn90CCWIndex = 0x336;
  2328. c.playerRunIndex = 0x338;
  2329.  
  2330. if(weaponName.contains("halberd") || weaponName.contains("guthan")) {
  2331. c.playerStandIndex = 809;
  2332. c.playerWalkIndex = 1146;
  2333. c.playerRunIndex = 1210;
  2334. return;
  2335. }
  2336. if(weaponName.contains("dharok")) {
  2337. c.playerStandIndex = 0x811;
  2338. c.playerWalkIndex = 0x67F;
  2339. c.playerRunIndex = 0x680;
  2340. return;
  2341. }
  2342. if(weaponName.contains("ahrim")) {
  2343. c.playerStandIndex = 809;
  2344. c.playerWalkIndex = 1146;
  2345. c.playerRunIndex = 1210;
  2346. return;
  2347. }
  2348. if(weaponName.contains("verac")) {
  2349. c.playerStandIndex = 1832;
  2350. c.playerWalkIndex = 1830;
  2351. c.playerRunIndex = 1831;
  2352. return;
  2353. }
  2354. if (weaponName.contains("wand") || weaponName.contains("staff")) {
  2355. c.playerStandIndex = 809;
  2356. c.playerRunIndex = 1210;
  2357. c.playerWalkIndex = 1146;
  2358. return;
  2359. }
  2360. if(weaponName.contains("karil")) {
  2361. c.playerStandIndex = 2074;
  2362. c.playerWalkIndex = 2076;
  2363. c.playerRunIndex = 2077;
  2364. return;
  2365. }
  2366. if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("saradomin sw")) {
  2367. c.playerStandIndex = 7047;
  2368. c.playerWalkIndex = 7046;
  2369. c.playerRunIndex = 7039;
  2370. return;
  2371. }
  2372. if(weaponName.contains("bow")) {
  2373. c.playerStandIndex = 808;
  2374. c.playerWalkIndex = 819;
  2375. c.playerRunIndex = 824;
  2376. return;
  2377. }
  2378.  
  2379. switch(c.playerEquipment[c.playerWeapon]) {
  2380. case 4151:
  2381. c.playerStandIndex = 1832;
  2382. c.playerWalkIndex = 1660;
  2383. c.playerRunIndex = 1661;
  2384. break;
  2385. case 6528:
  2386. c.playerStandIndex = 0x811;
  2387. c.playerWalkIndex = 2064;
  2388. c.playerRunIndex = 1664;
  2389. break;
  2390. case 4153:
  2391. c.playerStandIndex = 1662;
  2392. c.playerWalkIndex = 1663;
  2393. c.playerRunIndex = 1664;
  2394. break;
  2395. case 11694:
  2396. case 11696:
  2397. case 11730:
  2398. case 11698:
  2399. case 11700:
  2400. c.playerStandIndex = 7047;
  2401. c.playerWalkIndex = 7040;
  2402. c.playerRunIndex = 7039;
  2403. break;
  2404. case 1305:
  2405. c.playerStandIndex = 809;
  2406. break;
  2407. }
  2408. }
  2409.  
  2410. /**
  2411. * Weapon emotes
  2412. **/
  2413.  
  2414. public int getWepAnim(String weaponName) {
  2415. if(c.playerEquipment[c.playerWeapon] <= 0) {
  2416. switch(c.fightMode) {
  2417. case 0:
  2418. return 422;
  2419. case 2:
  2420. return 423;
  2421. case 1:
  2422. return 451;
  2423. }
  2424. }
  2425. if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe")){
  2426. return 806;
  2427. }
  2428. if(weaponName.contains("halberd")) {
  2429. return 440;
  2430. }
  2431. if(weaponName.startsWith("dragon dagger")) {
  2432. return 402;
  2433. }
  2434. if(weaponName.endsWith("dagger")) {
  2435. return 412;
  2436. }
  2437. if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("aradomin sword")) {
  2438. return 7041;
  2439. }
  2440. if(weaponName.contains("sword")) {
  2441. return 451;
  2442. }
  2443. if(weaponName.contains("karil")) {
  2444. return 2075;
  2445. }
  2446.  
  2447. if(weaponName.contains("bow") && !weaponName.contains("'bow")) {
  2448. return 426;
  2449. }
  2450. if (weaponName.contains("'bow"))
  2451. return 4230;
  2452.  
  2453. switch(c.playerEquipment[c.playerWeapon]) { // if you don't want to use strings
  2454. case 6522:
  2455. return 2614;
  2456. case 4153: // granite maul
  2457. return 1665;
  2458. case 4726: // guthan
  2459. return 2080;
  2460. case 4747: // torag
  2461. return 0x814;
  2462. case 4718: // dharok
  2463. return 2067;
  2464. case 4710: // ahrim
  2465. return 406;
  2466. case 4755: // verac
  2467. return 2062;
  2468. case 4734: // karil
  2469. return 2075;
  2470. case 4151:
  2471. return 1658;
  2472. case 6528:
  2473. return 2661;
  2474. default:
  2475. return 451;
  2476. }
  2477. }
  2478.  
  2479. /**
  2480. * Block emotes
  2481. */
  2482. public int getBlockEmote() {
  2483. if (c.playerEquipment[c.playerShield] >= 8844 && c.playerEquipment[c.playerShield] <= 8850) {
  2484. return 4177;
  2485. }
  2486. switch(c.playerEquipment[c.playerWeapon]) {
  2487. case 4755:
  2488. return 2063;
  2489.  
  2490. case 4153:
  2491. return 1666;
  2492.  
  2493. case 4151:
  2494. return 1659;
  2495.  
  2496. case 11694:
  2497. case 11698:
  2498. case 11700:
  2499. case 11696:
  2500. case 11730:
  2501. return 7050;
  2502. default:
  2503. return 7050;
  2504. }
  2505. }
  2506.  
  2507. /**
  2508. * Weapon and magic attack speed!
  2509. **/
  2510.  
  2511. public int getAttackDelay(String s) {
  2512. if(c.usingMagic) {
  2513. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  2514. case 12871: // ice blitz
  2515. case 13023: // shadow barrage
  2516. case 12891: // ice barrage
  2517. return 5;
  2518.  
  2519. default:
  2520. return 5;
  2521. }
  2522. }
  2523. if(c.playerEquipment[c.playerWeapon] == -1)
  2524. return 4;//unarmed
  2525.  
  2526. switch (c.playerEquipment[c.playerWeapon]) {
  2527. case 11235:
  2528. return 9;
  2529. case 11730:
  2530. return 4;
  2531. case 6528:
  2532. return 7;
  2533. }
  2534.  
  2535. if(s.endsWith("greataxe"))
  2536. return 7;
  2537. else if(s.equals("torags hammers"))
  2538. return 5;
  2539. else if(s.equals("guthans warspear"))
  2540. return 5;
  2541. else if(s.equals("veracs flail"))
  2542. return 5;
  2543. else if(s.equals("ahrims staff"))
  2544. return 6;
  2545. else if(s.contains("staff")){
  2546. if(s.contains("zamarok") || s.contains("guthix") || s.contains("saradomian") || s.contains("slayer") || s.contains("ancient"))
  2547. return 4;
  2548. else
  2549. return 5;
  2550. } else if(s.contains("bow")){
  2551. if(s.contains("composite") || s.equals("seercull"))
  2552. return 5;
  2553. else if (s.contains("aril"))
  2554. return 4;
  2555. else if(s.contains("Ogre"))
  2556. return 8;
  2557. else if(s.contains("short") || s.contains("hunt") || s.contains("sword"))
  2558. return 4;
  2559. else if(s.contains("long") || s.contains("crystal"))
  2560. return 6;
  2561. else if(s.contains("'bow"))
  2562. return 7;
  2563.  
  2564. return 5;
  2565. }
  2566. else if(s.contains("dagger"))
  2567. return 4;
  2568. else if(s.contains("godsword") || s.contains("2h"))
  2569. return 6;
  2570. else if(s.contains("longsword"))
  2571. return 5;
  2572. else if(s.contains("sword"))
  2573. return 4;
  2574. else if(s.contains("scimitar"))
  2575. return 4;
  2576. else if(s.contains("mace"))
  2577. return 5;
  2578. else if(s.contains("battleaxe"))
  2579. return 6;
  2580. else if(s.contains("pickaxe"))
  2581. return 5;
  2582. else if(s.contains("thrownaxe"))
  2583. return 5;
  2584. else if(s.contains("axe"))
  2585. return 5;
  2586. else if(s.contains("warhammer"))
  2587. return 6;
  2588. else if(s.contains("2h"))
  2589. return 7;
  2590. else if(s.contains("spear"))
  2591. return 5;
  2592. else if(s.contains("claw"))
  2593. return 4;
  2594. else if(s.contains("halberd"))
  2595. return 7;
  2596.  
  2597. //sara sword, 2400ms
  2598. else if(s.equals("granite maul"))
  2599. return 7;
  2600. else if(s.equals("toktz-xil-ak"))//sword
  2601. return 4;
  2602. else if(s.equals("tzhaar-ket-em"))//mace
  2603. return 5;
  2604. else if(s.equals("tzhaar-ket-om"))//maul
  2605. return 7;
  2606. else if(s.equals("toktz-xil-ek"))//knife
  2607. return 4;
  2608. else if(s.equals("toktz-xil-ul"))//rings
  2609. return 4;
  2610. else if(s.equals("toktz-mej-tal"))//staff
  2611. return 6;
  2612. else if(s.contains("whip"))
  2613. return 4;
  2614. else if(s.contains("dart"))
  2615. return 3;
  2616. else if(s.contains("knife"))
  2617. return 3;
  2618. else if(s.contains("javelin"))
  2619. return 6;
  2620. return 5;
  2621. }
  2622. /**
  2623. * How long it takes to hit your enemy
  2624. **/
  2625. public int getHitDelay(String weaponName) {
  2626. if(c.usingMagic) {
  2627. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  2628. case 12891:
  2629. return 4;
  2630. case 12871:
  2631. return 6;
  2632. default:
  2633. return 4;
  2634. }
  2635. } else {
  2636.  
  2637. if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe")){
  2638. return 3;
  2639. }
  2640. if(weaponName.contains("cross") || weaponName.contains("c'bow")) {
  2641. return 4;
  2642. }
  2643. if(weaponName.contains("bow") && !c.dbowSpec) {
  2644. return 4;
  2645. } else if (c.dbowSpec) {
  2646. return 4;
  2647. }
  2648.  
  2649. switch(c.playerEquipment[c.playerWeapon]) {
  2650. case 6522: // Toktz-xil-ul
  2651. return 3;
  2652.  
  2653.  
  2654. default:
  2655. return 2;
  2656. }
  2657. }
  2658. }
  2659.  
  2660. public int getRequiredDistance() {
  2661. if (c.followId > 0 && c.freezeTimer <= 0 && !c.isMoving)
  2662. return 2;
  2663. else if(c.followId > 0 && c.freezeTimer <= 0 && c.isMoving) {
  2664. return 3;
  2665. } else {
  2666. return 1;
  2667. }
  2668. }
  2669.  
  2670. public boolean usingHally() {
  2671. switch(c.playerEquipment[c.playerWeapon]) {
  2672. case 3190:
  2673. case 3192:
  2674. case 3194:
  2675. case 3196:
  2676. case 3198:
  2677. case 3200:
  2678. case 3202:
  2679. case 3204:
  2680. return true;
  2681.  
  2682. default:
  2683. return false;
  2684. }
  2685. }
  2686.  
  2687. /**
  2688. * Melee
  2689. **/
  2690.  
  2691. public int calculateMeleeAttack() {
  2692. int attackLevel = c.playerLevel[0];
  2693. //2, 5, 11, 18, 19
  2694. if (c.prayerActive[2]) {
  2695. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.05;
  2696. } else if (c.prayerActive[7]) {
  2697. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  2698. } else if (c.prayerActive[15]) {
  2699. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15;
  2700. } else if (c.prayerActive[24]) {
  2701. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15;
  2702. } else if (c.prayerActive[25]) {
  2703. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.2;
  2704. }
  2705. if (c.fullVoidMelee())
  2706. attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  2707. attackLevel *= c.specAccuracy;
  2708. //c.sendMessage("Attack: " + (attackLevel + (c.playerBonus[bestMeleeAtk()] * 2)));
  2709. int i = c.playerBonus[bestMeleeAtk()];
  2710. i += c.bonusAttack;
  2711. if (c.playerEquipment[c.playerAmulet] == 11128 && c.playerEquipment[c.playerWeapon] == 6528) {
  2712. i *= 1.30;
  2713. }
  2714. return (int)(attackLevel + (attackLevel * 0.15) + (i + i * 0.05));
  2715. }
  2716. public int bestMeleeAtk()
  2717. {
  2718. if(c.playerBonus[0] > c.playerBonus[1] && c.playerBonus[0] > c.playerBonus[2])
  2719. return 0;
  2720. if(c.playerBonus[1] > c.playerBonus[0] && c.playerBonus[1] > c.playerBonus[2])
  2721. return 1;
  2722. return c.playerBonus[2] <= c.playerBonus[1] || c.playerBonus[2] <= c.playerBonus[0] ? 0 : 2;
  2723. }
  2724.  
  2725. public int calculateMeleeMaxHit() {
  2726. double maxHit = 0;
  2727. int strBonus = c.playerBonus[10];
  2728. int strength = c.playerLevel[2];
  2729. int lvlForXP = c.getLevelForXP(c.playerXP[2]);
  2730. if(c.prayerActive[1]) {
  2731. strength += (int)(lvlForXP * .05);
  2732. } else
  2733. if(c.prayerActive[6]) {
  2734. strength += (int)(lvlForXP * .10);
  2735. } else
  2736. if(c.prayerActive[14]) {
  2737. strength += (int)(lvlForXP * .15);
  2738. } else
  2739. if(c.prayerActive[24]) {
  2740. strength += (int)(lvlForXP * .18);
  2741. } else
  2742. if(c.prayerActive[25]) {
  2743. strength += (int)(lvlForXP * .23);
  2744. }
  2745. if(c.playerEquipment[c.playerHat] == 2526 && c.playerEquipment[c.playerChest] == 2520 && c.playerEquipment[c.playerLegs] == 2522) {
  2746. maxHit += (maxHit * 10 / 100);
  2747. }
  2748. maxHit += 1.05D + (double)(strBonus * strength) * 0.00175D;
  2749. maxHit += (double)strength * 0.11D;
  2750. if(c.playerEquipment[c.playerWeapon] == 4718 && c.playerEquipment[c.playerHat] == 4716 && c.playerEquipment[c.playerChest] == 4720 && c.playerEquipment[c.playerLegs] == 4722) {
  2751. maxHit += (c.getPA().getLevelForXP(c.playerXP[3]) - c.playerLevel[3]) / 2;
  2752. }
  2753. if (c.specDamage > 1)
  2754. maxHit = (int)(maxHit * c.specDamage);
  2755. if (maxHit < 0)
  2756. maxHit = 1;
  2757. if (c.fullVoidMelee())
  2758. maxHit = (int)(maxHit * 1.10);
  2759. if (c.playerEquipment[c.playerAmulet] == 11128 && c.playerEquipment[c.playerWeapon] == 6528) {
  2760. maxHit *= 1.20;
  2761. }
  2762. return (int)Math.floor(maxHit);
  2763. }
  2764.  
  2765.  
  2766. public int calculateMeleeDefence()
  2767. {
  2768. int defenceLevel = c.playerLevel[1];
  2769. int i = c.playerBonus[bestMeleeDef()];
  2770. if (c.prayerActive[0]) {
  2771. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  2772. } else if (c.prayerActive[5]) {
  2773. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  2774. } else if (c.prayerActive[13]) {
  2775. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  2776. } else if (c.prayerActive[24]) {
  2777. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  2778. } else if (c.prayerActive[25]) {
  2779. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  2780. }
  2781. return (int)(defenceLevel + (defenceLevel * 0.15) + (i + i * 0.05));
  2782. }
  2783.  
  2784. public int bestMeleeDef()
  2785. {
  2786. if(c.playerBonus[5] > c.playerBonus[6] && c.playerBonus[5] > c.playerBonus[7])
  2787. return 5;
  2788. if(c.playerBonus[6] > c.playerBonus[5] && c.playerBonus[6] > c.playerBonus[7])
  2789. return 6;
  2790. return c.playerBonus[7] <= c.playerBonus[5] || c.playerBonus[7] <= c.playerBonus[6] ? 5 : 7;
  2791. }
  2792.  
  2793. /**
  2794. * Range
  2795. **/
  2796.  
  2797. public int calculateRangeAttack() {
  2798. int attackLevel = c.playerLevel[4];
  2799. attackLevel *= c.specAccuracy;
  2800. if (c.fullVoidRange())
  2801. attackLevel += c.getLevelForXP(c.playerXP[c.playerRanged]) * 0.1;
  2802. if (c.prayerActive[3])
  2803. attackLevel *= 1.05;
  2804. else if (c.prayerActive[11])
  2805. attackLevel *= 1.10;
  2806. else if (c.prayerActive[19])
  2807. attackLevel *= 1.15;
  2808. //dbow spec
  2809. if (c.fullVoidRange() && c.specAccuracy > 1.15) {
  2810. attackLevel *= 1.75;
  2811. }
  2812. return (int) (attackLevel + (c.playerBonus[4] * 1.95));
  2813. }
  2814.  
  2815. public int calculateRangeDefence() {
  2816. int defenceLevel = c.playerLevel[1];
  2817. if (c.prayerActive[0]) {
  2818. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  2819. } else if (c.prayerActive[5]) {
  2820. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  2821. } else if (c.prayerActive[13]) {
  2822. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  2823. } else if (c.prayerActive[24]) {
  2824. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  2825. } else if (c.prayerActive[25]) {
  2826. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  2827. }
  2828. return (int) (defenceLevel + c.playerBonus[9] + (c.playerBonus[9] / 2));
  2829. }
  2830.  
  2831. public boolean usingBolts() {
  2832. return c.playerEquipment[c.playerArrows] >= 9130 && c.playerEquipment[c.playerArrows] <= 9145 || c.playerEquipment[c.playerArrows] >= 9230 && c.playerEquipment[c.playerArrows] <= 9245;
  2833. }
  2834. public int rangeMaxHit() {
  2835. int rangeLevel = c.playerLevel[4];
  2836. double modifier = 1.0;
  2837. double wtf = c.specDamage;
  2838. int itemUsed = c.usingBow ? c.lastArrowUsed : c.lastWeaponUsed;
  2839. if (c.prayerActive[3])
  2840. modifier += 0.05;
  2841. else if (c.prayerActive[11])
  2842. modifier += 0.10;
  2843. else if (c.prayerActive[19])
  2844. modifier += 0.15;
  2845. if (c.fullVoidRange())
  2846. modifier += 0.20;
  2847. double c = modifier * rangeLevel;
  2848. int rangeStr = getRangeStr(itemUsed);
  2849. double max =(c + 8) * (rangeStr + 64) / 640;
  2850. if (wtf != 1)
  2851. max *= wtf;
  2852. if (max < 1)
  2853. max = 1;
  2854. return (int)max;
  2855. }
  2856.  
  2857. public int getRangeStr(int i) {
  2858. if (i == 4214)
  2859. return 70;
  2860. switch (i) {
  2861. //bronze to rune bolts
  2862. case 877:
  2863. return 10;
  2864. case 9140:
  2865. return 46;
  2866. case 9141:
  2867. return 64;
  2868. case 9142:
  2869. case 9241:
  2870. case 9240:
  2871. return 82;
  2872. case 9143:
  2873. case 9243:
  2874. case 9242:
  2875. return 100;
  2876. case 9144:
  2877. case 9244:
  2878. case 9245:
  2879. return 115;
  2880. //bronze to dragon arrows
  2881. case 882:
  2882. return 7;
  2883. case 884:
  2884. return 10;
  2885. case 886:
  2886. return 16;
  2887. case 888:
  2888. return 22;
  2889. case 890:
  2890. return 31;
  2891. case 892:
  2892. case 4740:
  2893. return 49;
  2894. case 11212:
  2895. return 60;
  2896. //knifes
  2897. case 864:
  2898. return 3;
  2899. case 863:
  2900. return 4;
  2901. case 865:
  2902. return 7;
  2903. case 866:
  2904. return 10;
  2905. case 867:
  2906. return 14;
  2907. case 868:
  2908. return 24;
  2909. }
  2910. return 0;
  2911. }
  2912.  
  2913. /*public int rangeMaxHit() {
  2914. int rangehit = 0;
  2915. rangehit += c.playerLevel[4] / 7.5;
  2916. int weapon = c.lastWeaponUsed;
  2917. int Arrows = c.lastArrowUsed;
  2918. if (weapon == 4223) {//Cbow 1/10
  2919. rangehit = 2;
  2920. rangehit += c.playerLevel[4] / 7;
  2921. } else if (weapon == 4222) {//Cbow 2/10
  2922. rangehit = 3;
  2923. rangehit += c.playerLevel[4] / 7;
  2924. } else if (weapon == 4221) {//Cbow 3/10
  2925. rangehit = 3;
  2926. rangehit += c.playerLevel[4] / 6.5;
  2927. } else if (weapon == 4220) {//Cbow 4/10
  2928. rangehit = 4;
  2929. rangehit += c.playerLevel[4] / 6.5;
  2930. } else if (weapon == 4219) {//Cbow 5/10
  2931. rangehit = 4;
  2932. rangehit += c.playerLevel[4] / 6;
  2933. } else if (weapon == 4218) {//Cbow 6/10
  2934. rangehit = 5;
  2935. rangehit += c.playerLevel[4] / 6;
  2936. } else if (weapon == 4217) {//Cbow 7/10
  2937. rangehit = 5;
  2938. rangehit += c.playerLevel[4] / 5.5;
  2939. } else if (weapon == 4216) {//Cbow 8/10
  2940. rangehit = 6;
  2941. rangehit += c.playerLevel[4] / 5.5;
  2942. } else if (weapon == 4215) {//Cbow 9/10
  2943. rangehit = 6;
  2944. rangehit += c.playerLevel[4] / 5;
  2945. } else if (weapon == 4214) {//Cbow Full
  2946. rangehit = 7;
  2947. rangehit += c.playerLevel[4] / 5;
  2948. } else if (weapon == 6522) {
  2949. rangehit = 5;
  2950. rangehit += c.playerLevel[4] / 6;
  2951. } else if (weapon == 9029) {//dragon darts
  2952. rangehit = 8;
  2953. rangehit += c.playerLevel[4] / 10;
  2954. } else if (weapon == 811 || weapon == 868) {//rune darts
  2955. rangehit = 2;
  2956. rangehit += c.playerLevel[4] / 8.5;
  2957. } else if (weapon == 810 || weapon == 867) {//adamant darts
  2958. rangehit = 2;
  2959. rangehit += c.playerLevel[4] / 9;
  2960. } else if (weapon == 809 || weapon == 866) {//mithril darts
  2961. rangehit = 2;
  2962. rangehit += c.playerLevel[4] / 9.5;
  2963. } else if (weapon == 808 || weapon == 865) {//Steel darts
  2964. rangehit = 2;
  2965. rangehit += c.playerLevel[4] / 10;
  2966. } else if (weapon == 807 || weapon == 863) {//Iron darts
  2967. rangehit = 2;
  2968. rangehit += c.playerLevel[4] / 10.5;
  2969. } else if (weapon == 806 || weapon == 864) {//Bronze darts
  2970. rangehit = 1;
  2971. rangehit += c.playerLevel[4] / 11;
  2972. } else if (Arrows == 4740 && weapon == 4734) {//BoltRacks
  2973. rangehit = 3;
  2974. rangehit += c.playerLevel[4] / 6;
  2975. } else if (Arrows == 11212) {//dragon arrows
  2976. rangehit = 4;
  2977. rangehit += c.playerLevel[4] / 5.5;
  2978. } else if (Arrows == 892) {//rune arrows
  2979. rangehit = 3;
  2980. rangehit += c.playerLevel[4] / 6;
  2981. } else if (Arrows == 890) {//adamant arrows
  2982. rangehit = 2;
  2983. rangehit += c.playerLevel[4] / 7;
  2984. } else if (Arrows == 888) {//mithril arrows
  2985. rangehit = 2;
  2986. rangehit += c.playerLevel[4] / 7.5;
  2987. } else if (Arrows == 886) {//steel arrows
  2988. rangehit = 2;
  2989. rangehit += c.playerLevel[4] / 8;
  2990. } else if (Arrows == 884) {//Iron arrows
  2991. rangehit = 2;
  2992. rangehit += c.playerLevel[4] / 9;
  2993. } else if (Arrows == 882) {//Bronze arrows
  2994. rangehit = 1;
  2995. rangehit += c.playerLevel[4] / 9.5;
  2996. } else if (Arrows == 9244) {
  2997. rangehit = 8;
  2998. rangehit += c.playerLevel[4] / 3;
  2999. } else if (Arrows == 9139) {
  3000. rangehit = 12;
  3001. rangehit += c.playerLevel[4] / 4;
  3002. } else if (Arrows == 9140) {
  3003. rangehit = 2;
  3004. rangehit += c.playerLevel[4] / 7;
  3005. } else if (Arrows == 9141) {
  3006. rangehit = 3;
  3007. rangehit += c.playerLevel[4] / 6;
  3008. } else if (Arrows == 9142) {
  3009. rangehit = 4;
  3010. rangehit += c.playerLevel[4] / 6;
  3011. } else if (Arrows == 9143) {
  3012. rangehit = 7;
  3013. rangehit += c.playerLevel[4] / 5;
  3014. } else if (Arrows == 9144) {
  3015. rangehit = 7;
  3016. rangehit += c.playerLevel[4] / 4.5;
  3017. }
  3018. int bonus = 0;
  3019. bonus -= rangehit / 10;
  3020. rangehit += bonus;
  3021. if (c.specDamage != 1)
  3022. rangehit *= c.specDamage;
  3023. if (rangehit == 0)
  3024. rangehit++;
  3025. if (c.fullVoidRange()) {
  3026. rangehit *= 1.10;
  3027. }
  3028. if (c.prayerActive[3])
  3029. rangehit *= 1.05;
  3030. else if (c.prayerActive[11])
  3031. rangehit *= 1.10;
  3032. else if (c.prayerActive[19])
  3033. rangehit *= 1.15;
  3034. return rangehit;
  3035. }*/
  3036.  
  3037. public boolean properBolts() {
  3038. return c.playerEquipment[c.playerArrows] >= 9140 && c.playerEquipment[c.playerArrows] <= 9144
  3039. || c.playerEquipment[c.playerArrows] >= 9240 && c.playerEquipment[c.playerArrows] <= 9244;
  3040. }
  3041.  
  3042. public int correctBowAndArrows() {
  3043. if (usingBolts())
  3044. return -1;
  3045. switch(c.playerEquipment[c.playerWeapon]) {
  3046.  
  3047. case 839:
  3048. case 841:
  3049. return 882;
  3050.  
  3051. case 843:
  3052. case 845:
  3053. return 884;
  3054.  
  3055. case 847:
  3056. case 849:
  3057. return 886;
  3058.  
  3059. case 851:
  3060. case 853:
  3061. return 888;
  3062.  
  3063. case 855:
  3064. case 857:
  3065. return 890;
  3066.  
  3067. case 859:
  3068. case 861:
  3069. return 892;
  3070.  
  3071. case 4734:
  3072. case 4935:
  3073. case 4936:
  3074. case 4937:
  3075. return 4740;
  3076.  
  3077. case 11235:
  3078. return 11212;
  3079. }
  3080. return -1;
  3081. }
  3082.  
  3083. public int getRangeStartGFX() {
  3084. switch(c.rangeItemUsed) {
  3085.  
  3086. case 863:
  3087. return 220;
  3088. case 864:
  3089. return 219;
  3090. case 865:
  3091. return 221;
  3092. case 866: // knives
  3093. return 223;
  3094. case 867:
  3095. return 224;
  3096. case 868:
  3097. return 225;
  3098. case 869:
  3099. return 222;
  3100.  
  3101. case 806:
  3102. return 232;
  3103. case 807:
  3104. return 233;
  3105. case 808:
  3106. return 234;
  3107. case 809: // darts
  3108. return 235;
  3109. case 810:
  3110. return 236;
  3111. case 811:
  3112. return 237;
  3113.  
  3114. case 825:
  3115. return 206;
  3116. case 826:
  3117. return 207;
  3118. case 827: // javelin
  3119. return 208;
  3120. case 828:
  3121. return 209;
  3122. case 829:
  3123. return 210;
  3124. case 830:
  3125. return 211;
  3126.  
  3127. case 800:
  3128. return 42;
  3129. case 801:
  3130. return 43;
  3131. case 802:
  3132. return 44; // axes
  3133. case 803:
  3134. return 45;
  3135. case 804:
  3136. return 46;
  3137. case 805:
  3138. return 48;
  3139.  
  3140. case 882:
  3141. return 19;
  3142.  
  3143. case 884:
  3144. return 18;
  3145.  
  3146. case 886:
  3147. return 20;
  3148.  
  3149. case 888:
  3150. return 21;
  3151.  
  3152. case 890:
  3153. return 22;
  3154.  
  3155. case 892:
  3156. return 24;
  3157.  
  3158. case 11212:
  3159. return 26;
  3160.  
  3161. case 4212:
  3162. case 4214:
  3163. case 4215:
  3164. case 4216:
  3165. case 4217:
  3166. case 4218:
  3167. case 4219:
  3168. case 4220:
  3169. case 4221:
  3170. case 4222:
  3171. case 4223:
  3172. return 250;
  3173.  
  3174. }
  3175. return -1;
  3176. }
  3177.  
  3178. public int getRangeProjectileGFX() {
  3179. if (c.dbowSpec) {
  3180. return 672;
  3181. }
  3182. if(c.bowSpecShot > 0) {
  3183. switch(c.rangeItemUsed) {
  3184. default:
  3185. return 249;
  3186. }
  3187. }
  3188. if (c.playerEquipment[c.playerWeapon] == 9185)
  3189. return 27;
  3190. switch(c.rangeItemUsed) {
  3191.  
  3192. case 863:
  3193. return 213;
  3194. case 864:
  3195. return 212;
  3196. case 865:
  3197. return 214;
  3198. case 866: // knives
  3199. return 216;
  3200. case 867:
  3201. return 217;
  3202. case 868:
  3203. return 218;
  3204. case 869:
  3205. return 215;
  3206.  
  3207. case 806:
  3208. return 226;
  3209. case 807:
  3210. return 227;
  3211. case 808:
  3212. return 228;
  3213. case 809: // darts
  3214. return 229;
  3215. case 810:
  3216. return 230;
  3217. case 811:
  3218. return 231;
  3219.  
  3220. case 825:
  3221. return 200;
  3222. case 826:
  3223. return 201;
  3224. case 827: // javelin
  3225. return 202;
  3226. case 828:
  3227. return 203;
  3228. case 829:
  3229. return 204;
  3230. case 830:
  3231. return 205;
  3232.  
  3233. case 6522: // Toktz-xil-ul
  3234. return 442;
  3235.  
  3236. case 800:
  3237. return 36;
  3238. case 801:
  3239. return 35;
  3240. case 802:
  3241. return 37; // axes
  3242. case 803:
  3243. return 38;
  3244. case 804:
  3245. return 39;
  3246. case 805:
  3247. return 40;
  3248.  
  3249. case 882:
  3250. return 10;
  3251.  
  3252. case 884:
  3253. return 9;
  3254.  
  3255. case 886:
  3256. return 11;
  3257.  
  3258. case 888:
  3259. return 12;
  3260.  
  3261. case 890:
  3262. return 13;
  3263.  
  3264. case 892:
  3265. return 15;
  3266.  
  3267. case 11212:
  3268. return 17;
  3269.  
  3270. case 4740: // bolt rack
  3271. return 27;
  3272.  
  3273.  
  3274.  
  3275. case 4212:
  3276. case 4214:
  3277. case 4215:
  3278. case 4216:
  3279. case 4217:
  3280. case 4218:
  3281. case 4219:
  3282. case 4220:
  3283. case 4221:
  3284. case 4222:
  3285. case 4223:
  3286. return 249;
  3287.  
  3288.  
  3289. }
  3290. return -1;
  3291. }
  3292.  
  3293. public int getProjectileSpeed() {
  3294. if (c.dbowSpec)
  3295. return 100;
  3296. return 70;
  3297. }
  3298.  
  3299. public int getProjectileShowDelay() {
  3300. switch(c.playerEquipment[c.playerWeapon]) {
  3301. case 863:
  3302. case 864:
  3303. case 865:
  3304. case 866: // knives
  3305. case 867:
  3306. case 868:
  3307. case 869:
  3308.  
  3309. case 806:
  3310. case 807:
  3311. case 808:
  3312. case 809: // darts
  3313. case 810:
  3314. case 811:
  3315.  
  3316. case 825:
  3317. case 826:
  3318. case 827: // javelin
  3319. case 828:
  3320. case 829:
  3321. case 830:
  3322.  
  3323. case 800:
  3324. case 801:
  3325. case 802:
  3326. case 803: // axes
  3327. case 804:
  3328. case 805:
  3329.  
  3330. case 4734:
  3331. case 9185:
  3332. case 4935:
  3333. case 4936:
  3334. case 4937:
  3335. return 15;
  3336.  
  3337.  
  3338. default:
  3339. return 5;
  3340. }
  3341. }
  3342.  
  3343. /**
  3344. *MAGIC
  3345. **/
  3346.  
  3347. public int mageAtk()
  3348. {
  3349. int attackLevel = c.playerLevel[6];
  3350. if (c.fullVoidMage())
  3351. attackLevel += c.getLevelForXP(c.playerXP[6]) * 0.2;
  3352. if (c.prayerActive[4])
  3353. attackLevel *= 1.05;
  3354. else if (c.prayerActive[12])
  3355. attackLevel *= 1.10;
  3356. else if (c.prayerActive[20])
  3357. attackLevel *= 1.15;
  3358. return (int) (attackLevel + (c.playerBonus[3] * 2));
  3359. }
  3360. public int mageDef()
  3361. {
  3362. int defenceLevel = c.playerLevel[1]/2 + c.playerLevel[6]/2;
  3363. if (c.prayerActive[0]) {
  3364. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  3365. } else if (c.prayerActive[3]) {
  3366. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  3367. } else if (c.prayerActive[9]) {
  3368. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  3369. } else if (c.prayerActive[18]) {
  3370. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  3371. } else if (c.prayerActive[19]) {
  3372. defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  3373. }
  3374. return (int) (defenceLevel + c.playerBonus[8] + (c.playerBonus[8] / 3));
  3375. }
  3376.  
  3377. public boolean wearingStaff(int runeId) {
  3378. int wep = c.playerEquipment[c.playerWeapon];
  3379. switch (runeId) {
  3380. case 554:
  3381. if (wep == 1387)
  3382. return true;
  3383. break;
  3384. case 555:
  3385. if (wep == 1383)
  3386. return true;
  3387. break;
  3388. case 556:
  3389. if (wep == 1381)
  3390. return true;
  3391. break;
  3392. case 557:
  3393. if (wep == 1385)
  3394. return true;
  3395. break;
  3396. }
  3397. return false;
  3398. }
  3399.  
  3400. public boolean checkMagicReqs(int spell) {
  3401. if(c.usingMagic && Config.RUNES_REQUIRED) { // check for runes
  3402. if((!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][8], c.MAGIC_SPELLS[spell][9]) && !wearingStaff(c.MAGIC_SPELLS[spell][8])) ||
  3403. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][10], c.MAGIC_SPELLS[spell][11]) && !wearingStaff(c.MAGIC_SPELLS[spell][10])) ||
  3404. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][12], c.MAGIC_SPELLS[spell][13]) && !wearingStaff(c.MAGIC_SPELLS[spell][12])) ||
  3405. (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][14], c.MAGIC_SPELLS[spell][15]) && !wearingStaff(c.MAGIC_SPELLS[spell][14]))){
  3406. c.sendMessage("You don't have the required runes to cast this spell.");
  3407. return false;
  3408. }
  3409. }
  3410.  
  3411. if(c.usingMagic && c.playerIndex > 0) {
  3412. if(Server.playerHandler.players[c.playerIndex] != null) {
  3413. for(int r = 0; r < c.REDUCE_SPELLS.length; r++){ // reducing spells, confuse etc
  3414. if(Server.playerHandler.players[c.playerIndex].REDUCE_SPELLS[r] == c.MAGIC_SPELLS[spell][0]) {
  3415. c.reduceSpellId = r;
  3416. if((System.currentTimeMillis() - Server.playerHandler.players[c.playerIndex].reduceSpellDelay[c.reduceSpellId]) > Server.playerHandler.players[c.playerIndex].REDUCE_SPELL_TIME[c.reduceSpellId]) {
  3417. Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = true;
  3418. } else {
  3419. Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = false;
  3420. }
  3421. break;
  3422. }
  3423. }
  3424. if(!Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId]) {
  3425. c.sendMessage("That player is currently immune to this spell.");
  3426. c.usingMagic = false;
  3427. c.stopMovement();
  3428. resetPlayerAttack();
  3429. return false;
  3430. }
  3431. }
  3432. }
  3433.  
  3434. int staffRequired = getStaffNeeded();
  3435. if(c.usingMagic && staffRequired > 0 && Config.RUNES_REQUIRED) { // staff required
  3436. if(c.playerEquipment[c.playerWeapon] != staffRequired) {
  3437. c.sendMessage("You need a "+c.getItems().getItemName(staffRequired).toLowerCase()+" to cast this spell.");
  3438. return false;
  3439. }
  3440. }
  3441.  
  3442. if(c.usingMagic && Config.MAGIC_LEVEL_REQUIRED) { // check magic level
  3443. if(c.playerLevel[6] < c.MAGIC_SPELLS[spell][1]) {
  3444. c.sendMessage("You need to have a magic level of " +c.MAGIC_SPELLS[spell][1]+" to cast this spell.");
  3445. return false;
  3446. }
  3447. }
  3448. if(c.usingMagic && Config.RUNES_REQUIRED) {
  3449. if(c.MAGIC_SPELLS[spell][8] > 0) { // deleting runes
  3450. if (!wearingStaff(c.MAGIC_SPELLS[spell][8]))
  3451. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][8], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][8]), c.MAGIC_SPELLS[spell][9]);
  3452. }
  3453. if(c.MAGIC_SPELLS[spell][10] > 0) {
  3454. if (!wearingStaff(c.MAGIC_SPELLS[spell][10]))
  3455. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][10], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][10]), c.MAGIC_SPELLS[spell][11]);
  3456. }
  3457. if(c.MAGIC_SPELLS[spell][12] > 0) {
  3458. if (!wearingStaff(c.MAGIC_SPELLS[spell][12]))
  3459. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][12], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][12]), c.MAGIC_SPELLS[spell][13]);
  3460. }
  3461. if(c.MAGIC_SPELLS[spell][14] > 0) {
  3462. if (!wearingStaff(c.MAGIC_SPELLS[spell][14]))
  3463. c.getItems().deleteItem(c.MAGIC_SPELLS[spell][14], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][14]), c.MAGIC_SPELLS[spell][15]);
  3464. }
  3465. }
  3466. return true;
  3467. }
  3468.  
  3469.  
  3470. public int getFreezeTime() {
  3471. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  3472. case 1572:
  3473. case 12861: // ice rush
  3474. return 10;
  3475.  
  3476. case 1582:
  3477. case 12881: // ice burst
  3478. return 17;
  3479.  
  3480. case 1592:
  3481. case 12871: // ice blitz
  3482. return 25;
  3483.  
  3484. case 12891: // ice barrage
  3485. return 33;
  3486.  
  3487. default:
  3488. return 0;
  3489. }
  3490. }
  3491.  
  3492. public void freezePlayer(int i) {
  3493.  
  3494.  
  3495. }
  3496.  
  3497. public int getStartHeight() {
  3498. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3499. case 1562: // stun
  3500. return 25;
  3501.  
  3502. case 12939:// smoke rush
  3503. return 35;
  3504.  
  3505. case 12987: // shadow rush
  3506. return 38;
  3507.  
  3508. case 12861: // ice rush
  3509. return 15;
  3510.  
  3511. case 12951: // smoke blitz
  3512. return 38;
  3513.  
  3514. case 12999: // shadow blitz
  3515. return 25;
  3516.  
  3517. case 12911: // blood blitz
  3518. return 25;
  3519.  
  3520. default:
  3521. return 43;
  3522. }
  3523. }
  3524.  
  3525.  
  3526.  
  3527. public int getEndHeight() {
  3528. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3529. case 1562: // stun
  3530. return 10;
  3531.  
  3532. case 12939: // smoke rush
  3533. return 20;
  3534.  
  3535. case 12987: // shadow rush
  3536. return 28;
  3537.  
  3538. case 12861: // ice rush
  3539. return 10;
  3540.  
  3541. case 12951: // smoke blitz
  3542. return 28;
  3543.  
  3544. case 12999: // shadow blitz
  3545. return 15;
  3546.  
  3547. case 12911: // blood blitz
  3548. return 10;
  3549.  
  3550. default:
  3551. return 31;
  3552. }
  3553. }
  3554.  
  3555. public int getStartDelay() {
  3556. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3557. case 1539:
  3558. return 60;
  3559.  
  3560. default:
  3561. return 53;
  3562. }
  3563. }
  3564.  
  3565. public int getStaffNeeded() {
  3566. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3567. case 1539:
  3568. return 1409;
  3569.  
  3570. case 12037:
  3571. return 4170;
  3572.  
  3573. case 1190:
  3574. return 2415;
  3575.  
  3576. case 1191:
  3577. return 2416;
  3578.  
  3579. case 1192:
  3580. return 2417;
  3581.  
  3582. default:
  3583. return 0;
  3584. }
  3585. }
  3586.  
  3587. public boolean godSpells() {
  3588. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3589. case 1190:
  3590. return true;
  3591.  
  3592. case 1191:
  3593. return true;
  3594.  
  3595. case 1192:
  3596. return true;
  3597.  
  3598. default:
  3599. return false;
  3600. }
  3601. }
  3602.  
  3603. public int getEndGfxHeight() {
  3604. switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  3605. case 12987:
  3606. case 12901:
  3607. case 12861:
  3608. case 12445:
  3609. case 1192:
  3610. case 13011:
  3611. case 12919:
  3612. case 12881:
  3613. case 12999:
  3614. case 12911:
  3615. case 12871:
  3616. case 13023:
  3617. case 12929:
  3618. case 12891:
  3619. return 0;
  3620.  
  3621. default:
  3622. return 100;
  3623. }
  3624. }
  3625.  
  3626. public int getStartGfxHeight() {
  3627. switch(c.MAGIC_SPELLS[c.spellId][0]) {
  3628. case 12871:
  3629. case 12891:
  3630. return 0;
  3631.  
  3632. default:
  3633. return 100;
  3634. }
  3635. }
  3636.  
  3637. public void handleDfs() {
  3638. if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  3639. if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  3640. int damage = Misc.random(15) + 5;
  3641. c.startAnimation(2836);
  3642. c.gfx0(600);
  3643. Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  3644. Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  3645. Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  3646. Server.playerHandler.players[c.playerIndex].updateRequired = true;
  3647. c.dfsDelay = System.currentTimeMillis();
  3648. } else {
  3649. c.sendMessage("I should be in combat before using this.");
  3650. }
  3651. } else {
  3652. c.sendMessage("My shield hasn't finished recharging yet.");
  3653. }
  3654. }
  3655.  
  3656. public void handleDfsNPC() {
  3657. if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  3658. if (c.npcIndex > 0 && Server.npcHandler.npcs[c.npcIndex] != null) {
  3659. int damage = Misc.random(15) + 5;
  3660. c.startAnimation(2836);
  3661. c.gfx0(600);
  3662. Server.npcHandler.npcs[c.npcIndex].HP -= damage;
  3663. Server.npcHandler.npcs[c.npcIndex].hitDiff2 = damage;
  3664. Server.npcHandler.npcs[c.npcIndex].hitUpdateRequired2 = true;
  3665. Server.npcHandler.npcs[c.npcIndex].updateRequired = true;
  3666. c.dfsDelay = System.currentTimeMillis();
  3667. } else {
  3668. c.sendMessage("I should be in combat before using this.");
  3669. }
  3670. } else {
  3671. c.sendMessage("My shield hasn't finished recharging yet.");
  3672. }
  3673. }
  3674.  
  3675. public void applyRecoil(int damage, int i) {
  3676. if (damage > 0 && Server.playerHandler.players[i].playerEquipment[c.playerRing] == 2550) {
  3677. int recDamage = damage/10 + 1;
  3678. if (!c.getHitUpdateRequired()) {
  3679. c.setHitDiff(recDamage);
  3680. c.setHitUpdateRequired(true);
  3681. } else if (!c.getHitUpdateRequired2()) {
  3682. c.setHitDiff2(recDamage);
  3683. c.setHitUpdateRequired2(true);
  3684. }
  3685. c.dealDamage(recDamage);
  3686. c.updateRequired = true;
  3687. }
  3688. }
  3689.  
  3690. public int getBonusAttack(int i) {
  3691. switch (Server.npcHandler.npcs[i].npcType) {
  3692. case 2883:
  3693. return Misc.random(50) + 30;
  3694. case 2026:
  3695. case 2027:
  3696. case 2029:
  3697. case 2030:
  3698. return Misc.random(50) + 30;
  3699. }
  3700. return 0;
  3701. }
  3702.  
  3703.  
  3704.  
  3705. public void handleGmaulPlayer() {
  3706. if (c.playerIndex > 0) {
  3707. Client o = (Client)Server.playerHandler.players[c.playerIndex];
  3708. if (c.goodDistance(c.getX(), c.getY(), o.getX(), o.getY(), getRequiredDistance())) {
  3709. if (checkReqs()) {
  3710. if (checkSpecAmount(4153)) {
  3711. boolean hit = Misc.random(calculateMeleeAttack()) > Misc.random(o.getCombat().calculateMeleeDefence());
  3712. int damage = 0;
  3713. if (hit)
  3714. damage = Misc.random(calculateMeleeMaxHit());
  3715. if (o.prayerActive[18] && System.currentTimeMillis() - o.protMeleeDelay > 1500)
  3716. damage *= .6;
  3717. o.handleHitMask(damage);
  3718. c.startAnimation(1667);
  3719. c.gfx100(337);
  3720. o.dealDamage(damage);
  3721. }
  3722. }
  3723. }
  3724. }
  3725. }
  3726.  
  3727. public boolean armaNpc(int i) {
  3728. switch (Server.npcHandler.npcs[i].npcType) {
  3729. case 2558:
  3730. case 2559:
  3731. case 2560:
  3732. case 2561:
  3733. return true;
  3734. }
  3735. return false;
  3736. }
  3737.  
  3738. }
Advertisement
Add Comment
Please, Sign In to add comment