Advertisement
Guest User

PlayerCombat

a guest
Jan 18th, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 135.95 KB | None | 0 0
  1. package core.framework.game.player.actions;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import java.util.Random;
  6.  
  7. import core.framework.cache.loaders.ItemDefinitions;
  8. import core.framework.game.Animation;
  9. import core.framework.game.Entity;
  10. import core.framework.game.Graphics;
  11. import core.framework.game.Hit;
  12. import core.framework.game.Hit.HitLook;
  13. import core.framework.game.Region;
  14. import core.framework.game.World;
  15. import core.framework.game.item.Item;
  16. import core.framework.game.npc.NPC;
  17. import core.framework.game.npc.familiar.Familiar;
  18. import core.framework.game.npc.familiar.Steeltitan;
  19. import core.framework.game.npc.fightkiln.HarAken;
  20. import core.framework.game.npc.fightkiln.HarAkenTentacle;
  21. import core.framework.game.npc.godwars.zaros.NexMinion;
  22. import core.framework.game.npc.qbd.QueenBlackDragon;
  23. import core.framework.game.player.CombatDefinitions;
  24. import core.framework.game.player.Equipment;
  25. import core.framework.game.player.Player;
  26. import core.framework.game.player.Skills;
  27. import core.framework.game.player.content.Combat;
  28. import core.framework.game.player.content.Magic;
  29. import core.framework.game.player.content.Slayer;
  30. import core.framework.game.tasks.WorldTask;
  31. import core.framework.game.tasks.WorldTasksManager;
  32. import core.framework.utils.MapAreas;
  33. import core.framework.utils.Utils;
  34.  
  35. public class PlayerCombat extends Action {
  36.  
  37.     private Entity target;
  38.     private int max_hit; // temporary constant
  39.     private double base_mage_xp; // temporary constant
  40.     private int mage_hit_gfx; // temporary constant
  41.     private int magic_sound; // temporary constant
  42.     private int max_poison_hit; // temporary constant
  43.     private int freeze_time; // temporary constant
  44.     private boolean reduceAttack; // temporary constant
  45.     private boolean blood_spell; // temporary constant
  46.     private boolean block_tele;
  47.     private int spellcasterGloves;
  48.  
  49.     public PlayerCombat(Entity target) {
  50.         this.target = target;
  51.     }
  52.  
  53.     @Override
  54.     public boolean start(Player player) {
  55.         player.setNextFaceEntity(target);
  56.         if (checkAll(player)) {
  57.             return true;
  58.         }
  59.         player.setNextFaceEntity(null);
  60.         return false;
  61.     }
  62.  
  63.     @Override
  64.     public boolean process(Player player) {
  65.         return checkAll(player);
  66.     }
  67.  
  68.     private boolean forceCheckClipAsRange(Entity target) {
  69.         return target instanceof NexMinion || target instanceof HarAken
  70.                 || target instanceof HarAkenTentacle
  71.                 || target instanceof QueenBlackDragon;
  72.     }
  73.  
  74.     @Override
  75.     public int processWithDelay(Player player) {
  76.         int isRanging = isRanging(player);
  77.         int spellId = player.getCombatDefinitions().getSpellId();
  78.         if (spellId < 1 && hasPolyporeStaff(player)) {
  79.             spellId = 65535;
  80.         }
  81.         int maxDistance = isRanging != 0 || spellId > 0 ? 7 : 0;
  82.         int distanceX = player.getX() - target.getX();
  83.         int distanceY = player.getY() - target.getY();
  84.         double multiplier = 1.0;
  85.         if (player.getTemporaryAttributtes().get("miasmic_effect") == Boolean.TRUE)
  86.             multiplier = 1.5;
  87.         int size = target.getSize();
  88.         if (!player.clipedProjectile(target, maxDistance == 0
  89.                 && !forceCheckClipAsRange(target)))
  90.             return 0;
  91.         if (player.hasWalkSteps())
  92.             maxDistance += 1;
  93.         if (distanceX > size + maxDistance || distanceX < -1 - maxDistance
  94.                 || distanceY > size + maxDistance
  95.                 || distanceY < -1 - maxDistance)
  96.             return 0;
  97.         if (!player.getControlerManager().keepCombating(target))
  98.             return -1;
  99.         addAttackedByDelay(player);
  100.         if (spellId > 0) {
  101.             boolean manualCast = spellId != 65535 && spellId >= 256;
  102.             Item gloves = player.getEquipment().getItem(Equipment.SLOT_HANDS);
  103.             spellcasterGloves = gloves != null
  104.                     && gloves.getDefinitions().getName()
  105.                             .contains("Spellcaster glove")
  106.                     && player.getEquipment().getWeaponId() == -1
  107.                     && new Random().nextInt(30) == 0 ? spellId : -1;
  108.             int delay = mageAttack(player,
  109.                     manualCast ? spellId - 256 : spellId, !manualCast);
  110.             if (player.getNextAnimation() != null && spellcasterGloves > 0) {
  111.                 player.setNextAnimation(new Animation(14339));
  112.                 spellcasterGloves = -1;
  113.             }
  114.             return delay;
  115.         } else {
  116.             if (isRanging == 0) {
  117.                 return (int) (meleeAttack(player) * multiplier);
  118.             } else if (isRanging == 1) {
  119.                 player.getPackets().sendGameMessage(
  120.                         "This ammo is not very effective with this weapon.");
  121.                 return -1;
  122.             } else if (isRanging == 3) {
  123.                 player.getPackets().sendGameMessage(
  124.                         "You don't have any ammo in your backpack.");
  125.                 return -1;
  126.             } else {
  127.                 return (int) (rangeAttack(player) * multiplier);
  128.             }
  129.         }
  130.     }
  131.  
  132.     private void addAttackedByDelay(Entity player) {
  133.         target.setAttackedBy(player);
  134.         target.setAttackedByDelay(Utils.currentTimeMillis() + 8000); // 8seconds
  135.     }
  136.  
  137.     private int getRangeCombatDelay(int weaponId, int attackStyle) {
  138.         int delay = 6;
  139.         if (weaponId != -1) {
  140.             String weaponName = ItemDefinitions.getItemDefinitions(weaponId)
  141.                     .getName().toLowerCase();
  142.             if (weaponName.contains("shortbow")
  143.                     || weaponName.contains("karil's crossbow"))
  144.                 delay = 3;
  145.             else if (weaponName.contains("crossbow"))
  146.                 delay = 5;
  147.             else if (weaponName.contains("longbow"))
  148.                 delay = 4;
  149.             else if (weaponName.contains("zaryte"))
  150.                 delay = 4;
  151.             else if (weaponName.contains("decimation"))
  152.                 delay = 4;
  153.             else if (weaponName.contains("dart")
  154.                     || weaponName.contains("knife")
  155.                     || weaponName.contains("chinchompa"))
  156.                 delay = 2;
  157.             else {
  158.                 switch (weaponId) {
  159.                 case 15241:
  160.                     delay = 7;
  161.                     break;
  162.                 case 11235: // dark bows
  163.                 case 15701:
  164.                 case 15702:
  165.                 case 15703:
  166.                 case 15704:
  167.                     delay = 9;
  168.                     break;
  169.                 default:
  170.                     delay = 6;
  171.                     break;
  172.                 }
  173.             }
  174.         }
  175.         if (attackStyle == 1)
  176.             delay--;
  177.         else if (attackStyle == 2)
  178.             delay++;
  179.         return delay;
  180.     }
  181.  
  182.     public Entity[] getMultiAttackTargets(Player player) {
  183.         return getMultiAttackTargets(player, 1, 9);
  184.     }
  185.  
  186.     public Entity[] getMultiAttackTargets(Player player, int maxDistance,
  187.             int maxAmtTargets) {
  188.         List<Entity> possibleTargets = new ArrayList<Entity>();
  189.         possibleTargets.add(target);
  190.         if (target.isAtMultiArea()) {
  191.             y: for (int regionId : target.getMapRegionsIds()) {
  192.                 Region region = World.getRegion(regionId);
  193.                 if (target instanceof Player) {
  194.                     List<Integer> playerIndexes = region.getPlayerIndexes();
  195.                     if (playerIndexes == null)
  196.                         continue;
  197.                     for (int playerIndex : playerIndexes) {
  198.                         Player p2 = World.getPlayers().get(playerIndex);
  199.                         if (p2 == null || p2 == player || p2 == target
  200.                                 || p2.isDead() || !p2.hasStarted()
  201.                                 || p2.hasFinished() || !p2.isCanPvp()
  202.                                 || !p2.isAtMultiArea()
  203.                                 || !p2.withinDistance(target, maxDistance)
  204.                                 || !player.getControlerManager().canHit(p2))
  205.                             continue;
  206.                         possibleTargets.add(p2);
  207.                         if (possibleTargets.size() == maxAmtTargets)
  208.                             break y;
  209.                     }
  210.                 } else {
  211.                     List<Integer> npcIndexes = region.getNPCsIndexes();
  212.                     if (npcIndexes == null)
  213.                         continue;
  214.                     for (int npcIndex : npcIndexes) {
  215.                         NPC n = World.getNPCs().get(npcIndex);
  216.                         if (n == null || n == target
  217.                                 || n == player.getFamiliar() || n.isDead()
  218.                                 || n.hasFinished() || !n.isAtMultiArea()
  219.                                 || !n.withinDistance(target, maxDistance)
  220.                                 || !n.getDefinitions().hasAttackOption()
  221.                                 || !player.getControlerManager().canHit(n))
  222.                             continue;
  223.                         possibleTargets.add(n);
  224.                         if (possibleTargets.size() == maxAmtTargets)
  225.                             break y;
  226.                     }
  227.                 }
  228.             }
  229.         }
  230.         return possibleTargets.toArray(new Entity[possibleTargets.size()]);
  231.     }
  232.  
  233.     public int mageAttack(final Player player, int spellId, boolean autocast) {
  234.         if (!autocast) {
  235.             player.getCombatDefinitions().resetSpells(false);
  236.             player.getActionManager().forceStop();
  237.         }
  238.         if (!Magic.checkCombatSpell(player, spellId, -1, true)) {
  239.             if (autocast)
  240.                 player.getCombatDefinitions().resetSpells(true);
  241.             return -1; // stops
  242.         }
  243.         if (spellId == 65535) {
  244.             player.setNextFaceEntity(target);
  245.             player.setNextGraphics(new Graphics(2034));
  246.             player.setNextAnimation(new Animation(15448));
  247.             mage_hit_gfx = 2036;
  248.             delayMagicHit(
  249.                     2,
  250.                     getMagicHit(
  251.                             player,
  252.                             getRandomMagicMaxHit(player, (5 * player
  253.                                     .getSkills().getLevel(Skills.MAGIC)) - 180)));
  254.             World.sendProjectile(player, target, 2035, 60, 32, 50, 50, 0, 0);
  255.             return 4;
  256.         }
  257.         if (player.getCombatDefinitions().getSpellBook() == 192) {
  258.             switch (spellId) {
  259.             case 25: // air strike
  260.                 player.setNextAnimation(new Animation(14221));
  261.                 mage_hit_gfx = 2700;
  262.                 base_mage_xp = 5.5;
  263.                 int baseDamage = 20;
  264.                 if (player.getEquipment().getGlovesId() == 205) {
  265.                     baseDamage = 90;
  266.                 }
  267.                 delayMagicHit(
  268.                         2,
  269.                         getMagicHit(player,
  270.                                 getRandomMagicMaxHit(player, baseDamage)));
  271.                 World.sendProjectile(player, target, 2699, 18, 18, 50, 50, 0, 0);
  272.                 return 5;
  273.             case 28: // water strike
  274.                 player.setNextGraphics(new Graphics(2701));
  275.                 player.setNextAnimation(new Animation(14221));
  276.                 mage_hit_gfx = 2708;
  277.                 base_mage_xp = 7.5;
  278.                 baseDamage = 40;
  279.                 if (player.getEquipment().getGlovesId() == 205) {
  280.                     baseDamage = 100;
  281.                 }
  282.                 delayMagicHit(
  283.                         2,
  284.                         getMagicHit(player,
  285.                                 getRandomMagicMaxHit(player, baseDamage)));
  286.                 World.sendProjectile(player, target, 2703, 18, 18, 50, 50, 0, 0);
  287.                 return 5;
  288.             case 36:// bind
  289.                 player.setNextGraphics(new Graphics(177));
  290.                 player.setNextAnimation(new Animation(710));
  291.                 mage_hit_gfx = 181;
  292.                 base_mage_xp = 60.5;
  293.                 Hit magicHit = getMagicHit(player,
  294.                         getRandomMagicMaxHit(player, 20));
  295.                 delayMagicHit(2, magicHit);
  296.                 World.sendProjectile(player, target, 178, 18, 18, 50, 50, 0, 0);
  297.                 long currentTime = Utils.currentTimeMillis();
  298.                 if (magicHit.getDamage() > 0
  299.                         && target.getFrozenBlockedDelay() < currentTime)
  300.                     target.addFreezeDelay(5000, true);
  301.                 return 5;
  302.             case 55:// snare
  303.                 player.setNextGraphics(new Graphics(177));
  304.                 player.setNextAnimation(new Animation(710));
  305.                 mage_hit_gfx = 180;
  306.                 base_mage_xp = 91.1;
  307.                 Hit snareHit = getMagicHit(player,
  308.                         getRandomMagicMaxHit(player, 30));
  309.                 delayMagicHit(2, snareHit);
  310.                 if (snareHit.getDamage() > 0
  311.                         && target.getFrozenBlockedDelay() < Utils
  312.                                 .currentTimeMillis())
  313.                     target.addFreezeDelay(10000, true);
  314.                 World.sendProjectile(player, target, 178, 18, 18, 50, 50, 0, 0);
  315.                 return 5;
  316.             case 81:// entangle
  317.                 player.setNextGraphics(new Graphics(177));
  318.                 player.setNextAnimation(new Animation(710));
  319.                 mage_hit_gfx = 179;
  320.                 base_mage_xp = 91.1;
  321.                 Hit entangleHit = getMagicHit(player,
  322.                         getRandomMagicMaxHit(player, 50));
  323.                 delayMagicHit(2, entangleHit);
  324.                 if (entangleHit.getDamage() > 0
  325.                         && target.getFrozenBlockedDelay() < Utils
  326.                                 .currentTimeMillis())
  327.                     target.addFreezeDelay(20000, true);
  328.                 World.sendProjectile(player, target, 178, 18, 18, 50, 50, 0, 0);
  329.                 return 5;
  330.             case 30: // earth strike
  331.                 player.setNextGraphics(new Graphics(2713));
  332.                 player.setNextAnimation(new Animation(14221));
  333.                 mage_hit_gfx = 2723;
  334.                 base_mage_xp = 9.5;
  335.                 baseDamage = 60;
  336.                 if (player.getEquipment().getGlovesId() == 205) {
  337.                     baseDamage = 110;
  338.                 }
  339.                 delayMagicHit(
  340.                         2,
  341.                         getMagicHit(player,
  342.                                 getRandomMagicMaxHit(player, baseDamage)));
  343.                 World.sendProjectile(player, target, 2718, 18, 18, 50, 50, 0, 0);
  344.                 return 5;
  345.             case 32: // fire strike
  346.                 player.setNextGraphics(new Graphics(2728));
  347.                 player.setNextAnimation(new Animation(14221));
  348.                 mage_hit_gfx = 2737;
  349.                 base_mage_xp = 11.5;
  350.                 baseDamage = 80;
  351.                 if (player.getEquipment().getGlovesId() == 205) {
  352.                     baseDamage = 120;
  353.                 }
  354.                 int damage = getRandomMagicMaxHit(player, baseDamage);
  355.                 if (target instanceof NPC) {
  356.                     NPC n = (NPC) target;
  357.                     if (n.getId() == 9463) // ice verm
  358.                         damage *= 2;
  359.                     if (n.getId() == 14301) // glacor
  360.                         damage *= 2;
  361.                 }
  362.                 delayMagicHit(2, getMagicHit(player, damage));
  363.                 World.sendProjectile(player, target, 2729, 18, 18, 50, 50, 0, 0);
  364.                 return 5;
  365.             case 74: // vengeother
  366.                 if (target instanceof Player) {
  367.                     // player.setNextAnimation(new Animation(4411)); // Needs to
  368.                     // be set to correct animation of player giving veng
  369.                     ((Player) target).setCastVeng(true);
  370.                     target.setNextGraphics(new Graphics(725, 0, 100));
  371.                     player.getPackets().sendGameMessage(
  372.                             "You recieve vengeance from "
  373.                                     + player.getDisplayName() + ".");
  374.  
  375.                 } else {
  376.                     player.getPackets().sendGameMessage(
  377.                             "This player already has the power of vengeance.");
  378.                 }
  379.                 return 5;
  380.             case 34: // air bolt
  381.                 player.setNextAnimation(new Animation(14220));
  382.                 mage_hit_gfx = 2700;
  383.                 base_mage_xp = 13.5;
  384.                 baseDamage = 90;
  385.                 if (player.getEquipment().getGlovesId() == 777) {
  386.                     baseDamage = 120;
  387.                 }
  388.                 delayMagicHit(
  389.                         2,
  390.                         getMagicHit(player,
  391.                                 getRandomMagicMaxHit(player, baseDamage)));
  392.                 World.sendProjectile(player, target, 2699, 18, 18, 50, 50, 0, 0);
  393.                 return 5;
  394.             case 39: // water bolt
  395.                 player.setNextGraphics(new Graphics(2707, 0, 100));
  396.                 player.setNextAnimation(new Animation(14220));
  397.                 mage_hit_gfx = 2709;
  398.                 base_mage_xp = 16.5;
  399.                 baseDamage = 100;
  400.                 if (player.getEquipment().getGlovesId() == 777) {
  401.                     baseDamage = 130;
  402.                 }
  403.                 delayMagicHit(
  404.                         2,
  405.                         getMagicHit(player,
  406.                                 getRandomMagicMaxHit(player, baseDamage)));
  407.                 World.sendProjectile(player, target, 2704, 18, 18, 50, 50, 0, 0);
  408.                 return 5;
  409.             case 42: // earth bolt
  410.                 player.setNextGraphics(new Graphics(2714));
  411.                 player.setNextAnimation(new Animation(14222));
  412.                 mage_hit_gfx = 2724;
  413.                 base_mage_xp = 19.5;
  414.                 baseDamage = 110;
  415.                 if (player.getEquipment().getGlovesId() == 777) {
  416.                     baseDamage = 140;
  417.                 }
  418.                 delayMagicHit(
  419.                         2,
  420.                         getMagicHit(player,
  421.                                 getRandomMagicMaxHit(player, baseDamage)));
  422.                 World.sendProjectile(player, target, 2719, 18, 18, 50, 50, 0, 0);
  423.                 return 5;
  424.             case 45: // fire bolt
  425.                 player.setNextGraphics(new Graphics(2728));
  426.                 player.setNextAnimation(new Animation(14223));
  427.                 mage_hit_gfx = 2738;
  428.                 base_mage_xp = 22.5;
  429.                 baseDamage = 120;
  430.                 if (player.getEquipment().getGlovesId() == 777) {
  431.                     baseDamage = 150;
  432.                 }
  433.                 damage = getRandomMagicMaxHit(player, baseDamage);
  434.                 if (target instanceof NPC) {
  435.                     NPC n = (NPC) target;
  436.                     if (n.getId() == 9463) // ice verm
  437.                         damage *= 2;
  438.                 }
  439.                 delayMagicHit(2, getMagicHit(player, damage));
  440.                 World.sendProjectile(player, target, 2731, 18, 18, 50, 50, 0, 0);
  441.                 return 5;
  442.             case 49: // air blast
  443.                 player.setNextAnimation(new Animation(14221));
  444.                 mage_hit_gfx = 2700;
  445.                 base_mage_xp = 25.5;
  446.                 delayMagicHit(2,
  447.                         getMagicHit(player, getRandomMagicMaxHit(player, 130)));
  448.                 World.sendProjectile(player, target, 2699, 18, 18, 50, 50, 0, 0);
  449.                 return 5;
  450.             case 52: // water blast
  451.                 player.setNextGraphics(new Graphics(2701));
  452.                 player.setNextAnimation(new Animation(14220));
  453.                 mage_hit_gfx = 2710;
  454.                 base_mage_xp = 31.5;
  455.                 delayMagicHit(2,
  456.                         getMagicHit(player, getRandomMagicMaxHit(player, 140)));
  457.                 World.sendProjectile(player, target, 2705, 18, 18, 50, 50, 0, 0);
  458.                 return 5;
  459.             case 58: // earth blast
  460.                 player.setNextGraphics(new Graphics(2715));
  461.                 player.setNextAnimation(new Animation(14222));
  462.                 mage_hit_gfx = 2725;
  463.                 base_mage_xp = 31.5;
  464.                 delayMagicHit(2,
  465.                         getMagicHit(player, getRandomMagicMaxHit(player, 150)));
  466.                 World.sendProjectile(player, target, 2720, 18, 18, 50, 50, 0, 0);
  467.                 return 5;
  468.             case 63: // fire blast
  469.                 player.setNextGraphics(new Graphics(2728));
  470.                 player.setNextAnimation(new Animation(14223));
  471.                 mage_hit_gfx = 2739;
  472.                 base_mage_xp = 34.5;
  473.                 damage = getRandomMagicMaxHit(player, 160);
  474.                 if (target instanceof NPC) {
  475.                     NPC n = (NPC) target;
  476.                     if (n.getId() == 9463) // ice verm
  477.                         damage *= 2;
  478.                 }
  479.                 delayMagicHit(2, getMagicHit(player, damage));
  480.                 World.sendProjectile(player, target, 2733, 18, 18, 50, 50, 0, 0);
  481.                 return 5;
  482.             case 66:// Saradomin Strike
  483.                 player.setNextAnimation(new Animation(811));
  484.                 mage_hit_gfx = 76;
  485.                 base_mage_xp = 34.5;
  486.                 delayMagicHit(2,
  487.                         getMagicHit(player, getRandomMagicMaxHit(player, 300)));
  488.                 return 5;
  489.             case 67: // Claws of Guthix
  490.                 player.setNextAnimation(new Animation(811));
  491.                 mage_hit_gfx = 77;
  492.                 base_mage_xp = 34.5;
  493.                 delayMagicHit(2,
  494.                         getMagicHit(player, getRandomMagicMaxHit(player, 300)));
  495.                 return 5;
  496.             case 68: // Flames of Zamorak
  497.                 player.setNextAnimation(new Animation(811));
  498.                 mage_hit_gfx = 78;
  499.                 base_mage_xp = 34.5;
  500.                 delayMagicHit(2,
  501.                         getMagicHit(player, getRandomMagicMaxHit(player, 300)));
  502.                 return 5;
  503.             case 70: // air wave
  504.                 player.setNextAnimation(new Animation(14221));
  505.                 mage_hit_gfx = 2700;
  506.                 base_mage_xp = 36;
  507.                 delayMagicHit(2,
  508.                         getMagicHit(player, getRandomMagicMaxHit(player, 170)));
  509.                 World.sendProjectile(player, target, 2699, 18, 18, 50, 50, 0, 0);
  510.                 return 5;
  511.             case 73: // water wave
  512.                 player.setNextGraphics(new Graphics(2702));
  513.                 player.setNextAnimation(new Animation(14220));
  514.                 mage_hit_gfx = 2710;
  515.                 base_mage_xp = 37.5;
  516.                 delayMagicHit(2,
  517.                         getMagicHit(player, getRandomMagicMaxHit(player, 180)));
  518.                 World.sendProjectile(player, target, 2706, 18, 18, 50, 50, 0, 0);
  519.                 return 5;
  520.             case 77: // earth wave
  521.                 player.setNextGraphics(new Graphics(2716));
  522.                 player.setNextAnimation(new Animation(14222));
  523.                 mage_hit_gfx = 2726;
  524.                 base_mage_xp = 42.5;
  525.                 delayMagicHit(2,
  526.                         getMagicHit(player, getRandomMagicMaxHit(player, 190)));
  527.                 World.sendProjectile(player, target, 2721, 18, 18, 50, 50, 0, 0);
  528.                 return 5;
  529.             case 80: // fire wave
  530.                 player.setNextGraphics(new Graphics(2728));
  531.                 player.setNextAnimation(new Animation(14223));
  532.                 mage_hit_gfx = 2740;
  533.                 base_mage_xp = 42.5;
  534.                 damage = getRandomMagicMaxHit(player, 200);
  535.                 if (target instanceof NPC) {
  536.                     NPC n = (NPC) target;
  537.                     if (n.getId() == 9463) // ice verm
  538.                         damage *= 2;
  539.                 }
  540.                 delayMagicHit(2, getMagicHit(player, damage));
  541.                 World.sendProjectile(player, target, 2735, 18, 18, 50, 50, 0, 0);
  542.                 return 5;
  543.             case 86: // teleblock
  544.                 if (target instanceof Player
  545.                         && ((Player) target).getTeleBlockDelay() <= Utils
  546.                                 .currentTimeMillis()) {
  547.                     player.setNextGraphics(new Graphics(1841));
  548.                     player.setNextAnimation(new Animation(10503));
  549.                     mage_hit_gfx = 1843;
  550.                     base_mage_xp = 80;
  551.                     block_tele = true;
  552.                     Hit hit = getMagicHit(player,
  553.                             getRandomMagicMaxHit(player, 30));
  554.                     delayMagicHit(2, hit);
  555.                     World.sendProjectile(player, target, 1842, 18, 18, 50, 50,
  556.                             0, 0);
  557.                 } else {
  558.                     player.getPackets().sendGameMessage(
  559.                             "This player is already effected by this spell.",
  560.                             true);
  561.                 }
  562.                 return 5;
  563.             case 84:// air surge
  564.                 player.setNextGraphics(new Graphics(457));
  565.                 player.setNextAnimation(new Animation(10546));
  566.                 mage_hit_gfx = 2700;
  567.                 base_mage_xp = 80;
  568.                 delayMagicHit(2,
  569.                         getMagicHit(player, getRandomMagicMaxHit(player, 220)));
  570.                 World.sendProjectile(player, target, 462, 18, 18, 50, 50, 0, 0);
  571.                 return 5;
  572.             case 87:// water surge
  573.                 player.setNextGraphics(new Graphics(2701));
  574.                 player.setNextAnimation(new Animation(10542));
  575.                 mage_hit_gfx = 2712;
  576.                 base_mage_xp = 80;
  577.                 delayMagicHit(2,
  578.                         getMagicHit(player, getRandomMagicMaxHit(player, 240)));
  579.                 World.sendProjectile(player, target, 2707, 18, 18, 50, 50, 3, 0);
  580.                 return 5;
  581.             case 89:// earth surge
  582.                 player.setNextGraphics(new Graphics(2717));
  583.                 player.setNextAnimation(new Animation(14209));
  584.                 mage_hit_gfx = 2727;
  585.                 base_mage_xp = 80;
  586.                 delayMagicHit(2,
  587.                         getMagicHit(player, getRandomMagicMaxHit(player, 260)));
  588.                 World.sendProjectile(player, target, 2722, 18, 18, 50, 50, 0, 0);
  589.                 return 5;
  590.             case 91:// fire surge
  591.                 player.setNextGraphics(new Graphics(2728));
  592.                 player.setNextAnimation(new Animation(2791));
  593.                 mage_hit_gfx = 2741;
  594.                 base_mage_xp = 80;
  595.                 damage = getRandomMagicMaxHit(player, 280);
  596.                 if (damage > 0 && target instanceof NPC) {
  597.                     NPC n = (NPC) target;
  598.                     if (n.getId() == 9463) // ice verm
  599.                         damage *= 2;
  600.                 }
  601.                 delayMagicHit(2, getMagicHit(player, damage));
  602.                 World.sendProjectile(player, target, 2735, 18, 18, 50, 50, 3, 0);
  603.                 World.sendProjectile(player, target, 2736, 18, 18, 50, 50, 20,
  604.                         0);
  605.                 World.sendProjectile(player, target, 2736, 18, 18, 50, 50, 110,
  606.                         0);
  607.                 return 5;
  608.             case 99: // Storm of armadyl //Sonic and Tyler dumped
  609.                 player.setNextGraphics(new Graphics(457));
  610.                 player.setNextAnimation(new Animation(10546));
  611.                 mage_hit_gfx = 1019;
  612.                 base_mage_xp = 70;
  613.                 int boost = (player.getSkills().getLevelForXp(Skills.MAGIC) - 77) * 5;
  614.                 int hit = getRandomMagicMaxHit(player, 160 + boost);
  615.                 if (hit > 0 && hit < boost)
  616.                     hit += boost;
  617.                 delayMagicHit(2, getMagicHit(player, hit));
  618.                 World.sendProjectile(player, target, 1019, 18, 18, 50, 30, 0, 0);
  619.                 return player.getEquipment().getWeaponId() == 21777 ? 4 : 5;
  620.             }
  621.         } else if (player.getCombatDefinitions().getSpellBook() == 193) {
  622.             switch (spellId) {
  623.             case 28:// Smoke Rush
  624.                 player.setNextAnimation(new Animation(1978));
  625.                 mage_hit_gfx = 385;
  626.                 base_mage_xp = 30;
  627.                 max_poison_hit = 20;
  628.                 delayMagicHit(2,
  629.                         getMagicHit(player, getRandomMagicMaxHit(player, 150)));
  630.                 World.sendProjectile(player, target, 386, 18, 18, 50, 50, 0, 0);
  631.                 return 4;
  632.             case 32:// Shadow Rush
  633.                 player.setNextAnimation(new Animation(1978));
  634.                 mage_hit_gfx = 379;
  635.                 base_mage_xp = 31;
  636.                 reduceAttack = true;
  637.                 delayMagicHit(2,
  638.                         getMagicHit(player, getRandomMagicMaxHit(player, 160)));
  639.                 World.sendProjectile(player, target, 380, 18, 18, 50, 50, 0, 0);
  640.                 return 4;
  641.             case 36: // Miasmic rush
  642.                 player.setNextAnimation(new Animation(10513));
  643.                 player.setNextGraphics(new Graphics(1845));
  644.                 mage_hit_gfx = 1847;
  645.                 base_mage_xp = 35;
  646.                 delayMagicHit(2,
  647.                         getMagicHit(player, getRandomMagicMaxHit(player, 200)));
  648.                 World.sendProjectile(player, target, 1846, 43, 22, 51, 50, 16,
  649.                         0);
  650.                 if (target.getTemporaryAttributtes().get("miasmic_immunity") == Boolean.TRUE) {
  651.                     return 4;
  652.                 }
  653.                 if (target instanceof Player) {
  654.                     ((Player) target).getPackets().sendGameMessage(
  655.                             "You feel slowed down.");
  656.                 }
  657.                 target.getTemporaryAttributtes().put("miasmic_immunity",
  658.                         Boolean.TRUE);
  659.                 target.getTemporaryAttributtes().put("miasmic_effect",
  660.                         Boolean.TRUE);
  661.                 final Entity t = target;
  662.                 WorldTasksManager.schedule(new WorldTask() {
  663.                     @Override
  664.                     public void run() {
  665.                         t.getTemporaryAttributtes().remove("miasmic_effect");
  666.                         WorldTasksManager.schedule(new WorldTask() {
  667.                             @Override
  668.                             public void run() {
  669.                                 t.getTemporaryAttributtes().remove(
  670.                                         "miasmic_immunity");
  671.                                 stop();
  672.                             }
  673.                         }, 15);
  674.                         stop();
  675.                     }
  676.                 }, 20);
  677.                 return 4;
  678.             case 37: // Miasmic blitz
  679.                 player.setNextAnimation(new Animation(10524));
  680.                 player.setNextGraphics(new Graphics(1850));
  681.                 mage_hit_gfx = 1851;
  682.                 base_mage_xp = 48;
  683.                 delayMagicHit(2,
  684.                         getMagicHit(player, getRandomMagicMaxHit(player, 280)));
  685.                 World.sendProjectile(player, target, 1852, 43, 22, 51, 50, 16,
  686.                         0);
  687.                 if (target.getTemporaryAttributtes().get("miasmic_immunity") == Boolean.TRUE) {
  688.                     return 4;
  689.                 }
  690.                 if (target instanceof Player) {
  691.                     ((Player) target).getPackets().sendGameMessage(
  692.                             "You feel slowed down.");
  693.                 }
  694.                 target.getTemporaryAttributtes().put("miasmic_immunity",
  695.                         Boolean.TRUE);
  696.                 target.getTemporaryAttributtes().put("miasmic_effect",
  697.                         Boolean.TRUE);
  698.                 final Entity t0 = target;
  699.                 WorldTasksManager.schedule(new WorldTask() {
  700.                     @Override
  701.                     public void run() {
  702.                         t0.getTemporaryAttributtes().remove("miasmic_effect");
  703.                         WorldTasksManager.schedule(new WorldTask() {
  704.                             @Override
  705.                             public void run() {
  706.                                 t0.getTemporaryAttributtes().remove(
  707.                                         "miasmic_immunity");
  708.                                 stop();
  709.                             }
  710.                         }, 15);
  711.                         stop();
  712.                     }
  713.                 }, 60);
  714.                 return 4;
  715.             case 38: // Miasmic burst
  716.                 player.setNextAnimation(new Animation(10516));
  717.                 player.setNextGraphics(new Graphics(1848));
  718.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  719.                     private boolean nextTarget;
  720.  
  721.                     @Override
  722.                     public boolean attack() {
  723.                         mage_hit_gfx = 1849;
  724.                         base_mage_xp = 42;
  725.                         int damage = getRandomMagicMaxHit(player, 240);
  726.                         delayMagicHit(2, getMagicHit(player, damage));
  727.                         if (target.getTemporaryAttributtes().get(
  728.                                 "miasmic_immunity") != Boolean.TRUE) {
  729.                             if (target instanceof Player) {
  730.                                 ((Player) target).getPackets().sendGameMessage(
  731.                                         "You feel slowed down.");
  732.                             }
  733.                             target.getTemporaryAttributtes().put(
  734.                                     "miasmic_immunity", Boolean.TRUE);
  735.                             target.getTemporaryAttributtes().put(
  736.                                     "miasmic_effect", Boolean.TRUE);
  737.                             final Entity t = target;
  738.                             WorldTasksManager.schedule(new WorldTask() {
  739.                                 @Override
  740.                                 public void run() {
  741.                                     t.getTemporaryAttributtes().remove(
  742.                                             "miasmic_effect");
  743.                                     WorldTasksManager.schedule(new WorldTask() {
  744.                                         @Override
  745.                                         public void run() {
  746.                                             t.getTemporaryAttributtes().remove(
  747.                                                     "miasmic_immunity");
  748.                                             stop();
  749.                                         }
  750.                                     }, 15);
  751.                                     stop();
  752.                                 }
  753.                             }, 40);
  754.                         }
  755.                         if (!nextTarget) {
  756.                             if (damage == -1) {
  757.                                 return false;
  758.                             }
  759.                             nextTarget = true;
  760.                         }
  761.                         return nextTarget;
  762.  
  763.                     }
  764.                 });
  765.                 return 4;
  766.             case 39: // Miasmic barrage
  767.                 player.setNextAnimation(new Animation(10518));
  768.                 player.setNextGraphics(new Graphics(1853));
  769.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  770.                     private boolean nextTarget;
  771.  
  772.                     @Override
  773.                     public boolean attack() {
  774.                         mage_hit_gfx = 1854;
  775.                         base_mage_xp = 54;
  776.                         int damage = getRandomMagicMaxHit(player, 320);
  777.                         delayMagicHit(2, getMagicHit(player, damage));
  778.                         if (target.getTemporaryAttributtes().get(
  779.                                 "miasmic_immunity") != Boolean.TRUE) {
  780.                             if (target instanceof Player) {
  781.                                 ((Player) target).getPackets().sendGameMessage(
  782.                                         "You feel slowed down.");
  783.                             }
  784.                             target.getTemporaryAttributtes().put(
  785.                                     "miasmic_immunity", Boolean.TRUE);
  786.                             target.getTemporaryAttributtes().put(
  787.                                     "miasmic_effect", Boolean.TRUE);
  788.                             final Entity t = target;
  789.                             WorldTasksManager.schedule(new WorldTask() {
  790.                                 @Override
  791.                                 public void run() {
  792.                                     t.getTemporaryAttributtes().remove(
  793.                                             "miasmic_effect");
  794.                                     WorldTasksManager.schedule(new WorldTask() {
  795.                                         @Override
  796.                                         public void run() {
  797.                                             t.getTemporaryAttributtes().remove(
  798.                                                     "miasmic_immunity");
  799.                                             stop();
  800.                                         }
  801.                                     }, 15);
  802.                                     stop();
  803.                                 }
  804.                             }, 80);
  805.                         }
  806.                         if (!nextTarget) {
  807.                             if (damage == -1) {
  808.                                 return false;
  809.                             }
  810.                             nextTarget = true;
  811.                         }
  812.                         return nextTarget;
  813.  
  814.                     }
  815.                 });
  816.                 return 4;
  817.             case 24:// Blood rush
  818.                 player.setNextAnimation(new Animation(1978));
  819.                 mage_hit_gfx = 373;
  820.                 base_mage_xp = 33;
  821.                 blood_spell = true;
  822.                 delayMagicHit(2,
  823.                         getMagicHit(player, getRandomMagicMaxHit(player, 170)));
  824.                 World.sendProjectile(player, target, 374, 18, 18, 50, 50, 0, 0);
  825.                 return 4;
  826.             case 20:// Ice rush
  827.                 player.setNextAnimation(new Animation(1978));
  828.                 mage_hit_gfx = 361;
  829.                 base_mage_xp = 34;
  830.                 freeze_time = 5000;
  831.                 delayMagicHit(2,
  832.                         getMagicHit(player, getRandomMagicMaxHit(player, 180)));
  833.                 World.sendProjectile(player, target, 362, 18, 18, 50, 50, 0, 0);
  834.                 return 4;
  835.                 // TODO burst
  836.             case 30:// Smoke burst
  837.                 player.setNextAnimation(new Animation(1979));
  838.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  839.  
  840.                     private boolean nextTarget; // real target is first player
  841.                                                 // on array
  842.  
  843.                     @Override
  844.                     public boolean attack() {
  845.                         mage_hit_gfx = 389;
  846.                         base_mage_xp = 36;
  847.                         max_poison_hit = 20;
  848.                         int damage = getRandomMagicMaxHit(player, 190);
  849.                         delayMagicHit(2, getMagicHit(player, damage));
  850.                         World.sendProjectile(player, target, 388, 18, 18, 50,
  851.                                 50, 0, 0);
  852.                         if (!nextTarget) {
  853.                             if (damage == -1)
  854.                                 return false;
  855.                             nextTarget = true;
  856.                         }
  857.                         return nextTarget;
  858.  
  859.                     }
  860.                 });
  861.                 return 4;
  862.             case 34:// Shadow burst
  863.                 player.setNextAnimation(new Animation(1979));
  864.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  865.  
  866.                     private boolean nextTarget; // real target is first player
  867.                                                 // on array
  868.  
  869.                     @Override
  870.                     public boolean attack() {
  871.                         mage_hit_gfx = 382;
  872.                         base_mage_xp = 37;
  873.                         reduceAttack = true;
  874.                         int damage = getRandomMagicMaxHit(player, 200);
  875.                         delayMagicHit(2, getMagicHit(player, damage));
  876.                         if (!nextTarget) {
  877.                             if (damage == -1)
  878.                                 return false;
  879.                             nextTarget = true;
  880.                         }
  881.                         return nextTarget;
  882.  
  883.                     }
  884.                 });
  885.                 return 4;
  886.             case 26:// Blood burst
  887.                 player.setNextAnimation(new Animation(1979));
  888.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  889.  
  890.                     private boolean nextTarget; // real target is first player
  891.                                                 // on array
  892.  
  893.                     @Override
  894.                     public boolean attack() {
  895.                         mage_hit_gfx = 376;
  896.                         base_mage_xp = 39;
  897.                         blood_spell = true;
  898.                         int damage = getRandomMagicMaxHit(player, 210);
  899.                         delayMagicHit(2, getMagicHit(player, damage));
  900.                         if (!nextTarget) {
  901.                             if (damage == -1)
  902.                                 return false;
  903.                             nextTarget = true;
  904.                         }
  905.                         return nextTarget;
  906.  
  907.                     }
  908.                 });
  909.                 return 4;
  910.             case 22:// Ice burst
  911.                 player.setNextGraphics(new Graphics(366));
  912.                 player.setNextAnimation(new Animation(1979));
  913.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  914.  
  915.                     private boolean nextTarget; // real target is first player
  916.                                                 // on array
  917.  
  918.                     @Override
  919.                     public boolean attack() {
  920.                         mage_hit_gfx = 367;
  921.                         base_mage_xp = 46;
  922.                         freeze_time = 15000;
  923.                         magic_sound = 169;
  924.                         int damage = getRandomMagicMaxHit(player, 220);
  925.                         delayMagicHit(4, getMagicHit(player, damage));
  926.                         World.sendProjectile(player, target, 366, 43, 0, 120,
  927.                                 0, 50, 64);
  928.                         if (!nextTarget) {
  929.                             if (damage == -1)
  930.                                 return false;
  931.                             nextTarget = true;
  932.                         }
  933.                         return nextTarget;
  934.  
  935.                     }
  936.                 });
  937.                 return 4;
  938.             case 29:// Smoke Blitz
  939.                 player.setNextAnimation(new Animation(1978));
  940.                 mage_hit_gfx = 387;
  941.                 base_mage_xp = 42;
  942.                 max_poison_hit = 40;
  943.                 delayMagicHit(2,
  944.                         getMagicHit(player, getRandomMagicMaxHit(player, 230)));
  945.                 World.sendProjectile(player, target, 386, 18, 18, 50, 50, 0, 0);
  946.                 return 4;
  947.             case 33:// Shadow Blitz
  948.                 player.setNextAnimation(new Animation(1978));
  949.                 mage_hit_gfx = 381;
  950.                 base_mage_xp = 43;
  951.                 reduceAttack = true;
  952.                 delayMagicHit(2,
  953.                         getMagicHit(player, getRandomMagicMaxHit(player, 240)));
  954.                 World.sendProjectile(player, target, 380, 18, 18, 50, 50, 0, 0);
  955.                 return 4;
  956.             case 25:// Blood Blitz
  957.                 player.setNextAnimation(new Animation(1978));
  958.                 mage_hit_gfx = 375;
  959.                 base_mage_xp = 45;
  960.                 blood_spell = true;
  961.                 delayMagicHit(2,
  962.                         getMagicHit(player, getRandomMagicMaxHit(player, 250)));
  963.                 World.sendProjectile(player, target, 374, 18, 18, 50, 50, 0, 0);
  964.                 return 4;
  965.             case 21:// Ice Blitz
  966.                 player.setNextGraphics(new Graphics(366));
  967.                 player.setNextAnimation(new Animation(1978));
  968.                 mage_hit_gfx = 367;
  969.                 base_mage_xp = 46;
  970.                 freeze_time = 15000;
  971.                 magic_sound = 169;
  972.                 delayMagicHit(2,
  973.                         getMagicHit(player, getRandomMagicMaxHit(player, 260)));
  974.                 World.sendProjectile(player, target, 368, 60, 32, 50, 50, 0, 0);
  975.                 return 4;
  976.             case 31:// Smoke barrage
  977.                 player.setNextAnimation(new Animation(1979));
  978.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  979.  
  980.                     private boolean nextTarget; // real target is first player
  981.                                                 // on array
  982.  
  983.                     @Override
  984.                     public boolean attack() {
  985.                         mage_hit_gfx = 391;
  986.                         base_mage_xp = 48;
  987.                         max_poison_hit = 40;
  988.                         int damage = getRandomMagicMaxHit(player, 270);
  989.                         delayMagicHit(2, getMagicHit(player, damage));
  990.                         World.sendProjectile(player, target, 390, 18, 18, 50,
  991.                                 50, 0, 0);
  992.                         if (!nextTarget) {
  993.                             if (damage == -1)
  994.                                 return false;
  995.                             nextTarget = true;
  996.                         }
  997.                         return nextTarget;
  998.  
  999.                     }
  1000.                 });
  1001.                 return 4;
  1002.             case 35:// shadow barrage
  1003.                 player.setNextAnimation(new Animation(1979));
  1004.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  1005.  
  1006.                     private boolean nextTarget; // real target is first player
  1007.                                                 // on array
  1008.  
  1009.                     @Override
  1010.                     public boolean attack() {
  1011.                         mage_hit_gfx = 383;
  1012.                         base_mage_xp = 49;
  1013.                         reduceAttack = true;
  1014.                         int damage = getRandomMagicMaxHit(player, 280);
  1015.                         delayMagicHit(2, getMagicHit(player, damage));
  1016.                         if (!nextTarget) {
  1017.                             if (damage == -1)
  1018.                                 return false;
  1019.                             nextTarget = true;
  1020.                         }
  1021.                         return nextTarget;
  1022.  
  1023.                     }
  1024.                 });
  1025.                 return 4;
  1026.             case 27:// blood barrage
  1027.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  1028.  
  1029.                     private boolean nextTarget; // real target is first player
  1030.                                                 // on array
  1031.  
  1032.                     @Override
  1033.                     public boolean attack() {
  1034.                         mage_hit_gfx = 377;
  1035.                         base_mage_xp = 51;
  1036.                         max_poison_hit = 40;
  1037.                         int damage = getRandomMagicMaxHit(player, 290);
  1038.                         delayMagicHit(2, getMagicHit(player, damage));
  1039.                         World.sendProjectile(player, target, 390, 18, 18, 50,
  1040.                                 50, 0, 0);
  1041.                         if (!nextTarget) {
  1042.                             if (damage == -1)
  1043.                                 return false;
  1044.                             nextTarget = true;
  1045.                         }
  1046.                         return nextTarget;
  1047.  
  1048.                     }
  1049.                 });
  1050.                 return 4;
  1051.             case 23: // ice barrage
  1052.                 player.setNextAnimation(new Animation(1979));
  1053.                 playSound(171, player, target);
  1054.                 attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  1055.  
  1056.                     private boolean nextTarget; // real target is first player
  1057.                                                 // on array
  1058.  
  1059.                     @Override
  1060.                     public boolean attack() {
  1061.                         magic_sound = 168;
  1062.                         long currentTime = Utils.currentTimeMillis();
  1063.                         if (target.getSize() >= 2
  1064.                                 || target.getFreezeDelay() >= currentTime
  1065.                                 || target.getFrozenBlockedDelay() >= currentTime) {
  1066.                             mage_hit_gfx = 1677;
  1067.                         } else {
  1068.                             mage_hit_gfx = 369;
  1069.                             freeze_time = 20000;
  1070.                         }
  1071.                         base_mage_xp = 52;
  1072.                         int damage = getRandomMagicMaxHit(player, 300);
  1073.                         Hit hit = getMagicHit(player, damage);
  1074.                         delayMagicHit(Utils.getDistance(player, target) > 3 ? 4
  1075.                                 : 2, hit);
  1076.                         World.sendProjectile(player, target, 368, 60, 32, 50,
  1077.                                 50, 0, 0);
  1078.                         if (!nextTarget) {
  1079.                             if (damage == -1)
  1080.                                 return false;
  1081.                             nextTarget = true;
  1082.                         }
  1083.                         return nextTarget;
  1084.  
  1085.                     }
  1086.                 });
  1087.                 return 4;
  1088.             }
  1089.  
  1090.         }
  1091.         return -1; // stops atm
  1092.     }
  1093.  
  1094.     public interface MultiAttack {
  1095.  
  1096.         public boolean attack();
  1097.  
  1098.     }
  1099.  
  1100.     public void attackTarget(Entity[] targets, MultiAttack perform) {
  1101.         Entity realTarget = target;
  1102.         for (Entity t : targets) {
  1103.             target = t;
  1104.             if (!perform.attack())
  1105.                 break;
  1106.         }
  1107.         target = realTarget;
  1108.     }
  1109.  
  1110.     public int getRandomMagicMaxHit(Player player, int baseDamage) {
  1111.         int current = getMagicMaxHit(player, baseDamage);
  1112.         if (current <= 0) // Splash.
  1113.             return -1;
  1114.         int hit = Utils.random(current + 1);
  1115.         if (hit > 0) {
  1116.             if (target instanceof NPC) {
  1117.                 NPC n = (NPC) target;
  1118.                 if (n.getId() == 9463 && hasFireCape(player)) // ice verm
  1119.                     hit += 40;
  1120.             }
  1121.         }
  1122.         return hit;
  1123.     }
  1124.  
  1125.     /**
  1126.      * Gets the current maximum magic hit (depending if the hit was accurate or
  1127.      * not).
  1128.      *
  1129.      * @param player
  1130.      *            The player.
  1131.      * @param baseDamage
  1132.      *            The base damage of the spell.
  1133.      * @return The current maximum hit.
  1134.      */
  1135.     /*
  1136.      * public int getMagicMaxHit(Player player, int baseDamage) { //older
  1137.      * formula double effectiveAttack =
  1138.      * (Math.round((player.getSkills().getLevel(Skills.MAGIC) *
  1139.      * player.getPrayer().getMageMultiplier())) + 8) +
  1140.      * player.getCombatDefinitions
  1141.      * ().getBonuses()[CombatDefinitions.MAGIC_ATTACK]; if
  1142.      * (fullVoidEquipped(player, new int[] { 11663, 11674 })) effectiveAttack *=
  1143.      * 1.3; effectiveAttack *=
  1144.      * player.getAuraManager().getMagicAccurayMultiplier(); double totalDefence
  1145.      * = 0; if (target instanceof Player) { Player p2 = (Player) target; double
  1146.      * effectiveDefence = (Math.round(p2.getSkills().getLevel(Skills.DEFENCE) +
  1147.      * (p2.getPrayer().getDefenceMultiplier() + Utils.random(0, 14))) + 8) +
  1148.      * p2.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DEF];
  1149.      * double effectiveMagicDefence = p2.getSkills().getLevel(Skills.MAGIC) +
  1150.      * p2.getPrayer().getMageMultiplier(); effectiveMagicDefence *= 0.7;
  1151.      * effectiveDefence *= 0.3; totalDefence = Math.round(effectiveMagicDefence
  1152.      * + effectiveDefence); } else { NPC n = (NPC) target; totalDefence =
  1153.      * n.getBonuses() != null ? n.getBonuses()[CombatDefinitions.MAGIC_DEF] : 0;
  1154.      * } double attack = Math.round((effectiveAttack * (64 +
  1155.      * player.getCombatDefinitions
  1156.      * ().getBonuses()[CombatDefinitions.MAGIC_ATTACK])) / 10); double defence =
  1157.      * Math.round(((totalDefence * (64 +
  1158.      * player.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DEF]))
  1159.      * / 10)); double accuracy = 0.5; if (attack < defence) accuracy = (attack -
  1160.      * 1) / (2 * defence); else if (attack > defence) accuracy = 1 - (defence +
  1161.      * 1) / (2 * attack); if (accuracy > 0.90) accuracy = 0.90; else if
  1162.      * (accuracy < 0.01) accuracy = 0.01; if (accuracy < Math.random()) { return
  1163.      * 0; } max_hit = baseDamage; double boost = 1 +
  1164.      * ((player.getSkills().getLevel(Skills.MAGIC) - player
  1165.      * .getSkills().getLevelForXp(Skills.MAGIC)) * 0.03); if (boost > 1) max_hit
  1166.      * *= boost; double magicPerc =
  1167.      * player.getCombatDefinitions().getBonuses()[CombatDefinitions
  1168.      * .MAGIC_DAMAGE]; if (spellcasterGloves > 0) { if (baseDamage > 60 ||
  1169.      * spellcasterGloves == 28 || spellcasterGloves == 25) { magicPerc += 17; if
  1170.      * (target instanceof Player) { Player p = (Player) target;
  1171.      * p.getSkills().drainLevel(0, p.getSkills().getLevel(0) / 10);
  1172.      * p.getSkills().drainLevel(1, p.getSkills().getLevel(1) / 10);
  1173.      * p.getSkills().drainLevel(2, p.getSkills().getLevel(2) / 10);
  1174.      * p.getPackets().sendGameMessage("Your melee skills have been drained.");
  1175.      * player.getPackets().sendGameMessage("Your spell weakened your enemy."); }
  1176.      * player
  1177.      * .getPackets().sendGameMessage("Your magic surged with extra power."); } }
  1178.      * boost = magicPerc / 100 + 1; max_hit *= boost; return (int)
  1179.      * Math.floor(max_hit); }
  1180.      */
  1181.  
  1182.     /*
  1183.      * public int getMagicMaxHit(Player player, int baseDamage) { double EA =
  1184.      * (Math.round(player.getSkills().getLevel(Skills.MAGIC) *
  1185.      * player.getPrayer().getMageMultiplier()) + 8); if
  1186.      * (fullVoidEquipped(player, new int[] { 11663, 11674 })) EA *= 1.3; EA *=
  1187.      * player.getAuraManager().getMagicAccurayMultiplier(); double ED = 0, DB;
  1188.      * if (target instanceof Player) { Player p2 = (Player) target; double EMD =
  1189.      * p2.getSkills().getLevel(Skills.MAGIC) *
  1190.      * p2.getPrayer().getMageMultiplier(); if (p2.getFamiliar() != null &&
  1191.      * (p2.getFamiliar().getId() == 6870 || p2.getFamiliar().getId() == 6871))
  1192.      * EMD *= 1.05; Math.round(EMD); double ERD =
  1193.      * (Math.round(p2.getSkills().getLevel(Skills.DEFENCE) *
  1194.      * p2.getPrayer().getDefenceMultiplier()) + 8) +
  1195.      * (player.getCombatDefinitions().isDefensiveCasting() ? 3 : 0); EMD *= 0.7;
  1196.      * ERD *= 0.3; ED = (EMD + ERD); DB =
  1197.      * p2.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DEF]; }
  1198.      * else { NPC n = (NPC) target; DB = ED = n.getBonuses() != null ?
  1199.      * n.getBonuses()[CombatDefinitions.MAGIC_DEF] : 0; } double A = (EA * (64 +
  1200.      * player
  1201.      * .getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_ATTACK])) /
  1202.      * 10; double D = (ED * (64 + DB)) / 10; double accuracy = 0.05; //so a
  1203.      * level 3 can hit a level 138 if (A < D) accuracy = (A-1) / (2 * D); else
  1204.      * if (A > D) accuracy = 1 - (D + 1) / (2 * A); if (accuracy <
  1205.      * Math.random()) { return 0; } max_hit = baseDamage; double boost = 1 +
  1206.      * ((player.getSkills().getLevel(Skills.MAGIC) - player
  1207.      * .getSkills().getLevelForXp(Skills.MAGIC)) * 0.03); if (boost > 1) max_hit
  1208.      * *= boost; double magicPerc =
  1209.      * player.getCombatDefinitions().getBonuses()[CombatDefinitions
  1210.      * .MAGIC_DAMAGE]; if (spellcasterGloves > 0) { if (baseDamage > 60 ||
  1211.      * spellcasterGloves == 28 || spellcasterGloves == 25) { magicPerc += 17; if
  1212.      * (target instanceof Player) { Player p = (Player) target;
  1213.      * p.getSkills().drainLevel(0, p.getSkills().getLevel(0) / 10);
  1214.      * p.getSkills().drainLevel(1, p.getSkills().getLevel(1) / 10);
  1215.      * p.getSkills().drainLevel(2, p.getSkills().getLevel(2) / 10);
  1216.      * p.getPackets().sendGameMessage("Your melee skills have been drained.");
  1217.      * player.getPackets().sendGameMessage("Your spell weakened your enemy."); }
  1218.      * player
  1219.      * .getPackets().sendGameMessage("Your magic surged with extra power."); } }
  1220.      * boost = magicPerc / 100 + 1; max_hit *= boost; return (int)
  1221.      * Math.floor(max_hit); }
  1222.      */
  1223.  
  1224.     private int getMagicMaxHit(Player player, int baseDamage) {
  1225.         double EA = (Math.round(player.getSkills().getLevel(Skills.MAGIC)
  1226.                 * player.getPrayer().getMageMultiplier()) + 11);
  1227.         if (fullVoidEquipped(player, new int[] { 11663, 11674 }))
  1228.             EA *= 1.3;
  1229.         EA *= player.getAuraManager().getMagicAccurayMultiplier();
  1230.         double ED = 0, DB;
  1231.         if (target instanceof Player) {
  1232.             Player p2 = (Player) target;
  1233.             double EMD = ((Math.round(p2.getSkills().getLevel(Skills.MAGIC)
  1234.                     * p2.getPrayer().getMageMultiplier()) + 8) + (player
  1235.                     .getCombatDefinitions().isDefensiveCasting() ? 3 : 0));
  1236.             if (p2.getFamiliar() != null
  1237.                     && (p2.getFamiliar().getId() == 6870 || p2.getFamiliar()
  1238.                             .getId() == 6871))
  1239.                 EMD *= 1.05;
  1240.             Math.round(EMD);
  1241.             double ERD = (Math.round(p2.getSkills().getLevel(Skills.DEFENCE)
  1242.                     * p2.getPrayer().getDefenceMultiplier()) + 8);
  1243.             EMD *= 0.7;
  1244.             ERD *= 0.3;
  1245.             ED = (EMD + ERD);
  1246.             DB = p2.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DEF];
  1247.         } else {
  1248.             NPC n = (NPC) target;
  1249.             DB = ED = n.getBonuses() != null ? n.getBonuses()[CombatDefinitions.MAGIC_DEF] / 1.6
  1250.                     : 0;
  1251.         }
  1252.         double A = (EA
  1253.                 * (1 + player.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_ATTACK]) / 64);
  1254.         double D = (ED * (1 + DB)) / 64;
  1255.         double accuracy = 0.05; // so a level 3 can hit a level 138
  1256.         if (A < D)
  1257.             accuracy = (A - 1) / (2 * D);
  1258.         else if (A > D)
  1259.             accuracy = 1 - (D + 1) / (2 * A);
  1260.         if (accuracy < Math.random()) {
  1261.             return 0;
  1262.         }
  1263.         max_hit = baseDamage;
  1264.         double boost = 1 + ((player.getSkills().getLevel(Skills.MAGIC) - player
  1265.                 .getSkills().getLevelForXp(Skills.MAGIC)) * 0.03);
  1266.         if (boost > 1)
  1267.             max_hit *= boost;
  1268.         double magicPerc = player.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DAMAGE];
  1269.         if (spellcasterGloves > 0) {
  1270.             if (baseDamage > 60 || spellcasterGloves == 28
  1271.                     || spellcasterGloves == 25) {
  1272.                 magicPerc += 17;
  1273.                 if (target instanceof Player) {
  1274.                     Player p = (Player) target;
  1275.                     p.getSkills().drainLevel(0, p.getSkills().getLevel(0) / 10);
  1276.                     p.getSkills().drainLevel(1, p.getSkills().getLevel(1) / 10);
  1277.                     p.getSkills().drainLevel(2, p.getSkills().getLevel(2) / 10);
  1278.                     p.getPackets().sendGameMessage(
  1279.                             "Your melee skills have been drained.");
  1280.                     player.getPackets().sendGameMessage(
  1281.                             "Your spell weakened your enemy.");
  1282.                 }
  1283.                 player.getPackets().sendGameMessage(
  1284.                         "Your magic surged with extra power.");
  1285.             }
  1286.         }
  1287.         boost = magicPerc / 100 + 1;
  1288.         max_hit *= boost;
  1289.         return (int) Math.floor(max_hit);
  1290.     }
  1291.  
  1292.     /**
  1293.      * Gets the magic accuracy.
  1294.      *
  1295.      * @param e
  1296.      *            The player.
  1297.      * @param baseDamage
  1298.      *            The base damage.
  1299.      * @param extraDamage
  1300.      *            The extra damage.
  1301.      * @return The magic accuracy value.
  1302.      */
  1303.     @SuppressWarnings("unused")
  1304.     private double getMagicAccuracy(Player e, int baseDamage, int extraDamage) {
  1305.         int magicLevel = e.getSkills().getLevel(Skills.MAGIC) + 1;
  1306.         int magicBonus = e.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_ATTACK];
  1307.         if ((baseDamage << 2) < 60 && spellcasterGloves > 0
  1308.                 && spellcasterGloves != 28 && spellcasterGloves != 25) {
  1309.             magicBonus += 20;
  1310.         }
  1311.         double prayer = 1.0 * e.getPrayer().getMageMultiplier();
  1312.         double accuracy = ((magicLevel + (magicBonus * 4))) * prayer;
  1313.         accuracy += (extraDamage + baseDamage) >> 1;
  1314.         if (fullVoidEquipped(e, 11663, 11674)) {
  1315.             accuracy *= 1.106;
  1316.         }
  1317.         return accuracy < 1 ? 1 : accuracy;
  1318.     }
  1319.  
  1320.     /**
  1321.      * Gets the magic defence of an entity.
  1322.      *
  1323.      * @param e
  1324.      *            The entity.
  1325.      * @return The magic defence value.
  1326.      */
  1327.     /*
  1328.      * private double getMagicDefence(Entity e) { Player p = e instanceof Player
  1329.      * ? (Player) e : null; int style = p != null ? 0 : 1; if (p != null) { int
  1330.      * type = CombatDefinitions.getXpStyle(p.getEquipment().getWeaponId(),
  1331.      * p.getCombatDefinitions().getAttackStyle()); style += type ==
  1332.      * Skills.DEFENCE ? 3 : type == CombatDefinitions.SHARED ? 1 : 0; } double
  1333.      * defLvl = (p != null ? p.getSkills().getLevel(Skills.DEFENCE) : ((NPC)
  1334.      * e).getCombatLevel() * 0.7) * 0.3; defLvl += (p != null ?
  1335.      * p.getSkills().getLevel(Skills.MAGIC) : ((NPC) e).getCombatLevel() * 0.7)
  1336.      * * 0.7; int defBonus = p != null ?
  1337.      * p.getCombatDefinitions().getBonuses()[CombatDefinitions.MAGIC_DEF] :
  1338.      * ((NPC) e).getBonuses() != null ? ((NPC)
  1339.      * e).getBonuses()[CombatDefinitions.MAGIC_DEF] : 5; double defMult = 1.0;
  1340.      * if (p != null) { defMult += p.getPrayer().getDefenceMultiplier(); }
  1341.      * double defence = ((defLvl + (defBonus << 2)) + style) * defMult; return
  1342.      * defence < 1 ? 1 : defence; }
  1343.      */
  1344.  
  1345.     private int rangeAttack(final Player player) {
  1346.         final int weaponId = player.getEquipment().getWeaponId();
  1347.         final int attackStyle = player.getCombatDefinitions().getAttackStyle();
  1348.         int combatDelay = getRangeCombatDelay(weaponId, attackStyle);
  1349.         int soundId = getSoundId(weaponId, attackStyle);
  1350.         if (weaponId == 10034 || weaponId == 10033) {// TO add to p2p, remember
  1351.                                                         // to change the
  1352.                                                         // projectiles to -1
  1353.             attackTarget(getMultiAttackTargets(player), new MultiAttack() {
  1354.  
  1355.                 private boolean nextTarget; // real target is first player on
  1356.                                             // array
  1357.  
  1358.                 @Override
  1359.                 public boolean attack() {
  1360.                     int damage = getRandomMaxHit(player, weaponId, attackStyle,
  1361.                             true, true, weaponId == 10034 ? 1.0 : 0.8, true);
  1362.                     player.setNextAnimation(new Animation(2779));
  1363.                     World.sendProjectile(player, target,
  1364.                             weaponId == 10034 ? 909 : 908, 41, 16, 31, 35, 16,
  1365.                             0);
  1366.                     delayHit(1, weaponId, attackStyle,
  1367.                             getRangeHit(player, damage));
  1368.  
  1369.                     final int ammoId = player.getEquipment().getWeaponId();
  1370.                     player.getEquipment().removeAmmo(ammoId, -1);
  1371.                     WorldTasksManager.schedule(new WorldTask() {
  1372.                         @Override
  1373.                         public void run() {
  1374.                             target.setNextGraphics(new Graphics(739, 0, 100));// 96
  1375.                                                                                 // <<
  1376.                                                                                 // 16
  1377.                                                                                 // 2739
  1378.                         }
  1379.                     }, 1);
  1380.                     if (player.isAtMultiArea()) {
  1381.                         for (int regionId : target.getMapRegionsIds()) {
  1382.                             List<Integer> npcsIndexes = World.getRegion(
  1383.                                     regionId).getNPCsIndexes();
  1384.  
  1385.                             if (npcsIndexes != null) {
  1386.                                 for (int npcIndex : npcsIndexes) {
  1387.                                     NPC npc = World.getNPCs().get(npcIndex);
  1388.                                     if (npc == null
  1389.                                             || npc.isDead()
  1390.                                             || npc.hasFinished()
  1391.                                             || (npc.isFamiliar() && ((Familiar) npc)
  1392.                                                     .getOwner() == player)
  1393.                                             || !npc.withinDistance(target, 2)
  1394.                                             || !npc.getDefinitions()
  1395.                                                     .hasAttackOption()
  1396.                                             || !player.getControlerManager()
  1397.                                                     .canHit(npc))
  1398.                                         continue;
  1399.                                 }
  1400.                             }
  1401.                         }
  1402.                     }
  1403.                     if (!nextTarget) {
  1404.                         if (damage == -1)
  1405.                             return false;
  1406.                         nextTarget = true;
  1407.                     }
  1408.                     return nextTarget;
  1409.  
  1410.                 }
  1411.             });
  1412.             combatDelay = 3;
  1413.             return 2;
  1414.         }
  1415.         if (player.getCombatDefinitions().isUsingSpecialAttack()) {
  1416.             int specAmt = getSpecialAmmount(weaponId);
  1417.             if (specAmt == 0) {
  1418.                 player.getPackets()
  1419.                         .sendGameMessage(
  1420.                                 "This weapon has no special Attack, if you still see special bar please relogin.");
  1421.                 player.getCombatDefinitions().desecreaseSpecialAttack(0);
  1422.                 return combatDelay;
  1423.             }
  1424.             if (player.getCombatDefinitions().hasRingOfVigour())
  1425.                 specAmt *= 0.9;
  1426.             if (player.getCombatDefinitions().getSpecialAttackPercentage() < specAmt) {
  1427.                 player.getPackets().sendGameMessage(
  1428.                         "You don't have enough power left.");
  1429.                 player.getCombatDefinitions().desecreaseSpecialAttack(0);
  1430.                 return combatDelay;
  1431.             }
  1432.             int shieldId = player.getEquipment().getShieldId();
  1433.             if (shieldId == 11283 && player.DFS >= 1) {
  1434.                 player.DFS--;
  1435.                 player.out("You activate your dragonfire shield.");
  1436.                 player.setNextGraphics(new Graphics(1165));
  1437.                 player.setNextAnimation(new Animation(6696));
  1438.                 delayMagicHit(2, getMagicHit(player, Utils.random(0, 300)));
  1439.                 World.sendProjectile(player, target, 1166, 41, 16, 31, 35, 16,
  1440.                         0);
  1441.                 return combatDelay;
  1442.             } else {
  1443.                 player.out("You have no charges.");
  1444.             }
  1445.             player.getCombatDefinitions().desecreaseSpecialAttack(specAmt);
  1446.             switch (weaponId) {
  1447.             case 19149:// zamorak bow
  1448.             case 19151:
  1449.                 player.setNextAnimation(new Animation(426));
  1450.                 player.setNextGraphics(new Graphics(97));
  1451.                 World.sendProjectile(player, target, 100, 41, 16, 25, 35, 16, 0);
  1452.                 delayHit(
  1453.                         1,
  1454.                         weaponId,
  1455.                         attackStyle,
  1456.                         getRangeHit(
  1457.                                 player,
  1458.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1459.                                         true, true, 1.0, true)));
  1460.                 dropAmmo(player, 1);
  1461.                 break;
  1462.             case 19146:
  1463.             case 19148:// guthix bow
  1464.                 player.setNextAnimation(new Animation(426));
  1465.                 player.setNextGraphics(new Graphics(95));
  1466.                 World.sendProjectile(player, target, 98, 41, 16, 25, 35, 16, 0);
  1467.                 delayHit(
  1468.                         1,
  1469.                         weaponId,
  1470.                         attackStyle,
  1471.                         getRangeHit(
  1472.                                 player,
  1473.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1474.                                         true, true, 1.0, true)));
  1475.                 dropAmmo(player, 1);
  1476.                 break;
  1477.             case 19143:// saradomin bow
  1478.             case 19145:
  1479.                 player.setNextAnimation(new Animation(426));
  1480.                 player.setNextGraphics(new Graphics(96));
  1481.                 World.sendProjectile(player, target, 99, 41, 16, 25, 35, 16, 0);
  1482.                 delayHit(
  1483.                         1,
  1484.                         weaponId,
  1485.                         attackStyle,
  1486.                         getRangeHit(
  1487.                                 player,
  1488.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1489.                                         true, true, 1.0, true)));
  1490.                 dropAmmo(player, 1);
  1491.                 break;
  1492.  
  1493.             case 859: // magic longbow
  1494.             case 861: // magic shortbow
  1495.             case 10284: // Magic composite bow
  1496.             case 18332: // Magic longbow (sighted)
  1497.                 player.setNextAnimation(new Animation(1074));
  1498.                 player.setNextGraphics(new Graphics(249, 0, 100));
  1499.                 World.sendProjectile(player, target, 249, 41, 16, 31, 35, 16, 0);
  1500.                 World.sendProjectile(player, target, 249, 41, 16, 25, 35, 21, 0);
  1501.                 delayHit(
  1502.                         2,
  1503.                         weaponId,
  1504.                         attackStyle,
  1505.                         getRangeHit(
  1506.                                 player,
  1507.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1508.                                         true, true, 1.0, true)));
  1509.                 delayHit(
  1510.                         3,
  1511.                         weaponId,
  1512.                         attackStyle,
  1513.                         getRangeHit(
  1514.                                 player,
  1515.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1516.                                         true, true, 1.0, true)));
  1517.                 dropAmmo(player, 2);
  1518.                 break;
  1519.             case 15241: // Hand cannon
  1520.                 WorldTasksManager.schedule(new WorldTask() {
  1521.                     int loop = 0;
  1522.  
  1523.                     @Override
  1524.                     public void run() {
  1525.                         if ((target.isDead() || player.isDead() || loop > 1)
  1526.                                 && !World.getNPCs().contains(target)) {
  1527.                             stop();
  1528.                             return;
  1529.                         }
  1530.                         if (loop == 0) {
  1531.                             player.setNextAnimation(new Animation(12174));
  1532.                             player.setNextGraphics(new Graphics(2138));
  1533.                             World.sendProjectile(player, target, 2143, 18, 18,
  1534.                                     50, 50, 0, 0);
  1535.                             delayHit(
  1536.                                     1,
  1537.                                     weaponId,
  1538.                                     attackStyle,
  1539.                                     getRangeHit(
  1540.                                             player,
  1541.                                             getRandomMaxHit(player, weaponId,
  1542.                                                     attackStyle, true, true,
  1543.                                                     1.0, true)));
  1544.                         } else if (loop == 1) {
  1545.                             player.setNextAnimation(new Animation(12174));
  1546.                             player.setNextGraphics(new Graphics(2138));
  1547.                             World.sendProjectile(player, target, 2143, 18, 18,
  1548.                                     50, 50, 0, 0);
  1549.                             delayHit(
  1550.                                     1,
  1551.                                     weaponId,
  1552.                                     attackStyle,
  1553.                                     getRangeHit(
  1554.                                             player,
  1555.                                             getRandomMaxHit(player, weaponId,
  1556.                                                     attackStyle, true, true,
  1557.                                                     1.0, true)));
  1558.                             stop();
  1559.                         }
  1560.                         loop++;
  1561.                     }
  1562.                 }, 0, (int) 0.25);
  1563.                 combatDelay = 9;
  1564.                 break;
  1565.             case 11235: // dark bows
  1566.             case 15701:
  1567.             case 15702:
  1568.             case 15703:
  1569.             case 15704:
  1570.                 int ammoId = player.getEquipment().getAmmoId();
  1571.                 player.setNextAnimation(new Animation(getWeaponAttackEmote(
  1572.                         weaponId, attackStyle)));
  1573.                 player.setNextGraphics(new Graphics(getArrowThrowGfxId(
  1574.                         weaponId, ammoId), 0, 100));
  1575.                 if (ammoId == 11212) {
  1576.                     int damage = getRandomMaxHit(player, weaponId, attackStyle,
  1577.                             true, true, 1.5, true);
  1578.                     if (damage < 80)
  1579.                         damage = 80;
  1580.                     int damage2 = getRandomMaxHit(player, weaponId,
  1581.                             attackStyle, true, true, 1.5, true);
  1582.                     if (damage2 < 80)
  1583.                         damage2 = 80;
  1584.                     World.sendProjectile(player, target, 1099, 41, 16, 31, 35,
  1585.                             16, 0);
  1586.                     World.sendProjectile(player, target, 1099, 41, 16, 25, 35,
  1587.                             21, 0);
  1588.                     delayHit(2, weaponId, attackStyle,
  1589.                             getRangeHit(player, damage));
  1590.                     delayHit(3, weaponId, attackStyle,
  1591.                             getRangeHit(player, damage2));
  1592.                     WorldTasksManager.schedule(new WorldTask() {
  1593.                         @Override
  1594.                         public void run() {
  1595.                             target.setNextGraphics(new Graphics(1100, 0, 100));
  1596.                         }
  1597.                     }, 2);
  1598.                 } else {
  1599.                     int damage = getRandomMaxHit(player, weaponId, attackStyle,
  1600.                             true, true, 1.3, true);
  1601.                     if (damage < 50)
  1602.                         damage = 50;
  1603.                     int damage2 = getRandomMaxHit(player, weaponId,
  1604.                             attackStyle, true, true, 1.3, true);
  1605.                     if (damage2 < 50)
  1606.                         damage2 = 50;
  1607.                     World.sendProjectile(player, target, 1101, 41, 16, 31, 35,
  1608.                             16, 0);
  1609.                     World.sendProjectile(player, target, 1101, 41, 16, 25, 35,
  1610.                             21, 0);
  1611.                     delayHit(2, weaponId, attackStyle,
  1612.                             getRangeHit(player, damage));
  1613.                     delayHit(3, weaponId, attackStyle,
  1614.                             getRangeHit(player, damage2));
  1615.                 }
  1616.                 dropAmmo(player, 2);
  1617.  
  1618.                 break;
  1619.             case 14684: // zanik cbow
  1620.                 player.setNextAnimation(new Animation(getWeaponAttackEmote(
  1621.                         weaponId, attackStyle)));
  1622.                 player.setNextGraphics(new Graphics(1714));
  1623.                 World.sendProjectile(player, target, 2001, 41, 41, 41, 35, 0, 0);
  1624.                 delayHit(
  1625.                         2,
  1626.                         weaponId,
  1627.                         attackStyle,
  1628.                         getRangeHit(
  1629.                                 player,
  1630.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1631.                                         true, true, 1.0, true)
  1632.                                         + 30
  1633.                                         + Utils.getRandom(120)));
  1634.                 dropAmmo(player);
  1635.                 break;
  1636.             case 13954:// morrigan javelin
  1637.             case 12955:
  1638.             case 13956:
  1639.             case 13879:
  1640.             case 13880:
  1641.             case 13881:
  1642.             case 13882:
  1643.                 player.setNextGraphics(new Graphics(1836));
  1644.                 player.setNextAnimation(new Animation(10501));
  1645.                 World.sendProjectile(player, target, 1837, 41, 41, 41, 35, 0, 0);
  1646.                 final int hit = getRandomMaxHit(player, weaponId, attackStyle,
  1647.                         true, true, 1.0, true);
  1648.                 delayHit(2, weaponId, attackStyle, getRangeHit(player, hit));
  1649.                 if (hit > 0) {
  1650.                     final Entity finalTarget = target;
  1651.                     WorldTasksManager.schedule(new WorldTask() {
  1652.                         int damage = hit;
  1653.  
  1654.                         @Override
  1655.                         public void run() {
  1656.                             if (finalTarget.isDead()
  1657.                                     || finalTarget.hasFinished()) {
  1658.                                 stop();
  1659.                                 return;
  1660.                             }
  1661.                             if (damage > 50) {
  1662.                                 damage -= 50;
  1663.                                 finalTarget.applyHit(new Hit(player, 50,
  1664.                                         HitLook.REGULAR_DAMAGE));
  1665.                             } else {
  1666.                                 finalTarget.applyHit(new Hit(player, damage,
  1667.                                         HitLook.REGULAR_DAMAGE));
  1668.                                 stop();
  1669.                             }
  1670.                         }
  1671.                     }, 4, 2);
  1672.                 }
  1673.                 dropAmmo(player, -1);
  1674.                 break;
  1675.             case 13883:
  1676.             case 13957:// morigan thrown axe
  1677.                 player.setNextGraphics(new Graphics(1838));
  1678.                 player.setNextAnimation(new Animation(10504));
  1679.                 World.sendProjectile(player, target, 1839, 41, 41, 41, 35, 0, 0);
  1680.                 delayHit(
  1681.                         2,
  1682.                         weaponId,
  1683.                         attackStyle,
  1684.                         getRangeHit(
  1685.                                 player,
  1686.                                 getRandomMaxHit(player, weaponId, attackStyle,
  1687.                                         true, true, 1.0, true)));
  1688.                 dropAmmo(player, -1);
  1689.                 break;
  1690.             default:
  1691.                 player.getPackets()
  1692.                         .sendGameMessage(
  1693.                                 "This weapon has no special Attack, if you still see special bar please relogin.");
  1694.                 return combatDelay;
  1695.             }
  1696.         } else {
  1697.             if (weaponId != -1) {
  1698.                 String weaponName = ItemDefinitions
  1699.                         .getItemDefinitions(weaponId).getName().toLowerCase();
  1700.                 if (weaponName.contains("throwing axe")
  1701.                         || weaponName.contains("knife")
  1702.                         || weaponName.contains("dart")
  1703.                         || weaponName.contains("javelin")
  1704.                         || weaponName.contains("thrownaxe")) {
  1705.                     if (!weaponName.contains("javelin")
  1706.                             && !weaponName.contains("thrownaxe"))
  1707.                         player.setNextGraphics(new Graphics(
  1708.                                 getKnifeThrowGfxId(weaponId), 0, 100));
  1709.                     World.sendProjectile(player, target,
  1710.                             getKnifeThrowGfxId(weaponId), 41, 36, 41, 32, 15, 0);
  1711.                     int hit = getRandomMaxHit(player, weaponId, attackStyle,
  1712.                             true);
  1713.                     delayHit(1, weaponId, attackStyle, getRangeHit(player, hit));
  1714.                     checkSwiftGlovesEffect(player, 1, attackStyle, weaponId,
  1715.                             hit, getKnifeThrowGfxId(weaponId), 41, 36, 41, 32,
  1716.                             15, 0);
  1717.                     dropAmmo(player, -1);
  1718.                 } else if (weaponName.contains("crossbow")) {
  1719.                     int damage = 0;
  1720.                     int ammoId = player.getEquipment().getAmmoId();
  1721.                     if (ammoId != -1 && Utils.getRandom(10) == 5) {
  1722.                         switch (ammoId) {
  1723.                         case 9237:
  1724.                             damage = getRandomMaxHit(player, weaponId,
  1725.                                     attackStyle, true);
  1726.                             target.setNextGraphics(new Graphics(755));
  1727.                             if (target instanceof Player) {
  1728.                                 Player p2 = (Player) target;
  1729.                                 p2.stopAll();
  1730.                             } else {
  1731.                                 NPC n = (NPC) target;
  1732.                                 n.setTarget(null);
  1733.                             }
  1734.                             soundId = 2914;
  1735.                             break;
  1736.                         case 9242:
  1737.                             max_hit = Short.MAX_VALUE;
  1738.                             damage = (int) (target.getHitpoints() * 0.2);
  1739.                             target.setNextGraphics(new Graphics(754));
  1740.                             player.applyHit(new Hit(target, player
  1741.                                     .getHitpoints() > 20 ? (int) (player
  1742.                                     .getHitpoints() * 0.1) : 1,
  1743.                                     HitLook.REFLECTED_DAMAGE));
  1744.                             soundId = 2912;
  1745.                             break;
  1746.                         case 9243:
  1747.                             damage = getRandomMaxHit(player, weaponId,
  1748.                                     attackStyle, true, false, 1.15, true);
  1749.                             target.setNextGraphics(new Graphics(751));
  1750.                             soundId = 2913;
  1751.                             break;
  1752.                         case 9244:
  1753.                             damage = getRandomMaxHit(
  1754.                                     player,
  1755.                                     weaponId,
  1756.                                     attackStyle,
  1757.                                     true,
  1758.                                     false,
  1759.                                     !Combat.hasAntiDragProtection(target) ? 1.45
  1760.                                             : 1.0, true);
  1761.                             target.setNextGraphics(new Graphics(756));
  1762.                             soundId = 2915;
  1763.                             break;
  1764.                         case 9245:
  1765.                             damage = getRandomMaxHit(player, weaponId,
  1766.                                     attackStyle, true, false, 1.15, true);
  1767.                             target.setNextGraphics(new Graphics(753));
  1768.                             player.heal((int) (player.getMaxHitpoints() * 0.25));
  1769.                             soundId = 2917;
  1770.                             break;
  1771.                         default:
  1772.                             damage = getRandomMaxHit(player, weaponId,
  1773.                                     attackStyle, true);
  1774.                         }
  1775.                     } else {
  1776.                         damage = getRandomMaxHit(player, weaponId, attackStyle,
  1777.                                 true);
  1778.                         checkSwiftGlovesEffect(player, 2, attackStyle,
  1779.                                 weaponId, damage, 27, 38, 36, 41, 32, 5, 0);
  1780.                     }
  1781.                     World.sendProjectile(player, target, 27, 38, 36, 41, 32, 5,
  1782.                             0);
  1783.                     delayHit(2, weaponId, attackStyle,
  1784.                             getRangeHit(player, damage));
  1785.                     if (weaponId != 4740)
  1786.                         dropAmmo(player);
  1787.                     else
  1788.                         player.getEquipment().removeAmmo(ammoId, 1);
  1789.                 } else if (weaponId == 15241) {// handcannon
  1790.                     if (Utils.getRandom(player.getSkills().getLevel(
  1791.                             Skills.FIREMAKING) << 1) == 0) {
  1792.                         // explode
  1793.                         player.setNextGraphics(new Graphics(2140));
  1794.                         player.getEquipment().getItems().set(3, null);
  1795.                         player.getEquipment().refresh(3);
  1796.                         player.getAppearence().generateAppearenceData();
  1797.                         player.applyHit(new Hit(player,
  1798.                                 Utils.getRandom(150) + 10,
  1799.                                 HitLook.REGULAR_DAMAGE));
  1800.                         player.setNextAnimation(new Animation(12175));
  1801.                         return combatDelay;
  1802.                     } else {
  1803.                         player.setNextGraphics(new Graphics(2138));
  1804.                         World.sendProjectile(player, target, 2143, 18, 18, 60,
  1805.                                 30, 0, 0);
  1806.                         delayHit(
  1807.                                 1,
  1808.                                 weaponId,
  1809.                                 attackStyle,
  1810.                                 getRangeHit(
  1811.                                         player,
  1812.                                         getRandomMaxHit(player, weaponId,
  1813.                                                 attackStyle, true)));
  1814.                         dropAmmo(player, -2);
  1815.                     }
  1816.                 } else if (weaponName.contains("crystal bow")) {
  1817.                     player.setNextAnimation(new Animation(getWeaponAttackEmote(
  1818.                             weaponId, attackStyle)));
  1819.                     player.setNextGraphics(new Graphics(250));
  1820.                     World.sendProjectile(player, target, 249, 41, 36, 41, 35,
  1821.                             0, 0);
  1822.                     int hit = getRandomMaxHit(player, weaponId, attackStyle,
  1823.                             true);
  1824.                     delayHit(2, weaponId, attackStyle, getRangeHit(player, hit));
  1825.                     checkSwiftGlovesEffect(player, 2, attackStyle, weaponId,
  1826.                             hit, 249, 41, 36, 41, 35, 0, 0);
  1827.                 } else if (weaponId == 21365) { // Bolas
  1828.                     if (!player.isDonator() && !player.isExtremeDonator()) {
  1829.                         player.getPackets().sendGameMessage(
  1830.                                 "You have to be donator to be using Bolas.");
  1831.                         return combatDelay;
  1832.                     }
  1833.                     dropAmmo(player, -3);
  1834.                     player.setNextAnimation(new Animation(3128));
  1835.                     World.sendProjectile(player, target, 468, 41, 41, 41, 35,
  1836.                             0, 0);
  1837.                     int delay = 15000;
  1838.                     if (target instanceof Player) {
  1839.                         Player p = (Player) target;
  1840.                         Item weapon = p.getEquipment().getItem(3);
  1841.                         boolean slashBased = weapon != null;
  1842.                         if (weapon != null) {
  1843.                             int slash = p.getCombatDefinitions().getBonuses()[CombatDefinitions.SLASH_ATTACK];
  1844.                             for (int i = 0; i < 5; i++) {
  1845.                                 if (p.getCombatDefinitions().getBonuses()[i] > slash) {
  1846.                                     slashBased = false;
  1847.                                     break;
  1848.                                 }
  1849.                             }
  1850.                         }
  1851.                         if (p.getInventory().containsItem(946, 1) || slashBased) {
  1852.                             delay /= 2;
  1853.                         }
  1854.                         if (p.getPrayer().usingPrayer(0, 18)
  1855.                                 || p.getPrayer().usingPrayer(1, 8)) {
  1856.                             delay /= 2;
  1857.                         }
  1858.                         if (delay < 5000) {
  1859.                             delay = 5000;
  1860.                         }
  1861.                     }
  1862.                     long currentTime = Utils.currentTimeMillis();
  1863.                     if (getRandomMaxHit(player, weaponId, attackStyle, true) > 0
  1864.                             && target.getFrozenBlockedDelay() < currentTime) {
  1865.                         target.addFreezeDelay(delay, true);
  1866.                         WorldTasksManager.schedule(new WorldTask() {
  1867.                             @Override
  1868.                             public void run() {
  1869.                                 target.setNextGraphics(new Graphics(469, 0, 96));
  1870.                             }
  1871.                         }, 2);
  1872.                     }
  1873.                     playSound(soundId, player, target);
  1874.                     return combatDelay;
  1875.                 } else { // bow/default
  1876.                     final int ammoId = player.getEquipment().getAmmoId();
  1877.                     player.setNextGraphics(new Graphics(getArrowThrowGfxId(
  1878.                             weaponId, ammoId), 0, 100));
  1879.                     World.sendProjectile(player, target,
  1880.                             getArrowProjectileGfxId(weaponId, ammoId), 41, 36,
  1881.                             20, 35, 16, 0);
  1882.                     int hit = getRandomMaxHit(player, weaponId, attackStyle,
  1883.                             true);
  1884.                     delayHit(2, weaponId, attackStyle, getRangeHit(player, hit));
  1885.                     checkSwiftGlovesEffect(player, 2, attackStyle, weaponId,
  1886.                             hit, getArrowProjectileGfxId(weaponId, ammoId), 41,
  1887.                             36, 20, 35, 16, 0);
  1888.                     if (weaponId == 11235 || weaponId == 15701
  1889.                             || weaponId == 15702 || weaponId == 15703
  1890.                             || weaponId == 15704) { // dbows
  1891.                         World.sendProjectile(player, target,
  1892.                                 getArrowProjectileGfxId(weaponId, ammoId), 41,
  1893.                                 35, 36, 35, 21, 0);
  1894.  
  1895.                         delayHit(
  1896.                                 3,
  1897.                                 weaponId,
  1898.                                 attackStyle,
  1899.                                 getRangeHit(
  1900.                                         player,
  1901.                                         getRandomMaxHit(player, weaponId,
  1902.                                                 attackStyle, true)));
  1903.                         dropAmmo(player, 2);
  1904.                     } else {
  1905.                         if (weaponId != -1) {
  1906.                             if (!weaponName.endsWith("bow full")
  1907.                                     && !weaponName.equals("zaryte bow"))
  1908.                                 dropAmmo(player);
  1909.                         }
  1910.                     }
  1911.                 }
  1912.  
  1913.                 player.setNextAnimation(new Animation(getWeaponAttackEmote(
  1914.                         weaponId, attackStyle)));
  1915.             }
  1916.         }
  1917.         playSound(soundId, player, target);
  1918.         return combatDelay;
  1919.     }
  1920.  
  1921.     /**
  1922.      * Handles the swift gloves effect.
  1923.      *
  1924.      * @param player
  1925.      *            The player.
  1926.      * @param hitDelay
  1927.      *            The delay before hitting the target.
  1928.      * @param attackStyle
  1929.      *            The attack style used.
  1930.      * @param weaponId
  1931.      *            The weapon id.
  1932.      * @param hit
  1933.      *            The hit done.
  1934.      * @param gfxId
  1935.      *            The gfx id.
  1936.      * @param startHeight
  1937.      *            The start height of the original projectile.
  1938.      * @param endHeight
  1939.      *            The end height of the original projectile.
  1940.      * @param speed
  1941.      *            The speed of the original projectile.
  1942.      * @param delay
  1943.      *            The delay of the original projectile.
  1944.      * @param curve
  1945.      *            The curve of the original projectile.
  1946.      * @param startDistanceOffset
  1947.      *            The start distance offset of the original projectile.
  1948.      */
  1949.     private void checkSwiftGlovesEffect(Player player, int hitDelay,
  1950.             int attackStyle, int weaponId, int hit, int gfxId, int startHeight,
  1951.             int endHeight, int speed, int delay, int curve,
  1952.             int startDistanceOffset) {
  1953.         Item gloves = player.getEquipment().getItem(Equipment.SLOT_HANDS);
  1954.         if (gloves == null
  1955.                 || !gloves.getDefinitions().getName().contains("Swift glove")) {
  1956.             return;
  1957.         }
  1958.         if (hit != 0 && hit < ((max_hit / 3) * 2)
  1959.                 || new Random().nextInt(3) != 0) {
  1960.             return;
  1961.         }
  1962.         player.getPackets().sendGameMessage("You fired an extra shot.");
  1963.         World.sendProjectile(player, target, gfxId, startHeight - 5,
  1964.                 endHeight - 5, speed, delay, curve - 5 < 0 ? 0 : curve - 5,
  1965.                 startDistanceOffset);
  1966.         delayHit(
  1967.                 hitDelay,
  1968.                 weaponId,
  1969.                 attackStyle,
  1970.                 getRangeHit(player,
  1971.                         getRandomMaxHit(player, weaponId, attackStyle, true)));
  1972.         if (hit > (max_hit - 10)) {
  1973.             target.addFreezeDelay(10000, false);
  1974.             target.setNextGraphics(new Graphics(181, 0, 96));
  1975.         }
  1976.  
  1977.     }
  1978.  
  1979.     public void dropAmmo(Player player, int quantity) {
  1980.         if (quantity == -2) {
  1981.             final int ammoId = player.getEquipment().getAmmoId();
  1982.             player.getEquipment().removeAmmo(ammoId, 1);
  1983.         } else if (quantity == -1 || quantity == -3) {
  1984.             final int weaponId = player.getEquipment().getWeaponId();
  1985.             if (weaponId != -1) {
  1986.                 if ((quantity == -3 && Utils.getRandom(10) < 2)
  1987.                         || (quantity != -3 && Utils.getRandom(3) > 0)) {
  1988.                     int capeId = player.getEquipment().getCapeId();
  1989.                     if (capeId != -1
  1990.                             && ItemDefinitions.getItemDefinitions(capeId)
  1991.                                     .getName().contains("Ava's"))
  1992.                         return; // nothing happens
  1993.                 } else {
  1994.                     player.getEquipment().removeAmmo(weaponId, quantity);
  1995.                     return;
  1996.                 }
  1997.                 player.getEquipment().removeAmmo(weaponId, quantity);
  1998.             }
  1999.         } else {
  2000.             final int ammoId = player.getEquipment().getAmmoId();
  2001.             if (Utils.getRandom(3) > 0) {
  2002.                 int capeId = player.getEquipment().getCapeId();
  2003.                 if (capeId != -1
  2004.                         && ItemDefinitions.getItemDefinitions(capeId).getName()
  2005.                                 .contains("Ava's"))
  2006.                     return; // nothing happens
  2007.             } else {
  2008.                 player.getEquipment().removeAmmo(ammoId, quantity);
  2009.                 return;
  2010.             }
  2011.             if (ammoId != -1) {
  2012.                 player.getEquipment().removeAmmo(ammoId, quantity);
  2013.             }
  2014.         }
  2015.     }
  2016.  
  2017.     public void dropAmmo(Player player) {
  2018.         dropAmmo(player, 1);
  2019.     }
  2020.  
  2021.     public int getArrowThrowGfxId(int weaponId, int arrowId) {
  2022.         if (arrowId == 884) {
  2023.             return 18;
  2024.         } else if (arrowId == 886) {
  2025.             return 20;
  2026.         } else if (arrowId == 888) {
  2027.             return 21;
  2028.         } else if (arrowId == 890) {
  2029.             return 22;
  2030.         } else if (arrowId == 892)
  2031.             return 24;
  2032.         if (weaponId == 10034)
  2033.             return -1;
  2034.         if (weaponId == 10033)
  2035.             return -1;
  2036.         return 19; // bronze default
  2037.     }
  2038.  
  2039.     public int getArrowProjectileGfxId(int weaponId, int arrowId) {
  2040.         if (arrowId == 884) {
  2041.             return 9;
  2042.         } else if (arrowId == 886) {
  2043.             return 11;
  2044.         } else if (arrowId == 888) {
  2045.             return 12;
  2046.         } else if (arrowId == 890) {
  2047.             return 13;
  2048.         } else if (arrowId == 892)
  2049.             return 15;
  2050.         else if (arrowId == 11212)
  2051.             return 1120;
  2052.         else if (weaponId == 20171)
  2053.             return 1066;
  2054.         else if (weaponId == 20173)
  2055.             return 1066;
  2056.         else if (weaponId == 10034)
  2057.             return -1;
  2058.         else if (weaponId == 10033)
  2059.             return -1;
  2060.         return 10;// bronze default
  2061.     }
  2062.  
  2063.     public static int getKnifeThrowGfxId(int weaponId) {
  2064.         // knives TODO ALL
  2065.         if (weaponId == 868) {
  2066.             return 225;
  2067.         } else if (weaponId == 867) {
  2068.             return 224;
  2069.         } else if (weaponId == 866) {
  2070.             return 223;
  2071.         } else if (weaponId == 865) {
  2072.             return 221;
  2073.         } else if (weaponId == 864) {
  2074.             return 219;
  2075.         } else if (weaponId == 863) {
  2076.             return 220;
  2077.         }
  2078.         // darts
  2079.         if (weaponId == 806) {
  2080.             return 232;
  2081.         } else if (weaponId == 807) {
  2082.             return 233;
  2083.         } else if (weaponId == 808) {
  2084.             return 234;
  2085.         } else if (weaponId == 3093) {
  2086.             return 273;
  2087.         } else if (weaponId == 809) {
  2088.             return 235;
  2089.         } else if (weaponId == 810) {
  2090.             return 236;
  2091.         } else if (weaponId == 811) {
  2092.             return 237;
  2093.         } else if (weaponId == 11230) {
  2094.             return 1123;
  2095.         }
  2096.         // javelins
  2097.         if (weaponId >= 13954 && weaponId <= 13956 || weaponId >= 13879
  2098.                 && weaponId <= 13882)
  2099.             return 1837;
  2100.         // thrownaxe
  2101.         if (weaponId == 13883 || weaponId == 13957)
  2102.             return 1839;
  2103.         if (weaponId == 800)
  2104.             return 43;
  2105.         else if (weaponId == 13883 || weaponId == 13957)
  2106.             return 1839;
  2107.         else if (weaponId == 13954 || weaponId == 13955 || weaponId == 13956
  2108.                 || weaponId == 13879 || weaponId == 13880 || weaponId == 13881
  2109.                 || weaponId == 13882)
  2110.             return 1837;
  2111.         return 219;
  2112.     }
  2113.  
  2114.     @SuppressWarnings("unused")
  2115.     private int getRangeHitDelay(Player player) {
  2116.         return Utils.getDistance(player.getX(), player.getY(), target.getX(),
  2117.                 target.getY()) >= 5 ? 2 : 1;
  2118.     }
  2119.  
  2120.     private int meleeAttack(final Player player) {
  2121.         int weaponId = player.getEquipment().getWeaponId();
  2122.         int attackStyle = player.getCombatDefinitions().getAttackStyle();
  2123.         int combatDelay = getMeleeCombatDelay(player, weaponId);
  2124.         int soundId = getSoundId(weaponId, attackStyle);
  2125.         if (weaponId == -1) {
  2126.             Item gloves = player.getEquipment().getItem(Equipment.SLOT_HANDS);
  2127.             if (gloves != null
  2128.                     && gloves.getDefinitions().getName()
  2129.                             .contains("Goliath gloves")) {
  2130.                 weaponId = -2;
  2131.             }
  2132.         }
  2133.         if (player.getCombatDefinitions().isUsingSpecialAttack()) {
  2134.             if (!specialExecute(player))
  2135.                 return combatDelay;
  2136.             switch (weaponId) {
  2137.             case 15442:// whip start
  2138.             case 15443:
  2139.             case 15444:
  2140.             case 15441:
  2141.             case 4151:
  2142.             case 23691:
  2143.                 player.setNextAnimation(new Animation(11971));
  2144.                 target.setNextGraphics(new Graphics(2108, 0, 100));
  2145.                 if (target instanceof Player) {
  2146.                     Player p2 = (Player) target;
  2147.                     p2.setRunEnergy(p2.getRunEnergy() > 25 ? p2.getRunEnergy() - 25
  2148.                             : 0);
  2149.                 }
  2150.                 delayNormalHit(
  2151.                         weaponId,
  2152.                         attackStyle,
  2153.                         getMeleeHit(
  2154.                                 player,
  2155.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2156.                                         false, true, 1.2, true)));
  2157.                 break;
  2158.             case 11730: // sara sword
  2159.             case 23690:
  2160.                 player.setNextAnimation(new Animation(11993));
  2161.                 target.setNextGraphics(new Graphics(1194));
  2162.                 delayNormalHit(
  2163.                         weaponId,
  2164.                         attackStyle,
  2165.                         getMeleeHit(player, 50 + Utils.getRandom(100)),
  2166.                         getMeleeHit(
  2167.                                 player,
  2168.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2169.                                         false, true, 1.1, true)));
  2170.                 soundId = 3853;
  2171.                 break;
  2172.             case 1249:// d spear
  2173.             case 1263:
  2174.             case 3176:
  2175.             case 5716:
  2176.             case 5730:
  2177.             case 13770:
  2178.             case 11726:
  2179.             case 13454:
  2180.             case 23683:
  2181.             case 13772:
  2182.             case 13774:
  2183.             case 13776:
  2184.                 player.setNextAnimation(new Animation(12017));
  2185.                 player.stopAll();
  2186.                 target.setNextGraphics(new Graphics(80, 5, 60));
  2187.  
  2188.                 if (!target.addWalkSteps(
  2189.                         target.getX() - player.getX() + target.getX(),
  2190.                         target.getY() - player.getY() + target.getY(), 1))
  2191.                     player.setNextFaceEntity(target);
  2192.                 target.setNextFaceEntity(player);
  2193.                 WorldTasksManager.schedule(new WorldTask() {
  2194.                     @Override
  2195.                     public void run() {
  2196.                         target.setNextFaceEntity(null);
  2197.                         player.setNextFaceEntity(null);
  2198.                     }
  2199.                 });
  2200.                 if (target instanceof Player) {
  2201.                     final Player other = (Player) target;
  2202.                     other.lock();
  2203.                     other.addFoodDelay(3000);
  2204.                     other.setDisableEquip(true);
  2205.                     WorldTasksManager.schedule(new WorldTask() {
  2206.                         @Override
  2207.                         public void run() {
  2208.                             other.setDisableEquip(false);
  2209.                             other.unlock();
  2210.                         }
  2211.                     }, 5);
  2212.                 } else {
  2213.                     NPC n = (NPC) target;
  2214.                     n.setFreezeDelay(3000);
  2215.                     n.resetCombat();
  2216.                     n.setRandomWalk(false);
  2217.                 }
  2218.                 break;
  2219.             case 11698: // sgs
  2220.             case 23681:
  2221.                 player.setNextAnimation(new Animation(12019));
  2222.                 player.setNextGraphics(new Graphics(2109));
  2223.                 int sgsdamage = getRandomMaxHit(player, weaponId, attackStyle,
  2224.                         false, true, 1.1, true);
  2225.                 player.heal(sgsdamage / 2);
  2226.                 player.getPrayer().restorePrayer((sgsdamage / 4) * 10);
  2227.                 delayNormalHit(weaponId, attackStyle,
  2228.                         getMeleeHit(player, sgsdamage));
  2229.                 break;
  2230.             case 11696: // bgs
  2231.             case 23680:
  2232.                 player.setNextAnimation(new Animation(11991));
  2233.                 player.setNextGraphics(new Graphics(2114));
  2234.                 int damage = getRandomMaxHit(player, weaponId, attackStyle,
  2235.                         false, true, 1.2, true);
  2236.                 delayNormalHit(weaponId, attackStyle,
  2237.                         getMeleeHit(player, damage));
  2238.                 if (target instanceof Player) {
  2239.                     Player targetPlayer = ((Player) target);
  2240.                     int amountLeft;
  2241.                     if ((amountLeft = targetPlayer.getSkills().drainLevel(
  2242.                             Skills.DEFENCE, damage / 10)) > 0) {
  2243.                         if ((amountLeft = targetPlayer.getSkills().drainLevel(
  2244.                                 Skills.STRENGTH, amountLeft)) > 0) {
  2245.                             if ((amountLeft = targetPlayer.getSkills()
  2246.                                     .drainLevel(Skills.PRAYER, amountLeft)) > 0) {
  2247.                                 if ((amountLeft = targetPlayer.getSkills()
  2248.                                         .drainLevel(Skills.ATTACK, amountLeft)) > 0) {
  2249.                                     if ((amountLeft = targetPlayer.getSkills()
  2250.                                             .drainLevel(Skills.MAGIC,
  2251.                                                     amountLeft)) > 0) {
  2252.                                         if (targetPlayer.getSkills()
  2253.                                                 .drainLevel(Skills.RANGE,
  2254.                                                         amountLeft) > 0) {
  2255.                                             break;
  2256.                                         }
  2257.                                     }
  2258.                                 }
  2259.                             }
  2260.                         }
  2261.                     }
  2262.                 }
  2263.                 break;
  2264.             case 11694: // ags
  2265.             case 23679:
  2266.                 player.setNextAnimation(new Animation(11989));
  2267.                 player.setNextGraphics(new Graphics(2113));
  2268.                 delayNormalHit(
  2269.                         weaponId,
  2270.                         attackStyle,
  2271.                         getMeleeHit(
  2272.                                 player,
  2273.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2274.                                         false, true, 1.375, true)));
  2275.                 break;
  2276.             case 13899: // vls
  2277.             case 13901:
  2278.                 player.setNextAnimation(new Animation(10502));
  2279.                 delayNormalHit(
  2280.                         weaponId,
  2281.                         attackStyle,
  2282.                         getMeleeHit(
  2283.                                 player,
  2284.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2285.                                         false, true, 1.20, true)));
  2286.                 break;
  2287.             case 13902: // statius hammer
  2288.             case 13904:
  2289.                 player.setNextAnimation(new Animation(10505));
  2290.                 player.setNextGraphics(new Graphics(1840));
  2291.                 delayNormalHit(
  2292.                         weaponId,
  2293.                         attackStyle,
  2294.                         getMeleeHit(
  2295.                                 player,
  2296.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2297.                                         false, true, 1.25, true)));
  2298.                 break;
  2299.             case 13905: // vesta spear
  2300.             case 13907:
  2301.                 player.setNextAnimation(new Animation(10499));
  2302.                 player.setNextGraphics(new Graphics(1835));
  2303.                 delayNormalHit(
  2304.                         weaponId,
  2305.                         attackStyle,
  2306.                         getMeleeHit(
  2307.                                 player,
  2308.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2309.                                         false, true, 1.1, true)));
  2310.                 break;
  2311.             case 19784: // korasi sword
  2312.             case 18786:
  2313.                 player.setNextAnimation(new Animation(14788));
  2314.                 player.setNextGraphics(new Graphics(1729));
  2315.                 int korasiDamage = getMaxHit(player, weaponId, attackStyle,
  2316.                         false, true, 1);
  2317.                 double multiplier = 0.5 + Math.random();
  2318.                 max_hit = (int) (korasiDamage * 1.5);
  2319.                 korasiDamage *= multiplier;
  2320.                 delayNormalHit(weaponId, attackStyle,
  2321.                         getMagicHit(player, korasiDamage));
  2322.                 break;
  2323.             case 11700:
  2324.                 int zgsdamage = getRandomMaxHit(player, weaponId, attackStyle,
  2325.                         false, true, 1.0, true);
  2326.                 player.setNextAnimation(new Animation(7070));
  2327.                 player.setNextGraphics(new Graphics(1221));
  2328.                 if (zgsdamage != 0 && target.getSize() <= 1) { // freezes small
  2329.                     // npcs
  2330.                     target.setNextGraphics(new Graphics(2104));
  2331.                     target.addFreezeDelay(18000); // 18seconds
  2332.                 }
  2333.                 delayNormalHit(weaponId, attackStyle,
  2334.                         getMeleeHit(player, zgsdamage));
  2335.                 break;
  2336.             case 14484: // d claws
  2337.             case 23695:
  2338.                 player.setNextAnimation(new Animation(10961));
  2339.                 player.setNextGraphics(new Graphics(1950));
  2340.                 int[] hits = new int[] { 0, 1 };
  2341.                 int hit = getRandomMaxHit(player, weaponId, attackStyle, false,
  2342.                         true, 1.0, true);
  2343.                 if (hit > 0) {
  2344.                     hits = new int[] { hit, hit / 2, (hit / 2) / 2,
  2345.                             (hit / 2) - ((hit / 2) / 2) };
  2346.                 } else {
  2347.                     hit = getRandomMaxHit(player, weaponId, attackStyle, false,
  2348.                             true, 1.0, true);
  2349.                     if (hit > 0) {
  2350.                         hits = new int[] { 0, hit, hit / 2, hit - (hit / 2) };
  2351.                     } else {
  2352.                         hit = getRandomMaxHit(player, weaponId, attackStyle,
  2353.                                 false, true, 1.0, true);
  2354.                         if (hit > 0) {
  2355.                             hits = new int[] { 0, 0, hit / 2, (hit / 2) + 10 };
  2356.                         } else {
  2357.                             hit = getRandomMaxHit(player, weaponId,
  2358.                                     attackStyle, false, true, 1.0, true);
  2359.                             if (hit > 0) {
  2360.                                 hits = new int[] { 0, 0, 0, (int) (hit * 1.5) };
  2361.                             } else {
  2362.                                 hits = new int[] { 0, 0, 0, Utils.getRandom(7) };
  2363.                             }
  2364.                         }
  2365.                     }
  2366.                 }
  2367.                 for (int i = 0; i < hits.length; i++) {
  2368.                     if (i > 1) {
  2369.                         delayHit(1, weaponId, attackStyle,
  2370.                                 getMeleeHit(player, hits[i]));
  2371.                     } else {
  2372.                         delayNormalHit(weaponId, attackStyle,
  2373.                                 getMeleeHit(player, hits[i]));
  2374.                     }
  2375.                 }
  2376.                 break;
  2377.             case 10887: // anchor
  2378.                 player.setNextAnimation(new Animation(5870));
  2379.                 player.setNextGraphics(new Graphics(1027));
  2380.                 delayNormalHit(
  2381.                         weaponId,
  2382.                         attackStyle,
  2383.                         getMeleeHit(
  2384.                                 player,
  2385.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2386.                                         false, false, 1.0, true)));
  2387.                 break;
  2388.             case 1305: // dragon long
  2389.                 player.setNextAnimation(new Animation(12033));
  2390.                 player.setNextGraphics(new Graphics(2117));
  2391.                 delayNormalHit(
  2392.                         weaponId,
  2393.                         attackStyle,
  2394.                         getMeleeHit(
  2395.                                 player,
  2396.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2397.                                         false, true, 1.25, true)));
  2398.                 break;
  2399.             case 3204: // d hally
  2400.                 player.setNextAnimation(new Animation(1665));
  2401.                 player.setNextGraphics(new Graphics(282));
  2402.                 if (target.getSize() < 3) {// giant npcs wont get stuned cuz of
  2403.                     // a stupid hit
  2404.                     target.setNextGraphics(new Graphics(254, 0, 100));
  2405.                     target.setNextGraphics(new Graphics(80));
  2406.                 }
  2407.                 delayNormalHit(
  2408.                         weaponId,
  2409.                         attackStyle,
  2410.                         getMeleeHit(
  2411.                                 player,
  2412.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2413.                                         false, true, 1.1, true)));
  2414.                 if (target.getSize() > 1)
  2415.                     delayHit(
  2416.                             1,
  2417.                             weaponId,
  2418.                             attackStyle,
  2419.                             getMeleeHit(
  2420.                                     player,
  2421.                                     getRandomMaxHit(player, weaponId,
  2422.                                             attackStyle, false, true, 1.1, true)));
  2423.                 break;
  2424.             case 4587: // dragon sci
  2425.                 player.setNextAnimation(new Animation(12031));
  2426.                 player.setNextGraphics(new Graphics(2118));
  2427.                 Hit hit1 = getMeleeHit(
  2428.                         player,
  2429.                         getRandomMaxHit(player, weaponId, attackStyle, false,
  2430.                                 true, 1.0, true));
  2431.                 if (target instanceof Player) {
  2432.                     Player p2 = (Player) target;
  2433.                     if (hit1.getDamage() > 0)
  2434.                         p2.setPrayerDelay(5000);// 5 seconds
  2435.                 }
  2436.                 delayNormalHit(weaponId, attackStyle, hit1);
  2437.                 soundId = 2540;
  2438.                 break;
  2439.             case 1215: // dragon dagger
  2440.             case 5698: // dds
  2441.                 player.setNextAnimation(new Animation(1062));
  2442.                 player.setNextGraphics(new Graphics(252, 0, 100));
  2443.                 delayNormalHit(
  2444.                         weaponId,
  2445.                         attackStyle,
  2446.                         getMeleeHit(
  2447.                                 player,
  2448.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2449.                                         false, true, 1.15, true)),
  2450.                         getMeleeHit(
  2451.                                 player,
  2452.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2453.                                         false, true, 1.15, true)));
  2454.                 soundId = 2537;
  2455.                 break;
  2456.             case 1434: // dragon mace
  2457.                 player.setNextAnimation(new Animation(1060));
  2458.                 player.setNextGraphics(new Graphics(251));
  2459.                 delayNormalHit(
  2460.                         weaponId,
  2461.                         attackStyle,
  2462.                         getMeleeHit(
  2463.                                 player,
  2464.                                 getRandomMaxHit(player, weaponId, attackStyle,
  2465.                                         false, true, 1.45, true)));
  2466.                 soundId = 2541;
  2467.                 break;
  2468.             default:
  2469.                 player.getPackets()
  2470.                         .sendGameMessage(
  2471.                                 "This weapon has no special Attack, if you still see special bar please relogin.");
  2472.                 return combatDelay;
  2473.             }
  2474.         } else {
  2475.             if (weaponId == -2 && new Random().nextInt(25) == 0) {
  2476.                 player.setNextAnimation(new Animation(14417));
  2477.                 final int attack = attackStyle;
  2478.                 attackTarget(
  2479.                         getMultiAttackTargets(player, 5, Integer.MAX_VALUE),
  2480.                         new MultiAttack() {
  2481.  
  2482.                             private boolean nextTarget;
  2483.  
  2484.                             @Override
  2485.                             public boolean attack() {
  2486.                                 target.addFreezeDelay(10000, true);
  2487.                                 target.setNextGraphics(new Graphics(181, 0, 96));
  2488.                                 final Entity t = target;
  2489.                                 WorldTasksManager.schedule(new WorldTask() {
  2490.                                     @Override
  2491.                                     public void run() {
  2492.                                         final int damage = getRandomMaxHit(
  2493.                                                 player, -2, attack, false,
  2494.                                                 false, 1.0, false);
  2495.                                         t.applyHit(new Hit(player, damage,
  2496.                                                 HitLook.REGULAR_DAMAGE));
  2497.  
  2498.                                         stop();
  2499.                                     }
  2500.                                 }, 1);
  2501.                                 if (target instanceof Player) {
  2502.                                     Player p = (Player) target;
  2503.                                     for (int i = 0; i < 7; i++) {
  2504.                                         if (i != 3 && i != 5) {
  2505.                                             p.getSkills().drainLevel(i, 7);
  2506.                                         }
  2507.                                     }
  2508.                                     p.getPackets().sendGameMessage(
  2509.                                             "Your stats have been drained!");
  2510.                                 }
  2511.                                 if (!nextTarget) {
  2512.                                     nextTarget = true;
  2513.                                 }
  2514.                                 return nextTarget;
  2515.  
  2516.                             }
  2517.                         });
  2518.                 return combatDelay;
  2519.             }
  2520.             delayNormalHit(
  2521.                     weaponId,
  2522.                     attackStyle,
  2523.                     getMeleeHit(
  2524.                             player,
  2525.                             getRandomMaxHit(player, weaponId, attackStyle,
  2526.                                     false)));
  2527.             player.setNextAnimation(new Animation(getWeaponAttackEmote(
  2528.                     weaponId, attackStyle)));
  2529.         }
  2530.         playSound(soundId, player, target);
  2531.         return combatDelay;
  2532.     }
  2533.  
  2534.     public void playSound(int soundId, Player player, Entity target) {
  2535.         if (soundId == -1)
  2536.             return;
  2537.         player.getPackets().sendSound(soundId, 0, 1);
  2538.         if (target instanceof Player) {
  2539.             Player p2 = (Player) target;
  2540.             p2.getPackets().sendSound(soundId, 0, 1);
  2541.         }
  2542.     }
  2543.  
  2544.     public static int getSpecialAmmount(int weaponId) {
  2545.         switch (weaponId) {
  2546.         case 4587: // dragon sci
  2547.         case 859: // magic longbow
  2548.         case 861: // magic shortbow
  2549.         case 10284: // Magic composite bow
  2550.         case 18332: // Magic longbow (sighted)
  2551.         case 19149:// zamorak bow
  2552.         case 19151:
  2553.         case 19143:// saradomin bow
  2554.         case 19145:
  2555.         case 19146:
  2556.         case 19148:// guthix bow
  2557.             return 55;
  2558.         case 11235: // dark bows
  2559.         case 15701:
  2560.         case 15702:
  2561.         case 15703:
  2562.         case 15704:
  2563.             return 65;
  2564.         case 13899: // vls
  2565.         case 13901:
  2566.         case 1305: // dragon long
  2567.         case 1215: // dragon dagger
  2568.         case 5698: // dds
  2569.         case 1434: // dragon mace
  2570.         case 1249:// d spear
  2571.         case 1263:
  2572.         case 3176:
  2573.         case 5716:
  2574.         case 5730:
  2575.         case 13770:
  2576.         case 13772:
  2577.         case 13774:
  2578.         case 13776:
  2579.             return 25;
  2580.         case 15442:// whip start
  2581.         case 15443:
  2582.         case 15444:
  2583.         case 15441:
  2584.         case 4151:
  2585.         case 23691:
  2586.         case 11698: // sgs
  2587.         case 23681:
  2588.         case 11694: // ags
  2589.         case 23679:
  2590.         case 13902: // statius hammer
  2591.         case 13904:
  2592.         case 13905: // vesta spear
  2593.         case 13907:
  2594.         case 14484: // d claws
  2595.         case 23695:
  2596.         case 10887: // anchor
  2597.         case 3204: // d hally
  2598.         case 4153: // granite maul
  2599.         case 14684: // zanik cbow
  2600.         case 15241: // hand cannon
  2601.         case 13908:
  2602.         case 13954:// morrigan javelin
  2603.         case 13955:
  2604.         case 13956:
  2605.         case 13879:
  2606.         case 13880:
  2607.         case 13881:
  2608.         case 13882:
  2609.         case 13883:// morigan thrown axe
  2610.         case 13957:
  2611.             return 50;
  2612.         case 11730: // ss
  2613.         case 23690:
  2614.         case 11696: // bgs
  2615.         case 23680:
  2616.         case 11700: // zgs
  2617.         case 23682:
  2618.         case 35:// Excalibur
  2619.         case 8280:
  2620.         case 14632:
  2621.         case 1377:// dragon battle axe
  2622.         case 13472:
  2623.         case 15486:// staff of lights
  2624.         case 22207:
  2625.         case 22209:
  2626.         case 22211:
  2627.         case 22213:
  2628.             return 100;
  2629.         case 19784: // korasi sword
  2630.             return 60;
  2631.         default:
  2632.             return 0;
  2633.         }
  2634.     }
  2635.  
  2636.     public int getRandomMaxHit(Player player, int weaponId, int attackStyle,
  2637.             boolean ranging) {
  2638.         return getRandomMaxHit(player, weaponId, attackStyle, ranging, true,
  2639.                 1.0D, false);
  2640.     }
  2641.  
  2642.     public int getRandomMaxHit(Player player, int weaponId, int attackStyle,
  2643.             boolean ranging, boolean defenceAffects, double specMultiplier,
  2644.             boolean usingSpec) {
  2645.         max_hit = getMaxHit(player, weaponId, attackStyle, ranging, usingSpec,
  2646.                 specMultiplier);
  2647.         if (defenceAffects) {
  2648.             double att = player.getSkills().getLevel(ranging ? 4 : 0)
  2649.                     + player.getCombatDefinitions().getBonuses()[ranging ? 4
  2650.                             : CombatDefinitions.getMeleeBonusStyle(weaponId,
  2651.                                     attackStyle)];
  2652.             if (weaponId == -2) {
  2653.                 att += 82;
  2654.             }
  2655.             att *= ranging ? player.getPrayer().getRangeMultiplier() : player
  2656.                     .getPrayer().getAttackMultiplier();
  2657.             if (fullVoidEquipped(player, ranging ? (new int[] { 11664, 11675 })
  2658.                     : (new int[] { 11665, 11676 })))
  2659.                 att *= 1.1;
  2660.             if (ranging)
  2661.                 att *= player.getAuraManager().getRangeAccurayMultiplier();
  2662.             double def = 0;
  2663.             if (target instanceof Player) {
  2664.                 Player p2 = (Player) target;
  2665.                 def = (double) p2.getSkills().getLevel(Skills.DEFENCE)
  2666.                         + (2 * p2.getCombatDefinitions().getBonuses()[ranging ? 9
  2667.                                 : CombatDefinitions
  2668.                                         .getMeleeDefenceBonus(CombatDefinitions
  2669.                                                 .getMeleeBonusStyle(weaponId,
  2670.                                                         attackStyle))]);
  2671.  
  2672.                 def *= p2.getPrayer().getDefenceMultiplier();
  2673.                 if (!ranging) {
  2674.                     if (p2.getFamiliar() instanceof Steeltitan)
  2675.                         def *= 1.15;
  2676.                 }
  2677.             } else {
  2678.                 NPC n = (NPC) target;
  2679.                 def = n.getBonuses() != null ? n.getBonuses()[ranging ? 9
  2680.                         : CombatDefinitions
  2681.                                 .getMeleeDefenceBonus(CombatDefinitions
  2682.                                         .getMeleeBonusStyle(weaponId,
  2683.                                                 attackStyle))] : 0;
  2684.                 def *= 2;
  2685.                 if (n.getId() == 1160 && fullVeracsEquipped(player))
  2686.                     def *= 0.6;
  2687.             }
  2688.             if (usingSpec) {
  2689.                 double multiplier = /* 0.25 + */getSpecialAccuracyModifier(player);
  2690.                 att *= multiplier;
  2691.             }
  2692.             if (def < 0) {
  2693.                 def = -def;
  2694.                 att += def;
  2695.             }
  2696.             double prob = att / def;
  2697.  
  2698.             if (prob > 0.90) // max, 90% prob hit so even lvl 138 can miss at
  2699.                 // lvl 3
  2700.                 prob = 0.90;
  2701.             else if (prob < 0.05) // minimun 5% so even lvl 3 can hit lvl 138
  2702.                 prob = 0.05;
  2703.             if (prob < Math.random())
  2704.                 return 0;
  2705.         }
  2706.         int hit = Utils.random(max_hit + 1);
  2707.         if (target instanceof NPC) {
  2708.             NPC n = (NPC) target;
  2709.             if (n.getId() == 9463 && hasFireCape(player))
  2710.                 hit += 40;
  2711.         }
  2712.         if (player.getAuraManager().usingEquilibrium()) {
  2713.             int perc25MaxHit = (int) (max_hit * 0.25);
  2714.             hit -= perc25MaxHit;
  2715.             max_hit -= perc25MaxHit;
  2716.             if (hit < 0)
  2717.                 hit = 0;
  2718.             if (hit < perc25MaxHit)
  2719.                 hit += perc25MaxHit;
  2720.  
  2721.         }
  2722.         return hit;
  2723.     }
  2724.  
  2725.     private final int getMaxHit(Player player, int weaponId, int attackStyle,
  2726.             boolean ranging, boolean usingSpec, double specMultiplier) {
  2727.         if (!ranging) {
  2728.  
  2729.             /*
  2730.              * //whip hiting 450 no pot no pray? lmao nty int strLvl =
  2731.              * player.getSkills().getLevel(Skills.STRENGTH); int strBonus =
  2732.              * player
  2733.              * .getCombatDefinitions().getBonuses()[CombatDefinitions.STRENGTH_BONUS
  2734.              * ]; double strMult = player.getPrayer().getStrengthMultiplier();
  2735.              * double xpStyle = CombatDefinitions.getXpStyle(weaponId,
  2736.              * attackStyle); double style = xpStyle == Skills.STRENGTH ? 3 :
  2737.              * xpStyle == CombatDefinitions.SHARED ? 1 : 0; int dhp = 0; double
  2738.              * dharokMod = 1.0; double hitMultiplier = 1.0; if
  2739.              * (fullDharokEquipped(player)) { dhp = player.getMaxHitpoints() -
  2740.              * player.getHitpoints(); dharokMod = (dhp * 0.001) + 1; } if
  2741.              * (fullVoidEquipped(player, 11665, 11676)) { hitMultiplier *= 1.1;
  2742.              * } hitMultiplier *= specMultiplier; double cumulativeStr = (strLvl
  2743.              * * strMult + style) * dharokMod; return (int) ((14 + cumulativeStr
  2744.              * + (strBonus / 8) + ((cumulativeStr * strBonus) / 64)) *
  2745.              * hitMultiplier);
  2746.              */
  2747.  
  2748.             double strengthLvl = player.getSkills().getLevel(Skills.STRENGTH);
  2749.             int xpStyle = CombatDefinitions.getXpStyle(weaponId, attackStyle);
  2750.             double styleBonus = xpStyle == Skills.STRENGTH ? 3
  2751.                     : xpStyle == CombatDefinitions.SHARED ? 1 : 0;
  2752.             double otherBonus = 1;
  2753.             if (fullDharokEquipped(player)) {
  2754.                 double hp = player.getHitpoints();
  2755.                 double maxhp = player.getMaxHitpoints();
  2756.                 double d = hp / maxhp;
  2757.                 otherBonus = 2 - d;
  2758.             }
  2759.             double effectiveStrength = 8 + Math.floor((strengthLvl * player
  2760.                     .getPrayer().getStrengthMultiplier()) + styleBonus);
  2761.             if (fullVoidEquipped(player, 11665, 11676))
  2762.                 effectiveStrength = Math.floor(effectiveStrength * 1.1);
  2763.             double strengthBonus = player.getCombatDefinitions().getBonuses()[CombatDefinitions.STRENGTH_BONUS];
  2764.             if (weaponId == -2) {
  2765.                 strengthBonus += 82;
  2766.             }
  2767.             double baseDamage = 5 + effectiveStrength
  2768.                     * (1 + (strengthBonus / 64));
  2769.             return (int) Math.floor(baseDamage * specMultiplier * otherBonus);
  2770.         } else {
  2771.             if (weaponId == 24338 && target instanceof Player) {
  2772.                 player.getPackets()
  2773.                         .sendGameMessage(
  2774.                                 "The royal crossbow feels weak and unresponsive against other players.");
  2775.                 return 60;
  2776.             }
  2777.             double rangedLvl = player.getSkills().getLevel(Skills.RANGE);
  2778.             double styleBonus = attackStyle == 0 ? 3 : attackStyle == 1 ? 0 : 1;
  2779.             double effectiveStrenght = Math.floor(rangedLvl
  2780.                     * player.getPrayer().getRangeMultiplier())
  2781.                     + styleBonus;
  2782.  
  2783.             if (fullVoidEquipped(player, 11664, 11675))
  2784.                 effectiveStrenght += Math.floor((player.getSkills()
  2785.                         .getLevelForXp(Skills.RANGE) / 5) + 1.6);
  2786.             double strengthBonus = player.getCombatDefinitions().getBonuses()[CombatDefinitions.RANGED_STR_BONUS];
  2787.             double baseDamage = 5 + (((effectiveStrenght + 8) * (strengthBonus + 64)) / 64);
  2788.             return (int) Math.floor(baseDamage * specMultiplier);
  2789.         }
  2790.     }
  2791.  
  2792.     /*
  2793.      * public int getRandomMaxHit(Player player, int weaponId, int attackStyle,
  2794.      * boolean ranging, boolean defenceAffects, double specMultiplier, boolean
  2795.      * usingSpec) { Random r = new Random(); max_hit = getMaxHit(player,
  2796.      * weaponId, attackStyle, ranging, usingSpec, specMultiplier); double
  2797.      * accuracyMultiplier = 1.0; if (defenceAffects) { accuracyMultiplier =
  2798.      * getSpecialAccuracyModifier(player); } if (ranging && defenceAffects) {
  2799.      * double accuracy = accuracyMultiplier * getRangeAccuracy(player,
  2800.      * attackStyle) + 1; double defence = getRangeDefence(target) + 1; if
  2801.      * (r.nextInt((int) accuracy) < r.nextInt((int) defence)) { return 0; } }
  2802.      * else if (defenceAffects) { double accuracy = accuracyMultiplier *
  2803.      * getMeleeAccuracy(player, attackStyle, weaponId) + 1; double defence =
  2804.      * getMeleeDefence(target, attackStyle, weaponId) + 1; if (r.nextInt((int)
  2805.      * accuracy) < r.nextInt((int) defence)) { return 0; } } int hit =
  2806.      * r.nextInt(max_hit + 1); if (target instanceof NPC) { NPC n = (NPC)
  2807.      * target; if (n.getId() == 9463 && hasFireCape(player)) hit += 40; } if
  2808.      * (player.getAuraManager().usingEquilibrium()) { int perc25MaxHit = (int)
  2809.      * (max_hit * 0.25); hit -= perc25MaxHit; max_hit -= perc25MaxHit; if (hit <
  2810.      * 0) hit = 0; if (hit < perc25MaxHit) hit += perc25MaxHit;
  2811.      *
  2812.      * } return hit; }
  2813.      *
  2814.      * /** Gets the melee accuracy of the player.
  2815.      *
  2816.      * @param e The player.
  2817.      *
  2818.      * @param attackStyle The attack style.
  2819.      *
  2820.      * @param weaponId The weapon id.
  2821.      *
  2822.      * @return The melee accuracy.
  2823.      */
  2824.     /*
  2825.      * public static double getMeleeAccuracy(Player e, int attackStyle, int
  2826.      * weaponId) { int style = attackStyle == 0 ? 3 : attackStyle == 2 ? 1 : 0;
  2827.      * int attLvl = e.getSkills().getLevel(Skills.ATTACK); int attBonus =
  2828.      * e.getCombatDefinitions
  2829.      * ().getBonuses()[CombatDefinitions.getMeleeBonusStyle(weaponId,
  2830.      * attackStyle)]; if (weaponId == -2) { attBonus += 82; } double attMult =
  2831.      * 1.0 * e.getPrayer().getAttackMultiplier(); double accuracyMultiplier =
  2832.      * 1.0; if (fullVoidEquipped(e, 11665, 11676)) { accuracyMultiplier *= 0.15;
  2833.      * } double cumulativeAtt = attLvl * attMult + style; return (14 +
  2834.      * cumulativeAtt + (attBonus / 8) + ((cumulativeAtt * attBonus) / 64)) *
  2835.      * accuracyMultiplier; }
  2836.      *
  2837.      * /** Gets the maximum melee hit.
  2838.      *
  2839.      * @param e The player.
  2840.      *
  2841.      * @param attackStyle The attack style.
  2842.      *
  2843.      * @param weaponId The weapon id.
  2844.      *
  2845.      * @return The maximum melee hit.
  2846.      */
  2847.     /*
  2848.      * public static double getMeleeMaximum(Player e, int attackStyle, int
  2849.      * weaponId) { int strLvl = e.getSkills().getLevel(Skills.STRENGTH); int
  2850.      * strBonus =
  2851.      * e.getCombatDefinitions().getBonuses()[CombatDefinitions.STRENGTH_BONUS];
  2852.      * if (weaponId == -2) { strBonus += 82; } double strMult =
  2853.      * e.getPrayer().getStrengthMultiplier(); double xpStyle =
  2854.      * CombatDefinitions.getXpStyle(weaponId, attackStyle); double style =
  2855.      * xpStyle == Skills.STRENGTH ? 3 : xpStyle == CombatDefinitions.SHARED ? 1
  2856.      * : 0; int dhp = 0; double dharokMod = 1.0; double hitMultiplier = 1.0; if
  2857.      * (fullDharokEquipped(e)) { dhp = e.getMaxHitpoints() - e.getHitpoints();
  2858.      * dharokMod = (dhp * 0.001) + 1; } if (fullVoidEquipped(e, 11665, 11676)) {
  2859.      * hitMultiplier *= 1.1; } double cumulativeStr = (strLvl * strMult + style)
  2860.      * * dharokMod; return (int) ((14 + cumulativeStr + (strBonus / 8) +
  2861.      * ((cumulativeStr * strBonus) / 64)) * hitMultiplier); }
  2862.      *
  2863.      * /** Gets the melee defence.
  2864.      *
  2865.      * @param e The entity.
  2866.      *
  2867.      * @param attackStyle The attack style.
  2868.      *
  2869.      * @param weaponId The weapon id.
  2870.      *
  2871.      * @return The maximum melee defence.
  2872.      */
  2873.     /*
  2874.      * public static double getMeleeDefence(Entity e, int attackStyle, int
  2875.      * weaponId) { boolean player = e instanceof Player; int style = player ?
  2876.      * ((Player) e).getCombatDefinitions().getAttackStyle() : 0; style = style
  2877.      * == 2 ? 1 : style == 3 ? 3 : 0; int defLvl = player ? ((Player)
  2878.      * e).getSkills().getLevel(Skills.DEFENCE) : (int) (((NPC)
  2879.      * e).getCombatLevel() * 0.6); int defBonus = player ? ((Player)
  2880.      * e).getCombatDefinitions().getBonuses()[
  2881.      * CombatDefinitions.getMeleeDefenceBonus
  2882.      * (CombatDefinitions.getMeleeBonusStyle(weaponId, attackStyle))] : 0; if
  2883.      * (!player) { defBonus = ((NPC) e).getBonuses() != null ? ((NPC)
  2884.      * e).getBonuses()[
  2885.      * CombatDefinitions.getMeleeDefenceBonus(CombatDefinitions.
  2886.      * getMeleeBonusStyle(weaponId, attackStyle))] : 0; } double defMult = 1.0 *
  2887.      * (player ? ((Player) e).getPrayer().getDefenceMultiplier() : 1.0); double
  2888.      * cumulativeDef = defLvl * defMult + style; return 14 + cumulativeDef +
  2889.      * (defBonus / 8) + ((cumulativeDef * (defBonus)) / 64); }
  2890.      *
  2891.      * /** Gets the range accuracy of the player.
  2892.      *
  2893.      * @param e The player.
  2894.      *
  2895.      * @param attackStyle The attack style.
  2896.      *
  2897.      * @return The range accuracy.
  2898.      */
  2899.     /*
  2900.      * public static double getRangeAccuracy(Player e, int attackStyle) { int
  2901.      * style = attackStyle == 0 ? 3 : attackStyle == 2 ? 1 : 0; int attLvl =
  2902.      * e.getSkills().getLevel(Skills.RANGE); int attBonus =
  2903.      * e.getCombatDefinitions().getBonuses()[4]; double attMult = 1.0 *
  2904.      * e.getPrayer().getRangeMultiplier() *
  2905.      * e.getAuraManager().getRangeAccurayMultiplier(); double accuracyMultiplier
  2906.      * = 1.05; if (fullVoidEquipped(e, 11664, 11675)) { accuracyMultiplier +=
  2907.      * 0.10; } double cumulativeAtt = attLvl * attMult + style; return (14 +
  2908.      * cumulativeAtt + (attBonus / 8) + ((cumulativeAtt * attBonus) / 64)) *
  2909.      * accuracyMultiplier; }
  2910.      *
  2911.      * /** Gets the maximum range hit.
  2912.      *
  2913.      * @param e The player.
  2914.      *
  2915.      * @param attackStyle The attack style.
  2916.      *
  2917.      * @return The maximum range hit.
  2918.      */
  2919.     /*
  2920.      * public static double getRangeMaximum(Player e, int attackStyle) { int
  2921.      * style = attackStyle == 0 ? 3 : attackStyle == 2 ? 1 : 0; int strLvl =
  2922.      * e.getSkills().getLevel(Skills.RANGE); int strBonus =
  2923.      * e.getCombatDefinitions
  2924.      * ().getBonuses()[CombatDefinitions.RANGED_STR_BONUS]; double strMult = 1.0
  2925.      * * e.getPrayer().getRangeMultiplier(); double hitMultiplier = 1.0; if
  2926.      * (fullVoidEquipped(e, 11664, 11675)) { hitMultiplier += 0.1; } double
  2927.      * cumulativeStr = strLvl * strMult + style; return (14 + cumulativeStr +
  2928.      * (strBonus / 8) + ((cumulativeStr * strBonus) / 64)) * hitMultiplier; }
  2929.      *
  2930.      * /** Gets the range defence.
  2931.      *
  2932.      * @param e The entity.
  2933.      *
  2934.      * @return The maximum range defence.
  2935.      */
  2936.     /*
  2937.      * public static double getRangeDefence(Entity e) { boolean player = e
  2938.      * instanceof Player; int style = player ? ((Player)
  2939.      * e).getCombatDefinitions().getAttackStyle() : 0; style = style == 2 ? 1 :
  2940.      * style == 3 ? 3 : 0; int defLvl = player ? ((Player)
  2941.      * e).getSkills().getLevel(Skills.DEFENCE) : (int) (((NPC)
  2942.      * e).getCombatLevel() * 0.6); int defBonus = player ? ((Player)
  2943.      * e).getCombatDefinitions().getBonuses()[CombatDefinitions.RANGE_DEF] : 0;
  2944.      * if (!player) { defBonus = ((NPC) e).getBonuses() != null ? ((NPC)
  2945.      * e).getBonuses()[9] : 0; } double defMult = 1.0 * (player ? ((Player)
  2946.      * e).getPrayer().getDefenceMultiplier() : 1.0); double cumulativeDef =
  2947.      * defLvl * defMult + style; return 14 + cumulativeDef + (defBonus / 8) +
  2948.      * ((cumulativeDef * defBonus) / 64); }
  2949.      */
  2950.  
  2951.     private double getSpecialAccuracyModifier(Player player) {
  2952.         Item weapon = player.getEquipment().getItem(Equipment.SLOT_WEAPON);
  2953.         if (weapon == null)
  2954.             return 1;
  2955.         String name = weapon.getDefinitions().getName().toLowerCase();
  2956.         if (name.contains("whip") || name.contains("dragon longsword")
  2957.                 || name.contains("dragon scimitar")
  2958.                 || name.contains("dragon dagger"))
  2959.             return 1.1;
  2960.         if (name.contains("anchor") || name.contains("magic longbow"))
  2961.             return 2;
  2962.         if (name.contains("dragon claws") || name.contains("armadyl godsword"))
  2963.             return 2;
  2964.         return 1;
  2965.     }
  2966.  
  2967.     public boolean hasFireCape(Player player) {
  2968.         int capeId = player.getEquipment().getCapeId();
  2969.         return capeId == 6570 || capeId == 20769 || capeId == 20771;
  2970.     }
  2971.  
  2972.     /*
  2973.      * public static final int getMaxHit(Player player, int weaponId, int
  2974.      * attackStyle, boolean ranging, boolean usingSpec, double specMultiplier) {
  2975.      * if (ranging) { return (int) (getRangeMaximum(player, attackStyle) *
  2976.      * specMultiplier); } return (int) (getMeleeMaximum(player, weaponId,
  2977.      * attackStyle) * specMultiplier); }
  2978.      */
  2979.  
  2980.     public static final boolean fullVanguardEquipped(Player player) {
  2981.         int helmId = player.getEquipment().getHatId();
  2982.         int chestId = player.getEquipment().getChestId();
  2983.         int legsId = player.getEquipment().getLegsId();
  2984.         int weaponId = player.getEquipment().getWeaponId();
  2985.         int bootsId = player.getEquipment().getBootsId();
  2986.         int glovesId = player.getEquipment().getGlovesId();
  2987.         if (helmId == -1 || chestId == -1 || legsId == -1 || weaponId == -1
  2988.                 || bootsId == -1 || glovesId == -1)
  2989.             return false;
  2990.         return ItemDefinitions.getItemDefinitions(helmId).getName()
  2991.                 .contains("Vanguard")
  2992.                 && ItemDefinitions.getItemDefinitions(chestId).getName()
  2993.                         .contains("Vanguard")
  2994.                 && ItemDefinitions.getItemDefinitions(legsId).getName()
  2995.                         .contains("Vanguard")
  2996.                 && ItemDefinitions.getItemDefinitions(weaponId).getName()
  2997.                         .contains("Vanguard")
  2998.                 && ItemDefinitions.getItemDefinitions(bootsId).getName()
  2999.                         .contains("Vanguard")
  3000.                 && ItemDefinitions.getItemDefinitions(glovesId).getName()
  3001.                         .contains("Vanguard");
  3002.     }
  3003.  
  3004.     public static final boolean usingGoliathGloves(Player player) {
  3005.         String name = player.getEquipment().getItem(Equipment.SLOT_SHIELD) != null ? player
  3006.                 .getEquipment().getItem(Equipment.SLOT_SHIELD).getDefinitions()
  3007.                 .getName().toLowerCase()
  3008.                 : "";
  3009.         if (player.getEquipment().getItem((Equipment.SLOT_HANDS)) != null) {
  3010.             if (player.getEquipment().getItem(Equipment.SLOT_HANDS)
  3011.                     .getDefinitions().getName().toLowerCase()
  3012.                     .contains("goliath")
  3013.                     && player.getEquipment().getWeaponId() == -1) {
  3014.                 if (name.contains("defender")
  3015.                         && name.contains("dragonfire shield"))
  3016.                     return true;
  3017.                 return true;
  3018.             }
  3019.         }
  3020.         return false;
  3021.     }
  3022.  
  3023.     public static final boolean fullVeracsEquipped(Player player) {
  3024.         int helmId = player.getEquipment().getHatId();
  3025.         int chestId = player.getEquipment().getChestId();
  3026.         int legsId = player.getEquipment().getLegsId();
  3027.         int weaponId = player.getEquipment().getWeaponId();
  3028.         if (helmId == -1 || chestId == -1 || legsId == -1 || weaponId == -1)
  3029.             return false;
  3030.         return ItemDefinitions.getItemDefinitions(helmId).getName()
  3031.                 .contains("Verac's")
  3032.                 && ItemDefinitions.getItemDefinitions(chestId).getName()
  3033.                         .contains("Verac's")
  3034.                 && ItemDefinitions.getItemDefinitions(legsId).getName()
  3035.                         .contains("Verac's")
  3036.                 && ItemDefinitions.getItemDefinitions(weaponId).getName()
  3037.                         .contains("Verac's");
  3038.     }
  3039.  
  3040.     public static final boolean fullDharokEquipped(Player player) {
  3041.         int helmId = player.getEquipment().getHatId();
  3042.         int chestId = player.getEquipment().getChestId();
  3043.         int legsId = player.getEquipment().getLegsId();
  3044.         int weaponId = player.getEquipment().getWeaponId();
  3045.         if (helmId == -1 || chestId == -1 || legsId == -1 || weaponId == -1)
  3046.             return false;
  3047.         return ItemDefinitions.getItemDefinitions(helmId).getName()
  3048.                 .contains("Dharok's")
  3049.                 && ItemDefinitions.getItemDefinitions(chestId).getName()
  3050.                         .contains("Dharok's")
  3051.                 && ItemDefinitions.getItemDefinitions(legsId).getName()
  3052.                         .contains("Dharok's")
  3053.                 && ItemDefinitions.getItemDefinitions(weaponId).getName()
  3054.                         .contains("Dharok's");
  3055.     }
  3056.  
  3057.     public static final boolean fullVoidEquipped(Player player, int... helmid) {
  3058.         boolean hasDeflector = player.getEquipment().getShieldId() == 19712;
  3059.         if (player.getEquipment().getGlovesId() != 8842) {
  3060.             if (hasDeflector)
  3061.                 hasDeflector = false;
  3062.             else
  3063.                 return false;
  3064.         }
  3065.         int legsId = player.getEquipment().getLegsId();
  3066.         boolean hasLegs = legsId != -1
  3067.                 && (legsId == 8840 || legsId == 19786 || legsId == 19788 || legsId == 19790);
  3068.         if (!hasLegs) {
  3069.             if (hasDeflector)
  3070.                 hasDeflector = false;
  3071.             else
  3072.                 return false;
  3073.         }
  3074.         int torsoId = player.getEquipment().getChestId();
  3075.         boolean hasTorso = torsoId != -1
  3076.                 && (torsoId == 8839 || torsoId == 10611 || torsoId == 19785
  3077.                         || torsoId == 19787 || torsoId == 19789);
  3078.         if (!hasTorso) {
  3079.             if (hasDeflector)
  3080.                 hasDeflector = false;
  3081.             else
  3082.                 return false;
  3083.         }
  3084.         if (hasDeflector)
  3085.             return true;
  3086.         int helmId = player.getEquipment().getHatId();
  3087.         if (helmId == -1)
  3088.             return false;
  3089.         boolean hasHelm = false;
  3090.         for (int id : helmid) {
  3091.             if (helmId == id) {
  3092.                 hasHelm = true;
  3093.                 break;
  3094.             }
  3095.         }
  3096.         if (!hasHelm)
  3097.             return false;
  3098.         return true;
  3099.     }
  3100.  
  3101.     public void delayNormalHit(int weaponId, int attackStyle, Hit... hits) {
  3102.         delayHit(0, weaponId, attackStyle, hits);
  3103.     }
  3104.  
  3105.     public Hit getMeleeHit(Player player, int damage) {
  3106.         return new Hit(player, damage, HitLook.MELEE_DAMAGE);
  3107.     }
  3108.  
  3109.     public Hit getRangeHit(Player player, int damage) {
  3110.         return new Hit(player, damage, HitLook.RANGE_DAMAGE);
  3111.     }
  3112.  
  3113.     public Hit getMagicHit(Player player, int damage) {
  3114.         return new Hit(player, damage, HitLook.MAGIC_DAMAGE);
  3115.     }
  3116.  
  3117.     private void delayMagicHit(int delay, final Hit... hits) {
  3118.         delayHit(delay, -1, -1, hits);
  3119.     }
  3120.  
  3121.     public void resetVariables() {
  3122.         base_mage_xp = 0;
  3123.         mage_hit_gfx = 0;
  3124.         magic_sound = 0;
  3125.         max_poison_hit = 0;
  3126.         freeze_time = 0;
  3127.         reduceAttack = false;
  3128.         blood_spell = false;
  3129.         block_tele = false;
  3130.     }
  3131.  
  3132.     private void delayHit(int delay, final int weaponId, final int attackStyle,
  3133.             final Hit... hits) {
  3134.         addAttackedByDelay(hits[0].getSource());
  3135.  
  3136.         final Entity target = this.target;
  3137.         final int max_hit = this.max_hit;
  3138.         final double base_mage_xp = this.base_mage_xp;
  3139.         final int mage_hit_gfx = this.mage_hit_gfx;
  3140.         final int magic_sound = this.magic_sound;
  3141.         final int max_poison_hit = this.max_poison_hit;
  3142.         final int freeze_time = this.freeze_time;
  3143.         @SuppressWarnings("unused")
  3144.         final boolean reduceAttack = this.reduceAttack;
  3145.         final boolean blood_spell = this.blood_spell;
  3146.         final boolean block_tele = this.block_tele;
  3147.         resetVariables();
  3148.  
  3149.         for (Hit hit : hits) {
  3150.             Player player = (Player) hit.getSource();
  3151.             if (target instanceof Player) {
  3152.                 Player p2 = (Player) target;
  3153.                 if (player.getPrayer().usingPrayer(1, 18))
  3154.                     p2.sendSoulSplit(hit, player);
  3155.             }
  3156.             int damage = hit.getDamage() > target.getHitpoints() ? target
  3157.                     .getHitpoints() : hit.getDamage();
  3158.             if (hit.getLook() == HitLook.RANGE_DAMAGE
  3159.                     || hit.getLook() == HitLook.MELEE_DAMAGE) {
  3160.                 double combatXp = damage / 2.5;
  3161.                 if (combatXp > 0) {
  3162.                     player.getAuraManager().checkSuccefulHits(hit.getDamage());
  3163.                     if (hit.getLook() == HitLook.RANGE_DAMAGE) {
  3164.                         if (attackStyle == 2) {
  3165.                             player.getSkills()
  3166.                                     .addXp(Skills.RANGE, combatXp / 2);
  3167.                             player.getSkills().addXp(Skills.DEFENCE,
  3168.                                     combatXp / 2);
  3169.                         } else
  3170.                             player.getSkills().addXp(Skills.RANGE, combatXp);
  3171.  
  3172.                     } else {
  3173.                         int xpStyle = CombatDefinitions.getXpStyle(weaponId,
  3174.                                 attackStyle);
  3175.                         if (xpStyle != CombatDefinitions.SHARED)
  3176.                             player.getSkills().addXp(xpStyle, combatXp);
  3177.                         else {
  3178.                             player.getSkills().addXp(Skills.ATTACK,
  3179.                                     combatXp / 3);
  3180.                             player.getSkills().addXp(Skills.STRENGTH,
  3181.                                     combatXp / 3);
  3182.                             player.getSkills().addXp(Skills.DEFENCE,
  3183.                                     combatXp / 3);
  3184.                         }
  3185.                     }
  3186.                     double hpXp = damage / 7.5;
  3187.                     if (hpXp > 0)
  3188.                         player.getSkills().addXp(Skills.HITPOINTS, hpXp);
  3189.                 }
  3190.             } else if (hit.getLook() == HitLook.MAGIC_DAMAGE) {
  3191.                 if (mage_hit_gfx != 0 && damage > 0) {
  3192.                     if (freeze_time > 0) {
  3193.                         target.addFreezeDelay(freeze_time, freeze_time == 0);
  3194.                         if (freeze_time > 0)
  3195.                             if (target instanceof Player) {
  3196.                                 ((Player) target).stopAll(false);
  3197.                             }
  3198.                         target.addFrozenBlockedDelay(freeze_time + (4 * 1000));// four
  3199.                                                                                 // seconds
  3200.                                                                                 // of
  3201.                                                                                 // no
  3202.                                                                                 // freeze
  3203.                     }
  3204.                 } else if (damage < 0) {
  3205.                     damage = 0;
  3206.                 }
  3207.                 double combatXp = base_mage_xp * 1 + (damage / 5);
  3208.  
  3209.                 if (combatXp > 0) {
  3210.                     player.getAuraManager().checkSuccefulHits(hit.getDamage());
  3211.                     if (player.getCombatDefinitions().isDefensiveCasting()
  3212.                             || (hasPolyporeStaff(player) && player
  3213.                                     .getCombatDefinitions().getAttackStyle() == 1)) {
  3214.                         int defenceXp = (int) (damage / 7.5);
  3215.                         if (defenceXp > 0) {
  3216.                             combatXp -= defenceXp;
  3217.                             player.getSkills().addXp(Skills.DEFENCE,
  3218.                                     defenceXp / 7.5);
  3219.                         }
  3220.                     }
  3221.                     player.getSkills().addXp(Skills.MAGIC, combatXp);
  3222.                     double hpXp = damage / 7.5;
  3223.                     if (hpXp > 0)
  3224.                         player.getSkills().addXp(Skills.HITPOINTS, hpXp);
  3225.                 }
  3226.             }
  3227.         }
  3228.  
  3229.         WorldTasksManager.schedule(new WorldTask() {
  3230.  
  3231.             @Override
  3232.             public void run() {
  3233.                 for (Hit hit : hits) {
  3234.                     boolean splash = false;
  3235.                     Player player = (Player) hit.getSource();
  3236.                     if (player.isDead() || player.hasFinished()
  3237.                             || target.isDead() || target.hasFinished())
  3238.                         return;
  3239.                     if (hit.getDamage() > -1) {
  3240.                         target.applyHit(hit); // also reduces damage if needed,
  3241.                                                 // pray
  3242.                         // and special items affect here
  3243.                     } else {
  3244.                         splash = true;
  3245.                         hit.setDamage(0);
  3246.                     }
  3247.                     doDefenceEmote();
  3248.                     int damage = hit.getDamage() > target.getHitpoints() ? target
  3249.                             .getHitpoints() : hit.getDamage();
  3250.                     if ((damage >= max_hit * 0.90)
  3251.                             && (hit.getLook() == HitLook.MAGIC_DAMAGE
  3252.                                     || hit.getLook() == HitLook.RANGE_DAMAGE || hit
  3253.                                     .getLook() == HitLook.MELEE_DAMAGE))
  3254.                         hit.setCriticalMark();
  3255.                     if (hit.getLook() == HitLook.RANGE_DAMAGE
  3256.                             || hit.getLook() == HitLook.MELEE_DAMAGE) {
  3257.                         double combatXp = damage / 2.5;
  3258.                         if (combatXp > 0) {
  3259.                             if (hit.getLook() == HitLook.RANGE_DAMAGE) {
  3260.                                 if (weaponId != -1) {
  3261.                                     String name = ItemDefinitions
  3262.                                             .getItemDefinitions(weaponId)
  3263.                                             .getName();
  3264.                                     if (name.contains("(p++)")) {
  3265.                                         if (Utils.getRandom(8) == 0)
  3266.                                             target.getPoison().makePoisoned(48);
  3267.                                     } else if (name.contains("(p+)")) {
  3268.                                         if (Utils.getRandom(8) == 0)
  3269.                                             target.getPoison().makePoisoned(38);
  3270.                                     } else if (name.contains("(p)")) {
  3271.                                         if (Utils.getRandom(8) == 0)
  3272.                                             target.getPoison().makePoisoned(28);
  3273.                                     }
  3274.                                 }
  3275.                             } else {
  3276.                                 if (weaponId != -1) {
  3277.                                     String name = ItemDefinitions
  3278.                                             .getItemDefinitions(weaponId)
  3279.                                             .getName();
  3280.                                     if (name.contains("(p++)")) {
  3281.                                         if (Utils.getRandom(8) == 0)
  3282.                                             target.getPoison().makePoisoned(68);
  3283.                                     } else if (name.contains("(p+)")) {
  3284.                                         if (Utils.getRandom(8) == 0)
  3285.                                             target.getPoison().makePoisoned(58);
  3286.                                     } else if (name.contains("(p)")) {
  3287.                                         if (Utils.getRandom(8) == 0)
  3288.                                             target.getPoison().makePoisoned(48);
  3289.                                     }
  3290.                                     if (target instanceof Player) {
  3291.                                         if (((Player) target).getPolDelay() >= Utils
  3292.                                                 .currentTimeMillis())
  3293.                                             target.setNextGraphics(new Graphics(
  3294.                                                     2320));
  3295.                                     }
  3296.                                 }
  3297.                             }
  3298.                         }
  3299.                     } else if (hit.getLook() == HitLook.MAGIC_DAMAGE) {
  3300.                         if (splash) {
  3301.                             target.setNextGraphics(new Graphics(85, 0, 96));
  3302.                             playSound(227, player, target);
  3303.                         } else {
  3304.                             if (mage_hit_gfx != 0) {
  3305.                                 target.setNextGraphics(new Graphics(
  3306.                                         mage_hit_gfx,
  3307.                                         0,
  3308.                                         mage_hit_gfx == 369
  3309.                                                 || mage_hit_gfx == 1843
  3310.                                                 || (mage_hit_gfx > 1844 && mage_hit_gfx < 1855) ? 0
  3311.                                                 : 96));
  3312.                                 if (blood_spell)
  3313.                                     player.heal(damage / 4);
  3314.                                 if (block_tele) {
  3315.                                     if (target instanceof Player) {
  3316.                                         Player targetPlayer = (Player) target;
  3317.                                         targetPlayer
  3318.                                                 .setTeleBlockDelay((targetPlayer
  3319.                                                         .getPrayer()
  3320.                                                         .usingPrayer(0, 17)
  3321.                                                         || targetPlayer
  3322.                                                                 .getPrayer()
  3323.                                                                 .usingPrayer(1,
  3324.                                                                         7) ? 100000
  3325.                                                         : 300000));
  3326.                                         targetPlayer
  3327.                                                 .getPackets()
  3328.                                                 .sendGameMessage(
  3329.                                                         "You have been teleblocked.",
  3330.                                                         true);
  3331.                                     }
  3332.                                 }
  3333.                             }
  3334.                             if (magic_sound > 0)
  3335.                                 playSound(magic_sound, player, target);
  3336.                         }
  3337.                     }
  3338.                     if (max_poison_hit > 0 && Utils.getRandom(10) == 0) {
  3339.                         if (!target.getPoison().isPoisoned())
  3340.                             target.getPoison().makePoisoned(max_poison_hit);
  3341.                     }
  3342.                     if (target instanceof Player) {
  3343.                         Player p2 = (Player) target;
  3344.                         p2.closeInterfaces();
  3345.                         if (p2.getCombatDefinitions().isAutoRelatie()
  3346.                                 && !p2.getActionManager().hasSkillWorking()
  3347.                                 && !p2.hasWalkSteps())
  3348.                             p2.getActionManager().setAction(
  3349.                                     new PlayerCombat(player));
  3350.                     } else {
  3351.                         NPC n = (NPC) target;
  3352.                         if (!n.isUnderCombat()
  3353.                                 || n.canBeAttackedByAutoRelatie())
  3354.                             n.setTarget(player);
  3355.                     }
  3356.  
  3357.                 }
  3358.             }
  3359.         }, delay);
  3360.     }
  3361.  
  3362.     private int getSoundId(int weaponId, int attackStyle) {
  3363.         if (weaponId != -1) {
  3364.             String weaponName = ItemDefinitions.getItemDefinitions(weaponId)
  3365.                     .getName().toLowerCase();
  3366.             if (weaponName.contains("dart") || weaponName.contains("knife"))
  3367.                 return 2707;
  3368.         }
  3369.         return -1;
  3370.     }
  3371.  
  3372.     public static int getWeaponAttackEmote(int weaponId, int attackStyle) {
  3373.         if (weaponId != -1) {
  3374.             if (weaponId == -2) {
  3375.                 // punch/block:14393 kick:14307 spec:14417
  3376.                 switch (attackStyle) {
  3377.                 case 1:
  3378.                     return 14307;
  3379.                 default:
  3380.                     return 14393;
  3381.                 }
  3382.             }
  3383.             String weaponName = ItemDefinitions.getItemDefinitions(weaponId)
  3384.                     .getName().toLowerCase();
  3385.             if (weaponName != null && !weaponName.equals("null")) {
  3386.                 if (weaponName.contains("crossbow"))
  3387.                     return weaponName.contains("karil's crossbow") ? 2075
  3388.                             : 4230;
  3389.                 if (weaponName.contains("bow"))
  3390.                     return 426;
  3391.                 if (weaponName.contains("decimation"))
  3392.                     return 426;
  3393.                 if (weaponName.contains("chinchompa"))
  3394.                     return 2779;
  3395.                 if (weaponName.contains("hammers"))
  3396.                     return 2068;
  3397.                 if (weaponName.contains("staff of light")) {
  3398.                     switch (attackStyle) {
  3399.                     case 0:
  3400.                         return 15072;
  3401.                     case 1:
  3402.                         return 15071;
  3403.                     case 2:
  3404.                         return 414;
  3405.                     }
  3406.                 }
  3407.                 if (weaponName.contains("staff") || weaponName.contains("wand"))
  3408.                     return 419;
  3409.                 if (weaponName.contains("dart"))
  3410.                     return 6600;
  3411.                 if (weaponName.contains("knife"))
  3412.                     return 9055;
  3413.                 if (weaponName.contains("scimitar")
  3414.                         || weaponName.contains("korasi's sword")) {
  3415.                     switch (attackStyle) {
  3416.                     case 2:
  3417.                         return 15072;
  3418.                     default:
  3419.                         return 15071;
  3420.                     }
  3421.                 }
  3422.                 if (weaponName.contains("granite mace"))
  3423.                     return 400;
  3424.                 if (weaponName.contains("mace")
  3425.                     || weaponName.contains("drygore mace")) {
  3426.  
  3427.                     switch (attackStyle) {
  3428.                     case 2:
  3429.                         return 400;
  3430.                     default:
  3431.                         return 401;
  3432.                     }
  3433.                 }
  3434.                 if (weaponName.contains("hatchet")) {
  3435.                     switch (attackStyle) {
  3436.                     case 2:
  3437.                         return 401;
  3438.                     default:
  3439.                         return 395;
  3440.                     }
  3441.                 }
  3442.                 if (weaponName.contains("warhammer")) {
  3443.                     switch (attackStyle) {
  3444.                     default:
  3445.                         return 401;
  3446.                     }
  3447.                 }
  3448.                 if (weaponName.contains("claws")) {
  3449.                     switch (attackStyle) {
  3450.                     case 2:
  3451.                         return 1067;
  3452.                     default:
  3453.                         return 393;
  3454.                     }
  3455.                 }
  3456.                 if (weaponName.contains("whip")) {
  3457.                     switch (attackStyle) {
  3458.                     case 1:
  3459.                         return 11969;
  3460.                     case 2:
  3461.                         return 11970;
  3462.                     default:
  3463.                         return 11968;
  3464.                     }
  3465.                 }
  3466.                 if (weaponName.contains("anchor")) {
  3467.                     switch (attackStyle) {
  3468.                     default:
  3469.                         return 5865;
  3470.                     }
  3471.                 }
  3472.                 if (weaponName.contains("tzhaar-ket-em")) {
  3473.                     switch (attackStyle) {
  3474.                     default:
  3475.                         return 401;
  3476.                     }
  3477.                 }
  3478.                 if (weaponName.contains("tzhaar-ket-om")) {
  3479.                     switch (attackStyle) {
  3480.                     default:
  3481.                         return 13691;
  3482.                     }
  3483.                 }
  3484.                 if (weaponName.contains("halberd")) {
  3485.                     switch (attackStyle) {
  3486.                     case 1:
  3487.                         return 440;
  3488.                     default:
  3489.                         return 428;
  3490.                     }
  3491.                 }
  3492.                 if (weaponName.contains("zamorakian spear")) {
  3493.                     switch (attackStyle) {
  3494.                     case 1:
  3495.                         return 12005;
  3496.                     case 2:
  3497.                         return 12009;
  3498.                     default:
  3499.                         return 12006;
  3500.                     }
  3501.                 }
  3502.                 if (weaponName.contains("spear")) {
  3503.                     switch (attackStyle) {
  3504.                     case 1:
  3505.                         return 440;
  3506.                     case 2:
  3507.                         return 429;
  3508.                     default:
  3509.                         return 428;
  3510.                     }
  3511.                 }
  3512.                 if (weaponName.contains("flail")) {
  3513.                     return 2062;
  3514.                 }
  3515.                 if (weaponName.contains("javelin")) {
  3516.                     return 10501;
  3517.                 }
  3518.                 if (weaponName.contains("morrigan's throwing axe"))
  3519.                     return 10504;
  3520.                 if (weaponName.contains("pickaxe")) {
  3521.                     switch (attackStyle) {
  3522.                     case 2:
  3523.                         return 400;
  3524.                     default:
  3525.                         return 401;
  3526.                     }
  3527.                 }
  3528.                 if (weaponName.contains("dagger")) {
  3529.                     switch (attackStyle) {
  3530.                     case 2:
  3531.                         return 377;
  3532.                     default:
  3533.                         return 376;
  3534.                     }
  3535.                 }
  3536.                 if (weaponName.contains("2h sword")
  3537.                         || weaponName.equals("Noxious scythe (shadow)")
  3538.                         || weaponName.equals("dominion sword")
  3539.                         || weaponName.equals("thok's sword")
  3540.                         || weaponName.equals("saradomin sword")) {
  3541.                     switch (attackStyle) {
  3542.                     case 2:
  3543.                         return 7048;
  3544.                     case 3:
  3545.                         return 7049;
  3546.                     default:
  3547.                         return 7041;
  3548.                     }
  3549.                 }
  3550.                 if (weaponName.contains(" sword")
  3551.                         || weaponName.contains("saber")
  3552.                         || weaponName.contains("longsword")
  3553.                         || weaponName.contains("Drygore longsword")
  3554.                         || weaponName.contains("light")
  3555.                         || weaponName.contains("excalibur")) {
  3556.                     switch (attackStyle) {
  3557.                     case 2:
  3558.                         return 12310;
  3559.                     default:
  3560.                         return 12311;
  3561.                     }
  3562.                 }
  3563.                 if (weaponName.contains("rapier")
  3564.                         || weaponName.contains("Drygore rapier")
  3565.                         || weaponName.contains("brackish")) {
  3566.                     switch (attackStyle) {
  3567.                     case 2:
  3568.                         return 13048;
  3569.                     default:
  3570.                         return 13049;
  3571.                     }
  3572.                 }
  3573.                 if (weaponName.contains("katana")) {
  3574.                     switch (attackStyle) {
  3575.                     case 2:
  3576.                         return 1882;
  3577.                     default:
  3578.                         return 1884;
  3579.                     }
  3580.                 }
  3581.                 if (weaponName.contains("godsword")) {
  3582.                     switch (attackStyle) {
  3583.                     case 2:
  3584.                         return 11980;
  3585.                     case 3:
  3586.                         return 11981;
  3587.                     default:
  3588.                         return 11979;
  3589.                     }
  3590.                 }
  3591.                 if (weaponName.contains("greataxe")) {
  3592.                     switch (attackStyle) {
  3593.                     case 2:
  3594.                         return 12003;
  3595.                     default:
  3596.                         return 12002;
  3597.                     }
  3598.                 }
  3599.                 if (weaponName.contains("granite maul")) {
  3600.                     switch (attackStyle) {
  3601.                     default:
  3602.                         return 1665;
  3603.                     }
  3604.                 }
  3605.  
  3606.             }
  3607.         }
  3608.         switch (weaponId) {
  3609.         case 16405:// novite maul
  3610.         case 16407:// Bathus maul
  3611.         case 16409:// Maramaros maul
  3612.         case 16411:// Kratonite maul
  3613.         case 16413:// Fractite maul
  3614.         case 18353:// chaotic maul
  3615.         case 16415:// Zephyrium maul
  3616.         case 16417:// Argonite maul
  3617.         case 16419:// Katagon maul
  3618.         case 16421:// Gorgonite maul
  3619.         case 16423:// Promethium maul
  3620.         case 16425:// primal maul
  3621.             return 2661; // maul
  3622.         case 13883: // morrigan thrown axe
  3623.             return 10504;
  3624.         case 15241:
  3625.             return 12174;
  3626.         default:
  3627.             switch (attackStyle) {
  3628.             case 1:
  3629.                 return 423;
  3630.             default:
  3631.                 return 422; // todo default emote
  3632.             }
  3633.         }
  3634.     }
  3635.  
  3636.     private void doDefenceEmote() {
  3637.         target.setNextAnimationNoPriority(new Animation(Combat
  3638.                 .getDefenceEmote(target)));
  3639.     }
  3640.  
  3641.     private int getMeleeCombatDelay(Player player, int weaponId) {
  3642.         if (weaponId != -1) {
  3643.             String weaponName = ItemDefinitions.getItemDefinitions(weaponId)
  3644.                     .getName().toLowerCase();
  3645.  
  3646.             // Interval 2.4
  3647.             if (weaponName.equals("zamorakian spear")
  3648.                     || weaponName.equals("korasi's sword"))
  3649.                 return 3;
  3650.             // Interval 3.6
  3651.             if (weaponName.contains("godsword")
  3652.                     || weaponName.contains("warhammer")
  3653.                     || weaponName.contains("battleaxe")
  3654.                     || weaponName.contains("maul")
  3655.                     || weaponName.equals("dominion sword"))
  3656.                 return 5;
  3657.             // Interval 4.2
  3658.             if (weaponName.contains("greataxe")
  3659.                     || weaponName.contains("halberd")
  3660.                     || weaponName.contains("2h sword")
  3661.                     || weaponName.contains("two handed sword")
  3662.                     || weaponName.contains("katana")
  3663.                     || weaponName.equals("thok's sword"))
  3664.                 return 6;
  3665.             // Interval 3.0
  3666.             if (weaponName.contains("spear") || weaponName.contains(" sword")
  3667.                     || weaponName.contains("longsword")
  3668.                     || weaponName.contains("light")
  3669.                     || weaponName.contains("hatchet")
  3670.                     || weaponName.contains("pickaxe")
  3671.                     || weaponName.contains("mace")
  3672.                     || weaponName.contains("hasta")
  3673.                     || weaponName.contains("warspear")
  3674.                     || weaponName.contains("flail")
  3675.                     || weaponName.contains("hammers"))
  3676.                 return 4;
  3677.         }
  3678.         switch (weaponId) {
  3679.         case 6527:// tzhaar-ket-em
  3680.             return 4;
  3681.         case 10887:// barrelchest anchor
  3682.             return 5;
  3683.         case 15403:// balmung
  3684.         case 6528:// tzhaar-ket-om
  3685.             return 6;
  3686.         default:
  3687.             return 3;
  3688.         }
  3689.     }
  3690.  
  3691.     @Override
  3692.     public void stop(final Player player) {
  3693.         player.setNextFaceEntity(null);
  3694.     }
  3695.  
  3696.     private boolean checkAll(Player player) {
  3697.         if (player.isDead() || player.hasFinished() || target.isDead()
  3698.                 || target.hasFinished()) {
  3699.             return false;
  3700.         }
  3701.         int distanceX = player.getX() - target.getX();
  3702.         int distanceY = player.getY() - target.getY();
  3703.         int size = target.getSize();
  3704.         int maxDistance = 16;
  3705.         if (player.getPlane() != target.getPlane()
  3706.                 || distanceX > size + maxDistance
  3707.                 || distanceX < -1 - maxDistance
  3708.                 || distanceY > size + maxDistance
  3709.                 || distanceY < -1 - maxDistance) {
  3710.             return false;
  3711.         }
  3712.         if (player.getFreezeDelay() >= Utils.currentTimeMillis()) {
  3713.             if (player.withinDistance(target, 0))// done
  3714.                 return false;
  3715.             return true;
  3716.         }
  3717.         if (target instanceof Player) {
  3718.             Player p2 = (Player) target;
  3719.             if (!player.isCanPvp() || !p2.isCanPvp())
  3720.                 return false;
  3721.         } else {
  3722.             NPC n = (NPC) target;
  3723.             if (n.isCantInteract()) {
  3724.                 return false;
  3725.             }
  3726.             if (n instanceof Familiar) {
  3727.                 Familiar familiar = (Familiar) n;
  3728.                 if (!familiar.canAttack(target))
  3729.                     return false;
  3730.             } else {
  3731.                 if (!n.canBeAttackFromOutOfArea()
  3732.                         && !MapAreas.isAtArea(n.getMapAreaNameHash(), player)) {
  3733.                     return false;
  3734.                 }
  3735.                 if (n.getId() == 1757) {
  3736.                     player.getPackets()
  3737.                             .sendGameMessage(
  3738.                                     "This is for thieving, NOT killing. Go to ::train if you want to train!");
  3739.                     return false;
  3740.                 }
  3741.                 if (n.getId() == 170) {
  3742.                     player.getPackets()
  3743.                             .sendGameMessage(
  3744.                                     "This is for thieving, NOT killing. Go to ::train if you want to train!");
  3745.                     return false;
  3746.                 }
  3747.                
  3748.                 if (n.getId() == 14578) {
  3749.                     if (player.getEquipment().getWeaponId() != 2402
  3750.                             && player.getCombatDefinitions().getAutoCastSpell() <= 0
  3751.                             && !hasPolyporeStaff(player)) {
  3752.                         player.getPackets().sendGameMessage(
  3753.                                 "I'd better wield Silverlight first.");
  3754.                         return false;
  3755.                     }
  3756.  
  3757.                     if (n.getId() == 1637) {
  3758.                         if (player.getSkills().getLevel(Skills.SLAYER) < 65) {
  3759.                             player.getPackets()
  3760.                                     .sendGameMessage(
  3761.                                             "You need at least a slayer level of 65 to fight this.");
  3762.                             return false;
  3763.                         }
  3764.                     }
  3765.  
  3766.                 } else if (n.getId() == 6222 || n.getId() == 6223
  3767.                         || n.getId() == 6225 || n.getId() == 6227) {
  3768.                     if (isRanging(player) == 0) {
  3769.                         player.getPackets().sendGameMessage(
  3770.                                 "I can't reach that!");
  3771.                         return false;
  3772.                     }
  3773.                 }
  3774.             }
  3775.             int slayerLevel = Slayer.getLevelRequirement(n.getName());
  3776.             if (slayerLevel > player.getSkills().getLevel(Skills.SLAYER)) {
  3777.                 player.getPackets().sendGameMessage(
  3778.                         "You need a Slayer level of at least " + slayerLevel
  3779.                                 + " to fight this.");
  3780.                 return false;
  3781.             }
  3782.             if (!Slayer.getItemReq(player, n.getName())) {
  3783.                 player.out("You do not have the correct materials to fight this monster.");
  3784.                 return false;
  3785.             }
  3786.         }
  3787.         if (!(target instanceof NPC && ((NPC) target).isForceMultiAttacked())) {
  3788.  
  3789.             if (!target.isAtMultiArea() || !player.isAtMultiArea()) {
  3790.                 if (player.getAttackedBy() != target
  3791.                         && player.getAttackedByDelay() > Utils
  3792.                                 .currentTimeMillis()) {
  3793.                     return false;
  3794.                 }
  3795.                 if (target.getAttackedBy() != player
  3796.                         && target.getAttackedByDelay() > Utils
  3797.                                 .currentTimeMillis()) {
  3798.                     return false;
  3799.                 }
  3800.             }
  3801.         }
  3802.         int isRanging = isRanging(player);
  3803.         if (distanceX < size && distanceX > -1 && distanceY < size
  3804.                 && distanceY > -1 && !target.hasWalkSteps()) {
  3805.             player.resetWalkSteps();
  3806.             if (!player.addWalkSteps(target.getX() + size, target.getY())) {
  3807.                 player.resetWalkSteps();
  3808.                 if (!player.addWalkSteps(target.getX() - 1, target.getY())) {
  3809.                     player.resetWalkSteps();
  3810.                     if (!player.addWalkSteps(target.getX(), target.getY()
  3811.                             + size)) {
  3812.                         player.resetWalkSteps();
  3813.                         if (!player.addWalkSteps(target.getX(),
  3814.                                 target.getY() - 1)) {
  3815.                             return false;
  3816.                         }
  3817.                     }
  3818.                 }
  3819.             }
  3820.             return true;
  3821.         } else if (isRanging == 0 && target.getSize() == 1
  3822.                 && player.getCombatDefinitions().getSpellId() <= 0
  3823.                 && !hasPolyporeStaff(player)
  3824.                 && Math.abs(player.getX() - target.getX()) == 1
  3825.                 && Math.abs(player.getY() - target.getY()) == 1
  3826.                 && !target.hasWalkSteps()) {
  3827.             if (!player.addWalkSteps(target.getX(), player.getY(), 1))
  3828.                 player.addWalkSteps(player.getX(), target.getY(), 1);
  3829.             return true;
  3830.         }
  3831.         maxDistance = isRanging != 0
  3832.                 || player.getCombatDefinitions().getSpellId() > 0
  3833.                 || hasPolyporeStaff(player) ? 7 : 0;
  3834.         if ((!player.clipedProjectile(target, maxDistance == 0
  3835.                 && !forceCheckClipAsRange(target)))
  3836.                 || distanceX > size + maxDistance
  3837.                 || distanceX < -1 - maxDistance
  3838.                 || distanceY > size + maxDistance
  3839.                 || distanceY < -1 - maxDistance) {
  3840.             if (!player.hasWalkSteps()) {
  3841.                 player.resetWalkSteps();
  3842.                 player.addWalkStepsInteract(target.getX(), target.getY(),
  3843.                         player.getRun() ? 2 : 1, size, true);
  3844.             }
  3845.             return true;
  3846.         } else {
  3847.             player.resetWalkSteps();
  3848.         }
  3849.         if (player.getPolDelay() >= Utils.currentTimeMillis()
  3850.                 && !(player.getEquipment().getWeaponId() == 15486
  3851.                         || player.getEquipment().getWeaponId() == 22207
  3852.                         || player.getEquipment().getWeaponId() == 22209
  3853.                         || player.getEquipment().getWeaponId() == 22211 || player
  3854.                         .getEquipment().getWeaponId() == 22213))
  3855.             player.setPolDelay(0);
  3856.         player.getTemporaryAttributtes().put("last_target", target);
  3857.         if (target != null)
  3858.             target.getTemporaryAttributtes().put("last_attacker", player);
  3859.         if (player.getCombatDefinitions().isInstantAttack()) {
  3860.             player.getCombatDefinitions().setInstantAttack(false);
  3861.             if (player.getCombatDefinitions().getAutoCastSpell() > 0)
  3862.                 return true;
  3863.             if (player.getCombatDefinitions().isUsingSpecialAttack()) {
  3864.                 if (!specialExecute(player))
  3865.                     return true;
  3866.                 player.getActionManager().setActionDelay(0);
  3867.                 int weaponId = player.getEquipment().getWeaponId();
  3868.                 int attackStyle = player.getCombatDefinitions()
  3869.                         .getAttackStyle();
  3870.                 switch (weaponId) {
  3871.                 case 4153:
  3872.                     player.setNextAnimation(new Animation(1667));
  3873.                     player.setNextGraphics(new Graphics(340, 0, 96 << 16));
  3874.                     delayNormalHit(
  3875.                             weaponId,
  3876.                             attackStyle,
  3877.                             getMeleeHit(
  3878.                                     player,
  3879.                                     getRandomMaxHit(player, weaponId,
  3880.                                             attackStyle, false, true, 1.1, true)));
  3881.                     break;
  3882.                 }
  3883.                 player.getActionManager().setActionDelay(4);
  3884.             }
  3885.             return true;
  3886.         }
  3887.         return true;
  3888.     }
  3889.  
  3890.     public static boolean specialExecute(Player player) {
  3891.         int weaponId = player.getEquipment().getWeaponId();
  3892.         player.getCombatDefinitions().switchUsingSpecialAttack();
  3893.         int specAmt = getSpecialAmmount(weaponId);
  3894.         if (specAmt == 0) {
  3895.             player.getPackets()
  3896.                     .sendGameMessage(
  3897.                             "This weapon has no special Attack, if you still see special bar please relogin.");
  3898.             player.getCombatDefinitions().desecreaseSpecialAttack(0);
  3899.             return false;
  3900.         }
  3901.         if (player.getCombatDefinitions().hasRingOfVigour())
  3902.             specAmt *= 0.9;
  3903.         if (player.getCombatDefinitions().getSpecialAttackPercentage() < specAmt) {
  3904.             player.getPackets().sendGameMessage(
  3905.                     "You don't have enough power left.");
  3906.             player.getCombatDefinitions().desecreaseSpecialAttack(0);
  3907.             return false;
  3908.         }
  3909.         player.getCombatDefinitions().desecreaseSpecialAttack(specAmt);
  3910.         return true;
  3911.     }
  3912.  
  3913.     /*
  3914.      * 0 not ranging, 1 invalid ammo so stops att, 2 can range, 3 no ammo
  3915.      */
  3916.     public static final int isRanging(Player player) {
  3917.         int weaponId = player.getEquipment().getWeaponId();
  3918.         if (weaponId == -1)
  3919.             return 0;
  3920.         String name = ItemDefinitions.getItemDefinitions(weaponId).getName();
  3921.         if (name != null) { // those dont need arrows
  3922.             if (name.contains("knife") || name.contains("dart")
  3923.                     || name.contains("javelin") || name.contains("thrownaxe")
  3924.                     || name.contains("throwing axe")
  3925.                     || name.contains("crystal bow")
  3926.                     || name.equalsIgnoreCase("zaryte bow")
  3927.                     || name.contains("chinchompa") || name.contains("Bolas"))
  3928.                 return 2;
  3929.         }
  3930.         int ammoId = player.getEquipment().getAmmoId();
  3931.         switch (weaponId) {
  3932.         case 15241: // Hand cannon
  3933.             switch (ammoId) {
  3934.             case -1:
  3935.                 return 3;
  3936.             case 15243: // bronze arrow
  3937.                 return 2;
  3938.             default:
  3939.                 return 1;
  3940.             }
  3941.         case 839: // longbow
  3942.         case 841: // shortbow
  3943.             switch (ammoId) {
  3944.             case -1:
  3945.                 return 3;
  3946.             case 882: // bronze arrow
  3947.             case 884: // iron arrow
  3948.                 return 2;
  3949.             default:
  3950.                 return 1;
  3951.             }
  3952.         case 843: // oak longbow
  3953.         case 845: // oak shortbow
  3954.             switch (ammoId) {
  3955.             case -1:
  3956.                 return 3;
  3957.             case 882: // bronze arrow
  3958.             case 884: // iron arrow
  3959.             case 886: // steel arrow
  3960.                 return 2;
  3961.             default:
  3962.                 return 1;
  3963.             }
  3964.         case 847: // willow longbow
  3965.         case 849: // willow shortbow
  3966.         case 13541: // Willow composite bow
  3967.             switch (ammoId) {
  3968.             case -1:
  3969.                 return 3;
  3970.             case 882: // bronze arrow
  3971.             case 884: // iron arrow
  3972.             case 886: // steel arrow
  3973.             case 888: // mithril arrow
  3974.                 return 2;
  3975.             default:
  3976.                 return 1;
  3977.             }
  3978.         case 851: // maple longbow
  3979.         case 853: // maple shortbow
  3980.         case 18331: // Maple longbow (sighted)
  3981.             switch (ammoId) {
  3982.             case -1:
  3983.                 return 3;
  3984.             case 882: // bronze arrow
  3985.             case 884: // iron arrow
  3986.             case 886: // steel arrow
  3987.             case 888: // mithril arrow
  3988.             case 890: // adamant arrow
  3989.                 return 2;
  3990.             default:
  3991.                 return 1;
  3992.             }
  3993.         case 2883:// ogre bow
  3994.             switch (ammoId) {
  3995.             case -1:
  3996.                 return 3;
  3997.             case 2866: // ogre arrow
  3998.                 return 2;
  3999.             default:
  4000.                 return 1;
  4001.             }
  4002.         case 4827:// Comp ogre bow
  4003.             switch (ammoId) {
  4004.             case -1:
  4005.                 return 3;
  4006.             case 2866: // ogre arrow
  4007.             case 4773: // bronze brutal
  4008.             case 4778: // iron brutal
  4009.             case 4783: // steel brutal
  4010.             case 4788: // black brutal
  4011.             case 4793: // mithril brutal
  4012.             case 4798: // adamant brutal
  4013.             case 4803: // rune brutal
  4014.                 return 2;
  4015.             default:
  4016.                 return 1;
  4017.             }
  4018.         case 855: // yew longbow
  4019.         case 857: // yew shortbow
  4020.         case 10281: // Yew composite bow
  4021.         case 14121: // Sacred clay bow
  4022.         case 859: // magic longbow
  4023.         case 861: // magic shortbow
  4024.         case 10284: // Magic composite bow
  4025.         case 18332: // Magic longbow (sighted)
  4026.         case 6724: // seercull
  4027.             switch (ammoId) {
  4028.             case -1:
  4029.                 return 3;
  4030.             case 882: // bronze arrow
  4031.             case 884: // iron arrow
  4032.             case 886: // steel arrow
  4033.             case 888: // mithril arrow
  4034.             case 890: // adamant arrow
  4035.             case 892: // rune arrow
  4036.                 return 2;
  4037.             default:
  4038.                 return 1;
  4039.             }
  4040.         case 11235: // dark bows
  4041.         case 15701:
  4042.         case 15702:
  4043.         case 15703:
  4044.         case 15704:
  4045.             switch (ammoId) {
  4046.             case -1:
  4047.                 return 3;
  4048.             case 882: // bronze arrow
  4049.             case 884: // iron arrow
  4050.             case 886: // steel arrow
  4051.             case 888: // mithril arrow
  4052.             case 890: // adamant arrow
  4053.             case 892: // rune arrow
  4054.             case 11212: // dragon arrow
  4055.                 return 2;
  4056.             default:
  4057.                 return 1;
  4058.             }
  4059.         case 19143: // saradomin bow
  4060.             switch (ammoId) {
  4061.             case -1:
  4062.                 return 3;
  4063.             case 19152: // saradomin arrow
  4064.                 return 2;
  4065.             default:
  4066.                 return 1;
  4067.             }
  4068.         case 19146: // guthix bow
  4069.             switch (ammoId) {
  4070.             case -1:
  4071.                 return 3;
  4072.             case 19157: // guthix arrow
  4073.                 return 2;
  4074.             default:
  4075.                 return 1;
  4076.             }
  4077.         case 19149: // zamorak bow
  4078.             switch (ammoId) {
  4079.             case -1:
  4080.                 return 3;
  4081.             case 19162: // zamorak arrow
  4082.                 return 2;
  4083.             default:
  4084.                 return 1;
  4085.             }
  4086.         case 24338: // Royal crossbow
  4087.             switch (ammoId) {
  4088.             case -1:
  4089.                 return 3;
  4090.             case 877: // bronze bolts
  4091.             case 9140: // iron bolts
  4092.             case 9141: // steel bolts
  4093.             case 13083: // black bolts
  4094.             case 9142:// mithril bolts
  4095.             case 9143: // adam bolts
  4096.             case 9341: // drag bolds
  4097.             case 9144: // rune bolts
  4098.             case 9145: // silver bolts wtf
  4099.             case 9236: // Opal bolts (e)
  4100.             case 9238: // Pearl bolts (e)
  4101.             case 9239: // Topaz bolts (e)
  4102.             case 9240: // Sapphire bolts (e)
  4103.             case 9241: // Emerald bolts (e)
  4104.             case 9242: // Ruby bolts (e)
  4105.             case 9243: // Diamond bolts (e)
  4106.             case 9244: // Dragon bolts (e)
  4107.             case 9245: // Onyx bolts (e)
  4108.             case 24116: // Bakriminel bolts
  4109.             case 24336: // Coral bolts
  4110.                 return 2;
  4111.             default:
  4112.                 return 1;
  4113.             }
  4114.         case 24303: // Coral crossbow
  4115.             switch (ammoId) {
  4116.             case -1:
  4117.                 return 3;
  4118.             case 24304: // Coral bolts
  4119.                 return 2;
  4120.             default:
  4121.                 return 1;
  4122.             }
  4123.         case 4734: // karil crossbow
  4124.             switch (ammoId) {
  4125.             case -1:
  4126.                 return 3;
  4127.             case 4740: // bolt rack
  4128.                 return 2;
  4129.             default:
  4130.                 return 1;
  4131.             }
  4132.         case 10156: // hunters crossbow
  4133.             switch (ammoId) {
  4134.             case -1:
  4135.                 return 3;
  4136.             case 10158: // Kebbit bolts
  4137.             case 10159: // Long kebbit bolts
  4138.                 return 2;
  4139.             default:
  4140.                 return 1;
  4141.             }
  4142.         case 8880: // Dorgeshuun c'bow
  4143.             switch (ammoId) {
  4144.             case -1:
  4145.                 return 3;
  4146.             case 877: // bronze bolts
  4147.             case 9140: // iron bolts
  4148.             case 8882: // bone bolts
  4149.                 return 2;
  4150.             default:
  4151.                 return 1;
  4152.             }
  4153.         case 14684: // zanik crossbow
  4154.             switch (ammoId) {
  4155.             case -1:
  4156.                 return 3;
  4157.             case 877: // bronze bolts
  4158.             case 9140: // iron bolts
  4159.             case 9141: // steel bolts
  4160.             case 13083: // black bolts
  4161.             case 9142:// mithril bolts
  4162.             case 9143: // adam bolts
  4163.             case 9145: // silver bolts
  4164.             case 8882: // bone bolts
  4165.                 return 2;
  4166.             default:
  4167.                 return 1;
  4168.             }
  4169.         case 767: // phoenix crossbow
  4170.         case 837: // crossbow
  4171.             switch (ammoId) {
  4172.             case -1:
  4173.                 return 3;
  4174.             case 877: // bronze bolts
  4175.                 return 2;
  4176.             default:
  4177.                 return 1;
  4178.             }
  4179.         case 9174: // bronze crossbow
  4180.             switch (ammoId) {
  4181.             case -1:
  4182.                 return 3;
  4183.             case 877: // bronze bolts
  4184.             case 9236: // Opal bolts (e)
  4185.                 return 2;
  4186.             default:
  4187.                 return 1;
  4188.             }
  4189.         case 9176: // blurite crossbow
  4190.             switch (ammoId) {
  4191.             case -1:
  4192.                 return 3;
  4193.             case 877: // bronze bolts
  4194.             case 9140: // iron bolts
  4195.             case 9141: // steel bolts
  4196.             case 13083: // black bolts
  4197.             case 9236: // Opal bolts (e)
  4198.             case 9238: // Pearl bolts (e)
  4199.             case 9239: // Topaz bolts (e)
  4200.             case 9139: // Blurite bolts
  4201.             case 9237: // Jade bolts (e)
  4202.                 return 2;
  4203.             default:
  4204.                 return 1;
  4205.             }
  4206.         case 9177: // iron crossbow
  4207.             switch (ammoId) {
  4208.             case -1:
  4209.                 return 3;
  4210.             case 877: // bronze bolts
  4211.             case 9140: // iron bolts
  4212.             case 9236: // Opal bolts (e)
  4213.             case 9238: // Pearl bolts (e)
  4214.                 return 2;
  4215.             default:
  4216.                 return 1;
  4217.             }
  4218.         case 9179: // steel crossbow
  4219.             switch (ammoId) {
  4220.             case -1:
  4221.                 return 3;
  4222.             case 877: // bronze bolts
  4223.             case 9140: // iron bolts
  4224.             case 9141: // steel bolts
  4225.             case 9236: // Opal bolts (e)
  4226.             case 9238: // Pearl bolts (e)
  4227.             case 9239: // Topaz bolts (e)
  4228.                 return 2;
  4229.             default:
  4230.                 return 1;
  4231.             }
  4232.         case 13081: // black crossbow
  4233.             switch (ammoId) {
  4234.             case -1:
  4235.                 return 3;
  4236.             case 877: // bronze bolts
  4237.             case 9140: // iron bolts
  4238.             case 9141: // steel bolts
  4239.             case 13083: // black bolts
  4240.             case 9236: // Opal bolts (e)
  4241.             case 9238: // Pearl bolts (e)
  4242.             case 9239: // Topaz bolts (e)
  4243.                 return 2;
  4244.             default:
  4245.                 return 1;
  4246.             }
  4247.         case 9181: // Mith crossbow
  4248.             switch (ammoId) {
  4249.             case -1:
  4250.                 return 3;
  4251.             case 877: // bronze bolts
  4252.             case 9140: // iron bolts
  4253.             case 9141: // steel bolts
  4254.             case 13083: // black bolts
  4255.             case 9142:// mithril bolts
  4256.             case 9145: // silver bolts
  4257.             case 9236: // Opal bolts (e)
  4258.             case 9238: // Pearl bolts (e)
  4259.             case 9239: // Topaz bolts (e)
  4260.             case 9240: // Sapphire bolts (e)
  4261.             case 9241: // Emerald bolts (e)
  4262.                 return 2;
  4263.             default:
  4264.                 return 1;
  4265.             }
  4266.         case 9183: // adam c bow
  4267.             switch (ammoId) {
  4268.             case -1:
  4269.                 return 3;
  4270.             case 877: // bronze bolts
  4271.             case 9140: // iron bolts
  4272.             case 9141: // steel bolts
  4273.             case 13083: // black bolts
  4274.             case 9142:// mithril bolts
  4275.             case 9143: // adam bolts
  4276.             case 9145: // silver bolts wtf
  4277.             case 9236: // Opal bolts (e)
  4278.             case 9238: // Pearl bolts (e)
  4279.             case 9239: // Topaz bolts (e)
  4280.             case 9240: // Sapphire bolts (e)
  4281.             case 9241: // Emerald bolts (e)
  4282.             case 9242: // Ruby bolts (e)
  4283.             case 9243: // Diamond bolts (e)
  4284.                 return 2;
  4285.             default:
  4286.                 return 1;
  4287.             }
  4288.         case 9185: // rune c bow
  4289.         case 18357: // chaotic crossbow
  4290.         case 29928: // Shadow Ascension Crossbow
  4291.         case 29956: // Ascension Crossbow
  4292.         case 18358:
  4293.             switch (ammoId) {
  4294.             case -1:
  4295.                 return 3;
  4296.             case 877: // bronze bolts
  4297.             case 9140: // iron bolts
  4298.             case 9141: // steel bolts
  4299.             case 13083: // black bolts
  4300.             case 9142:// mithril bolts
  4301.             case 9143: // adam bolts
  4302.             case 9341: // drag bolds
  4303.             case 9144: // rune bolts
  4304.             case 9145: // silver bolts wtf
  4305.             case 9236: // Opal bolts (e)
  4306.             case 9238: // Pearl bolts (e)
  4307.             case 9239: // Topaz bolts (e)
  4308.             case 9240: // Sapphire bolts (e)
  4309.             case 9241: // Emerald bolts (e)
  4310.             case 9242: // Ruby bolts (e)
  4311.             case 9243: // Diamond bolts (e)
  4312.             case 9244: // Dragon bolts (e)
  4313.             case 9245: // Onyx bolts (e)
  4314.             case 24116: // Bakriminel bolts
  4315.                 return 2;
  4316.             default:
  4317.                 return 1;
  4318.             }
  4319.         default:
  4320.             return 0;
  4321.         }
  4322.     }
  4323.  
  4324.     /**
  4325.      * Checks if the player is wielding polypore staff.
  4326.      *
  4327.      * @param player
  4328.      *            The player.
  4329.      * @return {@code True} if so.
  4330.      */
  4331.     private static boolean hasPolyporeStaff(Player player) {
  4332.         int weaponId = player.getEquipment().getWeaponId();
  4333.         return weaponId == 22494 || weaponId == 22496;
  4334.     }
  4335.  
  4336.     public Entity getTarget() {
  4337.         return target;
  4338.     }
  4339. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement