SHARE
TWEET

Untitled

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