diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java index ba97fef05..7c938adb5 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDGraardorSwingHandler.java @@ -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 diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java index 01d6de51b..bd338d83d 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDKreeArraSwingHandler.java @@ -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 diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java index a21b634db..0281420b2 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDTsutsarothSwingHandler.java @@ -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 diff --git a/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java b/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java index 03e692898..27fad1d87 100644 --- a/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java +++ b/Server/src/main/java/core/game/content/activity/gwd/GWDZilyanaSwingHandler.java @@ -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 diff --git a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java index 262367320..bef277451 100644 --- a/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java +++ b/Server/src/main/java/core/game/content/activity/tzhaar/TzhaarFightCaveNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java index 631cc6f60..e5e7ad0cf 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/ElvargNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java b/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java index 1fd06c5f2..cd1d91d91 100644 --- a/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java +++ b/Server/src/main/java/core/game/content/quest/free/dragonslayer/MeldarMadNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java b/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java index 40340c0f2..6ac038ad2 100644 --- a/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java +++ b/Server/src/main/java/core/game/node/entity/combat/handlers/DragonfireSwingHandler.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java index 2e69bbd77..e94be4859 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/KalphiteQueenNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java index 41142075a..702399b7a 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/TormentedDemonNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java index c594c54cf..b69cce4ef 100644 --- a/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java +++ b/Server/src/main/java/core/game/node/entity/npc/bosses/wilderness/KingBlackDragonNPC.java @@ -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 diff --git a/Server/src/main/java/core/game/node/entity/player/Player.java b/Server/src/main/java/core/game/node/entity/player/Player.java index 242f61bfb..d514da282 100644 --- a/Server/src/main/java/core/game/node/entity/player/Player.java +++ b/Server/src/main/java/core/game/node/entity/player/Player.java @@ -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. diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt index 146453e8d..47c826c04 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/CombatSwingHandler.kt @@ -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") } } /** diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt index 84455411b..b043c359c 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MagicSwingHandler.kt @@ -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() } diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt index ff7220475..55be23dd5 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/MultiSwingHandler.kt @@ -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 { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt index e484a200a..4654597d9 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/RangeSwingHandler.kt @@ -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 { diff --git a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt index fd8514c59..6c9a676f3 100644 --- a/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt +++ b/Server/src/main/kotlin/rs09/game/node/entity/combat/handlers/SalamanderSwingHandler.kt @@ -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 {