DayZ 1.28
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;
308 m_Time = 0;
309 m_StaminaDepleted = false;
310 m_IsInCooldown = false;
311 m_HumanMoveSettings = m_Player.GetDayZPlayerType().CommandMoveSettingsW();
312
315
317
318 //----------------- depletion --------------------
320 m_ActiveDepletionModifiers = new set<EStaminaMultiplierTypes>;
321
322 //----------------- recovery --------------------
324 m_ActiveRecoveryModifiers = new set<EStaminaMultiplierTypes>;
325
326 Init();
327 }
328
329
347
349 {
350 if (m_RegisteredDepletionModifiers.Contains(type))
351 {
352 m_ActiveDepletionModifiers.Insert(type);
354 }
355 else
356 {
357 Error("attempting to activate unregistered depletion modifier");
358 }
359 }
360
362 {
363 int index = m_ActiveDepletionModifiers.Find(type);
364 if (index != -1)
365 {
366 m_ActiveDepletionModifiers.Remove(index);
368 }
369 }
370
372 {
373 float value = 1;
374
375 foreach (int multiplier: m_ActiveDepletionModifiers)
376 {
377 value *= m_RegisteredDepletionModifiers.Get(multiplier);
378 }
379
380 if (value != m_StaminaDepletionMultiplier)
382 }
383
385 {
386 if (m_RegisteredRecoveryModifiers.Contains(type))
387 {
388 m_ActiveRecoveryModifiers.Insert(type);
390 }
391 else
392 {
393 Error("attempting to activate unregistered recovery modifier");
394 }
395 }
396
397
399 {
400 int index = m_ActiveRecoveryModifiers.Find(type);
401 if (index != -1)
402 {
403 m_ActiveRecoveryModifiers.Remove(index);
405 }
406 }
407
409 {
410 float value = 1;
411
412 foreach (int multiplier: m_ActiveRecoveryModifiers)
413 {
414 value *= m_RegisteredRecoveryModifiers.Get(multiplier);
415 }
416
417 if (value != m_StaminaRecoveryMultiplier)
418 {
420 }
421 }
422
423 void Update(float deltaT, int pCurrentCommandID)
424 {
425 #ifdef DIAG_DEVELOPER
426 if (m_StaminaDisabled)
427 return;
428 #endif
429
430 if (m_Player)
431 {
432 bool isServerOrSingleplayer = GetGame().IsServer() || !GetGame().IsMultiplayer();
433 // Calculates actual max stamina based on player's load
434 if (isServerOrSingleplayer)
435 {
437 m_PlayerLoad = m_Player.GetWeightEx();
438
441 {
443 }
444 else
445 {
447 }
448 }
449
450 // Calculates stamina gain/loss based on movement and load
451 m_Player.GetMovementState(m_State);
452
453 switch (m_State.m_CommandTypeId)
454 {
455 case DayZPlayerConstants.COMMANDID_MOVE:
457 break;
458 case DayZPlayerConstants.COMMANDID_LADDER:
460 break;
461 case DayZPlayerConstants.COMMANDID_SWIM:
463 break;
464 case DayZPlayerConstants.COMMANDID_FALL:
465 case DayZPlayerConstants.COMMANDID_MELEE2:
466 case DayZPlayerConstants.COMMANDID_CLIMB:
467 break;
468 default:
469 if (!m_IsInCooldown)
470 {
472 }
473 break;
474 }
475
476 //Sets current stamina & stores + syncs data with client
477 float temp = m_StaminaDelta * deltaT;
478 if (temp < 0)
479 {
481 }
482 else
483 {
485 }
486
489
490 if (isServerOrSingleplayer)
491 {
492 m_Player.GetStatStamina().Set(m_Stamina);
493 m_Time += deltaT;
494
496 {
497 m_Time = 0;
499 }
500 }
501
502 #ifndef SERVER
504 #endif
505
508
509 m_StaminaDelta = 0;
510 m_StaminaDepletion = 0; // resets depletion modifier
511
512 }
513 }
514
516 void OnRPC(float stamina, float stamina_cap, bool cooldown)
517 {
518 }
519
521 void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
522 {
523 switch ( pJunctureID )
524 {
526 float stamina;
527 float stamina_cap;
528 bool cooldown;
529
530 if (!pCtx.Read(stamina) || !pCtx.Read(stamina_cap) || !pCtx.Read(cooldown))
531 {
532 return;
533 }
534
535 m_Stamina = stamina; //?
536 m_StaminaSynced = stamina;
537
538 if (m_Player.GetInstanceType() != DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
539 {
540 return;
541 }
542
543 if ( stamina_cap != m_StaminaCap )
544 {
545 m_StaminaCap = stamina_cap;
546 }
547
548 m_IsInCooldown = cooldown;
549 m_Player.SetStamina(m_Stamina, m_StaminaCap);
550 break;
551
554 break;
555 }
556 }
557
558 protected void StaminaProcessor_Move(HumanMovementState pHumanMovementState)
559 {
560 switch (pHumanMovementState.m_iMovement)
561 {
562 case DayZPlayerConstants.MOVEMENTIDX_SPRINT: //sprint
563 if (pHumanMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT)
564 {
567 break;
568 }
569 else if ( pHumanMovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH)
570 {
573 break;
574 }
575
577 break;
578
579 case DayZPlayerConstants.MOVEMENTIDX_RUN: //jog
580 if (m_Player.GetCurrentWaterLevel() >= m_HumanMoveSettings.m_fWaterLevelSpeedRectrictionHigh)
581 {
583 break;
584 }
585
586 if (!m_IsInCooldown)
587 {
589 }
590 break;
591
592 case DayZPlayerConstants.MOVEMENTIDX_WALK: //walk
593 if (!m_IsInCooldown)
594 {
596 }
597 break;
598
599 case DayZPlayerConstants.MOVEMENTIDX_IDLE: //idle
600 if (m_Player.IsRolling())
601 {
603 break;
604 }
605
606 if (!m_IsInCooldown)
607 {
609 }
610 break;
611
612 default:
613 if (!m_IsInCooldown)
614 {
616 }
617 break;
618 }
619 }
620
621 protected void StaminaProcessor_Ladder(HumanMovementState pHumanMovementState)
622 {
623 switch (pHumanMovementState.m_iMovement)
624 {
625 case 2: //climb up (fast)
628 break;
629
630 case 1: //climb up (slow)
631 if (!m_IsInCooldown)
632 {
634 }
635 break;
636
637 default:
638 if (!m_IsInCooldown)
639 {
641 }
642 break;
643 }
644 }
645
646 protected void StaminaProcessor_Swimming(HumanMovementState pHumanMovementState)
647 {
648 switch (pHumanMovementState.m_iMovement)
649 {
650 case 3: //swim fast
653 break;
654
655
656 case 2: //swim slow
657 if (!m_IsInCooldown)
658 {
660 }
661 break;
662
663 default:
664 if (!m_IsInCooldown)
665 {
667 }
668 break;
669 }
670 }
671
673 protected void SyncStamina(float stamina, float stamina_cap, bool cooldown)
674 {
675 m_Player.GetStatStamina().Set(m_Stamina);
677 pCtx.Write(m_Stamina);
678 pCtx.Write(m_StaminaCap);
679 pCtx.Write(m_IsInCooldown);
680 m_Player.SendSyncJuncture(DayZPlayerSyncJunctures.SJ_STAMINA,pCtx);
681 }
682
685 {
687
689 pCtx.Write(p.param1);
690 pCtx.Write(p.param2);
691 m_Player.SendSyncJuncture(DayZPlayerSyncJunctures.SJ_STAMINA_MISC,pCtx);
692 }
693
696 {
697 float depletionMultiplier;
698 float recoveryMultiplier;
699 if (!pCtx.Read(depletionMultiplier) || !pCtx.Read(recoveryMultiplier))
700 {
701 return;
702 }
703
704 m_StaminaDepletionMultiplier = depletionMultiplier;
705 m_StaminaRecoveryMultiplier = recoveryMultiplier;
706 }
707
709 {
711
712 m_StaminaConsumers.RegisterConsumer(
713 EStaminaConsumers.HOLD_BREATH,
716 );
717 m_StaminaConsumers.RegisterConsumer(
718 EStaminaConsumers.SPRINT,
720 );
721 m_StaminaConsumers.RegisterConsumer(
724 );
725 m_StaminaConsumers.RegisterConsumer(
726 EStaminaConsumers.VAULT,
728 );
729 m_StaminaConsumers.RegisterConsumer(
730 EStaminaConsumers.CLIMB,
732 );
733 m_StaminaConsumers.RegisterConsumer(
734 EStaminaConsumers.MELEE_HEAVY,
736 );
737 m_StaminaConsumers.RegisterConsumer(
738 EStaminaConsumers.MELEE_EVADE,
740 );
741 m_StaminaConsumers.RegisterConsumer(
744 );
745 m_StaminaConsumers.RegisterConsumer(EStaminaConsumers.DROWN, 0);
746 m_StaminaConsumers.RegisterConsumer(EStaminaConsumers.PUSH, 0);
747 }
748
750 {
752
754 m_StaminaModifiers.RegisterExponentialEx(
755 EStaminaModifiers.HOLD_BREATH,
756 data,
757 );
758 m_StaminaModifiers.RegisterExponentialEx(
759 EStaminaModifiers.PUSH_CAR,
760 data,
761 );
762 m_StaminaModifiers.RegisterFixed(EStaminaModifiers.DROWN, 10);
763 m_StaminaModifiers.RegisterFixed(
766 );
767 m_StaminaModifiers.RegisterFixed(
768 EStaminaModifiers.VAULT,
770 );
771 m_StaminaModifiers.RegisterFixed(
772 EStaminaModifiers.CLIMB,
774 );
775 m_StaminaModifiers.RegisterFixed(
776 EStaminaModifiers.MELEE_LIGHT,
778 );
779 m_StaminaModifiers.RegisterFixed(
780 EStaminaModifiers.MELEE_HEAVY,
782 );
783 m_StaminaModifiers.RegisterFixed(
784 EStaminaModifiers.OVERALL_DRAIN,
786 5.0,
787 );
788 m_StaminaModifiers.RegisterRandomized(
789 EStaminaModifiers.MELEE_EVADE,
792 );
794 }
795
797 protected float CalcStaminaGainBonus()
798 {
799 if (m_StaminaDepletion > 0)
800 return 0;
801
802 if (m_Stamina > 25)
803 return Math.Min((m_Stamina/10),GameConstants.STAMINA_GAIN_BONUS_CAP); // exp version
804 else
805 return GameConstants.STAMINA_GAIN_BONUS_CAP; // linear version
806 }
807
808 protected void ApplyExhaustion()
809 {
811 HumanCommandAdditives ad = m_Player.GetCommandModifier_Additives();
812
813 float exhaustion_value = 1;
814 if (m_StaminaCap != 0)
815 {
816 exhaustion_value = 1 - ((m_Stamina / (m_StaminaCap * 0.01)) * 0.01);
817 }
818
819 exhaustion_value = Math.Min(1, exhaustion_value);
820 if (ad)
821 {
822 // do not apply exhaustion on local client if player is in ADS/Optics (camera shakes)
823 if (m_Player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT && (m_Player.IsInOptics() || m_Player.IsInIronsights()))
824 {
825 ad.SetExhaustion(0, true);
826 }
827 else
828 {
829 ad.SetExhaustion(exhaustion_value, true);
830 }
831 }
832 }
833
835 protected void CheckStaminaState()
836 {
837 if (m_Stamina <= 0)
838 {
839 m_StaminaDepleted = true;
841 if (!m_IsInCooldown)
842 {
843 // set this only once
845 }
846 }
847 else
848 {
849 m_StaminaDepleted = false;
850 }
851 }
852
854 protected void SetCooldown(float time, int modifier = -1)
855 {
856 if ( m_StaminaDepleted || m_Stamina <= 0.0 )
857 {
858 ResetCooldown(modifier);
859 return;
860 }
861
862 m_IsInCooldown = true;
863
864 Timer timer;
865 if (m_TimerMap.Find(modifier, timer) && timer.IsRunning())
866 {
867 timer.Stop();
868 }
869 else
870 {
871 timer = new Timer;
872 m_TimerMap.Set(modifier,timer);
873 }
874 timer.Run(time, this, "ResetCooldown", new Param1<int>( modifier ));
875 //Print(m_TimerMap.Count());
876 }
877
878 protected void ResetCooldown(int modifier = -1)
879 {
880 StaminaModifier sm = m_StaminaModifiers.GetModifierData(modifier);
881 if (sm)
882 {
883 //Print(modifier);
884 //Error("Error: No StaminaModifier found! | StaminaHandler | ResetCooldown");
885 sm.SetStartTime(-1);
886 sm.ResetRunTime();
887 sm.SetInUse(false);
888 }
889 m_IsInCooldown = false;
890 }
891
893 {
894
895 }
896
897 // ---------------------------------------------------
899 {
900 return m_StaminaConsumers.HasEnoughStaminaFor(consumer, m_StaminaSynced, m_StaminaDepleted, m_StaminaCap);
901 }
902
904 {
905 return m_StaminaConsumers.HasEnoughStaminaToStart(consumer, m_StaminaSynced, m_StaminaDepleted, m_StaminaCap);
906 }
907
908 void SetStamina(float stamina_value)
909 {
910 m_Stamina = Math.Clamp(stamina_value, 0, CfgGameplayHandler.GetStaminaMax());
912 }
913
915 {
916 return m_Stamina;
917 }
918
920 {
921 return m_Stamina / GetStaminaMax();
922 }
923
925 {
926 return m_StaminaSynced;
927 }
928
930 {
931 return GetSyncedStamina() / GetStaminaMax();
932 }
933
935 {
936 return m_StaminaCap;
937 }
938
940 {
942 }
943
944 //obsolete, use ActivateDepletionModifier/DeactivateDepletionModifier instead
952 //obsolete, use ActivateRecoveryModifier/DeactivateRecoveryModifier instead
960
965
967 {
969 }
970
971 void DepleteStaminaEx(EStaminaModifiers modifier, float dT = -1, float coef = 1.0)
972 {
973 #ifdef DIAG_DEVELOPER
974 if (m_StaminaDisabled)
975 return;
976 #endif
977 float val = 0.0;
978 float current_time = m_Player.GetSimulationTimeStamp();
979 float valueProgress;
980 StaminaModifier sm = m_StaminaModifiers.GetModifierData(modifier);
981
982 // select by modifier type and drain stamina
983 switch (sm.GetType())
984 {
985 case m_StaminaModifiers.FIXED:
986 if (dT == -1)
987 {
988 dT = 1;
989 }
990 m_StaminaDepletion += sm.GetMaxValue() * dT * coef;
991
992 break;
993
994 case m_StaminaModifiers.RANDOMIZED:
995 val = Math.RandomFloat(sm.GetMinValue(), sm.GetMaxValue());
996 m_StaminaDepletion += val * coef;
997
998 break;
999
1000 case m_StaminaModifiers.LINEAR:
1001 if (!sm.IsInUse())
1002 {
1003 sm.SetStartTime(current_time + sm.GetStartTimeAdjustment()/dT);
1004 sm.SetRunTimeTick(dT);
1005 sm.SetInUse(true);
1006 }
1007 valueProgress = Math.Clamp((current_time - sm.GetStartTime())/sm.GetDurationAdjusted(), 0, 1 );
1008 val = Math.Lerp(sm.GetMinValue(), sm.GetMaxValue(), valueProgress);
1009 m_StaminaDepletion += val * coef;
1010
1011 break;
1012
1013 case m_StaminaModifiers.EXPONENTIAL:
1015 if (!Class.CastTo(smex,sm))
1016 {
1017 ErrorEx("StaminaModifierExponential not found for modifier type: " + sm.GetType());
1018 break;
1019 }
1020
1021 if (!smex.IsInUse())
1022 {
1023 smex.SetStartTime(current_time + smex.GetStartTimeAdjustment()/dT);
1024 smex.SetRunTimeTick(dT);
1025 smex.SetInUse(true);
1026 }
1027 valueProgress = Math.Clamp((current_time - smex.GetStartTime())/smex.GetDurationAdjusted(), 0, 1 );
1028 float exp;
1029 if (Math.AbsFloat(smex.GetBaseValue()) < 1)
1030 {
1031 exp = 1 - Math.Lerp(0, smex.GetExponent(), valueProgress);
1032 val = Math.Pow(smex.GetBaseValue(),exp);
1033 }
1034 else
1035 {
1036 exp = Math.Lerp(Math.Min(0, smex.GetExponent()), Math.Max(0, smex.GetExponent()), valueProgress);
1037 val = Math.Pow(smex.GetBaseValue(),exp) + smex.GetBaseValue() - 1;
1038 }
1039
1040 m_StaminaDepletion += val * smex.GetMultiplier() * coef;
1041
1042 break;
1043 }
1044
1046 SetCooldown(sm.GetCooldown(),modifier);
1047
1050 }
1051
1052 #ifdef DIAG_DEVELOPER
1053 void SetStaminaDisabled(bool value)
1054 {
1055 m_StaminaDisabled = value;
1056 }
1057 #endif
1058
1060 //Deprecated code playpen//
1063 void DepleteStamina(EStaminaModifiers modifier, float dT = -1)
1064 {
1065 DepleteStaminaEx(modifier,dT);
1066 }
1067}
eBleedingSourceType m_Type
eBleedingSourceType GetType()
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
int m_iMovement
current stance (DayZPlayerConstants.STANCEIDX_ERECT, ...), only if the command has a stance
Определения human.c:1155
int m_iStanceIdx
current command's id
Определения human.c:1154
Определения human.c:1152
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
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:330
Timer GetCooldownTimer(int modifier)
Определения StaminaHandler.c:892
void StaminaProcessor_Ladder(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:621
void RegisterStaminaModifiers()
Определения StaminaHandler.c:749
ref HumanMovementState m_State
Определения StaminaHandler.c:272
void StaminaProcessor_Swimming(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:646
float GetDepletionMultiplier()
Определения StaminaHandler.c:961
void RecalculateRecoveryMultiplier()
Определения StaminaHandler.c:408
void DepleteStamina(EStaminaModifiers modifier, float dT=-1)
Deprecated.
Определения StaminaHandler.c:1063
void DepleteStaminaEx(EStaminaModifiers modifier, float dT=-1, float coef=1.0)
Определения StaminaHandler.c:971
void SetDepletionMultiplier(float val)
Определения StaminaHandler.c:945
void SetRecoveryMultiplier(float val)
Определения StaminaHandler.c:953
float m_StaminaRecoveryMultiplier
Определения StaminaHandler.c:269
float GetStaminaCap()
Определения StaminaHandler.c:934
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:684
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:521
void CheckStaminaState()
check if the stamina is completely depleted
Определения StaminaHandler.c:835
ref map< int, ref Timer > m_TimerMap
Определения StaminaHandler.c:279
float GetStaminaMax()
Определения StaminaHandler.c:939
void DeactivateRecoveryModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:398
void RegisterStaminaConsumers()
Определения StaminaHandler.c:708
bool HasEnoughStaminaFor(EStaminaConsumers consumer)
Определения StaminaHandler.c:898
void StaminaHandler(PlayerBase player)
Определения StaminaHandler.c:295
bool m_Debug
Определения StaminaHandler.c:276
PlayerBase m_Player
Определения StaminaHandler.c:274
float GetRecoveryMultiplier()
Определения StaminaHandler.c:966
float GetStamina()
Определения StaminaHandler.c:914
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:516
void ApplyExhaustion()
Определения StaminaHandler.c:808
float GetSyncedStamina()
Определения StaminaHandler.c:924
float CalcStaminaGainBonus()
Calulates stamina regain bonus coef based on current stamina cap and level.
Определения StaminaHandler.c:797
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:371
void StaminaProcessor_Move(HumanMovementState pHumanMovementState)
Определения StaminaHandler.c:558
float GetStaminaNormalized()
Определения StaminaHandler.c:919
float GetSyncedStaminaNormalized()
Определения StaminaHandler.c:929
void DeactivateDepletionModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:361
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:903
void SetCooldown(float time, int modifier=-1)
set cooldown timer between each consume of stamina
Определения StaminaHandler.c:854
void SetStamina(float stamina_value)
Определения StaminaHandler.c:908
void ReadAdditionalStaminaInfo(ParamsReadContext pCtx)
Order of read parameters must match the order of writing above.
Определения StaminaHandler.c:695
bool m_IsInCooldown
Определения StaminaHandler.c:286
ref StaminaConsumers m_StaminaConsumers
Определения StaminaHandler.c:288
void ActivateDepletionModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:348
SHumanCommandMoveSettings m_HumanMoveSettings
Определения StaminaHandler.c:273
void ResetCooldown(int modifier=-1)
Определения StaminaHandler.c:878
void SyncStamina(float stamina, float stamina_cap, bool cooldown)
stamina sync - server part
Определения StaminaHandler.c:673
ref map< EStaminaMultiplierTypes, float > m_RegisteredRecoveryModifiers
Определения StaminaHandler.c:283
void ActivateRecoveryModifier(EStaminaMultiplierTypes type)
Определения StaminaHandler.c:384
ref map< EStaminaMultiplierTypes, float > m_RegisteredDepletionModifiers
Определения StaminaHandler.c:280
void Update(float deltaT, int pCurrentCommandID)
Определения StaminaHandler.c:423
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
Определения 3_Game/constants.c:678
const float STAMINA_HOLD_BREATH_THRESHOLD_DRAIN
Определения 3_Game/constants.c:698
const float STAMINA_DRAIN_MELEE_LIGHT
Определения 3_Game/constants.c:679
const float STAMINA_KG_TO_GRAMS
in grams (weight where the player is not penalized by stamina)
Определения 3_Game/constants.c:710
const float STAMINA_ROLL_THRESHOLD
Определения 3_Game/constants.c:702
const float STAMINA_CLIMB_THRESHOLD
Определения 3_Game/constants.c:701
const float STAMINA_DRAIN_MELEE_HEAVY
Определения 3_Game/constants.c:680
const int STAMINA_GAIN_IDLE_PER_SEC
Определения 3_Game/constants.c:689
const float STAMINA_GAIN_BONUS_CAP
Определения 3_Game/constants.c:693
const float STAMINA_JUMP_THRESHOLD
Определения 3_Game/constants.c:699
const float STAMINA_REGEN_COOLDOWN_EXHAUSTION
Определения 3_Game/constants.c:708
const int STAMINA_DRAIN_SWIM_FAST_PER_SEC
Определения 3_Game/constants.c:671
const int STAMINA_GAIN_WALK_PER_SEC
Определения 3_Game/constants.c:688
const int STAMINA_GAIN_JOG_PER_SEC
Определения 3_Game/constants.c:687
const float STAMINA_VAULT_THRESHOLD
Определения 3_Game/constants.c:700
const float STAMINA_MELEE_EVADE_THRESHOLD
Определения 3_Game/constants.c:706
const float STAMINA_HOLD_BREATH_THRESHOLD_ACTIVATE
Определения 3_Game/constants.c:697
const float STAMINA_MELEE_HEAVY_THRESHOLD
Определения 3_Game/constants.c:705
const int STAMINA_GAIN_ROLL_PER_SEC
Определения 3_Game/constants.c:692
const float STAMINA_DRAIN_JUMP
Определения 3_Game/constants.c:676
const float STAMINA_DRAIN_ROLL
Определения 3_Game/constants.c:682
const float STAMINA_DRAIN_MELEE_EVADE
Определения 3_Game/constants.c:681
const float STAMINA_REGEN_COOLDOWN_DEPLETION
Определения 3_Game/constants.c:707
const int STAMINA_DRAIN_STANDING_SPRINT_PER_SEC
Определения 3_Game/constants.c:668
const int STAMINA_DRAIN_CROUCHED_SPRINT_PER_SEC
Определения 3_Game/constants.c:669
const int STAMINA_DRAIN_LADDER_FAST_PER_SEC
Определения 3_Game/constants.c:672
const float STAMINA_DRAIN_VAULT
Определения 3_Game/constants.c:677
const int STAMINA_GAIN_SWIM_PER_SEC
Определения 3_Game/constants.c:690
const int STAMINA_GAIN_LADDER_PER_SEC
Определения 3_Game/constants.c:691
const float STAMINA_SYNC_RATE
Определения 3_Game/constants.c:711
float GetRunTime()
Определения 3_Game/tools/tools.c:323
float GetDuration()
Определения 3_Game/tools/tools.c:313
proto native int GetState()
returns one of STATE_...
Определения StaminaHandler.c:31
class HumanCommandWeapons HumanCommandAdditives()
Определения human.c:1125
class SHumanGlobalSettings SHumanCommandMoveSettings()
Определения humansettings.c:12