diff --git a/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c index fafb01571..87559d301 100644 --- a/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c +++ b/addons/medical_core/scripts/Game/ACE_Medical_Pain/Components/Damage/SCR_CharacterDamageManagerComponent.c @@ -2,9 +2,15 @@ modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent { protected ACE_Medical_PainHitZone m_ACE_Medical_PainHitZone; - + [RplProp(condition: RplCondition.OwnerOnly)] protected float m_fACE_Medical_PainSuppression = 0; + + [Attribute(defvalue: "0.25", uiwidget: UIWidgets.Slider, desc: "Percentage of armor damage that gets converted to pain", params: "0 1 0.01")] + protected float m_fACE_Medical_ArmorPainMultiplier; + + [Attribute(defvalue: "10", uiwidget: UIWidgets.Slider, desc: "Minimum armor damage required to cause pain", params: "0 50 1")] + protected float m_fACE_Medical_ArmorPainThreshold; //----------------------------------------------------------------------------------------------------------- //! Called by ACE_Medical_PainHitZone.OnInit to initialize the hit zone @@ -59,4 +65,34 @@ modded class SCR_CharacterDamageManagerComponent : SCR_DamageManagerComponent { return m_fACE_Medical_PainSuppression; } + + //------------------------------------------------------------------------------------------------ + //! Add pain when armor blocks damage + //! Behavior: + //! - Small impacts below threshold are ignored + //! - First significant impact sets character to moderate pain state + any additional pain from impact + //! - Subsequent hits when already beyond moderate don't add more pain + override void ArmorHitEventDamage(EDamageType type, float damage, IEntity instigator) + { + super.ArmorHitEventDamage(type, damage, instigator); + + if (!m_ACE_Medical_PainHitZone) + return; + + if (damage < m_fACE_Medical_ArmorPainThreshold) + return; + + if (ACE_Medical_IsInPain()) + return; + + float moderateThreshold = m_ACE_Medical_PainHitZone.GetDamageStateThreshold(ECharacterHealthState.MODERATE); + float currentHealth = m_ACE_Medical_PainHitZone.GetHealthScaled(); + float damageToReachModerate = (currentHealth - moderateThreshold) * m_ACE_Medical_PainHitZone.GetMaxHealth(); + + float additionalPainDamage = damage * m_fACE_Medical_ArmorPainMultiplier; + + float totalPainDamage = damageToReachModerate + additionalPainDamage; + + m_ACE_Medical_PainHitZone.HandleDamage(totalPainDamage, EDamageType.TRUE, instigator); + } }