Advertisement
Guest User

Untitled

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