DayZ Scripts
v1.21.156300 ยท Jun 20, 2023
 
Loading...
Searching...
No Matches
DayZPlayerCamera_Base.c
Go to the documentation of this file.
1
2float Limit(float pV, float pMin, float pMax)
3{
4 if (pV >= pMin && pV <= pMax)
5 {
6 return pV;
7 }
8 else if (pV < pMin)
9 {
10 return pMin;
11 }
12 else
13 {
14 return pMax;
15 }
16}
17
18
19float fixAngle_PI_PI(float pAngle)
20{
21 while (pAngle > Math.PI)
22 {
23
24 pAngle -= Math.PI2;
25 }
26
27 while (pAngle < -Math.PI)
28 {
29
30 pAngle += Math.PI2;
31 }
32
33 return pAngle;
34}
35
36float fixAngle_180_180(float pAngle)
37{
38 while (pAngle > 180)
39 {
40
41 pAngle -= 360;
42 }
43
44 while (pAngle < -180)
45 {
46
47 pAngle += 360;
48 }
49
50 return pAngle;
51}
52
53
55{
56 NONE = 0,
66 MAX
68
70{
71 static const float CONST_NEARPLANE_OPTICS_MIN = 0.04; //Minimal safe near plane value, artifacts on the far plane otherwise!
72
76
79 {
80 m_fLRAngleVel[0] = 0;
81 m_fUDAngleVel[0] = 0;
82 m_fFovAbsVel[0] = 0;
84
87 /*
88 {
89 int perItemCamUD = pPlayer.GetCurrentPerItemCameraUD();
90 string a = "Per Item Camera User Data: " + perItemCamUD.ToString();
91 Print(a);
92 }
93 */
95
96 m_CommandWeapons = pPlayer.GetCommandModifier_Weapons();
97 Init();
98 };
99
100
101 void ProcessCameraShake(float delta, out float leftRight, out float upDown)
102 {
103 if (m_CameraShake)
104 {
105 float x,y;
106 m_CameraShake.Update(delta, x, y);
107 leftRight += x;
108 upDown += y;
109 }
110 }
111
112 void Init()
113 {
114 PlayerBase player = PlayerBase.Cast(m_pPlayer);
115 if ( player && player.IsNVGWorking() != IsCameraNV() )
116 {
117 SetCameraNV(player.IsNVGWorking());
118 SetCameraNVType(player.GetNVType());
119 }
120 }
121
122 float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
123 {
124 float target = m_CommandWeapons.GetBaseAimingAngleUD();
125
127 {
128 pAngleAdd = m_pInput.GetTracking()[1] * Math.RAD2DEG;
129 pAngle = target;
130
131 m_fUDAngleVel[0] = 0;
132 }
133 else
134 {
135 if (Math.AbsFloat(pAngleAdd) > 0.001)
136 {
137 pAngleAdd = pAngle + pAngleAdd - target;
138 pAngle = target;
139 }
140
142 {
143 pAngleAdd += m_pInput.GetAimDelta(pDt)[1] * Math.RAD2DEG;
144
145 m_fUDAngleVel[0] = 0;
146 }
147 else
148 {
149 pAngleAdd = Math.SmoothCD(pAngleAdd, 0.0, m_fUDAngleVel, 0.14, 1000, pDt);
150 }
151
153 {
154 pAngle += m_pInput.GetAimDelta(pDt)[1] * Math.RAD2DEG;
155 }
156 }
157
158 pAngle = Limit(pAngle, pMin, pMax);
159 pAngleAdd = Limit(pAngle + pAngleAdd, pMin, pMax) - pAngle;
160 return pAngle + pAngleAdd;
161 }
162
163 float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
164 {
165 float target = 0;
166
168 {
169 pAngleAdd = m_pInput.GetTracking()[0] * Math.RAD2DEG;
170 pAngle = target;
171
172 m_fUDAngleVel[0] = 0;
173 }
174 else
175 {
176 if (Math.AbsFloat(pAngleAdd) > 0.001)
177 {
178 pAngleAdd = pAngle + pAngleAdd - target;
179 pAngle = target;
180 }
181
183 {
184 pAngleAdd += m_pInput.GetAimDelta(pDt)[0] * Math.RAD2DEG;
185
186 m_fLRAngleVel[0] = 0;
187 }
188 else
189 {
190 pAngleAdd = Math.SmoothCD(pAngleAdd, 0.0, m_fLRAngleVel, 0.14, 1000, pDt);
191 }
192
193 pAngleAdd = pAngleAdd + pAngle;
194 }
195
196 pAngle = Limit(pAngle, pMin, pMax);
197 pAngleAdd = Limit(pAngle + pAngleAdd, pMin, pMax) - pAngle;
198
199 return pAngle + pAngleAdd;
200 }
201
202 float UpdateUDAngle(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
203 {
204 if (Math.AbsFloat(pAngleAdd) > 0.001)
205 {
206 float aimingUDAngle = m_CommandWeapons.GetBaseAimingAngleUD();
207
210
211 // override actual angle
212 pAngleAdd = pAngle + pAngleAdd - aimingUDAngle;
213 pAngle = aimingUDAngle;
214
215 // Print("Angle: " + pAngle.ToString() + " Aim: " + actualUDAngle.ToString() );
216 }
217
220 {
221 pAngleAdd += m_pInput.GetAimChange()[1] * Math.RAD2DEG;
222 pAngleAdd = Limit(pAngleAdd, pMin, pMax);
223
224 m_fUDAngleVel[0] = 0;
225 }
226 else
227 {
229 {
230 pAngleAdd = m_pInput.GetTracking()[1] * Math.RAD2DEG;
231 pAngleAdd = Limit(pAngleAdd, pMin, pMax);
232
233 m_fUDAngleVel[0] = 0;
234 }
235 else
236 {
238 pAngle += m_pInput.GetAimChange()[1] * Math.RAD2DEG;
239 pAngle = Limit(pAngle, pMin, pMax);
240
241 pAngleAdd = Math.SmoothCD(pAngleAdd, 0, m_fUDAngleVel, 0.14, 1000, pDt);
242 }
243 }
244
245 /*{
246 float change = m_pInput.GetAimChange()[1] * Math.RAD2DEG;
247
248 Print ("Script: Camera ud angle: " + pAngle.ToString() + " change: " + change.ToString() );
249 }*/
250
251 return Limit(pAngle + pAngleAdd, pMin, pMax);
252 }
253
254 float UpdateLRAngle(float pAngle, float pMin, float pMax, float pDt)
255 {
258 {
260 pAngle += m_pInput.GetAimChange()[0] * Math.RAD2DEG;
261 pAngle = Limit(pAngle, pMin, pMax);
262
263 m_fLRAngleVel[0] = 0; // reset filter
264
265 }
266 else
267 {
269 {
270 pAngle = m_pInput.GetTracking()[0] * Math.RAD2DEG;
271 pAngle = Limit(-pAngle, pMin, pMax);
272
273 m_fLRAngleVel[0] = 0; // reset filter
274 }
275 else
276 {
277 // smooth value back to 0
278 pAngle = Math.SmoothCD(pAngle, 0, m_fLRAngleVel, 0.14, 1000, pDt);
279 // m_fLeftRightAngle = 0.9 * (1.0 - pDt);
280 }
281 }
282
283 return pAngle;
284 }
285
286
287
288 void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
289 {
291 switch (m_pPlayer.GetEyeZoomLevel())
292 {
293 // ordered in likelihood of occurance for perf. reasons
294 case ECameraZoomType.NONE:
295 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NONE), m_fFovAbsVel, 0.1, 1000, pDt);
296 break;
297 case ECameraZoomType.NORMAL:
298 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NORMAL), m_fFovAbsVel, 0.1, 1000, pDt);
299 break;
300 case ECameraZoomType.SHALLOW:
301 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.SHALLOW), m_fFovAbsVel, 0.1, 1000, pDt);
302 break;
303 default:
304 m_fFovAbsolute = Math.SmoothCD(m_fFovAbsolute, GetDayZGame().GetFOVByZoomType(ECameraZoomType.NONE), m_fFovAbsVel, 0.1, 1000, pDt);
305 break;
306 }
307
308 pOutResult.m_fFovAbsolute = m_fFovAbsolute;
309
312 {
313 pOutResult.m_fShootFromCamera = 0.0;
314 }
315 }
316
317 override void SpawnCameraShakeProper(float strength, float radius, float smoothness, float radius_decay_speed)
318 {
319 m_CameraShake = new CameraShake(strength, radius, smoothness, radius_decay_speed);
320 }
321
322 override void OnUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
323 {
324 if (!m_pPlayer || !PlayerBase.Cast(m_pPlayer))
325 {
326 Debug.Log("DayZPlayerCameraBase | OnUpdate | no player!");
327 return;
328 }
329
330 if (PlayerBase.Cast(m_pPlayer).GetCurrentCamera() != this)
331 {
332 //Print("DayZPlayerCameraBase | OnUpdate | unused camera! | " + this + "/" + PlayerBase.Cast(m_pPlayer).GetCurrentCamera());
333 return;
334 }
335
336 super.OnUpdate(pDt, pOutResult);
337 StdFovUpdate(pDt, pOutResult);
340 }
341
342 override void OnActivate(DayZPlayerCamera pPrevCamera, DayZPlayerCameraResult pPrevCameraResult)
343 {
344 InitCameraOnPlayer(true);
345 SetCameraPPDelay(pPrevCamera);
346
347 if (DayZPlayerCameraBase.Cast(pPrevCamera) && DayZPlayerCameraBase.Cast(pPrevCamera).IsCameraNV() && !IsCameraNV())
348 {
349 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_TRANSITIVE) );
350 }
351
352 GetGame().GetCallQueue(CALL_CATEGORY_GUI).CallLater(SetCameraPP,m_CameraPPDelay*1000,false,true,this); // this takes care of weapon/optics postprocessing
353 DayZPlayerCameraOptics optic_camera;
354 if (DayZPlayerCamera.CastTo(optic_camera,pPrevCamera))
355 {
356 GetGame().GetCallQueue(CALL_CATEGORY_GUI).Call(PlayerBase.Cast(m_pPlayer).HideClothing,null,false);
357 }
358 }
359
361 {
363 }
364
365 override string GetCameraName()
366 {
367 return "DayZPlayerCameraBase";
368 }
369
371 {
372 }
373
374 void SetCameraNV(bool nightvision)
375 {
376 m_IsNightvision = nightvision;
377 }
378
380 {
381 return m_IsNightvision;
382 }
383
384 void SetCameraNVType(int type)
385 {
386 m_NightvisionType = type;
387 }
388
390 {
391 return m_NightvisionType;
392 }
393
395 {
396 if ( !player )
397 return;
398
399 if ( player.IsNVGWorking() != IsCameraNV() || player.GetNVType() != GetCameraNVType() )
400 {
401 SetCameraNV(player.IsNVGWorking());
402 SetCameraNVType(player.GetNVType());
403 SetCameraPP(true, this);
404 }
405 }
406
408 void SetCameraPP(bool state, DayZPlayerCamera launchedFrom)
409 {
410 PPERequesterBank.GetRequester(PPERequester_CameraADS).Stop();
411
412 if (IsCameraNV())
413 {
415 }
416 else
417 {
419 }
420
421 m_weaponUsed = Weapon_Base.Cast(m_pPlayer.GetHumanInventory().GetEntityInHands());
422 if (m_weaponUsed)
423 {
424 m_weaponUsed.HideWeaponBarrel(false);
425 }
426 }
427
428 override float GetCurrentYaw()
429 {
430 return m_CurrentCameraYaw;
431 }
432
433 override float GetCurrentPitch()
434 {
436 }
437
438 override float GetCurrentRoll()
439 {
440 return m_CurrentCameraRoll;
441 }
442
443 void ForceFreelook(bool state)
444 {
445 m_bForceFreeLook = state;
446 }
447
448 //TODO - better handling of distinct occluder types
450 void SetNVPostprocess(int NVtype)
451 {
452 //Print("+++Setting NV type: " + NVtype + " +++");
453 switch (NVtype)
454 {
455 case NVTypes.NONE:
456 {
457 PPERequesterBank.GetRequester(PPERequester_CameraNV).Stop();
458 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
459 {
460 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
461 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
462 }
463 }
464 break;
465
466 //night-vision modes
467 case NVTypes.NV_OPTICS_KAZUAR_NIGHT:
468 case NVTypes.NV_OPTICS_STARLIGHT_NIGHT:
469 case NVTypes.NV_OPTICS_ON:
470 {
471 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DEFAULT_OPTICS) );
472 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
473 {
474 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
475 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
476 }
477 }
478 break;
479
480 //daytime filter modes
481 case NVTypes.NV_OPTICS_KAZUAR_DAY:
482 case NVTypes.NV_OPTICS_STARLIGHT_DAY:
483 {
484 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DAYTIME_OPTICS) );
485 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
486 {
487 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
488 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
489 }
490 }
491 break;
492
493 case NVTypes.NV_GOGGLES_OFF:
494 case NVTypes.NV_OPTICS_OFF:
495 {
496 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_NO_BATTERY) );
497 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
498 {
499 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
500 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
501 }
502 }
503 break;
504
505 case NVTypes.NV_GOGGLES:
506 {
507 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_DEFAULT_GLASSES) );
508 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
509 {
510 GetGame().GetMission().GetEffectWidgets().AddActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
511 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
512 }
513 }
514 break;
515
516 case NVTypes.NV_PUMPKIN:
517 {
518 PPERequesterBank.GetRequester(PPERequesterBank.REQ_CAMERANV).Start( new Param1<int>(PPERequester_CameraNV.NV_PUMPKIN) );
519 if (GetGame().GetMission() && GetGame().GetMission().GetEffectWidgets())
520 {
521 GetGame().GetMission().GetEffectWidgets().AddActiveEffects({EffectWidgetsTypes.PUMPKIN_OCCLUDER});
522 GetGame().GetMission().GetEffectWidgets().RemoveActiveEffects({EffectWidgetsTypes.NVG_OCCLUDER});
523 }
524 }
525 break;
526 }
527
528 if (PlayerBaseClient.Cast(m_pPlayer))
529 {
530 PlayerBaseClient.Cast(m_pPlayer).SwitchPersonalLight(NVtype < 1);
531 }
532 }
533
534 void InitCameraOnPlayer(bool force = false)
535 {
536 //Print("" + this + " | " + GetGame().GetTime());
537 PlayerBase player = PlayerBase.Cast(m_pPlayer);
538 if (!player.GetCurrentPlayerCamera() || (force && player.GetCurrentPlayerCamera() != this))
539 {
540 player.OnCameraChanged(this);
541 }
542 }
543
544 protected float m_fLRAngleVel[1];
545 protected float m_fUDAngleVel[1];
546 protected float m_fFovAbsVel[1];
547 protected float m_fFovAbsolute;
548 protected bool m_bForceFreeLook;
549 protected float m_WeaponSwayModifier;
550 protected float m_CameraPPDelay;
551
552 protected float m_CurrentCameraYaw;
553 protected float m_CurrentCameraPitch;
554 protected float m_CurrentCameraRoll;
555
557 protected bool m_IsNightvision;
558 protected int m_NightvisionType;
559}
DayZGame GetDayZGame()
Definition DayZGame.c:3656
protected float m_WeaponSwayModifier
float UpdateLRAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
protected int m_NightvisionType
protected float m_fUDAngleVel[1]
protected float m_fLRAngleVel[1]
protected float m_CurrentCameraPitch
protected ItemOptics m_opticsUsed
float UpdateUDAngleUnlocked(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
protected Weapon_Base m_weaponUsed
float Limit(float pV, float pMin, float pMax)
limit function
protected ref CameraShake m_CameraShake
void StdFovUpdate(float pDt, out DayZPlayerCameraResult pOutResult)
@ NV_GOGGLES_OFF
@ NV_OPTICS_OFF
@ NV_OPTICS_STARLIGHT_DAY
@ NV_OPTICS_KAZUAR_DAY
@ NV_OPTICS_STARLIGHT_NIGHT
@ NV_OPTICS_KAZUAR_NIGHT
bool IsCameraNV()
float fixAngle_PI_PI(float pAngle)
float UpdateLRAngle(float pAngle, float pMin, float pMax, float pDt)
float GetWeaponSwayModifier()
protected float m_fFovAbsVel[1]
protected HumanCommandWeapons m_CommandWeapons
protected bool m_IsNightvision
protected bool m_bForceFreeLook
void SetNVPostprocess(int NVtype)
DayZPlayerCameraOptics handles this separately, otherwise it takes active NVType from PlayerBase::Get...
void InitCameraOnPlayer(bool force=false)
float fixAngle_180_180(float pAngle)
protected float m_CurrentCameraYaw
void SetCameraNV(bool nightvision)
protected float m_CameraPPDelay
enum NVTypes CONST_NEARPLANE_OPTICS_MIN
void UpdateCameraNV(PlayerBase player)
void SetCameraNVType(int type)
int GetCameraNVType()
void ForceFreelook(bool state)
float UpdateUDAngle(out float pAngle, out float pAngleAdd, float pMin, float pMax, float pDt)
void ProcessCameraShake(float delta, out float leftRight, out float upDown)
protected float m_CurrentCameraRoll
void DayZPlayerCameraOptics(DayZPlayer pPlayer, HumanInputController pInput)
override void Init()
Launched from 'DayZGame.DeferredInit' to make earlier access, use, and updates impossible (downside o...
ECameraZoomType
Icon x
Icon y
proto native Mission GetMission()
override ScriptCallQueue GetCallQueue(int call_category)
Definition DayZGame.c:1153
void Update(float delta_time, out float x_axis, out float y_axis)
Definition CameraShake.c:41
this is main camera class
override void SetCameraPP(bool state, DayZPlayerCamera launchedFrom)
override void SetCameraPPDelay(DayZPlayerCamera pPrevCamera)
override bool IsShootingFromCamera()
override int GetEyeZoomLevel()
Definition Debug.c:14
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Definition Debug.c:133
override void RemoveActiveEffects(array< int > effects)
override void AddActiveEffects(array< int > effects)
proto native float GetBaseAimingAngleUD()
returns base aiming angle UD - without sway/offsets/...
proto native vector GetAimDelta(float dt)
returns aim change (in radians)
proto native vector GetAimChange()
returns per tick aim change (in radians)
proto native bool CameraIsTracking()
returns if camera is tracking (using IR device)
proto native vector GetTracking()
returns absolute tracking change (in radians)
proto native bool CameraIsFreeLook()
returns true if freelook is active
Definition EnMath.c:7
GameplayEffectWidgets_base GetEffectWidgets()
Definition gameplay.c:817
proto void CallLater(func fn, int delay=0, bool repeat=false, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
proto void Call(func fn, 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)
adds call into the queue with given parameters and arguments (arguments are held in memory until the ...
float GetCurrentRoll()
Definition dayzplayer.c:107
float GetCurrentYaw()
Definition dayzplayer.c:97
void SpawnCameraShakeProper(float strength, float radius, float smoothness, float radius_decay_speed)
protected DayZPlayer m_pPlayer
data
Definition dayzplayer.c:135
float GetCurrentPitch()
Definition dayzplayer.c:102
protected HumanInputController m_pInput
human input
Definition dayzplayer.c:136
class DayZPlayerCameraResult DayZPlayerCamera(DayZPlayer pPlayer, HumanInputController pInput)
Definition dayzplayer.c:56
float m_fFovAbsolute
fov absolute value override - -1.0 default, if set - overrides absolute fov setting
Definition dayzplayer.c:60
proto native CGame GetGame()
static proto float SmoothCD(float val, float target, inout float velocity[], float smoothTime, float maxVelocity, float dt)
Does the CD smoothing function - easy in | easy out / S shaped smoothing.
static const float PI
Definition EnMath.c:12
static proto float AbsFloat(float f)
Returns absolute value.
static const float PI2
Definition EnMath.c:13
static const float RAD2DEG
Definition EnMath.c:16
const int CALL_CATEGORY_GUI
Definition tools.c:9
proto native void OnUpdate()
Definition tools.c:338
class HumanMovementState OnActivate()
HumanCommandScript fully scriptable command.
Definition human.c:1169