DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
InjuryHandler.c
Go to the documentation of this file.
2{
3 const float WORN = 0.5;
4 const float DAMAGED = 0.3;
5 const float BADLY_DAMAGED = 0.2;
6 const float RUINED = 0.1;
7};
8
10{
11 const float LVL0 = 0;
12 const float LVL1 = 0.3;
13 const float LVL2 = 0.6;
14 const float LVL3 = 0.8;
15 const float LVL4 = 1;
16};
17
19{
25}
26
27enum eInjuryOverrides
28{
30 NONE = 0,
34 BROKEN_LEGS = 8, //New
36 PRONE_ANIM_OVERRIDE = 32, //Prevent non pristine animation when prone
37}
38
40{
41
42 const float VALUE_CHECK_INTERVAL = 5;
43 const float SENSITIVTY_PERCENTAGE = 1; //how much the value needs to change up/down from previous update to trigger a new update(in percent)
44
46
51
52
54 private bool m_AnimationChange = false;
55 private bool m_InjuryAnimEnabled = false;
56 private float m_InjuryAnimDamageValue = 0;
58
60 {
61 m_Player = player;
62 m_HealthMaxValue = m_Player.GetMaxHealth("", "Health");
63 }
64
66 {
68 }
69
71 {
73 }
74
76 {
78 }
79
80 void Update(float deltaT)
81 {
83 {
84 m_Player.GetCommandModifier_Additives().SetInjured(m_InjuryAnimDamageValue, m_InjuryAnimEnabled);
85 m_AnimationChange = false;
86 }
87
88 if ( GetGame().IsClient() )
89 return;
90
91 m_TimeSinceLastTick += deltaT;
92
94 {
95 CheckValue();
97 }
98 }
99
101 {
102 eInjuryHandlerLevels override_level = unchanged_level;
103
104 //Whatever the case, prone will always use PRISTINE anim level as alternative anim level(s) are not interesting gameplaywise
105 if ( m_ForceInjuryAnimMask & eInjuryOverrides.PRONE_ANIM_OVERRIDE && override_level > eInjuryHandlerLevels.PRISTINE )
106 {
107 override_level = eInjuryHandlerLevels.PRISTINE;
108 return override_level;
109 }
110
111 if ( m_ForceInjuryAnimMask & eInjuryOverrides.MORPHINE && override_level > eInjuryHandlerLevels.PRISTINE )
112 {
113 override_level = eInjuryHandlerLevels.PRISTINE;
114 }
115
116 if ( m_ForceInjuryAnimMask & eInjuryOverrides.PAIN_KILLERS_LVL1 && override_level > eInjuryHandlerLevels.WORN )
117 {
118 override_level = eInjuryHandlerLevels.WORN;
119 }
120
121 if ( m_ForceInjuryAnimMask & eInjuryOverrides.PAIN_KILLERS_LVL0 && override_level > eInjuryHandlerLevels.DAMAGED )
122 {
123 override_level = eInjuryHandlerLevels.DAMAGED;
124 }
125
126 if ( m_ForceInjuryAnimMask && override_level > eInjuryHandlerLevels.DAMAGED )
127 {
128 override_level = eInjuryHandlerLevels.RUINED;
129 }
130
131 //Broken leg overrides
132 if ( m_ForceInjuryAnimMask & eInjuryOverrides.BROKEN_LEGS_SPLINT && override_level < eInjuryHandlerLevels.DAMAGED )
133 {
134 override_level = eInjuryHandlerLevels.DAMAGED;
135 }
136
137 if ( m_ForceInjuryAnimMask & eInjuryOverrides.BROKEN_LEGS && override_level < eInjuryHandlerLevels.RUINED )
138 {
139 //Average leg health used to determine which animation to use
140 float avgLegHealth = m_Player.GetHealth("RightLeg","") + m_Player.GetHealth("LeftLeg","") + m_Player.GetHealth("RightFoot","") + m_Player.GetHealth("LeftFoot","");
141 avgLegHealth *= 0.25; //divide by 4 to make the average leg health;
143 override_level = eInjuryHandlerLevels.RUINED;
144 else if (avgLegHealth >= PlayerConstants.BROKEN_LEGS_HIGH_HEALTH_THRESHOLD)
145 override_level = eInjuryHandlerLevels.WORN;
146 else
147 override_level = eInjuryHandlerLevels.DAMAGED;
148 }
149
150 return override_level;
151
152 }
153
154 void CheckValue(bool forceUpdate = false)
155 {
156 float health_current_normalized = m_Player.GetHealth("","Health") / m_HealthMaxValue;
157 eInjuryHandlerLevels injury_level = GetInjuryLevel(health_current_normalized);
158
160 {
161 injury_level = GetOverrideLevel(injury_level);
162 }
163
164 if ( m_LastHealthUpdate != injury_level || forceUpdate )
165 {
166 SendValue(injury_level);
167 m_ChangedStateInvoker.Invoke(injury_level);
168 m_LastHealthUpdate = injury_level;
169 Synchronize(injury_level);
170 }
171 }
172
174 {
175 m_Player.m_HealthLevel = level;
176 //Print("m_Player.m_HealthLevel:" + m_Player.m_HealthLevel);
177 m_Player.SetSynchDirty();
178 }
179
181 {
183 }
184
186 {
187 m_AnimationChange = true;
188 m_InjuryAnimEnabled = enable;
190 }
191
193 {
194 if ( health < InjuryHandlerThresholds.RUINED )
195 {
196 return eInjuryHandlerLevels.RUINED;
197 }
198
200 {
201 return eInjuryHandlerLevels.BADLY_DAMAGED;
202 }
203
204 if ( health < InjuryHandlerThresholds.DAMAGED )
205 {
206 return eInjuryHandlerLevels.DAMAGED;
207 }
208
209 if ( health < InjuryHandlerThresholds.WORN )
210 {
211 return eInjuryHandlerLevels.WORN;
212 }
213
214 return eInjuryHandlerLevels.PRISTINE;
215 }
216
217
219 {
220 switch ( level )
221 {
222 case eInjuryHandlerLevels.RUINED:
223 {
224 return InjuryAnimValues.LVL4;
225 }
226 case eInjuryHandlerLevels.BADLY_DAMAGED:
227 {
228 return InjuryAnimValues.LVL3;
229 }
230 case eInjuryHandlerLevels.DAMAGED:
231 {
232 return InjuryAnimValues.LVL2;
233 }
234 case eInjuryHandlerLevels.WORN:
235 {
236 return InjuryAnimValues.LVL1;
237 }
238 case eInjuryHandlerLevels.PRISTINE:
239 {
240 return InjuryAnimValues.LVL0;
241 }
242 default:
243 Error("Undefined Injury level");
244 }
245 return 0;
246 }
247}
void Synchronize()
DayZPlayer m_Player
Definition Hand_Events.c:42
enum eInjuryHandlerLevels MORPHINE
ref ScriptInvoker m_ChangedStateInvoker
float m_LastUpdate
private bool m_AnimationChange
owner
ScriptInvoker GetInvoker()
float GetInjuryValue(eInjuryHandlerLevels level)
eInjuryHandlerLevels GetOverrideLevel(eInjuryHandlerLevels unchanged_level)
eInjuryHandlerLevels m_LastHealthUpdate
float m_HealthMaxValue
const float SENSITIVTY_PERCENTAGE
void CheckValue(bool forceUpdate=false)
enum eInjuryHandlerLevels PAIN_KILLERS_LVL0
void SetInjuryCommandParams(bool enable, eInjuryHandlerLevels level)
float GetInjuryAnimValue()
enum eInjuryHandlerLevels VALUE_CHECK_INTERVAL
enum eInjuryHandlerLevels PRONE_ANIM_OVERRIDE
eInjuryHandlerLevels
@ RUINED
@ BADLY_DAMAGED
@ DAMAGED
@ PRISTINE
@ WORN
enum eInjuryHandlerLevels BROKEN_LEGS
private float m_InjuryAnimDamageValue
void InjuryAnimationHandler(PlayerBase player)
float m_TimeSinceLastTick
bool IsInjuryAnimEnabled()
enum eInjuryHandlerLevels PAIN_KILLERS_LVL1
int m_ForceInjuryAnimMask
private bool m_InjuryAnimEnabled
enum eInjuryHandlerLevels NONE
MUST BE POW2.
eInjuryHandlerLevels GetInjuryLevel(float health)
void SendValue(eInjuryHandlerLevels level)
enum eInjuryHandlerLevels BROKEN_LEGS_SPLINT
static void SendInjury(DayZPlayer pPlayer, bool pEnable, eInjuryHandlerLevels level)
const float LVL4
const float LVL2
const float LVL3
const float LVL1
const float LVL0
static const float BROKEN_LEGS_HIGH_HEALTH_THRESHOLD
static const float BROKEN_LEGS_LOW_HEALTH_THRESHOLD
ScriptInvoker Class provide list of callbacks usage:
Definition tools.c:116
proto void Invoke(void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
invoke call on all inserted methods with given arguments
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
Definition EnDebug.c:90
proto native volatile void Update()