Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_BleedingScreenEffect.c
Go to the documentation of this file.
2{
3 // Play Animation of CreateEffectOverTime()
4 protected const int BLEEDING_REPEAT_DELAY = 2500;
5
6 protected const float BLEEDINGEFFECT_OPACITY_FADEOUT_1_DURATION = 0.2;
8
9 protected const float BLEEDINGEFFECT_OPACITY_FADEOUT_2_DURATION = 0.3;
11
14
15 // Play Animation of BlackoutEffect()
16 protected const float BLACKOUT_OPACITY_MULTIPLIER = 0.20;
17
18 //Saturation
19 private static float s_fSaturation;
20
21 // Widgets
25 private bool m_bEffectState;
26
27 // Character
31
32 protected bool m_bBleedingEffect;
33 protected bool m_bIsBleeding;
34 protected bool m_bPlayHeartBeat;
35
36
37 //------------------------------------------------------------------------------------------------
38 override void DisplayStartDraw(IEntity owner)
39 {
40 m_wBloodEffect1 = ImageWidget.Cast(m_wRoot.FindAnyWidget("BloodVignette1"));
41 m_wBloodEffect2 = ImageWidget.Cast(m_wRoot.FindAnyWidget("BloodVignette2"));
42 m_wBlackOut = ImageWidget.Cast(m_wRoot.FindAnyWidget("BleedingBlackOut"));
43 }
44
45 //------------------------------------------------------------------------------------------------
47 {
49
52 return;
53
55 if (!m_DamageManager)
56 return;
57
58 // define hitzones for later getting
59 m_BloodHZ = m_DamageManager.GetBloodHitZone();
60
61 // Invoker for momentary damage events and DOT damage events
62 m_DamageManager.GetOnDamageEffectAdded().Insert(OnDamageEffectAdded);
63 m_DamageManager.GetOnDamageEffectRemoved().Insert(OnDamageEffectRemoved);
64
65 // In case player started bleeding before invokers were established, check if already bleeding
66 array<ref SCR_PersistentDamageEffect> effects = m_DamageManager.GetAllPersistentEffectsOfType(SCR_BleedingDamageEffect);
67 if (effects.IsEmpty())
68 return;
69
70 // Pass the first bleeding to the function that is normally invoked when bleeding is added
71 OnDamageEffectAdded(effects[0]);
72 }
73
74 //------------------------------------------------------------------------------------------------
75 protected void OnDamageEffectAdded(notnull SCR_DamageEffect dmgEffect)
76 {
77 m_bIsBleeding = m_DamageManager.IsBleeding();
78 if (!m_bBleedingEffect && m_bIsBleeding && m_DamageManager.GetState() != EDamageState.DESTROYED)
80
82 }
83
84 //------------------------------------------------------------------------------------------------
85 protected void OnDamageEffectRemoved(notnull SCR_DamageEffect dmgEffect)
86 {
87 m_bIsBleeding = m_DamageManager.IsBleeding();
88 if (m_bIsBleeding)
89 return;
90
92 GetGame().GetCallqueue().Remove(CreateEffectOverTime);
93 GetGame().GetCallqueue().Remove(ClearEffectOverTime);
94
95 m_bBleedingEffect = false;
96 SCR_LogitechLEDManager.ActivateState(ELogitechLEDState.DEFAULT);
97 }
98
99 //------------------------------------------------------------------------------------------------
100 protected override void DisplayOnSuspended()
101 {
102 m_bPlayHeartBeat = false;
103 }
104
105 //------------------------------------------------------------------------------------------------
106 protected override void DisplayOnResumed()
107 {
108 m_bPlayHeartBeat = true;
109 }
110
111 //------------------------------------------------------------------------------------------------
112 protected void CreateEffectOverTime(bool repeat)
113 {
115 return;
116
117 float effectStrength = 1;
118 const float REDUCEDSTRENGTH = 0.7;
119 bool playHeartBeat = m_bPlayHeartBeat;
120
121 if (m_BloodHZ.GetTotalBleedingAmount() < 5)
122 {
123 effectStrength *= REDUCEDSTRENGTH;
124 playHeartBeat = false;
125 }
126
127 m_wBloodEffect1.SetSaturation(1);
128 m_wBloodEffect2.SetSaturation(1);
129
132
133 if (m_bEffectState)
134 {
137 }
138 else
139 {
142 }
143
144 BlackoutEffect(effectStrength);
145
146 // Play heartbeat sound
147 if (playHeartBeat && m_DamageManager.GetDefaultHitZone().GetDamageState() != EDamageState.DESTROYED)
148 {
149 SCR_UISoundEntity.SetSignalValueStr("BloodLoss", 1 - m_BloodHZ.GetHealthScaled());
150 SCR_UISoundEntity.SoundEvent(SCR_SoundEvent.SOUND_INJURED_PLAYERCHARACTER);
151 }
152
153 GetGame().GetCallqueue().CallLater(ClearEffectOverTime, 1000, false, repeat, m_bEffectState);
154 SCR_LogitechLEDManager.ActivateState(ELogitechLEDState.BLEEDING);
155 }
156
157 //------------------------------------------------------------------------------------------------
170
171 //------------------------------------------------------------------------------------------------
172 protected void BlackoutEffect(float effectStrength)
173 {
174 if (!m_wBlackOut)
175 return;
176
177 if (effectStrength > 0)
178 {
179 m_wBlackOut.SetOpacity(1);
180 effectStrength *= BLACKOUT_OPACITY_MULTIPLIER;
182 }
183 else
184 {
186 }
187
189 }
190
191 //------------------------------------------------------------------------------------------------
192 protected override void ClearEffects()
193 {
194 m_bBleedingEffect = false;
195
196 if (m_wBloodEffect1)
198
199 if (m_wBloodEffect2)
201
202 if (m_wBlackOut)
204
205 GetGame().GetCallqueue().Remove(CreateEffectOverTime);
206 GetGame().GetCallqueue().Remove(ClearEffectOverTime);
207
208 if (!m_DamageManager)
209 return;
210
211 m_DamageManager.GetOnDamageEffectAdded().Remove(OnDamageEffectAdded);
212 m_DamageManager.GetOnDamageEffectRemoved().Remove(OnDamageEffectRemoved);
213 }
214}
ArmaReforgerScripted GetGame()
Definition game.c:1398
Widget m_wRoot
static WidgetAnimationAlphaMask AlphaMask(Widget widget, float targetValue, float speed)
void AnimateEffectVisibility(notnull ImageWidget effectWidget, float opacity, float alpha, float opacitySpeed=1.0, float alphaSpeed=1.0, bool updateVisibility=true)
void HideSingleEffect(notnull ImageWidget effectWidget)
void UpdateEffectVisibility(notnull ImageWidget effectWidget)
The widget will be made visible or hidden based on its opacity.
const float BLEEDINGEFFECT_PROGRESSION_FADEOUT_2_DURATION
void OnDamageEffectAdded(notnull SCR_DamageEffect dmgEffect)
const float BLEEDINGEFFECT_PROGRESSION_FADEOUT_1_DURATION
const float BLEEDINGEFFECT_PROGRESSION_FADEIN_1_DURATION
override void DisplayStartDraw(IEntity owner)
void BlackoutEffect(float effectStrength)
const float BLEEDINGEFFECT_OPACITY_FADEOUT_1_DURATION
SCR_CharacterDamageManagerComponent m_DamageManager
SCR_CharacterBloodHitZone m_BloodHZ
const float BLEEDINGEFFECT_OPACITY_FADEOUT_2_DURATION
override void DisplayControlledEntityChanged(IEntity from, IEntity to)
void OnDamageEffectRemoved(notnull SCR_DamageEffect dmgEffect)
Blood - does not receive damage directly, only via scripted events.
EDamageState