|
|
@ -264,19 +264,9 @@ public class CombatUtilities { |
|
|
|
swingIsBlock(agent, target, passiveAnim); |
|
|
|
swingIsBlock(agent, target, passiveAnim); |
|
|
|
return; |
|
|
|
return; |
|
|
|
} |
|
|
|
} |
|
|
|
if (agent.getEquip().get(1) != null && agent.getEquip().get(2) != null && agent.getEquip().get(2).getItemBase().isShield() == false) { |
|
|
|
|
|
|
|
//mob is duel wielding and should conduct an attack for each hand
|
|
|
|
swingIsDamage(agent, target, determineDamage(agent), anim); |
|
|
|
ItemBase weapon1 = agent.getEquip().get(1).getItemBase(); |
|
|
|
|
|
|
|
double range1 = getMaxDmg(weapon1.getMinDamage(), agent, weapon1) - getMinDmg(weapon1.getMinDamage(), agent, weapon1); |
|
|
|
|
|
|
|
double damage1 = getMinDmg(weapon1.getMinDamage(), agent, weapon1) + ((ThreadLocalRandom.current().nextFloat() * range1) + (ThreadLocalRandom.current().nextFloat() * range1)) / 2; |
|
|
|
|
|
|
|
swingIsDamage(agent, target, (float) damage1, CombatManager.getSwingAnimation(weapon1, null, true)); |
|
|
|
|
|
|
|
ItemBase weapon2 = agent.getEquip().get(2).getItemBase(); |
|
|
|
|
|
|
|
double range2 = getMaxDmg(weapon2.getMinDamage(), agent, weapon2) - getMinDmg(weapon2.getMinDamage(), agent, weapon2); |
|
|
|
|
|
|
|
double damage2 = getMinDmg(weapon2.getMinDamage(), agent, weapon2) + ((ThreadLocalRandom.current().nextFloat() * range2) + (ThreadLocalRandom.current().nextFloat() * range2)) / 2; |
|
|
|
|
|
|
|
swingIsDamage(agent, target, (float) damage2, CombatManager.getSwingAnimation(weapon1, null, false)); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
swingIsDamage(agent, target, determineDamage(agent), anim); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (agent.getWeaponPower() != null) |
|
|
|
if (agent.getWeaponPower() != null) |
|
|
|
agent.getWeaponPower().attack(target, MBServerStatics.ONE_MINUTE); |
|
|
|
agent.getWeaponPower().attack(target, MBServerStatics.ONE_MINUTE); |
|
|
@ -319,19 +309,10 @@ public class CombatUtilities { |
|
|
|
if (target == null) |
|
|
|
if (target == null) |
|
|
|
return 0; |
|
|
|
return 0; |
|
|
|
|
|
|
|
|
|
|
|
float damage = 0; |
|
|
|
int damage = 0; |
|
|
|
|
|
|
|
|
|
|
|
DamageType dt = getDamageType(agent); |
|
|
|
DamageType dt = getDamageType(agent); |
|
|
|
if ((agent.agentType.equals(AIAgentType.PET)) == true || agent.isPet() == true || agent.isNecroPet() == true) { |
|
|
|
damage = ThreadLocalRandom.current().nextInt((int)getMinDmg(agent), (int)getMaxDmg(agent) + 1); |
|
|
|
damage = calculatePetDamage(agent); |
|
|
|
|
|
|
|
} else if (agent.isPlayerGuard() == true) { |
|
|
|
|
|
|
|
//damage = calculateGuardDamage(agent);
|
|
|
|
|
|
|
|
damage = calculateMobDamage(agent); |
|
|
|
|
|
|
|
} else if (agent.getLevel() > 80) { |
|
|
|
|
|
|
|
damage = calculateEpicDamage(agent); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
damage = calculateMobDamage(agent); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) { |
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) { |
|
|
|
if (((AbstractCharacter) target).isSit()) { |
|
|
|
if (((AbstractCharacter) target).isSit()) { |
|
|
|
damage *= 2.5f; //increase damage if sitting
|
|
|
|
damage *= 2.5f; //increase damage if sitting
|
|
|
@ -357,158 +338,16 @@ public class CombatUtilities { |
|
|
|
return dt; |
|
|
|
return dt; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static int calculatePetDamage(Mob agent) { |
|
|
|
public static double getMinDmg(Mob agent) { |
|
|
|
//damage calc for pet
|
|
|
|
if(agent.equip.get(2) != null && !agent.equip.get(2).getItemBase().isShield()) |
|
|
|
float range; |
|
|
|
return agent.minDamageHandTwo; |
|
|
|
float damage; |
|
|
|
else return agent.minDamageHandOne; |
|
|
|
float min = 40; |
|
|
|
|
|
|
|
float max = 60; |
|
|
|
|
|
|
|
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); |
|
|
|
|
|
|
|
double minDmg = getMinDmg(min, agent, null); |
|
|
|
|
|
|
|
double maxDmg = getMaxDmg(max, agent, null); |
|
|
|
|
|
|
|
dmgMultiplier += agent.getLevel() * 0.1f; |
|
|
|
|
|
|
|
range = (float) (maxDmg - minDmg); |
|
|
|
|
|
|
|
damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2; |
|
|
|
|
|
|
|
return (int) (damage * dmgMultiplier); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static int calculateGuardDamage(Mob agent) { |
|
|
|
|
|
|
|
//damage calc for guard
|
|
|
|
|
|
|
|
ItemBase weapon = agent.getEquip().get(1).getItemBase(); |
|
|
|
|
|
|
|
AbstractWorldObject target = agent.getCombatTarget(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double minDmg = weapon.getMinDamage(); |
|
|
|
|
|
|
|
double maxDmg = weapon.getMaxDamage(); |
|
|
|
|
|
|
|
double min = getMinDmg(minDmg, agent, weapon); |
|
|
|
|
|
|
|
double max = getMaxDmg(maxDmg, agent, weapon); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DamageType dt = weapon.getDamageType(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double range = max - min; |
|
|
|
|
|
|
|
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) |
|
|
|
|
|
|
|
if (((AbstractCharacter) target).isSit()) |
|
|
|
|
|
|
|
damage *= 2.5f; //increase damage if sitting
|
|
|
|
|
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) |
|
|
|
|
|
|
|
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static int calculateEpicDamage(Mob agent) { |
|
|
|
|
|
|
|
//handle r8 mob damage
|
|
|
|
|
|
|
|
DamageType dt = DamageType.Crush; |
|
|
|
|
|
|
|
AbstractWorldObject target = agent.getCombatTarget(); |
|
|
|
|
|
|
|
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); |
|
|
|
|
|
|
|
double min = agent.getMinDamageHandOne(); |
|
|
|
|
|
|
|
double max = agent.getMaxDamageHandOne(); |
|
|
|
|
|
|
|
if (agent.getEquip().get(1) != null) { |
|
|
|
|
|
|
|
if (agent.getEquip().get(1).getItemBase() != null) { |
|
|
|
|
|
|
|
dt = agent.getEquip().get(1).getItemBase().getDamageType(); |
|
|
|
|
|
|
|
min = agent.getMinDamageHandOne(); |
|
|
|
|
|
|
|
max = agent.getMaxDamageHandOne(); |
|
|
|
|
|
|
|
} else if (agent.getEquip().get(2).getItemBase() != null && agent.getEquip().get(2).getItemBase().isShield() == false) { |
|
|
|
|
|
|
|
dt = agent.getEquip().get(2).getItemBase().getDamageType(); |
|
|
|
|
|
|
|
min = agent.getMinDamageHandTwo(); |
|
|
|
|
|
|
|
max = agent.getMaxDamageHandTwo(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
double range = max - min; |
|
|
|
|
|
|
|
double damage = min + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2; |
|
|
|
|
|
|
|
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static int calculateMobDamage(Mob agent) { |
|
|
|
|
|
|
|
ItemBase weapon = null; |
|
|
|
|
|
|
|
double minDmg; |
|
|
|
|
|
|
|
double maxDmg; |
|
|
|
|
|
|
|
DamageType dt; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//main hand or offhand damage
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (agent.getEquip().get(1) != null) |
|
|
|
|
|
|
|
weapon = agent.getEquip().get(1).getItemBase(); |
|
|
|
|
|
|
|
else if (agent.getEquip().get(2) != null) |
|
|
|
|
|
|
|
weapon = agent.getEquip().get(2).getItemBase(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (weapon != null) { |
|
|
|
|
|
|
|
minDmg = getMinDmg(weapon.getMinDamage(), agent, weapon); |
|
|
|
|
|
|
|
maxDmg = getMaxDmg(weapon.getMaxDamage(), agent, weapon); |
|
|
|
|
|
|
|
dt = weapon.getDamageType(); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
minDmg = agent.getMobBase().getDamageMin(); |
|
|
|
|
|
|
|
maxDmg = agent.getMobBase().getDamageMax(); |
|
|
|
|
|
|
|
dt = DamageType.Crush; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AbstractWorldObject target = agent.getCombatTarget(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
float dmgMultiplier = 1 + agent.getBonuses().getFloatPercentAll(ModType.MeleeDamageModifier, SourceType.None); |
|
|
|
|
|
|
|
double range = maxDmg - minDmg; |
|
|
|
|
|
|
|
double damage = minDmg + ((ThreadLocalRandom.current().nextFloat() * range) + (ThreadLocalRandom.current().nextFloat() * range)) / 2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) |
|
|
|
|
|
|
|
if (((AbstractCharacter) target).isSit()) |
|
|
|
|
|
|
|
damage *= 2.5f; //increase damage if sitting
|
|
|
|
|
|
|
|
if (AbstractWorldObject.IsAbstractCharacter(target)) |
|
|
|
|
|
|
|
return (int) (((AbstractCharacter) target).getResists().getResistedDamage(agent, (AbstractCharacter) target, dt, (float) damage, 0) * dmgMultiplier); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public static double getMinDmg(double min, Mob agent, ItemBase weapon) { |
|
|
|
public static double getMaxDmg(Mob agent) { |
|
|
|
|
|
|
|
if(agent.equip.get(2) != null && !agent.equip.get(2).getItemBase().isShield()) |
|
|
|
int primary = agent.getStatStrCurrent(); |
|
|
|
return agent.maxDamageHandTwo; |
|
|
|
int secondary = agent.getStatDexCurrent(); |
|
|
|
else return agent.maxDamageHandOne; |
|
|
|
int focusLevel = 0; |
|
|
|
|
|
|
|
int masteryLevel = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (weapon != null) { |
|
|
|
|
|
|
|
if (weapon.isStrBased() == true) { |
|
|
|
|
|
|
|
primary = agent.getStatStrCurrent(); |
|
|
|
|
|
|
|
secondary = agent.getStatDexCurrent(); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
primary = agent.getStatDexCurrent(); |
|
|
|
|
|
|
|
secondary = agent.getStatStrCurrent(); |
|
|
|
|
|
|
|
if (agent.getSkills().containsKey(weapon.getSkillRequired())) { |
|
|
|
|
|
|
|
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (agent.getSkills().containsKey(weapon.getMastery())) { |
|
|
|
|
|
|
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return min * (pow(0.0048 * primary + .049 * (primary - 0.75), 0.5) + pow(0.0066 * secondary + 0.064 * (secondary - 0.75), 0.5) + +0.01 * (focusLevel + masteryLevel)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public static double getMaxDmg(double max, Mob agent, ItemBase weapon) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int primary = agent.getStatStrCurrent(); |
|
|
|
|
|
|
|
int secondary = agent.getStatDexCurrent(); |
|
|
|
|
|
|
|
int focusLevel = 0; |
|
|
|
|
|
|
|
int masteryLevel = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (weapon != null) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (weapon.isStrBased() == true) { |
|
|
|
|
|
|
|
primary = agent.getStatStrCurrent(); |
|
|
|
|
|
|
|
secondary = agent.getStatDexCurrent(); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
primary = agent.getStatDexCurrent(); |
|
|
|
|
|
|
|
secondary = agent.getStatStrCurrent(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (agent.getSkills().containsKey(weapon.getSkillRequired())) |
|
|
|
|
|
|
|
focusLevel = (int) agent.getSkills().get(weapon.getSkillRequired()).getModifiedAmount(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (agent.getSkills().containsKey(weapon.getSkillRequired())) |
|
|
|
|
|
|
|
masteryLevel = (int) agent.getSkills().get(weapon.getMastery()).getModifiedAmount(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return max * (pow(0.0124 * primary + 0.118 * (primary - 0.75), 0.5) + pow(0.0022 * secondary + 0.028 * (secondary - 0.75), 0.5) + 0.0075 * (focusLevel + masteryLevel)); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|