Advertisement
Guest User

Perfect Combat RSPS

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