Fixed accuracy calculations.

This commit is contained in:
ceikry 2021-07-23 14:36:17 -05:00
parent c925c31f66
commit 1cd0371367
17 changed files with 72 additions and 87 deletions

View file

@ -159,8 +159,8 @@ public final class GWDGraardorSwingHandler extends CombatSwingHandler {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -192,8 +192,8 @@ public final class GWDKreeArraSwingHandler extends CombatSwingHandler {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -143,8 +143,8 @@ public final class GWDTsutsarothSwingHandler extends CombatSwingHandler {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -121,8 +121,8 @@ public class GWDZilyanaSwingHandler extends CombatSwingHandler {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return getType().getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return getType().getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -332,8 +332,8 @@ public final class TzhaarFightCaveNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -216,8 +216,8 @@ public final class ElvargNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -169,8 +169,8 @@ public final class MeldarMadNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -208,8 +208,8 @@ public class DragonfireSwingHandler extends CombatSwingHandler {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return CombatStyle.MAGIC.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return CombatStyle.MAGIC.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -296,8 +296,8 @@ public final class KalphiteQueenNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -315,8 +315,8 @@ public class TormentedDemonNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
return style.getSwingHandler().calculateDefence(entity, attacker);
public int calculateDefence(Entity victim, Entity attacker) {
return style.getSwingHandler().calculateDefence(victim, attacker);
}
@Override

View file

@ -143,11 +143,11 @@ public final class KingBlackDragonNPC extends AbstractNPC {
}
@Override
public int calculateDefence(Entity entity, Entity attacker) {
public int calculateDefence(Entity victim, Entity attacker) {
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

View file

@ -1,5 +1,6 @@
package core.game.node.entity.player;
import api.ContentAPI;
import core.game.component.Component;
import core.game.container.Container;
import core.game.container.impl.BankContainer;
@ -70,6 +71,7 @@ import core.tools.RandomFunction;
import core.tools.StringUtils;
import kotlin.Unit;
import kotlin.jvm.functions.Function1;
import org.rs09.consts.Items;
import rs09.ServerConstants;
import rs09.game.VarpManager;
import rs09.game.content.ame.RandomEventManager;
@ -755,6 +757,14 @@ public class Player extends Entity {
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.
* @param login If the player is logging in.

View file

@ -77,11 +77,11 @@ abstract class CombatSwingHandler(var type: CombatStyle?) {
/**
* Calculates the maximum defence of the entity.
* @param entity The entity.
* @param victim The entity.
* @param attacker The entity to defend against.
* @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.
@ -188,18 +188,17 @@ abstract class CombatSwingHandler(var type: CombatStyle?) {
}
val attack = calculateAccuracy(entity) * accuracyMod * mod * getSetMultiplier(entity, Skills.ATTACK)
val defence = calculateDefence(victim, entity) * defenceMod * getSetMultiplier(victim, Skills.DEFENCE)
val chance: Double
chance = if (attack < defence) {
(attack - 1) / (defence * 2)
val chance: Double = if (attack < defence) {
1 - ((defence + 2) / ((2 * attack) + 1))
} else {
1 - (defence + 1) / (attack * 2)
attack / ((2 * defence) + 1)
}
val ratio = chance * 100
val accuracy = floor(ratio)
val block = floor(101 - ratio)
val acc = Math.random() * accuracy
val def = Math.random() * block
return acc > def
return (acc > def).also { if(entity?.username?.toLowerCase() == "test10") SystemLogger.logInfo("Should hit: $it") }
}
/**

View file

@ -202,14 +202,14 @@ open class MagicSwingHandler
return (baseDamage * levelMod).toInt() + 1
}
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int {
val level = entity!!.skills.getLevel(Skills.DEFENCE, true)
override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
val level = victim!!.skills.getLevel(Skills.DEFENCE, true)
var prayer = 1.0
if (entity is Player) {
prayer += entity.prayer.getSkillBonus(Skills.MAGIC)
if (victim is Player) {
prayer += victim.prayer.getSkillBonus(Skills.MAGIC)
}
val effective = floor(level * prayer * 0.3) + entity.skills.getLevel(Skills.MAGIC, true) * 0.7
val equipment = entity.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5]
val effective = floor(level * prayer * 0.3) + victim.skills.getLevel(Skills.MAGIC, true) * 0.7
val equipment = victim.properties.bonuses[WeaponInterface.BONUS_MAGIC + 5]
return floor((effective + 8) * (equipment + 64) / 10).toInt()
}

View file

@ -139,8 +139,8 @@ open class MultiSwingHandler(meleeDistance: Boolean, vararg attacks: SwitchAttac
} else current.handler.calculateHit(entity, victim, modifier)
}
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int {
return current.handler.calculateDefence(entity, attacker)
override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
return current.handler.calculateDefence(victim, attacker)
}
override fun getSetMultiplier(e: Entity?, skillId: Int): Double {

View file

@ -1,5 +1,7 @@
package rs09.game.node.entity.combat.handlers
import api.ContentAPI
import api.EquipmentSlot
import core.game.container.Container
import core.game.container.impl.EquipmentContainer
import core.game.content.quest.tutorials.tutorialisland.TutorialSession
@ -79,9 +81,9 @@ open class RangeSwingHandler
}
var hit = 0
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
hit = RandomFunction.random(max)
hit = RandomFunction.random(max + 1)
}
state.estimatedHit = hit
if (state.weapon.type == WeaponType.DOUBLE_SHOT) {
@ -239,32 +241,16 @@ open class RangeSwingHandler
}
override fun calculateAccuracy(entity: Entity?): Int {
val baseLevel = entity!!.skills.getStaticLevel(Skills.RANGE)
var weaponRequirement = baseLevel
if (entity is Player) {
val weapon = entity.equipment[3]
weaponRequirement = weapon?.definition?.getRequirement(Skills.RANGE) ?: 1
}
var weaponBonus = 0.0
if (baseLevel > weaponRequirement) {
weaponBonus = (baseLevel - weaponRequirement) * .3
}
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()
entity ?: return 0
var effectiveRangedLevel = entity.skills.getLevel(Skills.RANGE).toDouble()
if(entity is Player) effectiveRangedLevel = floor(effectiveRangedLevel + (entity.prayer.getSkillBonus(Skills.RANGE) * effectiveRangedLevel))
if(entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) effectiveRangedLevel += 3
effectiveRangedLevel += 8
if(entity is Player && entity.isWearingVoid(false)) effectiveRangedLevel *= 1.1
effectiveRangedLevel = floor(effectiveRangedLevel)
effectiveRangedLevel *= (entity.properties.bonuses[entity.properties.attackStyle.bonusType] + 64)
return floor(effectiveRangedLevel).toInt()
}
override fun calculateHit(entity: Entity?, victim: Entity?, modifier: Double): Int {
@ -277,30 +263,20 @@ open class RangeSwingHandler
var cumulativeStr = floor(level * prayer)
if (entity.properties.attackStyle.style == WeaponInterface.STYLE_RANGE_ACCURATE) {
cumulativeStr += 3.0
} else if (entity.properties.attackStyle.style == WeaponInterface.STYLE_LONG_RANGE) {
cumulativeStr += 1.0
}
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
}
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int {
val style = entity!!.properties.attackStyle
var styleBonus = 0
if (style.style == WeaponInterface.STYLE_DEFENSIVE || style.style == WeaponInterface.STYLE_LONG_RANGE) {
styleBonus = 3
} else if (style.style == WeaponInterface.STYLE_CONTROLLED) {
styleBonus = 1
}
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 calculateDefence(victim: Entity?, attacker: Entity?): Int {
victim ?: return 0
attacker ?: return 0
val defLevel = victim.skills.getLevel(Skills.DEFENCE)
val styleDefenceBonus = victim.properties.bonuses[attacker.properties.attackStyle.bonusType + 5] + 64
return defLevel * styleDefenceBonus
}
override fun getSetMultiplier(e: Entity?, skillId: Int): Double {

View file

@ -58,8 +58,8 @@ class SalamanderSwingHandler(private var style: CombatStyle) : CombatSwingHandle
}
}
override fun calculateDefence(entity: Entity?, attacker: Entity?): Int {
return style.swingHandler.calculateDefence(entity, attacker)
override fun calculateDefence(victim: Entity?, attacker: Entity?): Int {
return style.swingHandler.calculateDefence(victim, attacker)
}
override fun getSetMultiplier(e: Entity?, skillId: Int): Double {