From 8669a96c1f463b145308075a4a8d79c46c5706c6 Mon Sep 17 00:00:00 2001 From: gmriggs Date: Sat, 11 Jul 2020 19:45:09 -0400 Subject: [PATCH 1/2] fixing 2 issues with recklessness --- Source/ACE.Server/Entity/DamageEvent.cs | 5 ++-- .../WorldObjects/Creature_Combat.cs | 29 ++++++++++++------- .../ACE.Server/WorldObjects/Player_Combat.cs | 16 +++++----- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/Source/ACE.Server/Entity/DamageEvent.cs b/Source/ACE.Server/Entity/DamageEvent.cs index 591cede3ed..c12813419a 100644 --- a/Source/ACE.Server/Entity/DamageEvent.cs +++ b/Source/ACE.Server/Entity/DamageEvent.cs @@ -74,6 +74,7 @@ public class DamageEvent public float DamageRatingBaseMod; public float RecklessnessMod; + public bool SelfReckless; public float SneakAttackMod; public float HeritageMod; @@ -209,7 +210,7 @@ private float DoCalculateDamage(Creature attacker, Creature defender, WorldObjec // ratings DamageRatingBaseMod = Creature.GetPositiveRatingMod(attacker.GetDamageRating()); - RecklessnessMod = Creature.GetRecklessnessMod(attacker, defender); + RecklessnessMod = Creature.GetRecklessnessMod(attacker, defender, out SelfReckless); SneakAttackMod = attacker.GetSneakAttackMod(defender); HeritageMod = attacker.GetHeritageBonus(Weapon) ? 1.05f : 1.0f; @@ -578,7 +579,7 @@ public AttackConditions AttackConditions if (CriticalDefended) attackConditions |= AttackConditions.CriticalProtectionAugmentation; - if (RecklessnessMod > 1.0f) + if (RecklessnessMod > 1.0f && SelfReckless) attackConditions |= AttackConditions.Recklessness; if (SneakAttackMod > 1.0f) attackConditions |= AttackConditions.SneakAttack; diff --git a/Source/ACE.Server/WorldObjects/Creature_Combat.cs b/Source/ACE.Server/WorldObjects/Creature_Combat.cs index 6e3cb0c3bf..3bb1570c44 100644 --- a/Source/ACE.Server/WorldObjects/Creature_Combat.cs +++ b/Source/ACE.Server/WorldObjects/Creature_Combat.cs @@ -719,22 +719,29 @@ public float GetShieldMod(WorldObject attacker, DamageType damageType, WorldObje /// Returns the total applicable Recklessness modifier, /// taking into account both attacker and defender players /// - public static float GetRecklessnessMod(Creature attacker, Creature defender) + public static float GetRecklessnessMod(Creature attacker, Creature defender, out bool selfReckless) { - var playerAttacker = attacker as Player; - var playerDefender = defender as Player; - - var recklessnessMod = 1.0f; - - // multiplicative or additive? + // multiplicative or additive? (probably additive) // defender is a negative Damage Reduction Rating // 20 DR combined with 20 DRR = 1.2 * 0.8333... = 1.0 // 20 DR combined with -20 DRR = 1.2 * 1.2 = 1.44 - if (playerAttacker != null) - recklessnessMod *= playerAttacker.GetRecklessnessMod(); + // should be 1.4 + + var recklessRatingSelf = 0; + var recklessRatingTarget = 0; + + selfReckless = false; + + if (attacker is Player playerAttacker) + { + recklessRatingSelf = playerAttacker.GetRecklessRating(); + selfReckless = recklessRatingSelf > 0; + } + + if (defender is Player playerDefender) + recklessRatingTarget = playerDefender.GetRecklessRating(); - if (playerDefender != null) - recklessnessMod *= playerDefender.GetRecklessnessMod(); + var recklessnessMod = GetPositiveRatingMod(recklessRatingSelf + recklessRatingTarget); return recklessnessMod; } diff --git a/Source/ACE.Server/WorldObjects/Player_Combat.cs b/Source/ACE.Server/WorldObjects/Player_Combat.cs index 17ee888efb..07e1b19fc2 100644 --- a/Source/ACE.Server/WorldObjects/Player_Combat.cs +++ b/Source/ACE.Server/WorldObjects/Player_Combat.cs @@ -615,24 +615,24 @@ public int GetAttackStamina(PowerAccuracy powerAccuracy) /// Returns the damage rating modifier for an applicable Recklessness attack /// /// The 0.0 - 1.0 power/accurary bar - public float GetRecklessnessMod(/*float powerAccuracyBar*/) + public int GetRecklessRating(/*float powerAccuracyBar*/) { // ensure melee or missile combat mode if (CombatMode != CombatMode.Melee && CombatMode != CombatMode.Missile) - return 1.0f; + return 0; var skill = GetCreatureSkill(Skill.Recklessness); // recklessness skill must be either trained or specialized to use if (skill.AdvancementClass < SkillAdvancementClass.Trained) - return 1.0f; + return 0; // recklessness is active when attack bar is between 20% and 80% (according to wiki) // client attack bar range seems to indicate this might have been updated, between 10% and 90%? var powerAccuracyBar = GetPowerAccuracyBar(); //if (powerAccuracyBar < 0.2f || powerAccuracyBar > 0.8f) if (powerAccuracyBar < 0.1f || powerAccuracyBar > 0.9f) - return 1.0f; + return 0; // recklessness only applies to non-critical hits, // which is handled outside of this method. @@ -655,9 +655,11 @@ public float GetRecklessnessMod(/*float powerAccuracyBar*/) // The damage rating adjustment for incoming damage is also adjusted proportinally if your Recklessness skill // is lower than your active attack skill - var recklessnessMod = GetDamageRating(damageRating); // trained DR 1.10 = 10% additional damage - // specialized DR 1.20 = 20% additional damage - return recklessnessMod; + //var recklessnessMod = GetDamageRating(damageRating); // trained DR 1.10 = 10% additional damage + // specialized DR 1.20 = 20% additional damage + + // return as rating here, instead of multiplier, for easier combination + return damageRating; } /// From 3af224b330eb5daaa04c9c0642babd93b0f19c5d Mon Sep 17 00:00:00 2001 From: gmriggs Date: Sat, 11 Jul 2020 21:27:15 -0400 Subject: [PATCH 2/2] update comment --- Source/ACE.Server/WorldObjects/Player_Combat.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source/ACE.Server/WorldObjects/Player_Combat.cs b/Source/ACE.Server/WorldObjects/Player_Combat.cs index 07e1b19fc2..988e316f43 100644 --- a/Source/ACE.Server/WorldObjects/Player_Combat.cs +++ b/Source/ACE.Server/WorldObjects/Player_Combat.cs @@ -612,7 +612,7 @@ public int GetAttackStamina(PowerAccuracy powerAccuracy) } /// - /// Returns the damage rating modifier for an applicable Recklessness attack + /// Returns the damage rating increase for an applicable Recklessness attack /// /// The 0.0 - 1.0 power/accurary bar public int GetRecklessRating(/*float powerAccuracyBar*/)