mirror of
https://gitlab.com/2009scape/2009scape.git
synced 2025-12-21 09:02:07 -07:00
Fixed accuracy calculations.
This commit is contained in:
parent
c925c31f66
commit
1cd0371367
17 changed files with 72 additions and 87 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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") }
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue