51class SCR_BleedingHitZoneParameters : Managed
53 void SCR_BleedingHitZoneParameters(
59 m_fDamageOverTime = DamageOverTime;
62 float m_fDamageOverTime;
68 [
Attribute(defvalue:
"200",
desc:
"Time required to fully regenerate this hit zone\n[s]")]
83 if (considerRegenScale)
88 if (SCR_CharacterResilienceHitZone.Cast(
this))
102 array<ref SCR_PersistentDamageEffect> effects = {};
107 if (damageMgr == null)
110 damageMgr.FindDamageEffectsOnHitZone(
this, effects);
113 if (targetDamageType ==
EDamageType.REGENERATION && SCR_CharacterHitZone.Cast(
this))
116 if (!persistentEffects.IsEmpty())
127 if (SCR_CharacterHitZone.Cast(
this) && targetDamageType ==
EDamageType.HEALING)
128 damageMgr.FindDamageEffectsOnHitZone(damageMgr.GetDefaultHitZone(), effects);
133 if (dotEffect && dotEffect.GetDamageType() == targetDamageType)
134 dot += dotEffect.GetDPS();
154 if (SCR_CharacterHitZone.Cast(
this))
174 [
Attribute(
"0.65",
UIWidgets.Auto,
"Multiplier of hitzone health that will be applied as bleeding damage over time when damaged")]
197 super.OnInit(pOwnerEntity, pManagerComponent);
206 super.OnDamage(damageContext);
208 if (
this != damageContext.struckHitZone)
218 manager.
SoundHit(critical, damageContext.damageType);
234 return super.ComputeEffectiveDamage(damageContext, isDOT);
237 float damage = damageContext.damageValue * GetBaseDamageMultiplier();
243 float damageScale = ((damage - protectionValue) / damage);
244 damageScale =
Math.Max(damageScale, 0);
246 hack.damageValue *= damageScale;
249 return super.ComputeEffectiveDamage(hack, isDOT);
267 CharacterIdentityComponent identity = CharacterIdentityComponent.Cast(
GetOwner().FindComponent(CharacterIdentityComponent));
273 if (identity.IsCovered(submesh))
283 super.OnDamageStateChanged(newState, previousDamageState, isJIP);
297 CharacterIdentityComponent identity = CharacterIdentityComponent.Cast(
GetOwner().FindComponent(CharacterIdentityComponent));
302 identity.SetWoundState(submesh, wounded);
313 isWounded = GetDamageStateThreshold(GetDamageState()) <= GetDamageStateThreshold(
ECharacterDamageState.WOUNDED);
384 super.OnDamage(damageContext);
387 if (!characterDmgManager)
391 array<ref SCR_PersistentDamageEffect> effects = {};
392 characterDmgManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_PassiveHitZoneRegenDamageEffect,
this, effects);
393 foreach (SCR_PersistentDamageEffect effect : effects)
404 super.OnDamageStateChanged(newState, previousDamageState, isJIP);
418 override void OnInit(
IEntity pOwnerEntity, GenericComponent pManagerComponent)
420 super.OnInit(pOwnerEntity, pManagerComponent);
421 SCR_CharacterDamageManagerComponent characterDamageManager = SCR_CharacterDamageManagerComponent.Cast(pManagerComponent);
422 if (characterDamageManager)
432 ref array<float> m_aHitZoneGroupBleedings;
437 super.OnDamageStateChanged(newState, previousDamageState, isJIP);
453 super.OnInit(pOwnerEntity, pManagerComponent);
461 float GetTotalBleedingAmount()
465 SCR_ExtendedDamageManagerComponent extendedDmgManager = SCR_ExtendedDamageManagerComponent.Cast(GetHitZoneContainer());
466 if (!extendedDmgManager)
470 array<ref SCR_PersistentDamageEffect> bleedingEffects = extendedDmgManager.GetAllPersistentEffectsOfType(
SCR_BleedingDamageEffect);
477 dps += dotEffect.GetDPS();
487 if (!m_mHitZoneDOTMap)
490 if (m_mHitZoneDOTMap.Contains(hitZone))
492 m_mHitZoneDOTMap.Set(hitZone, localBleedingHZParams);
496 return m_mHitZoneDOTMap.Insert(hitZone, localBleedingHZParams);
500 void RemoveBleedingHZFromMap(SCR_CharacterHitZone hitZone)
502 if (!m_mHitZoneDOTMap)
505 m_mHitZoneDOTMap.Remove(hitZone);
507 if (m_mHitZoneDOTMap.IsEmpty())
508 m_mHitZoneDOTMap = null;
514 return m_mHitZoneDOTMap;
525 super.OnInit(pOwnerEntity, pManagerComponent);
535 super.OnDamageStateChanged(newState, previousDamageState, isJIP);
ArmaReforgerScripted GetGame()
float m_fBleedingRateScale
SCR_RegeneratingHitZone DAMAGE_TO_BLOOD_MULTIPLIER
SCR_CharacterBloodHitZone OnDamage
Resilience - incapacitation or death, depending on game mode settings.
EBandagingAnimationBodyParts
void UpdateConsciousness()
void UpdateSubmeshes()
Manage wounds submeshes.
void SetWoundedSubmesh(bool wounded)
EBandagingAnimationBodyParts m_eBandageAnimationBodyPart
float GetMaxBleedingRate()
array< ref LoadoutAreaType > GetBleedingAreas()
float GetArmorProtectionValue(EDamageType damageType)
Get strength of protection from armor attribute on prefab of clothing item.
ref array< string > m_aDamageSubmeshes
bool IsCovered()
Whether hitzone submeshes are hidden with clothing.
float GetCriticalHealthThreshold()
ECharacterResilienceState
SCR_EForcedWoundedSubmesh
ref array< ref LoadoutAreaType > m_aBleedingAreas
EBandagingAnimationBodyParts GetBodyPartToHeal()
override float ComputeEffectiveDamage(notnull BaseDamageContext damageContext, bool isDOT)
SCR_EForcedWoundedSubmesh m_eForcedWoundedSubmesh
ECharacterHitZoneGroup m_eHitZoneGroup
float GetDamageMultiplier(EDamageType type)
override void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP)
override EHitZoneGroup GetHitZoneGroup()
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
enum EVehicleType IEntity
Blood - does not receive damage directly, only via scripted events.
void UpdateConsciousness()
void SetResilienceHitZone(HitZone hitZone)
void SetBloodHitZone(HitZone hitZone)
static SCR_GameModeHealthSettings s_HealthSettings
void RegenVirtualHitZone(SCR_RegeneratingHitZone targetHitZone, float dps=-1, bool skipRegenDelay=false)
float GetArmorProtection(notnull SCR_CharacterHitZone charHitZone, EDamageType damageType)
Get protection value of particular hitZone stored on m_mClothItemDataMap.
void RegenPhysicalHitZones(bool skipRegenDelay=false)
void SoundHit(bool critical, EDamageType damageType)
void UpdateCharacterGroupDamage(ECharacterHitZoneGroup hitZoneGroup)
void SetHeadHitZone(HitZone hitZone)
void SoundKnockout()
Tell m_CommunicationSound to stop character from screaming, otherwise ignore.
void AddBloodToClothes(notnull SCR_CharacterHitZone hitZone, float immediateBloodEffect)
health hitzone - Receives damage from physical hitzones
void OnDamageStateChanged(EDamageState newState, EDamageState previousDamageState, bool isJIP)
Called when the damage state changes.
float CalculatePassiveRegenDPS(bool considerRegenScale=true)
override void OnHealthSet()
HealthSet could have decreased health, so passive regeneration is planned.
void ToggleHitZoneAutoRegenOnHealthSet(bool doRegen)
float m_fFullRegenerationTime
float GetHitZoneDamageOverTime(EDamageType targetDamageType)
Get current total damage per second of this hitZone.
bool m_bAutoRegenOnHealthSet
IEntity GetOwner()
Owner entity of the fuel tank.
SCR_FieldOfViewSettings Attribute
@ DISABLED
General event switch.