DayZ 1.27
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
StaminaHandler.c
См. документацию.
10
11
12/**@class Stamina Consumer
13 * @brief Holds information about Stamina Consumer
14 *
15 * @param[in] threshold value needed to allow consume stamina
16 * @param[in] state keeps state of the consumer non-depleted/depleted
17 */
19{
20 protected float m_ActivationThreshold;
21 protected float m_DrainThreshold
22 protected bool m_State;
23
24 void StaminaConsumer(float threshold, float threshold2, bool state)
25 {
26 m_ActivationThreshold = threshold; //can be activated if above this threshold
27 m_DrainThreshold = threshold2; //can continually drain until it reaches this threshold
28 m_State = state;
29 }
30
31 bool GetState() { return m_State; }
32 void SetState(bool state) { m_State = state; }
33
35 void SetActivationThreshold(float threshold) { m_ActivationThreshold = threshold; }
36
37 float GetDrainThreshold() { return m_DrainThreshold; }
38 void SetDrainThreshold(float threshold) { m_DrainThreshold = threshold; }
39}
40
42{
44
49
50 void RegisterConsumer(EStaminaConsumers consumer, float threshold, float depletion_threshold = -1)
51 {
52 if (depletion_threshold == -1)
53 {
54 depletion_threshold = threshold;
55 }
56
57 if ( !m_StaminaConsumers.Contains(consumer) )
58 {
60 StaminaConsumer sc = new StaminaConsumer(threshold, depletion_threshold, true);
61 m_StaminaConsumers.Set(consumer, sc);
62 }
63 }
64
65 bool HasEnoughStaminaFor(EStaminaConsumers consumer, float curStamina, bool isDepleted, float cap)
66 {
68 if (m_StaminaConsumers && m_StaminaConsumers.Find(consumer, sc))
69 {
70 if (consumer != EStaminaConsumers.SPRINT)
71 {
72 if (isDepleted || (curStamina < sc.GetDrainThreshold()))
73 {
74 sc.SetState(false);
75 return false;
76 }
77 }
78 else
79 {
80 if (!isDepleted)
81 {
82 if (sc.GetState())
83 {
84 sc.SetState(true);
85 return true;
86 }
87 }
88 else
89 {
90 sc.SetState(false);
91 return false;
92 }
93 }
94
95 if (curStamina > sc.GetDrainThreshold() || curStamina == cap) //Sometimes player can't go up to drain threshold
96 {
97 sc.SetState(true);
98 return true;
99 }
100 }
101
102 return false;
103 }
104
105 bool HasEnoughStaminaToStart(EStaminaConsumers consumer, float curStamina, bool isDepleted, float cap)
106 {
108 if (m_StaminaConsumers && m_StaminaConsumers.Find(consumer, sc))
109 {
110 if ((isDepleted || (curStamina < sc.GetActivationThreshold() && curStamina < cap)))
111 {
112 sc.SetState(false);
113 return false;
114 }
115 else
116 {
117 sc.SetState(true);
118 return true;
119 }
120 }
121
122 return false;
123 }
124}
125
126
135class StaminaModifier
136{
137 bool m_InUse = false;
140
141 void StaminaModifier(int type, float min, float max, float cooldown, float startTime = 0, float duration = 0)
142 {
143 m_Type = type;
144 m_MinValue = min;
145 m_MaxValue = max;
146 m_Cooldown = cooldown;
147 m_StartTimeAdjustment = startTime;
148 m_Duration = duration;
149 m_Tick = 1;
150 }
151
152 int GetType() { return m_Type; }
153
154 float GetMinValue() { return m_MinValue; }
155 void SetMinValue(float val) { m_MinValue = val; }
156
157 float GetMaxValue() { return m_MaxValue; }
158 void SetMaxValue(float val) { m_MaxValue = val; }
159
160 float GetCooldown() { return m_Cooldown; }
161 void SetCooldown(float val) { m_Cooldown = val; }
162
163 float GetStartTime() { return m_StartTime; } //Actual game time (progressive modifiers only)
164 void SetStartTime(float val) { m_StartTime = val; }
165
166 float GetStartTimeAdjustment() {return m_StartTimeAdjustment;} //adjustment to current time (progressive modifiers only)
167
168 float GetDuration() { return m_Duration; }
170
171 bool IsInUse() { return m_InUse; }
172 void SetInUse(bool val) { m_InUse = val; }
173
174 float GetRunTime() { return m_ProgressTime; }
175 void AddRunTime(float val) { m_ProgressTime += val; }
176 void SetRunTimeTick(float val) { m_Tick = val; }
178}
179
181{
182 protected ref SMDataExponential m_SMDataEx;
183
184 float GetBaseValue() { return m_SMDataEx.m_BaseValue; }
185 float GetExponent() { return m_SMDataEx.m_Exponent; }
186 float GetMultiplier() { return m_SMDataEx.m_Multiplier; }
187 override float GetCooldown() { return m_SMDataEx.m_Cooldown; }
188 override float GetStartTimeAdjustment() { return m_SMDataEx.m_StartTimeAdjustment; }
189 override float GetDuration() { return m_SMDataEx.m_Duration; }
190 override float GetDurationAdjusted() { return m_SMDataEx.m_Duration / m_Tick; }
191
192 void SetData(SMDataExponential data) { m_SMDataEx = data; }
193}
194
196{
197 const int FIXED = 0;
198 const int RANDOMIZED = 1;
199 const int LINEAR = 2; //Useful ONLY for regular, over-time stamina drain
200 const int EXPONENTIAL = 3; //Useful ONLY for regular, over-time stamina drain
201
203
208
211 {
212 if ( !m_StaminaModifiers.Contains(modifier) )
213 {
215 StaminaModifier sm = new StaminaModifier(FIXED, -1, value, cooldown);
216 m_StaminaModifiers.Set(modifier, sm);
217 }
218 }
219
221 void RegisterRandomized(EStaminaModifiers modifier, float minValue, float maxValue, float cooldown = GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
222 {
223 if ( !m_StaminaModifiers.Contains(modifier) )
224 {
226 StaminaModifier sm = new StaminaModifier(RANDOMIZED, minValue, maxValue, cooldown);
227 m_StaminaModifiers.Set(modifier, sm);
228 }
229 }
230
232 void RegisterLinear(EStaminaModifiers modifier, float startValue, float endValue, float startTime, float duration, float cooldown = GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
233 {
234 StaminaModifier sm = new StaminaModifier(LINEAR, startValue, endValue, cooldown, startTime, duration);
235 m_StaminaModifiers.Set(modifier, sm);
236 }
237
239 void RegisterExponential(EStaminaModifiers modifier, float startValue, float exponent, float startTime, float duration, float cooldown = GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
240 {
241 StaminaModifier sm = new StaminaModifier(EXPONENTIAL, startValue, exponent, cooldown, startTime, duration);
242 m_StaminaModifiers.Set(modifier, sm);
243 }
244
246 void RegisterExponentialEx(EStaminaModifiers modifier, SMDataExponential data)
247 {
248 StaminaModifierExponential smex = new StaminaModifierExponential(EXPONENTIAL, data.m_BaseValue, data.m_Exponent, data.m_Cooldown, data.m_StartTimeAdjustment, data.m_Duration);
249 smex.SetData(data);
250 m_StaminaModifiers.Set(modifier, smex);
251 }
252
254 {
255 return m_StaminaModifiers.Get(modifier);
256 }
257}
258
259
261{
262 protected float m_PlayerLoad;
263 protected float m_StaminaDelta;
264 protected float m_Stamina;
265 protected float m_StaminaSynced; //guaranteed to be identical on server and client
266 protected float m_StaminaCap;
267 protected float m_StaminaDepletion;
268 protected float m_StaminaDepletionMultiplier; //controls depletion rate
269 protected float m_StaminaRecoveryMultiplier; //controls recovery rate
270 protected float m_Time;
275
276 protected bool m_Debug;
277 protected bool m_StaminaDepleted;
278
281 ref set<EStaminaMultiplierTypes> m_ActiveDepletionModifiers;
282
284 ref set<EStaminaMultiplierTypes> m_ActiveRecoveryModifiers;
285
286 protected bool m_IsInCooldown;
287
290
291 #ifdef DIAG_DEVELOPER
292 protected bool m_StaminaDisabled;
293 #endif
294
296 {
297 if (GetGame().IsServer() || !GetGame().IsMultiplayer())
298 m_StaminaParams = new Param3<float,float,bool>(0, 0, false);
299
301 m_Player = player;
307 m_Time = 0;
308 m_StaminaDepleted = false;
309 m_IsInCooldown = false;
310 m_HumanMoveSettings = m_Player.GetDayZPlayerType().CommandMoveSettingsW();
311
314
316
317 //----------------- depletion --------------------
319 m_ActiveDepletionModifiers = new set<EStaminaMultiplierTypes>;
320
321 //----------------- recovery --------------------
323 m_ActiveRecoveryModifiers = new set<EStaminaMultiplierTypes>;
324
325 Init();
326 }
327
328
346
348 {
349 if (m_RegisteredDepletionModifiers.Contains(type))
350 {
351 m_ActiveDepletionModifiers.Insert(type);
353 }
354 else
355 {
356 Error("attempting to activate unregistered depletion modifier");
357 }
358 }
359
361 {
362 int index = m_ActiveDepletionModifiers.Find(type);
363 if (index != -1)
364 {
365 m_ActiveDepletionModifiers.Remove(index);
367 }
368 }
369
371 {
372 float value = 1;
373
374 foreach (int multiplier: m_ActiveDepletionModifiers)
375 {
376 value *= m_RegisteredDepletionModifiers.Get(multiplier);
377 }
378
379 if (value != m_StaminaDepletionMultiplier)
381 }
382
384 {
385 if (m_RegisteredRecoveryModifiers.Contains(type))
386 {
387 m_ActiveRecoveryModifiers.Insert(type);
389 }
390 else
391 {
392 Error("attempting to activate unregistered recovery modifier");
393 }
394 }
395
396
398 {
399 int index = m_ActiveRecoveryModifiers.Find(type);
400 if (index != -1)
401 {
402 m_ActiveRecoveryModifiers.Remove(index);
404 }
405 }
406
408 {
409 float value = 1;
410
411 foreach (int multiplier: m_ActiveRecoveryModifiers)
412 {
413 value *= m_RegisteredRecoveryModifiers.Get(multiplier);
414 }
415
416 if (value != m_StaminaRecoveryMultiplier)
417 {
419 }
420 }
421
422 void Update(float deltaT, int pCurrentCommandID)
423 {
424 #ifdef DIAG_DEVELOPER
425 if (m_StaminaDisabled)
426 return;
427 #endif
428
429 if (m_Player)
430 {
431 bool isServerOrSingleplayer = GetGame().IsServer() || !GetGame().IsMultiplayer();
432 // Calculates actual max stamina based on player's load
433 if (isServerOrSingleplayer)
434 {
436 m_PlayerLoad = m_Player.GetWeightEx();
437
440 {
442 }
443 else
444 {
446 }
447 }
448
449 // Calculates stamina gain/loss based on movement and load
450 m_Player.GetMovementState(m_State);
451
452 switch (m_State.m_CommandTypeId)
453 {
454 case DayZPlayerConstants.COMMANDID_MOVE:
456 break;
457 case DayZPlayerConstants.COMMANDID_LADDER:
459 break;
460 case DayZPlayerConstants.COMMANDID_SWIM:
462 break;
463 case DayZPlayerConstants.COMMANDID_FALL:
464 case DayZPlayerConstants.COMMANDID_MELEE2:
465 case DayZPlayerConstants.COMMANDID_CLIMB:
466 break;
467 default:
468 if (!m_IsInCooldown)
469 {
471 }
472 break;
473 }
474
475 //Sets current stamina & stores + syncs data with client
476 float temp = m_StaminaDelta * deltaT;
477 if (temp < 0)
478 {
480 }
481 else
482 {
484 }
485
488
489 if (isServerOrSingleplayer)
490 {
491 m_Player.GetStatStamina().Set(m_Stamina);
492 m_Time += deltaT;
493
495 {
496 m_Time = 0;
498 }
499 }
500
501 #ifndef SERVER
503 #endif
504
507
508 m_StaminaDelta = 0;
509 m_StaminaDepletion = 0; // resets depletion modifier
510
511 }
512 }
513
515 void OnRPC(float stamina, float stamina_cap, bool cooldown)
516 {
517 }
518
520 void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
521 {
522 switch ( pJunctureID )
523 {
525 float stamina;
526 float stamina_cap;
527 bool cooldown;
528
529 if (!pCtx.Read(stamina) || !pCtx.Read(stamina_cap) || !pCtx.Read(cooldown))
530 {
531 return;
532 }
533
534 m_Stamina = stamina; //?
535 m_StaminaSynced = stamina;
536
537 if (m_Player.GetInstanceType() != DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
538 {
539 return;
540 }
541
542 if ( stamina_cap != m_StaminaCap )
543 {
544 m_StaminaCap = stamina_cap;
545 }
546
547 m_IsInCooldown = cooldown;
548 m_Player.SetStamina(m_Stamina, m_StaminaCap);
549 break;
550
553 break;
554 }
555 }
556
557 protected void StaminaProcessor_Move(HumanMovementState pHumanMovementState)
558 {
559 switch (pHumanMovementState.m_iMovement)
560 {
561 case DayZPlayerConstants.MOVEMENTIDX_SPRINT: //sprint
562 if (pHumanMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT)
563 {
566 break;
567 }
568 else if ( pHumanMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH)
569 {
572 break;
573 }
574
576 break;
577
578 case DayZPlayerConstants.MOVEMENTIDX_RUN: //jog
579 if (m_Player.GetCurrentWaterLevel() >= m_HumanMoveSettings.m_fWaterLevelSpeedRectrictionHigh)
580 {
582 break;
583 }
584
585 if (!m_IsInCooldown)
586 {
588 }
589 break;
590
591 case DayZPlayerConstants.MOVEMENTIDX_WALK: //walk
592 if (!m_IsInCooldown)
593 {
595 }
596 break;
597
598 case DayZPlayerConstants.MOVEMENTIDX_IDLE: //idle
599 if (m_Player.IsRolling())
600 {
602 break;
603 }
604
605 if (!m_IsInCooldown)
606 {
608 }
609 break;
610
611 default:
612 if (!m_IsInCooldown)
613 {
615 }
616 break;
617 }
618 }
619
620 protected void StaminaProcessor_Ladder(HumanMovementState pHumanMovementState)
621 {
622 switch (pHumanMovementState.m_iMovement)
623 {
624 case 2: //climb up (fast)
627 break;
628
629 case 1: //climb up (slow)
630 if (!m_IsInCooldown)
631 {
633 }
634 break;
635
636 default:
637 if (!m_IsInCooldown)
638 {
640 }
641 break;
642 }
643 }
644
645 protected void StaminaProcessor_Swimming(HumanMovementState pHumanMovementState)
646 {
647 switch (pHumanMovementState.m_iMovement)
648 {
649 case 3: //swim fast
652 break;
653
654
655 case 2: //swim slow
656 if (!m_IsInCooldown)
657 {
659 }
660 break;
661
662 default:
663 if (!m_IsInCooldown)
664 {
666 }
667 break;
668 }
669 }
670
672 protected void SyncStamina(float stamina, float stamina_cap, bool cooldown)
673 {
674 m_Player.GetStatStamina().Set(m_Stamina);
676 pCtx.Write(m_Stamina);
677 pCtx.Write(m_StaminaCap);
678 pCtx.Write(m_IsInCooldown);
679 m_Player.SendSyncJuncture(DayZPlayerSyncJunctures.SJ_STAMINA,pCtx);
680 }
681
684 {
686
688 pCtx.Write(p.param1);
689 pCtx.Write(p.param2);
690 m_Player.SendSyncJuncture(DayZPlayerSyncJunctures.SJ_STAMINA_MISC,pCtx);
691 }
692
695 {
696 float depletionMultiplier;
697 float recoveryMultiplier;
698 if (!pCtx.Read(depletionMultiplier) || !pCtx.Read(recoveryMultiplier))
699 {
700 return;
701 }
702
703 m_StaminaDepletionMultiplier = depletionMultiplier;
704 m_StaminaRecoveryMultiplier = recoveryMultiplier;
705 }
706
708 {
710
711 m_StaminaConsumers.RegisterConsumer(
712 EStaminaConsumers.HOLD_BREATH,
715 );
716 m_StaminaConsumers.RegisterConsumer(
717 EStaminaConsumers.SPRINT,
719 );
720 m_StaminaConsumers.RegisterConsumer(
723 );
724 m_StaminaConsumers.RegisterConsumer(
725 EStaminaConsumers.VAULT,
727 );
728 m_StaminaConsumers.RegisterConsumer(
729 EStaminaConsumers.CLIMB,
731 );
732 m_StaminaConsumers.RegisterConsumer(
733 EStaminaConsumers.MELEE_HEAVY,
735 );
736 m_StaminaConsumers.RegisterConsumer(
737 EStaminaConsumers.MELEE_EVADE,
739 );
740 m_StaminaConsumers.RegisterConsumer(
743 );
744 m_StaminaConsumers.RegisterConsumer(EStaminaConsumers.DROWN, 0);
745 m_StaminaConsumers.RegisterConsumer(EStaminaConsumers.PUSH, 0);
746 }
747
749 {
751
753 m_StaminaModifiers.RegisterExponentialEx(
754 EStaminaModifiers.HOLD_BREATH,
755 data,
756 );
757 m_StaminaModifiers.RegisterExponentialEx(
758 EStaminaModifiers.PUSH_CAR,
759 data,
760 );
761 m_StaminaModifiers.RegisterFixed(EStaminaModifiers.DROWN, 10);
762 m_StaminaModifiers.RegisterFixed(
765 );
766 m_StaminaModifiers.RegisterFixed(
767 EStaminaModifiers.VAULT,
769 );
770 m_StaminaModifiers.RegisterFixed(
771 EStaminaModifiers.CLIMB,
773 );
774 m_StaminaModifiers.RegisterFixed(
775 EStaminaModifiers.MELEE_LIGHT,
777 );
778 m_StaminaModifiers.RegisterFixed(
779 EStaminaModifiers.MELEE_HEAVY,
781 );
782 m_StaminaModifiers.RegisterFixed(
783 EStaminaModifiers.OVERALL_DRAIN,
785 5.0,
786 );
787 m_StaminaModifiers.RegisterRandomized(
788 EStaminaModifiers.MELEE_EVADE,
791 );
793 }
794
796 protected float CalcStaminaGainBonus()
797 {
798 if (m_StaminaDepletion > 0)
799 return 0;
800
801 if (m_Stamina > 25)
802 return Math.Min((m_Stamina/10),GameConstants.STAMINA_GAIN_BONUS_CAP); // exp version
803 else
804 return GameConstants.STAMINA_GAIN_BONUS_CAP; // linear version
805 }
806
807 protected void ApplyExhaustion()
808 {
810 HumanCommandAdditives ad = m_Player.GetCommandModifier_Additives();
811
812 float exhaustion_value = 1;
813 if (m_StaminaCap != 0)
814 {
815 exhaustion_value = 1 - ((m_Stamina / (m_StaminaCap * 0.01)) * 0.01);
816 }
817
818 exhaustion_value = Math.Min(1, exhaustion_value);
819 if (ad)
820 {
821 // do not apply exhaustion on local client if player is in ADS/Optics (camera shakes)
822 if (m_Player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT && (m_Player.IsInOptics() || m_Player.IsInIronsights()))
823 {
824 ad.SetExhaustion(0, true);
825 }
826 else
827 {
828 ad.SetExhaustion(exhaustion_value, true);
829 }
830 }
831 }
832
834 protected void CheckStaminaState()
835 {
836 if (m_Stamina <= 0)
837 {
838 m_StaminaDepleted = true;
840 if (!m_IsInCooldown)
841 {
842 // set this only once
844 }
845 }
846 else
847 {
848 m_StaminaDepleted = false;
849 }
850 }
851
853 protected void SetCooldown(float time, int modifier = -1)
854 {
855 if ( m_StaminaDepleted || m_Stamina <= 0.0 )
856 {
857 ResetCooldown(modifier);
858 return;
859 }
860
861 m_IsInCooldown = true;
862
863 Timer timer;
864 if (m_TimerMap.Find(modifier, timer) && timer.IsRunning())
865 {
866 timer.Stop();
867 }
868 else
869 {
870 timer = new Timer;
871 m_TimerMap.Set(modifier,timer);
872 }
873 timer.Run(time, this, "ResetCooldown", new Param1<int>( modifier ));
874 //Print(m_TimerMap.Count());
875 }
876
877 protected void ResetCooldown(int modifier = -1)
878 {
879 StaminaModifier sm = m_StaminaModifiers.GetModifierData(modifier);
880 if (sm)
881 {
882 //Print(modifier);
883 //Error("Error: No StaminaModifier found! | StaminaHandler | ResetCooldown");
884 sm.SetStartTime(-1);
885 sm.ResetRunTime();
886 sm.SetInUse(false);
887 }
888 m_IsInCooldown = false;
889 }
890
892 {
893
894 }
895
896 // ---------------------------------------------------
898 {
899 return m_StaminaConsumers.HasEnoughStaminaFor(consumer, m_Stamina, m_StaminaDepleted, m_StaminaCap);
900 }
901
903 {
904 return m_StaminaConsumers.HasEnoughStaminaToStart(consumer, m_Stamina, m_StaminaDepleted, m_StaminaCap);
905 }
906
907 void SetStamina(float stamina_value)
908 {
909 m_Stamina = Math.Clamp(stamina_value, 0, CfgGameplayHandler.GetStaminaMax());
911 }
912
914 {
915 return m_Stamina;
916 }
917
919 {
920 return m_Stamina / GetStaminaMax();
921 }
922
924 {
925 return m_StaminaSynced;
926 }
927
929 {
930 return GetSyncedStamina() / GetStaminaMax();
931 }
932
934 {
935 return m_StaminaCap;
936 }
937
939 {
941 }
942
943 //obsolete, use ActivateDepletionModifier/DeactivateDepletionModifier instead
951 //obsolete, use ActivateRecoveryModifier/DeactivateRecoveryModifier instead
959
964
966 {
968 }
969
970 void DepleteStamina(EStaminaModifiers modifier, float dT = -1)
971 {
972 #ifdef DIAG_DEVELOPER
973 if (m_StaminaDisabled)
974 return;
975 #endif
976 float val = 0.0;
977 float current_time = m_Player.GetSimulationTimeStamp();
978 float valueProgress;
979 StaminaModifier sm = m_StaminaModifiers.GetModifierData(modifier);
980
981 // select by modifier type and drain stamina
982 switch (sm.GetType())
983 {
984 case m_StaminaModifiers.FIXED:
985 if (dT == -1)
986 {
987 dT = 1;
988 }
989 m_StaminaDepletion = m_StaminaDepletion + sm.GetMaxValue() * dT;
990
991 break;
992
993 case m_StaminaModifiers.RANDOMIZED:
994 val = Math.RandomFloat(sm.GetMinValue(), sm.GetMaxValue());
996
997 break;
998
999 case m_StaminaModifiers.LINEAR:
1000 if (!sm.IsInUse())
1001 {
1002 sm.SetStartTime(current_time + sm.GetStartTimeAdjustment()/dT);
1003 sm.SetRunTimeTick(dT);
1004 sm.SetInUse(true);
1005 }
1006 valueProgress = Math.Clamp((current_time - sm.GetStartTime())/sm.GetDurationAdjusted(), 0, 1 );
1007 val = Math.Lerp(sm.GetMinValue(), sm.GetMaxValue(), valueProgress);
1009
1010 break;
1011
1012 case m_StaminaModifiers.EXPONENTIAL:
1014 if (!Class.CastTo(smex,sm))
1015 {
1016 ErrorEx("StaminaModifierExponential not found for modifier type: " + sm.GetType());
1017 break;
1018 }
1019
1020 if (!smex.IsInUse())
1021 {
1022 smex.SetStartTime(current_time + smex.GetStartTimeAdjustment()/dT);
1023 smex.SetRunTimeTick(dT);
1024 smex.SetInUse(true);
1025 }
1026 valueProgress = Math.Clamp((current_time - smex.GetStartTime())/smex.GetDurationAdjusted(), 0, 1 );
1027 float exp;
1028 if (Math.AbsFloat(smex.GetBaseValue()) < 1)
1029 {
1030 exp = 1 - Math.Lerp(0, smex.GetExponent(), valueProgress);
1031 val = Math.Pow(smex.GetBaseValue(),exp);
1032 }
1033 else
1034 {
1035 exp = Math.Lerp(Math.Min(0, smex.GetExponent()), Math.Max(0, smex.GetExponent()), valueProgress);
1036 val = Math.Pow(smex.GetBaseValue(),exp) + smex.GetBaseValue() - 1;
1037 }
1038
1041
1042 break;
1043 }
1044
1046 SetCooldown(sm.GetCooldown(),modifier);
1048
1050 }
1051
1052 #ifdef DIAG_DEVELOPER
1053 void SetStaminaDisabled(bool value)
1054 {
1055 m_StaminaDisabled = value;
1056 }
1057 #endif
1058}
eBleedingSourceType m_Type
Определения BleedingSource.c:25
eBleedingSourceType GetType()
Определения BleedingSource.c:63
float m_Duration
Определения BulletHitReaction.c:56
map
Определения ControlsXboxNew.c:4
EStaminaConsumers
Определения EStaminaConsumers.c:2
EStaminaModifiers
Определения EStaminaModifiers.c:2
enum EObjectTemperatureState m_State
@ DROWNING
Определения PlayerSoundEventBase.c:9
class PlayerStatBase m_MinValue
T m_MaxValue
Определения PlayerStatBase.c:35
void StaminaConsumer(float threshold, float threshold2, bool state)
Определения StaminaHandler.c:24
const int RANDOMIZED
Определения StaminaHandler.c:198
m_ActivationThreshold
EStaminaMultiplierTypes
Определения StaminaHandler.c:2
float GetMinValue()
Определения StaminaHandler.c:154
void SetMaxValue(float val)
Определения StaminaHandler.c:158
const int LINEAR
Определения StaminaHandler.c:199
DISEASE_PNEUMONIA
Определения StaminaHandler.c:9
float m_ProgressTime
Определения StaminaHandler.c:139
void StaminaModifier(int type, float min, float max, float cooldown, float startTime=0, float duration=0)
Определения StaminaHandler.c:141
void RegisterLinear(EStaminaModifiers modifier, float startValue, float endValue, float startTime, float duration, float cooldown=GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
register lerped modifier - depletes stamina for startValue, and, after a startTime,...
Определения StaminaHandler.c:232
void SetActivationThreshold(float threshold)
Определения StaminaHandler.c:35
void ResetRunTime()
Определения StaminaHandler.c:177
FATIGUE
Определения StaminaHandler.c:4
float m_Tick
Определения StaminaHandler.c:139
void SetStartTime(float val)
Определения StaminaHandler.c:164
void SetInUse(bool val)
Определения StaminaHandler.c:172
StaminaModifierExponential FIXED
m_InUse
void StaminaConsumers()
Определения StaminaHandler.c:45
void SetDrainThreshold(float threshold)
Определения StaminaHandler.c:38
float m_StartTimeAdjustment
Определения StaminaHandler.c:139
void SetState(bool state)
Определения StaminaHandler.c:32
ref map< EStaminaModifiers, ref StaminaModifier > m_StaminaModifiers
Определения StaminaHandler.c:202
void RegisterExponentialEx(EStaminaModifiers modifier, SMDataExponential data)
register exponential modifier, extended parameters
Определения StaminaHandler.c:246
float GetMaxValue()
Определения StaminaHandler.c:157
float GetStartTimeAdjustment()
Определения StaminaHandler.c:166
bool IsInUse()
Определения StaminaHandler.c:171
float m_Multiplier
Определения StaminaHandler.c:139
float m_StartTime
Определения StaminaHandler.c:139
VOMIT_EXHAUSTION
Определения StaminaHandler.c:7
float GetDrainThreshold()
Определения StaminaHandler.c:37
const int EXPONENTIAL
Определения StaminaHandler.c:200
float GetActivationThreshold()
Определения StaminaHandler.c:34
void SetRunTimeTick(float val)
Определения StaminaHandler.c:176
void StaminaModifiers()
Определения StaminaHandler.c:204
void SetMinValue(float val)
Определения StaminaHandler.c:155
void RegisterExponential(EStaminaModifiers modifier, float startValue, float exponent, float startTime, float duration, float cooldown=GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
register exponential modifier - depletes stamina for startValue, and, after a startTime,...
Определения StaminaHandler.c:239
void RegisterFixed(EStaminaModifiers modifier, float value, float cooldown=GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
register single value modifier - depletes stamina for that value
Определения StaminaHandler.c:210
EPINEPHRINE
Определения StaminaHandler.c:5
float GetStartTime()
Определения StaminaHandler.c:163
void SetCooldown(float val)
Определения StaminaHandler.c:161
StaminaModifier GetModifierData(EStaminaModifiers modifier)
Определения StaminaHandler.c:253
MASK
Определения StaminaHandler.c:3
float GetCooldown()
Определения StaminaHandler.c:160
float GetDurationAdjusted()
Определения StaminaHandler.c:169
float m_Cooldown
Определения StaminaHandler.c:139
void AddRunTime(float val)
Определения StaminaHandler.c:175
void RegisterRandomized(EStaminaModifiers modifier, float minValue, float maxValue, float cooldown=GameConstants.STAMINA_REGEN_COOLDOWN_DEPLETION)
register randomized modifier - stamina will be depleted by value between min and max value;
Определения StaminaHandler.c:221
proto native bool IsMultiplayer()
proto native bool IsServer()
static float GetSprintLadderStaminaModifier()
Определения CfgGameplayHandler.c:197
static float GetStaminaKgToStaminaPercentPenalty()
Определения CfgGameplayHandler.c:212
static float GetStaminaMinCap()
Определения CfgGameplayHandler.c:217
static float GetSprintStaminaModifierCro()
Определения CfgGameplayHandler.c:188
static float GetSprintStaminaModifierErc()
Определения CfgGameplayHandler.c:183
static float GetObstacleTraversalStaminaModifier()
Определения CfgGameplayHandler.c:227
static float GetStaminaMax()
Определения CfgGameplayHandler.c:207
static float GetMeleeStaminaModifier()
Определения CfgGameplayHandler.c:222
static float GetSprintSwimmingStaminaModifier()
Определения CfgGameplayHandler.c:193
static float GetStaminaWeightLimitThreshold()
Определения CfgGameplayHandler.c:202
Super root of all classes in Enforce script.
Определения EnScript.c:11
static const int SJ_STAMINA
Определения DayZPlayerSyncJunctures.c:29
static const int SJ_STAMINA_MISC
Определения DayZPlayerSyncJunctures.c:30
static const float STAMINA_RECOVERY_MULTIPLIER
Определения Drowning.c:3
Определения Drowning.c:2
const float STAMINA_DEPLETION_MULTIPLIER
Определения EpinephrineMdfr.c:4
Определения EpinephrineMdfr.c:2
static const float STAMINA_DEPLETION_MULTIPLIER
Определения Fatigue.c:9
static const float STAMINA_RECOVERY_MULTIPLIER
Определения Fatigue.c:8
Определения Fatigue.c:2
Определения constants.c:659
int m_iMovement
current stance (DayZPlayerConstants.STANCEIDX_ERECT, ...), only if the command has a stance
Определения human.c:1142
int m_iStanceIdx
current command's id
Определения human.c:1141
Определения human.c:1139
const float STAMINA_RECOVERY_MODIFIER
Определения Mask.c:6
const float STAMINA_DEPLETION_MODIFIER
Определения Mask.c:7
Определения Mask.c:2
Определения EnMath.c:7
Определения PPEConstants.c:68
Определения EntityAI.c:95
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Определения param.c:12
Определения PlayerBaseClient.c:2
const float STAMINA_RECOVERY_MULTIPLIER
Определения Pneumonia.c:7
const float STAMINA_DEPLETION_MULTIPLIER
Определения Pneumonia.c:6
Определения Pneumonia.c:2
Определения gameplay.c:152
proto bool Write(void value_out)
proto bool Read(void value_in)
void RegisterConsumer(EStaminaConsumers consumer, float threshold, float depletion_threshold=-1)
Определения StaminaHandler.c:50
void StaminaConsumers()
Определения StaminaHandler.c:45
ref map< EStaminaConsumers, ref StaminaConsumer > m_StaminaConsumers
Определения StaminaHandler.c:43
bool HasEnoughStaminaToStart(EStaminaConsumers consumer, float curStamina, bool isDepleted, float cap)
Определения StaminaHandler.c:105
bool HasEnoughStaminaFor(EStaminaConsumers consumer, float curStamina, bool isDepleted, float cap)
Определения StaminaHandler.c:65
float m_StaminaDepletionMultiplier
Определения StaminaHandler.c:268
void Init()
Определения StaminaHandler.c:329
Timer GetCooldownTimer(int modifier)
Определения StaminaHandler.c:891
void StaminaProcessor_Ladder(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:620
void RegisterStaminaModifiers()
Определения StaminaHandler.c:748
ref HumanMovementState m_State
Определения StaminaHandler.c:272
void StaminaProcessor_Swimming(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:645
float GetDepletionMultiplier()
Определения StaminaHandler.c:960
void RecalculateRecoveryMultiplier()
Определения StaminaHandler.c:407
void DepleteStamina(EStaminaModifiers modifier, float dT=-1)
Определения StaminaHandler.c:970
void SetDepletionMultiplier(float val)
Определения StaminaHandler.c:944
void SetRecoveryMultiplier(float val)
Определения StaminaHandler.c:952
float m_StaminaRecoveryMultiplier
Определения StaminaHandler.c:269
float GetStaminaCap()
Определения StaminaHandler.c:933
ref set< EStaminaMultiplierTypes > m_ActiveDepletionModifiers
Определения StaminaHandler.c:281
void SyncAdditionalStaminaInfo(Param par)
Method to sync more info for stamina manager. Template parameter means it is very extendable for furt...
Определения StaminaHandler.c:683
ref StaminaModifiers m_StaminaModifiers
Определения StaminaHandler.c:289
void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
called from PlayerBase - syncs stamina values on server with client AND sets the value to match on se...
Определения StaminaHandler.c:520
void CheckStaminaState()
check if the stamina is completely depleted
Определения StaminaHandler.c:834
ref map< int, ref Timer > m_TimerMap
Определения StaminaHandler.c:279
float GetStaminaMax()
Определения StaminaHandler.c:938
void DeactivateRecoveryModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:397
void RegisterStaminaConsumers()
Определения StaminaHandler.c:707
bool HasEnoughStaminaFor(EStaminaConsumers consumer)
Определения StaminaHandler.c:897
void StaminaHandler(PlayerBase player)
Определения StaminaHandler.c:295
bool m_Debug
Определения StaminaHandler.c:276
PlayerBase m_Player
Определения StaminaHandler.c:274
float GetRecoveryMultiplier()
Определения StaminaHandler.c:965
float GetStamina()
Определения StaminaHandler.c:913
float m_StaminaSynced
Определения StaminaHandler.c:265
float m_StaminaDepletion
Определения StaminaHandler.c:267
void OnRPC(float stamina, float stamina_cap, bool cooldown)
deprecated use, StaminaHandler uses SyncJunctures now
Определения StaminaHandler.c:515
void ApplyExhaustion()
Определения StaminaHandler.c:807
float GetSyncedStamina()
Определения StaminaHandler.c:923
float CalcStaminaGainBonus()
Calulates stamina regain bonus coef based on current stamina cap and level.
Определения StaminaHandler.c:796
float m_StaminaCap
Определения StaminaHandler.c:266
ref set< EStaminaMultiplierTypes > m_ActiveRecoveryModifiers
Определения StaminaHandler.c:284
ref Param3< float, float, bool > m_StaminaParams
Определения StaminaHandler.c:271
void RecalculateDepletionMultiplier()
Определения StaminaHandler.c:370
void StaminaProcessor_Move(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:557
float GetStaminaNormalized()
Определения StaminaHandler.c:918
float GetSyncedStaminaNormalized()
Определения StaminaHandler.c:928
void DeactivateDepletionModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:360
float m_StaminaDelta
Определения StaminaHandler.c:263
float m_Time
Определения StaminaHandler.c:270
float m_PlayerLoad
Определения StaminaHandler.c:262
bool m_StaminaDepleted
DEPRECATED.
Определения StaminaHandler.c:277
float m_Stamina
Определения StaminaHandler.c:264
bool HasEnoughStaminaToStart(EStaminaConsumers consumer)
Определения StaminaHandler.c:902
void SetCooldown(float time, int modifier=-1)
set cooldown timer between each consume of stamina
Определения StaminaHandler.c:853
void SetStamina(float stamina_value)
Определения StaminaHandler.c:907
void ReadAdditionalStaminaInfo(ParamsReadContext pCtx)
Order of read parameters must match the order of writing above.
Определения StaminaHandler.c:694
bool m_IsInCooldown
Определения StaminaHandler.c:286
ref StaminaConsumers m_StaminaConsumers
Определения StaminaHandler.c:288
void ActivateDepletionModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:347
SHumanCommandMoveSettings m_HumanMoveSettings
Определения StaminaHandler.c:273
void ResetCooldown(int modifier=-1)
Определения StaminaHandler.c:877
void SyncStamina(float stamina, float stamina_cap, bool cooldown)
stamina sync - server part
Определения StaminaHandler.c:672
ref map< EStaminaMultiplierTypes, float > m_RegisteredRecoveryModifiers
Определения StaminaHandler.c:283
void ActivateRecoveryModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:383
ref map< EStaminaMultiplierTypes, float > m_RegisteredDepletionModifiers
Определения StaminaHandler.c:280
void Update(float deltaT, int pCurrentCommandID)
Определения StaminaHandler.c:422
override float GetStartTimeAdjustment()
Определения StaminaHandler.c:188
float GetExponent()
Определения StaminaHandler.c:185
override float GetCooldown()
Определения StaminaHandler.c:187
float GetMultiplier()
Определения StaminaHandler.c:186
float GetBaseValue()
Определения StaminaHandler.c:184
override float GetDuration()
Определения StaminaHandler.c:189
void SetData(SMDataExponential data)
Определения StaminaHandler.c:192
override float GetDurationAdjusted()
Определения StaminaHandler.c:190
ref SMDataExponential m_SMDataEx
Определения StaminaHandler.c:182
override void Stop()
Определения DayZPlayerImplement.c:64
Определения DayZPlayerImplement.c:63
static const float STAMINA_RECOVERY_MULTIPLIER
Определения VomitState.c:4
static const float STAMINA_DEPLETION_MULTIPLIER
Определения VomitState.c:3
Определения VomitState.c:2
DayZPlayerInstanceType
defined in C++
Определения dayzplayer.c:1068
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
Serializer ParamsReadContext
Определения gameplay.c:15
proto native CGame GetGame()
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
enum ShapeType ErrorEx
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static proto float Min(float x, float y)
Returns smaller of two given values.
static proto float RandomFloat(float min, float max)
Returns a random float number between and min[inclusive] and max[exclusive].
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float Pow(float v, float power)
Return power of v ^ power.
static proto float AbsFloat(float f)
Returns absolute value.
const float STAMINA_DRAIN_CLIMB
Определения constants.c:676
const float STAMINA_HOLD_BREATH_THRESHOLD_DRAIN
Определения constants.c:696
const float STAMINA_DRAIN_MELEE_LIGHT
Определения constants.c:677
const float STAMINA_KG_TO_GRAMS
in grams (weight where the player is not penalized by stamina)
Определения constants.c:708
const float STAMINA_ROLL_THRESHOLD
Определения constants.c:700
const float STAMINA_CLIMB_THRESHOLD
Определения constants.c:699
const float STAMINA_DRAIN_MELEE_HEAVY
Определения constants.c:678
const int STAMINA_GAIN_IDLE_PER_SEC
Определения constants.c:687
const float STAMINA_GAIN_BONUS_CAP
Определения constants.c:691
const float STAMINA_JUMP_THRESHOLD
Определения constants.c:697
const float STAMINA_REGEN_COOLDOWN_EXHAUSTION
Определения constants.c:706
const int STAMINA_DRAIN_SWIM_FAST_PER_SEC
Определения constants.c:669
const int STAMINA_GAIN_WALK_PER_SEC
Определения constants.c:686
const int STAMINA_GAIN_JOG_PER_SEC
Определения constants.c:685
const float STAMINA_VAULT_THRESHOLD
Определения constants.c:698
const float STAMINA_MELEE_EVADE_THRESHOLD
Определения constants.c:704
const float STAMINA_HOLD_BREATH_THRESHOLD_ACTIVATE
Определения constants.c:695
const float STAMINA_MELEE_HEAVY_THRESHOLD
Определения constants.c:703
const int STAMINA_GAIN_ROLL_PER_SEC
Определения constants.c:690
const float STAMINA_DRAIN_JUMP
Определения constants.c:674
const float STAMINA_DRAIN_ROLL
Определения constants.c:680
const float STAMINA_DRAIN_MELEE_EVADE
Определения constants.c:679
const float STAMINA_REGEN_COOLDOWN_DEPLETION
Определения constants.c:705
const int STAMINA_DRAIN_STANDING_SPRINT_PER_SEC
Определения constants.c:666
const int STAMINA_DRAIN_CROUCHED_SPRINT_PER_SEC
Определения constants.c:667
const int STAMINA_DRAIN_LADDER_FAST_PER_SEC
Определения constants.c:670
const float STAMINA_DRAIN_VAULT
Определения constants.c:675
const int STAMINA_GAIN_SWIM_PER_SEC
Определения constants.c:688
const int STAMINA_GAIN_LADDER_PER_SEC
Определения constants.c:689
const float STAMINA_SYNC_RATE
Определения constants.c:709
float GetRunTime()
Определения tools.c:323
float GetDuration()
Определения tools.c:313
proto native int GetState()
returns one of STATE_...
Определения StaminaHandler.c:31
class HumanCommandWeapons HumanCommandAdditives()
Определения human.c:1112
class SHumanGlobalSettings SHumanCommandMoveSettings()
Определения humansettings.c:12