Advertisement
Guest User

Untitled

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