Thread: Cannot Attack NPC's.

Results 1 to 4 of 4
  1. #1 Cannot Attack NPC's. 
    Registered Member

    Join Date
    Dec 2013
    Posts
    866
    Thanks given
    121
    Thanks received
    138
    Rep Power
    107
    Hey, I can't attack a tormented demon or like a big boss, I'm not really sure why. I'm using a Hyperion base. If you can help that'd be great !

    Spoiler for combat.java:

    package org.hyperion.rs2.model.combat;

    import org.hyperion.map.WorldMap;
    import org.hyperion.rs2.event.Event;
    import org.hyperion.rs2.model.Entity;
    import org.hyperion.rs2.model.GlobalItem;
    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Location;
    import org.hyperion.rs2.model.NPC;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.UpdateSpecialBar;
    import org.hyperion.rs2.model.World;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.minigame.CastleWars ;
    import org.hyperion.rs2.model.content.misc.ItemDegrading;
    import org.hyperion.rs2.model.content.skill.Prayer;
    import org.hyperion.rs2.model.content.skill.Slayer;
    import org.hyperion.rs2.util.RestarterThread;
    import org.hyperion.util.Misc;

    /**
    * @authors Martin and Arsen
    */

    public class Combat {



    public static boolean processCombat(final CombatEntility combatEntity) {
    try {
    /**
    * Logical check if combatEntity isn't null, isn't dead, etc..
    */
    if(!CombatAssistant.isValid(combatEntity))
    return false;
    /**
    * Facing
    */
    combatEntity.face(combatEntity.getOpponent().getAb sX() + combatEntity.getOpponent().getOffsetX(), combatEntity.getOpponent().getAbsY() + combatEntity.getOpponent().getOffsetY(), true);

    if (combatEntity.predictedAtk > System.currentTimeMillis()){
    return true;
    }

    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    if (combatEntity.getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    return false;
    }
    /**
    * Add opponent to attackers list
    */
    if (!combatEntity.getOpponent().getAttackers().contai ns(combatEntity)) {
    combatEntity.getOpponent().getAttackers().add(comb atEntity);
    }
    /**
    * Distance and freezetimer check.
    */
    int distance = combatEntity.getEntity().getLocation().distance((c ombatEntity.getOpponent().getEntity().getLocation( )));
    /*Checks if standing on eachother*/
    if (distance == 0) {
    /*If standing on eachother and frozen*/
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return false;
    if (!combatEntity.getOpponent().vacating) {
    combatEntity.vacating = true;
    combatEntity.getEntity().vacateSquare();
    }
    return true;
    }
    combatEntity.vacating = false;
    /**
    * Run seperate code depending on whether the combatEntity is an NPC or a Player.
    */
    if (combatEntity.getEntity() instanceof Player) {
    processPlayerCombat(combatEntity,distance);
    } else {
    processNpcCombat(combatEntity,distance);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return true;// was successful, false - reset attack
    }


    private static boolean processPlayerCombat(final CombatEntility combatEntity, int distance) {
    /**
    * Initializing variables.
    */
    boolean hit = false;
    boolean finishOff = true;
    boolean doubleHit = false;
    int arrowId = CombatAssistant.getArrowsId(combatEntity.getPlayer ().getEquipment());
    final int extraDis = CombatAssistant.getExtraDistance(combatEntity);
    int weaponId = CombatAssistant.getWeaponId(combatEntity.getPlayer ().getEquipment());
    int damgDouble = 0;
    int damg = 0;
    /**
    * Skull Adding
    */
    CombatAssistant.checkSkull(combatEntity);
    /**
    * Degrading
    */
    ItemDegrading.check(combatEntity.getPlayer());
    /**
    * Magic Combat
    */
    int magicAtk = combatEntity.getNextMagicAtk();
    if (combatEntity.getNextMagicAtk() > 0) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// Too far.
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    // cast the actual spell using magic code , result was if
    // its succesfuly or not (i.e no runes)
    int result = Magic.castSpell(combatEntity, combatEntity.getOpponent(), magicAtk);
    if (result == 2) {
    // if it worked remove the spell
    combatEntity.deleteSpellAttack();
    combatEntity.predictedAtk = System.currentTimeMillis() + 2500;
    // combatEntity.predictedAtk =
    // System.currentTimeMillis()+2000;
    // spell hit etc
    hit = true;
    finishOff = false;
    if (!(combatEntity.getAutoCastId() > 0)) {
    combatEntity.setOpponent(null);
    return false;
    }
    return true;
    } else if (result == 0) {
    // no runes so reset
    return false;
    }
    }
    /**
    * Max Hit and Combat Style Determination.
    */
    int bowType = CombatAssistant.getBowType(combatEntity);
    // Check Arrows/Bow
    if (bowType <= Constants.NOAMMO) {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    switch (bowType) {
    case Constants.RANGEDNOARROWS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no arrows left in your quiver.");
    break;
    case Constants.RANGEDNOBOLTS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no bolts left.");
    break;
    case Constants.UNIQUENOAMMO:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no ammo left.");
    break;
    case Constants.UNIQUEWRONG:
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use this type of ammo with this weapon.");
    break;
    }
    return false;
    }
    int maxHit = 0;
    final int combatStyle;
    if (bowType == Constants.MELEETYPE) {
    maxHit = CombatAssistant.calculateMaxHit(combatEntity.getPl ayer());
    combatStyle = Constants.MELEE;
    if(combatEntity.getAutoCastId() <= 0)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    } else {
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    combatStyle = Constants.RANGE;
    }
    final int possibleMaxHit = maxHit;
    /**
    * Special Activating
    */
    if (!hit && combatEntity.getNextMagicAtk() <= 0) {
    if (combatEntity.getPlayer().specOn) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 600) {
    return true;
    }
    combatEntity.getPlayer().specOn = false;
    if (weaponId == -1) {

    } else if (SpecialAttacks.special(combatEntity, maxHit, weaponId, extraDis, distance,combatStyle)) {
    hit = true;
    finishOff = false;
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    } else {
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    return true;
    }
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    }
    }
    /**
    * Autocasting
    */
    if (!hit) {
    if (combatEntity.getAutoCastId() > 0) {
    if (combatEntity.getPlayer().duelRule[4]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use magic in this duel.");
    combatEntity.setAutoCastId(0);
    return false;
    }
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;
    // timer
    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;
    }
    combatEntity.addSpellAttack(combatEntity.getAutoCa stId());
    hit = true;
    finishOff = false;
    }
    }
    /**
    * Ranging
    */
    if (!hit) {
    // If in Duel , Return
    if (bowType != 8 && combatEntity.getPlayer().duelRule[2]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use range in this duel.");
    return false;
    }
    if (bowType != Constants.MELEETYPE) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getActionSender().resetFo llow();
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }


    int arrowType = CombatAssistant.getArrowType(arrowId);
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    if (bowType == Constants.RANGEDWEPSTYPE)
    combatEntity.doAnim(806);// throw stuff anim
    else {
    combatEntity.doAtkEmote();
    }
    // System.out.println("range max: "+maxHit);

    /**
    * Sending Projectile part.
    */
    CombatAssistant.fireProjectile(combatEntity, bowType, arrowType);
    /**
    * Set Attack Speed
    */
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    // drawback gfx
    CombatAssistant.drawBackGfx(combatEntity, weaponId, arrowId, bowType);
    /**
    * Get random Damage Hit
    */
    damg = random(maxHit);
    /**
    * Checks Range bonus etc
    */
    int rangeAtk = CombatAssistant.calculateRangeAttack(combatEntity. getPlayer());
    int rangeDef;
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    rangeDef = CombatAssistant.calculateRangeDefence(combatEntity .getOpponent().getPlayer());
    else
    rangeDef = combatEntity.getOpponent().getCombat()/2 ;
    int deltaRangeBonus = rangeAtk - rangeDef;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Delta Range Bonus is : " + deltaRangeBonus);
    }*/
    int toadd = Misc.random(deltaRangeBonus/20);
    //System.out.println("Toadd is " + toadd);
    damg += toadd;
    if(damg < 0)
    damg = 0;
    else if(damg > maxHit)
    damg = maxHit;
    /**
    * Enchanted Bolts Effects
    */
    double boltBonus = 1;
    if(Misc.random(4) == 0 && damg > 0.6 * maxHit && bowType == Constants.RANGEDBOLTS){
    switch(arrowId){
    case 9242:
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    damg = combatEntity.getOpponent().getPlayer().getSkills() .getLevelForExperience(Skills.HITPOINTS)/5;
    else
    damg = combatEntity.getOpponent().getNPC().health/5;
    int newHp = (int)(combatEntity.getPlayer().getSkills().getLeve l(Skills.HITPOINTS) * 0.9);
    combatEntity.getPlayer().getSkills().setLevel(Skil ls.HITPOINTS, newHp);
    combatEntity.getOpponent().doGfx(754);
    break;
    case 9243:
    boltBonus = 1.1;
    combatEntity.getOpponent().doGfx(758);
    break;
    case 9244:
    boltBonus = 1.2;
    combatEntity.getOpponent().doGfx(756);
    break;
    case 9245:
    boltBonus = 1.3;
    combatEntity.getOpponent().getEntity().playGraphic s(Graphic.create(753));
    break;
    }
    damg *= boltBonus;
    }
    if(CombatAssistant.darkBow(weaponId)){
    damgDouble = random(maxHit);
    doubleHit = true;
    }
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    //divine spirit shield

    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damg = 0;
    /**
    * Prayer Checking
    */
    if (combatEntity.getOpponent().getPlayer().getPrayer( )[17]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[38]) {
    if(random(3) == 0){
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2229);
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    }
    damg *= 0.5;
    }
    if (doubleHit) {
    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damgDouble = 0;
    else if (combatEntity.getOpponent().getPlayer().getPrayer( )[13]
    && random(3) == 1)
    damgDouble = (int) (damgDouble * 0.4);
    }
    } else {
    if (random(CombatAssistant.calculateMeleeAttack(comba tEntity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[9]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }

    // delay = 1500;
    hit = true;
    combatEntity.getPlayer().getWalkingQueue().reset() ;// dont
    // move!
    }
    }
    /**
    * Melee
    */
    if (!hit) {
    if (combatEntity.getPlayer().duelRule[3]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use melee in this duel.");
    return false;
    }
    if (!combatEntity.getEntity().getLocation().isWithinD istance(combatEntity.getOpponent().getEntity().get Location(), (1 + extraDis))) {

    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    if(!combatEntity.canMove() && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) == 2)
    return true;
    //combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    /*
    * if(!WorldMap.projectileClear(combatEntity.getEntit y().
    * getLocation().getZ(),
    * combatEntity.getEntity().getLocation().getX(),
    * combatEntity.getEntity().getLocation().getY(),
    * combatEntity
    * .getOpponent().getEntity().getLocation().getX() +
    * combatEntity
    * .getOpponent().getOffsetX(),combatEntity.getOppone nt
    * ().getEntity().getLocation().getY() +
    * combatEntity.getOpponent().getOffsetY())) return true;
    */
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;

    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;// we dont want to reset attack but just
    // wait another 500ms or so...
    }
    int addspeed = combatEntity.getAtkSpeed();
    if (addspeed != 0)
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    else
    combatEntity.predictedAtk = System.currentTimeMillis() + 2400;

    /*
    * else
    * combatEntity.getPlayer().getActionSender().resetFo llow();
    */// this isnt too nessary in melee, only magic and range
    if (bowType != Constants.RANGEDNOARROWS)
    combatEntity.doAtkEmote();
    else
    combatEntity.doAnim(422);// you dont try shoot arrows
    // wen u have no arrows
    /**
    * Get random Damage Hit.
    */
    damg = random(maxHit);
    //RestarterThread.getRestarter().updateCombatTimer() ;
    boolean verac = false;
    if (CombatAssistant.isVeracEquiped(combatEntity.getPl ayer())
    && random(2) == 1)
    verac = true;
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!verac){
    /**
    * Here is the Hit determine stuff, Includes Overhead Prayers.
    */
    int MeleeAtk = CombatAssistant.calculateMeleeAttack(combatEntity. getPlayer());
    int MeleeDef = CombatAssistant.calculateMeleeDefence(combatEntity .getOpponent().getPlayer());
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Atk : " + MeleeAtk + " Def : " + MeleeDef);
    }*/
    int deltaBonus = MeleeAtk - MeleeDef;
    int toAdd = Misc.random(deltaBonus/15);
    damg += toAdd;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("ToAdd: " + toAdd);
    }*/
    if(damg < 0)
    damg = 0;
    if(damg > maxHit)
    damg = maxHit;
    if(2*random(MeleeAtk) < random(MeleeDef))
    damg = 0;
    if(combatEntity.getOpponent().getPlayer().getPraye r()[18]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[39]){
    damg *= 0.5;
    if(random(3) == 0){
    // Apply Deflect Curses
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2230);
    }
    }
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Damg : " + damg);
    }*/
    }
    } else {
    if (!verac
    && random(CombatAssistant.calculateMeleeAttack(combat Entity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[(combatEntity.getAtkType() + 2)]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }
    hit = true;
    }
    /**
    * Spirit shield effects.
    */
    damg = SpiritShields.applyEffects(combatEntity, damg);
    if (finishOff) {
    finishOff(combatEntity,damg,hit,bowType,damgDouble ,doubleHit,distance,possibleMaxHit,combatStyle);
    }
    Curses.applyLeeches(combatEntity.getPlayer());
    return true;
    }

    public static boolean finishOff(final CombatEntility combatEntity, final int damg, final boolean hit, final int bowType, final int damgDouble, final boolean doubleHit, final int distance, final int maxHit,final int combatStyle) {
    if(!hit)
    return true;
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    int delay = 300 + distance * 200;
    World.getWorld().submit(new Event(delay) {
    public void execute() {
    if(combatEntity == null || combatEntity.getOpponent() == null) {
    this.stop();
    return;
    }
    /**
    * Another verification check incase of glitchers.
    */
    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    this.stop();
    return;
    }
    /**
    * Poisoning of enemy.
    */
    if(!combatEntity.getOpponent().isPoisoned()) {
    if(damg > 0 && combatEntity.getWeaponPoison() > 0) {
    if(random(10) <= combatEntity.getWeaponPoison()) {
    poisonEntity(combatEntity.getOpponent());
    }
    }
    }
    /**
    * Smiting.
    */
    if(combatEntity.getOpponent().getEntity() instanceof Player) {
    if(combatEntity.getOpponent().getPlayer().getPraye r()[23]) {
    Prayer.smite(combatEntity.getPlayer(), damg);
    }
    }
    /**
    * Soulsplit.
    */
    if (combatEntity.getPlayer().getPrayer()[48])
    Prayer.soulSplit(combatEntity.getPlayer(), combatEntity.getOpponent(), damg);
    /**
    * Applies Damage.
    */
    int critical = damg >= 0.90 * maxHit ? 5 : 0; // Later substract 5
    int actualDamage = combatEntity.getOpponent().hit(damg, combatEntity.getEntity(), false, combatStyle + critical);
    /**
    * Recoil and vengeance.
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    Magic.vengeance(combatEntity.getOpponent().getPlay er(), combatEntity, actualDamage);
    Magic.recoil(combatEntity.getOpponent().getPlayer( ), combatEntity, actualDamage);
    }
    if (doubleHit)
    combatEntity.getOpponent().hit(damgDouble, combatEntity.getEntity(), false, 1);
    CombatAssistant.addExperience(combatEntity, bowType, actualDamage);
    if (isGuthanEquiped(combatEntity.getPlayer()))
    combatEntity.getPlayer().heal((int) (actualDamage * 0.5));
    if (combatEntity.getOpponent().getCurrentAtker() == null
    || combatEntity.getOpponent().getCurrentAtker() == combatEntity) {
    /*
    * opponentHit.face(combatEntity.getAbsX(
    * ), combatEntity.getAbsY());
    */
    if (combatEntity.getOpponent().summonedNpc != null)
    combatEntity.getOpponent().summonedNpc.cE.setOppon ent(combatEntity);
    if (combatEntity.getOpponent().getEntity() instanceof Player
    || combatEntity.getOpponent().getNPC().getDefinition( ).doesDefEmote())
    combatEntity.getOpponent().doDefEmote();
    if (combatEntity.getOpponent().getEntity() instanceof NPC
    || combatEntity.getOpponent().getPlayer().autoRetaila te) {
    combatEntity.getOpponent().setOpponent(combatEntit y);
    }
    }
    this.stop();
    }
    });
    return true;

    }

    /**
    * Processes the combat for an NPC combatEntity.
    * @param combatEntity
    * @param distance
    * @return
    */
    private static boolean processNpcCombat(final CombatEntility combatEntity, int distance) {
    if (combatEntity.attack == null)
    combatEntity.attack = World.getWorld().getNPCManager().getAttack(combatE ntity.getNPC());
    // combatEntity.doAtkEmote();
    if (combatEntity.attack != null) {
    // timer
    /*
    * if(combatEntity.predictedAtk >
    * System.currentTimeMillis()){
    * follow(combatEntity,combatEntity.getOpponent()); return
    * true;//we dont want to reset attack but just wait another
    * 500ms or so... }
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!combatEntity.getOpponent().getPlayer().isActive( )
    || combatEntity.getOpponent().getPlayer().isHidden()) {
    resetAttack(combatEntity);
    return false;
    }
    }
    combatEntity.getNPC().face(combatEntity.getOpponen t().getEntity().getLocation());
    int type = combatEntity.attack.handleAttack(combatEntity.getN PC(), combatEntity.getOpponent());
    if (type == 1
    && combatEntity.getNPC().agreesiveDis > 0
    && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) <= combatEntity.getNPC().agreesiveDis) {
    type = 0;
    }
    if (type == 5) {
    /*
    * if(combatEntity.getOpponent().getOpponent() == null
    * || combatEntity.getOpponent().getOpponent() ==
    * combatEntity){
    * //combatEntity.getOpponent().face(combatEntity
    * .getAbsX(),combatEntity.getAbsY());
    * combatEntity.getOpponent
    * ().face(combatEntity.getAbsX()
    * +combatEntity.getOffsetX
    * (),combatEntity.getAbsY()+combatEntity.getOffsetY( ));
    *
    * if(combatEntity.getOpponent().getEntity() instanceof
    * Player ||
    * combatEntity.getOpponent().getNPC().getDefinition
    * ().doesDefEmote())
    * combatEntity.getOpponent().doDefEmote();
    * if(combatEntity.getOpponent().getEntity() instanceof
    * NPC ||
    * combatEntity.getOpponent().getPlayer().autoRetaila te
    * ){
    * combatEntity.getOpponent().setOpponent(combatEntit y);
    * } }
    */
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    // successful
    } else if (type == 1) {
    // cancel
    return false;
    } else if (type == 0) {

    follow(combatEntity, combatEntity.getOpponent());
    }
    }
    return true;
    // combatEntity.getOpponent().hit(1,combatEntity.getO pponent().getEntity(),false);
    // npc combat, not as complicated as player combat
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, int type) {
    if (type >= 3)
    type = Constants.MAGE;
    return npcAttack(npc, combatEntity, damg, delay, type, false);
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, final int type, final boolean prayerBlock) {
    World.getWorld().submit(new Event(delay) {
    @Override
    public void execute() {
    if (combatEntity.getEntity().isDead() || npc.isDead()) {
    this.stop();
    return;
    }
    int newDamg = damg;
    if (combatEntity.getEntity() instanceof Player) {
    //divine spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13740 && combatEntity.getPlayer().getSkills().getLevel(5) > 0){
    combatEntity.getPlayer().getSkills().detractLevel( 5,(int)(damg * 0.15));
    newDamg = (int) (damg * 0.3);
    }
    //elysian spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13742 && Misc.random(9) >= 6){
    newDamg = (int) (damg * 0.25);
    }
    //prayers and curses
    if (!prayerBlock) {
    if ((combatEntity.getPlayer().getPrayer()[16] || combatEntity.getPlayer().getPrayer()[37])
    && type == 2) {
    if (combatEntity.getPlayer().getPrayer()[37])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 2);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[17] || combatEntity.getPlayer().getPrayer()[38])
    && type == 1) {
    if (combatEntity.getPlayer().getPrayer()[38])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 1);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[18] || combatEntity.getPlayer().getPrayer()[39])
    && type == 0) {
    if (combatEntity.getPlayer().getPrayer()[39])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 0);
    newDamg = 0;
    } else if (type == 0
    && Combat.random(npc.getDefinition().getBonus()[1]) < Combat.random(CombatAssistant.calculateMeleeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    }
    //defence
    if (type == 1
    && Combat.random(npc.getDefinition().getBonus()[3]) < Combat.random(CombatAssistant.calculateRangeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    if (type == 2
    && Combat.random(npc.getDefinition().getBonus()[4]) < Combat.random(CombatAssistant.calculateMageDef(com batEntity.getPlayer()))) {
    newDamg = 0;
    }
    if(npc.getDefinition().getId() == 9463){
    if(Misc.random(12) == 0){
    combatEntity.freezeTimer = System.currentTimeMillis() + 20000;
    combatEntity.getPlayer().getActionSender().sendMes sage("The Strykewyrm used his Ice Bite and froze you!");
    }
    }
    }
    if (combatEntity.getOpponent() == null
    || combatEntity.getOpponent() == npc.cE) {

    combatEntity.face(combatEntity.getAbsX(), combatEntity.getAbsY());
    if (combatEntity.summonedNpc != null)
    combatEntity.summonedNpc.cE.setOpponent(npc.cE);
    if (combatEntity.getEntity() instanceof Player
    || combatEntity.getNPC().getDefinition().doesDefEmote ())
    combatEntity.doDefEmote();
    if (combatEntity.getEntity() instanceof NPC
    || combatEntity.getPlayer().autoRetailate) {
    //System.out.println("SETING OPP LOOL3");
    combatEntity.setOpponent(npc.cE);
    }

    }
    // combatEntity.doDefEmote();
    combatEntity.hit(newDamg, npc.cE.getEntity(), false, type >= 3 ? Constants.MAGE
    : type);
    this.stop();
    }
    });
    return false;
    }

    public static void npcRangeAttack(final NPC n, final CombatEntility attack, int gfx, int height, boolean slowdown) {

    // offset values for the projectile
    int offsetY = ((n.cE.getAbsX() + n.cE.getOffsetX()) - attack.getAbsX())
    * -1;
    int offsetX = ((n.cE.getAbsY() + n.cE.getOffsetY()) - attack.getAbsY())
    * -1;
    // find our lockon target
    int hitId = attack.getSlotId((Entity) n);
    // extra variables - not for release
    int distance = attack.getEntity().getLocation().distance((Locatio n.create(n.cE.getEntity().getLocation().getX()
    + n.cE.getOffsetX(), n.cE.getEntity().getLocation().getY()
    + n.cE.getOffsetY(), n.cE.getEntity().getLocation().getZ())));
    int timer = 1;
    int min = 16;
    if (distance > 8) {
    timer += 2;
    } else if (distance >= 4) {
    timer++;
    }
    min -= (distance - 1) * 2;
    int speed = 75 - min;
    int slope = 7 + distance;
    if (slowdown)
    speed = speed * 2;
    // create the projectile
    // System.out.println("hitId: "+hitId);
    attack.getPlayer().getActionSender().createGlobalP rojectile(n.cE.getAbsY()
    + n.cE.getOffsetY(), n.cE.getAbsX() + n.cE.getOffsetX(), offsetY, offsetX, 50, speed, gfx, height, 35, hitId, slope);
    }

    // 1 - attack is ok
    // 0 - wild level not enough
    // 2 - aready in combat them
    // 3 - your being attacked

    public static String canAtk(CombatEntility combatEntity, CombatEntility opponent) {
    if (!isInMulti(combatEntity) || !isInMulti(opponent)) {
    /* Summon Npcs */
    if (combatEntity.getEntity() instanceof NPC) {
    if (combatEntity.getNPC().summoned) {
    if (opponent.getEntity() instanceof NPC)// summon attacking
    // another npc
    // in a singles
    // area = OK
    return "1";
    else
    // otherwise there attacking a player in singles
    return "blablabla";
    }
    }
    if ((combatEntity.getEntity() instanceof Player)
    && (opponent.getEntity() instanceof Player)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) combatEntity.getEntity(), 30000, -1, -1, -1)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) opponent.getEntity(), 30000, -1, -1, -1))
    return "1";
    String type = "NPC";
    if (opponent.getEntity() instanceof Player)
    type = "player";
    if(type.equals("player") && combatEntity.getEntity() instanceof Player){
    /**
    * If opponent hasent been in combat for a while, u can attack him
    * If he hasent, you look if his last attacker = you
    */
    if(opponent.getPlayer().getLastAttack().timeSinceL astAttack() < 10000){
    if(!opponent.getPlayer().getLastAttack().getName() .equals(combatEntity.getPlayer().getName()))
    return "This " + type + " is already in combat.";
    }
    /**
    * If you are in combat, is the person who recently attacked you = person who u wanna atk?
    */
    if(combatEntity.getPlayer().getLastAttack().timeSi nceLastAttack() < 10000){
    if(!combatEntity.getPlayer().getLastAttack().getNa me().equals(opponent.getPlayer().getName()))
    return "I am already in combat";
    }
    }
    else if (opponent.getOpponent() != null
    && opponent.getOpponent() != combatEntity)
    return "This " + type + " is already in combat.";
    }
    if (combatEntity.getEntity() instanceof Player
    && opponent.getEntity() instanceof Player) {
    if (combatEntity.getPlayer().duelAttackable > 0) {
    if (opponent.getEntity().getIndex() == combatEntity.getPlayer().duelAttackable) {
    return "1";
    } else {
    return "This is not your opponent!";
    }
    }
    if ((combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || /* fun pk multi */
    (combatEntity.getAbsX() >= 3271
    && combatEntity.getAbsX() <= 3307
    && combatEntity.getAbsY() >= 3012 && combatEntity.getAbsY() <= 3039))// fun
    // pk
    // singles
    return "1";
    if (CastleWars.getCastleWars().canAttack(combatEntity .getPlayer(), opponent))
    return "1";
    // wilderness level is too great
    String differenceOk = "You need to move deeper into the wilderness to attack this player.";
    int cb1 = combatEntity.getCombat();
    int cb2 = opponent.getCombat();
    int difference = getRealLevel(combatEntity, opponent);
    if (cb1 - cb2 <= difference && cb1 - cb2 >= 0 && difference > 0)
    differenceOk = "";
    else if (cb2 - cb1 <= difference && cb2 - cb1 >= 0 && difference > 0)
    differenceOk = "";
    return differenceOk;
    }
    // this will be returned for summons in a multi area
    return "1";
    }

    public static void resetAttack(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getOpponent() != null) {
    if (combatEntity.getOpponent().getAttackers().contain s(combatEntity)) {
    combatEntity.getOpponent().getAttackers().remove(c ombatEntity);
    }
    combatEntity.setOpponent(null);
    }
    }

    public static void logoutReset(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getAttackers().size() > 0) {
    CombatEntility c3[] = new CombatEntility[combatEntity.getAttackers().size()];
    int i = 0;
    for (CombatEntility c4 : combatEntity.getAttackers()) {
    c3[i] = c4;
    i++;
    }
    for (CombatEntility c2 : c3) {
    resetAttack(c2);
    }
    c3 = null;
    }
    combatEntity.getAttackers().clear();
    resetAttack(combatEntity);
    }

    public static int getRealLevel(CombatEntility combatEntity, CombatEntility b) {
    int a = getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY());
    int d = getWildLevel(b.getAbsX(), b.getAbsY());
    return Math.min(a, d);
    }

    public static int getWildLevel(int absX, int absY) {
    if ((absY >= 3520 && absY <= 3967 && absX <= 3392 && absX >= 2942))
    return (((absY - 3520) / 8) + 1);
    else
    return -1;
    }

    public static boolean isInMulti(CombatEntility combatEntity) {
    if ((combatEntity.getAbsX() >= 3136 && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3520 && combatEntity.getAbsY() <= 3607)
    || (combatEntity.getAbsX() >= 3190
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3648 && combatEntity.getAbsY() <= 3839)
    || (combatEntity.getAbsX() >= 3200
    && combatEntity.getAbsX() <= 3390
    && combatEntity.getAbsY() >= 3840 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2992
    && combatEntity.getAbsX() <= 3007
    && combatEntity.getAbsY() >= 3912 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2946
    && combatEntity.getAbsX() <= 2959
    && combatEntity.getAbsY() >= 3816 && combatEntity.getAbsY() <= 3831)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3199
    && combatEntity.getAbsY() >= 3856 && combatEntity.getAbsY() <= 3903)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3071
    && combatEntity.getAbsY() >= 3600 && combatEntity.getAbsY() <= 3711)
    || (combatEntity.getAbsX() >= 2889
    && combatEntity.getAbsX() <= 2941
    && combatEntity.getAbsY() >= 4426 && combatEntity.getAbsY() <= 4465)
    || // dag kings
    (combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || // fun pk multi
    (combatEntity.getAbsX() >= 3071
    && combatEntity.getAbsX() <= 3146
    && combatEntity.getAbsY() >= 3394 && combatEntity.getAbsY() <= 3451)
    || // barb
    (combatEntity.getAbsX() >= 2814
    && combatEntity.getAbsX() <= 2942
    && combatEntity.getAbsY() >= 5250 && combatEntity.getAbsY() <= 5373)
    || // godwars
    (combatEntity.getAbsX() >= 3072
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3608 && combatEntity.getAbsY() <= 3647)
    )
    return true;
    return false;
    }

    public static int random(int range) {
    return (int) (java.lang.Math.random() * (range + 1));
    }

    public static void follow(final CombatEntility combatEntity, final CombatEntility opponent) {
    // System.out.println("Running this Method");
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return;
    combatEntity.getEntity().getWalkingQueue().reset() ;
    if (combatEntity.getEntity() instanceof Player) {
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    // follow2(combatEntity,combatEntity.getEntity().getW alkingQueue().getPublicPoint().getX(),combatEntity .getEntity().getWalkingQueue().getPublicPoint().ge tY(),opponent.getAbsX(),opponent.getAbsY(),opponen t.getAbsZ());
    } else
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    combatEntity.getEntity().getWalkingQueue().finish( );
    }

    public static void follow2(final CombatEntility combatEntity, int x, int y, int toX, int toY, int height) {
    int moveX = 0;
    int moveY = 0;

    /*
    * int path[][] = PathfinderV2.findRoute(x,y,toX, toY,height); if(path
    * == null) return; toX = path[1][0]; toX = path[1][1];
    */
    if (x > toX)
    moveX = -1;
    else if (x < toX)
    moveX = 1;
    if (y > toY)
    moveY = -1;
    else if (y < toY)
    moveY = 1;
    if (moveX != 0 && moveY != 0) {
    if (!World.getWorld().isWalkAble(height, x, y, (x + moveX), (y + moveY), 0)) {
    if (World.getWorld().isWalkAble(height, x, y, (x + moveX), y, 0)) {
    moveY = 0;
    } else if (World.getWorld().isWalkAble(height, x, y, x, (y + moveY), 0)) {
    moveX = 0;
    } else {
    return;
    }
    }
    } else if (!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + moveY, 0)) {
    if(moveX != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + 1, 0)){
    moveY = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    - 1, 0)){
    moveY = -1;
    }
    }
    else if(moveY != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + 1, y
    + moveY, 0)){
    moveX = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x -1, y
    + moveY, 0)){
    moveX = -1;
    }
    }
    }
    combatEntity.getEntity().getWalkingQueue().addStep (x + moveX, y + moveY);
    }

    /**
    * This method is used to poison a CombatEntility.
    * @param combatEntity
    */
    public static void poisonEntity(final CombatEntility combatEntity) {
    if(combatEntity == null)
    return;
    if (combatEntity.isPoisoned())
    return;
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("You have been poisoned.");
    combatEntity.setPoisoned(true);
    World.getWorld().submit(new Event(16000) {
    private int lastDamg = -1;
    private int ticks = 4;
    @Override
    public void execute() {
    if (!combatEntity.isPoisoned()) {
    this.stop();
    return;
    }
    if (combatEntity.getEntity() instanceof Player) {
    if (!combatEntity.getPlayer().isActive()) {
    this.stop();
    return;
    }
    }
    if (lastDamg == -1)
    lastDamg = random(10);
    if (ticks == 0) {
    lastDamg--;
    ticks = 4;
    }
    ticks--;
    if (lastDamg == 0) {
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("Your poison clears up.");
    combatEntity.setPoisoned(false);
    this.stop();
    } else {
    combatEntity.hit(lastDamg, null, true, 0);
    }
    }
    });
    }

    public void ateFood(final CombatEntility combatEntity) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 1000)// this
    // should
    // make
    // sure,
    // you
    // dont
    // eat
    // and
    // hit
    // at
    // the
    // same
    // time.
    return;
    combatEntity.predictedAtk = System.currentTimeMillis() + 1000;
    // combatEntity.predictedAtk2 = System.currentTimeMillis()+1000;
    // combatEntity.predictedAtk3 = System.currentTimeMillis()+1000;
    }

    public static boolean canAtkDis(final CombatEntility combatEntity, final CombatEntility attack) {
    if (combatEntity.getEntity().getLocation().distance(a ttack.getEntity().getLocation()) > 1) {
    return !WorldMap.projectileClear(combatEntity.getEntity() .getLocation(), combatEntity.getOpponent().getEntity().getLocation ());
    } else {
    return WorldMap.checkPos(attack.getEntity().getLocation() .getZ(), combatEntity.getEntity().getLocation().getX(), combatEntity.getEntity().getLocation().getY(), attack.getEntity().getLocation().getX(), attack.getEntity().getLocation().getY(), 1);
    }
    }

    public static void removeArrow(Player player, int bowType, Location loc) {
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) == null)
    return;
    int slot = Equipment.SLOT_ARROWS;
    if (bowType == Constants.RANGEDWEPSTYPE) {
    slot = Equipment.SLOT_WEAPON;
    }
    if (player.getEquipment().get(slot) != null) {
    Item item = new Item(player.getEquipment().get(slot).getId(), 1);
    if (item.getId() != 4740 && item.getId() != 15243) {
    if (random(3) != 1) {
    if (player.getEquipment().get(Equipment.SLOT_CAPE) != null
    && player.getEquipment().get(Equipment.SLOT_CAPE).get Id() == 10499) {
    // player.getInventory().add(item);
    return;
    } else {
    World.getWorld().getGlobalItemManager().newDropIte m(player, new GlobalItem(player, loc, item));
    }
    }
    }
    }
    if (player.getEquipment().get(slot).getCount() <= 1)
    player.getEquipment().set(slot, null);
    else
    player.getEquipment().set(slot, new Item(player.getEquipment().get(slot).getId(), (player.getEquipment().get(slot).getCount() - 1)));

    }

    public static void addXP(Player player, int damg, boolean bow) {
    if (damg > 0) {
    int exp = damg * 1200;
    if (player.getSkills().getLevelForExperience(player.c E.getAtkType()) >= 90)
    exp = damg * 800;
    if (player.cE.getAtkType() == 3) {
    player.cE.setAtkType(2);
    }
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    if ((player.cE.getAtkType() == 5 || player.cE.getAtkType() == 2)
    && CombatAssistant.isControlled(player.getEquipment() .get(Equipment.SLOT_WEAPON).getId())) {
    player.cE.setAtkType(3);
    }
    }
    if (player.cE.getAtkType() == 6 && bow) {
    player.getSkills().addExperience(4, 0.66 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 6 && !bow) {
    player.cE.setAtkType(1);
    }
    if (player.cE.getAtkType() == 5 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 5 && !bow) {
    player.cE.setAtkType(2);
    }
    if (player.cE.getAtkType() == 4 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 4 && !bow) {
    player.cE.setAtkType(0);
    }
    if (player.cE.getAtkType() == 1 && bow) {
    player.cE.setAtkType(6);
    }

    else if (bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    } else if (player.cE.getAtkType() != 3) {
    player.getSkills().addExperience(player.cE.getAtkT ype(), exp);
    player.getSkills().addExperience(3, 0.5 * exp);
    } else {
    player.getSkills().addExperience(0, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    player.getSkills().addExperience(2, 0.33 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    }
    }
    }

    public static boolean isGuthanEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4724
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4726
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4728
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4730)
    return true;
    return false;
    }

    public static boolean isToragEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4745
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4747
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4749
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4751)
    return true;
    return false;
    }

    public static void createGlobalProjectile(Entity e,int casterY, int casterX, int offsetY, int offsetX, int angle, int speed, int gfxMoving, int startHeight, int endHeight, int lockon,int slope) {
    if(e == null)
    return;
    for(Player p : e.getLocalPlayers()){
    p.getActionSender().createProjectile(casterY, casterX, offsetY, offsetX, angle, speed, gfxMoving, startHeight, endHeight, lockon, slope);
    }
    }

    }


    Also CombatAssistant
    Spoiler for combatassistant:

    package org.hyperion.rs2.model.combat;

    import java.util.Random;

    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.container.Container;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.skill.Prayer;

    public class CombatAssistant {

    public static void addExperience(CombatEntility combatEntity, int bowType, int damage) {
    if (bowType != Constants.RANGEDNOARROWS && bowType != Constants.MELEETYPE)
    Combat.addXP(combatEntity.getPlayer(), damage, true);
    else
    Combat.addXP(combatEntity.getPlayer(), damage, false);
    }

    /**
    * Use this method to check if a player needs to be skulled and skull him.
    * @param combatEntity
    */
    public static void checkSkull(CombatEntility combatEntity) {
    if(combatEntity.getOpponent().getOpponent() == combatEntity)
    return;
    if(!(combatEntity.getOpponent().getEntity() instanceof Player))
    return;
    if(Combat.getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY()) == -1)
    return;
    if(System.currentTimeMillis() - combatEntity.lastHit < 10000)
    return;
    if (combatEntity.getPlayer().isSkulled == -1) {
    combatEntity.getPlayer().isSkulled = 0;
    Prayer.setHeadIcon(combatEntity.getPlayer());
    }
    combatEntity.getPlayer().skullTimer = 1200;
    }
    /**
    * Use this to get the extra distance in combat of a combatEntity.
    * @param combatEntity
    * @return
    */
    public static int getExtraDistance(CombatEntility combatEntity) {
    if(!combatEntity.getPlayer().isMoving)
    return 0;
    if(combatEntity.freezeTimer != 0)
    return 0;
    return 1;
    }
    /**
    * Use this to get a players shield id.
    * @param equipment
    * @return
    */
    public static int getShieldId(Container equipment) {
    if (equipment.get(Equipment.SLOT_SHIELD) != null) {
    return equipment.get(Equipment.SLOT_SHIELD).getId();
    }
    return -1;
    }
    /**
    * Use this to get a players arrows id.
    * @param equipment
    * @return
    */
    public static int getArrowsId(Container equipment) {
    if (equipment.get(Equipment.SLOT_ARROWS) != null) {
    return equipment.get(Equipment.SLOT_ARROWS).getId();
    }
    return -1;
    }

    /**
    * Use this to get a players weapon id;
    * @param equipment
    * @return
    */
    public static int getWeaponId(Container equipment) {
    if (equipment.get(Equipment.SLOT_WEAPON) != null) {
    return equipment.get(Equipment.SLOT_WEAPON).getId();
    }
    return -1;
    }
    /**
    * Checks if the attacking combatEntity is valid, thus not null, not dead, etc
    * @param combatEntity
    * @return
    */
    public static boolean isValid(CombatEntility combatEntity) {
    if (combatEntity.getOpponent() == null || combatEntity.getOpponent().getEntity() == null) {
    return false;
    }
    if (combatEntity.getEntity().isDead() || combatEntity.getOpponent().getEntity().isDead()) {
    return false;
    }
    if(!combatEntity.getOpponent().isNpcAttackAble()){
    return false;
    }
    return true;
    }




    /**
    * Finds what weapon the client is using.
    */
    public static int getBowType(CombatEntility c) {
    /**
    * Get the weapon
    */
    Item Weapon = c.getPlayer().getEquipment().get(Equipment.SLOT_WE APON);
    /**
    * If Unarmed, Return MELEETYPE
    */
    if (Weapon == null)
    return Constants.MELEETYPE;
    /**
    * Get weaponId
    */
    int weaponId = Weapon.getId();
    /**
    * Check if using Knifes, Javelins etc
    */
    for (int g : RANGED_WEAPONS) {
    if (g == weaponId)
    return Constants.RANGEDWEPSTYPE;
    }
    /**
    * Declare Arrow
    */
    Item Arrow = c.getPlayer().getEquipment().get(Equipment.SLOT_AR ROWS);
    /**
    * Declare arrowId
    */
    int arrowId = -1;
    if (Arrow != null) {
    arrowId = Arrow.getId();
    }
    /**
    * Check if using Hand Cannon etc
    */
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == weaponId) {
    if (arrowId == -1)
    return Constants.UNIQUENOAMMO;
    ;
    if (getUniqueType(weaponId) == arrowId) {
    return Constants.UNIQUEAMMO;
    } else {
    return Constants.UNIQUEWRONG;
    }
    }
    }
    /**
    * Check if using a Bow like Magic shotbow
    */
    if(arrowId == DRAGON_ARROWS && darkBow(weaponId))
    return Constants.RANGEDARROWS;
    else if(arrowId == DRAGON_ARROWS)
    return Constants.RANGEDNOARROWS;

    for (int g : BOWS) {
    if (weaponId == g) {
    if (getArrowType(arrowId) != 0) {
    return Constants.RANGEDARROWS;
    } else {
    return Constants.RANGEDNOARROWS;
    }
    }
    }
    /**
    * Check if using Crossbow
    */
    for (int g : CBOWS) {
    if (weaponId == g) {
    if (getBoltType(arrowId, weaponId) != 0) {
    return Constants.RANGEDBOLTS;
    } else {
    return Constants.RANGEDNOBOLTS;
    }
    }
    }
    return Constants.MELEETYPE;
    }
    public static final int DRAGON_ARROWS = 112;


    public static boolean isControlled(int ItemId) {
    switch (ItemId) {
    case 4151:
    case 15441:
    case 15442:
    case 15443:
    case 15444:
    return true;
    }
    return false;
    }

    public static boolean is2H(int wep) {
    for (int i : BOWS) {
    if (i == wep)
    return true;
    }
    for (int i : TWO_HANDED) {
    if (i == wep)
    return true;
    }
    return false;
    }

    public static final int[] TWO_HANDED = { 10887, 13905, 13988, 14692, 17143,
    14484, 16909, 18369, 18353, 16425, 4153, 1307, 1309, 1311, 1313,
    1315, 1317, 1319, 6609, 7158,/* 2h weps */4886,4887,4888,4889,
    4982,4983,4984,4985,4958,4959,4960,4961,
    4718, 4710, 4755, 4747, 4734, 4726,/* barrows */11694, 11696,
    11698, 11700, 11730,/* godswords */11235,/* darkbow */10113, 9016,
    6587, 3095, 3096, 3097, 3098, 3099, 3100,/* claws */15701, 15702,
    15703, 15704, 15241

    };

    public static final int[] RANGED_WEAPONS = {
    /* knives */864, 863, 865, 866, 867, 868, 869,
    /* darts */806, 807, 808, 809, 810, 811, 3093,
    /* javelins */825, 826, 827, 828, 829, 830,
    /* thorwn axes */800, 801, 802, 803, 804, 805,
    13883,13879};

    public static final int[] CBOWS = { 9174, 9176, 9177, 9179, 9181, 9183,
    9185, 18357 };

    public static final int[][] UNIQUERANGEWEPS = {
    // Wep Id, Wep Ammo
    { 15241, 15243 }, { 4734, 4740 } };

    public static final int[] BOWS = { 839, 841, 843, 845, 847, 849, 851, 853,
    855, 857, 859, 861, 4212, 4214, 4827, 11235, 15701, 15702, 15703,
    15704 };

    public static int getArrowType(int arrow) {
    switch (arrow) {
    case 882: // Bronze
    return 1;
    case 884: // Iron
    return 2;
    case 886: // Steel
    return 3;
    case 888: // Mithril
    return 4;
    case 890: // Adamant
    return 5;
    case 892: // Rune
    return 6;
    case 598: // Fire arrows
    case 942:
    case 2533:
    case 2535:
    case 2537:
    case 2539:
    case 2541:
    return 7;
    case 78: // Ice arrows
    return 8;
    case 2866: // Flighted ogre arrow
    return 9;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 10;
    case 4150: // broad arrow
    return 11;
    case 11217: // dragon fire arrow
    return 12;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getUniqueType(int wep) {
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == wep) {
    return UNIQUERANGEWEPS[i][1];
    }
    }
    return -1;
    }

    public static int getBoltType(int arrow, int weapon) {
    if (weapon == 4734 && arrow == 4740)
    return 2;
    switch (arrow) {
    case 9140:// iron
    return 2;
    case 9141:// steel
    return 3;
    case 9142:// mith
    return 4;
    case 9143:// addy
    case 9243://Diamond
    case 9242://Ruby
    return 5;
    case 9144:// rune
    return 6;
    case 9145:// silver?
    return 2;
    case 9341:// dragon
    case 9244:
    return 7;
    case 9245:
    return 8;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getDrawback(int weapon, int arrow, int type) {
    switch(weapon){
    case 15241:
    return 2138;
    /*case 13883:
    return 1839;
    case 13879:
    return 1837;*/
    }
    if (type == 3) {
    // bolts
    return 28;
    } else if (darkBow(weapon)) {
    switch (arrow) {
    case 882: // Bronze arrow
    return 1104;
    case 884: // Iron arrow
    return 1105;
    case 886: // Steel arrow
    return 1106;
    case 888: // Mithril arrow
    return 1107;
    case 890: // Adamant arrow
    return 1108;
    case 892: // Rune arrow
    return 1109;
    case 78: // ice arrow
    return 1110;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1111;
    case 4150: // broad arrow
    return 1112;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    return 1113;
    case 11217: // dragon fire arrow
    return 1114;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 2) {
    if (weapon == 4212) // Crystal bow.
    return 472;
    switch (arrow) {
    case 882: // Bronze arrow
    return 18;
    case 884: // Iron arrow
    return 19;
    case 886: // Steel arrow
    return 20;
    case 888: // Mithril arrow
    return 21;
    case 890: // Adamant arrow
    return 22;
    case 892: // Rune arrow
    return 24;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1116;
    case 4740: // Bolt
    return 28;

    case 78: // ice arrow
    return 25;
    case 4150: // broad arrow
    return 325;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    case 11217: // dragon fire arrow
    return 26;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 1) {
    switch (weapon) {
    case 863: // Knife
    return 220;
    case 864:
    return 219;
    case 865:
    return 221;
    case 866:
    return 223;
    case 867:
    return 224;
    case 868:
    return 225;
    case 869:
    return 222;
    case 806: // Dart
    return 233;
    case 807:
    return 232;
    case 808:
    return 234;
    case 809:
    return 235;
    case 810:
    return 236;
    case 811:
    return 237;
    case 3093:
    return 235;
    case 825:// javelins
    return 207;
    case 826:
    return 206;
    case 827:
    return 208;
    case 828:
    return 209;
    case 829:
    return 210;
    case 830:
    return 211;
    case 800:// thrown axe
    return 42;
    case 801:
    return 43;
    case 802:
    return 44;
    case 803:
    return 45;
    case 804:
    return 46;
    case 805:
    return 48;
    default:
    System.out.println("Missing throwDrawback :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static int getProjectileSpeed(int weaponId) {
    /*
    * if (c.dbowSpec) return 100;
    */
    switch (weaponId) {
    case 15241:
    return 55;
    }
    return 70;
    }

    public static int getSlope(int weaponId) {
    switch (weaponId) {
    case 15241:
    return -1;
    }
    return 16;
    }

    public static int getStartHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 43;
    }

    public static int getEndHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 31;
    }

    public static int getDelay(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 30;
    }
    return 53;
    }

    public static int getArrowGfx(int weapon, int bowType, int type) {
    switch(weapon){
    case 15241:
    return 2143;
    case 13883:
    return 1839;
    case 13879:
    return 1837;
    }

    if (bowType == Constants.RANGEDBOLTS) {
    switch (type) {
    default:
    return 27;// most use gfx 27
    }
    } else if (bowType == Constants.RANGEDARROWS) {
    // Check first if we're using a Crystal bow.
    if (weapon == 4212) // Crystal bow.
    return 472;

    switch (type) {
    case 1: // Bronze
    return 10;
    case 2: // Iron
    return 9;
    case 3: // Steel
    return 11;
    case 4: // Mithril
    return 12;
    case 5: // Admanant
    return 13;
    case 6: // Rune
    return 15;
    case 7: // Fire
    return 17;
    case 8: // Ice
    return 16;
    case 9: // Flighted ogre arrow
    return 471;
    case 10: // dragon arrow
    return 1120;
    case 11: // broad arrow
    return 326;
    case 12: // dragon fire arrow
    return 17;
    default:
    return 0;
    }
    } else if (bowType == Constants.RANGEDWEPSTYPE) {
    switch (weapon) {
    case 863: // Iron knife
    return 213;
    case 864: // Bronze knife
    return 212;
    case 865: // Steel knife
    return 214;
    case 866: // Mithril knife
    return 216;
    case 867: // Adamant knife
    return 217;
    case 868: // Rune knife
    return 218;
    case 869: // Black knife
    return 215;
    case 806: // Bronze dart
    return 226;
    case 807: // Iron dart
    return 227;
    case 808: // Steel dart
    return 228;
    case 809: // Mithril dart
    return 229;
    case 810: // Adamant dart
    return 230;
    case 811: // Rune dart
    return 231;
    case 3093: // Black dart
    return 229;
    default:
    System.out.println("Missing throwGfx :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static boolean isVeracEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4753
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4755
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4757
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4759)
    return true;
    return false;
    }

    private static Random random = new Random();

    private static final double DEFENCE_MODIFIER = 0.895;

    public static int damage(int maxHit, Player attacker, Player victim,
    int skill, boolean prayer, boolean special, boolean ignorePrayers) {
    boolean veracEffect = false;
    if (skill == Skills.ATTACK) {
    if (isVeracEquiped(attacker)) {
    if (random.nextInt(8) == 3) {
    veracEffect = true;
    }
    }
    }

    double attackBonus = attacker.getBonus()[attacker.cE.getAtkType()] == 0 ? 1
    : attacker.getBonus()[attacker.cE.getAtkType()];
    if (attackBonus < 1) {
    attackBonus = 1;
    }
    double attackCalc = attackBonus * attacker.getSkills().getLevel(skill); // +1
    // as
    // its
    // exclusive

    /**
    * Prayer calculations.
    */
    if (skill == Skills.ATTACK) {
    // melee attack prayer modifiers
    if (attacker.getPrayer()[2]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[7]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[15]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[25]) {
    attackCalc *= 1.20;
    }
    } else if (skill == Skills.RANGE) {
    // range attack prayer modifiers
    if (attacker.getPrayer()[3]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[11]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[19]) {
    attackCalc *= 1.15;
    }
    } else if (skill == Skills.MAGIC) {
    // magic attack prayer modifiers
    if (attacker.getPrayer()[4]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[12]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[20]) {
    attackCalc *= 1.15;
    }
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 0) {
    attackCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    attackCalc += 1;
    }

    double defenceBonus = victim.getBonus()[attacker.cE.getAtkType() + 5] == 0 ? 1
    : victim.getBonus()[attacker.cE.getAtkType() + 5];
    double defenceCalc = defenceBonus
    * victim.getSkills().getLevel(Skills.DEFENCE); // +1 as its
    // exclusive
    /**
    * Prayer calculations.
    */
    if (attacker.getPrayer()[0]) {
    defenceCalc *= 1.05;
    } else if (attacker.getPrayer()[5]) {
    defenceCalc *= 1.10;
    } else if (attacker.getPrayer()[13]) {
    defenceCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    defenceCalc *= 1.20;
    } else if (attacker.getPrayer()[25]) {
    defenceCalc *= 1.25;
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 2) {
    defenceCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    defenceCalc += 1;
    }

    if (veracEffect) {
    defenceCalc = 0;
    }

    /**
    * The chance to succeed out of 1.0.
    */
    double hitSucceed = DEFENCE_MODIFIER * (attackCalc / defenceCalc);
    if (hitSucceed > 1.0) {
    hitSucceed = 1;
    }
    attacker.getActionSender().sendMessage(
    "atk value: " + (hitSucceed * 100));
    if (hitSucceed < random.nextDouble()) {
    return 0;
    } else {
    /**
    * Protection prayers. Note: If an NPC is hitting on a protection
    * prayer, it is 100% blocked, where as if a player is hitting on a
    * protection prayer, their damage is simply reduced by 40%. Also,
    * if the attacker has the Verac effect active, it will ignore the
    * opponent's protection prayers.
    */
    int hit = maxHit;
    double protectionPrayer = 1;
    if (ignorePrayers) {
    protectionPrayer = 1;
    }
    if (prayer) {
    protectionPrayer = 0.4;
    }
    hit = (int) (maxHit * protectionPrayer); // +1 as its exclusive
    return hit;
    }
    }

    /**
    * Real RuneScape Formulas.
    *
    */
    public static double getEffectiveStr(Player p) {
    return p.getSkills().getLevel(2) * getPrayerStr + getStyleBonus;
    }

    public static double getPrayerStr(Player p) {
    if (p.getPrayer()[1]) {
    return 1.05;
    } else if (p.getPrayer()[6]) {
    return 1.10;
    } else if (p.getPrayer()[14]) {
    return 1.15;
    } else if (p.getPrayer()[24]) {
    return 1.18;
    } else if (p.getPrayer()[25]) {
    return 1.23;
    // Curses
    } else if (p.getPrayer()[31]) {
    return 1.05;
    } else if (p.getPrayer()[44]) {
    return 1.15;
    } else if (p.getPrayer()[49]) {
    return 1.32;
    }
    return 1;
    }

    public static int getStyleBonus(Player p) {
    return 1;
    // TODO
    }

    public static int calculateMaxHit(Player p) {
    double base = 0;

    double effective = getEffectiveStr;
    double strengthBonus = p.getBonus()[10];

    base = (13 + effective + (strengthBonus / 10) + ((effective * strengthBonus) / 64)) / 10;


    if (p.specOn) {
    base = (base * SpecialAttacks.getSpecialBonus);
    }
    if (obbyZerk) {
    base *= 1.20;
    }
    if (fullVoidMelee) {
    base *= 1.15;
    }
    if (hasDharokEquiped) {
    double ratio = (double)p.getSkills().getLevel(Skills.HITPOINTS)/(double)p.getSkills().getLevelForExperience(Skills .HITPOINTS);
    base *= 2.0 - ratio;
    }
    if (base <= 0) {
    base = 1;
    }
    // p.getActionSender().sendMessage("Your max is " + Math.floor(base));
    return (int) Math.floor(base);

    }

    public static boolean obbyZerk(Player p) {
    if (p.getEquipment().get(Equipment.SLOT_AMULET) == null
    || p.getEquipment().get(Equipment.SLOT_WEAPON) == null) {
    return false;
    }
    if (p.getEquipment().get(Equipment.SLOT_AMULET).getId () == 11128
    && p.getEquipment().get(Equipment.SLOT_WEAPON).getId( ) == 6528)
    return true;
    return false;
    }

    public static boolean fullVoidMelee(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11665
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidRange(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11664
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidMage(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11663
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    /**
    * Checks if a player has the full dharok set equiped.
    * @param player
    * @return
    */
    public static boolean hasDharokEquiped(Player player) {
    if(player.getEquipment().get(Equipment.SLOT_HELM) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_HELM). getId() != 4716)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ).getId() != 4718)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) .getId() != 4720)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S).getId() != 4722)
    return false;
    return true;
    }

    public static int getRangedHit2(Player p) {
    int effectiveStrength = p.getSkills().getLevel(4);
    if (p.cE.bowType == 0)
    effectiveStrength += 3;
    int max = (int) (1.3 + (effectiveStrength / 10)
    + (p.getBonus()[4] / 80) + ((p.getBonus()[10] * p.getBonus()[4]) / 640));
    return max;
    }

    public static boolean darkBow(int itemId) {
    switch (itemId) {
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    return true;
    }
    return false;
    }

    /**
    * Get the ranged hit.
    *
    * @param maxHit
    * the current maxhit for melee
    * @param type
    * The type of the arrow.
    */

    public static int getRangedHit(int maxHit, int type) {
    /*
    * switch(type) { case 1: // Bronze return maxHit + (int)
    * Math.floor(Math.random() * 1); case 2: // Iron return maxHit + (int)
    * Math.floor(Math.random() * 2); case 3: // Steel return maxHit + (int)
    * Math.floor(Math.random() * 3); case 4: // Mithril return maxHit +
    * (int) Math.floor(Math.random() * 4); case 5: // Admanant return
    * maxHit + (int) Math.floor(Math.random() * 5); case 6: // Rune return
    * maxHit + (int) Math.floor(Math.random() * 6); case 7: // Fire return
    * maxHit + (int) Math.floor(Math.random() * 7); case 8: // Ice return
    * maxHit + (int) Math.floor(Math.random() * 8); case 9: // Flighted
    * ogre arrow return maxHit + (int) Math.floor(Math.random() * 8);
    * default: // Type is 0 return 2; }
    */
    int am = type;
    if (am > 8)
    am = 8;
    maxHit += type;
    return maxHit;
    }

    private static final int[][] RANGEDDATA = { { 877, 10 }, { 9140, 46 },
    { 9145, 36 }, { 9141, 64 }, { 9142, 82 }, { 9143, 100 },
    { 9144, 115 }, { 9236, 14 }, { 9237, 30 }, { 9238, 48 },
    { 9239, 66 }, { 9240, 83 }, { 9241, 85 }, { 9242, 103 },
    { 9243, 105 }, { 9244, 117 }, { 9245, 125 }, { 882, 7 },
    { 884, 10 }, { 886, 16 }, { 888, 22 }, { 890, 31 }, { 892, 49 },
    { 4740, 55 }, { 11212, 60 }, { 806, 1 }, { 807, 3 }, { 808, 4 },
    { 809, 7 }, { 810, 10 }, { 811, 14 }, { 11230, 20 }, { 864, 3 },
    { 863, 4 }, { 865, 7 }, { 866, 10 }, { 867, 14 }, { 868, 24 },
    { 825, 6 }, { 826, 10 }, { 827, 12 }, { 828, 18 }, { 829, 28 },
    { 830, 42 }, { 800, 5 }, { 801, 7 }, { 802, 11 }, { 803, 16 },
    { 804, 23 }, { 805, 36 }, { 9976, 0 }, { 9977, 15 }, { 4212, 70 },
    { 4214, 70 }, { 4215, 70 }, { 4216, 70 }, { 4217, 70 },
    { 4218, 70 }, { 4219, 70 }, { 4220, 70 }, { 4221, 70 },
    { 4222, 70 }, { 4223, 70 }, { 6522, 49 }, { 10034, 15 },
    { 15015, 130 }, { 15016, 110 }, { 4734, 49 }, { 4740, 49 },
    { 19157, 80 }, { 19162, 80 }, { 19152, 80 }, { 15243, 150 },
    { 13883, 130},{13879,135}
    };

    public static int getRangeStr(int i) {
    int str = 0;
    for (int l = 0; l < RANGEDDATA.length; l++) {
    if (i == RANGEDDATA[l][0]) {
    str = RANGEDDATA[l][1];
    }
    }
    return str;
    }

    public static int calculateRangeMaxHit(Player p) {
    int rangedBoosted = p.getSkills().getLevel(4);
    int rangedLevel = p.getSkills().getLevelForExperience(4);
    int rangedStr;
    if (CombatAssistant.getBowType(p.cE) == Constants.RANGEDWEPSTYPE)
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_WE APON)
    .getId());
    else
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_AR ROWS)
    .getId());
    double bonus = 1.00;
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    bonus = 1.05;
    } else if (p.getPrayer()[11]) {
    bonus = 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    bonus = 1.15;
    }
    if (fullVoidRange) {
    bonus += .15;
    }
    double e = Math.floor(rangedLevel * bonus + rangedBoosted / 8);

    /*
    * if (c.fightMode == 0) { e = (e + 3.0); }
    */
    double specialBonus = 1.0;

    if (p.specOn && p.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    switch (p.getEquipment().get(Equipment.SLOT_WEAPON).getId ()) {
    case 13883:
    specialBonus = 1.15;
    break;
    case 19149:
    case 19143:
    case 19146:
    case 859:
    specialBonus = 1.3;
    break;
    case 861:
    specialBonus = 1.1;
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    if (p.getEquipment().get(Equipment.SLOT_ARROWS) != null
    && p.getEquipment().get(Equipment.SLOT_ARROWS).getId( ) == 11212) {
    specialBonus = 1.3;
    } else {
    specialBonus = 1.1;
    }
    break;
    case 15241:
    specialBonus = 1.1;
    }
    }
    double max = (1.3 + e / 8 + rangedStr / 80 + e * rangedStr / 640);
    //p.getActionSender().sendMessage("Range max : " + max);
    max *= specialBonus;
    return (int) max;
    }

    public static int calculateRangeAttack(Player p) {
    double rangeAtk = p.getSkills().getLevel(4);
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    rangeAtk *= 1.05;
    } else if (p.getPrayer()[11]) {
    rangeAtk *= 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    rangeAtk *= 1.15;
    }
    if(fullVoidRange)
    rangeAtk *= 1.15;
    return (int) (0.50*(rangeAtk + p.getBonus()[4]));
    }

    public static int calculateRangeDefence(Player player) {
    int rangeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    rangeDef = rangeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    rangeDef = rangeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    rangeDef = rangeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    rangeDef = rangeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    rangeDef = rangeDef *= 1.15;
    }
    return rangeDef + player.getBonus()[9]/4;
    }

    public static int calculateMageAtk(Player player) {
    int mageLvl = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[3];
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLvl *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLvl *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLvl *= 1.15;
    }
    return mageLvl + bonus * 2;
    }

    public static int calculateMageDef(Player player) {
    int defLevel = player.getSkills().getLevel(1);
    int mageLevel = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[8];
    //Def Prayers
    if (player.getPrayer()[0]) {
    defLevel = defLevel *= 1.05;
    } else if(player.getPrayer()[5]){
    defLevel = defLevel *= 1.10;
    } else if(player.getPrayer()[13]){
    defLevel = defLevel *= 1.15;
    } else if(player.getPrayer()[24]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[25]){
    defLevel = defLevel *= 1.25;
    } else if(player.getPrayer()[43]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[49]){
    defLevel = defLevel *= 1.15;
    }
    //Mage Prayers
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLevel *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLevel *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLevel *= 1.15;
    }
    return bonus * 2 + defLevel/2 + mageLevel/2;
    }

    public static int bestMeleeDef(Player player) {
    if (player.getBonus()[5] > player.getBonus()[6]
    && player.getBonus()[5] > player.getBonus()[7])
    return 5;
    if (player.getBonus()[6] > player.getBonus()[5]
    && player.getBonus()[6] > player.getBonus()[7])
    return 6;
    return player.getBonus()[7] <= player.getBonus()[5]
    || player.getBonus()[7] <= player.getBonus()[6] ? 5 : 7;
    }

    public static int bestMeleeAtk(Player player) {
    if (player.getBonus()[0] > player.getBonus()[1]
    && player.getBonus()[0] > player.getBonus()[2])
    return 0;
    if (player.getBonus()[1] > player.getBonus()[0]
    && player.getBonus()[1] > player.getBonus()[2])
    return 1;
    return player.getBonus()[2] <= player.getBonus()[0]
    || player.getBonus()[2] <= player.getBonus()[1] ? 0 : 2;
    }

    /**
    * Calculate Melee Atk Value
    */
    public static int calculateMeleeAttack(Player player) {
    double meleeAtk = player.getSkills().getLevel(0);
    if(player.getPrayer()[2] || player.getPrayer()[31]){
    meleeAtk *= 1.05;
    } else if(player.getPrayer()[7]){
    meleeAtk *= 1.10;
    } else if(player.getPrayer()[15] || player.getPrayer()[40]){
    meleeAtk *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeAtk *= 1.17;
    } else if(player.getPrayer()[25]){
    meleeAtk *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeAtk *= 1.25;
    }
    double bonus = player.getBonus()[0];
    for(int i = 1; i < 3; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeAtk + bonus);
    }
    /**
    * @param player
    * @return Melee Defence
    */
    public static int calculateMeleeDefence(Player player) {
    int meleeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    meleeDef = meleeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    meleeDef = meleeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    meleeDef = meleeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    meleeDef = meleeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeDef = meleeDef *= 1.15;
    }
    double bonus = player.getBonus()[5];
    for(int i = 6; i < 8; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeDef + bonus*1.3);
    }

    public static void drawBackGfx(CombatEntility combatEntity, int weaponId,
    int arrowId, int bowType) {
    if (weaponId != 15241)
    combatEntity.doGfx(CombatAssistant.getDrawback(wea ponId, arrowId,
    bowType));
    else
    combatEntity.getPlayer().playGraphics(Graphic.crea te(2138));
    }

    /**
    * Sending Projectile part.
    */
    public static void fireProjectile(CombatEntility combatEntity, int bowType,
    int arrowType) {
    int weaponId = -1;
    if (combatEntity.getPlayer().getEquipment().get(Equip ment.SLOT_WEAPON) != null) {
    weaponId = combatEntity.getPlayer().getEquipment()
    .get(Equipment.SLOT_WEAPON).getId();
    }
    int proj = CombatAssistant.getArrowGfx(weaponId, bowType, arrowType);
    int offsetY = (combatEntity.getAbsX() - (combatEntity.getOpponent()
    .getAbsX() + combatEntity.getOpponent().getOffsetX())) * -1;
    int offsetX = (combatEntity.getAbsY() - (combatEntity.getOpponent()
    .getAbsY() + combatEntity.getOpponent().getOffsetY())) * -1;
    // Lockon Target
    int hitId = combatEntity.getSlotId(combatEntity.getEntity());
    int speed = CombatAssistant.getProjectileSpeed(weaponId);
    int slope = CombatAssistant.getSlope(weaponId);
    int startHeight = CombatAssistant.getStartHeight(weaponId);
    int endHeight = CombatAssistant.getEndHeight(weaponId);
    int time = CombatAssistant.getDelay(weaponId);
    // create the projectile
    combatEntity
    .getPlayer()
    .getActionSender()
    .createGlobalProjectile(combatEntity.getAbsY(),
    combatEntity.getAbsX(), offsetY, offsetX, 50, speed,
    proj, startHeight, endHeight, hitId, time, slope);
    Combat.removeArrow(combatEntity.getPlayer(), bowType, combatEntity
    .getOpponent().getEntity().getLocation());
    }
    }
    Reply With Quote  
     

  2. #2  
    Taking all OSGP donations at this time

    Deri's Avatar
    Join Date
    Apr 2014
    Age
    30
    Posts
    381
    Thanks given
    274
    Thanks received
    251
    Rep Power
    5000
    Paste combat handler. Can't do anything if we can't see your methods
    Reply With Quote  
     

  3. #3  
    Registered Member

    Join Date
    Dec 2013
    Posts
    866
    Thanks given
    121
    Thanks received
    138
    Rep Power
    107
    I dont have combathandler.java heres COMBAT.JAVA
    Spoiler for combat.java:

    package org.hyperion.rs2.model.combat;

    import org.hyperion.map.WorldMap;
    import org.hyperion.rs2.event.Event;
    import org.hyperion.rs2.model.Entity;
    import org.hyperion.rs2.model.GlobalItem;
    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Location;
    import org.hyperion.rs2.model.NPC;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.UpdateSpecialBar;
    import org.hyperion.rs2.model.World;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.minigame.CastleWars ;
    import org.hyperion.rs2.model.content.misc.ItemDegrading;
    import org.hyperion.rs2.model.content.skill.Prayer;
    import org.hyperion.rs2.model.content.skill.Slayer;
    import org.hyperion.rs2.util.RestarterThread;
    import org.hyperion.util.Misc;

    /**
    * @authors Martin and Arsen
    */

    public class Combat {



    public static boolean processCombat(final CombatEntility combatEntity) {
    try {
    /**
    * Logical check if combatEntity isn't null, isn't dead, etc..
    */
    if(!CombatAssistant.isValid(combatEntity))
    return false;
    /**
    * Facing
    */
    combatEntity.face(combatEntity.getOpponent().getAb sX() + combatEntity.getOpponent().getOffsetX(), combatEntity.getOpponent().getAbsY() + combatEntity.getOpponent().getOffsetY(), true);

    if (combatEntity.predictedAtk > System.currentTimeMillis()){
    return true;
    }

    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    if (combatEntity.getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    return false;
    }
    /**
    * Add opponent to attackers list
    */
    if (!combatEntity.getOpponent().getAttackers().contai ns(combatEntity)) {
    combatEntity.getOpponent().getAttackers().add(comb atEntity);
    }
    /**
    * Distance and freezetimer check.
    */
    int distance = combatEntity.getEntity().getLocation().distance((c ombatEntity.getOpponent().getEntity().getLocation( )));
    /*Checks if standing on eachother*/
    if (distance == 0) {
    /*If standing on eachother and frozen*/
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return false;
    if (!combatEntity.getOpponent().vacating) {
    combatEntity.vacating = true;
    combatEntity.getEntity().vacateSquare();
    }
    return true;
    }
    combatEntity.vacating = false;
    /**
    * Run seperate code depending on whether the combatEntity is an NPC or a Player.
    */
    if (combatEntity.getEntity() instanceof Player) {
    processPlayerCombat(combatEntity,distance);
    } else {
    processNpcCombat(combatEntity,distance);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return true;// was successful, false - reset attack
    }


    private static boolean processPlayerCombat(final CombatEntility combatEntity, int distance) {
    /**
    * Initializing variables.
    */
    boolean hit = false;
    boolean finishOff = true;
    boolean doubleHit = false;
    int arrowId = CombatAssistant.getArrowsId(combatEntity.getPlayer ().getEquipment());
    final int extraDis = CombatAssistant.getExtraDistance(combatEntity);
    int weaponId = CombatAssistant.getWeaponId(combatEntity.getPlayer ().getEquipment());
    int damgDouble = 0;
    int damg = 0;
    /**
    * Skull Adding
    */
    CombatAssistant.checkSkull(combatEntity);
    /**
    * Degrading
    */
    ItemDegrading.check(combatEntity.getPlayer());
    /**
    * Magic Combat
    */
    int magicAtk = combatEntity.getNextMagicAtk();
    if (combatEntity.getNextMagicAtk() > 0) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// Too far.
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    // cast the actual spell using magic code , result was if
    // its succesfuly or not (i.e no runes)
    int result = Magic.castSpell(combatEntity, combatEntity.getOpponent(), magicAtk);
    if (result == 2) {
    // if it worked remove the spell
    combatEntity.deleteSpellAttack();
    combatEntity.predictedAtk = System.currentTimeMillis() + 2500;
    // combatEntity.predictedAtk =
    // System.currentTimeMillis()+2000;
    // spell hit etc
    hit = true;
    finishOff = false;
    if (!(combatEntity.getAutoCastId() > 0)) {
    combatEntity.setOpponent(null);
    return false;
    }
    return true;
    } else if (result == 0) {
    // no runes so reset
    return false;
    }
    }
    /**
    * Max Hit and Combat Style Determination.
    */
    int bowType = CombatAssistant.getBowType(combatEntity);
    // Check Arrows/Bow
    if (bowType <= Constants.NOAMMO) {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    switch (bowType) {
    case Constants.RANGEDNOARROWS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no arrows left in your quiver.");
    break;
    case Constants.RANGEDNOBOLTS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no bolts left.");
    break;
    case Constants.UNIQUENOAMMO:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no ammo left.");
    break;
    case Constants.UNIQUEWRONG:
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use this type of ammo with this weapon.");
    break;
    }
    return false;
    }
    int maxHit = 0;
    final int combatStyle;
    if (bowType == Constants.MELEETYPE) {
    maxHit = CombatAssistant.calculateMaxHit(combatEntity.getPl ayer());
    combatStyle = Constants.MELEE;
    if(combatEntity.getAutoCastId() <= 0)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    } else {
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    combatStyle = Constants.RANGE;
    }
    final int possibleMaxHit = maxHit;
    /**
    * Special Activating
    */
    if (!hit && combatEntity.getNextMagicAtk() <= 0) {
    if (combatEntity.getPlayer().specOn) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 600) {
    return true;
    }
    combatEntity.getPlayer().specOn = false;
    if (weaponId == -1) {

    } else if (SpecialAttacks.special(combatEntity, maxHit, weaponId, extraDis, distance,combatStyle)) {
    hit = true;
    finishOff = false;
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    } else {
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    return true;
    }
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    }
    }
    /**
    * Autocasting
    */
    if (!hit) {
    if (combatEntity.getAutoCastId() > 0) {
    if (combatEntity.getPlayer().duelRule[4]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use magic in this duel.");
    combatEntity.setAutoCastId(0);
    return false;
    }
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;
    // timer
    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;
    }
    combatEntity.addSpellAttack(combatEntity.getAutoCa stId());
    hit = true;
    finishOff = false;
    }
    }
    /**
    * Ranging
    */
    if (!hit) {
    // If in Duel , Return
    if (bowType != 8 && combatEntity.getPlayer().duelRule[2]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use range in this duel.");
    return false;
    }
    if (bowType != Constants.MELEETYPE) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getActionSender().resetFo llow();
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }


    int arrowType = CombatAssistant.getArrowType(arrowId);
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    if (bowType == Constants.RANGEDWEPSTYPE)
    combatEntity.doAnim(806);// throw stuff anim
    else {
    combatEntity.doAtkEmote();
    }
    // System.out.println("range max: "+maxHit);

    /**
    * Sending Projectile part.
    */
    CombatAssistant.fireProjectile(combatEntity, bowType, arrowType);
    /**
    * Set Attack Speed
    */
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    // drawback gfx
    CombatAssistant.drawBackGfx(combatEntity, weaponId, arrowId, bowType);
    /**
    * Get random Damage Hit
    */
    damg = random(maxHit);
    /**
    * Checks Range bonus etc
    */
    int rangeAtk = CombatAssistant.calculateRangeAttack(combatEntity. getPlayer());
    int rangeDef;
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    rangeDef = CombatAssistant.calculateRangeDefence(combatEntity .getOpponent().getPlayer());
    else
    rangeDef = combatEntity.getOpponent().getCombat()/2 ;
    int deltaRangeBonus = rangeAtk - rangeDef;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Delta Range Bonus is : " + deltaRangeBonus);
    }*/
    int toadd = Misc.random(deltaRangeBonus/20);
    //System.out.println("Toadd is " + toadd);
    damg += toadd;
    if(damg < 0)
    damg = 0;
    else if(damg > maxHit)
    damg = maxHit;
    /**
    * Enchanted Bolts Effects
    */
    double boltBonus = 1;
    if(Misc.random(4) == 0 && damg > 0.6 * maxHit && bowType == Constants.RANGEDBOLTS){
    switch(arrowId){
    case 9242:
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    damg = combatEntity.getOpponent().getPlayer().getSkills() .getLevelForExperience(Skills.HITPOINTS)/5;
    else
    damg = combatEntity.getOpponent().getNPC().health/5;
    int newHp = (int)(combatEntity.getPlayer().getSkills().getLeve l(Skills.HITPOINTS) * 0.9);
    combatEntity.getPlayer().getSkills().setLevel(Skil ls.HITPOINTS, newHp);
    combatEntity.getOpponent().doGfx(754);
    break;
    case 9243:
    boltBonus = 1.1;
    combatEntity.getOpponent().doGfx(758);
    break;
    case 9244:
    boltBonus = 1.2;
    combatEntity.getOpponent().doGfx(756);
    break;
    case 9245:
    boltBonus = 1.3;
    combatEntity.getOpponent().getEntity().playGraphic s(Graphic.create(753));
    break;
    }
    damg *= boltBonus;
    }
    if(CombatAssistant.darkBow(weaponId)){
    damgDouble = random(maxHit);
    doubleHit = true;
    }
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    //divine spirit shield

    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damg = 0;
    /**
    * Prayer Checking
    */
    if (combatEntity.getOpponent().getPlayer().getPrayer( )[17]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[38]) {
    if(random(3) == 0){
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2229);
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    }
    damg *= 0.5;
    }
    if (doubleHit) {
    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damgDouble = 0;
    else if (combatEntity.getOpponent().getPlayer().getPrayer( )[13]
    && random(3) == 1)
    damgDouble = (int) (damgDouble * 0.4);
    }
    } else {
    if (random(CombatAssistant.calculateMeleeAttack(comba tEntity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[9]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }

    // delay = 1500;
    hit = true;
    combatEntity.getPlayer().getWalkingQueue().reset() ;// dont
    // move!
    }
    }
    /**
    * Melee
    */
    if (!hit) {
    if (combatEntity.getPlayer().duelRule[3]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use melee in this duel.");
    return false;
    }
    if (!combatEntity.getEntity().getLocation().isWithinD istance(combatEntity.getOpponent().getEntity().get Location(), (1 + extraDis))) {

    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    if(!combatEntity.canMove() && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) == 2)
    return true;
    //combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    /*
    * if(!WorldMap.projectileClear(combatEntity.getEntit y().
    * getLocation().getZ(),
    * combatEntity.getEntity().getLocation().getX(),
    * combatEntity.getEntity().getLocation().getY(),
    * combatEntity
    * .getOpponent().getEntity().getLocation().getX() +
    * combatEntity
    * .getOpponent().getOffsetX(),combatEntity.getOppone nt
    * ().getEntity().getLocation().getY() +
    * combatEntity.getOpponent().getOffsetY())) return true;
    */
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;

    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;// we dont want to reset attack but just
    // wait another 500ms or so...
    }
    int addspeed = combatEntity.getAtkSpeed();
    if (addspeed != 0)
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    else
    combatEntity.predictedAtk = System.currentTimeMillis() + 2400;

    /*
    * else
    * combatEntity.getPlayer().getActionSender().resetFo llow();
    */// this isnt too nessary in melee, only magic and range
    if (bowType != Constants.RANGEDNOARROWS)
    combatEntity.doAtkEmote();
    else
    combatEntity.doAnim(422);// you dont try shoot arrows
    // wen u have no arrows
    /**
    * Get random Damage Hit.
    */
    damg = random(maxHit);
    //RestarterThread.getRestarter().updateCombatTimer() ;
    boolean verac = false;
    if (CombatAssistant.isVeracEquiped(combatEntity.getPl ayer())
    && random(2) == 1)
    verac = true;
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!verac){
    /**
    * Here is the Hit determine stuff, Includes Overhead Prayers.
    */
    int MeleeAtk = CombatAssistant.calculateMeleeAttack(combatEntity. getPlayer());
    int MeleeDef = CombatAssistant.calculateMeleeDefence(combatEntity .getOpponent().getPlayer());
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Atk : " + MeleeAtk + " Def : " + MeleeDef);
    }*/
    int deltaBonus = MeleeAtk - MeleeDef;
    int toAdd = Misc.random(deltaBonus/15);
    damg += toAdd;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("ToAdd: " + toAdd);
    }*/
    if(damg < 0)
    damg = 0;
    if(damg > maxHit)
    damg = maxHit;
    if(2*random(MeleeAtk) < random(MeleeDef))
    damg = 0;
    if(combatEntity.getOpponent().getPlayer().getPraye r()[18]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[39]){
    damg *= 0.5;
    if(random(3) == 0){
    // Apply Deflect Curses
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2230);
    }
    }
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Damg : " + damg);
    }*/
    }
    } else {
    if (!verac
    && random(CombatAssistant.calculateMeleeAttack(combat Entity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[(combatEntity.getAtkType() + 2)]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }
    hit = true;
    }
    /**
    * Spirit shield effects.
    */
    damg = SpiritShields.applyEffects(combatEntity, damg);
    if (finishOff) {
    finishOff(combatEntity,damg,hit,bowType,damgDouble ,doubleHit,distance,possibleMaxHit,combatStyle);
    }
    Curses.applyLeeches(combatEntity.getPlayer());
    return true;
    }

    public static boolean finishOff(final CombatEntility combatEntity, final int damg, final boolean hit, final int bowType, final int damgDouble, final boolean doubleHit, final int distance, final int maxHit,final int combatStyle) {
    if(!hit)
    return true;
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    int delay = 300 + distance * 200;
    World.getWorld().submit(new Event(delay) {
    public void execute() {
    if(combatEntity == null || combatEntity.getOpponent() == null) {
    this.stop();
    return;
    }
    /**
    * Another verification check incase of glitchers.
    */
    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    this.stop();
    return;
    }
    /**
    * Poisoning of enemy.
    */
    if(!combatEntity.getOpponent().isPoisoned()) {
    if(damg > 0 && combatEntity.getWeaponPoison() > 0) {
    if(random(10) <= combatEntity.getWeaponPoison()) {
    poisonEntity(combatEntity.getOpponent());
    }
    }
    }
    /**
    * Smiting.
    */
    if(combatEntity.getOpponent().getEntity() instanceof Player) {
    if(combatEntity.getOpponent().getPlayer().getPraye r()[23]) {
    Prayer.smite(combatEntity.getPlayer(), damg);
    }
    }
    /**
    * Soulsplit.
    */
    if (combatEntity.getPlayer().getPrayer()[48])
    Prayer.soulSplit(combatEntity.getPlayer(), combatEntity.getOpponent(), damg);
    /**
    * Applies Damage.
    */
    int critical = damg >= 0.90 * maxHit ? 5 : 0; // Later substract 5
    int actualDamage = combatEntity.getOpponent().hit(damg, combatEntity.getEntity(), false, combatStyle + critical);
    /**
    * Recoil and vengeance.
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    Magic.vengeance(combatEntity.getOpponent().getPlay er(), combatEntity, actualDamage);
    Magic.recoil(combatEntity.getOpponent().getPlayer( ), combatEntity, actualDamage);
    }
    if (doubleHit)
    combatEntity.getOpponent().hit(damgDouble, combatEntity.getEntity(), false, 1);
    CombatAssistant.addExperience(combatEntity, bowType, actualDamage);
    if (isGuthanEquiped(combatEntity.getPlayer()))
    combatEntity.getPlayer().heal((int) (actualDamage * 0.5));
    if (combatEntity.getOpponent().getCurrentAtker() == null
    || combatEntity.getOpponent().getCurrentAtker() == combatEntity) {
    /*
    * opponentHit.face(combatEntity.getAbsX(
    * ), combatEntity.getAbsY());
    */
    if (combatEntity.getOpponent().summonedNpc != null)
    combatEntity.getOpponent().summonedNpc.cE.setOppon ent(combatEntity);
    if (combatEntity.getOpponent().getEntity() instanceof Player
    || combatEntity.getOpponent().getNPC().getDefinition( ).doesDefEmote())
    combatEntity.getOpponent().doDefEmote();
    if (combatEntity.getOpponent().getEntity() instanceof NPC
    || combatEntity.getOpponent().getPlayer().autoRetaila te) {
    combatEntity.getOpponent().setOpponent(combatEntit y);
    }
    }
    this.stop();
    }
    });
    return true;

    }

    /**
    * Processes the combat for an NPC combatEntity.
    * @param combatEntity
    * @param distance
    * @return
    */
    private static boolean processNpcCombat(final CombatEntility combatEntity, int distance) {
    if (combatEntity.attack == null)
    combatEntity.attack = World.getWorld().getNPCManager().getAttack(combatE ntity.getNPC());
    // combatEntity.doAtkEmote();
    if (combatEntity.attack != null) {
    // timer
    /*
    * if(combatEntity.predictedAtk >
    * System.currentTimeMillis()){
    * follow(combatEntity,combatEntity.getOpponent()); return
    * true;//we dont want to reset attack but just wait another
    * 500ms or so... }
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!combatEntity.getOpponent().getPlayer().isActive( )
    || combatEntity.getOpponent().getPlayer().isHidden()) {
    resetAttack(combatEntity);
    return false;
    }
    }
    combatEntity.getNPC().face(combatEntity.getOpponen t().getEntity().getLocation());
    int type = combatEntity.attack.handleAttack(combatEntity.getN PC(), combatEntity.getOpponent());
    if (type == 1
    && combatEntity.getNPC().agreesiveDis > 0
    && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) <= combatEntity.getNPC().agreesiveDis) {
    type = 0;
    }
    if (type == 5) {
    /*
    * if(combatEntity.getOpponent().getOpponent() == null
    * || combatEntity.getOpponent().getOpponent() ==
    * combatEntity){
    * //combatEntity.getOpponent().face(combatEntity
    * .getAbsX(),combatEntity.getAbsY());
    * combatEntity.getOpponent
    * ().face(combatEntity.getAbsX()
    * +combatEntity.getOffsetX
    * (),combatEntity.getAbsY()+combatEntity.getOffsetY( ));
    *
    * if(combatEntity.getOpponent().getEntity() instanceof
    * Player ||
    * combatEntity.getOpponent().getNPC().getDefinition
    * ().doesDefEmote())
    * combatEntity.getOpponent().doDefEmote();
    * if(combatEntity.getOpponent().getEntity() instanceof
    * NPC ||
    * combatEntity.getOpponent().getPlayer().autoRetaila te
    * ){
    * combatEntity.getOpponent().setOpponent(combatEntit y);
    * } }
    */
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    // successful
    } else if (type == 1) {
    // cancel
    return false;
    } else if (type == 0) {

    follow(combatEntity, combatEntity.getOpponent());
    }
    }
    return true;
    // combatEntity.getOpponent().hit(1,combatEntity.getO pponent().getEntity(),false);
    // npc combat, not as complicated as player combat
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, int type) {
    if (type >= 3)
    type = Constants.MAGE;
    return npcAttack(npc, combatEntity, damg, delay, type, false);
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, final int type, final boolean prayerBlock) {
    World.getWorld().submit(new Event(delay) {
    @Override
    public void execute() {
    if (combatEntity.getEntity().isDead() || npc.isDead()) {
    this.stop();
    return;
    }
    int newDamg = damg;
    if (combatEntity.getEntity() instanceof Player) {
    //divine spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13740 && combatEntity.getPlayer().getSkills().getLevel(5) > 0){
    combatEntity.getPlayer().getSkills().detractLevel( 5,(int)(damg * 0.15));
    newDamg = (int) (damg * 0.3);
    }
    //elysian spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13742 && Misc.random(9) >= 6){
    newDamg = (int) (damg * 0.25);
    }
    //prayers and curses
    if (!prayerBlock) {
    if ((combatEntity.getPlayer().getPrayer()[16] || combatEntity.getPlayer().getPrayer()[37])
    && type == 2) {
    if (combatEntity.getPlayer().getPrayer()[37])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 2);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[17] || combatEntity.getPlayer().getPrayer()[38])
    && type == 1) {
    if (combatEntity.getPlayer().getPrayer()[38])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 1);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[18] || combatEntity.getPlayer().getPrayer()[39])
    && type == 0) {
    if (combatEntity.getPlayer().getPrayer()[39])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 0);
    newDamg = 0;
    } else if (type == 0
    && Combat.random(npc.getDefinition().getBonus()[1]) < Combat.random(CombatAssistant.calculateMeleeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    }
    //defence
    if (type == 1
    && Combat.random(npc.getDefinition().getBonus()[3]) < Combat.random(CombatAssistant.calculateRangeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    if (type == 2
    && Combat.random(npc.getDefinition().getBonus()[4]) < Combat.random(CombatAssistant.calculateMageDef(com batEntity.getPlayer()))) {
    newDamg = 0;
    }
    if(npc.getDefinition().getId() == 9463){
    if(Misc.random(12) == 0){
    combatEntity.freezeTimer = System.currentTimeMillis() + 20000;
    combatEntity.getPlayer().getActionSender().sendMes sage("The Strykewyrm used his Ice Bite and froze you!");
    }
    }
    }
    if (combatEntity.getOpponent() == null
    || combatEntity.getOpponent() == npc.cE) {

    combatEntity.face(combatEntity.getAbsX(), combatEntity.getAbsY());
    if (combatEntity.summonedNpc != null)
    combatEntity.summonedNpc.cE.setOpponent(npc.cE);
    if (combatEntity.getEntity() instanceof Player
    || combatEntity.getNPC().getDefinition().doesDefEmote ())
    combatEntity.doDefEmote();
    if (combatEntity.getEntity() instanceof NPC
    || combatEntity.getPlayer().autoRetailate) {
    //System.out.println("SETING OPP LOOL3");
    combatEntity.setOpponent(npc.cE);
    }

    }
    // combatEntity.doDefEmote();
    combatEntity.hit(newDamg, npc.cE.getEntity(), false, type >= 3 ? Constants.MAGE
    : type);
    this.stop();
    }
    });
    return false;
    }

    public static void npcRangeAttack(final NPC n, final CombatEntility attack, int gfx, int height, boolean slowdown) {

    // offset values for the projectile
    int offsetY = ((n.cE.getAbsX() + n.cE.getOffsetX()) - attack.getAbsX())
    * -1;
    int offsetX = ((n.cE.getAbsY() + n.cE.getOffsetY()) - attack.getAbsY())
    * -1;
    // find our lockon target
    int hitId = attack.getSlotId((Entity) n);
    // extra variables - not for release
    int distance = attack.getEntity().getLocation().distance((Locatio n.create(n.cE.getEntity().getLocation().getX()
    + n.cE.getOffsetX(), n.cE.getEntity().getLocation().getY()
    + n.cE.getOffsetY(), n.cE.getEntity().getLocation().getZ())));
    int timer = 1;
    int min = 16;
    if (distance > 8) {
    timer += 2;
    } else if (distance >= 4) {
    timer++;
    }
    min -= (distance - 1) * 2;
    int speed = 75 - min;
    int slope = 7 + distance;
    if (slowdown)
    speed = speed * 2;
    // create the projectile
    // System.out.println("hitId: "+hitId);
    attack.getPlayer().getActionSender().createGlobalP rojectile(n.cE.getAbsY()
    + n.cE.getOffsetY(), n.cE.getAbsX() + n.cE.getOffsetX(), offsetY, offsetX, 50, speed, gfx, height, 35, hitId, slope);
    }

    // 1 - attack is ok
    // 0 - wild level not enough
    // 2 - aready in combat them
    // 3 - your being attacked

    public static String canAtk(CombatEntility combatEntity, CombatEntility opponent) {
    if (!isInMulti(combatEntity) || !isInMulti(opponent)) {
    /* Summon Npcs */
    if (combatEntity.getEntity() instanceof NPC) {
    if (combatEntity.getNPC().summoned) {
    if (opponent.getEntity() instanceof NPC)// summon attacking
    // another npc
    // in a singles
    // area = OK
    return "1";
    else
    // otherwise there attacking a player in singles
    return "blablabla";
    }
    }
    if ((combatEntity.getEntity() instanceof Player)
    && (opponent.getEntity() instanceof Player)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) combatEntity.getEntity(), 30000, -1, -1, -1)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) opponent.getEntity(), 30000, -1, -1, -1))
    return "1";
    String type = "NPC";
    if (opponent.getEntity() instanceof Player)
    type = "player";
    if(type.equals("player") && combatEntity.getEntity() instanceof Player){
    /**
    * If opponent hasent been in combat for a while, u can attack him
    * If he hasent, you look if his last attacker = you
    */
    if(opponent.getPlayer().getLastAttack().timeSinceL astAttack() < 10000){
    if(!opponent.getPlayer().getLastAttack().getName() .equals(combatEntity.getPlayer().getName()))
    return "This " + type + " is already in combat.";
    }
    /**
    * If you are in combat, is the person who recently attacked you = person who u wanna atk?
    */
    if(combatEntity.getPlayer().getLastAttack().timeSi nceLastAttack() < 10000){
    if(!combatEntity.getPlayer().getLastAttack().getNa me().equals(opponent.getPlayer().getName()))
    return "I am already in combat";
    }
    }
    else if (opponent.getOpponent() != null
    && opponent.getOpponent() != combatEntity)
    return "This " + type + " is already in combat.";
    }
    if (combatEntity.getEntity() instanceof Player
    && opponent.getEntity() instanceof Player) {
    if (combatEntity.getPlayer().duelAttackable > 0) {
    if (opponent.getEntity().getIndex() == combatEntity.getPlayer().duelAttackable) {
    return "1";
    } else {
    return "This is not your opponent!";
    }
    }
    if ((combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || /* fun pk multi */
    (combatEntity.getAbsX() >= 3271
    && combatEntity.getAbsX() <= 3307
    && combatEntity.getAbsY() >= 3012 && combatEntity.getAbsY() <= 3039))// fun
    // pk
    // singles
    return "1";
    if (CastleWars.getCastleWars().canAttack(combatEntity .getPlayer(), opponent))
    return "1";
    // wilderness level is too great
    String differenceOk = "You need to move deeper into the wilderness to attack this player.";
    int cb1 = combatEntity.getCombat();
    int cb2 = opponent.getCombat();
    int difference = getRealLevel(combatEntity, opponent);
    if (cb1 - cb2 <= difference && cb1 - cb2 >= 0 && difference > 0)
    differenceOk = "";
    else if (cb2 - cb1 <= difference && cb2 - cb1 >= 0 && difference > 0)
    differenceOk = "";
    return differenceOk;
    }
    // this will be returned for summons in a multi area
    return "1";
    }

    public static void resetAttack(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getOpponent() != null) {
    if (combatEntity.getOpponent().getAttackers().contain s(combatEntity)) {
    combatEntity.getOpponent().getAttackers().remove(c ombatEntity);
    }
    combatEntity.setOpponent(null);
    }
    }

    public static void logoutReset(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getAttackers().size() > 0) {
    CombatEntility c3[] = new CombatEntility[combatEntity.getAttackers().size()];
    int i = 0;
    for (CombatEntility c4 : combatEntity.getAttackers()) {
    c3[i] = c4;
    i++;
    }
    for (CombatEntility c2 : c3) {
    resetAttack(c2);
    }
    c3 = null;
    }
    combatEntity.getAttackers().clear();
    resetAttack(combatEntity);
    }

    public static int getRealLevel(CombatEntility combatEntity, CombatEntility b) {
    int a = getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY());
    int d = getWildLevel(b.getAbsX(), b.getAbsY());
    return Math.min(a, d);
    }

    public static int getWildLevel(int absX, int absY) {
    if ((absY >= 3520 && absY <= 3967 && absX <= 3392 && absX >= 2942))
    return (((absY - 3520) / 8) + 1);
    else
    return -1;
    }

    public static boolean isInMulti(CombatEntility combatEntity) {
    if ((combatEntity.getAbsX() >= 3136 && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3520 && combatEntity.getAbsY() <= 3607)
    || (combatEntity.getAbsX() >= 3190
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3648 && combatEntity.getAbsY() <= 3839)
    || (combatEntity.getAbsX() >= 3200
    && combatEntity.getAbsX() <= 3390
    && combatEntity.getAbsY() >= 3840 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2992
    && combatEntity.getAbsX() <= 3007
    && combatEntity.getAbsY() >= 3912 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2946
    && combatEntity.getAbsX() <= 2959
    && combatEntity.getAbsY() >= 3816 && combatEntity.getAbsY() <= 3831)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3199
    && combatEntity.getAbsY() >= 3856 && combatEntity.getAbsY() <= 3903)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3071
    && combatEntity.getAbsY() >= 3600 && combatEntity.getAbsY() <= 3711)
    || (combatEntity.getAbsX() >= 2889
    && combatEntity.getAbsX() <= 2941
    && combatEntity.getAbsY() >= 4426 && combatEntity.getAbsY() <= 4465)
    || // dag kings
    (combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || // fun pk multi
    (combatEntity.getAbsX() >= 3071
    && combatEntity.getAbsX() <= 3146
    && combatEntity.getAbsY() >= 3394 && combatEntity.getAbsY() <= 3451)
    || // barb
    (combatEntity.getAbsX() >= 2814
    && combatEntity.getAbsX() <= 2942
    && combatEntity.getAbsY() >= 5250 && combatEntity.getAbsY() <= 5373)
    || // godwars
    (combatEntity.getAbsX() >= 3072
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3608 && combatEntity.getAbsY() <= 3647)
    )
    return true;
    return false;
    }

    public static int random(int range) {
    return (int) (java.lang.Math.random() * (range + 1));
    }

    public static void follow(final CombatEntility combatEntity, final CombatEntility opponent) {
    // System.out.println("Running this Method");
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return;
    combatEntity.getEntity().getWalkingQueue().reset() ;
    if (combatEntity.getEntity() instanceof Player) {
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    // follow2(combatEntity,combatEntity.getEntity().getW alkingQueue().getPublicPoint().getX(),combatEntity .getEntity().getWalkingQueue().getPublicPoint().ge tY(),opponent.getAbsX(),opponent.getAbsY(),opponen t.getAbsZ());
    } else
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    combatEntity.getEntity().getWalkingQueue().finish( );
    }

    public static void follow2(final CombatEntility combatEntity, int x, int y, int toX, int toY, int height) {
    int moveX = 0;
    int moveY = 0;

    /*
    * int path[][] = PathfinderV2.findRoute(x,y,toX, toY,height); if(path
    * == null) return; toX = path[1][0]; toX = path[1][1];
    */
    if (x > toX)
    moveX = -1;
    else if (x < toX)
    moveX = 1;
    if (y > toY)
    moveY = -1;
    else if (y < toY)
    moveY = 1;
    if (moveX != 0 && moveY != 0) {
    if (!World.getWorld().isWalkAble(height, x, y, (x + moveX), (y + moveY), 0)) {
    if (World.getWorld().isWalkAble(height, x, y, (x + moveX), y, 0)) {
    moveY = 0;
    } else if (World.getWorld().isWalkAble(height, x, y, x, (y + moveY), 0)) {
    moveX = 0;
    } else {
    return;
    }
    }
    } else if (!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + moveY, 0)) {
    if(moveX != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + 1, 0)){
    moveY = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    - 1, 0)){
    moveY = -1;
    }
    }
    else if(moveY != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + 1, y
    + moveY, 0)){
    moveX = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x -1, y
    + moveY, 0)){
    moveX = -1;
    }
    }
    }
    combatEntity.getEntity().getWalkingQueue().addStep (x + moveX, y + moveY);
    }

    /**
    * This method is used to poison a CombatEntility.
    * @param combatEntity
    */
    public static void poisonEntity(final CombatEntility combatEntity) {
    if(combatEntity == null)
    return;
    if (combatEntity.isPoisoned())
    return;
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("You have been poisoned.");
    combatEntity.setPoisoned(true);
    World.getWorld().submit(new Event(16000) {
    private int lastDamg = -1;
    private int ticks = 4;
    @Override
    public void execute() {
    if (!combatEntity.isPoisoned()) {
    this.stop();
    return;
    }
    if (combatEntity.getEntity() instanceof Player) {
    if (!combatEntity.getPlayer().isActive()) {
    this.stop();
    return;
    }
    }
    if (lastDamg == -1)
    lastDamg = random(10);
    if (ticks == 0) {
    lastDamg--;
    ticks = 4;
    }
    ticks--;
    if (lastDamg == 0) {
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("Your poison clears up.");
    combatEntity.setPoisoned(false);
    this.stop();
    } else {
    combatEntity.hit(lastDamg, null, true, 0);
    }
    }
    });
    }

    public void ateFood(final CombatEntility combatEntity) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 1000)// this
    // should
    // make
    // sure,
    // you
    // dont
    // eat
    // and
    // hit
    // at
    // the
    // same
    // time.
    return;
    combatEntity.predictedAtk = System.currentTimeMillis() + 1000;
    // combatEntity.predictedAtk2 = System.currentTimeMillis()+1000;
    // combatEntity.predictedAtk3 = System.currentTimeMillis()+1000;
    }

    public static boolean canAtkDis(final CombatEntility combatEntity, final CombatEntility attack) {
    if (combatEntity.getEntity().getLocation().distance(a ttack.getEntity().getLocation()) > 1) {
    return !WorldMap.projectileClear(combatEntity.getEntity() .getLocation(), combatEntity.getOpponent().getEntity().getLocation ());
    } else {
    return WorldMap.checkPos(attack.getEntity().getLocation() .getZ(), combatEntity.getEntity().getLocation().getX(), combatEntity.getEntity().getLocation().getY(), attack.getEntity().getLocation().getX(), attack.getEntity().getLocation().getY(), 1);
    }
    }

    public static void removeArrow(Player player, int bowType, Location loc) {
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) == null)
    return;
    int slot = Equipment.SLOT_ARROWS;
    if (bowType == Constants.RANGEDWEPSTYPE) {
    slot = Equipment.SLOT_WEAPON;
    }
    if (player.getEquipment().get(slot) != null) {
    Item item = new Item(player.getEquipment().get(slot).getId(), 1);
    if (item.getId() != 4740 && item.getId() != 15243) {
    if (random(3) != 1) {
    if (player.getEquipment().get(Equipment.SLOT_CAPE) != null
    && player.getEquipment().get(Equipment.SLOT_CAPE).get Id() == 10499) {
    // player.getInventory().add(item);
    return;
    } else {
    World.getWorld().getGlobalItemManager().newDropIte m(player, new GlobalItem(player, loc, item));
    }
    }
    }
    }
    if (player.getEquipment().get(slot).getCount() <= 1)
    player.getEquipment().set(slot, null);
    else
    player.getEquipment().set(slot, new Item(player.getEquipment().get(slot).getId(), (player.getEquipment().get(slot).getCount() - 1)));

    }

    public static void addXP(Player player, int damg, boolean bow) {
    if (damg > 0) {
    int exp = damg * 1200;
    if (player.getSkills().getLevelForExperience(player.c E.getAtkType()) >= 90)
    exp = damg * 800;
    if (player.cE.getAtkType() == 3) {
    player.cE.setAtkType(2);
    }
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    if ((player.cE.getAtkType() == 5 || player.cE.getAtkType() == 2)
    && CombatAssistant.isControlled(player.getEquipment() .get(Equipment.SLOT_WEAPON).getId())) {
    player.cE.setAtkType(3);
    }
    }
    if (player.cE.getAtkType() == 6 && bow) {
    player.getSkills().addExperience(4, 0.66 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 6 && !bow) {
    player.cE.setAtkType(1);
    }
    if (player.cE.getAtkType() == 5 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 5 && !bow) {
    player.cE.setAtkType(2);
    }
    if (player.cE.getAtkType() == 4 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 4 && !bow) {
    player.cE.setAtkType(0);
    }
    if (player.cE.getAtkType() == 1 && bow) {
    player.cE.setAtkType(6);
    }

    else if (bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    } else if (player.cE.getAtkType() != 3) {
    player.getSkills().addExperience(player.cE.getAtkT ype(), exp);
    player.getSkills().addExperience(3, 0.5 * exp);
    } else {
    player.getSkills().addExperience(0, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    player.getSkills().addExperience(2, 0.33 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    }
    }
    }

    public static boolean isGuthanEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4724
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4726
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4728
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4730)
    return true;
    return false;
    }

    public static boolean isToragEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4745
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4747
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4749
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4751)
    return true;
    return false;
    }

    public static void createGlobalProjectile(Entity e,int casterY, int casterX, int offsetY, int offsetX, int angle, int speed, int gfxMoving, int startHeight, int endHeight, int lockon,int slope) {
    if(e == null)
    return;
    for(Player p : e.getLocalPlayers()){
    p.getActionSender().createProjectile(casterY, casterX, offsetY, offsetX, angle, speed, gfxMoving, startHeight, endHeight, lockon, slope);
    }
    }

    }


    Also CombatAssistant
    Spoiler for combatassistant:

    package org.hyperion.rs2.model.combat;

    import java.util.Random;

    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.container.Container;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.skill.Prayer;

    public class CombatAssistant {

    public static void addExperience(CombatEntility combatEntity, int bowType, int damage) {
    if (bowType != Constants.RANGEDNOARROWS && bowType != Constants.MELEETYPE)
    Combat.addXP(combatEntity.getPlayer(), damage, true);
    else
    Combat.addXP(combatEntity.getPlayer(), damage, false);
    }

    /**
    * Use this method to check if a player needs to be skulled and skull him.
    * @param combatEntity
    */
    public static void checkSkull(CombatEntility combatEntity) {
    if(combatEntity.getOpponent().getOpponent() == combatEntity)
    return;
    if(!(combatEntity.getOpponent().getEntity() instanceof Player))
    return;
    if(Combat.getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY()) == -1)
    return;
    if(System.currentTimeMillis() - combatEntity.lastHit < 10000)
    return;
    if (combatEntity.getPlayer().isSkulled == -1) {
    combatEntity.getPlayer().isSkulled = 0;
    Prayer.setHeadIcon(combatEntity.getPlayer());
    }
    combatEntity.getPlayer().skullTimer = 1200;
    }
    /**
    * Use this to get the extra distance in combat of a combatEntity.
    * @param combatEntity
    * @return
    */
    public static int getExtraDistance(CombatEntility combatEntity) {
    if(!combatEntity.getPlayer().isMoving)
    return 0;
    if(combatEntity.freezeTimer != 0)
    return 0;
    return 1;
    }
    /**
    * Use this to get a players shield id.
    * @param equipment
    * @return
    */
    public static int getShieldId(Container equipment) {
    if (equipment.get(Equipment.SLOT_SHIELD) != null) {
    return equipment.get(Equipment.SLOT_SHIELD).getId();
    }
    return -1;
    }
    /**
    * Use this to get a players arrows id.
    * @param equipment
    * @return
    */
    public static int getArrowsId(Container equipment) {
    if (equipment.get(Equipment.SLOT_ARROWS) != null) {
    return equipment.get(Equipment.SLOT_ARROWS).getId();
    }
    return -1;
    }

    /**
    * Use this to get a players weapon id;
    * @param equipment
    * @return
    */
    public static int getWeaponId(Container equipment) {
    if (equipment.get(Equipment.SLOT_WEAPON) != null) {
    return equipment.get(Equipment.SLOT_WEAPON).getId();
    }
    return -1;
    }
    /**
    * Checks if the attacking combatEntity is valid, thus not null, not dead, etc
    * @param combatEntity
    * @return
    */
    public static boolean isValid(CombatEntility combatEntity) {
    if (combatEntity.getOpponent() == null || combatEntity.getOpponent().getEntity() == null) {
    return false;
    }
    if (combatEntity.getEntity().isDead() || combatEntity.getOpponent().getEntity().isDead()) {
    return false;
    }
    if(!combatEntity.getOpponent().isNpcAttackAble()){
    return false;
    }
    return true;
    }




    /**
    * Finds what weapon the client is using.
    */
    public static int getBowType(CombatEntility c) {
    /**
    * Get the weapon
    */
    Item Weapon = c.getPlayer().getEquipment().get(Equipment.SLOT_WE APON);
    /**
    * If Unarmed, Return MELEETYPE
    */
    if (Weapon == null)
    return Constants.MELEETYPE;
    /**
    * Get weaponId
    */
    int weaponId = Weapon.getId();
    /**
    * Check if using Knifes, Javelins etc
    */
    for (int g : RANGED_WEAPONS) {
    if (g == weaponId)
    return Constants.RANGEDWEPSTYPE;
    }
    /**
    * Declare Arrow
    */
    Item Arrow = c.getPlayer().getEquipment().get(Equipment.SLOT_AR ROWS);
    /**
    * Declare arrowId
    */
    int arrowId = -1;
    if (Arrow != null) {
    arrowId = Arrow.getId();
    }
    /**
    * Check if using Hand Cannon etc
    */
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == weaponId) {
    if (arrowId == -1)
    return Constants.UNIQUENOAMMO;
    ;
    if (getUniqueType(weaponId) == arrowId) {
    return Constants.UNIQUEAMMO;
    } else {
    return Constants.UNIQUEWRONG;
    }
    }
    }
    /**
    * Check if using a Bow like Magic shotbow
    */
    if(arrowId == DRAGON_ARROWS && darkBow(weaponId))
    return Constants.RANGEDARROWS;
    else if(arrowId == DRAGON_ARROWS)
    return Constants.RANGEDNOARROWS;

    for (int g : BOWS) {
    if (weaponId == g) {
    if (getArrowType(arrowId) != 0) {
    return Constants.RANGEDARROWS;
    } else {
    return Constants.RANGEDNOARROWS;
    }
    }
    }
    /**
    * Check if using Crossbow
    */
    for (int g : CBOWS) {
    if (weaponId == g) {
    if (getBoltType(arrowId, weaponId) != 0) {
    return Constants.RANGEDBOLTS;
    } else {
    return Constants.RANGEDNOBOLTS;
    }
    }
    }
    return Constants.MELEETYPE;
    }
    public static final int DRAGON_ARROWS = 112;


    public static boolean isControlled(int ItemId) {
    switch (ItemId) {
    case 4151:
    case 15441:
    case 15442:
    case 15443:
    case 15444:
    return true;
    }
    return false;
    }

    public static boolean is2H(int wep) {
    for (int i : BOWS) {
    if (i == wep)
    return true;
    }
    for (int i : TWO_HANDED) {
    if (i == wep)
    return true;
    }
    return false;
    }

    public static final int[] TWO_HANDED = { 10887, 13905, 13988, 14692, 17143,
    14484, 16909, 18369, 18353, 16425, 4153, 1307, 1309, 1311, 1313,
    1315, 1317, 1319, 6609, 7158,/* 2h weps */4886,4887,4888,4889,
    4982,4983,4984,4985,4958,4959,4960,4961,
    4718, 4710, 4755, 4747, 4734, 4726,/* barrows */11694, 11696,
    11698, 11700, 11730,/* godswords */11235,/* darkbow */10113, 9016,
    6587, 3095, 3096, 3097, 3098, 3099, 3100,/* claws */15701, 15702,
    15703, 15704, 15241

    };

    public static final int[] RANGED_WEAPONS = {
    /* knives */864, 863, 865, 866, 867, 868, 869,
    /* darts */806, 807, 808, 809, 810, 811, 3093,
    /* javelins */825, 826, 827, 828, 829, 830,
    /* thorwn axes */800, 801, 802, 803, 804, 805,
    13883,13879};

    public static final int[] CBOWS = { 9174, 9176, 9177, 9179, 9181, 9183,
    9185, 18357 };

    public static final int[][] UNIQUERANGEWEPS = {
    // Wep Id, Wep Ammo
    { 15241, 15243 }, { 4734, 4740 } };

    public static final int[] BOWS = { 839, 841, 843, 845, 847, 849, 851, 853,
    855, 857, 859, 861, 4212, 4214, 4827, 11235, 15701, 15702, 15703,
    15704 };

    public static int getArrowType(int arrow) {
    switch (arrow) {
    case 882: // Bronze
    return 1;
    case 884: // Iron
    return 2;
    case 886: // Steel
    return 3;
    case 888: // Mithril
    return 4;
    case 890: // Adamant
    return 5;
    case 892: // Rune
    return 6;
    case 598: // Fire arrows
    case 942:
    case 2533:
    case 2535:
    case 2537:
    case 2539:
    case 2541:
    return 7;
    case 78: // Ice arrows
    return 8;
    case 2866: // Flighted ogre arrow
    return 9;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 10;
    case 4150: // broad arrow
    return 11;
    case 11217: // dragon fire arrow
    return 12;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getUniqueType(int wep) {
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == wep) {
    return UNIQUERANGEWEPS[i][1];
    }
    }
    return -1;
    }

    public static int getBoltType(int arrow, int weapon) {
    if (weapon == 4734 && arrow == 4740)
    return 2;
    switch (arrow) {
    case 9140:// iron
    return 2;
    case 9141:// steel
    return 3;
    case 9142:// mith
    return 4;
    case 9143:// addy
    case 9243://Diamond
    case 9242://Ruby
    return 5;
    case 9144:// rune
    return 6;
    case 9145:// silver?
    return 2;
    case 9341:// dragon
    case 9244:
    return 7;
    case 9245:
    return 8;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getDrawback(int weapon, int arrow, int type) {
    switch(weapon){
    case 15241:
    return 2138;
    /*case 13883:
    return 1839;
    case 13879:
    return 1837;*/
    }
    if (type == 3) {
    // bolts
    return 28;
    } else if (darkBow(weapon)) {
    switch (arrow) {
    case 882: // Bronze arrow
    return 1104;
    case 884: // Iron arrow
    return 1105;
    case 886: // Steel arrow
    return 1106;
    case 888: // Mithril arrow
    return 1107;
    case 890: // Adamant arrow
    return 1108;
    case 892: // Rune arrow
    return 1109;
    case 78: // ice arrow
    return 1110;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1111;
    case 4150: // broad arrow
    return 1112;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    return 1113;
    case 11217: // dragon fire arrow
    return 1114;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 2) {
    if (weapon == 4212) // Crystal bow.
    return 472;
    switch (arrow) {
    case 882: // Bronze arrow
    return 18;
    case 884: // Iron arrow
    return 19;
    case 886: // Steel arrow
    return 20;
    case 888: // Mithril arrow
    return 21;
    case 890: // Adamant arrow
    return 22;
    case 892: // Rune arrow
    return 24;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1116;
    case 4740: // Bolt
    return 28;

    case 78: // ice arrow
    return 25;
    case 4150: // broad arrow
    return 325;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    case 11217: // dragon fire arrow
    return 26;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 1) {
    switch (weapon) {
    case 863: // Knife
    return 220;
    case 864:
    return 219;
    case 865:
    return 221;
    case 866:
    return 223;
    case 867:
    return 224;
    case 868:
    return 225;
    case 869:
    return 222;
    case 806: // Dart
    return 233;
    case 807:
    return 232;
    case 808:
    return 234;
    case 809:
    return 235;
    case 810:
    return 236;
    case 811:
    return 237;
    case 3093:
    return 235;
    case 825:// javelins
    return 207;
    case 826:
    return 206;
    case 827:
    return 208;
    case 828:
    return 209;
    case 829:
    return 210;
    case 830:
    return 211;
    case 800:// thrown axe
    return 42;
    case 801:
    return 43;
    case 802:
    return 44;
    case 803:
    return 45;
    case 804:
    return 46;
    case 805:
    return 48;
    default:
    System.out.println("Missing throwDrawback :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static int getProjectileSpeed(int weaponId) {
    /*
    * if (c.dbowSpec) return 100;
    */
    switch (weaponId) {
    case 15241:
    return 55;
    }
    return 70;
    }

    public static int getSlope(int weaponId) {
    switch (weaponId) {
    case 15241:
    return -1;
    }
    return 16;
    }

    public static int getStartHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 43;
    }

    public static int getEndHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 31;
    }

    public static int getDelay(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 30;
    }
    return 53;
    }

    public static int getArrowGfx(int weapon, int bowType, int type) {
    switch(weapon){
    case 15241:
    return 2143;
    case 13883:
    return 1839;
    case 13879:
    return 1837;
    }

    if (bowType == Constants.RANGEDBOLTS) {
    switch (type) {
    default:
    return 27;// most use gfx 27
    }
    } else if (bowType == Constants.RANGEDARROWS) {
    // Check first if we're using a Crystal bow.
    if (weapon == 4212) // Crystal bow.
    return 472;

    switch (type) {
    case 1: // Bronze
    return 10;
    case 2: // Iron
    return 9;
    case 3: // Steel
    return 11;
    case 4: // Mithril
    return 12;
    case 5: // Admanant
    return 13;
    case 6: // Rune
    return 15;
    case 7: // Fire
    return 17;
    case 8: // Ice
    return 16;
    case 9: // Flighted ogre arrow
    return 471;
    case 10: // dragon arrow
    return 1120;
    case 11: // broad arrow
    return 326;
    case 12: // dragon fire arrow
    return 17;
    default:
    return 0;
    }
    } else if (bowType == Constants.RANGEDWEPSTYPE) {
    switch (weapon) {
    case 863: // Iron knife
    return 213;
    case 864: // Bronze knife
    return 212;
    case 865: // Steel knife
    return 214;
    case 866: // Mithril knife
    return 216;
    case 867: // Adamant knife
    return 217;
    case 868: // Rune knife
    return 218;
    case 869: // Black knife
    return 215;
    case 806: // Bronze dart
    return 226;
    case 807: // Iron dart
    return 227;
    case 808: // Steel dart
    return 228;
    case 809: // Mithril dart
    return 229;
    case 810: // Adamant dart
    return 230;
    case 811: // Rune dart
    return 231;
    case 3093: // Black dart
    return 229;
    default:
    System.out.println("Missing throwGfx :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static boolean isVeracEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4753
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4755
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4757
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4759)
    return true;
    return false;
    }

    private static Random random = new Random();

    private static final double DEFENCE_MODIFIER = 0.895;

    public static int damage(int maxHit, Player attacker, Player victim,
    int skill, boolean prayer, boolean special, boolean ignorePrayers) {
    boolean veracEffect = false;
    if (skill == Skills.ATTACK) {
    if (isVeracEquiped(attacker)) {
    if (random.nextInt(8) == 3) {
    veracEffect = true;
    }
    }
    }

    double attackBonus = attacker.getBonus()[attacker.cE.getAtkType()] == 0 ? 1
    : attacker.getBonus()[attacker.cE.getAtkType()];
    if (attackBonus < 1) {
    attackBonus = 1;
    }
    double attackCalc = attackBonus * attacker.getSkills().getLevel(skill); // +1
    // as
    // its
    // exclusive

    /**
    * Prayer calculations.
    */
    if (skill == Skills.ATTACK) {
    // melee attack prayer modifiers
    if (attacker.getPrayer()[2]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[7]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[15]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[25]) {
    attackCalc *= 1.20;
    }
    } else if (skill == Skills.RANGE) {
    // range attack prayer modifiers
    if (attacker.getPrayer()[3]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[11]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[19]) {
    attackCalc *= 1.15;
    }
    } else if (skill == Skills.MAGIC) {
    // magic attack prayer modifiers
    if (attacker.getPrayer()[4]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[12]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[20]) {
    attackCalc *= 1.15;
    }
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 0) {
    attackCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    attackCalc += 1;
    }

    double defenceBonus = victim.getBonus()[attacker.cE.getAtkType() + 5] == 0 ? 1
    : victim.getBonus()[attacker.cE.getAtkType() + 5];
    double defenceCalc = defenceBonus
    * victim.getSkills().getLevel(Skills.DEFENCE); // +1 as its
    // exclusive
    /**
    * Prayer calculations.
    */
    if (attacker.getPrayer()[0]) {
    defenceCalc *= 1.05;
    } else if (attacker.getPrayer()[5]) {
    defenceCalc *= 1.10;
    } else if (attacker.getPrayer()[13]) {
    defenceCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    defenceCalc *= 1.20;
    } else if (attacker.getPrayer()[25]) {
    defenceCalc *= 1.25;
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 2) {
    defenceCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    defenceCalc += 1;
    }

    if (veracEffect) {
    defenceCalc = 0;
    }

    /**
    * The chance to succeed out of 1.0.
    */
    double hitSucceed = DEFENCE_MODIFIER * (attackCalc / defenceCalc);
    if (hitSucceed > 1.0) {
    hitSucceed = 1;
    }
    attacker.getActionSender().sendMessage(
    "atk value: " + (hitSucceed * 100));
    if (hitSucceed < random.nextDouble()) {
    return 0;
    } else {
    /**
    * Protection prayers. Note: If an NPC is hitting on a protection
    * prayer, it is 100% blocked, where as if a player is hitting on a
    * protection prayer, their damage is simply reduced by 40%. Also,
    * if the attacker has the Verac effect active, it will ignore the
    * opponent's protection prayers.
    */
    int hit = maxHit;
    double protectionPrayer = 1;
    if (ignorePrayers) {
    protectionPrayer = 1;
    }
    if (prayer) {
    protectionPrayer = 0.4;
    }
    hit = (int) (maxHit * protectionPrayer); // +1 as its exclusive
    return hit;
    }
    }

    /**
    * Real RuneScape Formulas.
    *
    */
    public static double getEffectiveStr(Player p) {
    return p.getSkills().getLevel(2) * getPrayerStr + getStyleBonus;
    }

    public static double getPrayerStr(Player p) {
    if (p.getPrayer()[1]) {
    return 1.05;
    } else if (p.getPrayer()[6]) {
    return 1.10;
    } else if (p.getPrayer()[14]) {
    return 1.15;
    } else if (p.getPrayer()[24]) {
    return 1.18;
    } else if (p.getPrayer()[25]) {
    return 1.23;
    // Curses
    } else if (p.getPrayer()[31]) {
    return 1.05;
    } else if (p.getPrayer()[44]) {
    return 1.15;
    } else if (p.getPrayer()[49]) {
    return 1.32;
    }
    return 1;
    }

    public static int getStyleBonus(Player p) {
    return 1;
    // TODO
    }

    public static int calculateMaxHit(Player p) {
    double base = 0;

    double effective = getEffectiveStr;
    double strengthBonus = p.getBonus()[10];

    base = (13 + effective + (strengthBonus / 10) + ((effective * strengthBonus) / 64)) / 10;


    if (p.specOn) {
    base = (base * SpecialAttacks.getSpecialBonus);
    }
    if (obbyZerk) {
    base *= 1.20;
    }
    if (fullVoidMelee) {
    base *= 1.15;
    }
    if (hasDharokEquiped) {
    double ratio = (double)p.getSkills().getLevel(Skills.HITPOINTS)/(double)p.getSkills().getLevelForExperience(Skills .HITPOINTS);
    base *= 2.0 - ratio;
    }
    if (base <= 0) {
    base = 1;
    }
    // p.getActionSender().sendMessage("Your max is " + Math.floor(base));
    return (int) Math.floor(base);

    }

    public static boolean obbyZerk(Player p) {
    if (p.getEquipment().get(Equipment.SLOT_AMULET) == null
    || p.getEquipment().get(Equipment.SLOT_WEAPON) == null) {
    return false;
    }
    if (p.getEquipment().get(Equipment.SLOT_AMULET).getId () == 11128
    && p.getEquipment().get(Equipment.SLOT_WEAPON).getId( ) == 6528)
    return true;
    return false;
    }

    public static boolean fullVoidMelee(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11665
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidRange(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11664
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidMage(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11663
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    /**
    * Checks if a player has the full dharok set equiped.
    * @param player
    * @return
    */
    public static boolean hasDharokEquiped(Player player) {
    if(player.getEquipment().get(Equipment.SLOT_HELM) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_HELM). getId() != 4716)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ).getId() != 4718)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) .getId() != 4720)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S).getId() != 4722)
    return false;
    return true;
    }

    public static int getRangedHit2(Player p) {
    int effectiveStrength = p.getSkills().getLevel(4);
    if (p.cE.bowType == 0)
    effectiveStrength += 3;
    int max = (int) (1.3 + (effectiveStrength / 10)
    + (p.getBonus()[4] / 80) + ((p.getBonus()[10] * p.getBonus()[4]) / 640));
    return max;
    }

    public static boolean darkBow(int itemId) {
    switch (itemId) {
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    return true;
    }
    return false;
    }

    /**
    * Get the ranged hit.
    *
    * @param maxHit
    * the current maxhit for melee
    * @param type
    * The type of the arrow.
    */

    public static int getRangedHit(int maxHit, int type) {
    /*
    * switch(type) { case 1: // Bronze return maxHit + (int)
    * Math.floor(Math.random() * 1); case 2: // Iron return maxHit + (int)
    * Math.floor(Math.random() * 2); case 3: // Steel return maxHit + (int)
    * Math.floor(Math.random() * 3); case 4: // Mithril return maxHit +
    * (int) Math.floor(Math.random() * 4); case 5: // Admanant return
    * maxHit + (int) Math.floor(Math.random() * 5); case 6: // Rune return
    * maxHit + (int) Math.floor(Math.random() * 6); case 7: // Fire return
    * maxHit + (int) Math.floor(Math.random() * 7); case 8: // Ice return
    * maxHit + (int) Math.floor(Math.random() * 8); case 9: // Flighted
    * ogre arrow return maxHit + (int) Math.floor(Math.random() * 8);
    * default: // Type is 0 return 2; }
    */
    int am = type;
    if (am > 8)
    am = 8;
    maxHit += type;
    return maxHit;
    }

    private static final int[][] RANGEDDATA = { { 877, 10 }, { 9140, 46 },
    { 9145, 36 }, { 9141, 64 }, { 9142, 82 }, { 9143, 100 },
    { 9144, 115 }, { 9236, 14 }, { 9237, 30 }, { 9238, 48 },
    { 9239, 66 }, { 9240, 83 }, { 9241, 85 }, { 9242, 103 },
    { 9243, 105 }, { 9244, 117 }, { 9245, 125 }, { 882, 7 },
    { 884, 10 }, { 886, 16 }, { 888, 22 }, { 890, 31 }, { 892, 49 },
    { 4740, 55 }, { 11212, 60 }, { 806, 1 }, { 807, 3 }, { 808, 4 },
    { 809, 7 }, { 810, 10 }, { 811, 14 }, { 11230, 20 }, { 864, 3 },
    { 863, 4 }, { 865, 7 }, { 866, 10 }, { 867, 14 }, { 868, 24 },
    { 825, 6 }, { 826, 10 }, { 827, 12 }, { 828, 18 }, { 829, 28 },
    { 830, 42 }, { 800, 5 }, { 801, 7 }, { 802, 11 }, { 803, 16 },
    { 804, 23 }, { 805, 36 }, { 9976, 0 }, { 9977, 15 }, { 4212, 70 },
    { 4214, 70 }, { 4215, 70 }, { 4216, 70 }, { 4217, 70 },
    { 4218, 70 }, { 4219, 70 }, { 4220, 70 }, { 4221, 70 },
    { 4222, 70 }, { 4223, 70 }, { 6522, 49 }, { 10034, 15 },
    { 15015, 130 }, { 15016, 110 }, { 4734, 49 }, { 4740, 49 },
    { 19157, 80 }, { 19162, 80 }, { 19152, 80 }, { 15243, 150 },
    { 13883, 130},{13879,135}
    };

    public static int getRangeStr(int i) {
    int str = 0;
    for (int l = 0; l < RANGEDDATA.length; l++) {
    if (i == RANGEDDATA[l][0]) {
    str = RANGEDDATA[l][1];
    }
    }
    return str;
    }

    public static int calculateRangeMaxHit(Player p) {
    int rangedBoosted = p.getSkills().getLevel(4);
    int rangedLevel = p.getSkills().getLevelForExperience(4);
    int rangedStr;
    if (CombatAssistant.getBowType(p.cE) == Constants.RANGEDWEPSTYPE)
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_WE APON)
    .getId());
    else
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_AR ROWS)
    .getId());
    double bonus = 1.00;
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    bonus = 1.05;
    } else if (p.getPrayer()[11]) {
    bonus = 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    bonus = 1.15;
    }
    if (fullVoidRange) {
    bonus += .15;
    }
    double e = Math.floor(rangedLevel * bonus + rangedBoosted / 8);

    /*
    * if (c.fightMode == 0) { e = (e + 3.0); }
    */
    double specialBonus = 1.0;

    if (p.specOn && p.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    switch (p.getEquipment().get(Equipment.SLOT_WEAPON).getId ()) {
    case 13883:
    specialBonus = 1.15;
    break;
    case 19149:
    case 19143:
    case 19146:
    case 859:
    specialBonus = 1.3;
    break;
    case 861:
    specialBonus = 1.1;
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    if (p.getEquipment().get(Equipment.SLOT_ARROWS) != null
    && p.getEquipment().get(Equipment.SLOT_ARROWS).getId( ) == 11212) {
    specialBonus = 1.3;
    } else {
    specialBonus = 1.1;
    }
    break;
    case 15241:
    specialBonus = 1.1;
    }
    }
    double max = (1.3 + e / 8 + rangedStr / 80 + e * rangedStr / 640);
    //p.getActionSender().sendMessage("Range max : " + max);
    max *= specialBonus;
    return (int) max;
    }

    public static int calculateRangeAttack(Player p) {
    double rangeAtk = p.getSkills().getLevel(4);
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    rangeAtk *= 1.05;
    } else if (p.getPrayer()[11]) {
    rangeAtk *= 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    rangeAtk *= 1.15;
    }
    if(fullVoidRange)
    rangeAtk *= 1.15;
    return (int) (0.50*(rangeAtk + p.getBonus()[4]));
    }

    public static int calculateRangeDefence(Player player) {
    int rangeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    rangeDef = rangeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    rangeDef = rangeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    rangeDef = rangeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    rangeDef = rangeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    rangeDef = rangeDef *= 1.15;
    }
    return rangeDef + player.getBonus()[9]/4;
    }

    public static int calculateMageAtk(Player player) {
    int mageLvl = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[3];
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLvl *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLvl *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLvl *= 1.15;
    }
    return mageLvl + bonus * 2;
    }

    public static int calculateMageDef(Player player) {
    int defLevel = player.getSkills().getLevel(1);
    int mageLevel = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[8];
    //Def Prayers
    if (player.getPrayer()[0]) {
    defLevel = defLevel *= 1.05;
    } else if(player.getPrayer()[5]){
    defLevel = defLevel *= 1.10;
    } else if(player.getPrayer()[13]){
    defLevel = defLevel *= 1.15;
    } else if(player.getPrayer()[24]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[25]){
    defLevel = defLevel *= 1.25;
    } else if(player.getPrayer()[43]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[49]){
    defLevel = defLevel *= 1.15;
    }
    //Mage Prayers
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLevel *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLevel *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLevel *= 1.15;
    }
    return bonus * 2 + defLevel/2 + mageLevel/2;
    }

    public static int bestMeleeDef(Player player) {
    if (player.getBonus()[5] > player.getBonus()[6]
    && player.getBonus()[5] > player.getBonus()[7])
    return 5;
    if (player.getBonus()[6] > player.getBonus()[5]
    && player.getBonus()[6] > player.getBonus()[7])
    return 6;
    return player.getBonus()[7] <= player.getBonus()[5]
    || player.getBonus()[7] <= player.getBonus()[6] ? 5 : 7;
    }

    public static int bestMeleeAtk(Player player) {
    if (player.getBonus()[0] > player.getBonus()[1]
    && player.getBonus()[0] > player.getBonus()[2])
    return 0;
    if (player.getBonus()[1] > player.getBonus()[0]
    && player.getBonus()[1] > player.getBonus()[2])
    return 1;
    return player.getBonus()[2] <= player.getBonus()[0]
    || player.getBonus()[2] <= player.getBonus()[1] ? 0 : 2;
    }

    /**
    * Calculate Melee Atk Value
    */
    public static int calculateMeleeAttack(Player player) {
    double meleeAtk = player.getSkills().getLevel(0);
    if(player.getPrayer()[2] || player.getPrayer()[31]){
    meleeAtk *= 1.05;
    } else if(player.getPrayer()[7]){
    meleeAtk *= 1.10;
    } else if(player.getPrayer()[15] || player.getPrayer()[40]){
    meleeAtk *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeAtk *= 1.17;
    } else if(player.getPrayer()[25]){
    meleeAtk *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeAtk *= 1.25;
    }
    double bonus = player.getBonus()[0];
    for(int i = 1; i < 3; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeAtk + bonus);
    }
    /**
    * @param player
    * @return Melee Defence
    */
    public static int calculateMeleeDefence(Player player) {
    int meleeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    meleeDef = meleeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    meleeDef = meleeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    meleeDef = meleeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    meleeDef = meleeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeDef = meleeDef *= 1.15;
    }
    double bonus = player.getBonus()[5];
    for(int i = 6; i < 8; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeDef + bonus*1.3);
    }

    public static void drawBackGfx(CombatEntility combatEntity, int weaponId,
    int arrowId, int bowType) {
    if (weaponId != 15241)
    combatEntity.doGfx(CombatAssistant.getDrawback(wea ponId, arrowId,
    bowType));
    else
    combatEntity.getPlayer().playGraphics(Graphic.crea te(2138));
    }

    /**
    * Sending Projectile part.
    */
    public static void fireProjectile(CombatEntility combatEntity, int bowType,
    int arrowType) {
    int weaponId = -1;
    if (combatEntity.getPlayer().getEquipment().get(Equip ment.SLOT_WEAPON) != null) {
    weaponId = combatEntity.getPlayer().getEquipment()
    .get(Equipment.SLOT_WEAPON).getId();
    }
    int proj = CombatAssistant.getArrowGfx(weaponId, bowType, arrowType);
    int offsetY = (combatEntity.getAbsX() - (combatEntity.getOpponent()
    .getAbsX() + combatEntity.getOpponent().getOffsetX())) * -1;
    int offsetX = (combatEntity.getAbsY() - (combatEntity.getOpponent()
    .getAbsY() + combatEntity.getOpponent().getOffsetY())) * -1;
    // Lockon Target
    int hitId = combatEntity.getSlotId(combatEntity.getEntity());
    int speed = CombatAssistant.getProjectileSpeed(weaponId);
    int slope = CombatAssistant.getSlope(weaponId);
    int startHeight = CombatAssistant.getStartHeight(weaponId);
    int endHeight = CombatAssistant.getEndHeight(weaponId);
    int time = CombatAssistant.getDelay(weaponId);
    // create the projectile
    combatEntity
    .getPlayer()
    .getActionSender()
    .createGlobalProjectile(combatEntity.getAbsY(),
    combatEntity.getAbsX(), offsetY, offsetX, 50, speed,
    proj, startHeight, endHeight, hitId, time, slope);
    Combat.removeArrow(combatEntity.getPlayer(), bowType, combatEntity
    .getOpponent().getEntity().getLocation());
    }
    }
    Reply With Quote  
     

  4. #4  
    Taking all OSGP donations at this time

    Deri's Avatar
    Join Date
    Apr 2014
    Age
    30
    Posts
    381
    Thanks given
    274
    Thanks received
    251
    Rep Power
    5000
    Quote Originally Posted by Provider View Post
    I dont have combathandler.java heres COMBAT.JAVA
    Spoiler for combat.java:

    package org.hyperion.rs2.model.combat;

    import org.hyperion.map.WorldMap;
    import org.hyperion.rs2.event.Event;
    import org.hyperion.rs2.model.Entity;
    import org.hyperion.rs2.model.GlobalItem;
    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Location;
    import org.hyperion.rs2.model.NPC;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.UpdateSpecialBar;
    import org.hyperion.rs2.model.World;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.minigame.CastleWars ;
    import org.hyperion.rs2.model.content.misc.ItemDegrading;
    import org.hyperion.rs2.model.content.skill.Prayer;
    import org.hyperion.rs2.model.content.skill.Slayer;
    import org.hyperion.rs2.util.RestarterThread;
    import org.hyperion.util.Misc;

    /**
    * @authors Martin and Arsen
    */

    public class Combat {



    public static boolean processCombat(final CombatEntility combatEntity) {
    try {
    /**
    * Logical check if combatEntity isn't null, isn't dead, etc..
    */
    if(!CombatAssistant.isValid(combatEntity))
    return false;
    /**
    * Facing
    */
    combatEntity.face(combatEntity.getOpponent().getAb sX() + combatEntity.getOpponent().getOffsetX(), combatEntity.getOpponent().getAbsY() + combatEntity.getOpponent().getOffsetY(), true);

    if (combatEntity.predictedAtk > System.currentTimeMillis()){
    return true;
    }

    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    if (combatEntity.getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    return false;
    }
    /**
    * Add opponent to attackers list
    */
    if (!combatEntity.getOpponent().getAttackers().contai ns(combatEntity)) {
    combatEntity.getOpponent().getAttackers().add(comb atEntity);
    }
    /**
    * Distance and freezetimer check.
    */
    int distance = combatEntity.getEntity().getLocation().distance((c ombatEntity.getOpponent().getEntity().getLocation( )));
    /*Checks if standing on eachother*/
    if (distance == 0) {
    /*If standing on eachother and frozen*/
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return false;
    if (!combatEntity.getOpponent().vacating) {
    combatEntity.vacating = true;
    combatEntity.getEntity().vacateSquare();
    }
    return true;
    }
    combatEntity.vacating = false;
    /**
    * Run seperate code depending on whether the combatEntity is an NPC or a Player.
    */
    if (combatEntity.getEntity() instanceof Player) {
    processPlayerCombat(combatEntity,distance);
    } else {
    processNpcCombat(combatEntity,distance);
    }
    } catch (Exception e) {
    e.printStackTrace();
    }
    return true;// was successful, false - reset attack
    }


    private static boolean processPlayerCombat(final CombatEntility combatEntity, int distance) {
    /**
    * Initializing variables.
    */
    boolean hit = false;
    boolean finishOff = true;
    boolean doubleHit = false;
    int arrowId = CombatAssistant.getArrowsId(combatEntity.getPlayer ().getEquipment());
    final int extraDis = CombatAssistant.getExtraDistance(combatEntity);
    int weaponId = CombatAssistant.getWeaponId(combatEntity.getPlayer ().getEquipment());
    int damgDouble = 0;
    int damg = 0;
    /**
    * Skull Adding
    */
    CombatAssistant.checkSkull(combatEntity);
    /**
    * Degrading
    */
    ItemDegrading.check(combatEntity.getPlayer());
    /**
    * Magic Combat
    */
    int magicAtk = combatEntity.getNextMagicAtk();
    if (combatEntity.getNextMagicAtk() > 0) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// Too far.
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    // cast the actual spell using magic code , result was if
    // its succesfuly or not (i.e no runes)
    int result = Magic.castSpell(combatEntity, combatEntity.getOpponent(), magicAtk);
    if (result == 2) {
    // if it worked remove the spell
    combatEntity.deleteSpellAttack();
    combatEntity.predictedAtk = System.currentTimeMillis() + 2500;
    // combatEntity.predictedAtk =
    // System.currentTimeMillis()+2000;
    // spell hit etc
    hit = true;
    finishOff = false;
    if (!(combatEntity.getAutoCastId() > 0)) {
    combatEntity.setOpponent(null);
    return false;
    }
    return true;
    } else if (result == 0) {
    // no runes so reset
    return false;
    }
    }
    /**
    * Max Hit and Combat Style Determination.
    */
    int bowType = CombatAssistant.getBowType(combatEntity);
    // Check Arrows/Bow
    if (bowType <= Constants.NOAMMO) {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    switch (bowType) {
    case Constants.RANGEDNOARROWS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no arrows left in your quiver.");
    break;
    case Constants.RANGEDNOBOLTS:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no bolts left.");
    break;
    case Constants.UNIQUENOAMMO:
    combatEntity.getPlayer().getActionSender().sendMes sage("You have no ammo left.");
    break;
    case Constants.UNIQUEWRONG:
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use this type of ammo with this weapon.");
    break;
    }
    return false;
    }
    int maxHit = 0;
    final int combatStyle;
    if (bowType == Constants.MELEETYPE) {
    maxHit = CombatAssistant.calculateMaxHit(combatEntity.getPl ayer());
    combatStyle = Constants.MELEE;
    if(combatEntity.getAutoCastId() <= 0)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    } else {
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    combatStyle = Constants.RANGE;
    }
    final int possibleMaxHit = maxHit;
    /**
    * Special Activating
    */
    if (!hit && combatEntity.getNextMagicAtk() <= 0) {
    if (combatEntity.getPlayer().specOn) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 600) {
    return true;
    }
    combatEntity.getPlayer().specOn = false;
    if (weaponId == -1) {

    } else if (SpecialAttacks.special(combatEntity, maxHit, weaponId, extraDis, distance,combatStyle)) {
    hit = true;
    finishOff = false;
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    } else {
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    return true;
    }
    UpdateSpecialBar.refreshSendQuest(combatEntity.get Player());
    }
    }
    /**
    * Autocasting
    */
    if (!hit) {
    if (combatEntity.getAutoCastId() > 0) {
    if (combatEntity.getPlayer().duelRule[4]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use magic in this duel.");
    combatEntity.setAutoCastId(0);
    return false;
    }
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;
    // timer
    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;
    }
    combatEntity.addSpellAttack(combatEntity.getAutoCa stId());
    hit = true;
    finishOff = false;
    }
    }
    /**
    * Ranging
    */
    if (!hit) {
    // If in Duel , Return
    if (bowType != 8 && combatEntity.getPlayer().duelRule[2]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use range in this duel.");
    return false;
    }
    if (bowType != Constants.MELEETYPE) {
    if (distance > 8) {
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ())){
    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    else
    follow(combatEntity, combatEntity.getOpponent());
    return true;
    } else {
    combatEntity.getPlayer().getActionSender().resetFo llow();
    combatEntity.getPlayer().getWalkingQueue().reset() ;
    }


    int arrowType = CombatAssistant.getArrowType(arrowId);
    maxHit = CombatAssistant.calculateRangeMaxHit(combatEntity. getPlayer());
    if (bowType == Constants.RANGEDWEPSTYPE)
    combatEntity.doAnim(806);// throw stuff anim
    else {
    combatEntity.doAtkEmote();
    }
    // System.out.println("range max: "+maxHit);

    /**
    * Sending Projectile part.
    */
    CombatAssistant.fireProjectile(combatEntity, bowType, arrowType);
    /**
    * Set Attack Speed
    */
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    // drawback gfx
    CombatAssistant.drawBackGfx(combatEntity, weaponId, arrowId, bowType);
    /**
    * Get random Damage Hit
    */
    damg = random(maxHit);
    /**
    * Checks Range bonus etc
    */
    int rangeAtk = CombatAssistant.calculateRangeAttack(combatEntity. getPlayer());
    int rangeDef;
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    rangeDef = CombatAssistant.calculateRangeDefence(combatEntity .getOpponent().getPlayer());
    else
    rangeDef = combatEntity.getOpponent().getCombat()/2 ;
    int deltaRangeBonus = rangeAtk - rangeDef;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Delta Range Bonus is : " + deltaRangeBonus);
    }*/
    int toadd = Misc.random(deltaRangeBonus/20);
    //System.out.println("Toadd is " + toadd);
    damg += toadd;
    if(damg < 0)
    damg = 0;
    else if(damg > maxHit)
    damg = maxHit;
    /**
    * Enchanted Bolts Effects
    */
    double boltBonus = 1;
    if(Misc.random(4) == 0 && damg > 0.6 * maxHit && bowType == Constants.RANGEDBOLTS){
    switch(arrowId){
    case 9242:
    if(combatEntity.getOpponent().getEntity() instanceof Player)
    damg = combatEntity.getOpponent().getPlayer().getSkills() .getLevelForExperience(Skills.HITPOINTS)/5;
    else
    damg = combatEntity.getOpponent().getNPC().health/5;
    int newHp = (int)(combatEntity.getPlayer().getSkills().getLeve l(Skills.HITPOINTS) * 0.9);
    combatEntity.getPlayer().getSkills().setLevel(Skil ls.HITPOINTS, newHp);
    combatEntity.getOpponent().doGfx(754);
    break;
    case 9243:
    boltBonus = 1.1;
    combatEntity.getOpponent().doGfx(758);
    break;
    case 9244:
    boltBonus = 1.2;
    combatEntity.getOpponent().doGfx(756);
    break;
    case 9245:
    boltBonus = 1.3;
    combatEntity.getOpponent().getEntity().playGraphic s(Graphic.create(753));
    break;
    }
    damg *= boltBonus;
    }
    if(CombatAssistant.darkBow(weaponId)){
    damgDouble = random(maxHit);
    doubleHit = true;
    }
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    //divine spirit shield

    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damg = 0;
    /**
    * Prayer Checking
    */
    if (combatEntity.getOpponent().getPlayer().getPrayer( )[17]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[38]) {
    if(random(3) == 0){
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2229);
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    }
    damg *= 0.5;
    }
    if (doubleHit) {
    if (random(CombatAssistant.calculateRangeAttack(comba tEntity.getPlayer())) < random(CombatAssistant.calculateRangeDefence(comba tEntity.getOpponent().getPlayer())))
    damgDouble = 0;
    else if (combatEntity.getOpponent().getPlayer().getPrayer( )[13]
    && random(3) == 1)
    damgDouble = (int) (damgDouble * 0.4);
    }
    } else {
    if (random(CombatAssistant.calculateMeleeAttack(comba tEntity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[9]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }

    // delay = 1500;
    hit = true;
    combatEntity.getPlayer().getWalkingQueue().reset() ;// dont
    // move!
    }
    }
    /**
    * Melee
    */
    if (!hit) {
    if (combatEntity.getPlayer().duelRule[3]
    && combatEntity.getPlayer().duelAttackable > 0) {
    combatEntity.getPlayer().getActionSender().sendMes sage("You cannot use melee in this duel.");
    return false;
    }
    if (!combatEntity.getEntity().getLocation().isWithinD istance(combatEntity.getOpponent().getEntity().get Location(), (1 + extraDis))) {

    if (combatEntity.getOpponent().getEntity() instanceof Player)
    combatEntity.getPlayer().getActionSender().follow( combatEntity.getOpponent().getEntity().getIndex(), 1);
    return true;// too far away
    } else {
    if(!combatEntity.canMove() && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) == 2)
    return true;
    //combatEntity.getPlayer().getWalkingQueue().reset() ;
    }
    /*
    * if(!WorldMap.projectileClear(combatEntity.getEntit y().
    * getLocation().getZ(),
    * combatEntity.getEntity().getLocation().getX(),
    * combatEntity.getEntity().getLocation().getY(),
    * combatEntity
    * .getOpponent().getEntity().getLocation().getX() +
    * combatEntity
    * .getOpponent().getOffsetX(),combatEntity.getOppone nt
    * ().getEntity().getLocation().getY() +
    * combatEntity.getOpponent().getOffsetY())) return true;
    */
    if (!WorldMap.projectileClear(combatEntity.getEntity( ).getLocation(), combatEntity.getOpponent().getEntity().getLocation ()))
    return true;

    if (combatEntity.predictedAtk > System.currentTimeMillis()) {
    return true;// we dont want to reset attack but just
    // wait another 500ms or so...
    }
    int addspeed = combatEntity.getAtkSpeed();
    if (addspeed != 0)
    combatEntity.predictedAtk = (System.currentTimeMillis() + combatEntity.getAtkSpeed());
    else
    combatEntity.predictedAtk = System.currentTimeMillis() + 2400;

    /*
    * else
    * combatEntity.getPlayer().getActionSender().resetFo llow();
    */// this isnt too nessary in melee, only magic and range
    if (bowType != Constants.RANGEDNOARROWS)
    combatEntity.doAtkEmote();
    else
    combatEntity.doAnim(422);// you dont try shoot arrows
    // wen u have no arrows
    /**
    * Get random Damage Hit.
    */
    damg = random(maxHit);
    //RestarterThread.getRestarter().updateCombatTimer() ;
    boolean verac = false;
    if (CombatAssistant.isVeracEquiped(combatEntity.getPl ayer())
    && random(2) == 1)
    verac = true;
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!verac){
    /**
    * Here is the Hit determine stuff, Includes Overhead Prayers.
    */
    int MeleeAtk = CombatAssistant.calculateMeleeAttack(combatEntity. getPlayer());
    int MeleeDef = CombatAssistant.calculateMeleeDefence(combatEntity .getOpponent().getPlayer());
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Atk : " + MeleeAtk + " Def : " + MeleeDef);
    }*/
    int deltaBonus = MeleeAtk - MeleeDef;
    int toAdd = Misc.random(deltaBonus/15);
    damg += toAdd;
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("ToAdd: " + toAdd);
    }*/
    if(damg < 0)
    damg = 0;
    if(damg > maxHit)
    damg = maxHit;
    if(2*random(MeleeAtk) < random(MeleeDef))
    damg = 0;
    if(combatEntity.getOpponent().getPlayer().getPraye r()[18]){
    damg *= 0.5;
    } else if(combatEntity.getOpponent().getPlayer().getPraye r()[39]){
    damg *= 0.5;
    if(random(3) == 0){
    // Apply Deflect Curses
    combatEntity.hit((int) (damg / 10), combatEntity.getOpponent().getEntity(), false, 3);
    combatEntity.getOpponent().doAnim(12573);
    combatEntity.getOpponent().doGfx(2230);
    }
    }
    /*if(combatEntity.getPlayer().getName().toLowerCase ().equals("dr house")){
    combatEntity.getPlayer().getActionSender().sendMes sage("Damg : " + damg);
    }*/
    }
    } else {
    if (!verac
    && random(CombatAssistant.calculateMeleeAttack(combat Entity.getPlayer())) < random(combatEntity.getOpponent().getNPC().getDefi nition().getBonus()[(combatEntity.getAtkType() + 2)]))
    damg = 0;
    if (Slayer.getSlayerLevel(combatEntity.getOpponent(). getNPC().getDefinition().getId()) > combatEntity.getPlayer().getSkills().getLevel(Skil ls.SLAYER))
    damg = 0;
    }
    hit = true;
    }
    /**
    * Spirit shield effects.
    */
    damg = SpiritShields.applyEffects(combatEntity, damg);
    if (finishOff) {
    finishOff(combatEntity,damg,hit,bowType,damgDouble ,doubleHit,distance,possibleMaxHit,combatStyle);
    }
    Curses.applyLeeches(combatEntity.getPlayer());
    return true;
    }

    public static boolean finishOff(final CombatEntility combatEntity, final int damg, final boolean hit, final int bowType, final int damgDouble, final boolean doubleHit, final int distance, final int maxHit,final int combatStyle) {
    if(!hit)
    return true;
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    int delay = 300 + distance * 200;
    World.getWorld().submit(new Event(delay) {
    public void execute() {
    if(combatEntity == null || combatEntity.getOpponent() == null) {
    this.stop();
    return;
    }
    /**
    * Another verification check incase of glitchers.
    */
    String message = canAtk(combatEntity, combatEntity.getOpponent());
    if (message.length() > 1) {
    combatEntity.getPlayer().getActionSender().sendMes sage(message);
    this.stop();
    return;
    }
    /**
    * Poisoning of enemy.
    */
    if(!combatEntity.getOpponent().isPoisoned()) {
    if(damg > 0 && combatEntity.getWeaponPoison() > 0) {
    if(random(10) <= combatEntity.getWeaponPoison()) {
    poisonEntity(combatEntity.getOpponent());
    }
    }
    }
    /**
    * Smiting.
    */
    if(combatEntity.getOpponent().getEntity() instanceof Player) {
    if(combatEntity.getOpponent().getPlayer().getPraye r()[23]) {
    Prayer.smite(combatEntity.getPlayer(), damg);
    }
    }
    /**
    * Soulsplit.
    */
    if (combatEntity.getPlayer().getPrayer()[48])
    Prayer.soulSplit(combatEntity.getPlayer(), combatEntity.getOpponent(), damg);
    /**
    * Applies Damage.
    */
    int critical = damg >= 0.90 * maxHit ? 5 : 0; // Later substract 5
    int actualDamage = combatEntity.getOpponent().hit(damg, combatEntity.getEntity(), false, combatStyle + critical);
    /**
    * Recoil and vengeance.
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    Magic.vengeance(combatEntity.getOpponent().getPlay er(), combatEntity, actualDamage);
    Magic.recoil(combatEntity.getOpponent().getPlayer( ), combatEntity, actualDamage);
    }
    if (doubleHit)
    combatEntity.getOpponent().hit(damgDouble, combatEntity.getEntity(), false, 1);
    CombatAssistant.addExperience(combatEntity, bowType, actualDamage);
    if (isGuthanEquiped(combatEntity.getPlayer()))
    combatEntity.getPlayer().heal((int) (actualDamage * 0.5));
    if (combatEntity.getOpponent().getCurrentAtker() == null
    || combatEntity.getOpponent().getCurrentAtker() == combatEntity) {
    /*
    * opponentHit.face(combatEntity.getAbsX(
    * ), combatEntity.getAbsY());
    */
    if (combatEntity.getOpponent().summonedNpc != null)
    combatEntity.getOpponent().summonedNpc.cE.setOppon ent(combatEntity);
    if (combatEntity.getOpponent().getEntity() instanceof Player
    || combatEntity.getOpponent().getNPC().getDefinition( ).doesDefEmote())
    combatEntity.getOpponent().doDefEmote();
    if (combatEntity.getOpponent().getEntity() instanceof NPC
    || combatEntity.getOpponent().getPlayer().autoRetaila te) {
    combatEntity.getOpponent().setOpponent(combatEntit y);
    }
    }
    this.stop();
    }
    });
    return true;

    }

    /**
    * Processes the combat for an NPC combatEntity.
    * @param combatEntity
    * @param distance
    * @return
    */
    private static boolean processNpcCombat(final CombatEntility combatEntity, int distance) {
    if (combatEntity.attack == null)
    combatEntity.attack = World.getWorld().getNPCManager().getAttack(combatE ntity.getNPC());
    // combatEntity.doAtkEmote();
    if (combatEntity.attack != null) {
    // timer
    /*
    * if(combatEntity.predictedAtk >
    * System.currentTimeMillis()){
    * follow(combatEntity,combatEntity.getOpponent()); return
    * true;//we dont want to reset attack but just wait another
    * 500ms or so... }
    */
    if (combatEntity.getOpponent().getEntity() instanceof Player) {
    if (!combatEntity.getOpponent().getPlayer().isActive( )
    || combatEntity.getOpponent().getPlayer().isHidden()) {
    resetAttack(combatEntity);
    return false;
    }
    }
    combatEntity.getNPC().face(combatEntity.getOpponen t().getEntity().getLocation());
    int type = combatEntity.attack.handleAttack(combatEntity.getN PC(), combatEntity.getOpponent());
    if (type == 1
    && combatEntity.getNPC().agreesiveDis > 0
    && combatEntity.getEntity().getLocation().distance(co mbatEntity.getOpponent().getEntity().getLocation() ) <= combatEntity.getNPC().agreesiveDis) {
    type = 0;
    }
    if (type == 5) {
    /*
    * if(combatEntity.getOpponent().getOpponent() == null
    * || combatEntity.getOpponent().getOpponent() ==
    * combatEntity){
    * //combatEntity.getOpponent().face(combatEntity
    * .getAbsX(),combatEntity.getAbsY());
    * combatEntity.getOpponent
    * ().face(combatEntity.getAbsX()
    * +combatEntity.getOffsetX
    * (),combatEntity.getAbsY()+combatEntity.getOffsetY( ));
    *
    * if(combatEntity.getOpponent().getEntity() instanceof
    * Player ||
    * combatEntity.getOpponent().getNPC().getDefinition
    * ().doesDefEmote())
    * combatEntity.getOpponent().doDefEmote();
    * if(combatEntity.getOpponent().getEntity() instanceof
    * NPC ||
    * combatEntity.getOpponent().getPlayer().autoRetaila te
    * ){
    * combatEntity.getOpponent().setOpponent(combatEntit y);
    * } }
    */
    combatEntity.getOpponent().lastHit = System.currentTimeMillis();
    // successful
    } else if (type == 1) {
    // cancel
    return false;
    } else if (type == 0) {

    follow(combatEntity, combatEntity.getOpponent());
    }
    }
    return true;
    // combatEntity.getOpponent().hit(1,combatEntity.getO pponent().getEntity(),false);
    // npc combat, not as complicated as player combat
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, int type) {
    if (type >= 3)
    type = Constants.MAGE;
    return npcAttack(npc, combatEntity, damg, delay, type, false);
    }

    public static boolean npcAttack(final NPC npc, final CombatEntility combatEntity, final int damg, final int delay, final int type, final boolean prayerBlock) {
    World.getWorld().submit(new Event(delay) {
    @Override
    public void execute() {
    if (combatEntity.getEntity().isDead() || npc.isDead()) {
    this.stop();
    return;
    }
    int newDamg = damg;
    if (combatEntity.getEntity() instanceof Player) {
    //divine spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13740 && combatEntity.getPlayer().getSkills().getLevel(5) > 0){
    combatEntity.getPlayer().getSkills().detractLevel( 5,(int)(damg * 0.15));
    newDamg = (int) (damg * 0.3);
    }
    //elysian spirit shield
    if(combatEntity.getPlayer().getEquipment().get(Equ ipment.SLOT_SHIELD) != null && combatEntity.getPlayer().getEquipment().get(Equipm ent.SLOT_SHIELD).getId() == 13742 && Misc.random(9) >= 6){
    newDamg = (int) (damg * 0.25);
    }
    //prayers and curses
    if (!prayerBlock) {
    if ((combatEntity.getPlayer().getPrayer()[16] || combatEntity.getPlayer().getPrayer()[37])
    && type == 2) {
    if (combatEntity.getPlayer().getPrayer()[37])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 2);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[17] || combatEntity.getPlayer().getPrayer()[38])
    && type == 1) {
    if (combatEntity.getPlayer().getPrayer()[38])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 1);
    newDamg = 0;
    } else if ((combatEntity.getPlayer().getPrayer()[18] || combatEntity.getPlayer().getPrayer()[39])
    && type == 0) {
    if (combatEntity.getPlayer().getPrayer()[39])
    npc.cE.hit((newDamg / 10), combatEntity.getEntity(), false, 0);
    newDamg = 0;
    } else if (type == 0
    && Combat.random(npc.getDefinition().getBonus()[1]) < Combat.random(CombatAssistant.calculateMeleeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    }
    //defence
    if (type == 1
    && Combat.random(npc.getDefinition().getBonus()[3]) < Combat.random(CombatAssistant.calculateRangeDefenc e(combatEntity.getPlayer()))) {
    newDamg = 0;
    }
    if (type == 2
    && Combat.random(npc.getDefinition().getBonus()[4]) < Combat.random(CombatAssistant.calculateMageDef(com batEntity.getPlayer()))) {
    newDamg = 0;
    }
    if(npc.getDefinition().getId() == 9463){
    if(Misc.random(12) == 0){
    combatEntity.freezeTimer = System.currentTimeMillis() + 20000;
    combatEntity.getPlayer().getActionSender().sendMes sage("The Strykewyrm used his Ice Bite and froze you!");
    }
    }
    }
    if (combatEntity.getOpponent() == null
    || combatEntity.getOpponent() == npc.cE) {

    combatEntity.face(combatEntity.getAbsX(), combatEntity.getAbsY());
    if (combatEntity.summonedNpc != null)
    combatEntity.summonedNpc.cE.setOpponent(npc.cE);
    if (combatEntity.getEntity() instanceof Player
    || combatEntity.getNPC().getDefinition().doesDefEmote ())
    combatEntity.doDefEmote();
    if (combatEntity.getEntity() instanceof NPC
    || combatEntity.getPlayer().autoRetailate) {
    //System.out.println("SETING OPP LOOL3");
    combatEntity.setOpponent(npc.cE);
    }

    }
    // combatEntity.doDefEmote();
    combatEntity.hit(newDamg, npc.cE.getEntity(), false, type >= 3 ? Constants.MAGE
    : type);
    this.stop();
    }
    });
    return false;
    }

    public static void npcRangeAttack(final NPC n, final CombatEntility attack, int gfx, int height, boolean slowdown) {

    // offset values for the projectile
    int offsetY = ((n.cE.getAbsX() + n.cE.getOffsetX()) - attack.getAbsX())
    * -1;
    int offsetX = ((n.cE.getAbsY() + n.cE.getOffsetY()) - attack.getAbsY())
    * -1;
    // find our lockon target
    int hitId = attack.getSlotId((Entity) n);
    // extra variables - not for release
    int distance = attack.getEntity().getLocation().distance((Locatio n.create(n.cE.getEntity().getLocation().getX()
    + n.cE.getOffsetX(), n.cE.getEntity().getLocation().getY()
    + n.cE.getOffsetY(), n.cE.getEntity().getLocation().getZ())));
    int timer = 1;
    int min = 16;
    if (distance > 8) {
    timer += 2;
    } else if (distance >= 4) {
    timer++;
    }
    min -= (distance - 1) * 2;
    int speed = 75 - min;
    int slope = 7 + distance;
    if (slowdown)
    speed = speed * 2;
    // create the projectile
    // System.out.println("hitId: "+hitId);
    attack.getPlayer().getActionSender().createGlobalP rojectile(n.cE.getAbsY()
    + n.cE.getOffsetY(), n.cE.getAbsX() + n.cE.getOffsetX(), offsetY, offsetX, 50, speed, gfx, height, 35, hitId, slope);
    }

    // 1 - attack is ok
    // 0 - wild level not enough
    // 2 - aready in combat them
    // 3 - your being attacked

    public static String canAtk(CombatEntility combatEntity, CombatEntility opponent) {
    if (!isInMulti(combatEntity) || !isInMulti(opponent)) {
    /* Summon Npcs */
    if (combatEntity.getEntity() instanceof NPC) {
    if (combatEntity.getNPC().summoned) {
    if (opponent.getEntity() instanceof NPC)// summon attacking
    // another npc
    // in a singles
    // area = OK
    return "1";
    else
    // otherwise there attacking a player in singles
    return "blablabla";
    }
    }
    if ((combatEntity.getEntity() instanceof Player)
    && (opponent.getEntity() instanceof Player)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) combatEntity.getEntity(), 30000, -1, -1, -1)
    && World.getWorld().getContentManager().handlePacket( 6, (Player) opponent.getEntity(), 30000, -1, -1, -1))
    return "1";
    String type = "NPC";
    if (opponent.getEntity() instanceof Player)
    type = "player";
    if(type.equals("player") && combatEntity.getEntity() instanceof Player){
    /**
    * If opponent hasent been in combat for a while, u can attack him
    * If he hasent, you look if his last attacker = you
    */
    if(opponent.getPlayer().getLastAttack().timeSinceL astAttack() < 10000){
    if(!opponent.getPlayer().getLastAttack().getName() .equals(combatEntity.getPlayer().getName()))
    return "This " + type + " is already in combat.";
    }
    /**
    * If you are in combat, is the person who recently attacked you = person who u wanna atk?
    */
    if(combatEntity.getPlayer().getLastAttack().timeSi nceLastAttack() < 10000){
    if(!combatEntity.getPlayer().getLastAttack().getNa me().equals(opponent.getPlayer().getName()))
    return "I am already in combat";
    }
    }
    else if (opponent.getOpponent() != null
    && opponent.getOpponent() != combatEntity)
    return "This " + type + " is already in combat.";
    }
    if (combatEntity.getEntity() instanceof Player
    && opponent.getEntity() instanceof Player) {
    if (combatEntity.getPlayer().duelAttackable > 0) {
    if (opponent.getEntity().getIndex() == combatEntity.getPlayer().duelAttackable) {
    return "1";
    } else {
    return "This is not your opponent!";
    }
    }
    if ((combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || /* fun pk multi */
    (combatEntity.getAbsX() >= 3271
    && combatEntity.getAbsX() <= 3307
    && combatEntity.getAbsY() >= 3012 && combatEntity.getAbsY() <= 3039))// fun
    // pk
    // singles
    return "1";
    if (CastleWars.getCastleWars().canAttack(combatEntity .getPlayer(), opponent))
    return "1";
    // wilderness level is too great
    String differenceOk = "You need to move deeper into the wilderness to attack this player.";
    int cb1 = combatEntity.getCombat();
    int cb2 = opponent.getCombat();
    int difference = getRealLevel(combatEntity, opponent);
    if (cb1 - cb2 <= difference && cb1 - cb2 >= 0 && difference > 0)
    differenceOk = "";
    else if (cb2 - cb1 <= difference && cb2 - cb1 >= 0 && difference > 0)
    differenceOk = "";
    return differenceOk;
    }
    // this will be returned for summons in a multi area
    return "1";
    }

    public static void resetAttack(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getOpponent() != null) {
    if (combatEntity.getOpponent().getAttackers().contain s(combatEntity)) {
    combatEntity.getOpponent().getAttackers().remove(c ombatEntity);
    }
    combatEntity.setOpponent(null);
    }
    }

    public static void logoutReset(CombatEntility combatEntity) {
    if (combatEntity == null)
    return;
    if (combatEntity.getAttackers().size() > 0) {
    CombatEntility c3[] = new CombatEntility[combatEntity.getAttackers().size()];
    int i = 0;
    for (CombatEntility c4 : combatEntity.getAttackers()) {
    c3[i] = c4;
    i++;
    }
    for (CombatEntility c2 : c3) {
    resetAttack(c2);
    }
    c3 = null;
    }
    combatEntity.getAttackers().clear();
    resetAttack(combatEntity);
    }

    public static int getRealLevel(CombatEntility combatEntity, CombatEntility b) {
    int a = getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY());
    int d = getWildLevel(b.getAbsX(), b.getAbsY());
    return Math.min(a, d);
    }

    public static int getWildLevel(int absX, int absY) {
    if ((absY >= 3520 && absY <= 3967 && absX <= 3392 && absX >= 2942))
    return (((absY - 3520) / 8) + 1);
    else
    return -1;
    }

    public static boolean isInMulti(CombatEntility combatEntity) {
    if ((combatEntity.getAbsX() >= 3136 && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3520 && combatEntity.getAbsY() <= 3607)
    || (combatEntity.getAbsX() >= 3190
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3648 && combatEntity.getAbsY() <= 3839)
    || (combatEntity.getAbsX() >= 3200
    && combatEntity.getAbsX() <= 3390
    && combatEntity.getAbsY() >= 3840 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2992
    && combatEntity.getAbsX() <= 3007
    && combatEntity.getAbsY() >= 3912 && combatEntity.getAbsY() <= 3967)
    || (combatEntity.getAbsX() >= 2946
    && combatEntity.getAbsX() <= 2959
    && combatEntity.getAbsY() >= 3816 && combatEntity.getAbsY() <= 3831)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3199
    && combatEntity.getAbsY() >= 3856 && combatEntity.getAbsY() <= 3903)
    || (combatEntity.getAbsX() >= 3008
    && combatEntity.getAbsX() <= 3071
    && combatEntity.getAbsY() >= 3600 && combatEntity.getAbsY() <= 3711)
    || (combatEntity.getAbsX() >= 2889
    && combatEntity.getAbsX() <= 2941
    && combatEntity.getAbsY() >= 4426 && combatEntity.getAbsY() <= 4465)
    || // dag kings
    (combatEntity.getAbsX() >= 2460
    && combatEntity.getAbsX() <= 2557
    && combatEntity.getAbsY() >= 3264 && combatEntity.getAbsY() <= 3335)
    || // fun pk multi
    (combatEntity.getAbsX() >= 3071
    && combatEntity.getAbsX() <= 3146
    && combatEntity.getAbsY() >= 3394 && combatEntity.getAbsY() <= 3451)
    || // barb
    (combatEntity.getAbsX() >= 2814
    && combatEntity.getAbsX() <= 2942
    && combatEntity.getAbsY() >= 5250 && combatEntity.getAbsY() <= 5373)
    || // godwars
    (combatEntity.getAbsX() >= 3072
    && combatEntity.getAbsX() <= 3327
    && combatEntity.getAbsY() >= 3608 && combatEntity.getAbsY() <= 3647)
    )
    return true;
    return false;
    }

    public static int random(int range) {
    return (int) (java.lang.Math.random() * (range + 1));
    }

    public static void follow(final CombatEntility combatEntity, final CombatEntility opponent) {
    // System.out.println("Running this Method");
    if (System.currentTimeMillis() < combatEntity.freezeTimer)
    return;
    combatEntity.getEntity().getWalkingQueue().reset() ;
    if (combatEntity.getEntity() instanceof Player) {
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    // follow2(combatEntity,combatEntity.getEntity().getW alkingQueue().getPublicPoint().getX(),combatEntity .getEntity().getWalkingQueue().getPublicPoint().ge tY(),opponent.getAbsX(),opponent.getAbsY(),opponen t.getAbsZ());
    } else
    follow2(combatEntity, combatEntity.getAbsX(), combatEntity.getAbsY(), opponent.getAbsX(), opponent.getAbsY(), opponent.getAbsZ());
    combatEntity.getEntity().getWalkingQueue().finish( );
    }

    public static void follow2(final CombatEntility combatEntity, int x, int y, int toX, int toY, int height) {
    int moveX = 0;
    int moveY = 0;

    /*
    * int path[][] = PathfinderV2.findRoute(x,y,toX, toY,height); if(path
    * == null) return; toX = path[1][0]; toX = path[1][1];
    */
    if (x > toX)
    moveX = -1;
    else if (x < toX)
    moveX = 1;
    if (y > toY)
    moveY = -1;
    else if (y < toY)
    moveY = 1;
    if (moveX != 0 && moveY != 0) {
    if (!World.getWorld().isWalkAble(height, x, y, (x + moveX), (y + moveY), 0)) {
    if (World.getWorld().isWalkAble(height, x, y, (x + moveX), y, 0)) {
    moveY = 0;
    } else if (World.getWorld().isWalkAble(height, x, y, x, (y + moveY), 0)) {
    moveX = 0;
    } else {
    return;
    }
    }
    } else if (!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + moveY, 0)) {
    if(moveX != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    + 1, 0)){
    moveY = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x + moveX, y
    - 1, 0)){
    moveY = -1;
    }
    }
    else if(moveY != 0){
    if(!World.getWorld().isWalkAble(height, x, y, x + 1, y
    + moveY, 0)){
    moveX = 1;
    } else if(!World.getWorld().isWalkAble(height, x, y, x -1, y
    + moveY, 0)){
    moveX = -1;
    }
    }
    }
    combatEntity.getEntity().getWalkingQueue().addStep (x + moveX, y + moveY);
    }

    /**
    * This method is used to poison a CombatEntility.
    * @param combatEntity
    */
    public static void poisonEntity(final CombatEntility combatEntity) {
    if(combatEntity == null)
    return;
    if (combatEntity.isPoisoned())
    return;
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("You have been poisoned.");
    combatEntity.setPoisoned(true);
    World.getWorld().submit(new Event(16000) {
    private int lastDamg = -1;
    private int ticks = 4;
    @Override
    public void execute() {
    if (!combatEntity.isPoisoned()) {
    this.stop();
    return;
    }
    if (combatEntity.getEntity() instanceof Player) {
    if (!combatEntity.getPlayer().isActive()) {
    this.stop();
    return;
    }
    }
    if (lastDamg == -1)
    lastDamg = random(10);
    if (ticks == 0) {
    lastDamg--;
    ticks = 4;
    }
    ticks--;
    if (lastDamg == 0) {
    if (combatEntity.getPlayer() != null)
    combatEntity.getPlayer().getActionSender().sendMes sage("Your poison clears up.");
    combatEntity.setPoisoned(false);
    this.stop();
    } else {
    combatEntity.hit(lastDamg, null, true, 0);
    }
    }
    });
    }

    public void ateFood(final CombatEntility combatEntity) {
    if (combatEntity.predictedAtk > System.currentTimeMillis() + 1000)// this
    // should
    // make
    // sure,
    // you
    // dont
    // eat
    // and
    // hit
    // at
    // the
    // same
    // time.
    return;
    combatEntity.predictedAtk = System.currentTimeMillis() + 1000;
    // combatEntity.predictedAtk2 = System.currentTimeMillis()+1000;
    // combatEntity.predictedAtk3 = System.currentTimeMillis()+1000;
    }

    public static boolean canAtkDis(final CombatEntility combatEntity, final CombatEntility attack) {
    if (combatEntity.getEntity().getLocation().distance(a ttack.getEntity().getLocation()) > 1) {
    return !WorldMap.projectileClear(combatEntity.getEntity() .getLocation(), combatEntity.getOpponent().getEntity().getLocation ());
    } else {
    return WorldMap.checkPos(attack.getEntity().getLocation() .getZ(), combatEntity.getEntity().getLocation().getX(), combatEntity.getEntity().getLocation().getY(), attack.getEntity().getLocation().getX(), attack.getEntity().getLocation().getY(), 1);
    }
    }

    public static void removeArrow(Player player, int bowType, Location loc) {
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) == null)
    return;
    int slot = Equipment.SLOT_ARROWS;
    if (bowType == Constants.RANGEDWEPSTYPE) {
    slot = Equipment.SLOT_WEAPON;
    }
    if (player.getEquipment().get(slot) != null) {
    Item item = new Item(player.getEquipment().get(slot).getId(), 1);
    if (item.getId() != 4740 && item.getId() != 15243) {
    if (random(3) != 1) {
    if (player.getEquipment().get(Equipment.SLOT_CAPE) != null
    && player.getEquipment().get(Equipment.SLOT_CAPE).get Id() == 10499) {
    // player.getInventory().add(item);
    return;
    } else {
    World.getWorld().getGlobalItemManager().newDropIte m(player, new GlobalItem(player, loc, item));
    }
    }
    }
    }
    if (player.getEquipment().get(slot).getCount() <= 1)
    player.getEquipment().set(slot, null);
    else
    player.getEquipment().set(slot, new Item(player.getEquipment().get(slot).getId(), (player.getEquipment().get(slot).getCount() - 1)));

    }

    public static void addXP(Player player, int damg, boolean bow) {
    if (damg > 0) {
    int exp = damg * 1200;
    if (player.getSkills().getLevelForExperience(player.c E.getAtkType()) >= 90)
    exp = damg * 800;
    if (player.cE.getAtkType() == 3) {
    player.cE.setAtkType(2);
    }
    if (player.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    if ((player.cE.getAtkType() == 5 || player.cE.getAtkType() == 2)
    && CombatAssistant.isControlled(player.getEquipment() .get(Equipment.SLOT_WEAPON).getId())) {
    player.cE.setAtkType(3);
    }
    }
    if (player.cE.getAtkType() == 6 && bow) {
    player.getSkills().addExperience(4, 0.66 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 6 && !bow) {
    player.cE.setAtkType(1);
    }
    if (player.cE.getAtkType() == 5 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 5 && !bow) {
    player.cE.setAtkType(2);
    }
    if (player.cE.getAtkType() == 4 && bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    return;
    }
    if (player.cE.getAtkType() == 4 && !bow) {
    player.cE.setAtkType(0);
    }
    if (player.cE.getAtkType() == 1 && bow) {
    player.cE.setAtkType(6);
    }

    else if (bow) {
    player.getSkills().addExperience(4, exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    } else if (player.cE.getAtkType() != 3) {
    player.getSkills().addExperience(player.cE.getAtkT ype(), exp);
    player.getSkills().addExperience(3, 0.5 * exp);
    } else {
    player.getSkills().addExperience(0, 0.33 * exp);
    player.getSkills().addExperience(1, 0.33 * exp);
    player.getSkills().addExperience(2, 0.33 * exp);
    player.getSkills().addExperience(3, 0.33 * exp);
    }
    }
    }

    public static boolean isGuthanEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4724
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4726
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4728
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4730)
    return true;
    return false;
    }

    public static boolean isToragEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4745
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4747
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4749
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4751)
    return true;
    return false;
    }

    public static void createGlobalProjectile(Entity e,int casterY, int casterX, int offsetY, int offsetX, int angle, int speed, int gfxMoving, int startHeight, int endHeight, int lockon,int slope) {
    if(e == null)
    return;
    for(Player p : e.getLocalPlayers()){
    p.getActionSender().createProjectile(casterY, casterX, offsetY, offsetX, angle, speed, gfxMoving, startHeight, endHeight, lockon, slope);
    }
    }

    }


    Also CombatAssistant
    Spoiler for combatassistant:

    package org.hyperion.rs2.model.combat;

    import java.util.Random;

    import org.hyperion.rs2.model.Graphic;
    import org.hyperion.rs2.model.Item;
    import org.hyperion.rs2.model.Player;
    import org.hyperion.rs2.model.Skills;
    import org.hyperion.rs2.model.container.Container;
    import org.hyperion.rs2.model.container.Equipment;
    import org.hyperion.rs2.model.content.skill.Prayer;

    public class CombatAssistant {

    public static void addExperience(CombatEntility combatEntity, int bowType, int damage) {
    if (bowType != Constants.RANGEDNOARROWS && bowType != Constants.MELEETYPE)
    Combat.addXP(combatEntity.getPlayer(), damage, true);
    else
    Combat.addXP(combatEntity.getPlayer(), damage, false);
    }

    /**
    * Use this method to check if a player needs to be skulled and skull him.
    * @param combatEntity
    */
    public static void checkSkull(CombatEntility combatEntity) {
    if(combatEntity.getOpponent().getOpponent() == combatEntity)
    return;
    if(!(combatEntity.getOpponent().getEntity() instanceof Player))
    return;
    if(Combat.getWildLevel(combatEntity.getAbsX(), combatEntity.getAbsY()) == -1)
    return;
    if(System.currentTimeMillis() - combatEntity.lastHit < 10000)
    return;
    if (combatEntity.getPlayer().isSkulled == -1) {
    combatEntity.getPlayer().isSkulled = 0;
    Prayer.setHeadIcon(combatEntity.getPlayer());
    }
    combatEntity.getPlayer().skullTimer = 1200;
    }
    /**
    * Use this to get the extra distance in combat of a combatEntity.
    * @param combatEntity
    * @return
    */
    public static int getExtraDistance(CombatEntility combatEntity) {
    if(!combatEntity.getPlayer().isMoving)
    return 0;
    if(combatEntity.freezeTimer != 0)
    return 0;
    return 1;
    }
    /**
    * Use this to get a players shield id.
    * @param equipment
    * @return
    */
    public static int getShieldId(Container equipment) {
    if (equipment.get(Equipment.SLOT_SHIELD) != null) {
    return equipment.get(Equipment.SLOT_SHIELD).getId();
    }
    return -1;
    }
    /**
    * Use this to get a players arrows id.
    * @param equipment
    * @return
    */
    public static int getArrowsId(Container equipment) {
    if (equipment.get(Equipment.SLOT_ARROWS) != null) {
    return equipment.get(Equipment.SLOT_ARROWS).getId();
    }
    return -1;
    }

    /**
    * Use this to get a players weapon id;
    * @param equipment
    * @return
    */
    public static int getWeaponId(Container equipment) {
    if (equipment.get(Equipment.SLOT_WEAPON) != null) {
    return equipment.get(Equipment.SLOT_WEAPON).getId();
    }
    return -1;
    }
    /**
    * Checks if the attacking combatEntity is valid, thus not null, not dead, etc
    * @param combatEntity
    * @return
    */
    public static boolean isValid(CombatEntility combatEntity) {
    if (combatEntity.getOpponent() == null || combatEntity.getOpponent().getEntity() == null) {
    return false;
    }
    if (combatEntity.getEntity().isDead() || combatEntity.getOpponent().getEntity().isDead()) {
    return false;
    }
    if(!combatEntity.getOpponent().isNpcAttackAble()){
    return false;
    }
    return true;
    }




    /**
    * Finds what weapon the client is using.
    */
    public static int getBowType(CombatEntility c) {
    /**
    * Get the weapon
    */
    Item Weapon = c.getPlayer().getEquipment().get(Equipment.SLOT_WE APON);
    /**
    * If Unarmed, Return MELEETYPE
    */
    if (Weapon == null)
    return Constants.MELEETYPE;
    /**
    * Get weaponId
    */
    int weaponId = Weapon.getId();
    /**
    * Check if using Knifes, Javelins etc
    */
    for (int g : RANGED_WEAPONS) {
    if (g == weaponId)
    return Constants.RANGEDWEPSTYPE;
    }
    /**
    * Declare Arrow
    */
    Item Arrow = c.getPlayer().getEquipment().get(Equipment.SLOT_AR ROWS);
    /**
    * Declare arrowId
    */
    int arrowId = -1;
    if (Arrow != null) {
    arrowId = Arrow.getId();
    }
    /**
    * Check if using Hand Cannon etc
    */
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == weaponId) {
    if (arrowId == -1)
    return Constants.UNIQUENOAMMO;
    ;
    if (getUniqueType(weaponId) == arrowId) {
    return Constants.UNIQUEAMMO;
    } else {
    return Constants.UNIQUEWRONG;
    }
    }
    }
    /**
    * Check if using a Bow like Magic shotbow
    */
    if(arrowId == DRAGON_ARROWS && darkBow(weaponId))
    return Constants.RANGEDARROWS;
    else if(arrowId == DRAGON_ARROWS)
    return Constants.RANGEDNOARROWS;

    for (int g : BOWS) {
    if (weaponId == g) {
    if (getArrowType(arrowId) != 0) {
    return Constants.RANGEDARROWS;
    } else {
    return Constants.RANGEDNOARROWS;
    }
    }
    }
    /**
    * Check if using Crossbow
    */
    for (int g : CBOWS) {
    if (weaponId == g) {
    if (getBoltType(arrowId, weaponId) != 0) {
    return Constants.RANGEDBOLTS;
    } else {
    return Constants.RANGEDNOBOLTS;
    }
    }
    }
    return Constants.MELEETYPE;
    }
    public static final int DRAGON_ARROWS = 112;


    public static boolean isControlled(int ItemId) {
    switch (ItemId) {
    case 4151:
    case 15441:
    case 15442:
    case 15443:
    case 15444:
    return true;
    }
    return false;
    }

    public static boolean is2H(int wep) {
    for (int i : BOWS) {
    if (i == wep)
    return true;
    }
    for (int i : TWO_HANDED) {
    if (i == wep)
    return true;
    }
    return false;
    }

    public static final int[] TWO_HANDED = { 10887, 13905, 13988, 14692, 17143,
    14484, 16909, 18369, 18353, 16425, 4153, 1307, 1309, 1311, 1313,
    1315, 1317, 1319, 6609, 7158,/* 2h weps */4886,4887,4888,4889,
    4982,4983,4984,4985,4958,4959,4960,4961,
    4718, 4710, 4755, 4747, 4734, 4726,/* barrows */11694, 11696,
    11698, 11700, 11730,/* godswords */11235,/* darkbow */10113, 9016,
    6587, 3095, 3096, 3097, 3098, 3099, 3100,/* claws */15701, 15702,
    15703, 15704, 15241

    };

    public static final int[] RANGED_WEAPONS = {
    /* knives */864, 863, 865, 866, 867, 868, 869,
    /* darts */806, 807, 808, 809, 810, 811, 3093,
    /* javelins */825, 826, 827, 828, 829, 830,
    /* thorwn axes */800, 801, 802, 803, 804, 805,
    13883,13879};

    public static final int[] CBOWS = { 9174, 9176, 9177, 9179, 9181, 9183,
    9185, 18357 };

    public static final int[][] UNIQUERANGEWEPS = {
    // Wep Id, Wep Ammo
    { 15241, 15243 }, { 4734, 4740 } };

    public static final int[] BOWS = { 839, 841, 843, 845, 847, 849, 851, 853,
    855, 857, 859, 861, 4212, 4214, 4827, 11235, 15701, 15702, 15703,
    15704 };

    public static int getArrowType(int arrow) {
    switch (arrow) {
    case 882: // Bronze
    return 1;
    case 884: // Iron
    return 2;
    case 886: // Steel
    return 3;
    case 888: // Mithril
    return 4;
    case 890: // Adamant
    return 5;
    case 892: // Rune
    return 6;
    case 598: // Fire arrows
    case 942:
    case 2533:
    case 2535:
    case 2537:
    case 2539:
    case 2541:
    return 7;
    case 78: // Ice arrows
    return 8;
    case 2866: // Flighted ogre arrow
    return 9;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 10;
    case 4150: // broad arrow
    return 11;
    case 11217: // dragon fire arrow
    return 12;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getUniqueType(int wep) {
    for (int i = 0; i < UNIQUERANGEWEPS.length; i++) {
    if (UNIQUERANGEWEPS[i][0] == wep) {
    return UNIQUERANGEWEPS[i][1];
    }
    }
    return -1;
    }

    public static int getBoltType(int arrow, int weapon) {
    if (weapon == 4734 && arrow == 4740)
    return 2;
    switch (arrow) {
    case 9140:// iron
    return 2;
    case 9141:// steel
    return 3;
    case 9142:// mith
    return 4;
    case 9143:// addy
    case 9243://Diamond
    case 9242://Ruby
    return 5;
    case 9144:// rune
    return 6;
    case 9145:// silver?
    return 2;
    case 9341:// dragon
    case 9244:
    return 7;
    case 9245:
    return 8;
    // add bolts here
    default:
    return 0;
    }
    }

    public static int getDrawback(int weapon, int arrow, int type) {
    switch(weapon){
    case 15241:
    return 2138;
    /*case 13883:
    return 1839;
    case 13879:
    return 1837;*/
    }
    if (type == 3) {
    // bolts
    return 28;
    } else if (darkBow(weapon)) {
    switch (arrow) {
    case 882: // Bronze arrow
    return 1104;
    case 884: // Iron arrow
    return 1105;
    case 886: // Steel arrow
    return 1106;
    case 888: // Mithril arrow
    return 1107;
    case 890: // Adamant arrow
    return 1108;
    case 892: // Rune arrow
    return 1109;
    case 78: // ice arrow
    return 1110;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1111;
    case 4150: // broad arrow
    return 1112;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    return 1113;
    case 11217: // dragon fire arrow
    return 1114;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 2) {
    if (weapon == 4212) // Crystal bow.
    return 472;
    switch (arrow) {
    case 882: // Bronze arrow
    return 18;
    case 884: // Iron arrow
    return 19;
    case 886: // Steel arrow
    return 20;
    case 888: // Mithril arrow
    return 21;
    case 890: // Adamant arrow
    return 22;
    case 892: // Rune arrow
    return 24;
    case 11212: // dragon arrow
    case 11227: // dragon arrow
    case 11228: // dragon arrow
    case 11229: // dragon arrow
    return 1116;
    case 4740: // Bolt
    return 28;

    case 78: // ice arrow
    return 25;
    case 4150: // broad arrow
    return 325;
    case 2532: // fire arrow
    case 2534: // fire arrow
    case 2536: // fire arrow
    case 2538: // fire arrow
    case 2540: // fire arrow
    case 11217: // dragon fire arrow
    return 26;
    default:
    System.out.println("Missing drawback :" + arrow);
    return -1;
    }
    } else if (type == 1) {
    switch (weapon) {
    case 863: // Knife
    return 220;
    case 864:
    return 219;
    case 865:
    return 221;
    case 866:
    return 223;
    case 867:
    return 224;
    case 868:
    return 225;
    case 869:
    return 222;
    case 806: // Dart
    return 233;
    case 807:
    return 232;
    case 808:
    return 234;
    case 809:
    return 235;
    case 810:
    return 236;
    case 811:
    return 237;
    case 3093:
    return 235;
    case 825:// javelins
    return 207;
    case 826:
    return 206;
    case 827:
    return 208;
    case 828:
    return 209;
    case 829:
    return 210;
    case 830:
    return 211;
    case 800:// thrown axe
    return 42;
    case 801:
    return 43;
    case 802:
    return 44;
    case 803:
    return 45;
    case 804:
    return 46;
    case 805:
    return 48;
    default:
    System.out.println("Missing throwDrawback :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static int getProjectileSpeed(int weaponId) {
    /*
    * if (c.dbowSpec) return 100;
    */
    switch (weaponId) {
    case 15241:
    return 55;
    }
    return 70;
    }

    public static int getSlope(int weaponId) {
    switch (weaponId) {
    case 15241:
    return -1;
    }
    return 16;
    }

    public static int getStartHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 43;
    }

    public static int getEndHeight(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 22;
    }
    return 31;
    }

    public static int getDelay(int weaponId) {
    switch (weaponId) {
    case 15241:
    return 30;
    }
    return 53;
    }

    public static int getArrowGfx(int weapon, int bowType, int type) {
    switch(weapon){
    case 15241:
    return 2143;
    case 13883:
    return 1839;
    case 13879:
    return 1837;
    }

    if (bowType == Constants.RANGEDBOLTS) {
    switch (type) {
    default:
    return 27;// most use gfx 27
    }
    } else if (bowType == Constants.RANGEDARROWS) {
    // Check first if we're using a Crystal bow.
    if (weapon == 4212) // Crystal bow.
    return 472;

    switch (type) {
    case 1: // Bronze
    return 10;
    case 2: // Iron
    return 9;
    case 3: // Steel
    return 11;
    case 4: // Mithril
    return 12;
    case 5: // Admanant
    return 13;
    case 6: // Rune
    return 15;
    case 7: // Fire
    return 17;
    case 8: // Ice
    return 16;
    case 9: // Flighted ogre arrow
    return 471;
    case 10: // dragon arrow
    return 1120;
    case 11: // broad arrow
    return 326;
    case 12: // dragon fire arrow
    return 17;
    default:
    return 0;
    }
    } else if (bowType == Constants.RANGEDWEPSTYPE) {
    switch (weapon) {
    case 863: // Iron knife
    return 213;
    case 864: // Bronze knife
    return 212;
    case 865: // Steel knife
    return 214;
    case 866: // Mithril knife
    return 216;
    case 867: // Adamant knife
    return 217;
    case 868: // Rune knife
    return 218;
    case 869: // Black knife
    return 215;
    case 806: // Bronze dart
    return 226;
    case 807: // Iron dart
    return 227;
    case 808: // Steel dart
    return 228;
    case 809: // Mithril dart
    return 229;
    case 810: // Adamant dart
    return 230;
    case 811: // Rune dart
    return 231;
    case 3093: // Black dart
    return 229;
    default:
    System.out.println("Missing throwGfx :" + weapon);
    return -1;
    }
    }
    return -1;
    }

    public static boolean isVeracEquiped(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_WEAPON) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 4753
    && player.getEquipment().get(Equipment.SLOT_WEAPON).g etId() == 4755
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 4757
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 4759)
    return true;
    return false;
    }

    private static Random random = new Random();

    private static final double DEFENCE_MODIFIER = 0.895;

    public static int damage(int maxHit, Player attacker, Player victim,
    int skill, boolean prayer, boolean special, boolean ignorePrayers) {
    boolean veracEffect = false;
    if (skill == Skills.ATTACK) {
    if (isVeracEquiped(attacker)) {
    if (random.nextInt(8) == 3) {
    veracEffect = true;
    }
    }
    }

    double attackBonus = attacker.getBonus()[attacker.cE.getAtkType()] == 0 ? 1
    : attacker.getBonus()[attacker.cE.getAtkType()];
    if (attackBonus < 1) {
    attackBonus = 1;
    }
    double attackCalc = attackBonus * attacker.getSkills().getLevel(skill); // +1
    // as
    // its
    // exclusive

    /**
    * Prayer calculations.
    */
    if (skill == Skills.ATTACK) {
    // melee attack prayer modifiers
    if (attacker.getPrayer()[2]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[7]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[15]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    attackCalc *= 1.15;
    } else if (attacker.getPrayer()[25]) {
    attackCalc *= 1.20;
    }
    } else if (skill == Skills.RANGE) {
    // range attack prayer modifiers
    if (attacker.getPrayer()[3]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[11]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[19]) {
    attackCalc *= 1.15;
    }
    } else if (skill == Skills.MAGIC) {
    // magic attack prayer modifiers
    if (attacker.getPrayer()[4]) {
    attackCalc *= 1.05;
    } else if (attacker.getPrayer()[12]) {
    attackCalc *= 1.10;
    } else if (attacker.getPrayer()[20]) {
    attackCalc *= 1.15;
    }
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 0) {
    attackCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    attackCalc += 1;
    }

    double defenceBonus = victim.getBonus()[attacker.cE.getAtkType() + 5] == 0 ? 1
    : victim.getBonus()[attacker.cE.getAtkType() + 5];
    double defenceCalc = defenceBonus
    * victim.getSkills().getLevel(Skills.DEFENCE); // +1 as its
    // exclusive
    /**
    * Prayer calculations.
    */
    if (attacker.getPrayer()[0]) {
    defenceCalc *= 1.05;
    } else if (attacker.getPrayer()[5]) {
    defenceCalc *= 1.10;
    } else if (attacker.getPrayer()[13]) {
    defenceCalc *= 1.15;
    } else if (attacker.getPrayer()[24]) {
    defenceCalc *= 1.20;
    } else if (attacker.getPrayer()[25]) {
    defenceCalc *= 1.25;
    }

    /**
    * As with the melee/range max hit calcs, combat style bonuses are added
    * AFTER the modifiers have taken place.
    */
    if (attacker.cE.getAtkType() == 2) {
    defenceCalc += 3;
    } else if (attacker.cE.getAtkType() == 3) {
    defenceCalc += 1;
    }

    if (veracEffect) {
    defenceCalc = 0;
    }

    /**
    * The chance to succeed out of 1.0.
    */
    double hitSucceed = DEFENCE_MODIFIER * (attackCalc / defenceCalc);
    if (hitSucceed > 1.0) {
    hitSucceed = 1;
    }
    attacker.getActionSender().sendMessage(
    "atk value: " + (hitSucceed * 100));
    if (hitSucceed < random.nextDouble()) {
    return 0;
    } else {
    /**
    * Protection prayers. Note: If an NPC is hitting on a protection
    * prayer, it is 100% blocked, where as if a player is hitting on a
    * protection prayer, their damage is simply reduced by 40%. Also,
    * if the attacker has the Verac effect active, it will ignore the
    * opponent's protection prayers.
    */
    int hit = maxHit;
    double protectionPrayer = 1;
    if (ignorePrayers) {
    protectionPrayer = 1;
    }
    if (prayer) {
    protectionPrayer = 0.4;
    }
    hit = (int) (maxHit * protectionPrayer); // +1 as its exclusive
    return hit;
    }
    }

    /**
    * Real RuneScape Formulas.
    *
    */
    public static double getEffectiveStr(Player p) {
    return p.getSkills().getLevel(2) * getPrayerStr + getStyleBonus;
    }

    public static double getPrayerStr(Player p) {
    if (p.getPrayer()[1]) {
    return 1.05;
    } else if (p.getPrayer()[6]) {
    return 1.10;
    } else if (p.getPrayer()[14]) {
    return 1.15;
    } else if (p.getPrayer()[24]) {
    return 1.18;
    } else if (p.getPrayer()[25]) {
    return 1.23;
    // Curses
    } else if (p.getPrayer()[31]) {
    return 1.05;
    } else if (p.getPrayer()[44]) {
    return 1.15;
    } else if (p.getPrayer()[49]) {
    return 1.32;
    }
    return 1;
    }

    public static int getStyleBonus(Player p) {
    return 1;
    // TODO
    }

    public static int calculateMaxHit(Player p) {
    double base = 0;

    double effective = getEffectiveStr;
    double strengthBonus = p.getBonus()[10];

    base = (13 + effective + (strengthBonus / 10) + ((effective * strengthBonus) / 64)) / 10;


    if (p.specOn) {
    base = (base * SpecialAttacks.getSpecialBonus);
    }
    if (obbyZerk) {
    base *= 1.20;
    }
    if (fullVoidMelee) {
    base *= 1.15;
    }
    if (hasDharokEquiped) {
    double ratio = (double)p.getSkills().getLevel(Skills.HITPOINTS)/(double)p.getSkills().getLevelForExperience(Skills .HITPOINTS);
    base *= 2.0 - ratio;
    }
    if (base <= 0) {
    base = 1;
    }
    // p.getActionSender().sendMessage("Your max is " + Math.floor(base));
    return (int) Math.floor(base);

    }

    public static boolean obbyZerk(Player p) {
    if (p.getEquipment().get(Equipment.SLOT_AMULET) == null
    || p.getEquipment().get(Equipment.SLOT_WEAPON) == null) {
    return false;
    }
    if (p.getEquipment().get(Equipment.SLOT_AMULET).getId () == 11128
    && p.getEquipment().get(Equipment.SLOT_WEAPON).getId( ) == 6528)
    return true;
    return false;
    }

    public static boolean fullVoidMelee(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11665
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidRange(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11664
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    public static boolean fullVoidMage(Player player) {
    if (player.getEquipment().get(Equipment.SLOT_HELM) == null
    || player.getEquipment().get(Equipment.SLOT_GLOVES) == null
    || player.getEquipment().get(Equipment.SLOT_CHEST) == null
    || player.getEquipment().get(Equipment.SLOT_BOTTOMS) == null)
    return false;
    if (player.getEquipment().get(Equipment.SLOT_HELM).ge tId() == 11663
    && player.getEquipment().get(Equipment.SLOT_GLOVES).g etId() == 8842
    && player.getEquipment().get(Equipment.SLOT_CHEST).ge tId() == 8839
    && player.getEquipment().get(Equipment.SLOT_BOTTOMS). getId() == 8840)
    return true;
    return false;
    }

    /**
    * Checks if a player has the full dharok set equiped.
    * @param player
    * @return
    */
    public static boolean hasDharokEquiped(Player player) {
    if(player.getEquipment().get(Equipment.SLOT_HELM) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_HELM). getId() != 4716)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_WEAPON ).getId() != 4718)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_CHEST) .getId() != 4720)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S) == null)
    return false;
    if(player.getEquipment().get(Equipment.SLOT_BOTTOM S).getId() != 4722)
    return false;
    return true;
    }

    public static int getRangedHit2(Player p) {
    int effectiveStrength = p.getSkills().getLevel(4);
    if (p.cE.bowType == 0)
    effectiveStrength += 3;
    int max = (int) (1.3 + (effectiveStrength / 10)
    + (p.getBonus()[4] / 80) + ((p.getBonus()[10] * p.getBonus()[4]) / 640));
    return max;
    }

    public static boolean darkBow(int itemId) {
    switch (itemId) {
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    return true;
    }
    return false;
    }

    /**
    * Get the ranged hit.
    *
    * @param maxHit
    * the current maxhit for melee
    * @param type
    * The type of the arrow.
    */

    public static int getRangedHit(int maxHit, int type) {
    /*
    * switch(type) { case 1: // Bronze return maxHit + (int)
    * Math.floor(Math.random() * 1); case 2: // Iron return maxHit + (int)
    * Math.floor(Math.random() * 2); case 3: // Steel return maxHit + (int)
    * Math.floor(Math.random() * 3); case 4: // Mithril return maxHit +
    * (int) Math.floor(Math.random() * 4); case 5: // Admanant return
    * maxHit + (int) Math.floor(Math.random() * 5); case 6: // Rune return
    * maxHit + (int) Math.floor(Math.random() * 6); case 7: // Fire return
    * maxHit + (int) Math.floor(Math.random() * 7); case 8: // Ice return
    * maxHit + (int) Math.floor(Math.random() * 8); case 9: // Flighted
    * ogre arrow return maxHit + (int) Math.floor(Math.random() * 8);
    * default: // Type is 0 return 2; }
    */
    int am = type;
    if (am > 8)
    am = 8;
    maxHit += type;
    return maxHit;
    }

    private static final int[][] RANGEDDATA = { { 877, 10 }, { 9140, 46 },
    { 9145, 36 }, { 9141, 64 }, { 9142, 82 }, { 9143, 100 },
    { 9144, 115 }, { 9236, 14 }, { 9237, 30 }, { 9238, 48 },
    { 9239, 66 }, { 9240, 83 }, { 9241, 85 }, { 9242, 103 },
    { 9243, 105 }, { 9244, 117 }, { 9245, 125 }, { 882, 7 },
    { 884, 10 }, { 886, 16 }, { 888, 22 }, { 890, 31 }, { 892, 49 },
    { 4740, 55 }, { 11212, 60 }, { 806, 1 }, { 807, 3 }, { 808, 4 },
    { 809, 7 }, { 810, 10 }, { 811, 14 }, { 11230, 20 }, { 864, 3 },
    { 863, 4 }, { 865, 7 }, { 866, 10 }, { 867, 14 }, { 868, 24 },
    { 825, 6 }, { 826, 10 }, { 827, 12 }, { 828, 18 }, { 829, 28 },
    { 830, 42 }, { 800, 5 }, { 801, 7 }, { 802, 11 }, { 803, 16 },
    { 804, 23 }, { 805, 36 }, { 9976, 0 }, { 9977, 15 }, { 4212, 70 },
    { 4214, 70 }, { 4215, 70 }, { 4216, 70 }, { 4217, 70 },
    { 4218, 70 }, { 4219, 70 }, { 4220, 70 }, { 4221, 70 },
    { 4222, 70 }, { 4223, 70 }, { 6522, 49 }, { 10034, 15 },
    { 15015, 130 }, { 15016, 110 }, { 4734, 49 }, { 4740, 49 },
    { 19157, 80 }, { 19162, 80 }, { 19152, 80 }, { 15243, 150 },
    { 13883, 130},{13879,135}
    };

    public static int getRangeStr(int i) {
    int str = 0;
    for (int l = 0; l < RANGEDDATA.length; l++) {
    if (i == RANGEDDATA[l][0]) {
    str = RANGEDDATA[l][1];
    }
    }
    return str;
    }

    public static int calculateRangeMaxHit(Player p) {
    int rangedBoosted = p.getSkills().getLevel(4);
    int rangedLevel = p.getSkills().getLevelForExperience(4);
    int rangedStr;
    if (CombatAssistant.getBowType(p.cE) == Constants.RANGEDWEPSTYPE)
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_WE APON)
    .getId());
    else
    rangedStr = getRangeStr(p.getEquipment().get(Equipment.SLOT_AR ROWS)
    .getId());
    double bonus = 1.00;
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    bonus = 1.05;
    } else if (p.getPrayer()[11]) {
    bonus = 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    bonus = 1.15;
    }
    if (fullVoidRange) {
    bonus += .15;
    }
    double e = Math.floor(rangedLevel * bonus + rangedBoosted / 8);

    /*
    * if (c.fightMode == 0) { e = (e + 3.0); }
    */
    double specialBonus = 1.0;

    if (p.specOn && p.getEquipment().get(Equipment.SLOT_WEAPON) != null) {
    switch (p.getEquipment().get(Equipment.SLOT_WEAPON).getId ()) {
    case 13883:
    specialBonus = 1.15;
    break;
    case 19149:
    case 19143:
    case 19146:
    case 859:
    specialBonus = 1.3;
    break;
    case 861:
    specialBonus = 1.1;
    case 11235:
    case 15701:
    case 15702:
    case 15703:
    case 15704:
    if (p.getEquipment().get(Equipment.SLOT_ARROWS) != null
    && p.getEquipment().get(Equipment.SLOT_ARROWS).getId( ) == 11212) {
    specialBonus = 1.3;
    } else {
    specialBonus = 1.1;
    }
    break;
    case 15241:
    specialBonus = 1.1;
    }
    }
    double max = (1.3 + e / 8 + rangedStr / 80 + e * rangedStr / 640);
    //p.getActionSender().sendMessage("Range max : " + max);
    max *= specialBonus;
    return (int) max;
    }

    public static int calculateRangeAttack(Player p) {
    double rangeAtk = p.getSkills().getLevel(4);
    if (p.getPrayer()[3] || p.getPrayer()[32]) {
    rangeAtk *= 1.05;
    } else if (p.getPrayer()[11]) {
    rangeAtk *= 1.10;
    } else if (p.getPrayer()[19] || p.getPrayer()[41]) {
    rangeAtk *= 1.15;
    }
    if(fullVoidRange)
    rangeAtk *= 1.15;
    return (int) (0.50*(rangeAtk + p.getBonus()[4]));
    }

    public static int calculateRangeDefence(Player player) {
    int rangeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    rangeDef = rangeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    rangeDef = rangeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    rangeDef = rangeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    rangeDef = rangeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    rangeDef = rangeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    rangeDef = rangeDef *= 1.15;
    }
    return rangeDef + player.getBonus()[9]/4;
    }

    public static int calculateMageAtk(Player player) {
    int mageLvl = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[3];
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLvl *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLvl *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLvl *= 1.15;
    }
    return mageLvl + bonus * 2;
    }

    public static int calculateMageDef(Player player) {
    int defLevel = player.getSkills().getLevel(1);
    int mageLevel = player.getSkills().getLevel(6);
    int bonus = player.getBonus()[8];
    //Def Prayers
    if (player.getPrayer()[0]) {
    defLevel = defLevel *= 1.05;
    } else if(player.getPrayer()[5]){
    defLevel = defLevel *= 1.10;
    } else if(player.getPrayer()[13]){
    defLevel = defLevel *= 1.15;
    } else if(player.getPrayer()[24]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[25]){
    defLevel = defLevel *= 1.25;
    } else if(player.getPrayer()[43]){
    defLevel = defLevel *= 1.20;
    } else if(player.getPrayer()[49]){
    defLevel = defLevel *= 1.15;
    }
    //Mage Prayers
    if (player.getPrayer()[4] || player.getPrayer()[33]) {
    mageLevel *= 1.05;
    } else if (player.getPrayer()[12]) {
    mageLevel *= 1.10;
    } else if (player.getPrayer()[20] || player.getPrayer()[42]) {
    mageLevel *= 1.15;
    }
    return bonus * 2 + defLevel/2 + mageLevel/2;
    }

    public static int bestMeleeDef(Player player) {
    if (player.getBonus()[5] > player.getBonus()[6]
    && player.getBonus()[5] > player.getBonus()[7])
    return 5;
    if (player.getBonus()[6] > player.getBonus()[5]
    && player.getBonus()[6] > player.getBonus()[7])
    return 6;
    return player.getBonus()[7] <= player.getBonus()[5]
    || player.getBonus()[7] <= player.getBonus()[6] ? 5 : 7;
    }

    public static int bestMeleeAtk(Player player) {
    if (player.getBonus()[0] > player.getBonus()[1]
    && player.getBonus()[0] > player.getBonus()[2])
    return 0;
    if (player.getBonus()[1] > player.getBonus()[0]
    && player.getBonus()[1] > player.getBonus()[2])
    return 1;
    return player.getBonus()[2] <= player.getBonus()[0]
    || player.getBonus()[2] <= player.getBonus()[1] ? 0 : 2;
    }

    /**
    * Calculate Melee Atk Value
    */
    public static int calculateMeleeAttack(Player player) {
    double meleeAtk = player.getSkills().getLevel(0);
    if(player.getPrayer()[2] || player.getPrayer()[31]){
    meleeAtk *= 1.05;
    } else if(player.getPrayer()[7]){
    meleeAtk *= 1.10;
    } else if(player.getPrayer()[15] || player.getPrayer()[40]){
    meleeAtk *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeAtk *= 1.17;
    } else if(player.getPrayer()[25]){
    meleeAtk *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeAtk *= 1.25;
    }
    double bonus = player.getBonus()[0];
    for(int i = 1; i < 3; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeAtk + bonus);
    }
    /**
    * @param player
    * @return Melee Defence
    */
    public static int calculateMeleeDefence(Player player) {
    int meleeDef = player.getSkills().getLevel(1);
    if (player.getPrayer()[0]) {
    meleeDef = meleeDef *= 1.05;
    } else if(player.getPrayer()[5]){
    meleeDef = meleeDef *= 1.10;
    } else if(player.getPrayer()[13]){
    meleeDef = meleeDef *= 1.15;
    } else if(player.getPrayer()[24]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[25]){
    meleeDef = meleeDef *= 1.25;
    } else if(player.getPrayer()[43]){
    meleeDef = meleeDef *= 1.20;
    } else if(player.getPrayer()[49]){
    meleeDef = meleeDef *= 1.15;
    }
    double bonus = player.getBonus()[5];
    for(int i = 6; i < 8; i++){
    if(player.getBonus()[i] > bonus){
    bonus = player.getBonus()[i];
    }
    }
    return (int) (meleeDef + bonus*1.3);
    }

    public static void drawBackGfx(CombatEntility combatEntity, int weaponId,
    int arrowId, int bowType) {
    if (weaponId != 15241)
    combatEntity.doGfx(CombatAssistant.getDrawback(wea ponId, arrowId,
    bowType));
    else
    combatEntity.getPlayer().playGraphics(Graphic.crea te(2138));
    }

    /**
    * Sending Projectile part.
    */
    public static void fireProjectile(CombatEntility combatEntity, int bowType,
    int arrowType) {
    int weaponId = -1;
    if (combatEntity.getPlayer().getEquipment().get(Equip ment.SLOT_WEAPON) != null) {
    weaponId = combatEntity.getPlayer().getEquipment()
    .get(Equipment.SLOT_WEAPON).getId();
    }
    int proj = CombatAssistant.getArrowGfx(weaponId, bowType, arrowType);
    int offsetY = (combatEntity.getAbsX() - (combatEntity.getOpponent()
    .getAbsX() + combatEntity.getOpponent().getOffsetX())) * -1;
    int offsetX = (combatEntity.getAbsY() - (combatEntity.getOpponent()
    .getAbsY() + combatEntity.getOpponent().getOffsetY())) * -1;
    // Lockon Target
    int hitId = combatEntity.getSlotId(combatEntity.getEntity());
    int speed = CombatAssistant.getProjectileSpeed(weaponId);
    int slope = CombatAssistant.getSlope(weaponId);
    int startHeight = CombatAssistant.getStartHeight(weaponId);
    int endHeight = CombatAssistant.getEndHeight(weaponId);
    int time = CombatAssistant.getDelay(weaponId);
    // create the projectile
    combatEntity
    .getPlayer()
    .getActionSender()
    .createGlobalProjectile(combatEntity.getAbsY(),
    combatEntity.getAbsX(), offsetY, offsetX, 50, speed,
    proj, startHeight, endHeight, hitId, time, slope);
    Combat.removeArrow(combatEntity.getPlayer(), bowType, combatEntity
    .getOpponent().getEntity().getLocation());
    }
    }
    I meant whatever handles your combat I'm quite tired and don't want to read all that right now but what I'd do for now is throw in some "player.sendMessage("DEBUG");" to find the problem. Just put like debug1, debug2, then whenever you click on an npc you should find out what's causing it.
    Reply With Quote  
     


Thread Information
Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)


User Tag List

Similar Threads

  1. Replies: 2
    Last Post: 06-13-2012, 12:18 AM
  2. PI Cannot attack a aggressive NPC
    By Zeldos in forum Help
    Replies: 3
    Last Post: 03-19-2012, 02:23 PM
  3. [PI] Cannot attack npc!
    By Owner godlys in forum Help
    Replies: 11
    Last Post: 09-06-2011, 11:38 PM
  4. How To Fix Ur Attack Npc With More Wepaon
    By PrataKosong in forum Tutorials
    Replies: 10
    Last Post: 02-08-2009, 05:55 PM
  5. Admin's Cannot Attack Players.(explained)
    By rickard82 in forum Tutorials
    Replies: 3
    Last Post: 08-03-2008, 02:22 AM
Posting Permissions
  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •