Advertisement
Guest User

combatassistant.java

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