Don't like ads? PRO users don't see any ads ;-)
Guest

CombatAssistant.java

By: a guest on Jul 4th, 2012  |  syntax: None  |  size: 178.86 KB  |  hits: 23  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. package server.model.players;
  2.  
  3. import server.Config;
  4. import server.Server;
  5. import server.util.Misc;
  6. import server.model.players.Client;
  7. import server.model.players.PlayerSave;
  8. import server.event.EventManager;
  9. import server.model.npcs.NPC;
  10. import server.model.npcs.NPCHandler;
  11. import server.event.EventContainer;
  12. import server.event.Event;
  13. import server.model.players.Player;
  14. import server.model.players.Hit.CombatType;
  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}, {3590, 92}, {3591, 82}, {3592, 72}, {9463, 92}, {9465, 82}, {9467, 72}};
  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.        
  44.           if (c.playerEquipment[c.playerWeapon] == 15241) {
  45.           c.gfx0(2138);
  46.           }
  47.                  
  48.  
  49.                
  50.                
  51.                 if (Server.npcHandler.npcs[i] != null) {
  52.                         if (Server.npcHandler.npcs[i].isDead || Server.npcHandler.npcs[i].MaxHP <= 0) {
  53.                                 c.usingMagic = false;
  54.                                 c.faceUpdate(0);
  55.                                 c.npcIndex = 0;
  56.                                 return;
  57.                         }
  58.                        
  59.                 if(c.specEffect == 4) {
  60.                 c.specEffect = 0;
  61.                 }
  62.                 if (c.inWG()) {
  63.                         resetPlayerAttack();
  64.                         c.stopMovement();
  65.                         return;
  66.                   }
  67.                         if (Server.npcHandler.npcs[i].npcType == 1000 || Server.npcHandler.npcs[i].npcType == 1001 || Server.npcHandler.npcs[i].npcType == 3100 || Server.npcHandler.npcs[i].npcType == 1002 || Server.npcHandler.npcs[i].npcType == 1003) {
  68.                         resetPlayerAttack();
  69.                         c.stopMovement();
  70.                         return; // Bandos
  71.                   }
  72.                         if (Server.npcHandler.npcs[i].npcType == 3104) {
  73.                         c.sendMessage("You must click the gate before attacking the Corporeal Beast!");
  74.                         resetPlayerAttack();
  75.                         c.stopMovement();
  76.                         return; // Corporeal beast *fake*
  77.                   }
  78.  
  79.                         if (Server.npcHandler.npcs[i].npcType == 1004 || Server.npcHandler.npcs[i].npcType == 1005 || Server.npcHandler.npcs[i].npcType == 1006 || Server.npcHandler.npcs[i].npcType == 1007) {
  80.                         resetPlayerAttack();
  81.                         c.stopMovement();
  82.                         return; // Arma
  83.                   }
  84.                         if (Server.npcHandler.npcs[i].npcType == 1008 || Server.npcHandler.npcs[i].npcType == 1009 || Server.npcHandler.npcs[i].npcType == 1010 || Server.npcHandler.npcs[i].npcType == 1011) {
  85.                         resetPlayerAttack();
  86.                         c.stopMovement();
  87.                         return; // Zammy
  88.                   }
  89.                         if (Server.npcHandler.npcs[i].npcType == 1012 || Server.npcHandler.npcs[i].npcType == 1013 || Server.npcHandler.npcs[i].npcType == 1014 || Server.npcHandler.npcs[i].npcType == 1015) {
  90.                         resetPlayerAttack();
  91.                         c.stopMovement();
  92.                         return; // Sara
  93.                   }
  94.                                  
  95.                                  if (Server.npcHandler.npcs[i].summon == true) {
  96. if(Server.npcHandler.npcs[i].index != c.playerId || c.wildLevel <= 1) {
  97.                                 resetPlayerAttack();
  98.                                 c.sendMessage("You cannot attack this monster.");
  99.  
  100. //                              c.sendMessage("This is "+Server.npcHandler.npcz[i]+" NPC.");
  101.                                 return;
  102.                         }
  103. }
  104.                                  
  105.                                  
  106.                         if(c.respawnTimer > 0) {
  107.                                 c.npcIndex = 0;
  108.                                 return;
  109.                         }
  110.                         if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.npcs[i].underAttackBy != c.playerId && !Server.npcHandler.npcs[i].inMulti()) {
  111.                                 c.npcIndex = 0;
  112.                                 c.sendMessage("This monster is already in combat.");
  113.                                 return;
  114.                         }
  115.                         if (Server.npcHandler.npcs[i].inMulti() && c.lastsummon > 0) {
  116.                                 Server.npcHandler.attackNPC(i, c.summoningnpcid);
  117.                         }
  118.                         if ((c.underAttackBy > 0 || c.underAttackBy2 > 0) && c.underAttackBy2 != i && !c.inMulti()) {
  119.                                 resetPlayerAttack();
  120.                                 c.sendMessage("I am already under attack.");
  121.                                 return;
  122.                         }
  123.                         if (!goodSlayer(i)) {
  124.                                 resetPlayerAttack();
  125.                                 return;
  126.                         }
  127.                         /*if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0 && Server.npcHandler.npcs[i].summon != true) {
  128.                                 resetPlayerAttack();
  129.                                 c.sendMessage("This monster was not spawned for you.");
  130.                                 return;
  131.                         }
  132.                         if (Server.npcHandler.npcs[i].spawnedBy != c.playerId && Server.npcHandler.npcs[i].spawnedBy > 0) {
  133.                                 resetPlayerAttack();
  134.                                 c.sendMessage("This monster was not spawned for you.");
  135.                                 return;
  136.                         }*/
  137.                         if(c.attackTimer <= 0) {
  138.                                 boolean usingBow = false;
  139.                                 boolean usingArrows = false;
  140.                                 boolean usingOtherRangeWeapons = false;
  141.                                 boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185 && c.playerEquipment[c.playerWeapon] == 18357;
  142.                                 c.bonusAttack = 0;
  143.                                 c.rangeItemUsed = 0;
  144.                                 c.projectileStage = 0;
  145.                                 //c.SaveGame();
  146.                                 if (c.autocasting) {
  147.                                         c.spellId = c.autocastId;
  148.                                         c.usingMagic = true;
  149.                                 }
  150.                                 if(c.spellId > 0) {
  151.                                 c.usingMagic = true;
  152.                                 }
  153.                                 c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  154.                                 c.specAccuracy = 1.0;
  155.                                 c.specDamage = 1.0;
  156.                                 if(!c.usingMagic) {
  157.                                         for (int bowId : c.BOWS) {
  158.                                                 if(c.playerEquipment[c.playerWeapon] == bowId) {
  159.                                                         usingBow = true;
  160.                                                         for (int arrowId : c.ARROWS) {
  161.                                                                 if(c.playerEquipment[c.playerArrows] == arrowId) {
  162.                                                                         usingArrows = true;
  163.                                         c.gfx100(getRangeStartGFX());
  164.                                                                 }
  165.                                                         }
  166.                                                 }
  167.                                         }
  168.                                        
  169.                                         for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
  170.                                                 if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
  171.                                                         usingOtherRangeWeapons = true;
  172.                                                 }
  173.                                         }
  174.                                 }
  175.                                 if (armaNpc(i) && !usingCross && !usingBow && !c.usingMagic && !usingCrystalBow() && !usingOtherRangeWeapons) {                        
  176.                                         resetPlayerAttack();
  177.                                         c.sendMessage("You can only Range/Mage Armadyl creeps!");
  178.                                         return;
  179.                                 }
  180.                                 if((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && (usingHally() && !usingOtherRangeWeapons && !usingBow && !usingCross && !c.usingMagic)) ||(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 4) && (usingOtherRangeWeapons && !usingCross && !usingBow && !c.usingMagic)) || (!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1) && (!usingOtherRangeWeapons && !usingHally() && !usingCross && !usingBow && !c.usingMagic)) || ((!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 8) && (usingBow || usingCross || c.usingMagic)))) {
  181.                                         c.attackTimer = 2;
  182.                                         return;
  183.                                 }
  184.                                
  185.                                 if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
  186.                                         c.sendMessage("You have run out of arrows!");
  187.                                         c.stopMovement();
  188.                                         c.npcIndex = 0;
  189.                                         return;
  190.                                 }
  191.                                 if(correctBowAndArrows() < c.playerEquipment[c.playerArrows] && Config.CORRECT_ARROWS && usingBow && !usingCrystalBow() && usingCross) {
  192.                                         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()+".");
  193.                                         c.stopMovement();
  194.                                         c.npcIndex = 0;
  195.                                         return;
  196.                                 }
  197.                                 if (usingCross && !properBolts()) {
  198.                                         c.sendMessage("You must use bolts with a crossbow.");
  199.                                         c.stopMovement();
  200.                                         resetPlayerAttack();
  201.                                         return;                        
  202.                                 }      
  203.                                                
  204.  
  205.                                 if(usingBow || usingCross || c.usingMagic || usingOtherRangeWeapons || (c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 2) && usingHally())) {
  206.                                         c.stopMovement();
  207.                                 }
  208.  
  209.                                 if(!checkMagicReqs(c.spellId)) {
  210.                                         c.stopMovement();
  211.                                         c.npcIndex = 0;
  212.                                         return;
  213.                                 }
  214.                                
  215.                                 c.faceUpdate(i);
  216.                                 //c.specAccuracy = 1.0;
  217.                                 //c.specDamage = 1.0;
  218.                                 Server.npcHandler.npcs[i].underAttackBy = c.playerId;
  219.                                 Server.npcHandler.npcs[i].lastDamageTaken = System.currentTimeMillis();
  220.                                 if(c.usingSpecial && !c.usingMagic) {
  221.                                         if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
  222.                                                 c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  223.                                                 c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  224.                                                 activateSpecial(c.playerEquipment[c.playerWeapon], i);
  225.                                                 return;
  226.                                         } else {
  227.                                                 c.sendMessage("You don't have the required special energy to use this attack.");
  228.                                                 c.usingSpecial = false;
  229.                                                 c.getItems().updateSpecialBar();
  230.                                                 c.npcIndex = 0;
  231.                                                 return;
  232.                                         }
  233.                                 }
  234.                                                                 if(usingBow || c.usingMagic || usingOtherRangeWeapons) {
  235.                                         c.mageFollow = true;
  236.                                 } else {
  237.                                         c.mageFollow = false;
  238.                                 }
  239.  
  240.                                 c.specMaxHitIncrease = 0;
  241.                                 if(!c.usingMagic) {
  242.                                         c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
  243.                                 } else {
  244.                                         c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
  245.                                 }
  246.                                 c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  247.                                 c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  248.                                 if(!usingBow && !usingCross && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
  249.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  250.                                         c.projectileStage = 0;
  251.                                         c.oldNpcIndex = i;
  252.                                 }
  253.                                
  254.                                
  255.                                 if(usingBow && !usingOtherRangeWeapons && !c.usingMagic || usingCross) { // range hit delay                                    
  256.                                         if (usingCross)
  257.                                                 c.usingBow = true;
  258.                                         if (c.fightMode == 2)
  259.                                                 c.attackTimer--;
  260.                                         c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  261.                                         c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  262.                                         c.gfx100(getRangeStartGFX());  
  263.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  264.                                         c.projectileStage = 1;
  265.                                         c.oldNpcIndex = i;
  266.                                         if(c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223) {
  267.                                                 c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  268.                                                 c.crystalBowArrowCount++;
  269.                                                 c.lastArrowUsed = 0;
  270.                                         } else {
  271.                                                 c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  272.                                                 c.getItems().deleteArrow();    
  273.                                         }
  274.                                         fireProjectileNpc();
  275.                                 }
  276.  
  277.                         if(usingBow && usingCross && c.usingMagic && usingOtherRangeWeapons) {
  278.                         c.getPA().followNpc();
  279.                         c.stopMovement();
  280.                         } else {
  281.                         c.followId = 0;
  282.                         c.followId2 = i;
  283.                         }
  284.                                                        
  285.                                
  286.                                 if(usingOtherRangeWeapons && !c.usingMagic && !usingCross && !usingBow) {       // knives, darts, etc hit delay        
  287.                                         c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  288.                                         c.getItems().deleteEquipment();
  289.                                         c.gfx100(getRangeStartGFX());
  290.                                         c.lastArrowUsed = 0;
  291.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  292.                                         c.projectileStage = 1;
  293.                                         c.oldNpcIndex = i;
  294.                                         if (c.fightMode == 2)
  295.                                                 c.attackTimer--;
  296.                                         fireProjectileNpc();   
  297.                                 }
  298.  
  299.                                 if(c.usingMagic) {      // magic hit delay
  300.                                         int pX = c.getX();
  301.                                         int pY = c.getY();
  302.                                         int nX = Server.npcHandler.npcs[i].getX();
  303.                                         int nY = Server.npcHandler.npcs[i].getY();
  304.                                         int offX = (pY - nY)* -1;
  305.                                         int offY = (pX - nX)* -1;
  306.                                         c.castingMagic = true;
  307.                                         c.projectileStage = 2;
  308.                                         if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
  309.                                                 if(getStartGfxHeight() == 100) {
  310.                                                         c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
  311.                                                 } else {
  312.                                                         c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
  313.                                                 }
  314.                                         }
  315.                                         if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
  316.                                                 c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), i + 1, 50);
  317.                                         }
  318.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  319.                                         c.oldNpcIndex = i;
  320.                                         c.oldSpellId = c.spellId;
  321.                                         c.spellId = 0;
  322.                                         if (!c.autocasting)
  323.                                                 c.npcIndex = 0;
  324.                                 }
  325.                                         if(c.curseActive[18] && c.oldNpcIndex > 0) { // SoulSplit GFX's - CAUSES CRASH
  326.                                         if(c.oldNpcIndex > 0) {
  327.                                         if(Server.npcHandler.npcs[c.oldNpcIndex] != null) {
  328.                                         try {
  329.                                         if(c.curseActive[18] && !c.prayerActive[23] && c.playerLevel[3] <= 99) {
  330.                                                 int heal = 3;
  331.                                                 if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  332.                                                         c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  333.                                                 } else {
  334.                                                         c.playerLevel[3] += heal;
  335.                                                 }
  336.                                                 c.getPA().refreshSkill(3);
  337.                                         }
  338.                                         final int pX = c.getX();
  339.                                         final int pY = c.getY();
  340.                                         final int nX = Server.npcHandler.npcs[c.oldNpcIndex].getX();
  341.                                         final int nY = Server.npcHandler.npcs[c.oldNpcIndex].getY();
  342.                                         final int offX = (pY - nY)* -1;
  343.                                         final int offY = (pX - nX)* -1;
  344.                                         c.SSPLIT = true;
  345.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2263, 9, 9, c.oldNpcIndex + 1, 24, 0);
  346.                                         EventManager.getSingleton().addEvent(new Event() {
  347.                                         public void execute(EventContainer b) {
  348.                                         c.gfx0(2264);
  349.                                         c.SSPLIT = false;
  350.                                         b.stop();
  351.                                         }
  352.                                         }, 500);
  353.                                         /*EventManager.getSingleton().addEvent(new Event() { // CAUSES CRASH
  354.                                         public void execute(EventContainer b) {
  355.                                         //c.getPA().createPlayersProjectile2(nX, nY, offX, offY, 50, 50, 2263, 9, 9, - c.playerId - 1, 24, 0);
  356.                                         b.stop();
  357.                                         }
  358.                                         }, 800);*/
  359.                                         } catch (Exception e) {
  360.                                         e.printStackTrace();
  361.                                 }
  362.                         }
  363.                 }
  364.         }
  365.                                        
  366.                                         if(c.crystalBowArrowCount >= 250){
  367.                                                 switch(c.playerEquipment[c.playerWeapon]) {
  368.                                                        
  369.                                                         case 4223: // 1/10 bow
  370.                                                         c.getItems().wearItem(-1, 1, 3);
  371.                                                         c.sendMessage("Your crystal bow has fully degraded.");
  372.                                                         if(!c.getItems().addItem(4207, 1)) {
  373.                                                                 Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
  374.                                                         }
  375.                                                         c.crystalBowArrowCount = 0;
  376.                                                         break;
  377.                                                        
  378.                                                         default:
  379.                                                         c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
  380.                                                         c.sendMessage("Your crystal bow degrades.");
  381.                                                         c.crystalBowArrowCount = 0;
  382.                                                         break;
  383.                                                        
  384.                                                
  385.                                                 }
  386.                                         }      
  387.                                 }
  388.                                                 if(c.playerEquipment[c.playerWeapon] == 13901) {
  389. c.vlsLeft -= 1;
  390. c.degradeVls();
  391. }
  392. if(c.playerEquipment[c.playerWeapon] == 13907) {
  393. c.vSpearLeft -=1;
  394. c.degradeVSpear();
  395. }
  396. if(c.playerEquipment[c.playerChest] == 13860) {
  397. c.zTopLeft -=1;
  398. c.degradeZTop();
  399. }
  400. if(c.playerEquipment[c.playerLegs] == 13863) {
  401. c.zBottomLeft -=1;
  402. c.degradeZBottom();
  403. }
  404. if(c.playerEquipment[c.playerWeapon] == 13904){
  405. c.statLeft -= 1;
  406. c.degradeStat();
  407. }
  408. if(c.playerEquipment[c.playerChest] == 13889) {
  409. c.vTopLeft -=1;
  410. c.degradeVTop();
  411. }
  412. if(c.playerEquipment[c.playerLegs] == 13895) {
  413. c.vLegsLeft -=1;
  414. c.degradeVLegs();
  415. }
  416. if(c.playerEquipment[c.playerWeapon] == 13869) {
  417. c.zStaffLeft -=1;
  418. c.degradeZStaff();
  419. }
  420. if(c.playerEquipment[c.playerHat] == 13866) {
  421. c.zHoodLeft -=1;
  422. c.degradeZHood();
  423. }
  424. if(c.playerEquipment[c.playerChest] == 13872) {
  425. c.mBodyLeft -=1;
  426. c.degradeMBody();
  427. }
  428. if(c.playerEquipment[c.playerLegs] == 13875) {
  429. c.mChapsLeft -=1;
  430. c.degradeMChaps();
  431. }
  432. if(c.playerEquipment[c.playerChest] == 13886) {
  433. c.sTopLeft -=1;
  434. c.degradeSTop();
  435. }
  436. if(c.playerEquipment[c.playerLegs] == 13892) {
  437. c.sLegsLeft -=1;
  438. c.degradeSLegs();
  439. }
  440. if(c.playerEquipment[c.playerHat] == 13898) {
  441. c.sHelmLeft -=1;
  442. c.degradeSHelm();
  443. }
  444.                         }
  445.                 }
  446.        
  447.  
  448.        
  449.        
  450.         public void delayedHit(int i) { // npc hit delay
  451.                 if (Server.npcHandler.npcs[i] != null) {
  452.                         if (Server.npcHandler.npcs[i].isDead) {
  453.                                 c.npcIndex = 0;
  454.                                 return;
  455.                         }
  456.                         Server.npcHandler.npcs[i].facePlayer(c.playerId);
  457.                        
  458.                         if (Server.npcHandler.npcs[i].underAttackBy > 0 && Server.npcHandler.getsPulled(i)) {
  459.                                 Server.npcHandler.npcs[i].killerId = c.playerId;                       
  460.                         } else if (Server.npcHandler.npcs[i].underAttackBy < 0 && !Server.npcHandler.getsPulled(i)) {
  461.                                 Server.npcHandler.npcs[i].killerId = c.playerId;
  462.                         }
  463.                         c.lastNpcAttacked = i;
  464.                         if(c.projectileStage == 0 && !c.usingMagic && !c.castingMagic) { // melee hit damage
  465.                                 if (!c.usingClaws)
  466.                                         applyNpcMeleeDamage(i, 1, Misc.random(calculateMeleeMaxHit()));
  467.                                 if(c.doubleHit && !c.usingClaws) {
  468.                                         applyNpcMeleeDamage(i, 2, Misc.random(calculateMeleeMaxHit()));
  469.                                 }
  470.                                 if(c.doubleHit && c.usingClaws) {
  471.                                         c.delayedDamage = c.clawDamage;
  472.                                         c.delayedDamage2 = c.clawDamage/2;
  473.                                         applyNpcMeleeDamage(i, 1, c.clawDamage);
  474.                                         applyNpcMeleeDamage(i, 2, c.clawDamage/2);
  475.                                 }                              
  476.                         }
  477.  
  478.                         if(!c.castingMagic && c.projectileStage > 0) { // range hit damage
  479.                                 int damage = Misc.random(rangeMaxHit());
  480.                                 int damage2 = -1;
  481.                                 if (c.lastWeaponUsed == 11235 || c.lastWeaponUsed == 14481 || c.lastWeaponUsed == 14482 || c.bowSpecShot == 1)
  482.                                         damage2 = Misc.random(rangeMaxHit());
  483.                                 boolean ignoreDef = false;
  484.                                 if (Misc.random(5) == 1 && c.lastArrowUsed == 9243 && c.playerEquipment[c.playerWeapon] == 9185 && c.playerEquipment[c.playerWeapon] == 18357) {
  485.                                         ignoreDef = true;
  486.                                         Server.npcHandler.npcs[i].gfx0(758);
  487.                                 }
  488.  
  489.                                
  490.                                 if(Misc.random(Server.npcHandler.npcs[i].defence) > Misc.random(10+calculateRangeAttack()) && !ignoreDef) {
  491.                                         damage = 0;
  492.                                 } else if (Server.npcHandler.npcs[i].npcType == 2881 || Server.npcHandler.npcs[i].npcType == 2883 || Server.npcHandler.npcs[i].npcType == 3340 && !ignoreDef) {
  493.                                         damage = 0;
  494.                                 }
  495.                                
  496.                                 if (Misc.random(5) == 1 && c.lastArrowUsed == 9242 && damage > 0 && c.playerEquipment[c.playerWeapon] == 9185) {
  497.                                         Server.npcHandler.npcs[i].gfx0(754);
  498.                                         damage = Server.npcHandler.npcs[i].HP/5;
  499.                                         //c.handleHitMask(c.playerLevel[3]/10);
  500.                                         c.dealDamage(c.playerLevel[3]/10);
  501.                                         c.gfx0(754);                                   
  502.                                 }
  503.                                
  504.                                 if (Misc.random(4) == 1 && c.lastArrowUsed == 9242 && damage > 0 && c.playerEquipment[c.playerWeapon] == 18357) {
  505.                                         Server.npcHandler.npcs[i].gfx0(754);
  506.                                         damage = Server.npcHandler.npcs[i].HP/5;
  507.                                         //c.handleHitMask(c.playerLevel[3]/10);
  508.                                         c.dealDamage(c.playerLevel[3]/10);
  509.                                         c.gfx0(754);                                   
  510.                                 }
  511.  
  512.                                 if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
  513.                                         if (Misc.random(Server.npcHandler.npcs[i].defence) > Misc.random(10+calculateRangeAttack()))
  514.                                                 damage2 = 0;
  515.                                 }
  516.                                 if (c.dbowSpec) {
  517.                                         Server.npcHandler.npcs[i].gfx100(1100);
  518.                                         if(c.dbowDelay == 4)
  519.                                         if (damage < 8)
  520.                                                 damage = 8;
  521.                                         else if(c.dbowDelay == 1)
  522.                                         if (damage2 < 8)
  523.                                                 damage2 = 8;
  524.                                         c.dbowSpec = false;
  525.                                 }
  526.                                 if (damage > 0 && Misc.random(5) == 1 && c.lastArrowUsed == 9244 && c.playerEquipment[c.playerWeapon] == 9185) {
  527.                                         damage *= 1.45;
  528.                                         Server.npcHandler.npcs[i].gfx0(756);
  529.                                 }
  530.                                
  531.                                 if (damage > 0 && Misc.random(4) == 1 && c.lastArrowUsed == 9244 && c.playerEquipment[c.playerWeapon] == 18357) {
  532.                                         damage *= 1.45;
  533.                                         Server.npcHandler.npcs[i].gfx0(756);
  534.                                 }
  535.  
  536.                                 if (Server.npcHandler.npcs[i].HP - damage < 0) {
  537.                                         damage = Server.npcHandler.npcs[i].HP;
  538.                                 }
  539.                                 if (Server.npcHandler.npcs[i].HP - damage <= 0 && damage2 > 0) {
  540.                                         damage2 = 0;
  541.                                 }
  542.                                 if(c.fightMode == 3) {
  543.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 4);
  544.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 1);                             
  545.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  546.                                         c.getPA().refreshSkill(1);
  547.                                         c.getPA().refreshSkill(3);
  548.                                         c.getPA().refreshSkill(4);
  549.                                 } else {
  550.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE), 4);
  551.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  552.                                         c.getPA().refreshSkill(3);
  553.                                         c.getPA().refreshSkill(4);
  554.                                 }
  555.                                 if (damage > 0) {
  556.                                         if (Server.npcHandler.npcs[i].npcType >= 6142 && Server.npcHandler.npcs[i].npcType <= 6145) {
  557.                                                 c.pcDamage += damage;                                  
  558.                                         }                              
  559.                                 }
  560.                                 boolean dropArrows = true;
  561.                                                
  562.                                 for(int noArrowId : c.NO_ARROW_DROP) {
  563.                                         if(c.lastWeaponUsed == noArrowId) {
  564.                                                 dropArrows = false;
  565.                                                 break;
  566.                                         }
  567.                                 }
  568.                                 if(dropArrows) {
  569.                                         c.getItems().dropArrowNpc();   
  570.                                 }
  571.                                 //o.CIcon = 1;
  572.                                 Server.npcHandler.npcs[i].hitDiff = damage;
  573.                                 Server.npcHandler.npcs[i].underAttack = true;
  574.                                 Server.npcHandler.npcs[i].CIcon = 1;
  575.                                 Server.npcHandler.npcs[i].HP -= damage;
  576.                                 Server.npcHandler.npcs[i].hitUpdateRequired = true;
  577.                                
  578.                                 if (damage2 > -1) {
  579.                                         Server.npcHandler.npcs[i].hitDiff2 = damage2;
  580.                                         Server.npcHandler.npcs[i].CIcon = 1;
  581.                                         Server.npcHandler.npcs[i].HP -= damage2;
  582.                                         c.totalDamageDealt += damage2; 
  583.                                         Server.npcHandler.npcs[i].hitUpdateRequired = true;
  584.                                 }
  585.                                 if (c.killingNpcIndex != c.oldNpcIndex) {
  586.                                         c.totalDamageDealt = 0;                        
  587.                                 }
  588.                                 c.killingNpcIndex = c.oldNpcIndex;
  589.                                 c.totalDamageDealt += damage;
  590.                                 Server.npcHandler.npcs[i].hitUpdateRequired = true;
  591.                                 if (damage2 > -1)
  592.                                         Server.npcHandler.npcs[i].hitUpdateRequired2 = true;
  593.                                 Server.npcHandler.npcs[i].updateRequired = true;
  594.  
  595.                         } else if (c.projectileStage > 0) { // magic hit damage
  596.                                 int damage = Misc.random(finalMagicDamage(c));
  597.                                 Client o = (Client) Server.playerHandler.players[i];
  598.        
  599.                                 if(godSpells()) {
  600.                                         if(System.currentTimeMillis() - c.godSpellDelay < Config.GOD_SPELL_CHARGE) {
  601.                                                 damage += Misc.random(10);
  602.                                         }
  603.                                 }
  604.                                 boolean magicFailed = false;
  605.                                 Server.npcHandler.npcs[i].CIcon = 2;
  606.                                 //c.npcIndex = 0;
  607.                                 int bonusAttack = getBonusAttack(i);
  608.                                 if (Misc.random(Server.npcHandler.npcs[i].defence) > 10+ Misc.random(mageAtk()) + bonusAttack) {
  609.                                         damage = 0;
  610.                                         magicFailed = true;
  611.                                 } else if (Server.npcHandler.npcs[i].npcType == 2881 || Server.npcHandler.npcs[i].npcType == 2882) {
  612.                                         damage = 0;
  613.                                         magicFailed = true;
  614.                                 }
  615.                                
  616.                                 if (Server.npcHandler.npcs[i].HP - damage < 0) {
  617.                                         damage = Server.npcHandler.npcs[i].HP;
  618.                                 }
  619.                                
  620.                                 c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  621.                                 c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  622.                                 c.getPA().refreshSkill(3);
  623.                                 c.getPA().refreshSkill(6);
  624.                                 if (damage > 0) {
  625.                                         if (Server.npcHandler.npcs[i].npcType >= 6142 && Server.npcHandler.npcs[i].npcType <= 6145) {
  626.                                                 c.pcDamage += damage;                                  
  627.                                         }                              
  628.                                 }
  629.                                 if(getEndGfxHeight() == 100 && !magicFailed){ // end GFX
  630.                                         Server.npcHandler.npcs[i].gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  631.                                 } else if (!magicFailed){
  632.                                         Server.npcHandler.npcs[i].gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  633.                                 }
  634.                                
  635.                                 if(magicFailed) {      
  636.                                         Server.npcHandler.npcs[i].gfx100(85);
  637.                                 }                      
  638.                                 if(!magicFailed) {
  639.                                         int freezeDelay = getFreezeTime();//freeze
  640.                                         if(freezeDelay > 0 && Server.npcHandler.npcs[i].freezeTimer == 0) {
  641.                                                 Server.npcHandler.npcs[i].freezeTimer = freezeDelay;
  642.                                                 Server.npcHandler.npcs[i].barrageorb = 1;
  643.                                         }
  644.                                         switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  645.                                                 case 12871:
  646.                                                         if (Server.npcHandler.npcs[i].barrageorb == 1) {
  647.                                                                 Server.npcHandler.npcs[i].barrageorb = 0;
  648.                                                         }
  649.                                                 break;
  650.  
  651.                                                 case 12891:                    
  652.                                                         if (Server.npcHandler.npcs[i].barrageorb != 1) {
  653.                                                                 Server.npcHandler.npcs[i].gfx50(1677);
  654.                                                         }
  655.                                                         if (Server.npcHandler.npcs[i].barrageorb == 1) {
  656.                                                                 Server.npcHandler.npcs[i].barrageorb = 0;
  657.                                                         }
  658.                                                 break;
  659.                                                 case 12901:
  660.                                                 case 12919: // blood spells
  661.                                                 case 12911:
  662.                                                 case 12929:
  663.                                                 int heal = Misc.random(damage / 2);
  664.                                                 if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  665.                                                         c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  666.                                                 } else {
  667.                                                         c.playerLevel[3] += heal;
  668.                                                 }
  669.                                                 c.getPA().refreshSkill(3);
  670.                                                 break;
  671.                                         }
  672.  
  673.                                 }
  674.                                 Server.npcHandler.npcs[i].underAttack = true;
  675.                                 if(finalMagicDamage(c) != 0) {
  676.                                         Server.npcHandler.npcs[i].hitDiff = damage;
  677.                                         Server.npcHandler.npcs[i].HP -= damage;
  678.                                         Server.npcHandler.npcs[i].hitUpdateRequired = true;
  679.                                         c.totalDamageDealt += damage;
  680.                                 }
  681.                                 c.killingNpcIndex = c.oldNpcIndex;                     
  682.                                 Server.npcHandler.npcs[i].updateRequired = true;
  683.                                 c.usingMagic = false;
  684.                                 c.castingMagic = false;
  685.                                 c.oldSpellId = 0;
  686.                         }
  687.                 }
  688.        
  689.                 if(c.bowSpecShot <= 0) {
  690.                         c.oldNpcIndex = 0;
  691.                         c.projectileStage = 0;
  692.                         c.doubleHit = false;
  693.                         c.lastWeaponUsed = 0;
  694.                         c.bowSpecShot = 0;
  695.                 }
  696.                 if(c.bowSpecShot >= 2) {
  697.                         c.bowSpecShot = 0;
  698.                         //c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  699.                 }
  700.                 if(c.bowSpecShot == 1) {
  701.                         fireProjectileNpc();
  702.                         c.hitDelay = 2;
  703.                         c.bowSpecShot = 0;
  704.                 }
  705.         }
  706.        
  707.        
  708.         public void applyNpcMeleeDamage(int i, int damageMask, int damage) {
  709.                 c.previousDamage = damage;
  710.                 boolean fullVeracsEffect = c.getPA().fullVeracs() && Misc.random(3) == 1;
  711.                 if (Server.npcHandler.npcs[i].HP - damage < 0) {
  712.                         damage = Server.npcHandler.npcs[i].HP;
  713.                 }
  714.                
  715.                 if (!fullVeracsEffect && !c.usingClaws) {
  716.                         if (Misc.random(Server.npcHandler.npcs[i].defence) > 10 + Misc.random(calculateMeleeAttack())) {
  717.                                 damage = 0;
  718.                         } else if (Server.npcHandler.npcs[i].npcType == 2882 || Server.npcHandler.npcs[i].npcType == 2883) {
  719.                                 damage = 0;
  720.                         }
  721.                 }      
  722.                 boolean guthansEffect = false;
  723.                 if (c.getPA().fullGuthans()) {
  724.                         if (Misc.random(3) == 1) {
  725.                                 guthansEffect = true;                  
  726.                         }              
  727.                 }
  728.                 if(c.fightMode == 3) {
  729.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 0);
  730.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 1);
  731.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 2);                             
  732.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  733.                         c.getPA().refreshSkill(0);
  734.                         c.getPA().refreshSkill(1);
  735.                         c.getPA().refreshSkill(2);
  736.                         c.getPA().refreshSkill(3);
  737.                 } else {
  738.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE), c.fightMode);
  739.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  740.                         c.getPA().refreshSkill(c.fightMode);
  741.                         c.getPA().refreshSkill(3);
  742.                 }
  743.                 if (damage > 0) {
  744.                         if (Server.npcHandler.npcs[i].npcType >= 6142 && Server.npcHandler.npcs[i].npcType <= 6145) {
  745.                                 c.pcDamage += damage;                                  
  746.                         }                              
  747.                 }
  748.                 if (damage > 0 && guthansEffect) {
  749.                         c.playerLevel[3] += damage;
  750.                         if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]))
  751.                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  752.                         c.getPA().refreshSkill(3);
  753.                         Server.npcHandler.npcs[i].gfx0(398);           
  754.                 }
  755.                 Server.npcHandler.npcs[i].underAttack = true;
  756.                 //Server.npcHandler.npcs[i].killerId = c.playerId;
  757.                 c.killingNpcIndex = c.npcIndex;
  758.                 c.lastNpcAttacked = i;
  759.                 switch (c.specEffect) {
  760.                         case 4:
  761.                                 if (damage > 0) {
  762.                                         if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3]))
  763.                                                 if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]));
  764.                                                 else
  765.                                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  766.                                         else
  767.                                                 c.playerLevel[3] += damage;
  768.                                         c.getPA().refreshSkill(3);
  769.                                 }
  770.                         break;
  771.                         case 5:
  772.                         c.clawDelay = 2;
  773.                         //c.clawDamage = Misc.random(calculateMeleeMaxHit());
  774.                         break;
  775.  
  776.                         case 7:
  777.                         c.dbowDelay = 6;
  778.                         break;
  779.                
  780.                 }
  781.                 switch(damageMask) {
  782.                         case 1:
  783.                         Server.npcHandler.npcs[i].CIcon = 0;
  784.                         Server.npcHandler.npcs[i].hitDiff = damage;
  785.                         Server.npcHandler.npcs[i].HP -= damage;
  786.                         c.totalDamageDealt += damage;
  787.                         Server.npcHandler.npcs[i].hitUpdateRequired = true;    
  788.                         Server.npcHandler.npcs[i].updateRequired = true;
  789.                         break;
  790.                
  791.                         case 2:
  792.                         Server.npcHandler.npcs[i].CIcon = 0;
  793.                         Server.npcHandler.npcs[i].hitDiff2 = damage;
  794.                         Server.npcHandler.npcs[i].HP -= damage;
  795.                         c.totalDamageDealt += damage;
  796.                         Server.npcHandler.npcs[i].hitUpdateRequired2 = true;   
  797.                         Server.npcHandler.npcs[i].updateRequired = true;
  798.                         c.doubleHit = false;
  799.                         break;
  800.                        
  801.                 }
  802.         }
  803.        
  804.         public void fireProjectileNpc() {
  805.        
  806.                
  807.                 if(c.oldNpcIndex > 0) {
  808.                         if(Server.npcHandler.npcs[c.oldNpcIndex] != null) {
  809.                                 c.projectileStage = 2;
  810.                                 int pX = c.getX();
  811.                                 int pY = c.getY();
  812.                                 int nX = Server.npcHandler.npcs[c.oldNpcIndex].getX();
  813.                                 int nY = Server.npcHandler.npcs[c.oldNpcIndex].getY();
  814.                                 int offX = (pY - nY)* -1;
  815.                                 int offY = (pX - nX)* -1;
  816.                                 c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 43, 31, c.oldNpcIndex + 1, getStartDelay());
  817.                                 if (usingDbow())
  818.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 60, 31,  c.oldNpcIndex + 1, getStartDelay(), 35);
  819.                         }
  820.                 }
  821.         }
  822.        
  823.  
  824.        
  825.         /**
  826.         * Attack Players, same as npc tbh xD
  827.         **/
  828.        
  829.                 public void attackPlayer(int i) {
  830.                 Client o = (Client)Server.playerHandler.players[i];
  831.                
  832.                
  833.           if (c.playerEquipment[c.playerWeapon] == 15241) {
  834.           c.gfx0(2138);
  835.           }
  836.                  
  837.                  
  838.        
  839.                
  840.        
  841.                
  842.        
  843.        
  844.        
  845.                  
  846.                
  847.                  
  848.                   if (!c.autocasting) {
  849.                                                 c.autocasting = false;
  850.                                                 c.getPA().resetAutocast();
  851.                                         }
  852.                 if(c.vestaDelay > 0) {
  853.                    resetPlayerAttack();
  854.                    return;
  855.                 }
  856.                                 if (c.playerEquipment[c.playerRing] == 2570) {
  857.                                
  858.                         if (c.playerLevel[3] > 0 && c.playerLevel[3] <= c.getLevelForXP(c.playerXP[3]) / 10 && c.underAttackBy > 0) {
  859.                                 int wildlvl = (((c.absY - 3520) / 8) + 1);
  860.                                 if (wildlvl < 20) {
  861.                                         c.sendMessage("Your ring of life is destroyed as it saves you.");
  862.                                         o.sendMessage("Your opponent has been saved by a ring of life.");
  863.                                         c.getItems().deleteEquipment(2570, c.playerRing);
  864.                                         c.getPA().startTeleport(2831, 2973, 0, "modern");
  865.                                         c.getItems().wearItem(-1, 1, 3); // deletes the ring
  866.                                         resetPlayerAttack();
  867.                        
  868.                 }
  869.         }
  870.         }
  871.                                                         if(c.curseActive[19]) { // Turmoil
  872.                         c.getstr = PlayerHandler.players[i].playerLevel[2] * 10 / 100;
  873.                         c.getdef = PlayerHandler.players[i].playerLevel[1] * 15 / 100;
  874.                         c.getatt = PlayerHandler.players[i].playerLevel[0] * 15 / 100;
  875.  
  876.                         }
  877.                         if(c.curseActive[10]) { // Leech Attack
  878.                                 c.getatt = PlayerHandler.players[i].playerLevel[0] * 10 / 100;
  879.                         }
  880.                         if(c.curseActive[13]) { // Leech Defense
  881.                                 c.getdef = PlayerHandler.players[i].playerLevel[1] * 10 / 100;
  882.                         }
  883.                         if(c.curseActive[14]) { // Leech Strength
  884.                                 c.getstr = PlayerHandler.players[i].playerLevel[2] * 10 / 100;
  885.                         }
  886.                         if(c.curseActive[11]) { // Leech Ranged
  887.                                 c.getatt = PlayerHandler.players[i].playerLevel[4] * 10 / 100;
  888.                         }
  889.                         if(c.curseActive[12]) { // Leech Magic
  890.                                 c.getatt = PlayerHandler.players[i].playerLevel[6] * 10 / 100;
  891.                         }
  892.                         if(c.curseActive[2]) { // Sap Attack
  893.                                 c.getatt = PlayerHandler.players[i].playerLevel[0] * 5 / 100;
  894.                         }
  895.                         if(c.curseActive[3]) { // Sap Defense
  896.                                 c.getdef = PlayerHandler.players[i].playerLevel[1] * 5 / 100;
  897.                         }
  898.                         if(c.curseActive[4]) { // Sap Strength
  899.                                 c.getstr = PlayerHandler.players[i].playerLevel[2] * 5 / 100;
  900.                         }
  901.                        
  902.  
  903.  
  904.             for (int u : c.Bolts)  {
  905.                 for (int y : c.BOWS)  {
  906.                     if(y == c.playerEquipment[c.playerWeapon] && u == c.playerEquipment[c.playerArrows] && c.playerEquipment[c.playerWeapon] != 4734 && c.playerEquipment[c.playerWeapon] != 9185 && c.playerEquipment[c.playerWeapon] != 18357){
  907.                         c.sendMessage("You cant use arrows with this bow.");
  908.                         return;
  909.                     }
  910.                 }
  911.             }
  912.                     /* DEGRADING */
  913.           if (c.playerEquipment[c.playerWeapon] >= 13901) {
  914.           c.degradeTime++;
  915.           }
  916.           if(c.playerEquipment[c.playerWeapon] == 13901 && c.degradeTime == 450) {// VLS Degrade.
  917.           c.getItems().wearItem(-1, 1, 3); // remove the equiped item
  918.           c.sendMessage("Your vesta's longsword has degraded into nothing."); // send a message
  919.           c.degradeTime = 0; // put the degrade number back to 0 so it can degrade again @ 500
  920.           }
  921.           if(c.playerEquipment[c.playerWeapon] == 13904 && c.degradeTime == 500) {// STAT Degrade.
  922.           c.getItems().wearItem(-1, 1, 3); // remove the equiped item
  923.           c.sendMessage("Your Statius warhammer has degraded into nothing."); // send a message
  924.           c.degradeTime = 0; // put the degrade number back to 0 so it can degrade again @ 500
  925.           }
  926.           if(c.playerEquipment[c.playerWeapon] == 13907 && c.degradeTime == 450) {// Spear Degrade.
  927.           c.getItems().wearItem(-1, 1, 3); // remove the equiped item
  928.           c.sendMessage("Your vesta's spear has degraded into nothing."); // send a message
  929.           c.degradeTime = 0; // put the degrade number back to 0 so it can degrade again @ 500
  930.           }
  931.                 if(c.specEffect == 4) {
  932.                 c.specEffect = 0;
  933.  
  934.                 }
  935.                     /* DEGRADING */
  936.                 if (Server.playerHandler.players[i] != null) {
  937.                        
  938.                         if (Server.playerHandler.players[i].isDead) {
  939.                                 resetPlayerAttack();
  940.                                 return;
  941.                         }
  942.                        
  943.                         if(c.respawnTimer > 0 || Server.playerHandler.players[i].respawnTimer > 0) {
  944.                                 resetPlayerAttack();
  945.                                 return;
  946.                         }
  947.                        
  948.                         if(!c.getCombat().checkReqs()) {
  949.                                 return;
  950.                         }
  951.                         if(c.trade11 > 0) {
  952.                                 c.sendMessage("You must wait 15 minutes before attacking anyone!");
  953.                                 c.sendMessage("this is because you're a new player. (Stops transfering gold)");
  954.                                 resetPlayerAttack();
  955.                                 return;
  956.                         }
  957.                         if(Server.playerHandler.players[i].trade11 > 0) {
  958.                                 c.sendMessage("You cannot attack a player that has just started the game!");
  959.                                 c.sendMessage("this is to stop STG (Stop transfering gold)");
  960.                                 resetPlayerAttack();
  961.                                 return;
  962.                         }
  963.                        
  964.                         boolean sameSpot = c.absX == Server.playerHandler.players[i].getX() && c.absY == Server.playerHandler.players[i].getY();
  965.                         if(!c.goodDistance(Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), c.getX(), c.getY(), 25) && !sameSpot) {
  966.                                 resetPlayerAttack();
  967.                                 return;
  968.                         }
  969.  
  970.                         if(Server.playerHandler.players[i].respawnTimer > 0) {
  971.                                 Server.playerHandler.players[i].playerIndex = 0;
  972.                                 resetPlayerAttack();
  973.                                 return;
  974.                         }
  975.                        
  976.                         if (Server.playerHandler.players[i].heightLevel != c.heightLevel) {
  977.                                 resetPlayerAttack();
  978.                                 return;
  979.                         }
  980.                         //c.sendMessage("Made it here0.");
  981.                         /*c.followId = i;
  982.                         c.followId2 = 0;*/
  983.                         c.getPA().followPlayer(i);
  984.                         if(c.attackTimer <= 0) {
  985.                                 c.usingBow = false;
  986.                                 c.specEffect = 0;
  987.                                 c.usingRangeWeapon = false;
  988.                                 c.rangeItemUsed = 0;
  989.                                 boolean usingBow = false;
  990.                                 boolean usingArrows = false;
  991.                                 boolean usingOtherRangeWeapons = false;
  992.                                 boolean usingCross = c.playerEquipment[c.playerWeapon] == 9185 && c.playerEquipment[c.playerWeapon] == 18357;
  993.                                 c.projectileStage = 0;
  994.                                
  995.                                 if (c.absX == Server.playerHandler.players[i].absX && c.absY == Server.playerHandler.players[i].absY) {
  996.                                         if (c.freezeTimer > 0) {
  997.                                                 resetPlayerAttack();
  998.                                                 return;
  999.                                         }      
  1000.                                        
  1001.                                         c.attackTimer = 0;
  1002.                                         return;
  1003.                                 }
  1004.                                
  1005.                                 if(!c.usingMagic) {
  1006.                                         for (int bowId : c.BOWS) {
  1007.                                                 if(c.playerEquipment[c.playerWeapon] == bowId) {
  1008.                                                         usingBow = true;
  1009.                                                         for (int arrowId : c.ARROWS) {
  1010.                                                                 if(c.playerEquipment[c.playerArrows] == arrowId) {
  1011.                                                                         usingArrows = true;
  1012.                                                                 }
  1013.                                                         }
  1014.                                                 }
  1015.                                         }                              
  1016.                                
  1017.                                         for (int otherRangeId : c.OTHER_RANGE_WEAPONS) {
  1018.                                                 if(c.playerEquipment[c.playerWeapon] == otherRangeId) {
  1019.                                                         usingOtherRangeWeapons = true;
  1020.                                                 }
  1021.                                         }
  1022.                                 }
  1023.                                 if (c.autocasting) {
  1024.                                         c.spellId = c.autocastId;
  1025.                                         c.usingMagic = true;
  1026.                                 }
  1027.                                 //c.sendMessage("Made it here2.");
  1028.                                 if(c.spellId > 0) {
  1029.                     c.usingMagic = true;
  1030.                 }
  1031.                                 c.attackTimer = getAttackDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1032.  
  1033.                                 if(c.duelRule[9]){
  1034.                                 boolean canUseWeapon = false;
  1035.                                         for(int funWeapon: Config.FUN_WEAPONS) {
  1036.                                                 if(c.playerEquipment[c.playerWeapon] == funWeapon) {
  1037.                                                         canUseWeapon = true;
  1038.                                                 }
  1039.                                         }
  1040.                                         if(!canUseWeapon) {
  1041.                                                 c.sendMessage("You can only use fun weapons in this duel!");
  1042.                                                 resetPlayerAttack();
  1043.                                                 return;
  1044.                                         }
  1045.                                 }
  1046.                                 //c.sendMessage("Made it here3.");
  1047.                                 if(c.duelRule[2] && (usingBow || usingOtherRangeWeapons)) {
  1048.                                         c.sendMessage("Range has been disabled in this duel!");
  1049.                                         return;
  1050.                                 }
  1051.                                 if(c.duelRule[3] && (!usingBow && !usingOtherRangeWeapons && !c.usingMagic)) {
  1052.                                         c.sendMessage("Melee has been disabled in this duel!");
  1053.                                         return;
  1054.                                 }
  1055.                                
  1056.                                 if(c.duelRule[4] && c.usingMagic) {
  1057.                                         c.sendMessage("Magic has been disabled in this duel!");
  1058.                                         resetPlayerAttack();
  1059.                                         return;
  1060.                                 }
  1061.                                
  1062.                                 if((!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 4) && (usingOtherRangeWeapons && !usingBow && !c.usingMagic))
  1063.                                 || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 2) && (!usingOtherRangeWeapons && usingHally() && !usingBow && !c.usingMagic))
  1064.                                 || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), getRequiredDistance()) && (!usingOtherRangeWeapons && !usingHally() && !usingBow && !c.usingMagic))
  1065.                                 || (!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(), Server.playerHandler.players[i].getY(), 10) && (usingBow || c.usingMagic))) {
  1066.                                         //c.sendMessage("Setting attack timer to 1");
  1067.                                         c.attackTimer = 1;
  1068.                                         if (!usingBow && !c.usingMagic && !usingOtherRangeWeapons && c.freezeTimer > 0)
  1069.                                                 resetPlayerAttack();
  1070.                                         return;
  1071.                                 }
  1072.                                
  1073.                                 if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223) && !c.usingMagic) {
  1074.                                         c.sendMessage("You have run out of arrows!");
  1075.                                         c.stopMovement();
  1076.                                         resetPlayerAttack();
  1077.                                         return;
  1078.                                 }
  1079.                                 if(correctBowAndArrows() < c.playerEquipment[c.playerArrows] && Config.CORRECT_ARROWS && usingBow && !usingCrystalBow() && usingCross && !c.usingMagic) {
  1080.                                         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()+".");
  1081.                                         c.stopMovement();
  1082.                                         resetPlayerAttack();
  1083.                                         return;
  1084.                                 }
  1085.         if(!usingCross && !usingArrows && usingBow && (c.playerEquipment[c.playerWeapon] < 4212 || c.playerEquipment[c.playerWeapon] > 4223)) {
  1086.                                         if(c.playerEquipment[c.playerWeapon] == 15241)
  1087.                                                 c.sendMessage("You have run out of shots");
  1088.                                         else
  1089.                                                 c.sendMessage("You have run out of arrows!");
  1090.                                         c.stopMovement();
  1091.                                         c.npcIndex = 0;
  1092.                                         return;
  1093.                                 }
  1094.                                 if (usingCross && !properBolts() && !c.usingMagic) {
  1095.                                         c.sendMessage("You must use bolts with a crossbow.");
  1096.                                         c.stopMovement();
  1097.                                         resetPlayerAttack();
  1098.                                         return;                        
  1099.                                 }
  1100.  
  1101.                                 if(usingBow || c.usingMagic || usingOtherRangeWeapons || usingHally()) {
  1102.                                         c.stopMovement();
  1103.                                 }
  1104.                                
  1105.                                 if(!checkMagicReqs(c.spellId)) {
  1106.                                         c.stopMovement();
  1107.                                         resetPlayerAttack();
  1108.                                         return;
  1109.                                 }
  1110.                                
  1111.                                 c.faceUpdate(i+32768);
  1112.                                
  1113.                                 if(c.duelStatus != 5 && !c.inPits && c.inWild()) {
  1114.                                         if(!c.attackedPlayers.contains(c.playerIndex) && !Server.playerHandler.players[c.playerIndex].attackedPlayers.contains(c.playerId)) {
  1115.                                                 c.attackedPlayers.add(c.playerIndex);
  1116.                                                 c.isSkulled = true;
  1117.                                                 c.skullTimer = Config.SKULL_TIMER;
  1118.                                                 c.headIconPk = 0;
  1119.                                                 c.getPA().requestUpdates();
  1120.                                         }
  1121.                                 }
  1122.                                 c.specAccuracy = 1.0;
  1123.                                 c.specDamage = 1.0;
  1124.                                 c.delayedDamage = c.delayedDamage2 = 0;
  1125.                                 if(c.usingSpecial && !c.usingMagic) {
  1126.                                         if(c.duelRule[10] && c.duelStatus == 5) {
  1127.                                                 c.sendMessage("Special attacks have been disabled during this duel!");
  1128.                                                 c.usingSpecial = false;
  1129.                                                 c.getItems().updateSpecialBar();
  1130.                                                 resetPlayerAttack();
  1131.                                                 return;
  1132.                                         }
  1133.                                         if(checkSpecAmount(c.playerEquipment[c.playerWeapon])){
  1134.                                                 c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  1135.                                                 activateSpecial(c.playerEquipment[c.playerWeapon], i);
  1136.                                                 //c.followId = c.playerIndex;
  1137.                                                 c.getPA().followPlayer(c.playerIndex);
  1138.                                                 return;
  1139.                                         } else {
  1140.                                                 c.sendMessage("You don't have the required special energy to use this attack.");
  1141.                                                 c.usingSpecial = false;
  1142.                                                 c.getItems().updateSpecialBar();
  1143.                                                 c.playerIndex = 0;
  1144.                                                 return;
  1145.                                         }      
  1146.                                 }
  1147.                                
  1148.                                 if(!c.usingMagic) {
  1149.                                         c.startAnimation(getWepAnim(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()));
  1150.                                         c.mageFollow = false;
  1151.                                 } else {
  1152.                                         c.startAnimation(c.MAGIC_SPELLS[c.spellId][2]);
  1153.                                         c.mageFollow = true;
  1154.                                         c.followId = c.playerIndex;
  1155.                                 }
  1156.                                 Server.playerHandler.players[i].underAttackBy = c.playerId;
  1157.                                 Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1158.                                 Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1159.                                 Server.playerHandler.players[i].killerId = c.playerId;
  1160.                                 c.lastArrowUsed = 0;
  1161.                                 c.rangeItemUsed = 0;
  1162.                                 if(!usingBow && !c.usingMagic && !usingOtherRangeWeapons) { // melee hit delay
  1163.                                         c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  1164.                                         c.getPA().followPlayer(c.playerIndex);
  1165.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1166.                                         c.delayedDamage = Misc.random(calculateMeleeMaxHit());
  1167.                                         c.projectileStage = 0;
  1168.                                         c.oldPlayerIndex = i;
  1169.                                 }
  1170.                                                                
  1171.                                 if(usingBow && !usingOtherRangeWeapons && !c.usingMagic || usingCross) { // range hit delay
  1172.                                         if(c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223) {
  1173.                                                 c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  1174.                                                 c.crystalBowArrowCount++;
  1175.                                         } else {
  1176.                                                 c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  1177.                                                 c.getItems().deleteArrow();
  1178.                                         }
  1179.                                         if (c.fightMode == 2)
  1180.                                                 c.attackTimer--;
  1181.                                         if (usingCross)
  1182.                                                 c.usingBow = true;
  1183.                                         c.usingBow = true;
  1184.                                         c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  1185.                                         c.getPA().followPlayer(c.playerIndex);
  1186.                                         c.lastWeaponUsed = c.playerEquipment[c.playerWeapon];
  1187.                                         c.lastArrowUsed = c.playerEquipment[c.playerArrows];
  1188.                                         c.gfx100(getRangeStartGFX());  
  1189.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1190.                                         c.projectileStage = 1;
  1191.                                         c.oldPlayerIndex = i;
  1192.                                         fireProjectilePlayer();
  1193.                                 }
  1194.                                                                                        
  1195.                                 if(usingOtherRangeWeapons) {    // knives, darts, etc hit delay
  1196.                                         c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  1197.                                         c.getItems().deleteEquipment();
  1198.                                         c.usingRangeWeapon = true;
  1199.                                         c.followId = Server.playerHandler.players[c.playerIndex].playerId;
  1200.                                         c.getPA().followPlayer(c.playerIndex);
  1201.                                         c.gfx100(getRangeStartGFX());
  1202.                                         if (c.fightMode == 2)
  1203.                                                 c.attackTimer--;
  1204.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1205.                                         c.projectileStage = 1;
  1206.                                         c.oldPlayerIndex = i;
  1207.                                         fireProjectilePlayer();
  1208.                                 }
  1209.  
  1210.                                 if(c.usingMagic) {      // magic hit delay
  1211.                                         int pX = c.getX();
  1212.                                         int pY = c.getY();
  1213.                                         int nX = Server.playerHandler.players[i].getX();
  1214.                                         int nY = Server.playerHandler.players[i].getY();
  1215.                                         int offX = (pY - nY)* -1;
  1216.                                         int offY = (pX - nX)* -1;
  1217.                                         c.castingMagic = true;
  1218.                                         c.projectileStage = 2;
  1219.                                         if(c.MAGIC_SPELLS[c.spellId][3] > 0) {
  1220.                                                 if(getStartGfxHeight() == 100) {
  1221.                                                         c.gfx100(c.MAGIC_SPELLS[c.spellId][3]);
  1222.                                                 } else {
  1223.                                                         c.gfx0(c.MAGIC_SPELLS[c.spellId][3]);
  1224.                                                 }
  1225.                                         }
  1226.                                         if(c.MAGIC_SPELLS[c.spellId][4] > 0) {
  1227.                                                 c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 78, c.MAGIC_SPELLS[c.spellId][4], getStartHeight(), getEndHeight(), -i - 1, getStartDelay());
  1228.                                         }
  1229.                                         if (c.autocastId > 0) {
  1230.                                                 c.followId = c.playerIndex;
  1231.                                                 c.followDistance = 5;
  1232.                                         }      
  1233.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  1234.                                         c.oldPlayerIndex = i;
  1235.                                         c.oldSpellId = c.spellId;
  1236.                                         c.spellId = 0;
  1237.                                        
  1238.                                         if(c.MAGIC_SPELLS[c.oldSpellId][0] == 12891 && o.isMoving) {
  1239.                                                 //c.sendMessage("Barrage projectile..");
  1240.                                                 c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 85, 368, 25, 25, -i - 1, getStartDelay());
  1241.                                         }
  1242.                                         if(Misc.random(o.getCombat().mageDef()) > Misc.random(mageAtk())) {
  1243.                                                 c.magicFailed = true;
  1244.                                         } else {
  1245.                                                 c.magicFailed = false;
  1246.                                         }
  1247.                                         int freezeDelay = getFreezeTime();//freeze time
  1248.                                         if(freezeDelay > 0 && Server.playerHandler.players[i].freezeTimer <= -3 && !c.magicFailed) {
  1249.                                                 Server.playerHandler.players[i].freezeTimer = freezeDelay;
  1250.                                                 o.resetWalkingQueue();
  1251.                                                 o.sendMessage("You have been frozen.");
  1252.                                                 o.barrageorb = 1;
  1253.                                                 o.frozenBy = c.playerId;
  1254.                                         }
  1255.                                         if (!c.autocasting && c.spellId <= 0)
  1256.                                                 c.playerIndex = 0;
  1257.                                 }
  1258.                                                                 if(c.curseActive[10]) { //Leech Attack
  1259.                                                 int failed = Misc.random(5);
  1260.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1261.                                 if(failed < 5) {
  1262.                                                 c.Lattack = false;
  1263.                                         return;
  1264.                                 } else if(failed == 5) {
  1265.                                                         c2.playerLevel[0] -= Misc.random(8);
  1266.                                 if (c2.playerLevel[0] < 1)
  1267.                                                 c2.playerLevel[0] = 1;
  1268.                                                 c2.getPA().refreshSkill(0);
  1269.                                 }
  1270.                                 if(c.oldPlayerIndex > 0) {
  1271.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1272.                                                 final int pX = c.getX();
  1273.                                                 final int pY = c.getY();
  1274.                                                 final int nX = PlayerHandler.players[i].getX();
  1275.                                                 final int nY = PlayerHandler.players[i].getY();
  1276.                                                 final int offX = (pY - nY)* -1;
  1277.                                                 final int offY = (pX - nX)* -1;
  1278.                                                 c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2252, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1279.                                                 c2.sendMessage("Your attack has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1280.                                                 c2.gfx0(2253);
  1281.                                                 c.startAnimation(12575);
  1282.                                                 c.Lattack = false;                             
  1283.                                 }
  1284.                         }
  1285.                 }
  1286.                                
  1287.                                
  1288.                                 if(c.curseActive[13]) { //Leech Defense
  1289.                                                 int failed = Misc.random(5);
  1290.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1291.                                 if(failed < 5) {
  1292.                                                 c.Ldefense = false;
  1293.                                         return;
  1294.                                 } else if(failed == 5) {
  1295.                                                         c2.playerLevel[1] -= Misc.random(8);
  1296.                                 if (c2.playerLevel[1] < 1)
  1297.                                                 c2.playerLevel[1] = 1;
  1298.                                                 c2.getPA().refreshSkill(1);
  1299.                                 }
  1300.                                 if(c.oldPlayerIndex > 0) {
  1301.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1302.                                                 final int pX = c.getX();
  1303.                                                 final int pY = c.getY();
  1304.                                                 final int nX = PlayerHandler.players[i].getX();
  1305.                                                 final int nY = PlayerHandler.players[i].getY();
  1306.                                                 final int offX = (pY - nY)* -1;
  1307.                                                 final int offY = (pX - nX)* -1;
  1308.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2242, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1309.                                                 c2.sendMessage("Your defense has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1310.                                                 c2.gfx0(2246);
  1311.                                                 c.startAnimation(12575);
  1312.                                                 c.Ldefense = false;                            
  1313.                                 }
  1314.                         }
  1315.                 }
  1316.                                
  1317.                                
  1318.                                 if(c.curseActive[14]) { //Leech Strength
  1319.                                                 int failed = Misc.random(5);
  1320.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1321.                                 if(failed < 5) {
  1322.                                                 c.Lstrength = false;
  1323.                                         return;
  1324.                                 } else if(failed == 5) {
  1325.                                                         c2.playerLevel[2] -= Misc.random(8);
  1326.                                 if (c2.playerLevel[2] < 1)
  1327.                                                 c2.playerLevel[2] = 1;
  1328.                                                 c2.getPA().refreshSkill(2);
  1329.                                 }
  1330.                                 if(c.oldPlayerIndex > 0) {
  1331.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1332.                                                 final int pX = c.getX();
  1333.                                                 final int pY = c.getY();
  1334.                                                 final int nX = PlayerHandler.players[i].getX();
  1335.                                                 final int nY = PlayerHandler.players[i].getY();
  1336.                                                 final int offX = (pY - nY)* -1;
  1337.                                                 final int offY = (pX - nX)* -1;
  1338.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2248, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1339.                                                 c2.sendMessage("Your strength has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1340.                                                 c2.gfx0(2250);
  1341.                                                 c.startAnimation(12575);
  1342.                                                 c.Lstrength = false;                           
  1343.                                 }
  1344.                         }
  1345.                 }
  1346.                
  1347.                                 if(c.curseActive[11]) { //Leech Ranged
  1348.                                                 int failed = Misc.random(5);
  1349.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1350.                                 if(failed < 5) {
  1351.                                                 c.Lranged = false;
  1352.                                         return;
  1353.                                 } else if(failed == 5) {
  1354.                                                         c2.playerLevel[4] -= Misc.random(8);
  1355.                                 if (c2.playerLevel[4] < 1)
  1356.                                                 c2.playerLevel[4] = 1;
  1357.                                                 c2.getPA().refreshSkill(4);
  1358.                                 }
  1359.                                 if(c.oldPlayerIndex > 0) {
  1360.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1361.                                                 final int pX = c.getX();
  1362.                                                 final int pY = c.getY();
  1363.                                                 final int nX = PlayerHandler.players[i].getX();
  1364.                                                 final int nY = PlayerHandler.players[i].getY();
  1365.                                                 final int offX = (pY - nY)* -1;
  1366.                                                 final int offY = (pX - nX)* -1;
  1367.                                                 c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2236, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1368.                                                 c2.sendMessage("Your ranged has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1369.                                                 c2.gfx0(2238);
  1370.                                                 c.startAnimation(12575);
  1371.                                                 c.Lranged = false;                             
  1372.                                 }
  1373.                         }
  1374.                 }
  1375.                                
  1376.                                 if(c.curseActive[12]) { //Leech Magic
  1377.                                                 int failed = Misc.random(5);
  1378.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1379.                                 if(failed < 5) {
  1380.                                                 c.Lmagic = false;
  1381.                                         return;
  1382.                                 } else if(failed == 5) {
  1383.                                                         c2.playerLevel[6] -= Misc.random(7) + 1;
  1384.                                 if (c2.playerLevel[6] < 1)
  1385.                                                 c2.playerLevel[6] = 1;
  1386.                                                 c2.getPA().refreshSkill(6);
  1387.                                 }
  1388.                                 if(c.oldPlayerIndex > 0) {
  1389.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1390.                                                 final int pX = c.getX();
  1391.                                                 final int pY = c.getY();
  1392.                                                 final int nX = PlayerHandler.players[i].getX();
  1393.                                                 final int nY = PlayerHandler.players[i].getY();
  1394.                                                 final int offX = (pY - nY)* -1;
  1395.                                                 final int offY = (pX - nX)* -1;
  1396.                                                 c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2240, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1397.                                                 c2.sendMessage("Your Magic has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1398.                                                 c2.gfx0(2242);
  1399.                                                 c.startAnimation(12575);
  1400.                                                 c.Lmagic = false;                              
  1401.                                 }
  1402.                         }
  1403.                 }
  1404.  
  1405.                                 if(c.curseActive[16]) { //Leech Special
  1406.                                                 int failed = Misc.random(10);
  1407.                                                 Client c2 = (Client)PlayerHandler.players[i];
  1408.                                 if(failed < 10) {
  1409.                                                 c.Lspecial = false;
  1410.                                         return;
  1411.                                 } else if(failed == 10) {
  1412.                                                         c2.specAmount -= 0.5;
  1413.                                                         c.specAmount += 0.5;
  1414.                                                         final int pX = c.getX();
  1415.                                                         final int pY = c.getY();
  1416.                                                         final int nX = PlayerHandler.players[i].getX();
  1417.                                                         final int nY = PlayerHandler.players[i].getY();
  1418.                                                         final int offX = (pY - nY)* -1;
  1419.                                                         final int offY = (pX - nX)* -1;
  1420.                                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2256, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1421.                                                         c2.sendMessage("Your special attack has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1422.                                                         c2.gfx0(2258);
  1423.                                                         c.startAnimation(12575);
  1424.                                                         c.getItems().updateSpecialBar();
  1425.                                                         c.sendMessage("You have leeched " +Misc.optimizeText(c2.playerName)+"'s special attack!");
  1426.                                                         //c2.specAmount -= Misc.random(8);
  1427.                                 if (c2.specAmount < 1)
  1428.                                                 c2.specAmount = 1;
  1429.                                 }
  1430.                                 if(c.oldPlayerIndex > 0) {
  1431.                                 if(PlayerHandler.players[c.oldPlayerIndex] != null) {
  1432.                                                 final int pX = c.getX();
  1433.                                                 final int pY = c.getY();
  1434.                                                 final int nX = PlayerHandler.players[i].getX();
  1435.                                                 final int nY = PlayerHandler.players[i].getY();
  1436.                                                 final int offX = (pY - nY)* -1;
  1437.                                                 final int offY = (pX - nX)* -1;
  1438.                                                 c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2256, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1439.                                                 //c2.sendMessage("Your special attack has been leeched by " +Misc.optimizeText(c.playerName)+"!");
  1440.                                                 c2.gfx0(2258);
  1441.                                                 c.startAnimation(12575);
  1442.                                                 c.getItems().updateSpecialBar();
  1443.                                                 c.Lspecial = false;                                                                    
  1444.                                 }
  1445.                         }
  1446.                 }
  1447.  
  1448.                         if(c.curseActive[18]) { // SoulSplit GFX's - CAUSES CRASH
  1449.                 if(c.oldPlayerIndex > 0) {
  1450.                         if(Server.playerHandler.players[c.oldPlayerIndex] != null) {
  1451.                                         try {
  1452.                                         final int pX = c.getX();
  1453.                                         final int pY = c.getY();
  1454.                                         final int nX = Server.playerHandler.players[i].getX();
  1455.                                         final int nY = Server.playerHandler.players[i].getY();
  1456.                                         final int offX = (pY - nY)* -1;
  1457.                                         final int offY = (pX - nX)* -1;
  1458.                                         c.SSPLIT = true;
  1459.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 2263, 9, 9, - c.oldPlayerIndex - 1, 24, 0);
  1460.                                 //EventManager.getSingleton().addEvent(new Event() {
  1461.                                 //public void execute(EventContainer b) {
  1462.                                         //Server.playerHandler.players[c.oldPlayerIndex].gfx0(2264); // 1738
  1463.                                         c.SSPLIT = false;
  1464.                                       //  b.stop();
  1465.                                         //}
  1466.                                 //}, 500);
  1467.                                 /*EventManager.getSingleton().addEvent(new Event() { // CAUSES CRASH
  1468.                                 public void execute(EventContainer b) {
  1469.                                         //c.getPA().createPlayersProjectile2(nX, nY, offX, offY, 50, 50, 2263, 9, 9, - c.playerId - 1, 24, 0);
  1470.                                         b.stop();
  1471.                                         }
  1472.                                 }, 800);*/
  1473.                         } catch (Exception e) {
  1474.                         e.printStackTrace();
  1475.                 }
  1476.                 }
  1477.         }
  1478. }
  1479.  
  1480.                                 if(usingBow && Config.CRYSTAL_BOW_DEGRADES) { // crystal bow degrading
  1481.                                         if(c.playerEquipment[c.playerWeapon] == 4212) { // new crystal bow becomes full bow on the first shot
  1482.                                                 c.getItems().wearItem(4214, 1, 3);
  1483.                                         }
  1484.                                        
  1485.                                         if(c.crystalBowArrowCount >= 250){
  1486.                                                 switch(c.playerEquipment[c.playerWeapon]) {
  1487.                                                        
  1488.                                                         case 4223: // 1/10 bow
  1489.                                                         c.getItems().wearItem(-1, 1, 3);
  1490.                                                         c.sendMessage("Your crystal bow has fully degraded.");
  1491.                                                         if(!c.getItems().addItem(4207, 1)) {
  1492.                                                                 Server.itemHandler.createGroundItem(c, 4207, c.getX(), c.getY(), 1, c.getId());
  1493.                                                         }
  1494.                                                         c.crystalBowArrowCount = 0;
  1495.                                                         break;
  1496.                                                        
  1497.                                                         default:
  1498.                                                         c.getItems().wearItem(++c.playerEquipment[c.playerWeapon], 1, 3);
  1499.                                                         c.sendMessage("Your crystal bow degrades.");
  1500.                                                         c.crystalBowArrowCount = 0;
  1501.                                                         break;
  1502.                                                 }
  1503.                                         }      
  1504.                                 }
  1505.                         }
  1506.                 }
  1507.         }
  1508.        
  1509.         public boolean usingCrystalBow() {
  1510.                 return c.playerEquipment[c.playerWeapon] >= 4212 && c.playerEquipment[c.playerWeapon] <= 4223; 
  1511.         }
  1512.        
  1513.         public void appendVengeance(int otherPlayer, int damage) {
  1514.                 if (damage <= 0)
  1515.                         return;
  1516.                 Player o = Server.playerHandler.players[otherPlayer];
  1517.                 o.forcedText = "Taste Vengeance!";
  1518.                 o.forcedChatUpdateRequired = true;
  1519.                 o.updateRequired = true;
  1520.                 o.vengOn = false;
  1521.                 if ((o.playerLevel[3] - damage) > 0) {
  1522.                         damage = (int)(damage * 0.75);
  1523.                         if (damage > c.playerLevel[3]) {
  1524.                                 damage = c.playerLevel[3];
  1525.                         }
  1526. //                      Server.npcHandler.npcs[i].CIcon = 2;
  1527.                         c.setHitDiff2(damage);
  1528.                         c.setHitUpdateRequired2(true);
  1529.                         c.playerLevel[3] -= damage;
  1530.                         c.getPA().refreshSkill(3);
  1531.  
  1532.                 }      
  1533.                 c.updateRequired = true;
  1534.         }
  1535.  
  1536.  
  1537.         public void appendVengeanceNPC(int otherPlayer, int damage) {
  1538.                 if (damage <= 0)
  1539.                         return;
  1540.                 if (c.npcIndex > 0 && Server.npcHandler.npcs[c.npcIndex] != null) {
  1541.                         c.forcedText = "Taste Vengeance!";
  1542.                         c.forcedChatUpdateRequired = true;
  1543.                         c.updateRequired = true;
  1544.                         c.vengOn = false;
  1545.                         if ((Server.npcHandler.npcs[c.npcIndex].HP - damage) > 0) {
  1546.                                 damage = (int)(damage * 0.75);
  1547.                                 if (damage > Server.npcHandler.npcs[c.npcIndex].HP) {
  1548.                                         damage = Server.npcHandler.npcs[c.npcIndex].HP;
  1549.                                 }
  1550.                                 Server.npcHandler.npcs[c.npcIndex].CIcon = 2;
  1551.                                 Server.npcHandler.npcs[c.npcIndex].HP -= damage;
  1552.                                 Server.npcHandler.npcs[c.npcIndex].hitDiff2 = damage;
  1553.                                 Server.npcHandler.npcs[c.npcIndex].hitUpdateRequired2 = true;
  1554.                                 Server.npcHandler.npcs[c.npcIndex].updateRequired = true;
  1555.                         }
  1556.                 }      
  1557.                 c.updateRequired = true;
  1558.         }
  1559.        
  1560.         public void playerDelayedHit(int i) {
  1561.                 if (Server.playerHandler.players[i] != null) {
  1562.                         if (Server.playerHandler.players[i].isDead || c.isDead || Server.playerHandler.players[i].playerLevel[3] <= 0 || c.playerLevel[3] <= 0) {
  1563.                                 c.playerIndex = 0;
  1564.                                 return;
  1565.                         }
  1566.                         if (Server.playerHandler.players[i].respawnTimer > 0) {
  1567.                                 c.faceUpdate(0);
  1568.                                 c.playerIndex = 0;
  1569.                                 return;
  1570.                         }
  1571.                         Client o = (Client) Server.playerHandler.players[i];
  1572.                         o.getPA().removeAllWindows();
  1573.                         if (o.playerIndex <= 0 && o.npcIndex <= 0) {
  1574.                                 if (o.autoRet == 1) {
  1575.                                         o.playerIndex = c.playerId;
  1576.                                 }      
  1577.                         }
  1578.                         if(o.attackTimer <= 3 || o.attackTimer == 0 && o.playerIndex == 0 && !c.castingMagic) { // block animation
  1579.                                 o.startAnimation(o.getCombat().getBlockEmote());
  1580.                         }
  1581.                         if(o.inTrade) {
  1582.                                 o.getTradeAndDuel().declineTrade();
  1583.                         }
  1584.                                         /*      if(c.projectileStage == 0 && !c.usingMagic && !c.castingMagic) { // melee hit damage                                                           
  1585.                                         applyPlayerMeleeDamage(i, 1, Misc.random(calculateMeleeMaxHit()));
  1586.                                         if(c.doubleHit && !c.usingClaws) {
  1587.                                                 applyPlayerMeleeDamage(i, 2, Misc.random(calculateMeleeMaxHit()));
  1588.                                         }      
  1589.                                         if(c.doubleHit && c.usingClaws) {
  1590.                                                 applyPlayerMeleeDamage(i, 2, c.previousDamage / 2);
  1591.                                         }
  1592.                         }*/
  1593.  
  1594.                         if(c.projectileStage == 0 && !c.usingMagic && !c.castingMagic) { // melee hit damage
  1595.                                         if (!c.usingClaws)
  1596.                                                 applyPlayerMeleeDamage(i, 1, Misc.random(calculateMeleeMaxHit()));
  1597.                                         if(c.doubleHit && !c.usingClaws) {
  1598.                                                 applyPlayerMeleeDamage(i, 2, Misc.random(calculateMeleeMaxHit()));
  1599.                                         }              
  1600.                                         if(c.doubleHit && c.usingClaws) {
  1601.                                                 //System.out.println(c.clawDamage + " " + c.clawDamage/2 + " " + c.clawDamage/4 + " " + c.clawDamage/4 + 1);
  1602.                                                 c.delayedDamage = c.clawDamage;
  1603.                                                 c.delayedDamage2 = c.clawDamage/2;
  1604.                                                 applyPlayerMeleeDamage(i, 1, c.clawDamage);
  1605.                                                 applyPlayerMeleeDamage(i, 2, c.clawDamage/2);
  1606.                                         }
  1607.                         }
  1608.                        
  1609.                         if(!c.castingMagic && c.projectileStage > 0) { // range hit damage
  1610.                                 int damage = Misc.random(rangeMaxHit());
  1611.                        
  1612.                                 int damage2 = -1;
  1613.                                 int PrayerDrain = 0;
  1614.                                 if (c.lastWeaponUsed == 11235 && c.bowSpecShot == 1)
  1615.                                         damage2 = Misc.random(rangeMaxHit());
  1616.                                 boolean ignoreDef = false;
  1617.                                 if (Misc.random(5) == 1 && c.lastArrowUsed == 9243 && c.playerEquipment[c.playerWeapon] == 9185) {
  1618.                                         ignoreDef = true;
  1619.                                         o.gfx0(758);
  1620.                                 }      
  1621.                                
  1622.                                 if (Misc.random(4) == 1 && c.lastArrowUsed == 9243 && c.playerEquipment[c.playerWeapon] == 18357) {
  1623.                                         ignoreDef = true;
  1624.                                         o.gfx0(758);
  1625.                                 }
  1626.  
  1627.                                 if(Misc.random(10+o.getCombat().calculateRangeDefence()) > Misc.random(10+calculateRangeAttack()) && !ignoreDef) {
  1628.                                         damage = 0;
  1629.                                 }
  1630.                                
  1631.                                 if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1) {
  1632.                                         if (Misc.random(o.getCombat().calculateRangeDefence()) > Misc.random(calculateRangeAttack()))
  1633.                                                 damage2 = 0;
  1634.                                 }
  1635.                                
  1636.                                 if (c.dbowSpec) {
  1637.                                         o.gfx100(1100);
  1638.                                         if (damage < 8)
  1639.                                                 damage = 8;
  1640.                                         if (damage2 < 8)
  1641.                                                 damage2 = 8;
  1642.                                         c.dbowSpec = false;
  1643.                                 }
  1644.                                 if (damage > 0 && Misc.random(5) == 1 && c.lastArrowUsed == 9244 && c.playerEquipment[c.playerWeapon] == 9185) {
  1645.                                         damage *= 1.45;
  1646.                                         o.gfx0(756);
  1647.                                 }
  1648.                 switch (c.playerEquipment[c.playerWeapon]) {
  1649.                 case 18371: // Gravite Staff
  1650.                         damage *= .05;
  1651.                 case 4675: // Ancient Staff
  1652.                 case 4710: // Ahrim's Staff
  1653.                 case 4862: // Ahrim's Staff
  1654.                 case 4864: // Ahrim's Staff
  1655.                 case 4865: // Ahrim's Staff
  1656.                 case 6914: // Master Wand
  1657.                 case 8841: // Void Knight Mace
  1658.                 case 13867: // Zuriel's Staff
  1659.                 case 13869: // Zuriel's Staff (Deg)
  1660.                         damage *= .10;
  1661.                        
  1662.                 case 15486: // Staff of Light
  1663.                         damage *= .15;
  1664.                        
  1665.                 case 18355: // Chaotic Staff
  1666.                         damage *= .20;
  1667.                        
  1668.                 }
  1669.                 switch (c.playerEquipment[c.playerAmulet]) {
  1670.                 case 18333: // Arcane Pulse
  1671.                         damage *= .05;
  1672.                        
  1673.                 case 18334:// Arcane Blast
  1674.                         damage *= .10;
  1675.                        
  1676.                 case 18335:// Arcane Stream
  1677.                         damage *= .15;
  1678.                        
  1679.                 }
  1680.                 switch (c.playerEquipment[c.playerHat]) {
  1681.                 case 13350: // Virtus Mask
  1682.                         damage *= .03;
  1683.                        
  1684.                 }
  1685.                 switch (c.playerEquipment[c.playerChest]) {
  1686.                 case 13348: // Virtus Body
  1687.                         damage *= .06;
  1688.                        
  1689.                 }
  1690.                 switch (c.playerEquipment[c.playerLegs]) {
  1691.                 case 13346: // Virtus Legs
  1692.                         damage *= .04;
  1693.                 }
  1694.                        
  1695.                                 if (damage > 0 && Misc.random(4) == 1 && c.lastArrowUsed == 9244 && c.playerEquipment[c.playerWeapon] == 18357) {
  1696.                                         damage *= 1.45;
  1697.                                         o.gfx0(756);
  1698.                                 }
  1699.                                 if(o.curseActive[8]) {
  1700.                                         o.gfx0(2229);
  1701.                                         o.startAnimation(12573);
  1702.                                 }
  1703.                                 if(o.prayerActive[17] || o.curseActive[8] && System.currentTimeMillis() - o.protRangeDelay > 1500) { // if prayer active reduce damage by half
  1704.                                         damage = (int)damage * 40 / 100;
  1705.                                         /*if (o.playerEquipment[o.playerShield] == 15023 && o.playerLevel[5] >= 1 && damage >= 1) {
  1706.                                                 damage = (int)damage * 42 / 100;
  1707.                                                 damage2 = (int)damage2 * 42 / 100;
  1708.                                                 o.playerLevel[5] -= PrayerDrain;
  1709.                                                 o.getPA().refreshSkill(5);
  1710.                                         }*/
  1711.                                         if (o.playerLevel[5] <= 0) {
  1712.                                         o.playerLevel[5] = 0;
  1713.                                         o.getCombat().resetPrayers();
  1714.                                         o.getPA().refreshSkill(5);
  1715.                                         //}
  1716.                                         //}
  1717.                                         }
  1718.  
  1719.                                         /*if (o.playerEquipment[o.playerShield] == 13742 && !o.prayerActive[17] || !o.curseActive[8] && damage >= 1) {
  1720.                                                 damage = (int)damage * 65 / 100;
  1721.                                                 damage2 = (int)damage2 * 65 / 100;
  1722.                                         }*/
  1723.                                         //}
  1724.  
  1725.                                         if (c.lastWeaponUsed == 11235 || c.bowSpecShot == 1)
  1726.                                                 damage2 = Misc.random(rangeMaxHit());
  1727.                                 }
  1728.                                         if (o.playerEquipment[o.playerWeapon] == 15486 && damage >= 1 && o.SolProtect >= 1) {
  1729.                                         damage = (int)damage / 2;
  1730.                                         damage2 = (int)damage2 / 2;
  1731.                                         }
  1732.  
  1733.                                         if (o.playerEquipment[o.playerShield] == 15023 && !o.prayerActive[17] || !o.curseActive[8] && o.playerLevel[5] >= 1 && damage >= 1) {
  1734.                                         //if(Misc.random(2) == 1) {
  1735.                                         damage = (int)damage * 70 / 100;
  1736.                                         damage2 = (int)damage2 * 70 / 100;
  1737.                                         o.playerLevel[5] -= PrayerDrain;
  1738.                                         o.getPA().refreshSkill(5);
  1739.  
  1740.                                         if (o.playerLevel[5] <= 0) {
  1741.                                         o.playerLevel[5] = 0;
  1742.                                         o.getCombat().resetPrayers();
  1743.                                         o.getPA().refreshSkill(5);
  1744.                                         //}
  1745.                                         }
  1746.                                         }
  1747.                                 if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  1748.                                         damage = Server.playerHandler.players[i].playerLevel[3];
  1749.                                 }
  1750.                                 if (Server.playerHandler.players[i].playerLevel[3] - damage - damage2 < 0) {
  1751.                                         damage2 = Server.playerHandler.players[i].playerLevel[3] - damage;
  1752.                                 }
  1753.                                 if (damage < 0)
  1754.                                         damage = 0;
  1755.                                 if (damage2 < 0 && damage2 != -1)
  1756.                                         damage2 = 0;
  1757.                                 if (o.vengOn) {
  1758.                                         appendVengeance(i, damage);
  1759.                                         appendVengeance(i, damage2);
  1760.                                 }
  1761.                                 if (damage > 0)
  1762.                                         applyRecoil(damage, i);
  1763.                                         Deflect(damage, i);
  1764.                                 if (damage2 > 0)
  1765.                                         applyRecoil(damage2, i);
  1766.                                         Deflect(damage2, i);
  1767.                                 if(c.fightMode == 3) {
  1768.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 4);
  1769.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 1);                             
  1770.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  1771.                                         c.getPA().refreshSkill(1);
  1772.                                         c.getPA().refreshSkill(3);
  1773.                                         c.getPA().refreshSkill(4);
  1774.                                 } else {
  1775.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE), 4);
  1776.                                         c.getPA().addSkillXP((damage*Config.RANGE_EXP_RATE/3), 3);
  1777.                                         c.getPA().refreshSkill(3);
  1778.                                         c.getPA().refreshSkill(4);
  1779.                                 }
  1780.                                 boolean dropArrows = true;
  1781.                                                
  1782.                                 for(int noArrowId : c.NO_ARROW_DROP) {
  1783.                                         if(c.lastWeaponUsed == noArrowId) {
  1784.                                                 dropArrows = false;
  1785.                                                 break;
  1786.                                         }
  1787.                                 }
  1788.                                 if(dropArrows) {
  1789.                                         c.getItems().dropArrowPlayer();
  1790.                                 }
  1791.                                 Server.playerHandler.players[i].underAttackBy = c.playerId;
  1792.                                 Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  1793.                                 Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  1794.                                 Server.playerHandler.players[i].killerId = c.playerId;
  1795.                                 Server.playerHandler.players[i].CIcon = 1;
  1796.                                 //Server.playerHandler.players[i].setHitDiff(damage);
  1797.                                 //Server.playerHandler.players[i].playerLevel[3] -= damage;
  1798.                                 Server.playerHandler.players[i].handleHitMask(damage);
  1799.                                 Server.playerHandler.players[i].dealDamage(damage);
  1800.                                 Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  1801.                                 c.killedBy = Server.playerHandler.players[i].playerId;
  1802.                                 //Server.npcHandler.npcs[i].CIcon = 1;
  1803.                                 if (damage2 != -1) {
  1804.                                         int [] rangeDouble = {11235};
  1805. for (int j = 0; j < rangeDouble.length; j++) {
  1806. if (damage2 != -1 && rangeDouble[j] == c.playerEquipment[c.playerWeapon]) {
  1807. //Server.playerHandler.players[i].playerLevel[3] -= damage2;
  1808. Server.playerHandler.players[i].CIcon = 1;
  1809. Server.playerHandler.players[i].dealDamage(damage2);
  1810. Server.playerHandler.players[i].damageTaken[c.playerId] += damage2;
  1811. Server.playerHandler.players[i].handleHitMask(damage2);
  1812.  
  1813.  
  1814. }
  1815. }
  1816. }
  1817.                                 o.getPA().refreshSkill(3);
  1818.                        
  1819.                                        
  1820.                                 //Server.playerHandler.players[i].setHitUpdateRequired(true);  
  1821.                                 Server.playerHandler.players[i].updateRequired = true;
  1822.                                 applySmite(i, damage);
  1823.                                 if (damage2 != -1)
  1824.                                         applySmite(i, damage2);
  1825.                        
  1826.                         } else if (c.projectileStage > 0) { // magic hit damage
  1827.                                 int damage = Misc.random(c.MAGIC_SPELLS[c.oldSpellId][6]);
  1828.                                 if(godSpells()) {
  1829.                                         if(System.currentTimeMillis() - c.godSpellDelay < Config.GOD_SPELL_CHARGE) {
  1830.                                                 damage += 10;
  1831.                                         }
  1832.                                 }
  1833.                                 if(c.playerEquipment[c.playerWeapon] == 15486) {
  1834.                                                 damage += 5;
  1835.                                         }
  1836.                                 int PrayerDrain = 0;
  1837.                                 //c.playerIndex = 0;
  1838.                                 if (c.magicFailed)
  1839.                                         damage = 0;
  1840.                                 if(o.curseActive[7]) {
  1841.                                         o.gfx0(2228);
  1842.                                         o.startAnimation(12573);
  1843.                                 }      
  1844.                                 if(o.prayerActive[16] || o.curseActive[7] && System.currentTimeMillis() - o.protMageDelay > 1500) { // if prayer active reduce damage by half
  1845.                                         damage = (int)damage * 40 / 100;
  1846.                                         if (o.playerEquipment[o.playerShield] == 15023 && o.playerLevel[5] >= 1 && damage >= 1) {
  1847.                                         //if (Misc.random(2) == 1) {
  1848.                                         damage = (int)damage * 42 / 100;
  1849.                                         o.playerLevel[5] -= PrayerDrain;
  1850.                                         o.getPA().refreshSkill(5);
  1851.  
  1852.                                         if (o.playerLevel[5] <= 0) {
  1853.                                         o.playerLevel[5] = 0;
  1854.                                         o.getCombat().resetPrayers();
  1855.                                         o.getPA().refreshSkill(5);
  1856.                                         }
  1857.                                         }
  1858.                                         }
  1859.                                         //}
  1860.  
  1861.                                         if (o.playerEquipment[o.playerShield] == 13742 && !o.prayerActive[16] || !o.curseActive[7] && damage >= 1) {
  1862.                                         if(Misc.random(4) == 3) {
  1863.                                         damage = (int)damage * 65 / 100;
  1864.                                         }
  1865.                                         }
  1866.  
  1867.                                         if (o.playerEquipment[o.playerWeapon] == 15486 && damage >= 1 && o.SolProtect >= 1) {
  1868.                                         damage = (int)damage / 2;
  1869.                                         }
  1870.  
  1871.                                         if (o.playerEquipment[o.playerShield] == 15023 && !o.prayerActive[16] || !o.curseActive[7] && o.playerLevel[5] >= 1 && damage >= 1) {
  1872.                                         //if(Misc.random(2) == 1) {
  1873.                                         damage = (int)damage * 70 / 100;
  1874.                                         o.getPA().refreshSkill(5);
  1875.                                         o.playerLevel[5] -= PrayerDrain;
  1876.  
  1877.                                         if (o.playerLevel[5] <= 0) {
  1878.                                         o.playerLevel[5] = 0;
  1879.                                         o.getCombat().resetPrayers();
  1880.                                         o.getPA().refreshSkill(5);
  1881.                                         //}
  1882.                                         }
  1883.                                         }
  1884.                                 if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  1885.                                         damage = Server.playerHandler.players[i].playerLevel[3];
  1886.                                 }
  1887.                                 if (o.vengOn)
  1888.                                         appendVengeance(i, damage);
  1889.                                 if (damage > 0)
  1890.                                         applyRecoil(damage, i);
  1891.                                         Deflect(damage, i);
  1892.                                 c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  1893.                                 c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  1894.                                 c.getPA().refreshSkill(3);
  1895.                                 c.getPA().refreshSkill(6);
  1896.                                
  1897.                                 if(getEndGfxHeight() == 100 && !c.magicFailed){ // end GFX
  1898.                                         Server.playerHandler.players[i].gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1899.                                 } else if (!c.magicFailed){
  1900.                                         Server.playerHandler.players[i].gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  1901.                                 } else if(c.magicFailed) {     
  1902.                                         Server.playerHandler.players[i].gfx100(85);
  1903.                                 }
  1904.                                
  1905.                                 if(!c.magicFailed) {
  1906.                                         if(System.currentTimeMillis() - Server.playerHandler.players[i].reduceStat > 35000) {
  1907.                                                 Server.playerHandler.players[i].reduceStat = System.currentTimeMillis();
  1908.                                                 switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  1909.                                                         case 12987:
  1910.                                                         case 13011:
  1911.                                                         case 12999:
  1912.                                                         case 13023:
  1913.                                                         Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 10) / 100);
  1914.                                                         break;
  1915.                                                 }
  1916.                                         }
  1917.                                        
  1918.                                         switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {      
  1919.                                                 case 12445: //teleblock
  1920.                                                 if (System.currentTimeMillis() - o.teleBlockDelay > o.teleBlockLength) {
  1921.                                                         o.teleBlockDelay = System.currentTimeMillis();
  1922.                                                         o.sendMessage("You have been teleblocked.");
  1923.                                                         if (o.prayerActive[16] || o.curseActive[7] && System.currentTimeMillis() - o.protMageDelay > 1500)
  1924.                                                                 o.teleBlockLength = 150000;
  1925.                                                         else
  1926.                                                                 o.teleBlockLength = 300000;
  1927.                                                 }                      
  1928.                                                 break;
  1929.                                                 case 12871:
  1930.                                                         if (o.barrageorb == 1) {
  1931.                                                                 o.barrageorb = 0;
  1932.                                                         }
  1933.                                                 break;
  1934.  
  1935.                                                 case 12891:                    
  1936.                                                         if (o.barrageorb != 1) {
  1937.                                                                 o.gfx50(1677);
  1938.                                                         }
  1939.                                                         if (o.barrageorb == 1) {
  1940.                                                                 o.barrageorb = 0;
  1941.                                                         }
  1942.                                                 break;
  1943.                                                 case 12901:
  1944.                                                 case 12919: // blood spells
  1945.                                                 case 12911:
  1946.                                                 case 12929:
  1947.                                                 int heal = (int)(damage / 4);
  1948.                                                 if(c.playerLevel[3] + heal > c.getPA().getLevelForXP(c.playerXP[3])) {
  1949.                                                         c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  1950.                                                 } else {
  1951.                                                         c.playerLevel[3] += heal;
  1952.                                                 }
  1953.                                                 c.getPA().refreshSkill(3);
  1954.                                                 break;
  1955.                                                
  1956.                                                 case 1419:
  1957.                                             c.playerStandIndex = 847;
  1958.                                             c.playerWalkIndex = 9738;
  1959.                                             c.playerRunIndex = 9739;
  1960.                                         break;
  1961.                                                 case 1153:                                             
  1962.                                                 Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 5) / 100);
  1963.                                                 o.sendMessage("Your attack level has been reduced!");
  1964.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1965.                                                 o.getPA().refreshSkill(0);
  1966.                                                 break;
  1967.                                                
  1968.                                                 case 1157:
  1969.                                                 Server.playerHandler.players[i].playerLevel[2] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[2]) * 5) / 100);
  1970.                                                 o.sendMessage("Your strength level has been reduced!");
  1971.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();                                        
  1972.                                                 o.getPA().refreshSkill(2);
  1973.                                                 break;
  1974.                                                
  1975.                                                 case 1161:
  1976.                                                 Server.playerHandler.players[i].playerLevel[1] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[1]) * 5) / 100);
  1977.                                                 o.sendMessage("Your defence level has been reduced!");
  1978.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();                                
  1979.                                                 o.getPA().refreshSkill(1);
  1980.                                                 break;
  1981.                                                
  1982.                                                 case 1542:
  1983.                                                 Server.playerHandler.players[i].playerLevel[1] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[1]) * 10) / 100);
  1984.                                                 o.sendMessage("Your defence level has been reduced!");
  1985.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] =  System.currentTimeMillis();
  1986.                                                 o.getPA().refreshSkill(1);
  1987.                                                 break;
  1988.                                                
  1989.                                                 case 1543:
  1990.                                                 Server.playerHandler.players[i].playerLevel[2] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[2]) * 10) / 100);
  1991.                                                 o.sendMessage("Your strength level has been reduced!");
  1992.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();
  1993.                                                 o.getPA().refreshSkill(2);
  1994.                                                 break;
  1995.                                                
  1996.                                                 case 1562:                                     
  1997.                                                 Server.playerHandler.players[i].playerLevel[0] -= ((o.getPA().getLevelForXP(Server.playerHandler.players[i].playerXP[0]) * 10) / 100);
  1998.                                                 o.sendMessage("Your attack level has been reduced!");
  1999.                                                 Server.playerHandler.players[i].reduceSpellDelay[c.reduceSpellId] = System.currentTimeMillis();                                
  2000.                                                 o.getPA().refreshSkill(0);
  2001.                                                 break;
  2002.                                         }                                      
  2003.                                 }
  2004.                                
  2005.                                 Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  2006.                                 Server.playerHandler.players[i].underAttackBy = c.playerId;
  2007.                                 Server.playerHandler.players[i].killerId = c.playerId;
  2008.                                 Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  2009.                                 if(c.MAGIC_SPELLS[c.oldSpellId][6] != 0) {
  2010.                                         Server.npcHandler.npcs[i].CIcon = 2;
  2011.                                         //Server.playerHandler.players[i].playerLevel[3] -= damage;
  2012.                                         Server.playerHandler.players[i].dealDamage(damage);
  2013.                                         Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  2014.                                         c.totalPlayerDamageDealt += damage;
  2015.                                         Server.npcHandler.npcs[i].hitUpdateRequired = true;
  2016.                                         if (!c.magicFailed) {
  2017.                                                 //Server.playerHandler.players[i].setHitDiff(damage);
  2018.                                                 //Server.playerHandler.players[i].setHitUpdateRequired(true);
  2019.                                                 Server.playerHandler.players[i].handleHitMask(damage);
  2020.                                                 Server.playerHandler.players[i].CIcon = 2;
  2021.                                         }
  2022.                                 }
  2023.                                 applySmite(i, damage);
  2024.                                 c.killedBy = Server.playerHandler.players[i].playerId; 
  2025.                                 o.getPA().refreshSkill(3);
  2026.                                 Server.playerHandler.players[i].updateRequired = true;
  2027.                                 c.usingMagic = false;
  2028.                                 c.castingMagic = false;
  2029.                                 if (o.inMulti() && multis()) {
  2030.                                         c.barrageCount = 0;
  2031.                                         for (int j = 0; j < Server.playerHandler.players.length; j++) {
  2032.                                                 if (Server.playerHandler.players[j] != null) {
  2033.                                                         if (j == o.playerId)
  2034.                                                                 continue;
  2035.                                                         if (c.barrageCount >= 9)
  2036.                                                                 break;
  2037.                                                         if (o.goodDistance(o.getX(), o.getY(), Server.playerHandler.players[j].getX(), Server.playerHandler.players[j].getY(), 1))
  2038.                                                                 appendMultiBarrage(j, c.magicFailed);
  2039.                                                 }      
  2040.                                         }
  2041.                                 }
  2042.                                 c.getPA().refreshSkill(3);
  2043.                                 c.getPA().refreshSkill(6);
  2044.                                 c.oldSpellId = 0;
  2045.                         }
  2046.                 }      
  2047.                 c.getPA().requestUpdates();
  2048.                 int oldindex = c.oldPlayerIndex;
  2049.                 if(c.bowSpecShot <= 0) {
  2050.                         c.oldPlayerIndex = 0;  
  2051.                         c.projectileStage = 0;
  2052.                         c.lastWeaponUsed = 0;
  2053.                         c.doubleHit = false;
  2054.                         c.bowSpecShot = 0;
  2055.                 }
  2056.                 if(c.bowSpecShot != 0) {
  2057.                         c.bowSpecShot = 0;
  2058.                 }
  2059.         }
  2060.  
  2061.         public int getWeaponDistance(String weaponName) {
  2062.                 if(c.usingMagic) {
  2063.                         return 10;
  2064.                 }
  2065.                
  2066.                 if(weaponName.contains("knife")){
  2067.                         if(c.fightMode == 3) {
  2068.                                 return 6;
  2069.                         } else {
  2070.                                 return 4;
  2071.                         }
  2072.                 }
  2073.                 if(weaponName.contains("dart")) {
  2074.                         if(c.fightMode == 3) {
  2075.                                 return 5;
  2076.                         } else {
  2077.                                 return 3;
  2078.                         }
  2079.                 }
  2080.                 if(weaponName.contains("thrownaxe") || c.playerEquipment[c.playerWeapon] == 13883){
  2081.                         if(c.fightMode == 3) {
  2082.                                 return 6;
  2083.                         } else {
  2084.                                 return 4;
  2085.                         }
  2086.                 }
  2087.                 if(weaponName.contains("javelin") || c.playerEquipment[c.playerWeapon] == 13879){
  2088.                         if(c.fightMode == 3) {
  2089.                                 return 7;
  2090.                         } else {
  2091.                                 return 5;
  2092.                         }
  2093.                 }
  2094.                
  2095.                 if(weaponName.contains("shortbow")){
  2096.                         if(c.fightMode == 3) {
  2097.                                 return 9;
  2098.                         } else {
  2099.                                 return 7;
  2100.                         }
  2101.                 }
  2102.                
  2103.                 if(weaponName.contains("crossbow")){
  2104.                         if(c.fightMode == 3) {
  2105.                                 return 9;
  2106.                         } else {
  2107.                                 return 7;
  2108.                         }
  2109.                 }
  2110.                
  2111.                 if(weaponName.contains("composite bow")){
  2112.                         if(c.fightMode == 3) {
  2113.                                 return 11;
  2114.                         } else {
  2115.                                 return 10;
  2116.                         }
  2117.                 }
  2118.                
  2119.                 if(weaponName.contains("dark bow")){
  2120.                         if(c.fightMode == 3) {
  2121.                                 return 13;
  2122.                         } else {
  2123.                                 return 12;
  2124.                         }
  2125.                 }
  2126.                
  2127.                 if(weaponName.contains("longbow") ||weaponName.contains("crystal")) {
  2128.                         return 10;
  2129.                 }
  2130.                
  2131.                 if(weaponName.contains("halberd")) {
  2132.                         return 2;
  2133.                 }
  2134.                
  2135.                 switch(c.playerEquipment[c.playerWeapon]) {    
  2136.                         case 6522:
  2137.                         if(c.fightMode == 3) {
  2138.                                 return 6;
  2139.                         } else {
  2140.                                 return 5;
  2141.                         }
  2142.                 }
  2143.                 return 1;
  2144.         }
  2145.        
  2146.         public boolean multis() {
  2147.                 switch (c.MAGIC_SPELLS[c.oldSpellId][0]) {
  2148.                         case 12891:
  2149.                         case 12881:
  2150.                         case 13011:
  2151.                         case 13023:
  2152.                         case 12919: // blood spells
  2153.                         case 12929:
  2154.                         case 12963:
  2155.                         case 12975:
  2156.                         return true;
  2157.                 }
  2158.                 return false;
  2159.        
  2160.         }
  2161. public void appendMultiBarrage(int playerId, boolean splashed) {
  2162.                 if (Server.playerHandler.players[playerId] != null) {
  2163.                         Client c2 = (Client)Server.playerHandler.players[playerId];
  2164.                         if (c2.isDead || c2.respawnTimer > 0)
  2165.                                 return;
  2166.                         if (checkMultiBarrageReqs(playerId)) {
  2167.                                 c.barrageCount++;
  2168.                                 if (Misc.random(mageAtk()) > Misc.random(mageDef()) && !c.magicFailed) {
  2169.                                         if(getEndGfxHeight() == 100){ // end GFX
  2170.                                                 c2.gfx100(c.MAGIC_SPELLS[c.oldSpellId][5]);
  2171.                                         } else {
  2172.                                                 c2.gfx0(c.MAGIC_SPELLS[c.oldSpellId][5]);
  2173.                                         }
  2174.                                         int damage = Misc.random(c.MAGIC_SPELLS[c.oldSpellId][6]);
  2175.                                         if (c2.prayerActive[12] || c2.curseActive[7]) {
  2176.                                                 damage *= (int)(.40);
  2177.                                         }
  2178.                                         if (c2.playerLevel[3] - damage < 0) {
  2179.                                                 damage = c2.playerLevel[3];                                    
  2180.                                         }
  2181.                                         c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE), 6);
  2182.                                         c.getPA().addSkillXP((c.MAGIC_SPELLS[c.oldSpellId][7] + damage*Config.MAGIC_EXP_RATE/3), 3);
  2183.  
  2184.                                         //Server.playerHandler.players[playerId].setHitDiff(damage);
  2185.                                         //Server.playerHandler.players[playerId].setHitUpdateRequired(true);
  2186.                                         Server.playerHandler.players[playerId].handleHitMask(damage);
  2187.                                         //Server.playerHandler.players[playerId].playerLevel[3] -= damage;
  2188.                                         Server.playerHandler.players[playerId].dealDamage(damage);
  2189.                                         Server.playerHandler.players[playerId].damageTaken[c.playerId] += damage;
  2190.                                         c2.getPA().refreshSkill(3);
  2191.                                         c.totalPlayerDamageDealt += damage;
  2192.                                         multiSpellEffect(playerId, damage);
  2193.                                 } else {
  2194.                                         c2.gfx100(85);
  2195.                                 }                      
  2196.                         }              
  2197.                 }      
  2198.         }
  2199.        
  2200.         public void multiSpellEffect(int playerId, int damage) {                                       
  2201.                 switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  2202.                         case 13011:
  2203.                         case 13023:
  2204.                         if(System.currentTimeMillis() - Server.playerHandler.players[playerId].reduceStat > 35000) {
  2205.                                 Server.playerHandler.players[playerId].reduceStat = System.currentTimeMillis();
  2206.                                 Server.playerHandler.players[playerId].playerLevel[0] -= ((Server.playerHandler.players[playerId].getLevelForXP(Server.playerHandler.players[playerId].playerXP[0]) * 10) / 100);
  2207.                         }      
  2208.                         break;
  2209.                         case 12919: // blood spells
  2210.                         case 12929:
  2211.                                 int heal = (int)(damage / 4);
  2212.                                 if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  2213.                                         c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  2214.                                 } else {
  2215.                                         c.playerLevel[3] += heal;
  2216.                                 }
  2217.                                 c.getPA().refreshSkill(3);
  2218.                         break;
  2219.                         case 12891:
  2220.                         case 12881:
  2221.                                 if (Server.playerHandler.players[playerId].freezeTimer < -4) {
  2222.                                         Server.playerHandler.players[playerId].freezeTimer = getFreezeTime();
  2223.                                         Server.playerHandler.players[playerId].stopMovement();
  2224.                                 }
  2225.                         break;
  2226.                 }      
  2227.         }
  2228.  
  2229.         public void applyPlayerClawDamage(int i, int damageMask, int damage){
  2230.                 int PrayerDrain = 0;
  2231.                 Client o = (Client) Server.playerHandler.players[i];
  2232.                 if(o == null) {
  2233.                         return;
  2234.                 }
  2235.  
  2236.                 c.previousDamage = damage;
  2237.                 boolean veracsEffect = false;
  2238.                 boolean guthansEffect = false;
  2239.                 if (c.getPA().fullVeracs()) {
  2240.                         if (Misc.random(4) == 1) {
  2241.                                 veracsEffect = true;                           
  2242.                         }              
  2243.                 }
  2244.                 if (c.getPA().fullGuthans()) {
  2245.                         if (Misc.random(4) == 1) {
  2246.                                 guthansEffect = true;
  2247.                         }              
  2248.                 }
  2249.                 if (damageMask == 1) {
  2250.                         damage = c.delayedDamage;
  2251.                         c.delayedDamage = 0;
  2252.                 } else {
  2253.                         damage = c.delayedDamage2;
  2254.                         c.delayedDamage2 = 0;
  2255.                 }
  2256.                 if(Misc.random(o.getCombat().calculateMeleeDefence()) > Misc.random(calculateMeleeAttack()) && !veracsEffect) {
  2257.                         damage = 0;
  2258.                         c.bonusAttack = 0;
  2259.                 } else if (c.playerEquipment[c.playerWeapon] == 5698 && o.poisonDamage <= 0 && Misc.random(3) == 1) {
  2260.                         c.bonusAttack += damage/3;
  2261.                 } else {
  2262.                         c.bonusAttack += damage/3;
  2263.                 }
  2264.                 if(o.prayerActive[18] || o.curseActive[9] && System.currentTimeMillis() - o.protMeleeDelay > 1500 && !veracsEffect) { // if prayer active reduce damage by 40%
  2265.                                         damage = (int)damage * 60 / 100;
  2266.                                         if (o.playerEquipment[o.playerShield] == 13740 && o.playerLevel[5] >= 1 && damage >= 1) {
  2267.                                         //if (Misc.random(2) == 1) {
  2268.                                         damage = (int)damage * 42 / 100;
  2269.                                         o.playerLevel[5] -= PrayerDrain;
  2270.                                         o.getPA().refreshSkill(5);
  2271.  
  2272.                                         if (o.playerLevel[5] <= 0) {
  2273.                                         o.playerLevel[5] = 0;
  2274.                                         o.getCombat().resetPrayers();
  2275.                                         o.getPA().refreshSkill(5);
  2276.                                         //}
  2277.                                         }
  2278.                                         }
  2279.                                         }
  2280.  
  2281.                                         if (o.playerEquipment[o.playerWeapon] == 15486 && damage >= 1 && o.SolProtect >= 1) {
  2282.                                         damage = (int)damage / 2;
  2283.                                         }
  2284.  
  2285.                                         if (o.playerEquipment[o.playerShield] == 13742 && !o.prayerActive[18] || !o.curseActive[9] && damage >= 1) {
  2286.                                         if(Misc.random(4) == 3) {
  2287.                                         damage = (int)damage * 65 / 100;
  2288.                                         }
  2289.                                         }
  2290.  
  2291.                                         if (o.playerEquipment[o.playerShield] == 13740 && !o.prayerActive[18] || !o.curseActive[9] && o.playerLevel[5] >= 1 && damage >= 1) {
  2292.                                         //if(Misc.random(2) == 1) {
  2293.                                         damage = (int)damage * 70 / 100;
  2294.                                         o.getPA().refreshSkill(5);
  2295.                                         o.playerLevel[5] -= PrayerDrain;
  2296.  
  2297.                                         if (o.playerLevel[5] <= 0) {
  2298.                                         o.playerLevel[5] = 0;
  2299.                                         o.getCombat().resetPrayers();
  2300.                                         o.getPA().refreshSkill(5);
  2301.                                         }
  2302.                                         //}
  2303.                                         }
  2304.                 if (c.maxNextHit) {
  2305.                         damage = calculateMeleeMaxHit();
  2306.                 }
  2307.                 if (damage > 0 && guthansEffect) {
  2308.                         c.playerLevel[3] += damage;
  2309.                         if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]))
  2310.                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  2311.                         c.getPA().refreshSkill(3);
  2312.                         o.gfx0(398);           
  2313.                 }
  2314.                 if (c.ssSpec && damageMask == 2) {
  2315.                         damage = 5 + Misc.random(11);
  2316.                         c.ssSpec = false;
  2317.                 }
  2318.                 if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  2319.                         damage = Server.playerHandler.players[i].playerLevel[3];
  2320.                 }
  2321.                 if (o.vengOn && damage > 0)
  2322.                         appendVengeance(i, damage);
  2323.                 if (damage > 0)
  2324.                                         applyRecoil(damage, i);
  2325.                                         Deflect(damage, i);
  2326.                 switch(c.specEffect) {
  2327.                         case 1: // dragon scimmy special
  2328.                         if(damage > 0) {
  2329.                                 if(o.prayerActive[16] || o.prayerActive[17] || o.prayerActive[18] || o.curseActive[7] || o.curseActive[8] || o.curseActive[9]) {
  2330.                                         o.headIcon = -1;
  2331.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[16], 0);
  2332.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[17], 0);
  2333.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[18], 0);   
  2334.                                         o.getPA().sendFrame36(c.CURSE_GLOW[7], 0);
  2335.                                         o.getPA().sendFrame36(c.CURSE_GLOW[8], 0);
  2336.                                         o.getPA().sendFrame36(c.CURSE_GLOW[9], 0);                                     
  2337.                                 }
  2338.                                 o.sendMessage("You have been injured!");
  2339.                                 o.stopPrayerDelay = System.currentTimeMillis();
  2340.                                 o.prayerActive[16] = false;
  2341.                                 o.prayerActive[17] = false;
  2342.                                 o.prayerActive[18] = false;
  2343.                                 o.curseActive[7] = false;
  2344.                                 o.curseActive[8] = false;
  2345.                                 o.curseActive[9] = false;
  2346.                                 o.getPA().requestUpdates();            
  2347.                         }
  2348.                         break;
  2349.                         case 2:
  2350.                                 if (damage > 0) {
  2351.                                         if (o.freezeTimer <= 0)
  2352.                                                 o.freezeTimer = 30;
  2353.                                         o.gfx0(369);
  2354.                                         o.sendMessage("You have been frozen.");
  2355.                                         o.frozenBy = c.playerId;
  2356.                                         o.stopMovement();
  2357.                                         c.sendMessage("You freeze your enemy.");
  2358.                                 }              
  2359.                         break;
  2360.                         case 3:
  2361.                                 if (damage > 0) {
  2362.                                         o.playerLevel[1] -= damage;
  2363.                                         o.sendMessage("You feel weak.");
  2364.                                         if (o.playerLevel[1] < 1)
  2365.                                                 o.playerLevel[1] = 1;
  2366.                                         o.getPA().refreshSkill(1);
  2367.                                 }
  2368.                         break;
  2369.                         case 4:
  2370.                                 if (damage > 0) {
  2371.                                         if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3]))
  2372.                                                 if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]));
  2373.                                                 else
  2374.                                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  2375.                                         else
  2376.                                                 c.playerLevel[3] += damage;
  2377.                                         c.getPA().refreshSkill(3);
  2378.                                 }
  2379.                         break;
  2380.                         case 5:
  2381.                         c.clawDelay = 2;
  2382.                         break;
  2383.                         case 6:
  2384.                         o.vestaDelay = 12;
  2385.                         break;
  2386.  
  2387.                 }
  2388.                 c.specEffect = 0;
  2389.                 if(c.fightMode == 3) {
  2390.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 0);
  2391.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 1);
  2392.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 2);                             
  2393.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  2394.                         c.getPA().refreshSkill(0);
  2395.                         c.getPA().refreshSkill(1);
  2396.                         c.getPA().refreshSkill(2);
  2397.                         c.getPA().refreshSkill(3);
  2398.                 } else {
  2399.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE), c.fightMode);
  2400.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  2401.                         c.getPA().refreshSkill(c.fightMode);
  2402.                         c.getPA().refreshSkill(3);
  2403.                 }
  2404.                 Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  2405.                 Server.playerHandler.players[i].underAttackBy = c.playerId;
  2406.                 Server.playerHandler.players[i].killerId = c.playerId; 
  2407.                 Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  2408.                 if (c.killedBy != Server.playerHandler.players[i].playerId)
  2409.                         c.totalPlayerDamageDealt = 0;
  2410.                 c.killedBy = Server.playerHandler.players[i].playerId;
  2411.                 applySmite(i, damage);
  2412.                 switch(damageMask) {
  2413.                         case 1:
  2414.                         /*if (!Server.playerHandler.players[i].getHitUpdateRequired()){
  2415.                                 Server.playerHandler.players[i].setHitDiff(damage);
  2416.                                 Server.playerHandler.players[i].setHitUpdateRequired(true);
  2417.                         } else {
  2418.                                 Server.playerHandler.players[i].setHitDiff2(damage);
  2419.                                 Server.playerHandler.players[i].setHitUpdateRequired2(true);                   
  2420.                         }*/
  2421.                         //Server.playerHandler.players[i].playerLevel[3] -= damage;
  2422.                         Server.playerHandler.players[i].dealDamage(damage);
  2423.                         Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  2424.                         c.totalPlayerDamageDealt += damage;
  2425.                         Server.playerHandler.players[i].updateRequired = true;
  2426.                         o.getPA().refreshSkill(3);
  2427.                         break;
  2428.                
  2429.                         case 2:
  2430.                         /*if (!Server.playerHandler.players[i].getHitUpdateRequired2()){
  2431.                                 Server.playerHandler.players[i].setHitDiff2(damage);
  2432.                                 Server.playerHandler.players[i].setHitUpdateRequired2(true);
  2433.                         } else {
  2434.                                 Server.playerHandler.players[i].setHitDiff(damage);
  2435.                                 Server.playerHandler.players[i].setHitUpdateRequired(true);                    
  2436.                         }*/
  2437.                         //Server.playerHandler.players[i].playerLevel[3] -= damage;
  2438.                         Server.playerHandler.players[i].dealDamage(damage);
  2439.                         Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  2440.                         c.totalPlayerDamageDealt += damage;
  2441.                         Server.playerHandler.players[i].updateRequired = true; 
  2442.                         c.doubleHit = false;
  2443.                         o.getPA().refreshSkill(3);
  2444.                         break;                 
  2445.                 }
  2446.                 Server.playerHandler.players[i].handleHitMask(damage);
  2447.                 //Server.npcHandler.npcs[i].CIcon = 0;
  2448.         }
  2449.        
  2450.        
  2451.                 public void applyPlayerMeleeDamage(int i, int damageMask, int damage){
  2452.                 Client o = (Client) Server.playerHandler.players[i];
  2453.                 if(o == null) {
  2454.                         return;
  2455.                 }
  2456.                 damage = 0;
  2457.                
  2458.                 boolean veracsEffect = false;
  2459.                 boolean guthansEffect = false;
  2460.                 if (c.getPA().fullVeracs()) {
  2461.                         if (Misc.random(4) == 1) {
  2462.                                 veracsEffect = true;                           
  2463.                         }              
  2464.                 }
  2465.                 if (c.getPA().fullGuthans()) {
  2466.                         if (Misc.random(4) == 1) {
  2467.                                 guthansEffect = true;
  2468.                         }              
  2469.                 }
  2470.                 if (damageMask == 1) {
  2471.                         damage = c.delayedDamage;
  2472.                         c.delayedDamage = 0;
  2473.                 } else {
  2474.                         damage = c.delayedDamage2;
  2475.                         c.delayedDamage2 = 0;
  2476.                 }
  2477.                 if(Misc.random(o.getCombat().calculateMeleeDefence()) > Misc.random(calculateMeleeAttack()) && !veracsEffect && !c.usingClaws) {
  2478.                         damage = 0;
  2479.                         c.bonusAttack = 0;
  2480.                 } else if (c.playerEquipment[c.playerWeapon] == 5698 && o.poisonDamage <= 0 && Misc.random(3) == 1) {
  2481.                         c.bonusAttack += damage/3;
  2482.                 } else {
  2483.                         c.bonusAttack += damage/3;
  2484.                 }
  2485.                 int PrayerDrain = 0;
  2486.                 if(o.curseActive[9]) {
  2487.                                         o.gfx0(2230);
  2488.                                         o.startAnimation(12573);
  2489.                                 }
  2490.                 if(o.prayerActive[18] || o.curseActive[9] && System.currentTimeMillis() - o.protMeleeDelay > 1500 && !veracsEffect) { // if prayer active reduce damage by 40%
  2491.                                         damage = (int)damage * 40 / 100;
  2492.                                         if (o.playerEquipment[o.playerShield] == 13740 && o.playerLevel[5] >= 1 && damage >= 1) {
  2493.                                         //if (Misc.random(2) == 1) {
  2494.                                         damage = (int)damage * 42 / 100;
  2495.                                         o.playerLevel[5] -= PrayerDrain;
  2496.                                         o.getPA().refreshSkill(5);
  2497.  
  2498.                                         if (o.playerLevel[5] <= 0) {
  2499.                                         o.playerLevel[5] = 0;
  2500.                                         o.getCombat().resetPrayers();
  2501.                                         o.getPA().refreshSkill(5);
  2502.                                         //}
  2503.                                         }
  2504.                                         }
  2505.                                         }
  2506.  
  2507.                                         if (o.playerEquipment[o.playerShield] == 13742 && !o.prayerActive[18] || !o.curseActive[9] && damage >= 1) {
  2508.                                         if(Misc.random(4) == 3) {
  2509.                                         damage = (int)damage * 65 / 100;
  2510.                                         }
  2511.                                         }
  2512.  
  2513.                                         if (o.playerEquipment[o.playerShield] == 13740 && !o.prayerActive[18] || !o.curseActive[9] && o.playerLevel[5] >= 1 && damage >= 1) {
  2514.                                         damage = (int)damage * 70 / 100;
  2515.                                         o.playerLevel[5] -= PrayerDrain;
  2516.                                         o.getPA().refreshSkill(5);
  2517.                                         if (o.playerLevel[5] <= 0) {
  2518.                                         o.playerLevel[5] = 0;
  2519.                                         o.getCombat().resetPrayers();
  2520.                                         o.getPA().refreshSkill(5);
  2521.                                         }
  2522.                                         }
  2523.  
  2524.                                         if (o.playerEquipment[o.playerWeapon] == 15486 && damage >= 1 && o.SolProtect >= 1) {
  2525.                                         damage = (int)damage / 2;
  2526.                                         }
  2527.  
  2528.                 if (c.maxNextHit) {
  2529.                         damage = calculateMeleeMaxHit();
  2530.                 }
  2531.                 if (damage > 0 && guthansEffect) {
  2532.                         c.playerLevel[3] += damage;
  2533.                         if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]))
  2534.                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  2535.                         c.getPA().refreshSkill(3);
  2536.                         o.gfx0(398);           
  2537.                 }
  2538.                 if (c.ssSpec && damageMask == 2) {
  2539.                         damage = 5 + Misc.random(11);
  2540.                         c.ssSpec = false;
  2541.                 }
  2542.                 if (Server.playerHandler.players[i].playerLevel[3] - damage < 0) {
  2543.                         damage = Server.playerHandler.players[i].playerLevel[3];
  2544.                 }
  2545.                 if (o.vengOn && damage > 0)
  2546.                         appendVengeance(i, damage);
  2547.                 if (damage > 0)
  2548.                                                 applyRecoil(damage, i);
  2549.                                         Deflect(damage, i);
  2550.                 switch(c.specEffect) {
  2551.                         case 5:
  2552.                         c.clawDelay = 2;
  2553.                         break;
  2554.                         case 1: // dragon scimmy special
  2555.                         if(damage > 0) {
  2556.                                 if(o.prayerActive[16] || o.prayerActive[17] || o.prayerActive[18] || o.curseActive[7] || o.curseActive[8] || o.curseActive[9]) {
  2557.                                         o.headIcon = -1;
  2558.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[16], 0);
  2559.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[17], 0);
  2560.                                         o.getPA().sendFrame36(c.PRAYER_GLOW[18], 0);   
  2561.                                         o.getPA().sendFrame36(c.CURSE_GLOW[7], 0);
  2562.                                         o.getPA().sendFrame36(c.CURSE_GLOW[8], 0);
  2563.                                         o.getPA().sendFrame36(c.CURSE_GLOW[9], 0);                                     
  2564.                                 }
  2565.                                 o.sendMessage("You have been injured!");
  2566.                                 o.stopPrayerDelay = System.currentTimeMillis();
  2567.                                 o.prayerActive[16] = false;
  2568.                                 o.prayerActive[17] = false;
  2569.                                 o.prayerActive[18] = false;
  2570.                                 o.curseActive[7] = false;
  2571.                                 o.curseActive[8] = false;
  2572.                                 o.curseActive[9] = false;
  2573.                                 o.getPA().requestUpdates();            
  2574.                         }
  2575.                         break;
  2576.                         case 2:
  2577.                                 if (damage > 0) {
  2578.                                         if (o.freezeTimer <= 0)
  2579.                                                 o.freezeTimer = 30;
  2580.                                         o.gfx0(2104);
  2581.                                         o.sendMessage("You have been frozen.");
  2582.                                         o.frozenBy = c.playerId;
  2583.                                         o.stopMovement();
  2584.                                         c.sendMessage("You freeze your enemy.");
  2585.                                 }              
  2586.                         break;
  2587.                         case 3:
  2588.                                 if (damage > 0) {
  2589.                                         o.playerLevel[1] -= damage;
  2590.                                         o.sendMessage("You feel weak.");
  2591.                                         if (o.playerLevel[1] < 1)
  2592.                                                 o.playerLevel[1] = 1;
  2593.                                         o.getPA().refreshSkill(1);
  2594.                                 }
  2595.                         break;
  2596.                         case 4:
  2597.                                 if (damage > 0) {
  2598.                                         if (c.playerLevel[3] + damage > c.getLevelForXP(c.playerXP[3]))
  2599.                                                 if (c.playerLevel[3] > c.getLevelForXP(c.playerXP[3]));
  2600.                                                 else
  2601.                                                 c.playerLevel[3] = c.getLevelForXP(c.playerXP[3]);
  2602.                                         else
  2603.                                                 c.playerLevel[3] += damage;
  2604.                                         c.getPA().refreshSkill(3);
  2605.                                 }
  2606.                         break;
  2607.                 }
  2608.                 c.specEffect = 0;
  2609.                 if(c.fightMode == 3) {
  2610.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 0);
  2611.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 1);
  2612.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 2);                             
  2613.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  2614.                         c.getPA().refreshSkill(0);
  2615.                         c.getPA().refreshSkill(1);
  2616.                         c.getPA().refreshSkill(2);
  2617.                         c.getPA().refreshSkill(3);
  2618.                 } else {
  2619.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE), c.fightMode);
  2620.                         c.getPA().addSkillXP((damage*Config.MELEE_EXP_RATE/3), 3);
  2621.                         c.getPA().refreshSkill(c.fightMode);
  2622.                         c.getPA().refreshSkill(3);
  2623.                 }
  2624.                 Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  2625.                 Server.playerHandler.players[i].underAttackBy = c.playerId;
  2626.                 Server.playerHandler.players[i].killerId = c.playerId; 
  2627.                 Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  2628.                 if (c.killedBy != Server.playerHandler.players[i].playerId)
  2629.                         c.totalPlayerDamageDealt = 0;
  2630.                 c.killedBy = Server.playerHandler.players[i].playerId;
  2631.                 applySmite(i, damage);
  2632.                 switch(damageMask) {
  2633.                         case 1:
  2634.                         /*if (!Server.playerHandler.players[i].getHitUpdateRequired()){
  2635.                                 Server.playerHandler.players[i].setHitDiff(damage);
  2636.                                 Server.playerHandler.players[i].setHitUpdateRequired(true);
  2637.                         } else {
  2638.                                 Server.playerHandler.players[i].setHitDiff2(damage);
  2639.                                 Server.playerHandler.players[i].setHitUpdateRequired2(true);                   
  2640.                         }*/
  2641.                         //Server.playerHandler.players[i].playerLevel[3] -= damage;
  2642.                         Server.playerHandler.players[i].CIcon = 0;
  2643.                         Server.playerHandler.players[i].handleHitMask(damage);
  2644.                         Server.playerHandler.players[i].dealDamage(damage);
  2645.                         Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  2646.                         c.totalPlayerDamageDealt += damage;
  2647.                         Server.playerHandler.players[i].updateRequired = true;
  2648.                         o.getPA().refreshSkill(3);
  2649.                         //Server.npcHandler.npcs[i].CIcon = 0;
  2650.                         break;
  2651.                
  2652.                         case 2:
  2653.                         /*if (!Server.playerHandler.players[i].getHitUpdateRequired2()){
  2654.                                 Server.playerHandler.players[i].setHitDiff2(damage);
  2655.                                 Server.playerHandler.players[i].setHitUpdateRequired2(true);
  2656.                         } else {
  2657.                                 Server.playerHandler.players[i].setHitDiff(damage);
  2658.                                 Server.playerHandler.players[i].setHitUpdateRequired(true);                    
  2659.                         }*/
  2660.                         //Server.playerHandler.players[i].playerLevel[3] -= damage;
  2661.                         Server.playerHandler.players[i].CIcon = 0;
  2662.                                                 Server.playerHandler.players[i].handleHitMask(damage);
  2663.                         Server.playerHandler.players[i].dealDamage(damage);
  2664.                         Server.playerHandler.players[i].damageTaken[c.playerId] += damage;
  2665.                         c.totalPlayerDamageDealt += damage;
  2666.                         Server.playerHandler.players[i].updateRequired = true; 
  2667.                         c.doubleHit = false;
  2668.                         o.getPA().refreshSkill(3);
  2669.                         break;                 
  2670.                 }
  2671.                 c.previousDamage = damage;
  2672.                 //Server.npcHandler.npcs[i].CIcon = 0;
  2673.         }
  2674.        
  2675.         public void applySmite(int index, int damage) {
  2676.                 if (!c.prayerActive[23] && !c.curseActive[18])
  2677.                         return;
  2678.                 if (damage <= 0)
  2679.                         return;
  2680.                 if (Server.playerHandler.players[index] != null) {
  2681.                         Client c2 = (Client)Server.playerHandler.players[index];
  2682.                         if(c.curseActive[18] && !c.prayerActive[23] && c.playerLevel[3] <= 99) {
  2683.                                                 int heal = (int)(damage/5);
  2684.                                                 if(c.playerLevel[3] + heal >= c.getPA().getLevelForXP(c.playerXP[3])) {
  2685.                                                         c.playerLevel[3] = c.getPA().getLevelForXP(c.playerXP[3]);
  2686.                                                 } else {
  2687.                                                         c.playerLevel[3] += heal;
  2688.                                                 }
  2689.                                                 c.getPA().refreshSkill(3);
  2690.                         }
  2691.                         c2.playerLevel[5] -= (int)(damage/4);
  2692.                         if (c2.playerLevel[5] <= 0) {
  2693.                                 c2.playerLevel[5] = 0;
  2694.                                 c2.getCombat().resetPrayers();
  2695.                         }
  2696.                         c2.getPA().refreshSkill(5);
  2697.                 }
  2698.        
  2699.         }
  2700.        
  2701. public void fireProjectilePlayer() {
  2702.                 if(c.oldPlayerIndex > 0) {
  2703.                         if(Server.playerHandler.players[c.oldPlayerIndex] != null) {
  2704.                                 c.projectileStage = 2;
  2705.                                 int pX = c.getX();
  2706.                                 int pY = c.getY();
  2707.                                 int oX = Server.playerHandler.players[c.oldPlayerIndex].getX();
  2708.                                 int oY = Server.playerHandler.players[c.oldPlayerIndex].getY();
  2709.                                 int offX = (pY - oY)* -1;
  2710.                                 int offY = (pX - oX)* -1;      
  2711.                                 if(c.playerEquipment[c.playerWeapon] == 15241) {
  2712.                                         if(!c.specGfx) {
  2713.                                                 c.gfx0(2138);
  2714.                                         }
  2715.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 55, getRangeProjectileGFX(), 22, 22, c.oldPlayerIndex - 1, getStartDelay(), -1);
  2716.                                         c.specGfx = false;
  2717.                                 } else if (!c.msbSpec)
  2718.                                         c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 43, 31, - c.oldPlayerIndex - 1, getStartDelay());
  2719.                                 else if (c.msbSpec) {
  2720.                                         c.msbSpec = false;
  2721.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 55, getRangeProjectileGFX(), 22, 22, c.oldNpcIndex + 1, getStartDelay(), -1);
  2722.                                 }
  2723.                                 if (usingDbow())
  2724.                                         c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, getProjectileSpeed(), getRangeProjectileGFX(), 60, 31, - c.oldPlayerIndex - 1, getStartDelay(), 35);
  2725.                         }
  2726.                 }
  2727.         }
  2728.         public boolean usingDbow() {
  2729.                 return c.playerEquipment[c.playerWeapon] == 11235;
  2730.         }
  2731.        
  2732.        
  2733.        
  2734.  
  2735.        
  2736.         /**Prayer**/
  2737.                
  2738.         public void activatePrayer(int i) {
  2739.                 if(c.duelRule[7]){
  2740.                         for(int p = 0; p < c.PRAYER.length; p++) { // reset prayer glows
  2741.                                 c.prayerActive[p] = false;
  2742.                                 c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);    
  2743.                         }
  2744.                         c.sendMessage("Prayer has been disabled in this duel!");
  2745.                         return;
  2746.                 }
  2747.                 if(c.inRFD()){
  2748.                         for(int p = 0; p < c.PRAYER.length; p++) { // reset prayer glows
  2749.                                 c.prayerActive[p] = false;
  2750.                                 c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);    
  2751.                         }
  2752.                         c.sendMessage("You cannot use prayer in here!");
  2753.                         return;
  2754.                 }
  2755.                 if (i == 24 && c.getPA().getLevelForXP(c.playerXP[1]) < 70) {
  2756.                         c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  2757.                         c.sendMessage("You need 60 Defence to use Chivarly");
  2758.                         return;
  2759.                 }
  2760.                 if (i == 25 && c.getPA().getLevelForXP(c.playerXP[1]) < 70) {
  2761.                         c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  2762.                         c.sendMessage("You need 70 defence to use Piety");
  2763.                         return;
  2764.                 }
  2765.  
  2766.                 int[] defPray = {0,5,13,24,25};
  2767.                 int[] strPray = {1,6,14,24,25};
  2768.                 int[] atkPray = {2,7,15,24,25};
  2769.                 int[] rangePray = {3,11,19};
  2770.                 int[] magePray = {4,12,20};
  2771.  
  2772.                 if(c.playerLevel[5] > 0 || !Config.PRAYER_POINTS_REQUIRED){
  2773.                         if(c.getPA().getLevelForXP(c.playerXP[5]) >= c.PRAYER_LEVEL_REQUIRED[i] || !Config.PRAYER_LEVEL_REQUIRED) {
  2774.                                 boolean headIcon = false;
  2775.                                 switch(i) {
  2776.                                         case 0:
  2777.                                         case 5:
  2778.                                         case 13:
  2779.                                         if(c.prayerActive[i] == false) {
  2780.                                                 for (int j = 0; j < defPray.length; j++) {
  2781.                                                         if (defPray[j] != i) {
  2782.                                                                 c.prayerActive[defPray[j]] = false;
  2783.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[defPray[j]], 0);
  2784.                                                         }                                                              
  2785.                                                 }
  2786.                                         }
  2787.                                         break;
  2788.                                        
  2789.                                         case 1:
  2790.                                         case 6:
  2791.                                         case 14:
  2792.                                         if(c.prayerActive[i] == false) {
  2793.                                                 for (int j = 0; j < strPray.length; j++) {
  2794.                                                         if (strPray[j] != i) {
  2795.                                                                 c.prayerActive[strPray[j]] = false;
  2796.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  2797.                                                         }                                                              
  2798.                                                 }
  2799.                                                 for (int j = 0; j < rangePray.length; j++) {
  2800.                                                         if (rangePray[j] != i) {
  2801.                                                                 c.prayerActive[rangePray[j]] = false;
  2802.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2803.                                                         }                                                              
  2804.                                                 }
  2805.                                                 for (int j = 0; j < magePray.length; j++) {
  2806.                                                         if (magePray[j] != i) {
  2807.                                                                 c.prayerActive[magePray[j]] = false;
  2808.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2809.                                                         }                                                              
  2810.                                                 }
  2811.                                         }
  2812.                                         break;
  2813.                                        
  2814.                                         case 2:
  2815.                                         case 7:
  2816.                                         case 15:
  2817.                                         if(c.prayerActive[i] == false) {
  2818.                                                 for (int j = 0; j < atkPray.length; j++) {
  2819.                                                         if (atkPray[j] != i) {
  2820.                                                                 c.prayerActive[atkPray[j]] = false;
  2821.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  2822.                                                         }                                                              
  2823.                                                 }
  2824.                                                 for (int j = 0; j < rangePray.length; j++) {
  2825.                                                         if (rangePray[j] != i) {
  2826.                                                                 c.prayerActive[rangePray[j]] = false;
  2827.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2828.                                                         }                                                              
  2829.                                                 }
  2830.                                                 for (int j = 0; j < magePray.length; j++) {
  2831.                                                         if (magePray[j] != i) {
  2832.                                                                 c.prayerActive[magePray[j]] = false;
  2833.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2834.                                                         }                                                              
  2835.                                                 }
  2836.                                         }
  2837.                                         break;
  2838.                                        
  2839.                                         case 3://range prays
  2840.                                         case 11:
  2841.                                         case 19:
  2842.                                         if(c.prayerActive[i] == false) {
  2843.                                                 for (int j = 0; j < atkPray.length; j++) {
  2844.                                                         if (atkPray[j] != i) {
  2845.                                                                 c.prayerActive[atkPray[j]] = false;
  2846.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  2847.                                                         }                                                              
  2848.                                                 }
  2849.                                                 for (int j = 0; j < strPray.length; j++) {
  2850.                                                         if (strPray[j] != i) {
  2851.                                                                 c.prayerActive[strPray[j]] = false;
  2852.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  2853.                                                         }                                                              
  2854.                                                 }
  2855.                                                 for (int j = 0; j < rangePray.length; j++) {
  2856.                                                         if (rangePray[j] != i) {
  2857.                                                                 c.prayerActive[rangePray[j]] = false;
  2858.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2859.                                                         }                                                              
  2860.                                                 }
  2861.                                                 for (int j = 0; j < magePray.length; j++) {
  2862.                                                         if (magePray[j] != i) {
  2863.                                                                 c.prayerActive[magePray[j]] = false;
  2864.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2865.                                                         }                                                              
  2866.                                                 }
  2867.                                         }
  2868.                                         break;
  2869.                                         case 4:
  2870.                                         case 12:
  2871.                                         case 20:
  2872.                                         if(c.prayerActive[i] == false) {
  2873.                                                 for (int j = 0; j < atkPray.length; j++) {
  2874.                                                         if (atkPray[j] != i) {
  2875.                                                                 c.prayerActive[atkPray[j]] = false;
  2876.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  2877.                                                         }                                                              
  2878.                                                 }
  2879.                                                 for (int j = 0; j < strPray.length; j++) {
  2880.                                                         if (strPray[j] != i) {
  2881.                                                                 c.prayerActive[strPray[j]] = false;
  2882.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  2883.                                                         }                                                              
  2884.                                                 }
  2885.                                                 for (int j = 0; j < rangePray.length; j++) {
  2886.                                                         if (rangePray[j] != i) {
  2887.                                                                 c.prayerActive[rangePray[j]] = false;
  2888.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2889.                                                         }                                                              
  2890.                                                 }
  2891.                                                 for (int j = 0; j < magePray.length; j++) {
  2892.                                                         if (magePray[j] != i) {
  2893.                                                                 c.prayerActive[magePray[j]] = false;
  2894.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2895.                                                         }                                                              
  2896.                                                 }
  2897.                                         }
  2898.                                         break;
  2899.                                         case 10:
  2900.                                                 c.lastProtItem = System.currentTimeMillis();
  2901.                                         break;
  2902.                                        
  2903.  
  2904.                                         case 16:                                       
  2905.                                         case 17:
  2906.                                         case 18:
  2907.                                         if(System.currentTimeMillis() - c.stopPrayerDelay < 5000) {
  2908.                                                 c.sendMessage("You have been injured and can't use this prayer!");
  2909.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[16], 0);
  2910.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[17], 0);
  2911.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[18], 0);
  2912.                                                 return;
  2913.                                         }
  2914.                                         if (i == 16)
  2915.                                                 c.protMageDelay = System.currentTimeMillis();
  2916.                                         else if (i == 17)
  2917.                                                 c.protRangeDelay = System.currentTimeMillis();
  2918.                                         else if (i == 18)
  2919.                                                 c.protMeleeDelay = System.currentTimeMillis();
  2920.                                         case 21:
  2921.                                         case 22:
  2922.                                         case 23:
  2923.                                         headIcon = true;               
  2924.                                         for(int p = 16; p < 24; p++) {
  2925.                                                 if(i != p && p != 19 && p != 20) {
  2926.                                                         c.prayerActive[p] = false;
  2927.                                                         c.getPA().sendFrame36(c.PRAYER_GLOW[p], 0);
  2928.                                                 }
  2929.                                         }
  2930.                                         break;
  2931.                                         case 24:
  2932.                                         if (c.prayerActive[i] == false) {
  2933.  
  2934.                                                 for (int j = 0; j < atkPray.length; j++) {
  2935.                                                         if (atkPray[j] != i) {
  2936.                                                                 c.prayerActive[atkPray[j]] = false;
  2937.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  2938.                                                         }                                                              
  2939.                                                 }
  2940.                                                 for (int j = 0; j < strPray.length; j++) {
  2941.                                                         if (strPray[j] != i) {
  2942.                                                                 c.prayerActive[strPray[j]] = false;
  2943.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  2944.                                                         }                                                              
  2945.                                                 }
  2946.                                                 for (int j = 0; j < rangePray.length; j++) {
  2947.                                                         if (rangePray[j] != i) {
  2948.                                                                 c.prayerActive[rangePray[j]] = false;
  2949.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2950.                                                         }                                                              
  2951.                                                 }
  2952.                                                 for (int j = 0; j < magePray.length; j++) {
  2953.                                                         if (magePray[j] != i) {
  2954.                                                                 c.prayerActive[magePray[j]] = false;
  2955.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2956.                                                         }                                                              
  2957.                                                 }
  2958.                                                 for (int j = 0; j < defPray.length; j++) {
  2959.                                                         if (defPray[j] != i) {
  2960.                                                                 c.prayerActive[defPray[j]] = false;
  2961.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[defPray[j]], 0);
  2962.                                                         }                                                              
  2963.                                                 }
  2964.                                         }
  2965.                                         break;
  2966.                                         case 25:
  2967.  
  2968.                                         if (c.prayerActive[i] == false) {
  2969.  
  2970.                                                 for (int j = 0; j < atkPray.length; j++) {
  2971.                                                         if (atkPray[j] != i) {
  2972.                                                                 c.prayerActive[atkPray[j]] = false;
  2973.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[atkPray[j]], 0);
  2974.                                                         }                                                              
  2975.                                                 }
  2976.                                                 for (int j = 0; j < strPray.length; j++) {
  2977.                                                         if (strPray[j] != i) {
  2978.                                                                 c.prayerActive[strPray[j]] = false;
  2979.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[strPray[j]], 0);
  2980.                                                         }                                                              
  2981.                                                 }
  2982.                                                 for (int j = 0; j < rangePray.length; j++) {
  2983.                                                         if (rangePray[j] != i) {
  2984.                                                                 c.prayerActive[rangePray[j]] = false;
  2985.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[rangePray[j]], 0);
  2986.                                                         }                                                              
  2987.                                                 }
  2988.                                                 for (int j = 0; j < magePray.length; j++) {
  2989.                                                         if (magePray[j] != i) {
  2990.                                                                 c.prayerActive[magePray[j]] = false;
  2991.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[magePray[j]], 0);
  2992.                                                         }                                                              
  2993.                                                 }
  2994.                                                 for (int j = 0; j < defPray.length; j++) {
  2995.                                                         if (defPray[j] != i) {
  2996.                                                                 c.prayerActive[defPray[j]] = false;
  2997.                                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[defPray[j]], 0);
  2998.                                                         }                                                              
  2999.                                                 }
  3000.                                         }
  3001.                                         break;
  3002.                                 }
  3003.                                
  3004.                                 if(!headIcon) {
  3005.                                         if(c.prayerActive[i] == false) {
  3006.                                                 c.prayerActive[i] = true;
  3007.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[i], 1);                                    
  3008.                                         } else {
  3009.                                                 c.prayerActive[i] = false;
  3010.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  3011.                                         }
  3012.                                 } else {
  3013.                                         if(c.prayerActive[i] == false) {
  3014.                                                 c.prayerActive[i] = true;
  3015.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[i], 1);
  3016.                                                 c.headIcon = c.PRAYER_HEAD_ICONS[i];
  3017.                                                 c.getPA().requestUpdates();
  3018.                                         } else {
  3019.                                                 c.prayerActive[i] = false;
  3020.                                                 c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  3021.                                                 c.headIcon = -1;
  3022.                                                 c.getPA().requestUpdates();
  3023.                                         }
  3024.                                 }
  3025.                         } else {
  3026.                                 c.getPA().sendFrame36(c.PRAYER_GLOW[i],0);
  3027.                                 c.getPA().sendFrame126("You need a @blu@Prayer level of "+c.PRAYER_LEVEL_REQUIRED[i]+" to use "+c.PRAYER_NAME[i]+".", 357);
  3028.                                 c.getPA().sendFrame126("Click here to continue", 358);
  3029.                                 c.getPA().sendFrame164(356);
  3030.                                 c.nextChat = 0;
  3031.                         }
  3032.                 } else {
  3033.                         c.getPA().sendFrame36(c.PRAYER_GLOW[i],0);
  3034.                         c.sendMessage("You have run out of prayer points!");
  3035.                 }      
  3036.                                
  3037.         }
  3038.                
  3039.         /**
  3040.         *Specials
  3041.         **/
  3042.        
  3043.         public void activateSpecial(int weapon, int i){
  3044.                 /*if(Server.npcHandler.npcs[i] == null && c.npcIndex > 0) {
  3045.                         return;
  3046.                 }
  3047.                 if(Server.playerHandler.players[i] == null && c.playerIndex > 0) {
  3048.                         return;
  3049.                 }*/
  3050.                 c.doubleHit = false;
  3051.                 c.specEffect = 0;
  3052.                 c.projectileStage = 0;
  3053.                 c.specMaxHitIncrease = 2;
  3054.                 if(c.npcIndex > 0) {
  3055.                         c.oldNpcIndex = i;
  3056.                 } else if (c.playerIndex > 0){
  3057.                         c.oldPlayerIndex = i;
  3058.                         Server.playerHandler.players[i].underAttackBy = c.playerId;
  3059.                         Server.playerHandler.players[i].logoutDelay = System.currentTimeMillis();
  3060.                         Server.playerHandler.players[i].singleCombatDelay = System.currentTimeMillis();
  3061.                         Server.playerHandler.players[i].killerId = c.playerId;
  3062.                 }
  3063.                 switch(weapon) {
  3064.                                         case 15241: // hand cannon spec!!
  3065. c.usingBow = true;
  3066. c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  3067. c.getItems().deleteArrow();    
  3068. c.lastWeaponUsed = weapon;
  3069. c.startAnimation(12175);
  3070. c.specAccuracy = 5.0;
  3071. c.specDamage = 1.20;
  3072. c.hitDelay = 5;
  3073. c.attackTimer-= 7;
  3074. c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3075. if (c.fightMode == 2)
  3076. if (c.playerIndex > 0)
  3077. fireProjectilePlayer();
  3078. else if (c.npcIndex > 0)
  3079. fireProjectileNpc();
  3080. break;
  3081.                         case 1305: // dragon long
  3082.                         c.gfx100(248);
  3083.                         c.startAnimation(1058);
  3084.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3085.                         c.specAccuracy = 1.90;
  3086.                         c.specDamage = 1.50;
  3087.                         break;
  3088.                        
  3089.                         case 1215: // dragon daggers
  3090.                         case 1231:
  3091.                         case 5680:
  3092.                         case 5698:
  3093.                         c.gfx100(252);
  3094.                         c.startAnimation(1062);
  3095.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3096.                         c.doubleHit = true;
  3097.                         c.specAccuracy = 1.50;
  3098.                         c.specDamage = 1.16;
  3099.                         break;
  3100.  
  3101.                         case 14484:
  3102.                         c.gfx0(1950);
  3103.                         c.startAnimation(10961);
  3104.                         c.specAccuracy = 9.9;
  3105.                         c.clawDamage = 0;
  3106.                         c.specDamage = 1.10;
  3107.  
  3108.                           if (c.playerIndex > 0) {
  3109.                 Client o = (Client) Server.playerHandler.players[c.playerIndex];
  3110.                 if (Misc.random(calculateMeleeAttack()) > Misc.random(o.getCombat().calculateMeleeDefence())) {
  3111.                         c.clawDamage = Misc.random(calculateMeleeMaxHit() + 5);
  3112.                                 } else {
  3113.                                         c.clawDamage = Misc.random(calculateMeleeMaxHit() + 5);
  3114.                 }
  3115.                 c.clawIndex = c.playerIndex;
  3116.                 c.clawType = 1;
  3117.             } else if (c.npcIndex > 0) {
  3118.                 NPC n = Server.npcHandler.npcs[c.npcIndex];
  3119.                 if (Misc.random(calculateMeleeAttack()) > Misc.random(n.defence)) {
  3120.                         c.clawDamage = Misc.random(calculateMeleeMaxHit() + Misc.random(6));
  3121.                 } else {
  3122.                                         c.clawDamage = Misc.random(calculateMeleeMaxHit() /2);
  3123.                                 }
  3124.                 c.clawIndex = c.npcIndex;
  3125.                 c.clawType = 2;
  3126.             }
  3127.                        
  3128.                         c.doubleHit = true;
  3129.                         c.usingClaws = true;
  3130.                         c.specEffect = 5;
  3131.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3132.                         break;
  3133.                         case 4151: // whip
  3134.                         case 15441: // whip
  3135.                         case 15442: // whip
  3136.                         case 15443: // whip
  3137.                         case 15444: // whip
  3138.                         if(Server.npcHandler.npcs[i] != null) {
  3139.                                 Server.npcHandler.npcs[i].gfx100(341);
  3140.                         }
  3141.                         c.specAccuracy = 1.10;
  3142.                         c.startAnimation(1658);
  3143.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3144.                         break;
  3145.                        
  3146.                                 case 11694: // ags
  3147.                                 c.startAnimation(7074);
  3148.                                 c.specDamage = 1.70;
  3149.                                 c.specAccuracy = 7.75;
  3150.                                 c.gfx0(1222);
  3151.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3152.                                 break;
  3153.                                
  3154.                                 case 10887: //Anchor
  3155.                                 c.startAnimation(5870);
  3156.                                 c.specDamage = 1.50;
  3157.                                 c.specAccuracy = 6.00;
  3158.                                 c.gfx0(1027);
  3159.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3160.                                 break;
  3161.                                
  3162.                                 case 19780:
  3163.                                 c.gfx100(1224);
  3164.                                 c.startAnimation(10516);
  3165.                                 c.specAccuracy = 9.99;
  3166.                                 c.specDamage = 1.90;
  3167.                                 c.ssSpec = true;
  3168.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3169.                                 break;
  3170.  
  3171.                         case 11730:
  3172.                         c.gfx100(1224);
  3173.                         c.startAnimation(7072);
  3174.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3175.                         c.doubleHit = true;
  3176.                         c.ssSpec = true;
  3177.                         c.specAccuracy = 3.50;
  3178.                         c.specDamage = 1.50;
  3179.                         break;
  3180.  
  3181.                                 case 13905: // Vesta spear
  3182.                                 c.startAnimation(10499);
  3183.                                 c.gfx0(1835);
  3184.                                 c.specAccuracy = 1.25;
  3185.                                 c.specEffect = 6;
  3186.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3187.                                 break;
  3188.                                
  3189.                                 case 13907: // Vesta spear (deg)
  3190.                                 c.startAnimation(10499);
  3191.                                 c.gfx0(1835);
  3192.                                 c.specAccuracy = 1.25;
  3193.                                 c.specEffect = 6;
  3194.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3195.                                 break;
  3196.  
  3197.                                 case 13899: // Vesta LongSword
  3198.                                 c.startAnimation(10502);
  3199.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+1);
  3200.                                 c.specDamage = 1.35;
  3201.                                 c.specAccuracy = 2.00;
  3202.                                 break;
  3203.                                
  3204.                         case 13901: // Vesta LongSword (deg)
  3205.                                 c.startAnimation(10502);
  3206.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+1);
  3207.                                 c.specDamage = 1.35;
  3208.                                 c.specAccuracy = 2.00;
  3209.                         break;
  3210.                        
  3211.                                 case 13902: // Statius
  3212.                                 c.startAnimation(10505);
  3213.                                 c.gfx0(1840);
  3214.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+1);
  3215.                                 c.specDamage = 1.35;
  3216.                                 c.specAccuracy = 2.25;
  3217.                                 break;
  3218.                                
  3219.                         case 13904: // Statius warhammer (Deg)
  3220.                                 c.startAnimation(10505);
  3221.                                 c.gfx0(1840);
  3222.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase()+1);
  3223.                                 c.specDamage = 1.35;
  3224.                                 c.specAccuracy = 2.25;
  3225.                         break;
  3226.                        
  3227.                        
  3228.                         case 11700:
  3229.                                 c.startAnimation(7070);        
  3230.                                 c.gfx0(1221);
  3231.                                 if (c.playerIndex > 0) {
  3232.                                 } else {
  3233.                                 Server.npcHandler.npcs[c.npcIndex].gfx0(2104);
  3234.                                 }
  3235.                                 c.specAccuracy = 1.35;
  3236.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3237.                                 c.specEffect = 2;
  3238.                         break;
  3239.                        
  3240.                         case 11696:
  3241.                                 c.startAnimation(7073);
  3242.                                 c.gfx0(1223);
  3243.                                 c.specDamage = 1.30;
  3244.                                 c.specAccuracy = 1.85;
  3245.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3246.                                 c.specEffect = 3;
  3247.                         break;
  3248.                        
  3249.                         case 11698:
  3250.                                 c.startAnimation(7071);
  3251.                                 c.gfx0(1220);
  3252.                                 c.specAccuracy = 2.00;
  3253.                                 c.specDamage = 1.30;
  3254.                                 c.specEffect = 4;
  3255.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3256.                         break;
  3257.                        
  3258.                         case 1249:
  3259.                         case 11716:
  3260.                                 c.startAnimation(1064);
  3261.                                 c.gfx100(253);
  3262.                                 if (c.playerIndex > 0) {
  3263.                                         Client o = (Client)Server.playerHandler.players[i];
  3264.                                         o.getPA().getSpeared(c.absX, c.absY);
  3265.                                 }      
  3266.                         break;
  3267.                        
  3268.                         case 3204: // d hally
  3269.                         c.gfx100(282);
  3270.                         c.startAnimation(1203);
  3271.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3272.                         if(Server.npcHandler.npcs[i] != null && c.npcIndex > 0) {
  3273.                                 if(!c.goodDistance(c.getX(), c.getY(), Server.npcHandler.npcs[i].getX(), Server.npcHandler.npcs[i].getY(), 1)){
  3274.                                         c.doubleHit = true;
  3275.                                 }
  3276.                         }
  3277.                         if(Server.playerHandler.players[i] != null && c.playerIndex > 0) {
  3278.                                 if(!c.goodDistance(c.getX(), c.getY(), Server.playerHandler.players[i].getX(),Server.playerHandler.players[i].getY(), 1)){
  3279.                                         c.doubleHit = true;
  3280.                                         c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  3281.                                 }
  3282.                         }
  3283.                         break;
  3284.                        
  3285.                         case 4153: // maul
  3286.                         c.startAnimation(1667);
  3287.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3288.                         if (c.playerIndex > 0)
  3289.                                 /*gmaulPlayer(i);
  3290.                         else
  3291.                                 gmaulNpc(i);*/
  3292.                         c.gfx100(337);
  3293.                         break;
  3294.                        
  3295.                         case 4587: // dscimmy
  3296.                         c.gfx100(347);
  3297.                         c.specEffect = 1;
  3298.                         c.startAnimation(1872);
  3299.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3300.                         break;
  3301.                        
  3302.                         case 1434: // mace
  3303.                         c.startAnimation(1060);
  3304.                         c.gfx100(251);
  3305.                         c.specMaxHitIncrease = 3;
  3306.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase())+1;
  3307.                         c.specDamage = 1.49;
  3308.                         c.specAccuracy = 1.20;
  3309.                         break;
  3310.                        
  3311.                         case 859: // magic long
  3312.                         c.usingBow = true;
  3313.                         c.bowSpecShot = 3;
  3314.                         c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  3315.                         c.getItems().deleteArrow();    
  3316.                         c.lastWeaponUsed = weapon;
  3317.                         c.startAnimation(426);
  3318.                         c.gfx100(250); 
  3319.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3320.                         c.projectileStage = 1;
  3321.                         if (c.fightMode == 2)
  3322.                                 c.attackTimer--;
  3323.                         break;
  3324.  
  3325.                                 case 13883: // Morrigan Throwing Axe
  3326.                                         c.usingRangeWeapon = true;
  3327.                                 c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  3328.                                 c.getItems().deleteArrow();
  3329.                                 c.lastWeaponUsed = weapon;
  3330.                                 c.startAnimation(10501);
  3331.                                 c.gfx0(1836);
  3332.                                 c.hitDelay = 3;
  3333.                                 c.specAccuracy = 6.10;
  3334.                                 c.specDamage = 4.20;
  3335.                                 c.projectileStage = 1;
  3336.                                 c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3337.         if (c.fightMode == 2)
  3338.                 c.attackTimer--;
  3339.         if (c.playerIndex > 0)
  3340.                 fireProjectilePlayer();
  3341.         else if (c.npcIndex > 0)
  3342.                 fireProjectileNpc();
  3343.         break;
  3344.                                
  3345.                                 case 13879: // Morrigan Javelin
  3346.                                         c.usingRangeWeapon = true;
  3347.                                 c.rangeItemUsed = c.playerEquipment[c.playerWeapon];
  3348.                                 c.getItems().deleteArrow();
  3349.                                 c.lastWeaponUsed = weapon;
  3350.                                 c.startAnimation(10504);
  3351.                                 c.gfx0(1838);
  3352.                                 c.specAccuracy = 6.30;
  3353.                                 c.specDamage = 4.00;
  3354.                                 c.hitDelay = 3;
  3355.                                 c.projectileStage = 1;
  3356.                                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3357.         if (c.fightMode == 2)
  3358.                 c.attackTimer--;
  3359.         if (c.playerIndex > 0)
  3360.                 fireProjectilePlayer();
  3361.         else if (c.npcIndex > 0)
  3362.                 fireProjectileNpc();
  3363.         break;
  3364.                        
  3365.                         case 861: // magic short       
  3366.                         c.usingBow = true;                     
  3367.                         c.bowSpecShot = 1;
  3368.                         c.specAccuracy = 1.60;
  3369.                         c.specDamage = 1.80;
  3370.                         c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  3371.                         c.getItems().deleteArrow();    
  3372.                         c.lastWeaponUsed = weapon;
  3373.                         c.startAnimation(1074);
  3374.                         c.hitDelay = 3;
  3375.                         c.projectileStage = 1;
  3376.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3377.                         if (c.fightMode == 2)
  3378.                                 c.attackTimer--;
  3379.                         if (c.playerIndex > 0)
  3380.                                 fireProjectilePlayer();
  3381.                         else if (c.npcIndex > 0)
  3382.                                 fireProjectileNpc();   
  3383.                         break;
  3384.                        
  3385.                         case 11235: // dark bow
  3386.                         case 15701: // dark bow
  3387.                         case 15702: // dark bow
  3388.                         case 15703: // dark bow
  3389.                         case 15704: // dark bow
  3390.                         c.usingBow = true;
  3391.                         c.dbowSpec = true;
  3392.                         c.rangeItemUsed = c.playerEquipment[c.playerArrows];
  3393.                         c.getItems().deleteArrow();
  3394.                         c.getItems().deleteArrow();
  3395.                         c.lastWeaponUsed = weapon;
  3396.                         c.hitDelay = 3;
  3397.                         c.startAnimation(426);
  3398.                         c.projectileStage = 1;
  3399.                         c.gfx100(getRangeStartGFX());
  3400.                         c.hitDelay = getHitDelay(c.getItems().getItemName(c.playerEquipment[c.playerWeapon]).toLowerCase());
  3401.                         if (c.fightMode == 2)
  3402.                                 c.attackTimer--;
  3403.                         if (c.playerIndex > 0)
  3404.                                 fireProjectilePlayer();
  3405.                         else if (c.npcIndex > 0)
  3406.                                 fireProjectileNpc();
  3407.                         c.specAccuracy = 4.30;
  3408.                         c.specDamage = 1.85;
  3409.                         break;
  3410.                 }
  3411.                 c.delayedDamage = Misc.random(calculateMeleeMaxHit());
  3412.                 c.delayedDamage2 = Misc.random(calculateMeleeMaxHit());
  3413.                 c.usingSpecial = false;
  3414.                 c.getItems().updateSpecialBar();
  3415.         }
  3416.        
  3417.        
  3418.         public boolean checkSpecAmount(int weapon) {
  3419.                 switch(weapon) {
  3420.                         case 1249:
  3421.                         case 1215:
  3422.                         case 1231:
  3423.                         case 5680:
  3424.                         case 5698:
  3425.                         case 1305:
  3426.                         case 1434:
  3427.                         case 13899:
  3428.                         case 13901:
  3429.                         if(c.specAmount >= 2.5) {
  3430.                                 c.specAmount -= 2.5;
  3431.                                 c.getItems().addSpecialBar(weapon);
  3432.                                 return true;
  3433.                         }
  3434.                         return false;
  3435.                        
  3436.  
  3437.                        
  3438.  
  3439.                         case 4151:
  3440.                         case 15441: // whip
  3441.                         case 15442: // whip
  3442.                         case 15443: // whip
  3443.                         case 15444: // whip
  3444.                         case 11694:
  3445.                         case 14484:
  3446.                         case 11698:
  3447.                         case 4153:
  3448.                         case 13902:
  3449.                         case 13904:
  3450.                         case 13905:
  3451.                         case 13907:
  3452.                         case 13883:
  3453.                         case 13879:                    
  3454.                         case 10887:
  3455.                         case 15241:
  3456.                         if(c.specAmount >= 5) {
  3457.                                 c.specAmount -= 5;
  3458.                                 c.getItems().addSpecialBar(weapon);
  3459.                                 return true;
  3460.                         }
  3461.                         return false;
  3462.                        
  3463.                         case 3204:
  3464.                         if(c.specAmount >= 3) {
  3465.                                 c.specAmount -= 3;
  3466.                                 c.getItems().addSpecialBar(weapon);
  3467.                                 return true;
  3468.                         }
  3469.                         return false;
  3470.                        
  3471.                         case 1377:
  3472.                         case 11696:
  3473.                         case 15486:
  3474.                         if(c.specAmount >= 10) {
  3475.                                 c.specAmount -= 10;
  3476.                                 c.getItems().addSpecialBar(weapon);
  3477.                                 return true;
  3478.                         }
  3479.                         return false;
  3480.                         case 4587:
  3481.                         case 859:
  3482.                         case 15701: // dark bow
  3483.                 case 15702: // dark bow
  3484.                 case 15703: // dark bow
  3485.                 case 15704: // dark bow
  3486.                         case 11235:
  3487.                         case 11700:
  3488.                         case 11730:
  3489.                         case 19780:
  3490.                         case 861:
  3491.                         if(c.specAmount >= 5.5) {
  3492.                                 c.specAmount -= 5.5;
  3493.                                 c.getItems().addSpecialBar(weapon);
  3494.                                 return true;
  3495.                         }
  3496.                         return false;
  3497.  
  3498.                        
  3499.                         default:
  3500.                         return true; // incase u want to test a weapon
  3501.                 }
  3502.         }
  3503.        
  3504.         public void resetPlayerAttack() {
  3505.                 c.usingMagic = false;
  3506.                 c.npcIndex = 0;
  3507.                 c.faceUpdate(0);
  3508.                 c.playerIndex = 0;
  3509.                 c.getPA().resetFollow();
  3510.                 //c.sendMessage("Reset attack.");
  3511.         }
  3512.        
  3513.         public int getCombatDifference(int combat1, int combat2) {
  3514.                 if(combat1 > combat2) {
  3515.                         return (combat1 - combat2);
  3516.                 }
  3517.                 if(combat2 > combat1) {
  3518.                         return (combat2 - combat1);
  3519.                 }      
  3520.                 return 0;
  3521.         }
  3522.        
  3523.         /**
  3524.         *Get killer id
  3525.         **/
  3526.        
  3527.         public int getKillerId(int playerId) {
  3528.                 int oldDamage = 0;
  3529.                 int count = 0;
  3530.                 int killerId = 0;
  3531.                 for (int i = 1; i < Config.MAX_PLAYERS; i++) { 
  3532.                         if (Server.playerHandler.players[i] != null) {
  3533.                                 if(Server.playerHandler.players[i].killedBy == playerId) {
  3534.                                         if (Server.playerHandler.players[i].withinDistance(Server.playerHandler.players[playerId])) {
  3535.                                                 if(Server.playerHandler.players[i].totalPlayerDamageDealt > oldDamage) {
  3536.                                                         oldDamage = Server.playerHandler.players[i].totalPlayerDamageDealt;
  3537.                                                         killerId = i;
  3538.                                                 }
  3539.                                         }      
  3540.                                         Server.playerHandler.players[i].totalPlayerDamageDealt = 0;
  3541.                                         Server.playerHandler.players[i].killedBy = 0;
  3542.                                 }      
  3543.                         }
  3544.                 }                              
  3545.                 return killerId;
  3546.         }
  3547.                
  3548.        
  3549.        
  3550.         double[] prayerData = {
  3551.                 1, // Thick Skin.
  3552.                 1, // Burst of Strength.
  3553.                 1, // Clarity of Thought.
  3554.                 1, // Sharp Eye.
  3555.                 1, // Mystic Will.
  3556.                 2, // Rock Skin.
  3557.                 2, // SuperHuman Strength.
  3558.                 2, // Improved Reflexes.
  3559.                 0.4, // Rapid restore.
  3560.                 0.6, // Rapid Heal.
  3561.                 0.6, // Protect Items.
  3562.                 1.5, // Hawk eye.
  3563.                 2, // Mystic Lore.
  3564.                 3, // Steel Skin.
  3565.                 3, // Ultimate Strength.
  3566.                 3, // Incredible Reflexes.
  3567.                 3, // Protect from Magic.
  3568.                 3, // Protect from Missiles.
  3569.                 3, // Protect from Melee.
  3570.                 3, // Eagle Eye.
  3571.                 3, // Mystic Might.
  3572.                 1, // Retribution.
  3573.                 2, // Redemption.
  3574.                 5, // Smite.
  3575.                 6, // Chivalry.
  3576.                 6, // Piety.
  3577.         };
  3578.  
  3579.         double[] curseData = {
  3580.                 0.6, // Protect Item
  3581.                 3, // Sap Warrior
  3582.                 3, // Sap Range
  3583.                 3, // Sap Mage
  3584.                 3, // Sap Spirit
  3585.                 2, // Berserker
  3586.                 3, // Deflect Summoning
  3587.                 3, // Deflect Mage
  3588.                 3, // Deflect Range
  3589.                 3, // Deflect Melee
  3590.                 3, // Leech Attack
  3591.                 3, // Leech Range
  3592.                 3, // Leech Mage
  3593.                 3, // Leech Defence
  3594.                 3, // Leech Strength
  3595.                 3, // Leech Energy
  3596.                 3, // Leech Special
  3597.                 3, // Wrath
  3598.                 5, // Soul Split
  3599.                 6, // Turmoil
  3600.         };
  3601.        
  3602.         public void handlePrayerDrain() {
  3603.                 c.usingPrayer = false;
  3604.                 double toRemove = 0.0;
  3605.                 for (int j = 0; j < prayerData.length; j++) {
  3606.                         if (c.prayerActive[j]) {
  3607.                                 toRemove += prayerData[j]/20;
  3608.                                 c.usingPrayer = true;
  3609.                         }
  3610.                 }
  3611.                 for (int j = 0; j < curseData.length; j++) {
  3612.                         if (c.curseActive[j]) {
  3613.                                 toRemove += curseData[j]/20;
  3614.                                 c.usingPrayer = true;
  3615.                         }
  3616.                 }
  3617.                 if (toRemove > 0) {
  3618.                         toRemove /= (1 + (0.035 * c.playerBonus[11]));         
  3619.                 }
  3620.                 c.prayerPoint -= toRemove;
  3621.                 if (c.prayerPoint <= 0) {
  3622.                         c.prayerPoint = 1.0 + c.prayerPoint;
  3623.                         reducePrayerLevel();
  3624.                 }
  3625.         }
  3626.        
  3627.         public void reducePrayerLevel() {
  3628.                 if(c.playerLevel[5] - 1 > 0) {
  3629.                         c.playerLevel[5] -= 1;
  3630.                 } else {
  3631.                         c.sendMessage("You have run out of prayer points!");
  3632.                         c.playerLevel[5] = 0;
  3633.                         c.getCombat().resetPrayers();
  3634.                         c.prayerId = -1;       
  3635.                 }
  3636.                 c.getPA().refreshSkill(5);
  3637.         }
  3638.        
  3639.         public void resetPrayers() {
  3640.                 for(int i = 0; i < c.prayerActive.length; i++) {
  3641.                         c.prayerActive[i] = false;
  3642.                         c.getPA().sendFrame36(c.PRAYER_GLOW[i], 0);
  3643.                 }
  3644.                 for(int i = 0; i < c.curseActive.length; i++) {
  3645.                         c.curseActive[i] = false;
  3646.                         c.getPA().sendFrame36(c.CURSE_GLOW[i], 0);
  3647.                 }
  3648.                 c.headIcon = -1;
  3649.                 c.getPA().requestUpdates();
  3650.         }
  3651.        
  3652.         /**
  3653.         * Wildy and duel info
  3654.         **/
  3655.        
  3656.         public boolean checkReqs() {
  3657.                 if(Server.playerHandler.players[c.playerIndex] == null) {
  3658.                         return false;
  3659.                 }
  3660.                 if(!Server.playerHandler.players[c.playerIndex].inWild() && !Server.playerHandler.players[c.playerIndex].InDung() && !Server.playerHandler.players[c.playerIndex].inDuelArena() && Server.playerHandler.players[c.playerIndex].safeTimer <= 0) {
  3661.                         c.getShops().openPlayerShop((Client)Server.playerHandler.players[c.playerIndex]);
  3662.                         c.getCombat().resetPlayerAttack();
  3663.                         return false;
  3664.                 }
  3665.                 if (c.playerIndex == c.playerId)
  3666.                         return false;
  3667.                 if (c.inPits && Server.playerHandler.players[c.playerIndex].inPits)
  3668.                         return true;
  3669.                 if(Server.playerHandler.players[c.playerIndex].inDuelArena() && c.duelStatus != 5 && !c.usingMagic) {
  3670.                         if(c.arenas() || c.duelStatus == 5) {
  3671.                                 c.sendMessage("You can't challenge inside the arena!");
  3672.                                 return false;
  3673.                         }
  3674.                         c.getTradeAndDuel().requestDuel(c.playerIndex);
  3675.                         return false;
  3676.                 }
  3677.                 if(c.duelStatus == 5 && Server.playerHandler.players[c.playerIndex].duelStatus == 5) {
  3678.                         if(Server.playerHandler.players[c.playerIndex].duelingWith == c.getId()) {
  3679.                                 return true;
  3680.                         } else {
  3681.                                 c.sendMessage("This isn't your opponent!");
  3682.                                 return false;
  3683.                         }
  3684.                 }
  3685.                 if(!Server.playerHandler.players[c.playerIndex].inWild() && Server.playerHandler.players[c.playerIndex].safeTimer <= 0) {
  3686.                         c.sendMessage("That player is not in the wilderness.");
  3687.                         c.stopMovement();
  3688.                         c.getCombat().resetPlayerAttack();
  3689.                         return false;
  3690.                 }
  3691.                 if(Server.playerHandler.players[c.playerIndex].safeZone()) {
  3692.                         c.sendMessage("This player is currently in a safe zone.");
  3693.                         c.stopMovement();
  3694.                         c.getCombat().resetPlayerAttack();
  3695.                         return false;
  3696.                 }
  3697.  
  3698.                 if(!c.inWild() && c.safeTimer <= 0) {
  3699.                         c.sendMessage("You are not in the wilderness.");
  3700.                         c.stopMovement();
  3701.                         c.getCombat().resetPlayerAttack();
  3702.                         return false;
  3703.                 }
  3704.                 if(c.safeZone()) {
  3705.                         c.sendMessage("You are standing in a safe zone.");
  3706.                         c.stopMovement();
  3707.                         c.getCombat().resetPlayerAttack();
  3708.                         return false;
  3709.                 }
  3710. if(!c.inFunPk()){
  3711.                 if(Config.COMBAT_LEVEL_DIFFERENCE) {
  3712.                         int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[c.playerIndex].combatLevel);
  3713.                         if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[c.playerIndex].wildLevel) {
  3714.                                 c.sendMessage("Your combat level difference is too great to attack that player here.");
  3715.                                 c.stopMovement();
  3716.                                 c.getCombat().resetPlayerAttack();
  3717.                                 return false;
  3718.                         }
  3719.                 }
  3720.                 }
  3721.                
  3722.                 if(Config.SINGLE_AND_MULTI_ZONES) {
  3723.                         if(!Server.playerHandler.players[c.playerIndex].inMulti()) {    // single combat zones
  3724.                                 if(Server.playerHandler.players[c.playerIndex].underAttackBy != c.playerId && Server.playerHandler.players[c.playerIndex].underAttackBy != 0) {
  3725.                                         c.sendMessage("That player is already in combat.");
  3726.                                         c.stopMovement();
  3727.                                         c.getCombat().resetPlayerAttack();
  3728.                                         return false;
  3729.                                 }
  3730.                                 if(Server.playerHandler.players[c.playerIndex].playerId != c.underAttackBy && c.underAttackBy != 0 || c.underAttackBy2 > 0) {
  3731.                                         c.sendMessage("You are already in combat.");
  3732.                                         c.stopMovement();
  3733.                                         c.getCombat().resetPlayerAttack();
  3734.                                         return false;
  3735.                                 }
  3736.                         }
  3737.                 }
  3738.                 return true;
  3739.         }
  3740.        
  3741.         public boolean checkMultiBarrageReqs(int i) {
  3742.                 if(Server.playerHandler.players[i] == null) {
  3743.                         return false;
  3744.                 }
  3745.                 if (i == c.playerId)
  3746.                         return false;
  3747.                 if (c.inPits && Server.playerHandler.players[i].inPits)
  3748.                         return true;
  3749.                 if(!Server.playerHandler.players[i].inWild()) {
  3750.                         return false;
  3751.                 }
  3752.                 if(Config.COMBAT_LEVEL_DIFFERENCE && !c.inFunPk() && !Server.playerHandler.players[i].inFunPk()) {
  3753.                         int combatDif1 = c.getCombat().getCombatDifference(c.combatLevel, Server.playerHandler.players[i].combatLevel);
  3754.                         if(combatDif1 > c.wildLevel || combatDif1 > Server.playerHandler.players[i].wildLevel) {
  3755.                                 c.sendMessage("Your combat level difference is too great to attack that player here.");
  3756.                                 return false;
  3757.                         }
  3758.                 }
  3759.                
  3760.                 if(Config.SINGLE_AND_MULTI_ZONES) {
  3761.                         if(!Server.playerHandler.players[i].inMulti()) {        // single combat zones
  3762.                                 if(Server.playerHandler.players[i].underAttackBy != c.playerId  && Server.playerHandler.players[i].underAttackBy != 0) {
  3763.                                         return false;
  3764.                                 }
  3765.                                 if(Server.playerHandler.players[i].playerId != c.underAttackBy && c.underAttackBy != 0) {
  3766.                                         c.sendMessage("You are already in combat.");
  3767.                                         return false;
  3768.                                 }
  3769.                         }
  3770.                 }
  3771.                 return true;
  3772.         }
  3773.        
  3774.         /**
  3775.         *Weapon stand, walk, run, etc emotes
  3776.         **/
  3777.        
  3778.         public void getPlayerAnimIndex(String weaponName){
  3779.                 c.playerStandIndex = 0x328;
  3780.                 c.playerTurnIndex = 0x337;
  3781.                 c.playerWalkIndex = 0x333;
  3782.                 c.playerTurn180Index = 0x334;
  3783.                 c.playerTurn90CWIndex = 0x335;
  3784.                 c.playerTurn90CCWIndex = 0x336;
  3785.                 c.playerRunIndex = 0x338;
  3786.        
  3787.                 if(weaponName.contains("halberd") || weaponName.contains("guthan")) {
  3788.                         c.playerStandIndex = 809;
  3789.                         c.playerWalkIndex = 1146;
  3790.                         c.playerRunIndex = 1210;
  3791.                         return;
  3792.                 }      
  3793.                 if(weaponName.contains("dharok")) {
  3794.                         c.playerStandIndex = 0x811;
  3795.                         c.playerWalkIndex = 0x67F;
  3796.                         c.playerRunIndex = 0x680;
  3797.                         return;
  3798.                 }
  3799.                 if(weaponName.contains("sled")) {
  3800.                         c.playerStandIndex = 1461;
  3801.                         c.playerWalkIndex = 1468;
  3802.                         c.playerRunIndex = 1467;
  3803.                         c.playerTurn180Index = 1468;
  3804.                         c.playerTurn90CWIndex = 1468;
  3805.                         c.playerTurn90CCWIndex = 1468;
  3806.                         c.playerTurnIndex = 1468;
  3807.                         return;
  3808.                 }      
  3809.                 if(weaponName.contains("ahrim")) {
  3810.                         c.playerStandIndex = 809;
  3811.                         c.playerWalkIndex = 1146;
  3812.                         c.playerRunIndex = 1210;
  3813.                         return;
  3814.                 }
  3815.                 if(weaponName.contains("verac")) {
  3816.                         c.playerStandIndex = 0x328;
  3817.                         c.playerWalkIndex = 0x333;
  3818.                         c.playerRunIndex = 824;
  3819.                         return;
  3820.                 }
  3821.                 if (weaponName.contains("longsword") || weaponName.contains("scimitar") || weaponName.contains("silverlight"))  {
  3822.                         c.playerStandIndex = 12021;
  3823.                         c.playerRunIndex = 12023;
  3824.                         c.playerWalkIndex = 12024;
  3825.                         return;
  3826.                 }
  3827.                 if (weaponName.contains("wand") || weaponName.contains("staff") || weaponName.contains("staff") || weaponName.contains("spear")) {
  3828.                         c.playerStandIndex = 8980;
  3829.                         c.playerRunIndex = 1210;
  3830.                         c.playerWalkIndex = 1146;
  3831.                         return;
  3832.                 }
  3833.                 if(weaponName.contains("karil")) {
  3834.                         c.playerStandIndex = 2074;
  3835.                         c.playerWalkIndex = 2076;
  3836.                         c.playerRunIndex = 2077;
  3837.                         return;
  3838.                 }
  3839.  if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("saradomin sw")) {
  3840.                         c.playerStandIndex = 7047;
  3841.                         c.playerWalkIndex = 7046;
  3842.                         c.playerRunIndex = 7039;
  3843.                         return;
  3844.                 }                                                      
  3845.                 if(weaponName.contains("bow")) {
  3846.                         c.playerStandIndex = 808;
  3847.                         c.playerWalkIndex = 819;
  3848.                         c.playerRunIndex = 824;
  3849.                         return;
  3850.                 }
  3851.  
  3852.                 switch(c.playerEquipment[c.playerWeapon]) {    
  3853.                         case 18349: // rapier chaotic
  3854.                         c.playerStandIndex = 12021;
  3855.                         c.playerWalkIndex = 12024;
  3856.                         c.playerRunIndex = 12023;
  3857.                         break;
  3858.                         case 12844: //Kite
  3859.                         c.playerStandIndex = 8981;
  3860.                         c.playerWalkIndex = 8982;
  3861.                         c.playerRunIndex = 8986;
  3862.                         c.playerTurn180Index = 8983;
  3863.                         c.playerTurn90CWIndex = 8983;
  3864.                         c.playerTurn90CCWIndex = 8983;
  3865.                         break;
  3866.                         case 1419: //Scythe
  3867.                         c.playerStandIndex = 847;
  3868.                         c.playerWalkIndex = 12024;
  3869.                         c.playerRunIndex = 12023;
  3870.                         break;
  3871.                         case 4565:
  3872.                         c.playerStandIndex = 1836;
  3873.                         c.playerTurnIndex = 1836;
  3874.                         c.playerWalkIndex = 1836;
  3875.                         c.playerTurn180Index = 1836;
  3876.                         c.playerTurn90CWIndex = 1836;
  3877.                         c.playerTurn90CCWIndex = 1836;
  3878.                         c.playerRunIndex = 1836;
  3879.                         break;
  3880.                         case 18353: // maul chaotic
  3881.                         c.playerStandIndex = 13217;
  3882.                         c.playerWalkIndex = 13218;
  3883.                         c.playerRunIndex = 13220;
  3884.                         break;
  3885.                         case 16184:
  3886.                         c.playerStandIndex = 13217;
  3887.                         c.playerWalkIndex = 13218;
  3888.                         c.playerRunIndex = 13220;
  3889.                         break;
  3890.                         case 16425:
  3891.                         c.playerStandIndex = 13217;
  3892.                         c.playerWalkIndex = 13218;
  3893.                         c.playerRunIndex = 13220;
  3894.                         break;
  3895.                         case 4151:
  3896.                         case 15441: // whip
  3897.                         case 15442: // whip
  3898.                         case 15443: // whip
  3899.                         case 15444: // whip
  3900.                         c.playerStandIndex = 11973;
  3901.                         c.playerWalkIndex = 11975;
  3902.                         c.playerRunIndex = 1661;
  3903.                         break;
  3904.                         case 15039:
  3905.                         c.playerStandIndex = 12000;
  3906.                         c.playerWalkIndex = 1663;
  3907.                         c.playerRunIndex = 1664;
  3908.                         break;
  3909.                         case 10887:
  3910.                         c.playerStandIndex = 5869;
  3911.                         c.playerWalkIndex = 5867;
  3912.                         c.playerRunIndex = 5868;
  3913.                         break;
  3914.                         case 6528:
  3915.                                 c.playerStandIndex = 0x811;
  3916.                                 c.playerWalkIndex = 2064;
  3917.                                 c.playerRunIndex = 1664;
  3918.                         break;
  3919.                         case 4153:
  3920.                         c.playerStandIndex = 1662;
  3921.                         c.playerWalkIndex = 1663;
  3922.                         c.playerRunIndex = 1664;
  3923.                         break;
  3924.                         case 15241:
  3925.                         c.playerStandIndex = 12155;
  3926.                         c.playerWalkIndex = 12154;
  3927.                         c.playerRunIndex = 12154;
  3928.                         break;
  3929.                         case 11694:
  3930.                         case 11696:
  3931.                         case 11730:
  3932.                         case 11698:
  3933.                         case 11700:
  3934.                         c.playerStandIndex = 4300;
  3935.                         c.playerWalkIndex = 4306;
  3936.                         c.playerRunIndex = 4305;
  3937.                         break;
  3938.                         case 1305:
  3939.                         c.playerStandIndex = 809;
  3940.                         break;
  3941.                 }
  3942.         }
  3943.        
  3944.        
  3945.        
  3946.         /**
  3947.         * Weapon emotes
  3948.         **/
  3949.        
  3950.         public int getWepAnim(String weaponName) {
  3951.                 if(c.playerEquipment[c.playerWeapon] <= 0) {
  3952.                         switch(c.fightMode) {
  3953.                                 case 0:
  3954.                                 return 422;                    
  3955.                                 case 2:
  3956.                                 return 423;                    
  3957.                                 case 1:
  3958.                                 return 451;
  3959.                         }
  3960.                 }
  3961.                 if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe")){
  3962.                         return 806;
  3963.                 }
  3964.                 if(weaponName.contains("halberd")) {
  3965.                         return 440;
  3966.                 }
  3967.                 if(weaponName.startsWith("dragon dagger")) {
  3968.                         return 402;
  3969.                 }      
  3970.                 if(weaponName.endsWith("dagger")) {
  3971.                         return 412;
  3972.                 }              
  3973.                                 if(weaponName.contains("2h sword") || weaponName.contains("godsword") || weaponName.contains("saradomin sword")) {
  3974.                         switch(c.fightMode) {
  3975.                                 case 0:
  3976.                                 return 7041;           
  3977.                                 case 2:
  3978.                                 return 7042;                   
  3979.                                 case 1:
  3980.                                 return 7048;
  3981.                         }      
  3982.                         }      
  3983.                 if(weaponName.contains("scimitar") || weaponName.contains("longsword") || weaponName.contains("korasi's")) {
  3984.                         switch(c.fightMode) {
  3985.                                 case 0:
  3986.                                 return 12029;  
  3987.                                 case 1: // New Scimmi models
  3988.                                 return 12029;          
  3989.                                 case 2:
  3990.                                 return 12029;  
  3991.                                 case 3:
  3992.                                 return 12028;          
  3993.                         }
  3994.                 }
  3995.                 if(weaponName.contains("rapier")) {
  3996.                         switch(c.fightMode) {
  3997.                                 case 0:
  3998.                                 return 386;    
  3999.                                 case 1:
  4000.                                 return 386;            
  4001.                                 case 2:
  4002.                                 return 386;    
  4003.                                 case 3:
  4004.                                 return 386;
  4005.                         }
  4006.                 }
  4007.                 if(weaponName.contains("of light")) {
  4008.                         switch(c.fightMode) {
  4009.                                 case 0:
  4010.                                 return 386;    
  4011.                                 case 1:
  4012.                                 return 386;            
  4013.                                 case 2:
  4014.                                 return 386;    
  4015.                                 case 3:
  4016.                                 return 386;
  4017.                         }
  4018.                 }
  4019.               if(weaponName.contains("dharok")) {
  4020.                    switch(c.fightMode) {
  4021.                           case 0:
  4022.                           return 2067;
  4023.                           case 1:
  4024.                           return 2067;
  4025.                           case 2:
  4026.                           return 2067;
  4027.                           case 3:
  4028.                           return 2066;
  4029.                         }
  4030.                 }
  4031.                 if(weaponName.contains("karil")) {
  4032.                         return 2075;
  4033.                 }
  4034.                 if(weaponName.contains("bow") && !weaponName.contains("'bow")) {
  4035.                         return 426;
  4036.                 }
  4037.                 if (weaponName.contains("'bow"))
  4038.                         return 4230;
  4039.                        
  4040.                 switch(c.playerEquipment[c.playerWeapon]) { // if you don't want to use strings
  4041.                         case 6522:
  4042.                         return 2614;
  4043.                         case 13905:
  4044.                         return 2080;
  4045.                         case 13907:
  4046.                         return 2080;
  4047.                         case 667:
  4048.                         return 382;
  4049.                         case 4153: // granite maul
  4050.                         return 1665;
  4051.                         case 6745:
  4052.                         return 382;
  4053.                         case 4726: // guthan
  4054.                         return 2080;
  4055.                         case 13879:
  4056.                         case 13883:
  4057.                         return 806;
  4058.                         case 1249: //Dspear
  4059.                         case 11716: //Zspear
  4060.                         return 381;
  4061.                         case 747:
  4062.                         return 91;
  4063.                         case 14484: //  Dclaw
  4064.                         return 393;
  4065.                         case 15039: //  Chaotic maul
  4066.                         return 2661;
  4067.                         case 16184:
  4068.                         return 2661;
  4069.                         case 16425:
  4070.                         return 2661;
  4071.                         case 15241:
  4072.                         return 12153;
  4073.                         case 4747: // torag
  4074.                         return 0x814;
  4075.                         case 4710: // ahrim
  4076.                         return 406;
  4077.                         case 18353:
  4078.                         return 13055;
  4079.                         case 18349:
  4080.                         return 386;
  4081.                         case 4755: // verac
  4082.                         return 2062;
  4083.                         case 4734: // karil
  4084.                         return 2075;
  4085.                         case 10887:
  4086.                         return 5865;
  4087.                         case 4151:
  4088.                         case 15441: // whip
  4089.                         case 15442: // whip
  4090.                         case 15443: // whip
  4091.                         case 15444: // whip
  4092.                         return 1658;
  4093.                         case 6528:
  4094.                         return 2661;
  4095.                         default:
  4096.                         return 451;
  4097.                 }
  4098.         }
  4099.        
  4100.         /**
  4101.         * Block emotes
  4102.         */
  4103.         public int getBlockEmote() {
  4104.                 if (c.playerEquipment[c.playerShield] >= 8844 && c.playerEquipment[c.playerShield] <= 8850) {
  4105.                         return 4177;
  4106.                 }
  4107.                 switch(c.playerEquipment[c.playerWeapon]) {
  4108.                
  4109.                         case 19780:
  4110.                         return 12030;
  4111.                        
  4112.                         case 4755:
  4113.                         return 2063;
  4114.                        
  4115.                         case 747:
  4116.                         return 89;
  4117.                        
  4118.                         case 10887:
  4119.                         return 5866;
  4120.  
  4121.                         case 4153:
  4122.                         return 1666;
  4123.                        
  4124.                         case 15241:
  4125.                         return 12156;
  4126.                        
  4127.                         case 15039:
  4128.                         return 12004;
  4129.  
  4130.                         case 18353:
  4131.                         return 13054;
  4132.  
  4133.                         case 18349:
  4134.                         return 13038;
  4135.  
  4136.                         case 4151:
  4137.                         case 15441: // whip
  4138.                         case 15442: // whip
  4139.                         case 15443: // whip
  4140.                         case 15444: // whip
  4141.                         return 11974;
  4142.                        
  4143.                         case 11694:
  4144.                         case 11698:
  4145.                         case 11700: // scimmy anim 12030
  4146.                         case 11696:
  4147.                         case 11730:
  4148.                         case 861:
  4149.                         return -1;
  4150.                         default:
  4151.                         return 404;
  4152.                 }
  4153.         }
  4154.                        
  4155.         /**
  4156.         * Weapon and magic attack speed!
  4157.         **/
  4158.        
  4159.         public int getAttackDelay(String s) {
  4160.                 if(c.usingMagic) {
  4161.                         switch(c.MAGIC_SPELLS[c.spellId][0]) {
  4162.                                 case 12871: // ice blitz
  4163.                                 case 13023: // shadow barrage
  4164.                                 case 12891: // ice barrage
  4165.                                 return 5;
  4166.                                
  4167.                                 default:
  4168.                                 return 5;
  4169.                         }
  4170.                 }
  4171.                 if(c.playerEquipment[c.playerWeapon] == -1)
  4172.                         return 4;//unarmed
  4173.                        
  4174.                 switch (c.playerEquipment[c.playerWeapon]) {
  4175.                         case 11235:
  4176.                         case 15701: // dark bow
  4177.                 case 15702: // dark bow
  4178.                 case 15703: // dark bow
  4179.                 case 15704: // dark bow
  4180.                         return 9;
  4181.                         case 13879:
  4182.                         return 8;
  4183.                         case 6745:
  4184.                         return 4;
  4185.         case 15241: // hand cannon
  4186.                         return 9;
  4187.                         case 15037:
  4188.                         case 11730:
  4189.                         return 4;
  4190.                         case 14484:
  4191.                         return 5;
  4192.                         case 13883:
  4193.                         return 6;
  4194.                         case 10887:
  4195.                         case 6528:
  4196.                         case 15039:
  4197.                         return 7;
  4198.                         case 13905:
  4199.                         return 5;
  4200.                                                 case 13907:
  4201.                                                 return 5;
  4202.                                                 case 18353:
  4203.                                                 return 7;
  4204.                                                 case 18349:
  4205.                                                 return 4;
  4206.                 }
  4207.                
  4208.                 if(s.endsWith("greataxe"))
  4209.                         return 7;
  4210.                 else if(s.equals("torags hammers"))
  4211.                         return 5;
  4212.                 else if(s.equals("guthans warspear"))
  4213.                         return 5;
  4214.                 else if(s.equals("veracs flail"))
  4215.                         return 5;
  4216.                 else if(s.equals("ahrims staff"))
  4217.                         return 6;
  4218.                 else if(s.contains("staff")){
  4219.                         if(s.contains("zamarok") || s.contains("guthix") || s.contains("saradomian") || s.contains("slayer") || s.contains("ancient"))
  4220.                                 return 4;
  4221.                         else
  4222.                                 return 5;
  4223.                 } else if(s.contains("bow")){
  4224.                         if(s.contains("composite") || s.equals("seercull"))
  4225.                                 return 5;
  4226.                         else if (s.contains("aril"))
  4227.                                 return 4;
  4228.                         else if(s.contains("Ogre"))
  4229.                                 return 8;
  4230.                         else if(s.contains("short") || s.contains("hunt") || s.contains("sword"))
  4231.                                 return 4;
  4232.                         else if(s.contains("long") || s.contains("crystal"))
  4233.                                 return 6;
  4234.                         else if(s.contains("'bow"))
  4235.                                 return 7;
  4236.                        
  4237.                         return 5;
  4238.                 }
  4239.                 else if(s.contains("dagger"))
  4240.                         return 4;
  4241.                 else if(s.contains("rapier"))
  4242.                         return 4;
  4243.                 else if(s.contains("godsword") || s.contains("2h"))
  4244.                         return 6;
  4245.                 else if(s.contains("Blurite"))
  4246.                         return 4;
  4247.                 else if(s.contains("longsword"))
  4248.                         return 5;
  4249.                 else if(s.contains("sword"))
  4250.                         return 4;
  4251.                 else if(s.contains("scimitar"))
  4252.                         return 4;
  4253.                 else if(s.contains("mace"))
  4254.                         return 5;
  4255.                 else if(s.contains("battleaxe"))
  4256.                         return 6;
  4257.                 else if(s.contains("pickaxe"))
  4258.                         return 5;
  4259.                 else if(s.contains("thrownaxe"))
  4260.                         return 5;
  4261.                 else if(s.contains("axe"))
  4262.                         return 5;
  4263.                 else if(s.contains("warhammer"))
  4264.                         return 6;
  4265.                 else if(s.contains("2h"))
  4266.                         return 7;
  4267.                 else if(s.contains("spear"))
  4268.                         return 5;
  4269.                 else if(s.contains("claw"))
  4270.                         return 4;
  4271.                 else if(s.contains("halberd"))
  4272.                         return 7;
  4273.                
  4274.                 //sara sword, 2400ms
  4275.                 else if(s.equals("granite maul"))
  4276.                         return 7;
  4277.                 else if(s.equals("toktz-xil-ak"))//sword
  4278.                         return 4;
  4279.                 else if(s.contains("maul"))
  4280.                         return 7;
  4281.                 else if(s.equals("tzhaar-ket-em"))//mace
  4282.                         return 5;
  4283.                 else if(s.equals("tzhaar-ket-om"))//maul
  4284.                         return 7;
  4285.                 else if(s.equals("toktz-xil-ek"))//knife
  4286.                         return 4;
  4287.                 else if(s.equals("toktz-xil-ul"))//rings
  4288.                         return 4;
  4289.                 else if(s.equals("toktz-mej-tal"))//staff
  4290.                         return 6;
  4291.                 else if(s.contains("whip"))
  4292.                         return 4;
  4293.                 else if(s.contains("dart"))
  4294.                         return 3;
  4295.                 else if(s.contains("knife"))
  4296.                         return 3;
  4297.                 else if(s.contains("javelin"))
  4298.                         return 6;
  4299.                 return 5;
  4300.         }
  4301.         /**
  4302.         * How long it takes to hit your enemy
  4303.         **/
  4304.         public int getHitDelay(String weaponName) {
  4305.                 if(c.usingMagic) {
  4306.                         switch(c.MAGIC_SPELLS[c.spellId][0]) {                 
  4307.                                 case 12891:
  4308.                                 return 4;
  4309.                                 case 12871:
  4310.                                 return 6;
  4311.                                 default:
  4312.                                 return 4;
  4313.                         }
  4314.                 } else {
  4315.  
  4316.                         if(weaponName.contains("knife") || weaponName.contains("dart") || weaponName.contains("javelin") || weaponName.contains("thrownaxe") || c.playerEquipment[c.playerWeapon] == 13879 || c.playerEquipment[c.playerWeapon] == 13883){
  4317.                                 return 3;
  4318.                         }
  4319.                         if(weaponName.contains("cross") || weaponName.contains("c'bow")) {
  4320.                                 return 4;
  4321.                         }
  4322.                         if(weaponName.contains("bow") && !c.dbowSpec) {
  4323.                                 return 4;
  4324.                         } else if (c.dbowSpec) {
  4325.                                 return 4;
  4326.                         }
  4327.  
  4328.                         switch(c.playerEquipment[c.playerWeapon]) {    
  4329.                                 case 6522: // Toktz-xil-ul
  4330.                                 return 3;
  4331.                                
  4332.                                
  4333.                                 default:
  4334.                                 return 2;
  4335.                         }
  4336.                 }
  4337.         }
  4338.        
  4339.         public int getRequiredDistance() {
  4340.                 if (c.followId > 0 && c.freezeTimer <= 0 && !c.isMoving)
  4341.                         return 2;
  4342.                 else if(c.followId > 0 && c.freezeTimer <= 0 && c.isMoving) {
  4343.                         return 3;
  4344.                 } else {
  4345.                         return 1;
  4346.                 }
  4347.         }
  4348.        
  4349.         public boolean usingHally() {
  4350.                 switch(c.playerEquipment[c.playerWeapon]) {
  4351.                         case 3190:
  4352.                         case 3192:
  4353.                         case 3194:
  4354.                         case 3196:
  4355.                         case 3198:
  4356.                         case 3200:
  4357.                         case 3202:
  4358.                         case 3204:
  4359.                         return true;
  4360.                        
  4361.                         default:
  4362.                         return false;
  4363.                 }
  4364.         }
  4365.        
  4366.         /**
  4367.         * Melee
  4368.         **/
  4369.        
  4370.         public int calculateMeleeAttack() {
  4371.                 int attackLevel = c.playerLevel[0];
  4372.                 //2, 5, 11, 18, 19
  4373.         if (c.prayerActive[2]) {
  4374.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.05;
  4375.         } else if (c.prayerActive[7]) {
  4376.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  4377.         } else if (c.prayerActive[15]) {
  4378.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15;
  4379.         } else if (c.prayerActive[24]) {
  4380.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.18;
  4381.         } else if (c.prayerActive[25]) {
  4382.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.22;
  4383.         } else if (c.curseActive[19]) { // turmoil
  4384.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.15 + c.getatt;
  4385.         }
  4386.         if (c.fullVoidMelee())
  4387.             attackLevel += c.getLevelForXP(c.playerXP[c.playerAttack]) * 0.1;
  4388.                 attackLevel *= c.specAccuracy;
  4389.                 //c.sendMessage("Attack: " + (attackLevel + (c.playerBonus[bestMeleeAtk()] * 2)));
  4390.         int i = c.playerBonus[bestMeleeAtk()];
  4391.                 i += c.bonusAttack;
  4392.                 if (c.playerEquipment[c.playerAmulet] == 11128 && c.playerEquipment[c.playerWeapon] == 6528) {
  4393.                         i *= 1.30;
  4394.                 }
  4395.                 return (int)(attackLevel + (attackLevel * 0.15) + (i + i * 0.05));
  4396.         }
  4397.         public int bestMeleeAtk()
  4398.     {
  4399.         if(c.playerBonus[0] > c.playerBonus[1] && c.playerBonus[0] > c.playerBonus[2])
  4400.             return 0;
  4401.         if(c.playerBonus[1] > c.playerBonus[0] && c.playerBonus[1] > c.playerBonus[2])
  4402.             return 1;
  4403.         return c.playerBonus[2] <= c.playerBonus[1] || c.playerBonus[2] <= c.playerBonus[0] ? 0 : 2;
  4404.     }
  4405.        
  4406.         public int calculateMeleeMaxHit() {
  4407.                 double maxHit = 0;
  4408.                 int strBonus = c.playerBonus[10];
  4409.                 int strength = c.playerLevel[2];
  4410.                 int defence = c.playerLevel[1];
  4411.                 int attack = c.playerLevel[0];
  4412.                 int range = c.playerLevel[4];
  4413.                 int magic = c.playerLevel[6];
  4414.                 int lvlForXP = c.getLevelForXP(c.playerXP[2]);
  4415.                 if(c.prayerActive[1]) {
  4416.                         strength += (int)(lvlForXP * .05);
  4417.                 } else
  4418.                 if(c.prayerActive[6]) {
  4419.                         strength += (int)(lvlForXP * .10);
  4420.                 } else
  4421.                 if(c.prayerActive[14]) {
  4422.                         strength += (int)(lvlForXP * .15);
  4423.                 } else
  4424.                 if(c.prayerActive[24]) {
  4425.                         strength += (int)(lvlForXP * .18);
  4426.                 } else
  4427.                 if(c.prayerActive[25]) {
  4428.                         strength += (int)(lvlForXP * .23);
  4429.                 }
  4430.                 if(c.curseActive[19]) { // turmoil
  4431.                         strength += (int)(lvlForXP * .15 + c.getstr);
  4432.                 }
  4433.                 if(c.playerEquipment[c.playerHat] == 2526 && c.playerEquipment[c.playerChest] == 2520 && c.playerEquipment[c.playerLegs] == 2522) {    
  4434.                         maxHit += (maxHit * 10 / 100);
  4435.                 }
  4436.                 maxHit += 1.05D + (double)(strBonus * strength) * 0.00175D;
  4437.                 maxHit += (double)strength * 0.11D;
  4438.                
  4439.                 if (c.playerEquipment[c.playerWeapon] == 4718 && c.playerEquipment[c.playerHat] == 4716 && c.playerEquipment[c.playerChest] == 4720 && c.playerEquipment[c.playerLegs] == 4722) {      
  4440.                                 maxHit += (c.getPA().getLevelForXP(c.playerXP[3]) - c.playerLevel[3]) / 2;                     
  4441.                 }
  4442.                
  4443.                 if (c.specDamage > 1)
  4444.                         maxHit = (int)(maxHit * c.specDamage);
  4445.                
  4446.                 if (maxHit < 0)
  4447.                         maxHit = 1;
  4448.                
  4449.                 if (c.playerEquipment[c.playerAmulet] == 11128
  4450.                 && c.playerEquipment[c.playerWeapon] == 6528)
  4451.                 {
  4452.                        
  4453.                         maxHit *= 1.20;
  4454.                
  4455.                 }
  4456.                 return (int)Math.floor(maxHit);
  4457.        
  4458.         }
  4459.        
  4460.  
  4461.                 public int calculateMeleeDefence()
  4462.     {
  4463.         int defenceLevel = c.playerLevel[1];
  4464.                 int i = c.playerBonus[bestMeleeDef()];
  4465.         if (c.prayerActive[0]) {
  4466.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  4467.         } else if (c.prayerActive[5]) {
  4468.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  4469.         } else if (c.prayerActive[13]) {
  4470.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  4471.         } else if (c.prayerActive[24]) {
  4472.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  4473.         } else if (c.prayerActive[25]) {
  4474.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  4475.         }
  4476.         return (int)(defenceLevel + (defenceLevel * 0.15) + (i + i * 0.05));
  4477.     }
  4478.        
  4479.         public int bestMeleeDef()
  4480.     {
  4481.         if(c.playerBonus[5] > c.playerBonus[6] && c.playerBonus[5] > c.playerBonus[7])
  4482.             return 5;
  4483.         if(c.playerBonus[6] > c.playerBonus[5] && c.playerBonus[6] > c.playerBonus[7])
  4484.             return 6;
  4485.         return c.playerBonus[7] <= c.playerBonus[5] || c.playerBonus[7] <= c.playerBonus[6] ? 5 : 7;
  4486.     }
  4487.  
  4488.  
  4489.         /**
  4490.         * Range
  4491.         **/
  4492.        
  4493.         public int calculateRangeAttack() {
  4494.                 int attackLevel = c.playerLevel[4];
  4495.                 attackLevel *= c.specAccuracy;
  4496.         if (c.fullVoidRange())
  4497.             attackLevel += c.getLevelForXP(c.playerXP[c.playerRanged]) * 0.1;
  4498.                 if (c.prayerActive[3])
  4499.                         attackLevel *= 1.05;
  4500.                 else if (c.prayerActive[11])
  4501.                         attackLevel *= 1.10;
  4502.                 else if (c.prayerActive[19])
  4503.                         attackLevel *= 1.15;
  4504.                 //dbow spec
  4505.                 if (c.fullVoidRange() && c.specAccuracy > 1.15) {
  4506.                         attackLevel *= 1.75;           
  4507.                 }
  4508.         return (int) (attackLevel + (c.playerBonus[4] * 1.95));
  4509.         }
  4510.        
  4511.         public int calculateRangeDefence() {
  4512.                 int defenceLevel = c.playerLevel[1];
  4513.         if (c.prayerActive[0]) {
  4514.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  4515.         } else if (c.prayerActive[5]) {
  4516.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  4517.         } else if (c.prayerActive[13]) {
  4518.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  4519.         } else if (c.prayerActive[24]) {
  4520.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  4521.         } else if (c.prayerActive[25]) {
  4522.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  4523.         } else if (c.curseActive[19]) { // turmoil
  4524.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15 + c.getdef;
  4525.         }
  4526.         return (int) (defenceLevel + c.playerBonus[9] + (c.playerBonus[9] / 2));
  4527.         }
  4528.        
  4529.         public boolean usingBolts() {
  4530.                 return c.playerEquipment[c.playerArrows] >= 9130 && c.playerEquipment[c.playerArrows] <= 9145 || c.playerEquipment[c.playerArrows] >= 9230 && c.playerEquipment[c.playerArrows] <= 9245;
  4531.         }
  4532.         /*public int rangeMaxHit() {
  4533.                 int rangeLevel = c.playerLevel[4];
  4534.                 double modifier = 1.0;
  4535.                 double wtf = c.specDamage;
  4536.                 int itemUsed = c.usingBow ? c.lastArrowUsed : c.lastWeaponUsed;
  4537.                 if (c.prayerActive[3])
  4538.                         modifier += 0.05;
  4539.                 else if (c.prayerActive[11])
  4540.                         modifier += 0.10;
  4541.                 else if (c.prayerActive[19])
  4542.                         modifier += 0.15;
  4543.                 if (c.fullVoidRange())
  4544.                         modifier += 0.20;
  4545.                 double c = modifier * rangeLevel;
  4546.                 int rangeStr = getRangeStr(itemUsed);
  4547.                 double max =(c + 8) * (rangeStr + 64) / 640;
  4548.                 if (wtf != 1)
  4549.                         max *= wtf;
  4550.                 if (max < 1)
  4551.                         max = 1;
  4552.                 return (int)max;
  4553.         }*/
  4554.        
  4555.         public int getRangeStr(int i) {
  4556.                 if (i == 4212)
  4557.                         return 175;
  4558.                 switch (i) {
  4559.                         //bronze to rune bolts
  4560.                         case 877://bronze bolts
  4561.                         return 10;
  4562.                         case 9140://iron bolts
  4563.                         return 46;
  4564.                         case 9141://steel bolts
  4565.                         return 64;
  4566.                         case 9142://mith bolts
  4567.                         return 82;
  4568.                         case 9241://emerald bolts e
  4569.                         return 85;
  4570.                         case 9240://saphhire bolts e
  4571.                         return 83;
  4572.                         case 9143://addy bolts
  4573.                         return 100;
  4574.                         case 9243://diamond bolts e
  4575.                         return 105;
  4576.                         case 9242://ruby bolts e
  4577.                         return 103;
  4578.                         case 9144://rune bolts
  4579.                         return 115;
  4580.                         case 9244://dragon bolts e
  4581.                         return 117;
  4582.                         case 13879:
  4583.                         return 150;
  4584.                         case 13883:
  4585.                         return 130;
  4586.                         case 882:
  4587.                         return 7;
  4588.                         case 884:
  4589.                         return 10;
  4590.                         case 886:
  4591.                         return 16;
  4592.                         case 888:
  4593.                         return 22;
  4594.                         case 890:
  4595.                         return 31;
  4596.                         case 892:
  4597.                         case 4740:
  4598.                         return 35;
  4599.                         case 11212:
  4600.                         return 70;
  4601.                         //knifes
  4602.                         case 864:
  4603.                         return 3;
  4604.                         case 863:
  4605.                         return 4;
  4606.                         case 865:
  4607.                         return 7;
  4608.                         case 866:
  4609.                         return 10;
  4610.                         case 867:
  4611.                         return 14;
  4612.                         case 868:
  4613.                         return 24;
  4614.                 }
  4615.                 return 0;
  4616.         }
  4617.        
  4618.         public int rangeMaxHit() {
  4619.         int rangehit = 0;
  4620.         rangehit += c.playerLevel[4] / 7.5;
  4621.         int weapon = c.lastWeaponUsed;
  4622.         int Arrows = c.lastArrowUsed;
  4623.         if (weapon == 4223) {//Cbow 1/10
  4624.             rangehit = 2;
  4625.             rangehit += c.playerLevel[4] / 7;
  4626.         } else if (weapon == 4222) {//Cbow 2/10
  4627.             rangehit = 3;
  4628.             rangehit += c.playerLevel[4] / 7;
  4629.         } else if (weapon == 4221) {//Cbow 3/10
  4630.             rangehit = 3;
  4631.             rangehit += c.playerLevel[4] / 6.5;
  4632.         } else if (weapon == 4220) {//Cbow 4/10
  4633.             rangehit = 4;
  4634.             rangehit += c.playerLevel[4] / 6.5;
  4635.         } else if (weapon == 4219) {//Cbow 5/10
  4636.             rangehit = 4;
  4637.             rangehit += c.playerLevel[4] / 6;
  4638.         } else if (weapon == 4218) {//Cbow 6/10
  4639.             rangehit = 5;
  4640.             rangehit += c.playerLevel[4] / 6;
  4641.         } else if (weapon == 4217) {//Cbow 7/10
  4642.             rangehit = 5;
  4643.             rangehit += c.playerLevel[4] / 5.5;
  4644.         } else if (weapon == 4216) {//Cbow 8/10
  4645.             rangehit = 6;
  4646.             rangehit += c.playerLevel[4] / 5.5;
  4647.         } else if (weapon == 4215) {//Cbow 9/10
  4648.             rangehit = 6;
  4649.             rangehit += c.playerLevel[4] / 5;
  4650.         } else if (weapon == 4212) {//Cbow New
  4651.             rangehit = 7;
  4652.             rangehit += c.playerLevel[4] / 5;
  4653.         } else if (weapon == 6522) {
  4654.             rangehit = 5;
  4655.             rangehit += c.playerLevel[4] / 6;
  4656.         } else if (weapon == 9029) {//dragon darts
  4657.             rangehit = 8;
  4658.             rangehit += c.playerLevel[4] / 10;
  4659.         } else if (weapon == 811 || weapon == 868) {//rune darts
  4660.             rangehit = 2;
  4661.             rangehit += c.playerLevel[4] / 8.5;
  4662.         } else if (weapon == 13879) {
  4663.             rangehit = 10;
  4664.             rangehit += c.playerLevel[4] / 17;
  4665.         } else if (weapon == 13883) {
  4666.             rangehit = 7;
  4667.             rangehit += c.playerLevel[4] / 17;
  4668.         } else if (weapon == 810 || weapon == 867) {//adamant darts
  4669.             rangehit = 2;
  4670.             rangehit += c.playerLevel[4] / 9;
  4671.         } else if (weapon == 809 || weapon == 866) {//mithril darts
  4672.             rangehit = 2;
  4673.             rangehit += c.playerLevel[4] / 9.5;
  4674.         } else if (weapon == 808 || weapon == 865) {//Steel darts
  4675.             rangehit = 2;
  4676.             rangehit += c.playerLevel[4] / 10;
  4677.         } else if (weapon == 807 || weapon == 863) {//Iron darts
  4678.             rangehit = 2;
  4679.             rangehit += c.playerLevel[4] / 10.5;
  4680.         } else if (weapon == 806 || weapon == 864) {//Bronze darts
  4681.             rangehit = 1;
  4682.             rangehit += c.playerLevel[4] / 11;
  4683.         } else if (Arrows == 4740 && weapon == 4734) {//BoltRacks
  4684.                         rangehit = 4;
  4685.             rangehit += c.playerLevel[4] / 5;
  4686.         } else if (Arrows == 15243 && weapon == 15241) {//hand cannon
  4687.                         rangehit = 6;
  4688.             rangehit += c.playerLevel[4] / 5;
  4689.         } else if (Arrows == 11212 && weapon == 18357) {//c crossbow
  4690.                         rangehit = 7;
  4691.             rangehit += c.playerLevel[4] / 3;
  4692.         } else if (Arrows == 11212) {//dragon arrows
  4693.             rangehit = 4;
  4694.             rangehit += c.playerLevel[4] / 5.5;
  4695.         } else if (Arrows == 892) {//rune arrows
  4696.             rangehit = 3;
  4697.             rangehit += c.playerLevel[4] / 6;
  4698.         } else if (Arrows == 890) {//adamant arrows
  4699.             rangehit = 2;
  4700.             rangehit += c.playerLevel[4] / 7;
  4701.         } else if (Arrows == 888) {//mithril arrows
  4702.             rangehit = 2;
  4703.             rangehit += c.playerLevel[4] / 7.5;
  4704.         } else if (Arrows == 886) {//steel arrows
  4705.             rangehit = 2;
  4706.             rangehit += c.playerLevel[4] / 8;
  4707.         } else if (Arrows == 884) {//Iron arrows
  4708.             rangehit = 2;
  4709.             rangehit += c.playerLevel[4] / 9;
  4710.         } else if (Arrows == 882) {//Bronze arrows
  4711.             rangehit = 1;
  4712.             rangehit += c.playerLevel[4] / 9.5;
  4713.         } else if (Arrows == 9244) {
  4714.                         rangehit = 8;
  4715.                         rangehit += c.playerLevel[4] / 3;
  4716.                 } else if (Arrows == 9139) {
  4717.                         rangehit = 12;
  4718.                         rangehit += c.playerLevel[4] / 4;
  4719.                 } else if (Arrows == 9140) {
  4720.                         rangehit = 2;
  4721.             rangehit += c.playerLevel[4] / 7;
  4722.                 } else if (Arrows == 9141) {
  4723.                         rangehit = 3;
  4724.             rangehit += c.playerLevel[4] / 6;
  4725.                 } else if (Arrows == 9142) {
  4726.                         rangehit = 4;
  4727.             rangehit += c.playerLevel[4] / 6;
  4728.                 } else if (Arrows == 9143) {
  4729.                         rangehit = 7;
  4730.                         rangehit += c.playerLevel[4] / 5;
  4731.                 } else if (Arrows == 9144) {
  4732.                         rangehit = 7;
  4733.                         rangehit += c.playerLevel[4] / 4.5;
  4734.                 }
  4735.         int bonus = 0;
  4736.         bonus -= rangehit / 10;
  4737.         rangehit += bonus;
  4738.         if (c.specDamage != 1)
  4739.                         rangehit *= c.specDamage;
  4740.                 if (rangehit == 0)
  4741.                         rangehit++;
  4742.                 if (c.fullVoidRange()) {
  4743.                         rangehit *= 1.10;
  4744.                 }
  4745.                 if (weapon == 15241)
  4746.                         rangehit *= 1.35;
  4747.                 else if (c.prayerActive[3])
  4748.                         rangehit *= 1.05;
  4749.                 else if (c.prayerActive[11])
  4750.                         rangehit *= 1.10;
  4751.                 else if (c.prayerActive[19])
  4752.                         rangehit *= 1.15;
  4753.                 return rangehit;
  4754.     }
  4755.        
  4756.         public boolean properBolts() {
  4757.                 return c.playerEquipment[c.playerArrows] >= 9140 && c.playerEquipment[c.playerArrows] <= 9144
  4758.                                 || c.playerEquipment[c.playerArrows] >= 9240 && c.playerEquipment[c.playerArrows] <= 9244;
  4759.         }
  4760.        
  4761.         public int correctBowAndArrows() {
  4762.                 if (usingBolts())
  4763.                         return -1;
  4764.                 switch(c.playerEquipment[c.playerWeapon]) {
  4765.                         case 15241: // hand cannon with shot
  4766.                         return 15243;
  4767.                         case 843:
  4768.                         case 845:
  4769.                         case 839:
  4770.                         case 841:
  4771.                         return 884;
  4772.                        
  4773.                         case 847:
  4774.                         case 849:
  4775.                         return 886;
  4776.                        
  4777.                         case 851:
  4778.                         case 853:
  4779.                         return 888;        
  4780.                        
  4781.                         case 855:
  4782.                         case 857:
  4783.                         return 890;
  4784.                        
  4785.                         case 859:
  4786.                         case 861:
  4787.                         case 16337:
  4788.                         return 892;
  4789.                        
  4790.                         case 4734:
  4791.                         case 4935:
  4792.                         case 4936:
  4793.                         case 4937:
  4794.                         case 4934:
  4795.                         return 4740;
  4796.                        
  4797.                         case 11235:
  4798.                         case 15701: // dark bow
  4799.                 case 15702: // dark bow
  4800.                 case 15703: // dark bow
  4801.                 case 15704: // dark bow
  4802.                         case 14481:
  4803.                         case 14482:
  4804.                         return 11212;
  4805.                 }
  4806.                 return -1;
  4807.         }
  4808.        
  4809.         public int getRangeStartGFX() {
  4810.                 switch(c.rangeItemUsed) {
  4811.                                    
  4812.                         case 863:
  4813.                         return 220;
  4814.                         case 864:
  4815.                         return 219;
  4816.                         case 865:
  4817.                         return 221;
  4818.                         case 866: // knives
  4819.                         return 223;
  4820.                         case 867:
  4821.                         return 224;
  4822.                         case 868:
  4823.                         return 225;
  4824.                         case 869:
  4825.                         return 222;
  4826.                        
  4827.                         case 806:
  4828.                         return 232;
  4829.                         case 807:
  4830.                         return 233;
  4831.                         case 808:
  4832.                         return 234;
  4833.                         case 809: // darts
  4834.                         return 235;
  4835.                         case 810:
  4836.                         return 236;
  4837.                         case 811:
  4838.                         return 237;
  4839.                        
  4840.                         case 825:
  4841.                         return 206;
  4842.                         case 826:
  4843.                         return 207;
  4844.                         case 827: // javelin
  4845.                         return 208;
  4846.                         case 828:
  4847.                         return 209;
  4848.                         case 829:
  4849.                         return 210;
  4850.                         case 830:
  4851.                         return 211;
  4852.  
  4853.                         case 800:
  4854.                         return 42;
  4855.                         case 801:
  4856.                         return 43;
  4857.                         case 802:
  4858.                         return 44; // axes
  4859.                         case 803:
  4860.                         return 45;
  4861.                         case 804:
  4862.                         return 46;
  4863.                         case 805:
  4864.                         return 48;
  4865.                                                                
  4866.                         case 882:
  4867.                         return 19;
  4868.                        
  4869.                         case 884:
  4870.                         return 18;
  4871.                        
  4872.                         case 886:
  4873.                         return 20;
  4874.  
  4875.                         case 888:
  4876.                         return 21;
  4877.                        
  4878.                         case 890:
  4879.                         return 22;
  4880.                        
  4881.                         case 892:
  4882.                         return 24;
  4883.                        
  4884.                         case 11212:
  4885.                         return 26;
  4886.                        
  4887.                         case 4212:
  4888.                         case 4214:
  4889.                         case 4215:
  4890.                         case 4216:
  4891.                         case 4217:
  4892.                         case 4218:
  4893.                         case 4219:
  4894.                         case 4220:
  4895.                         case 4221:
  4896.                         case 4222:
  4897.                         case 4223:
  4898.                         return 250;
  4899.                        
  4900.                 }
  4901.                 return -1;
  4902.         }
  4903.  
  4904. public void drawback() {
  4905.     if (c.playerEquipment[c.playerArrows] == 882){
  4906.         c.gfx0(18);
  4907.         }
  4908.         /*else if (playerEquipment[playerWeapon] == 13649){
  4909.                 javerlin(105, 1190);
  4910.         }
  4911.         else if (playerEquipment[playerWeapon] == 13650){
  4912.                 thaxe(105, 1195);
  4913.         }*/
  4914.         else if (c.playerEquipment[c.playerArrows] == 864){
  4915.                 c.gfx0(219);
  4916.         }
  4917.         else if (c.playerEquipment[c.playerArrows] == 863){
  4918.                 c.gfx0(220);
  4919.         }
  4920.         else if (c.playerEquipment[c.playerArrows] == 865){
  4921.                 c.gfx0(221);
  4922.         }
  4923.         else if (c.playerEquipment[c.playerArrows] == 866){
  4924.                 c.gfx0(223);
  4925.         }
  4926.         else if (c.playerEquipment[c.playerArrows] == 867){
  4927.                 c.gfx0(224);
  4928.         }
  4929.         else if (c.playerEquipment[c.playerArrows] == 868){
  4930.                 c.gfx0(225);
  4931.         }
  4932.         else if (c.playerEquipment[c.playerArrows] == 869){
  4933.                 c.gfx0(222);
  4934.         }
  4935.     else if (c.playerEquipment[c.playerArrows] == 884) {
  4936.         c.gfx0(19);
  4937.         }
  4938.     else if (c.playerEquipment[c.playerArrows] == 888) {
  4939.         c.gfx0(21);
  4940.         }
  4941.     else if (c.playerEquipment[c.playerArrows] == 890) {
  4942.         c.gfx0(22);
  4943.         }
  4944.     else if (c.playerEquipment[c.playerArrows] == 11212) {
  4945.         c.gfx0(26);
  4946.         }
  4947.     else if (c.playerEquipment[c.playerArrows] == 892) {
  4948.         c.gfx0(24);
  4949.  
  4950. }
  4951.     else if (c.playerEquipment[c.playerArrows] == 9244) {
  4952.         c.gfx0(28);
  4953.  
  4954. }
  4955.     else if (c.playerEquipment[c.playerArrows] == 725) {
  4956.         c.gfx0(28);
  4957.  
  4958. }
  4959.     else if (c.playerEquipment[c.playerArrows] == 9340) {
  4960.         c.gfx0(28);
  4961.  
  4962. }
  4963. }
  4964.  
  4965.                
  4966.         public int getRangeProjectileGFX() {
  4967.                 if (c.dbowSpec) {
  4968.                         return 1099;
  4969.                 }
  4970.                 if(c.bowSpecShot > 0) {
  4971.                         switch(c.rangeItemUsed) {
  4972.                                 default:
  4973.                                 return 249;
  4974.                         }
  4975.                 }
  4976. if (c.playerEquipment[c.playerWeapon] == 15241)
  4977.                         return 2143;
  4978.                 if (c.playerEquipment[c.playerWeapon] == 9185)
  4979.                         return 27;
  4980.                 if (c.playerEquipment[c.playerWeapon] == 18357)
  4981.                         return 27;
  4982.                 switch(c.rangeItemUsed) {
  4983.                         case 13883:
  4984.                         return 1839;
  4985.                         case 13879:
  4986.                         return 1837;
  4987.                        
  4988.                         case 863:
  4989.                         return 213;
  4990.                         case 864:
  4991.                         return 212;
  4992.                         case 865:
  4993.                         return 214;
  4994.                         case 866: // knives
  4995.                         return 216;
  4996.                         case 867:
  4997.                         return 217;
  4998.                         case 868:
  4999.                         return 218;    
  5000.                         case 869:
  5001.                         return 215;  
  5002.  
  5003.                         case 806:
  5004.                         return 226;
  5005.                         case 807:
  5006.                         return 227;
  5007.                         case 808:
  5008.                         return 228;
  5009.                         case 809: // darts
  5010.                         return 229;
  5011.                         case 810:
  5012.                         return 230;
  5013.                         case 811:
  5014.                         return 231;    
  5015.  
  5016.                         case 825:
  5017.                         return 200;
  5018.                         case 826:
  5019.                         return 201;
  5020.                         case 827: // javelin
  5021.                         return 202;
  5022.                         case 828:
  5023.                         return 203;
  5024.                         case 829:
  5025.                         return 204;
  5026.                         case 830:
  5027.                         return 205;    
  5028.                        
  5029.                         case 6522: // Toktz-xil-ul
  5030.                         return 442;
  5031.  
  5032.                         case 800:
  5033.                         return 36;
  5034.                         case 801:
  5035.                         return 35;
  5036.                         case 802:
  5037.                         return 37; // axes
  5038.                         case 803:
  5039.                         return 38;
  5040.                         case 804:
  5041.                         return 39;
  5042.                         case 805:
  5043.                         return 40;
  5044.  
  5045.                         case 882:
  5046.                         return 10;
  5047.                        
  5048.                         case 884:
  5049.                         return 9;
  5050.                        
  5051.                         case 886:
  5052.                         return 11;
  5053.  
  5054.                         case 888:
  5055.                         return 12;
  5056.                        
  5057.                         case 890:
  5058.                         return 13;
  5059.                        
  5060.                         case 892:
  5061.                         return 15;
  5062.                        
  5063.                         case 11212:
  5064.                         return 17;
  5065.                        
  5066.                         case 4740: // bolt rack
  5067.                         return 27;
  5068.  
  5069.  
  5070.                        
  5071.                         case 4212:
  5072.                         case 4214:
  5073.                         case 4215:
  5074.                         case 4216:
  5075.                         case 4217:
  5076.                         case 4218:
  5077.                         case 4219:
  5078.                         case 4220:
  5079.                         case 4221:
  5080.                         case 4222:
  5081.                         case 4223:
  5082.                         return 249;
  5083.                        
  5084.                        
  5085.                 }
  5086.                 return -1;
  5087.         }
  5088.        
  5089.         public int getProjectileSpeed() {
  5090.                 if (c.dbowSpec)
  5091.                         return 100;
  5092.                 return 70;
  5093.         }
  5094.        
  5095.         public int getProjectileShowDelay() {
  5096.                 switch(c.playerEquipment[c.playerWeapon]) {
  5097.                         case 863:
  5098.                         case 864:
  5099.                         case 865:
  5100.                         case 866: // knives
  5101.                         case 867:
  5102.                         case 868:
  5103.                         case 869:
  5104.                        
  5105.                         case 806:
  5106.                         case 807:
  5107.                         case 808:
  5108.                         case 809: // darts
  5109.                         case 810:
  5110.                         case 811:
  5111.                        
  5112.                         case 825:
  5113.                         case 826:
  5114.                         case 827: // javelin
  5115.                         case 828:
  5116.                         case 829:
  5117.                         case 830:
  5118.                        
  5119.                         case 800:
  5120.                         case 801:
  5121.                         case 802:
  5122.                         case 803: // axes
  5123.                         case 804:
  5124.                         case 805:
  5125.                        
  5126.                         case 4734:
  5127.             case 9185:
  5128.                         case 18357:
  5129.                         case 4935:
  5130.                         case 4936:
  5131.                         case 4937:
  5132.                         return 15;
  5133.                        
  5134.                
  5135.                         default:
  5136.                         return 5;
  5137.                 }
  5138.         }
  5139.        
  5140.         public static int finalMagicDamage(Client c) {
  5141.                 double damage = c.MAGIC_SPELLS[c.oldSpellId][6];
  5142.                 double damageMultiplier = 1;
  5143.                 if (c.playerLevel[c.playerMagic] > c.getLevelForXP(c.playerXP[6])
  5144.                                 && c.getLevelForXP(c.playerXP[6]) >= 95)
  5145.                         damageMultiplier += .03 * (c.playerLevel[c.playerMagic] - 99);
  5146.                 else
  5147.                         damageMultiplier = 1;
  5148.                 switch (c.playerEquipment[c.playerWeapon]) {
  5149.                 case 18371: // Gravite Staff
  5150.                         damageMultiplier += .05;
  5151.                         break;
  5152.                 case 4675: // Ancient Staff
  5153.                 case 4710: // Ahrim's Staff
  5154.                 case 4862: // Ahrim's Staff
  5155.                 case 4864: // Ahrim's Staff
  5156.                 case 4865: // Ahrim's Staff
  5157.                 case 6914: // Master Wand
  5158.                 case 8841: // Void Knight Mace
  5159.                 case 13867: // Zuriel's Staff
  5160.                 case 13869: // Zuriel's Staff (Deg)
  5161.                         damageMultiplier += .10;
  5162.                         break;
  5163.                 case 15486: // Staff of Light
  5164.                         damageMultiplier += .15;
  5165.                         break;
  5166.                 case 18355: // Chaotic Staff
  5167.                         damageMultiplier += .20;
  5168.                         break;
  5169.                 }
  5170.                 switch (c.playerEquipment[c.playerAmulet]) {
  5171.                 case 18333: // Arcane Pulse
  5172.                         damageMultiplier += .05;
  5173.                         break;
  5174.                 case 18334:// Arcane Blast
  5175.                         damageMultiplier += .10;
  5176.                         break;
  5177.                 case 18335:// Arcane Stream
  5178.                         damageMultiplier += .15;
  5179.                         break;
  5180.                 }
  5181.                 switch (c.playerEquipment[c.playerHat]) {
  5182.                 case 13350: // Virtus Mask
  5183.                         damageMultiplier += .03;
  5184.                         break;
  5185.                 }
  5186.                 switch (c.playerEquipment[c.playerChest]) {
  5187.                 case 13348: // Virtus Body
  5188.                         damageMultiplier += .06;
  5189.                         break;
  5190.                 }
  5191.                 switch (c.playerEquipment[c.playerLegs]) {
  5192.                 case 13346: // Virtus Legs
  5193.                         damageMultiplier += .04;
  5194.                         break;
  5195.                 }
  5196.                 damage *= damageMultiplier;
  5197.                 return (int) damage;
  5198.         }
  5199.        
  5200.         /**
  5201.         *MAGIC
  5202.         **/
  5203.        
  5204.         public int mageAtk()
  5205.     {
  5206.         int attackLevel = c.playerLevel[6];
  5207.                 if (c.playerEquipment[c.playerWeapon] == 15486)
  5208.                         attackLevel += 0.15;
  5209.                 if (c.fullVoidMage())
  5210.             attackLevel += c.getLevelForXP(c.playerXP[6]) * 0.2;
  5211.                 if(c.curseActive[12])  // Leech Magic
  5212.                         attackLevel += c.getLevelForXP(c.playerXP[6]) * 0.1;
  5213.         if (c.prayerActive[4])
  5214.                         attackLevel *= 1.05;
  5215.                 else if (c.prayerActive[12])
  5216.                         attackLevel *= 1.10;
  5217.                 else if (c.prayerActive[20])
  5218.                         attackLevel *= 1.15;
  5219.         return (int) (attackLevel + (c.playerBonus[3] * 2));
  5220.     }
  5221.         public int mageDef()
  5222.     {
  5223.         int defenceLevel = c.playerLevel[1]/2 + c.playerLevel[6]/2;
  5224.         if (c.prayerActive[0]) {
  5225.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.05;
  5226.         } else if (c.prayerActive[3]) {
  5227.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.1;
  5228.         } else if (c.prayerActive[9]) {
  5229.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.15;
  5230.         } else if (c.prayerActive[18]) {
  5231.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.2;
  5232.         } else if (c.prayerActive[19]) {
  5233.             defenceLevel += c.getLevelForXP(c.playerXP[c.playerDefence]) * 0.25;
  5234.         }
  5235.         return (int) (defenceLevel + c.playerBonus[8] + (c.playerBonus[8] / 3));
  5236.     }
  5237.        
  5238.         public boolean wearingStaff(int runeId) {
  5239.                 int wep = c.playerEquipment[c.playerWeapon];
  5240.                 int book = c.playerEquipment[c.playerShield];
  5241.                 switch (runeId) {
  5242.                         case 554:
  5243.                         if (wep == 1387)
  5244.                                 return true;
  5245.                         break;
  5246.                         case 555:
  5247.                         if (wep == 1383 || book == 18346)
  5248.                                 return true;
  5249.                         break;
  5250.                         case 556:
  5251.                         if (wep == 1381)
  5252.                                 return true;
  5253.                         break;
  5254.                         case 557:
  5255.                         if (wep == 1385)
  5256.                                 return true;
  5257.                         break;
  5258.                 }
  5259.                 return false;
  5260.         }
  5261.        
  5262.         public boolean checkMagicReqs(int spell) {
  5263.                 if(c.usingMagic && Config.RUNES_REQUIRED) { // check for runes
  5264.                         if((!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][8], c.MAGIC_SPELLS[spell][9]) && !wearingStaff(c.MAGIC_SPELLS[spell][8])) ||
  5265.                                 (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][10], c.MAGIC_SPELLS[spell][11]) && !wearingStaff(c.MAGIC_SPELLS[spell][10])) ||
  5266.                                 (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][12], c.MAGIC_SPELLS[spell][13]) && !wearingStaff(c.MAGIC_SPELLS[spell][12])) ||
  5267.                                 (!c.getItems().playerHasItem(c.MAGIC_SPELLS[spell][14], c.MAGIC_SPELLS[spell][15]) && !wearingStaff(c.MAGIC_SPELLS[spell][14]))){
  5268.                         c.sendMessage("You don't have the required runes to cast this spell.");
  5269.                         return false;
  5270.                         }
  5271.                 }
  5272.  
  5273.                 if(c.usingMagic && c.playerIndex > 0) {
  5274.                         if(Server.playerHandler.players[c.playerIndex] != null) {
  5275.                                 for(int r = 0; r < c.REDUCE_SPELLS.length; r++){        // reducing spells, confuse etc
  5276.                                         if(Server.playerHandler.players[c.playerIndex].REDUCE_SPELLS[r] == c.MAGIC_SPELLS[spell][0]) {
  5277.                                                 c.reduceSpellId = r;
  5278.                                                 if((System.currentTimeMillis() - Server.playerHandler.players[c.playerIndex].reduceSpellDelay[c.reduceSpellId]) > Server.playerHandler.players[c.playerIndex].REDUCE_SPELL_TIME[c.reduceSpellId]) {
  5279.                                                         Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = true;
  5280.                                                 } else {
  5281.                                                         Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId] = false;
  5282.                                                 }
  5283.                                                 break;
  5284.                                         }                      
  5285.                                 }
  5286.                                 if(!Server.playerHandler.players[c.playerIndex].canUseReducingSpell[c.reduceSpellId]) {
  5287.                                         c.sendMessage("That player is currently immune to this spell.");
  5288.                                         c.usingMagic = false;
  5289.                                         c.stopMovement();
  5290.                                         resetPlayerAttack();
  5291.                                         return false;
  5292.                                 }
  5293.                         }
  5294.                 }
  5295.  
  5296.                 int staffRequired = getStaffNeeded();
  5297.                 if(c.usingMagic && staffRequired > 0 && Config.RUNES_REQUIRED) { // staff required
  5298.                         if(c.playerEquipment[c.playerWeapon] != staffRequired) {
  5299.                                 c.sendMessage("You need a "+c.getItems().getItemName(staffRequired).toLowerCase()+" to cast this spell.");
  5300.                                 return false;
  5301.                         }
  5302.                 }
  5303.                
  5304.                 if(c.usingMagic && Config.MAGIC_LEVEL_REQUIRED) { // check magic level
  5305.                         if(c.playerLevel[6] < c.MAGIC_SPELLS[spell][1]) {
  5306.                                 c.sendMessage("You need to have a magic level of " +c.MAGIC_SPELLS[spell][1]+" to cast this spell.");
  5307.                                 return false;
  5308.                         }
  5309.                 }
  5310.                 if(c.usingMagic && Config.RUNES_REQUIRED) {
  5311.                         if(c.MAGIC_SPELLS[spell][8] > 0) { // deleting runes
  5312.                         if (c.playerEquipment[c.playerWeapon] == 15486 && Misc.random(8) == 1)  {
  5313.                                         c.sendMessage("You didn't use any runes for this spell.");
  5314.                                         return true;
  5315.                                 }
  5316.                                 if (!wearingStaff(c.MAGIC_SPELLS[spell][8]))
  5317.                                         c.getItems().deleteItem(c.MAGIC_SPELLS[spell][8], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][8]), c.MAGIC_SPELLS[spell][9]);
  5318.                         }
  5319.                         if(c.MAGIC_SPELLS[spell][10] > 0) {
  5320.                                 if (!wearingStaff(c.MAGIC_SPELLS[spell][10]))
  5321.                                         c.getItems().deleteItem(c.MAGIC_SPELLS[spell][10], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][10]), c.MAGIC_SPELLS[spell][11]);
  5322.                         }
  5323.                         if(c.MAGIC_SPELLS[spell][12] > 0) {
  5324.                                 if (!wearingStaff(c.MAGIC_SPELLS[spell][12]))
  5325.                                         c.getItems().deleteItem(c.MAGIC_SPELLS[spell][12], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][12]), c.MAGIC_SPELLS[spell][13]);
  5326.                         }
  5327.                         if(c.MAGIC_SPELLS[spell][14] > 0) {
  5328.                                 if (!wearingStaff(c.MAGIC_SPELLS[spell][14]))
  5329.                                         c.getItems().deleteItem(c.MAGIC_SPELLS[spell][14], c.getItems().getItemSlot(c.MAGIC_SPELLS[spell][14]), c.MAGIC_SPELLS[spell][15]);
  5330.                         }
  5331.                 }
  5332.                 return true;
  5333.         }
  5334.        
  5335.        
  5336.        
  5337.         public int getFreezeTime() {
  5338.                 switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  5339.                         case 1572:
  5340.                         case 12861: // ice rush
  5341.                         return 10;
  5342.                                                
  5343.                         case 1582:
  5344.                         case 12881: // ice burst
  5345.                         return 17;
  5346.                        
  5347.                         case 1592:
  5348.                         case 12871: // ice blitz
  5349.                         return 25;
  5350.                        
  5351.                         case 12891: // ice barrage
  5352.                         return 33;
  5353.                        
  5354.                         default:
  5355.                         return 0;
  5356.                 }
  5357.         }
  5358.        
  5359.         public void freezePlayer(int i) {
  5360.                
  5361.        
  5362.         }
  5363.  
  5364.         public int getStartHeight() {
  5365.                 switch(c.MAGIC_SPELLS[c.spellId][0]) {
  5366.                         case 1562: // stun
  5367.                         return 25;
  5368.                        
  5369.                         case 12939:// smoke rush
  5370.                         return 35;
  5371.                        
  5372.                         case 12987: // shadow rush
  5373.                         return 38;
  5374.                        
  5375.                         case 12861: // ice rush
  5376.                         return 15;
  5377.                        
  5378.                         case 12951:  // smoke blitz
  5379.                         return 38;
  5380.                        
  5381.                         case 12999: // shadow blitz
  5382.                         return 25;
  5383.                        
  5384.                         case 12911: // blood blitz
  5385.                         return 25;
  5386.                        
  5387.                         default:
  5388.                         return 43;
  5389.                 }
  5390.         }
  5391.        
  5392.  
  5393.        
  5394.         public int getEndHeight() {
  5395.                 switch(c.MAGIC_SPELLS[c.spellId][0]) {
  5396.                         case 1562: // stun
  5397.                         return 10;
  5398.                        
  5399.                         case 12939: // smoke rush
  5400.                         return 20;
  5401.                        
  5402.                         case 12987: // shadow rush
  5403.                         return 28;
  5404.                        
  5405.                         case 12861: // ice rush
  5406.                         return 10;
  5407.                        
  5408.                         case 12951:  // smoke blitz
  5409.                         return 28;
  5410.                        
  5411.                         case 12999: // shadow blitz
  5412.                         return 15;
  5413.                        
  5414.                         case 12911: // blood blitz
  5415.                         return 10;
  5416.                                
  5417.                         default:
  5418.                         return 31;
  5419.                 }
  5420.         }
  5421.        
  5422.         public int getStartDelay() {
  5423. if(c.playerEquipment[c.playerWeapon] == 15241)
  5424.                         return 30;
  5425.                 switch(c.MAGIC_SPELLS[c.spellId][0]) {
  5426.                         case 1539:
  5427.                         return 60;
  5428.                        
  5429.                         default:
  5430.                         return 53;
  5431.                 }
  5432.         }
  5433.        
  5434.         public int getStaffNeeded() {
  5435.                 switch(c.MAGIC_SPELLS[c.spellId][0]) {
  5436.                         case 1539:
  5437.                         return 1409;
  5438.                        
  5439.                         case 12037:
  5440.                         return 4170;
  5441.                        
  5442.                         case 1190:
  5443.                         return 2415;
  5444.                        
  5445.                         case 1191:
  5446.                         return 2416;
  5447.                        
  5448.                         case 1192:
  5449.                         return 2417;
  5450.                        
  5451.                         default:
  5452.                         return 0;
  5453.                 }
  5454.         }
  5455.        
  5456.         public boolean godSpells() {
  5457.                 switch(c.MAGIC_SPELLS[c.spellId][0]) { 
  5458.                         case 1190:
  5459.                         return true;
  5460.                        
  5461.                         case 1191:
  5462.                         return true;
  5463.                        
  5464.                         case 1192:
  5465.                         return true;
  5466.                        
  5467.                         default:
  5468.                         return false;
  5469.                 }
  5470.         }
  5471.                
  5472.         public int getEndGfxHeight() {
  5473.                 switch(c.MAGIC_SPELLS[c.oldSpellId][0]) {
  5474.                         case 12987:    
  5475.                         case 12901:            
  5476.                         case 12861:
  5477.                         case 12445:
  5478.                         case 1192:
  5479.                         case 13011:
  5480.                         case 12919:
  5481.                         case 12881:
  5482.                         case 12999:
  5483.                         case 12911:
  5484.                         case 12871:
  5485.                         case 13023:
  5486.                         case 12929:
  5487.                         case 12891:
  5488.                         return 0;
  5489.                        
  5490.                         default:
  5491.                         return 100;
  5492.                 }
  5493.         }
  5494.        
  5495.         public int getStartGfxHeight() {
  5496.                 switch(c.MAGIC_SPELLS[c.spellId][0]) {
  5497.                         case 12871:
  5498.                         case 12891:
  5499.                         return 0;
  5500.                        
  5501.                         default:
  5502.                         return 100;
  5503.                 }
  5504.         }
  5505.        
  5506.         public void handleDfs() {
  5507. try {
  5508.  
  5509.                           if(c.oldPlayerIndex > 0) {
  5510.                         if(Server.playerHandler.players[c.oldPlayerIndex] != null) {
  5511.                                 c.projectileStage = 2;
  5512.                                 final int pX = c.getX();
  5513.                                 final int pY = c.getY();
  5514.                                 final int oX = Server.playerHandler.players[c.oldPlayerIndex].getX();
  5515.                                 final int oY = Server.playerHandler.players[c.oldPlayerIndex].getY();
  5516.                                 final int offX = (pY - oY)* -1;
  5517.                                 final int offY = (pX - oX)* -1;
  5518.                         if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  5519.                         if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  5520.                                 final int damage = Misc.random(30);
  5521.                                 c.startAnimation(6696);
  5522.                                 c.gfx0(1165);
  5523.                         c.SSPLIT = true;
  5524.                         Server.npcHandler.npcs[c.oldNpcIndex].gfx0(2264);
  5525.                         EventManager.getSingleton().addEvent(new Event() {
  5526.                                 public void execute(EventContainer b) {
  5527.                                 Server.playerHandler.players[c.playerIndex].gfx100(1167);
  5528.                                 c.SSPLIT = false;
  5529.                                 Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  5530.                                 Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  5531.                                 Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  5532.                                 Server.playerHandler.players[c.playerIndex].updateRequired = true;
  5533.                                 b.stop();
  5534.                                 }
  5535.                                 }, 1700);
  5536.                         EventManager.getSingleton().addEvent(new Event() {
  5537.                                 public void execute(EventContainer b) {
  5538.                                 c.getPA().createPlayersProjectile2(pX, pY, offX, offY, 50, 50, 1166, 30, 30, - c.oldPlayerIndex - 1, 30, 5);
  5539.                                 b.stop();
  5540.                                 }
  5541.                                 }, 1000);
  5542.                                 c.dfsDelay = System.currentTimeMillis();                                       
  5543.                         } else {
  5544.                                 c.sendMessage("I should be in combat before using this.");
  5545.                         }
  5546.                 } else {
  5547.                         c.sendMessage("My shield hasn't finished recharging yet.");
  5548.         }               }
  5549.                 }      
  5550.                         } catch (Exception e) {
  5551.                          }
  5552.         }      
  5553.  
  5554.  
  5555.         public void handleZerker() {
  5556.  
  5557.                 if(c.isDonator == 1){
  5558.                 if (System.currentTimeMillis() - c.dfsDelay > 60000) {
  5559.                         if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  5560.                                 int damage = Misc.random(10) + 7;
  5561.                                 c.startAnimation(369);
  5562.                                 c.gfx0(369);
  5563.                                 Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  5564.                                 Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  5565.                                 c.forcedText = "Feel the power of the Berserker Ring!";
  5566.                                 Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  5567.                                 Server.playerHandler.players[c.playerIndex].updateRequired = true;
  5568.                                 c.dfsDelay = System.currentTimeMillis();                                               
  5569.                         } else {
  5570.                                 c.sendMessage("I should be in combat before using this.");
  5571.                         }
  5572.                 } else {
  5573.                         c.sendMessage("My ring hasn't finished recharging yet (60 Seconds)");
  5574.                         }if (c.isDonator == 0)
  5575.                         c.sendMessage("Only Donators can use the ring's Special attack");      
  5576.                 }
  5577.         }
  5578.         public void handleWarrior() {
  5579.                 if(c.isDonator == 1){
  5580.                 if (System.currentTimeMillis() - c.dfsDelay > 60000) {
  5581.                         if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  5582.                                 int damage = Misc.random(10) + 7;
  5583.                                 c.startAnimation(369);
  5584.                                 c.gfx0(369);
  5585.                                 Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  5586.                                 c.forcedText = "Feel the power of the Warrior Ring!";
  5587.                                 Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  5588.                                 Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  5589.                                 Server.playerHandler.players[c.playerIndex].updateRequired = true;
  5590.                                 c.dfsDelay = System.currentTimeMillis();                                               
  5591.                         } else {
  5592.                                 c.sendMessage("I should be in combat before using this.");
  5593.                         }
  5594.                 } else {
  5595.                         c.sendMessage("My ring hasn't finished recharging yet (60 Seconds)");
  5596.                         }if (c.isDonator == 0)
  5597.                         c.sendMessage("Only Donators can use the ring's Special attack");      
  5598.                 }
  5599.         }
  5600.        
  5601.         public void handleSeers() {
  5602. /*
  5603.  
  5604.                 c.castingMagic = true;
  5605.                 if(c.isDonator == 1){
  5606.                 if (System.currentTimeMillis() - c.dfsDelay > 60000) {
  5607.                         if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  5608.                                 int damage = Misc.random(10) + 7;
  5609.                                                                 c.startAnimation(1979);
  5610.                                                                 Server.playerHandler.players[c.playerIndex].gfx0(369);
  5611.                                                                 c.gfx0(368);
  5612.                                         Server.playerHandler.players[c.playerIndex].freezeTimer = 15;
  5613.                                                                                 Server.playerHandler.players[c.playerIndex].resetWalkingQueue();
  5614.                                                                                 Server.playerHandler.players[c.playerIndex].frozenBy = c.playerId;
  5615.                                 Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  5616.                                 c.forcedText = ("Feel the power of the Seers Ring!");
  5617.                                 Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  5618.  
  5619.                                 Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  5620.                                 Server.playerHandler.players[c.playerIndex].updateRequired = true;
  5621.                                 c.dfsDelay = System.currentTimeMillis();                                               
  5622.                         } else {
  5623.                                 c.sendMessage("I should be in combat before using this.");
  5624.                         }
  5625.                 } else {
  5626.                         c.sendMessage("My ring hasn't finished recharging yet (60 Seconds)");
  5627.                         }if (c.isDonator == 0)
  5628. */
  5629.                
  5630.         }
  5631.  
  5632.         public void Zammybook() {
  5633.                                 c.startAnimation(1670);
  5634.                         EventManager.getSingleton().addEvent(new Event() {
  5635.                                 public void execute(EventContainer b) {
  5636.                 c.forcedChatUpdateRequired = true;
  5637.                 c.updateRequired = true;
  5638.                                 c.forcedText = ("Two great warriors, joined by hand,");
  5639.                                 b.stop();
  5640.                                 }
  5641.                                 }, 400);
  5642.                         EventManager.getSingleton().addEvent(new Event() {
  5643.                                 public void execute(EventContainer b) {
  5644.                                 c.forcedText = ("to spread destruction across the land.");
  5645.                 c.forcedChatUpdateRequired = true;
  5646.                 c.updateRequired = true;
  5647.                                 b.stop();
  5648.                                 }
  5649.                                 }, 1200);
  5650.                         EventManager.getSingleton().addEvent(new Event() {
  5651.                                 public void execute(EventContainer b) {
  5652.                                 c.forcedText = ("In Zamorak's name, now two are one.");
  5653.                 c.forcedChatUpdateRequired = true;
  5654.                 c.updateRequired = true;
  5655.                                 b.stop();
  5656.                                 }
  5657.                                 }, 1900);                                      
  5658.  
  5659.                
  5660.         }
  5661.        
  5662.         public void handleArcher() {
  5663.                 if(c.isDonator == 1){
  5664.                 if (System.currentTimeMillis() - c.dfsDelay > 60000) {
  5665.                         if (c.playerIndex > 0 && Server.playerHandler.players[c.playerIndex] != null) {
  5666.                                 int damage = Misc.random(10) + 7;
  5667.                                 c.startAnimation(369);
  5668.                                 c.gfx0(369);
  5669.                                 Server.playerHandler.players[c.playerIndex].playerLevel[3] -= damage;
  5670.                                 Server.playerHandler.players[c.playerIndex].hitDiff2 = damage;
  5671.                                 c.forcedText = "Feel the power of the Archer Ring!";
  5672.                                 Server.playerHandler.players[c.playerIndex].hitUpdateRequired2 = true;
  5673.                                 Server.playerHandler.players[c.playerIndex].updateRequired = true;
  5674.                                 c.dfsDelay = System.currentTimeMillis();                                               
  5675.                         } else {
  5676.                                 c.sendMessage("I should be in combat before using this.");
  5677.                         }
  5678.                 } else {
  5679.                         c.sendMessage("My ring hasn't finished recharging yet (60 Seconds)");
  5680.                         }if (c.isDonator == 0)
  5681.                         c.sendMessage("Only Donators can use the ring's Special attack");      
  5682.                 }
  5683.         }
  5684.        
  5685.                 public void handleDfsNPC() {
  5686.                         try {
  5687.                          if(c.npcIndex > 0) {
  5688.                         if(Server.npcHandler.npcs[c.npcIndex] != null) {
  5689.                                 c.projectileStage = 2;
  5690.                                 final int pX = c.getX();
  5691.                                 final int pY = c.getY();
  5692.                                 final int nX = Server.npcHandler.npcs[c.npcIndex].getX();
  5693.                                 final int nY = Server.npcHandler.npcs[c.npcIndex].getY();
  5694.                                 final int offX = (pY - nY)* -1;
  5695.                                 final int offY = (pX - nX)* -1;
  5696.                         if (System.currentTimeMillis() - c.dfsDelay > 30000) {
  5697.                         if (c.npcIndex > 0 && Server.npcHandler.npcs[c.npcIndex] != null) {
  5698.                                 final int damage = Misc.random(35) + 5;
  5699.                                 c.startAnimation(6696);
  5700.                                 c.gfx0(1165);
  5701.                                 Server.npcHandler.npcs[c.npcIndex].hitUpdateRequired2 = true;
  5702.                                 Server.npcHandler.npcs[c.npcIndex].updateRequired = true;
  5703.                                 Server.npcHandler.npcs[c.npcIndex].hitDiff2 = damage;
  5704.                                 Server.npcHandler.npcs[c.npcIndex].HP -= damage;
  5705.                                 //Server.npcHandler.npcs[c.npcIndex].gfx100(1167);
  5706.                         EventManager.getSingleton().addEvent(new Event() {
  5707.                                 public void execute(EventContainer b) {
  5708.                                 c.getPA().createPlayersProjectile(pX, pY, offX, offY, 50, 50, 1166, 31, 35, - c.npcIndex  - 1, 30);
  5709.                                 b.stop();
  5710.                                 }
  5711.                                 }, 1000);
  5712. if(Server.npcHandler.npcs[c.npcIndex].isDead == true) {
  5713. c.sendMessage("This NPC is already dead!");
  5714. return;
  5715. }
  5716.                                 c.dfsDelay = System.currentTimeMillis();                                               
  5717.                         } else {
  5718.                                 c.sendMessage("I should be in combat before using this.");
  5719.                         }
  5720.                 } else {
  5721.                         c.sendMessage("My shield hasn't finished recharging yet.");
  5722.         }               }      
  5723.                 }      
  5724.                 }
  5725.                 catch (Exception e)
  5726.                 {
  5727.                 }
  5728.         }      
  5729.        
  5730.         public void applyRecoil(int damage, int i) {
  5731.                 if (damage > 0 && Server.playerHandler.players[i].playerEquipment[c.playerRing] == 2550) {
  5732.                         int recDamage = damage/10 + 1;
  5733.                         if (!c.getHitUpdateRequired()) {
  5734.                                 c.setHitDiff(recDamage);
  5735.                         removeRecoil(c);
  5736.                         c.recoilHits = recDamage;
  5737.                                 c.setHitUpdateRequired(true);                          
  5738.                         } else if (!c.getHitUpdateRequired2()) {
  5739.                                 c.setHitDiff2(recDamage);
  5740.                                 c.setHitUpdateRequired2(true);
  5741.                         }
  5742.                         c.dealDamage(recDamage);
  5743.                         c.updateRequired = true;
  5744.                 }      
  5745.         }
  5746.  
  5747.         public void Deflect(int damage, int i) {
  5748.                 if (damage > 0 && Server.playerHandler.players[i].curseActive[7] || Server.playerHandler.players[i].curseActive[8] || Server.playerHandler.players[i].curseActive[9]) {
  5749.                         int recDamage = damage/6;
  5750.                         if (!c.getHitUpdateRequired()) {
  5751.                                 damage = damage /7;
  5752.                                 c.setHitDiff(recDamage);
  5753.                         c.recoilHits = recDamage;
  5754.                                 c.setHitUpdateRequired(true);                          
  5755.                         } else if (!c.getHitUpdateRequired2()) {
  5756.                                 damage = damage /7;
  5757.                                 c.setHitDiff2(recDamage);
  5758.                                 c.setHitUpdateRequired2(true);
  5759.                         }
  5760.                         c.dealDamage(recDamage);
  5761.                         damage = damage /7;
  5762.                         c.updateRequired = true;
  5763.                 }      
  5764.         }
  5765.  
  5766.         public void applyRecoilNPC(int damage, int i) {
  5767.                 if (damage > 0 && c.playerEquipment[c.playerRing] == 2550) {
  5768.                         int recDamage = damage/10;
  5769.                         if (!c.getHitUpdateRequired()) {
  5770.                                 c.setHitDiff(recDamage);
  5771.                         c.recoilHits = recDamage;
  5772.                                 c.setHitUpdateRequired(true);                          
  5773.                         } else if (!c.getHitUpdateRequired2()) {
  5774.                                 c.setHitDiff2(recDamage);
  5775.                                 c.setHitUpdateRequired2(true);
  5776.                         }
  5777.                         c.dealDamage(recDamage);
  5778.                         c.updateRequired = true;
  5779.                 }      
  5780.         }
  5781.  
  5782.         public void removeRecoil(Client c) {
  5783.                 if(c.recoilHits >= 50) {
  5784.                         c.getItems().removeItem(2550, c.playerRing);
  5785.                         c.getItems().deleteItem(2550, c.getItems().getItemSlot(2550), 1);
  5786.                         c.sendMessage("Your ring of recoil shaters!");
  5787.                         c.recoilHits = 0;
  5788.                 } else {
  5789.                         c.recoilHits++;
  5790.                 }
  5791.         }
  5792.        
  5793.         public int getBonusAttack(int i) {
  5794.                 switch (Server.npcHandler.npcs[i].npcType) {
  5795.                         case 2883:
  5796.                         return Misc.random(50) + 30;
  5797.                         case 2026:
  5798.                         case 2027:
  5799.                         case 2029:
  5800.                         case 2030:
  5801.                         return Misc.random(50) + 30;
  5802.                 }
  5803.                 return 0;
  5804.         }
  5805.        
  5806.        
  5807.        
  5808.         public void handleGmaulPlayer() {
  5809.                 if (c.playerIndex > 0) {
  5810.                         Client o = (Client)Server.playerHandler.players[c.playerIndex];
  5811.                         if (c.goodDistance(c.getX(), c.getY(), o.getX(), o.getY(), getRequiredDistance())) {
  5812.                                 if (checkReqs()) {
  5813.                                         if (checkSpecAmount(4153)) {                                           
  5814.                                                 boolean hit = Misc.random(calculateMeleeAttack()) > Misc.random(o.getCombat().calculateMeleeDefence());
  5815.                                                 int damage = 0;
  5816.                                                 if (hit)
  5817.                                                         damage = Misc.random(calculateMeleeMaxHit());
  5818.                                                 if (o.prayerActive[18] || o.curseActive[9] && System.currentTimeMillis() - o.protMeleeDelay > 1500)
  5819.                                                         damage *= .6;
  5820.                                                 o.handleHitMask(damage);
  5821.                                                 c.startAnimation(1667);
  5822.                                                 c.gfx100(340);
  5823.                                                 o.dealDamage(damage);
  5824.                                         }      
  5825.                                 }      
  5826.                         }                      
  5827.                 }      
  5828.         }
  5829.        
  5830.         public boolean armaNpc(int i) {
  5831.                 switch (Server.npcHandler.npcs[i].npcType) {
  5832.                         case 6222:
  5833.                         case 6223:
  5834.                         case 6229:
  5835.                         case 6225:
  5836.                         case 6230:
  5837.                         case 6227:
  5838.                         case 6232:
  5839.                         case 6239:
  5840.                         case 6233:
  5841.                         case 6231:
  5842.                         return true;   
  5843.                 }
  5844.                 return false;  
  5845.         }
  5846.        
  5847.         public static void addCharge(Client c) {
  5848.                 if(c.playerEquipment[c.playerShield] != 11283) {
  5849.                 return;
  5850.         }
  5851.                 if(c.dfsCount <= 39) {
  5852.                         c.dfsCount++;
  5853.                         c.startAnimation(6695);
  5854.                         c.gfx0(1164);
  5855.                         c.sendMessage("You absord the fire breath and charge your Dragonfire shield.");
  5856.                 }              
  5857.                 if(c.dfsCount >= 40) {
  5858.                         c.dfsCount = 40;
  5859.                         c.sendMessage("Your Dragonfire Shield is fully Charged.");
  5860.                         return;
  5861.                 }
  5862.         }
  5863. }