Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_BleedingDamageEffect.c
Go to the documentation of this file.
2{
3 SCR_CharacterBloodHitZone m_BloodHitZone;
4 int m_iColliderDescriptorIndex = -1;
5
7
8 //------------------------------------------------------------------------------------------------
9 protected override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator)
10 {
11 super.HandleConsequences(dmgManager, evaluator);
12
13 evaluator.HandleEffectConsequences(this, dmgManager);
14 }
15
16 //------------------------------------------------------------------------------------------------
17 override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager)
18 {
19 super.OnEffectAdded(dmgManager);
20
21 dmgManager.TerminateDamageEffectsOfType(SCR_PhysicalHitZonesRegenDamageEffect);
22
23 SCR_CharacterDamageManagerComponent characterDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager);
24 if (!characterDamageManager)
25 return;
26
27 m_BloodHitZone = characterDamageManager.GetBloodHitZone();
28
29 characterDamageManager.CreateBleedingParticleEffect(GetAffectedHitZone(), m_iColliderDescriptorIndex);
30
31 TryAddBleedingToCloth(dmgManager);
32
33 characterDamageManager.AddBleedingToArray(GetAffectedHitZone());
34 }
35
36 //------------------------------------------------------------------------------------------------
37 override void OnEffectRemoved(SCR_ExtendedDamageManagerComponent dmgManager)
38 {
39 super.OnEffectRemoved(dmgManager);
40
41 SCR_CharacterDamageManagerComponent characterDamageManager = SCR_CharacterDamageManagerComponent.Cast(dmgManager);
42 characterDamageManager.RegenPhysicalHitZones();
43
44 HitZone hitZone = GetAffectedHitZone();
45
46 // Don't remove particle effect if there is still a bleeding on the hitZoneGroup
47 SCR_HitZone scriptedHitZone = SCR_HitZone.Cast(hitZone);
48
49 characterDamageManager.RemoveBleedingFromArray(hitZone);
50
51 // the rest of this function removes bleeding particle effects only if no bleeding effects remain on any hitzones in the group
52 array<HitZone> hitZones = {};
53 array<ref SCR_PersistentDamageEffect> effects = {};
54 characterDamageManager.GetHitZonesOfGroup(scriptedHitZone.GetHitZoneGroup(), hitZones);
55
56 //Unsubscribe from SCR_BloodOnClothesSystem if registered
57 if (s_System)
58 s_System.Unregister(this);
59
60 foreach (HitZone groupHitZone : hitZones)
61 {
62 characterDamageManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_BleedingDamageEffect, groupHitZone, effects);
63 if (!effects.IsEmpty())
64 return;
65
66 effects.Clear();
67 }
68
69 characterDamageManager.RemoveBleedingParticleEffect(hitZone);
70 }
71
72 //------------------------------------------------------------------------------------------------
73 protected override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager)
74 {
75 timeSlice = GetAccurateTimeSlice(timeSlice);
77
78 float damageAmount = GetDPS() * timeSlice;
79
80 //Check if bleeding hitzone also has a tourniquet on it
81 SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(GetAffectedHitZone());
82 if (affectedHitZone && characterDmgManager.GetGroupTourniquetted(affectedHitZone.GetHitZoneGroup()))
83 damageAmount *= characterDmgManager.GetTourniquetStrengthMultiplier();
84
85 DotDamageEffectTimerToken token = UpdateTimer(timeSlice, dmgManager);
86 DealCustomDot(m_BloodHitZone, damageAmount, token, dmgManager);
87 }
88
89 //------------------------------------------------------------------------------------------------
90 event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager)
91 {
92 array<ref SCR_PersistentDamageEffect> persistentEffects = {};
93 dmgManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_BleedingDamageEffect, GetAffectedHitZone(), persistentEffects);
94
95 //if the effect is already present on the hitZone, we dont add a second one.
96 if (!persistentEffects.IsEmpty())
97 {
98 SCR_BleedingDamageEffect actualEffect = SCR_BleedingDamageEffect.Cast(persistentEffects[0]);
99
100 actualEffect.SetDPS(actualEffect.CalculateBleedingRate());
101 return true;
102 }
103
104 return false;
105 }
106
107 //------------------------------------------------------------------------------------------------
109 {
110 SCR_CharacterHitZone affectedHitZone = SCR_CharacterHitZone.Cast(GetAffectedHitZone());
111 if (!affectedHitZone)
112 {
113 Print("SCR_BleedingDamageEffect instance without hitZone exists", LogLevel.ERROR);
114 return 0;
115 }
116
117 float hitZoneDamageMultiplier = affectedHitZone.GetHealthScaled();
118 return affectedHitZone.GetMaxBleedingRate() - affectedHitZone.GetMaxBleedingRate() * hitZoneDamageMultiplier;
119 }
120
121 //------------------------------------------------------------------------------------------------
122 protected void TryAddBleedingToCloth(SCR_ExtendedDamageManagerComponent dmgManager)
123 {
124 SCR_CharacterHitZone charHZ = SCR_CharacterHitZone.Cast(GetAffectedHitZone());
125 if (!charHZ)
126 return;
127
128 EquipedLoadoutStorageComponent loadoutStorage = EquipedLoadoutStorageComponent.Cast(dmgManager.GetOwner().FindComponent(EquipedLoadoutStorageComponent));
129 if (!loadoutStorage)
130 return;
131
132 array<ref LoadoutAreaType> bleedingAreas = charHZ.GetBleedingAreas();
133 if (bleedingAreas.IsEmpty())
134 return;
135
136 IEntity clothEntity;
137 ParametricMaterialInstanceComponent materialComponent;
138 foreach (LoadoutAreaType bleedingArea : bleedingAreas)
139 {
140 clothEntity = loadoutStorage.GetClothFromArea(bleedingArea.Type());
141 if (!clothEntity)
142 continue;
143
145 if (!materialComponent)
146 continue;
147
148 World world = GetGame().GetWorld();
150 if (s_System)
151 s_System.Register(this);
152
153 // A damageEffect only needs to be registered once even if more bleedingareas are valid
154 return;
155 }
156 }
157
158 //------------------------------------------------------------------------------------------------
159 override bool Save(ScriptBitWriter w)
160 {
161 super.Save(w);
162
163 w.WriteInt(m_iColliderDescriptorIndex);
164
165 return true;
166 }
167
168 //------------------------------------------------------------------------------------------------
169 override bool Load(ScriptBitReader r)
170 {
171 super.Load(r);
172
173 r.ReadInt(m_iColliderDescriptorIndex);
174 HitZone hz = GetAffectedHitZone();
175 if (!hz)
176 return true;
177
178 SCR_ExtendedDamageManagerComponent dmgManager = SCR_ExtendedDamageManagerComponent.Cast(hz.GetHitZoneContainer());
179 if (dmgManager)
180 OnEffectAdded(dmgManager);
181
182 return true;
183 }
184
185 //------------------------------------------------------------------------------------------------
187 {
188 return EDamageType.BLEEDING;
189 }
190
191 //------------------------------------------------------------------------------------------------
192 override void OnDiag(SCR_ExtendedDamageManagerComponent dmgManager)
193 {
194 super.OnDiag(dmgManager);
195
196 string text;
197 text += text.Format(" ColliderIndex: %1 \n", m_iColliderDescriptorIndex);
198 DbgUI.Text(text);
199 }
200}
ArmaReforgerScripted GetGame()
Definition game.c:1398
Definition DbgUI.c:66
proto external Managed FindComponent(typename typeName)
override EDamageType GetDefaultDamageType()
override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager)
override void OnDiag(SCR_ExtendedDamageManagerComponent dmgManager)
override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager)
static SCR_BloodOnClothesSystem s_System
override bool Save(ScriptBitWriter w)
override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator)
event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager)
override void OnEffectRemoved(SCR_ExtendedDamageManagerComponent dmgManager)
void TryAddBleedingToCloth(SCR_ExtendedDamageManagerComponent dmgManager)
override bool Load(ScriptBitReader r)
Blood - does not receive damage directly, only via scripted events.
void CreateBleedingParticleEffect(notnull HitZone hitZone, int colliderDescriptorIndex)
Called to start bleeding effect on a specificied bone.
bool GetGroupTourniquetted(ECharacterHitZoneGroup hitZoneGroup)
void AddBleedingToArray(notnull HitZone hitZone)
Register hitzone in array as bleeding.
void RemoveBleedingFromArray(notnull HitZone hitZone)
Unregister hitzone from array.
EHitZoneGroup GetHitZoneGroup()
Definition SCR_HitZone.c:12
Definition World.c:16
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
EDamageType
Definition EDamageType.c:13