Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_CharacterDamageManagerEvaluator.c
Go to the documentation of this file.
2{
3
4 //------------------------------------------------------------------------------------------------
5 override void HandleEffectConsequences(SCR_BaseBulletDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
6 {
7 super.HandleEffectConsequences(effect, dmgManager);
8
9 CriticalThresholdTryCauseBleeding(effect, dmgManager);
10 }
11
12 //------------------------------------------------------------------------------------------------
13 override void HandleEffectConsequences(SCR_CollisionDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
14 {
15 super.HandleEffectConsequences(effect, dmgManager);
16
17 CriticalThresholdTryCauseBleeding(effect, dmgManager);
18 }
19
20 //------------------------------------------------------------------------------------------------
21 override void HandleEffectConsequences(SCR_FragmentationDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
22 {
23 super.HandleEffectConsequences(effect, dmgManager);
24
25 CriticalThresholdTryCauseBleeding(effect, dmgManager);
26 }
27
28 //------------------------------------------------------------------------------------------------
29 override void HandleEffectConsequences(SCR_MeleeDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
30 {
31 super.HandleEffectConsequences(effect, dmgManager);
32
33 CriticalThresholdTryCauseBleeding(effect, dmgManager);
34 }
35
36 //------------------------------------------------------------------------------------------------
37 override void HandleEffectConsequences(SCR_CriticalExplosionDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
38 {
39 super.HandleEffectConsequences(effect, dmgManager);
40
41 CriticalThresholdTryCauseBleeding(effect, dmgManager);
42 }
43
44 //------------------------------------------------------------------------------------------------
45 override void HandleEffectConsequences(SCR_BarbedWireCuttingDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
46 {
47 super.HandleEffectConsequences(effect, dmgManager);
48
49 SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(effect.GetAffectedHitZone());
50 if (!affectedHitZone)
51 return;
52
53 if (effect.GetBleedingChance() > Math.RandomFloat01())
54 return;
55
56 EffectCauseBleeding(effect, dmgManager);
57 }
58
59 //------------------------------------------------------------------------------------------------
60 override void HandleEffectConsequences(SCR_BandageDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
61 {
63
64 array<HitZone> hitZonesOfGroup = {};
65 damageMgr.GetHitZonesOfGroup(SCR_HitZone.Cast(effect.GetAffectedHitZone()).GetHitZoneGroup(), hitZonesOfGroup);
66
67 array<ref SCR_PersistentDamageEffect> persistentEffects = damageMgr.GetAllPersistentEffectsOfType(SCR_BleedingDamageEffect);
68
69 foreach (SCR_PersistentDamageEffect persistentEffect : persistentEffects)
70 {
71 if (!SCR_BleedingDamageEffect.Cast(persistentEffect))
72 continue;
73
74 foreach (HitZone hz : hitZonesOfGroup)
75 {
76 if (persistentEffect.GetAffectedHitZone() == hz)
77 {
78 damageMgr.TerminateDamageEffect(persistentEffect);
79 break;
80 }
81 }
82 }
83 }
84
85 //------------------------------------------------------------------------------------------------
86 override void HandleEffectConsequences(SCR_BaseBlastDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
87 {
88 super.HandleEffectConsequences(effect, dmgManager);
89
90 if (effect.GetResilienceDamageValueMultiplier() == 0)
91 return;
92
94 if (!characterDmgMgr)
95 return;
96
97 SCR_CharacterResilienceHitZone resilienceHZ = characterDmgMgr.GetResilienceHitZone();
98 if (!resilienceHZ)
99 return;
100
101 vector hitPosDirNorm[3];
103 effect.GetDamageType(),
104 effect.GetTotalDamage() * effect.GetResilienceDamageValueMultiplier(),
105 hitPosDirNorm,
106 characterDmgMgr.GetOwner(),
107 resilienceHZ,
108 effect.GetInstigator(),
109 null,
110 -1,
111 -1);
112
113 context.damageEffect = new SCR_ConcussionDamageEffect();
114 characterDmgMgr.HandleDamage(context);
115 }
116
117 //-----------------------------------------------------------------------------------------------------------
121 private void EffectCauseBleeding(SCR_InstantDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
122 {
123 SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(effect.GetAffectedHitZone());
124 if (!affectedHitZone)
125 return;
126
128 if (!damageMgr)
129 return;
130
131 damageMgr.AddBleedingEffectOnHitZone(affectedHitZone);
132 }
133
134 //-----------------------------------------------------------------------------------------------------------
138 private void CriticalThresholdTryCauseBleeding(SCR_InstantDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
139 {
140 SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(effect.GetAffectedHitZone());
141 if (!affectedHitZone)
142 return;
143
144 vector hitPosDirNorm[3];
146 effect.GetDamageType(),
147 effect.GetTotalDamage(),
148 hitPosDirNorm,
149 dmgManager.GetOwner(),
150 affectedHitZone,
151 effect.GetInstigator(),
152 null,
153 -1,
154 -1);
155
156 float var = affectedHitZone.ComputeEffectiveDamage(context, false);
157 if (var < affectedHitZone.GetCriticalHealthThreshold())
158 return;
159
160 EffectCauseBleeding(effect, dmgManager);
161 }
162
163 //------------------------------------------------------------------------------------------------
164 override void HandleEffectConsequences(SCR_PersistentBarbedWireDamageEffect effect, ExtendedDamageManagerComponent dmgManager)
165 {
166 if (!effect)
167 return;
168
170 if (!damageMgr)
171 return;
172
173 SCR_BarbedWireCuttingDamageEffect consequence = effect.GetResultingEffect();
174 if (!consequence)
175 return;
176
177 SCR_CharacterHitZone hitZone = damageMgr.GetRandomPhysicalHitZone();
178 if (!hitZone)
179 return;
180
181 // Normalize damage across hitZone types
182 float damage = hitZone.GetMaxHealth() * 0.01 * consequence.GetDamageMultiplier();
183
184 vector hitPosDirNorm[3];
185 SCR_DamageContext context = new SCR_DamageContext(EDamageType.MELEE, damage, hitPosDirNorm, dmgManager.GetOwner(), hitZone, Instigator.CreateInstigator(dmgManager.GetOwner()), null, -1, -1);
186
187 context.damageEffect = consequence;
188
189 dmgManager.HandleDamage(context);
190 }
191}
Definition Math.c:13
SCR_CharacterHitZone GetRandomPhysicalHitZone(bool includeBleedingHZs=false)
Get a random physical hitZone.
void AddBleedingEffectOnHitZone(notnull SCR_CharacterHitZone hitZone, int colliderDescriptorIndex=-1)
EHitZoneGroup GetHitZoneGroup()
Definition SCR_HitZone.c:12
EDamageType
Definition EDamageType.c:13