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..988e316f43 100644
--- a/Source/ACE.Server/WorldObjects/Player_Combat.cs
+++ b/Source/ACE.Server/WorldObjects/Player_Combat.cs
@@ -612,27 +612,27 @@ 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 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;
}
///