Arma Reforger Explorer
1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Toggle main menu visibility
Loading...
Searching...
No Matches
SCR_BleedingDamageEffect.c
Go to the documentation of this file.
1
class
SCR_BleedingDamageEffect
:
SCR_DotDamageEffect
2
{
3
SCR_CharacterBloodHitZone
m_BloodHitZone;
4
int
m_iColliderDescriptorIndex = -1;
5
6
protected
static
SCR_BloodOnClothesSystem
s_System
;
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);
76
SCR_CharacterDamageManagerComponent
characterDmgManager =
SCR_CharacterDamageManagerComponent
.Cast(dmgManager);
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
//------------------------------------------------------------------------------------------------
108
float
CalculateBleedingRate
()
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
144
materialComponent =
ParametricMaterialInstanceComponent
.Cast(clothEntity.
FindComponent
(
ParametricMaterialInstanceComponent
));
145
if
(!materialComponent)
146
continue
;
147
148
World
world =
GetGame
().GetWorld();
149
s_System
=
SCR_BloodOnClothesSystem
.Cast(world.FindSystem(
SCR_BloodOnClothesSystem
));
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
//------------------------------------------------------------------------------------------------
186
override
EDamageType
GetDefaultDamageType
()
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
}
GetGame
ArmaReforgerScripted GetGame()
Definition
game.c:1398
DamageEffectEvaluator
Definition
DamageEffectEvaluator.c:2
DbgUI
Definition
DbgUI.c:66
DotDamageEffectTimerToken
Definition
DotDamageEffectTimerToken.c:13
HitZone
Definition
HitZone.c:13
IEntity
Definition
IEntity.c:13
IEntity::FindComponent
proto external Managed FindComponent(typename typeName)
LoadoutAreaType
Definition
LoadoutAreaType.c:13
ParametricMaterialInstanceComponent
Definition
ParametricMaterialInstanceComponent.c:13
SCR_BleedingDamageEffect
Definition
SCR_BleedingDamageEffect.c:2
SCR_BleedingDamageEffect::GetDefaultDamageType
override EDamageType GetDefaultDamageType()
Definition
SCR_BleedingDamageEffect.c:186
SCR_BleedingDamageEffect::OnEffectAdded
override void OnEffectAdded(SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:17
SCR_BleedingDamageEffect::OnDiag
override void OnDiag(SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:192
SCR_BleedingDamageEffect::EOnFrame
override void EOnFrame(float timeSlice, SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:73
SCR_BleedingDamageEffect::CalculateBleedingRate
float CalculateBleedingRate()
Definition
SCR_BleedingDamageEffect.c:108
SCR_BleedingDamageEffect::s_System
static SCR_BloodOnClothesSystem s_System
Definition
SCR_BleedingDamageEffect.c:6
SCR_BleedingDamageEffect::Save
override bool Save(ScriptBitWriter w)
Definition
SCR_BleedingDamageEffect.c:159
SCR_BleedingDamageEffect::HandleConsequences
override void HandleConsequences(SCR_ExtendedDamageManagerComponent dmgManager, DamageEffectEvaluator evaluator)
Definition
SCR_BleedingDamageEffect.c:9
SCR_BleedingDamageEffect::HijackDamageEffect
event override bool HijackDamageEffect(SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:90
SCR_BleedingDamageEffect::OnEffectRemoved
override void OnEffectRemoved(SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:37
SCR_BleedingDamageEffect::TryAddBleedingToCloth
void TryAddBleedingToCloth(SCR_ExtendedDamageManagerComponent dmgManager)
Definition
SCR_BleedingDamageEffect.c:122
SCR_BleedingDamageEffect::Load
override bool Load(ScriptBitReader r)
Definition
SCR_BleedingDamageEffect.c:169
SCR_BloodOnClothesSystem
Definition
SCR_BloodOnClothesSystem.c:6
SCR_CharacterBloodHitZone
Blood - does not receive damage directly, only via scripted events.
Definition
SCR_CharacterHitZone.c:430
SCR_CharacterDamageManagerComponent
Definition
SCR_CharacterDamageManagerComponent.c:19
SCR_CharacterDamageManagerComponent::GetTourniquetStrengthMultiplier
float GetTourniquetStrengthMultiplier()
Definition
SCR_CharacterDamageManagerComponent.c:863
SCR_CharacterDamageManagerComponent::CreateBleedingParticleEffect
void CreateBleedingParticleEffect(notnull HitZone hitZone, int colliderDescriptorIndex)
Called to start bleeding effect on a specificied bone.
Definition
SCR_CharacterDamageManagerComponent.c:940
SCR_CharacterDamageManagerComponent::RegenPhysicalHitZones
void RegenPhysicalHitZones(bool skipRegenDelay=false)
Definition
SCR_CharacterDamageManagerComponent.c:1629
SCR_CharacterDamageManagerComponent::GetBloodHitZone
SCR_CharacterBloodHitZone GetBloodHitZone()
Definition
SCR_CharacterDamageManagerComponent.c:709
SCR_CharacterDamageManagerComponent::GetGroupTourniquetted
bool GetGroupTourniquetted(ECharacterHitZoneGroup hitZoneGroup)
Definition
SCR_CharacterDamageManagerComponent.c:1241
SCR_CharacterDamageManagerComponent::AddBleedingToArray
void AddBleedingToArray(notnull HitZone hitZone)
Register hitzone in array as bleeding.
Definition
SCR_CharacterDamageManagerComponent.c:912
SCR_CharacterDamageManagerComponent::RemoveBleedingParticleEffect
void RemoveBleedingParticleEffect(HitZone hitZone)
Definition
SCR_CharacterDamageManagerComponent.c:1032
SCR_CharacterDamageManagerComponent::RemoveBleedingFromArray
void RemoveBleedingFromArray(notnull HitZone hitZone)
Unregister hitzone from array.
Definition
SCR_CharacterDamageManagerComponent.c:923
SCR_DotDamageEffect
Definition
SCR_DotDamageEffect.c:7
SCR_HitZone
Definition
SCR_HitZone.c:2
SCR_HitZone::GetHitZoneGroup
EHitZoneGroup GetHitZoneGroup()
Definition
SCR_HitZone.c:12
SCR_PhysicalHitZonesRegenDamageEffect
Definition
SCR_PhysicalHitZonesRegenDamageEffect.c:2
ScriptBitReader
Definition
EnNetwork.c:199
World
Definition
World.c:16
Print
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
LogLevel
Enum with severity of the logging message.
Definition
LogLevel.c:14
EDamageType
EDamageType
Definition
EDamageType.c:13
scripts
Game
Damage
DamageEffects
CharacterDamageEffects
SCR_BleedingDamageEffect.c
Generated by
1.17.0