Advertisement
Guest User

Untitled

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