Paste combat handler. Can't do anything if we can't see your methods
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());
}
}
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.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());
}
}
« Previous Thread | Next Thread » |
Thread Information |
Users Browsing this ThreadThere are currently 1 users browsing this thread. (0 members and 1 guests) |
Posting Permissions |
|