Advertisement
Guest User

Untitled

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