Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_PhysicalHitZonesRegenDamageEffect.c
Go to the documentation of this file.
2{
3 protected float m_fDelayTimer = 0;
4 protected float m_fLocalRegenDelayTime;
5 protected float m_fDurationPerHitZone;
6 protected float m_fAccurateTimeSlice;
7 protected ref array<SCR_RegeneratingHitZone> m_aHitZonesToRegen = {};
8
9 //ALWAYS OVERRIDE LIKE THIS. ALWAYS OVERRIDE THIS FUNCTION
10 protected override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator)
11 {
12 super.HandleConsequences(dmgManager, evaluator);
13
14 evaluator.HandleEffectConsequences(this, dmgManager);
15 }
16
17 //------------------------------------------------------------------------------------------------
18 override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager)
19 {
20 super.OnEffectAdded(dmgManager);
22 if (!characterDmgManager)
23 return;
24
25 if (characterDmgManager.s_HealthSettings && !GetSkipRegenDelay(dmgManager))
26 m_fLocalRegenDelayTime = characterDmgManager.s_HealthSettings.GetRegenerationDelay();
27 }
28
29 //------------------------------------------------------------------------------------------------
30 protected override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager)
31 {
32 m_fDelayTimer += timeSlice;
34 return;
35
36 if (m_aHitZonesToRegen.IsEmpty())
37 {
38 dmgManager.TerminateDamageEffect(this);
39 return;
40 }
41
42 m_fAccurateTimeSlice = GetAccurateTimeSlice(timeSlice);
44
45 array<SCR_RegeneratingHitZone> hitZonesToRemove = {};
47
48 DotDamageEffectTimerToken token = UpdateTimer(m_fAccurateTimeSlice, dmgManager);
49
50 for (int i = m_aHitZonesToRegen.Count() - 1; i > -1; i--)
51 {
52 hitZone = m_aHitZonesToRegen[i];
53 if (hitZone.GetDamageState() == EDamageState.UNDAMAGED)
54 {
55 m_aHitZonesToRegen.Remove(i);
56 continue;
57 }
58
59 DealCustomDot(hitZone, -hitZone.CalculatePassiveRegenDPS() * m_fAccurateTimeSlice, token, dmgManager);
60 }
61
62 //everything is fully healed
63 if (m_aHitZonesToRegen.IsEmpty())
64 dmgManager.TerminateDamageEffect(this);
65 }
66
67 //------------------------------------------------------------------------------------------------
68 event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager)
69 {
71
72 array<ref SCR_PersistentDamageEffect> bleedings = characterDmgManager.GetAllPersistentEffectsOfType(SCR_BleedingDamageEffect);
73 if (!bleedings.IsEmpty())
74 return true;
75
76 array<ref SCR_PersistentDamageEffect> poisons = characterDmgManager.GetAllPersistentEffectsOfType(SCR_PoisonDamageEffect);
77 if (!poisons.IsEmpty())
78 return true;
79
80 array<ref SCR_PersistentDamageEffect> persistentEffects = {};
81 characterDmgManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_PhysicalHitZonesRegenDamageEffect, characterDmgManager.GetDefaultHitZone(), persistentEffects);
82
83 //if the effect is already present on the hitzone, we dont add a second one.
84 if (!persistentEffects.IsEmpty())
85 {
87
88 // if regen already exists but owner got regen added again, reset hitZonesToHeal
89 SetHitZonesToHeal(characterDmgManager);
90 actualEffect.m_fDelayTimer = 0;
91 return true;
92 }
93
94 // if no regen is present yet, add all physical hitzones to the HitZonesToHeal
95 SetHitZonesToHeal(characterDmgManager, false);
96
97 return false;
98 }
99
100 //------------------------------------------------------------------------------------------------
101 protected void SetHitZonesToHeal(SCR_CharacterDamageManagerComponent characterDmgManager, bool clearHealedHZs = true)
102 {
103 m_aHitZonesToRegen.Clear();
104
105 array<SCR_RegeneratingHitZone> hitZonesToAdd = {};
106 characterDmgManager.GetRegeneratingHitZones(hitZonesToAdd);
107
108 hitZonesToAdd.RemoveItem(characterDmgManager.GetBloodHitZone());
109 hitZonesToAdd.RemoveItem(characterDmgManager.GetResilienceHitZone());
110
111 foreach (SCR_RegeneratingHitZone hitZone : hitZonesToAdd)
112 {
113 if (clearHealedHZs && hitZone.GetDamageState() == EDamageState.UNDAMAGED)
114 continue;
115
116 m_aHitZonesToRegen.Insert(hitZone);
117 }
118 }
119
120 //------------------------------------------------------------------------------------------------
122 {
124 }
125
126 //------------------------------------------------------------------------------------------------
127 override bool GetSkipRegenDelay(SCR_ExtendedDamageManagerComponent dmgManager)
128 {
130 if (characterDmgManager && characterDmgManager.s_HealthSettings)
131 m_fLocalRegenDelayTime = characterDmgManager.s_HealthSettings.GetRegenerationDelay();
132
133 return super.GetSkipRegenDelay(dmgManager);
134 }
135}
void SetHitZonesToHeal(SCR_CharacterDamageManagerComponent characterDmgManager, bool clearHealedHZs=true)
override bool GetSkipRegenDelay(SCR_ExtendedDamageManagerComponent dmgManager)
event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager)
ref array< SCR_RegeneratingHitZone > m_aHitZonesToRegen
override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator)
override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager)
override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager)
float CalculatePassiveRegenDPS(bool considerRegenScale=true)
EDamageState