Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}
}