Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_PoisonScreenEffect.c
Go to the documentation of this file.
1// This screen effect is used in the SCR_HudManagerComponent of {6E2BB64764E3BE9B}Prefabs/Characters/Core/DefaultPlayerController.et
2// And it operates on what is in {BFBCF7C2CF2E36EE}UI/layouts/HUD/ScreenEffects/ScreenEffects.layout
4{
5 [Attribute(defvalue: "0.17", desc: "Min alpha mask progress value", params: "0 1 0.01")]
6 protected float m_fMinEnabledAlpha;
7
8 [Attribute(defvalue: "0.45", desc: "Max alpha mask progress value", params: "0 1 0.01")]
9 protected float m_fMaxEnabledAlpha;
10
11 [Attribute(defvalue: "0.4", desc: "Minimal opacity value that will be used by the poison widgets", params: "0 1 0.01")]
13
14 [Attribute(defvalue: "1", desc: "Base animation speed for the opacity", params: "0.01 inf 0.01")]
15 protected float m_fAnimationSpeed;
16
17 [Attribute(defvalue: "1.1", desc: "Max additional speed that can be applied to the opacity animation", params: "0.01 inf 0.01")]
19
20 [Attribute(defvalue: "0.1", desc: "Multiplier applied to the currently total amount of poison damge, to convert it into the opacity value", params: "0.01 inf 0.01")]
21 protected float m_fDamageToOpacityFactor;
22
25
27 protected ref set<DotDamageEffect> m_DamageEffects;
28
29 //------------------------------------------------------------------------------------------------
30 override void DisplayStartDraw(IEntity owner)
31 {
32 m_wPoisonEffect1 = ImageWidget.Cast(m_wRoot.FindAnyWidget("PoisonVignette1"));
33 m_wPoisonEffect2 = ImageWidget.Cast(m_wRoot.FindAnyWidget("PoisonVignette2"));
35 SetEnabled(false);
36 }
37
38 //------------------------------------------------------------------------------------------------
39 override void ClearEffects()
40 {
42 m_DamageEffects.Clear();
43
45 return;
46
49 if (m_wPoisonEffect1.GetMaskProgress() > 0)
50 {
54 AnimateWidget.AlphaMask(m_wPoisonEffect2, 0, 1).GetOnCompleted().Insert(HideEffects);
55 return;
56 }
57
59 }
60
61 //------------------------------------------------------------------------------------------------
63 protected void HideEffects()
64 {
66 return;
67
68 m_wPoisonEffect1.SetMaskProgress(0);
69 m_wPoisonEffect2.SetMaskProgress(0);
70 m_wPoisonEffect2.GetParent().SetVisible(false);
71 }
72
73 //------------------------------------------------------------------------------------------------
75 protected void StartEffects()
76 {
78 return;
79
82
83 m_wPoisonEffect1.GetParent().SetVisible(true);
84 }
85
86 //------------------------------------------------------------------------------------------------
89 protected void UpdateAnimation(notnull ImageWidget widget)
90 {
91 float speedFactor = 1;
92 float targetOpacity = 1;
93 if (widget.GetOpacity() > m_fMinEnabledEffectOpacity)
94 {
95 targetOpacity = m_fMinEnabledEffectOpacity;
96 speedFactor = 0.5;
97 }
98
100 }
101
102 //------------------------------------------------------------------------------------------------
103 override void SetEnabled(bool isEnabled)
104 {
105 if (isEnabled)
106 StartEffects();
107 else
108 ClearEffects();
109
110 super.SetEnabled(isEnabled);
111 }
112
113 //------------------------------------------------------------------------------------------------
115 {
116 SetEnabled(false);
117 HideEffects();
118
119 ChimeraCharacter character = ChimeraCharacter.Cast(to);
120 if (!character)
121 return;
122
123 SCR_CharacterDamageManagerComponent dmgManager = SCR_CharacterDamageManagerComponent.Cast(character.GetDamageManager());
124 if (!dmgManager)
125 return;
126
127 const HitZone defaultHitZone = dmgManager.GetDefaultHitZone();
128
129 array<ref SCR_PersistentDamageEffect> effects = {};
130 if (dmgManager.FindAllDamageEffectsOfTypeOnHitZone(SCR_PoisonDamageEffect, defaultHitZone, effects) < 1)
131 return;
132
133 // find all damage effects that are important for this screen effect and add it
134 SCR_PoisonDamageEffect poisonEffect;
135 foreach (SCR_PersistentDamageEffect effect : effects)
136 {
137 poisonEffect = SCR_PoisonDamageEffect.Cast(effect);
138 if (!poisonEffect)
139 continue;
140
141 // add them but dont start the effect as its will be done afterwards just once
142 OnDamageEffectAdded(poisonEffect, false);
143 }
144
145 if (!m_DamageEffects || m_DamageEffects.IsEmpty())
146 return;
147
148 // now that we are sure that there is a reason to tick this effect start it
149 SetEnabled(true);
150 }
151
152 //------------------------------------------------------------------------------------------------
156 void OnDamageEffectAdded(notnull DotDamageEffect dmgEffect, bool updateVisuals = true)
157 {
158 if (!m_DamageEffects)
159 m_DamageEffects = new set<DotDamageEffect>();
160
161 if (!m_DamageEffects.Insert(dmgEffect))
162 return;
163
164 if (!updateVisuals)
165 return;
166
167 SetEnabled(true);
168 }
169
170 //------------------------------------------------------------------------------------------------
174 {
175 if (m_DamageEffects.RemoveItem(dmgEffect))
176 {
177 if (m_DamageEffects.IsEmpty())
178 SetEnabled(false);
179 }
180 }
181
182 //------------------------------------------------------------------------------------------------
183 override protected void DisplayUpdate(IEntity owner, float timeSlice)
184 {
185 if (!m_DamageEffects || m_DamageEffects.IsEmpty())
186 {
187 SetEnabled(false);
188 return;
189 }
190
191 float newMaskProgress;
192 //const Widget parent = m_wPoisonEffect1.GetMaskProgress();
193 newMaskProgress = Math.Max(m_wPoisonEffect1.GetMaskProgress(), m_fMinEnabledAlpha);
194 EvaluateDamageEffects(newMaskProgress);
195 newMaskProgress = Math.Min(Math.Lerp(m_wPoisonEffect1.GetMaskProgress(), newMaskProgress, timeSlice), m_fMaxEnabledAlpha);
196
197 m_wPoisonEffect1.SetMaskProgress(newMaskProgress);
198 m_wPoisonEffect2.SetMaskProgress(newMaskProgress);
199
202
205 }
206
207 //------------------------------------------------------------------------------------------------
210 protected void EvaluateDamageEffects(inout float newMaskProgress)
211 {
213 if (batchedData)
214 newMaskProgress = batchedData.m_fDamageValue * m_fDamageToOpacityFactor;
215 }
216}
Widget m_wRoot
UI Textures DeployMenu Briefing conflict_HintBanner_1_UI desc
static WidgetAnimationOpacity Opacity(Widget widget, float targetValue, float speed, bool toggleVisibility=false)
static WidgetAnimationAlphaMask AlphaMask(Widget widget, float targetValue, float speed)
static void StopAllAnimations(Widget w)
static bool IsAnimating(Widget w)
Definition Math.c:13
static float RandomFloat(float min, float max)
Definition SCR_Math.c:18
void DisplayUpdate(IEntity owner, float timeSlice)
void UpdateAnimation(notnull ImageWidget widget)
void OnDamageEffectRemoved(notnull DotDamageEffect dmgEffect)
void EvaluateDamageEffects(inout float newMaskProgress)
override void DisplayStartDraw(IEntity owner)
SCR_DamageSufferingSystem m_DamageSystem
override void DisplayControlledEntityChanged(IEntity from, IEntity to)
ref set< DotDamageEffect > m_DamageEffects
override void SetEnabled(bool isEnabled)
void OnDamageEffectAdded(notnull DotDamageEffect dmgEffect, bool updateVisuals=true)
SCR_FieldOfViewSettings Attribute