Fixed accuracy calculations.
This commit is contained in:
@@ -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
|
||||||
|
|||||||
+2
-2
@@ -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
|
||||||
|
|||||||
+3
-3
@@ -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 {
|
||||||
|
|||||||
+2
-2
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user