Advertisement
Guest User

CombatAssistant.java

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