Fixed accuracy calculations.

This commit is contained in:
ceikry
2021-07-23 14:36:17 -05:00
parent 1ddf01c098
commit aafe92d544
17 changed files with 72 additions and 87 deletions
@@ -159,8 +159,8 @@ public final class GWDGraardorSwingHandler extends CombatSwingHandler {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker); return getType().getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -192,8 +192,8 @@ public final class GWDKreeArraSwingHandler extends CombatSwingHandler {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker); return getType().getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -143,8 +143,8 @@ public final class GWDTsutsarothSwingHandler extends CombatSwingHandler {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker); return getType().getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -121,8 +121,8 @@ public class GWDZilyanaSwingHandler extends CombatSwingHandler {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker); return getType().getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -332,8 +332,8 @@ public final class TzhaarFightCaveNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -216,8 +216,8 @@ public final class ElvargNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -169,8 +169,8 @@ public final class MeldarMadNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -208,8 +208,8 @@ public class DragonfireSwingHandler extends CombatSwingHandler {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); return CombatStyle.MAGIC.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -296,8 +296,8 @@ public final class KalphiteQueenNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -315,8 +315,8 @@ public class TormentedDemonNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -143,11 +143,11 @@ public final class KingBlackDragonNPC extends AbstractNPC {
} }
@Override @Override
public int calculateDefence(Entity entity, Entity attacker) { public int calculateDefence(Entity victim, Entity attacker) {
if (style == CombatStyle.MELEE) { if (style == CombatStyle.MELEE) {
return style.getSwingHandler().calculateDefence(entity, attacker); return style.getSwingHandler().calculateDefence(victim, attacker);
} }
return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker); return CombatStyle.MAGIC.getSwingHandler().calculateDefence(victim, attacker);
} }
@Override @Override
@@ -1,5 +1,6 @@
package core.game.node.entity.player; package core.game.node.entity.player;
import api.ContentAPI;
import core.game.component.Component; import core.game.component.Component;
import core.game.container.Container; import core.game.container.Container;
import core.game.container.impl.BankContainer; import core.game.container.impl.BankContainer;
@@ -70,6 +71,7 @@ import core.tools.RandomFunction;
import core.tools.StringUtils; import core.tools.StringUtils;
import kotlin.Unit; import kotlin.Unit;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.rs09.consts.Items;
import rs09.ServerConstants; import rs09.ServerConstants;
import rs09.game.VarpManager; import rs09.game.VarpManager;
import rs09.game.content.ame.RandomEventManager; import rs09.game.content.ame.RandomEventManager;
@@ -755,6 +757,14 @@ public class Player extends Entity {
Arrays.fill(renderInfo.getAppearanceStamps(),0); Arrays.fill(renderInfo.getAppearanceStamps(),0);
} }
/**
* Checks if the player is wearing void.
*/
public boolean isWearingVoid(boolean melee){
int helm = melee ? Items.VOID_MELEE_HELM_11665 : Items.VOID_RANGER_HELM_11664;
return ContentAPI.inEquipment(this, helm, 1) && ContentAPI.inEquipment(this, Items.VOID_KNIGHT_ROBE_8840, 1) && ContentAPI.inEquipment(this, Items.VOID_KNIGHT_TOP_8839, 1);
}
/** /**
* Updates the player's scene graph. * Updates the player's scene graph.
* @param login If the player is logging in. * @param login If the player is logging in.
@@ -77,11 +77,11 @@ abstract class CombatSwingHandler(var type: CombatStyle?) {
/** /**
* Calculates the maximum defence of the entity. * Calculates the maximum defence of the entity.
* @param entity The entity. * @param victim The entity.
* @param attacker The entity to defend against. * @param attacker The entity to defend against.
* @return The maximum defence value. * @return The maximum defence value.
*/ */
abstract fun calculateDefence(entity: Entity?, attacker: Entity?): Int abstract fun calculateDefence(victim: Entity?, attacker: Entity?): Int
/** /**
* Gets the void set multiplier. * Gets the void set multiplier.
@@ -188,18 +188,17 @@ abstract class CombatSwingHandler(var type: CombatStyle?) {
} }
val attack = calculateAccuracy(entity) * accuracyMod * mod * getSetMultiplier(entity, Skills.ATTACK) val attack = calculateAccuracy(entity) * accuracyMod * mod * getSetMultiplier(entity, Skills.ATTACK)
val defence = calculateDefence(victim, entity) * defenceMod * getSetMultiplier(victim, Skills.DEFENCE) val defence = calculateDefence(victim, entity) * defenceMod * getSetMultiplier(victim, Skills.DEFENCE)
val chance: Double val chance: Double = if (attack < defence) {
chance = if (attack < defence) { 1 - ((defence + 2) / ((2 * attack) + 1))
(attack - 1) / (defence * 2)
} else { } else {
1 - (defence + 1) / (attack * 2) attack / ((2 * defence) + 1)
} }
val ratio = chance * 100 val ratio = chance * 100
val accuracy = floor(ratio) val accuracy = floor(ratio)
val block = floor(101 - ratio) val block = floor(101 - ratio)
val acc = Math.random() * accuracy val acc = Math.random() * accuracy
val def = Math.random() * block val def = Math.random() * block
return acc > def return (acc > def).also { if(entity?.username?.toLowerCase() == "test10") SystemLogger.logInfo("Should hit: $it") }
} }
/** /**
@@ -202,14 +202,14 @@ open class MagicSwingHandler
return (baseDamage * levelMod).toInt() + 1 return (baseDamage * levelMod).toInt() + 1
} }
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
val level = entity!!.skills.getLevel(Skills.DEFENCE, true) val level = victim!!.skills.getLevel(Skills.DEFENCE, true)
var prayer = 1.0 var prayer = 1.0
if (entity is Player) { if (victim is Player) {
prayer += entity.prayer.getSkillBonus(Skills.MAGIC) prayer += victim.prayer.getSkillBonus(Skills.MAGIC)
} }
val effective = floor(level * prayer * 0.3) + entity.skills.getLevel(Skills.MAGIC, true) * 0.7 val effective = floor(level * prayer * 0.3) + victim.skills.getLevel(Skills.MAGIC, true) * 0.7
val equipment = entity.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5] val equipment = victim.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5]
return floor((effective + 8) * (equipment + 64) / 10).toInt() return floor((effective + 8) * (equipment + 64) / 10).toInt()
} }
@@ -139,8 +139,8 @@ open class MultiSwingHandler(meleeDistance: Boolean, vararg attacks: SwitchAttac
} else current.handler.calculateHit(entity, victim, modifier) } else current.handler.calculateHit(entity, victim, modifier)
} }
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
return current.handler.calculateDefence(entity, attacker) return current.handler.calculateDefence(victim, attacker)
} }
override fun getSetMultiplier(e: Entity?, skillId: Int): Double { override fun getSetMultiplier(e: Entity?, skillId: Int): Double {
@@ -1,5 +1,7 @@
package rs09.game.node.entity.combat.handlers package rs09.game.node.entity.combat.handlers
import api.ContentAPI
import api.EquipmentSlot
import core.game.container.Container import core.game.container.Container
import core.game.container.impl.EquipmentContainer import core.game.container.impl.EquipmentContainer
import core.game.content.quest.tutorials.tutorialisland.TutorialSession import core.game.content.quest.tutorials.tutorialisland.TutorialSession
@@ -79,9 +81,9 @@ open class RangeSwingHandler
} }
var hit = 0 var hit = 0
if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) { if (isAccurateImpact(entity, victim, CombatStyle.RANGE)) {
val max = calculateHit(entity, victim, 1.0) val max = calculateHit(entity, victim, 1.0).also { if(entity?.name?.toLowerCase() == "test10") SystemLogger.logInfo("Damage: $it") }
state.maximumHit = max state.maximumHit = max
hit = RandomFunction.random(max) hit = RandomFunction.random(max + 1)
} }
state.estimatedHit = hit state.estimatedHit = hit
if (state.weapon.type == WeaponType.DOUBLE_SHOT) { if (state.weapon.type == WeaponType.DOUBLE_SHOT) {
@@ -239,32 +241,16 @@ open class RangeSwingHandler
} }
override fun calculateAccuracy(entity: Entity?): Int { override fun calculateAccuracy(entity: Entity?): Int {
val baseLevel = entity!!.skills.getStaticLevel(Skills.RANGE) entity ?: return 0
var weaponRequirement = baseLevel var effectiveRangedLevel = entity.skills.getLevel(Skills.RANGE).toDouble()
if (entity is Player) { if(entity is Player) effectiveRangedLevel = floor(effectiveRangedLevel + (entity.prayer.getSkillBonus(Skills.RANGE) * effectiveRangedLevel))
val weapon = entity.equipment[3] if(entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) effectiveRangedLevel += 3
weaponRequirement = weapon?.definition?.getRequirement(Skills.RANGE) ?: 1 effectiveRangedLevel += 8
} if(entity is Player && entity.isWearingVoid(false)) effectiveRangedLevel *= 1.1
var weaponBonus = 0.0 effectiveRangedLevel = floor(effectiveRangedLevel)
if (baseLevel > weaponRequirement) { effectiveRangedLevel *= (entity.properties.bonuses[entity.properties.attackStyle.bonusType] + 64)
weaponBonus = (baseLevel - weaponRequirement) * .3
} return floor(effectiveRangedLevel).toInt()
val level = entity.skills.getLevel(Skills.RANGE)
var prayer = 1.0
if (entity is Player) {
prayer += entity.prayer.getSkillBonus(Skills.RANGE)
}
var additional = 1.0 // Slayer helmet/salve/...
if(entity is Player && rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks.isActive(rs09.game.node.entity.skill.skillcapeperks.SkillcapePerks.ACCURATE_MARKSMAN,entity.asPlayer())){
additional += 0.5
}
var styleBonus = 0
if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) {
styleBonus = 3
}
val effective = floor(level * prayer * additional + styleBonus + weaponBonus)
val bonus = entity.properties.bonuses[WeaponInterface.BONUS_RANGE]
return floor((effective + 8) * (bonus + 64) / 10).toInt()
} }
override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int { override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int {
@@ -277,30 +263,20 @@ open class RangeSwingHandler
var cumulativeStr = floor(level * prayer) var cumulativeStr = floor(level * prayer)
if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) { if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) {
cumulativeStr += 3.0 cumulativeStr += 3.0
} else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) {
cumulativeStr += 1.0
} }
cumulativeStr *= getSetMultiplier(entity, Skills.RANGE) cumulativeStr *= getSetMultiplier(entity, Skills.RANGE)
return (1.3 + (cumulativeStr / 10) + (bonus / 80) + ((cumulativeStr * bonus) / 640)).toInt() cumulativeStr *= (bonus + 64)
return floor(1.5 + (ceil(cumulativeStr) / 640.0)).toInt()
//return ((14 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier).toInt() / 10 + 1 //return ((14 + cumulativeStr + bonus / 8 + cumulativeStr * bonus * 0.016865) * modifier).toInt() / 10 + 1
} }
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
val style = entity!!.properties.attackStyle victim ?: return 0
var styleBonus = 0 attacker ?: return 0
if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) {
styleBonus = 3 val defLevel = victim.skills.getLevel(Skills.DEFENCE)
} else if (style.style == WeaponInterface.STYLE_CONTROLLED) { val styleDefenceBonus = victim.properties.bonuses[attacker.properties.attackStyle.bonusType + 5] + 64
styleBonus = 1 return defLevel * styleDefenceBonus
}
val level = entity.skills.getLevel(Skills.DEFENCE)
var prayer = 1.0
if (entity is Player) {
prayer += entity.prayer.getSkillBonus(Skills.DEFENCE)
}
val effective = floor(level * prayer + styleBonus)
val equipment = entity.properties.bonuses[WeaponInterface.BONUS_RANGE + 5]
return floor((effective + 8) * (equipment + 64) / 10).toInt()
} }
override fun getSetMultiplier(e: Entity?, skillId: Int): Double { override fun getSetMultiplier(e: Entity?, skillId: Int): Double {
@@ -58,8 +58,8 @@ class SalamanderSwingHandler(private var style: CombatStyle) : CombatSwingHandle
} }
} }
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int { override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
return style.swingHandler.calculateDefence(entity, attacker) return style.swingHandler.calculateDefence(victim, attacker)
} }
override fun getSetMultiplier(e: Entity?, skillId: Int): Double { override fun getSetMultiplier(e: Entity?, skillId: Int): Double {