DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
DayZPlayerImplement.c
См. документацию.
1/*
2DayZPlayerImplement
3
4this file is implemenation of dayzPlayer in script
5- logic of movement
6- camera switching logic
7
8*/
9
11{
12 //----------------------------------
13 // callbacks
14
15 override void OnSimulationEnd()
16 {
17 m_pPlayer.DeathDropHandEntity();
18 }
19
21 {
22 return m_pPlayer.m_WasInVehicle == false;
23 }
24
26}
27
28class DayZPlayerVehicleCommandDeathCallback : HumanCommandDeathCallback
29{
30 override void OnSimulationEnd()
31 {
32 m_pPlayer.PhysicsEnableGravity(true);
33 }
34
35 PlayerBase m_pPlayer;
36}
37
38class DeathEffectTimer extends Timer
40 override void Stop()
41 {
42 super.Stop();
43
44 PPERequesterBank.GetRequester(PPERequester_DeathDarkening).Stop();
45 }
46};
47
48#ifdef FEATURE_NETWORK_RECONCILIATION
49
50class DayZPlayerImplementOwnerState : DayZPlayerOwnerState
51{
52 float m_fLastHeadingDiff;
53
54 protected override event void Write(PawnStateWriter ctx)
55 {
56 super.Write(ctx);
57
58 ctx.Write(m_fLastHeadingDiff);
59 }
60
61 protected override event void Read(PawnStateReader ctx)
62 {
63 super.Read(ctx);
64
65 ctx.Read(m_fLastHeadingDiff);
66 }
67};
68
69class DayZPlayerImplementMove : DayZPlayerMove
70{
71 protected override event void Write(PawnMoveWriter ctx, PawnMove prev)
72 {
73 super.Write(ctx, prev);
74
75 }
76
77 protected override event void Read(PawnMoveReader ctx, PawnMove prev)
78 {
79 super.Read(ctx, prev);
80
81 }
82};
83
84#endif
85
87{
88 static const float DEFAULT_DYING_TIME = 2.5;
89 static const float DYING_PROGRESSION_TIME = 0.05;
90
91
103 protected float m_FallYDiff;
104 protected float m_SprintedTime;
106 protected bool m_SprintFull;
107 protected bool m_IsRaised;
108 protected bool m_ShouldReload;
109 protected bool m_Camera3rdPerson;
110 protected bool m_CameraZoomToggle;
111 protected bool m_bADS;
112 private float m_WeaponRaiseTime;
115 protected bool m_CameraIronsight; // Ironsight NOW!
116 protected bool m_CameraOptics; // Optics NOW!
117 protected bool m_CameraOpticsAimOverride; // for tracking if aim limit is currently overriden by optics
118
120 protected bool m_IsTryingHoldBreath;
122 protected bool m_PlayerSelected;
123 protected bool m_Suicide;
124 protected bool m_IsUnconscious;
125 protected bool m_ShouldBeUnconscious;
130 ref DeathEffectTimer m_DeathEffectTimer;
134 protected bool m_LiftWeapon_player;
135 protected float m_ObstructWeapon_player;
136 protected bool m_ProcessLiftWeapon;
138 protected float m_ProcessObstructWeapon;
141 protected string m_ClimbingLadderType;
143 protected bool m_HandheldOpticsInUse;
144 protected bool m_ResetADS;
145 protected bool m_ProcessResetADS;
146 protected int m_StepCounter;
147 protected int m_StepCounterVegetation // TMP; optimization of vegetation, collision sound playback
148 protected int m_NextVoNNoiseTime;
151
152 // aiming model helpers
153 protected bool m_RaiseStarted = false;
154 protected bool m_AimingFinisherStarted = false;
155 protected bool m_IsWeapon;
156
157 private float m_CurrentWaterLevel;
158
164
165 protected float m_dT;
167
168 protected float m_fObstructionSmooth;
170
173 {
174 SetEventMask(EntityEvent.CONTACT);
175
176 m_SprintFull = false;
177 m_SprintedTime = 0;
187 m_bADS = false;
189 SetOptics(false);
193 #ifdef PLATFORM_CONSOLE
194 m_Camera3rdPerson = g_Game.GetWorld().GetThirdPersonViewMode() == ThirdPersonMode.ENABLED;
195 #endif
196 m_LastSurfaceUnderHash = ("cp_gravel").Hash();
202
203 m_CachedEquipmentStorage = CachedEquipmentStorage(this);
205
206 RegisterNetSyncVariableBoolSignal("m_TriggerPullPlayerOutOfVehicleSynch");
207 }
208
209#ifdef FEATURE_NETWORK_RECONCILIATION
210 protected override event typename GetOwnerStateType()
211 {
212 return DayZPlayerImplementOwnerState;
213 }
214
215 protected override event typename GetMoveType()
216 {
217 return DayZPlayerImplementMove;
218 }
219
220 protected override event void ObtainState(/*inout*/ PawnOwnerState pState)
221 {
222 super.ObtainState(pState);
223
224 DayZPlayerImplementOwnerState state = DayZPlayerImplementOwnerState.Cast(pState);
225
226 state.m_fLastHeadingDiff = m_fLastHeadingDiff;
227 }
228
229 protected override event void RewindState(PawnOwnerState pState, /*inout*/ PawnMove pMove, inout NetworkRewindType pRewindType)
230 {
231 super.RewindState(pState, pMove, pRewindType);
232
233 DayZPlayerImplementOwnerState state = DayZPlayerImplementOwnerState.Cast(pState);
234
235 if (pRewindType != NetworkRewindType.ADDITIVE)
236 {
237 m_fLastHeadingDiff = state.m_fLastHeadingDiff;
238 }
239 }
240#endif
241
246
251
256
261
266
268 {
269 }
270
272 override bool IsEyeZoom()
273 {
274 return GetEyeZoomLevel() > 0;
275 }
276
277 override int GetEyeZoomLevel()
278 {
280 }
281
282 override bool IsShootingFromCamera()
283 {
285 }
286
287 void OverrideShootFromCamera(bool pState)
288 {
289 m_IsShootingFromCamera = pState;
290 }
291
293 {
294 return m_CameraIronsight;
295 }
296
298 {
299 return m_CameraOptics;
300 }
301
302 override bool IsInThirdPerson()
303 {
304 return m_Camera3rdPerson;
305 }
306
307 void SetIsInThirdPerson(bool state)
308 {
309 m_Camera3rdPerson = state;
310 }
311
313 {
314 GetMovementState(m_MovementState);
315 if (m_MovementState)
316 return m_MovementState.IsRaised();
317
318 return false;
319 }
320
322 {
324 }
325
327 {
328 return m_SprintFull;
329 }
330
331 void ShowWeaponDebug(bool show)
332 {
333 if (show)
334 {
336 }
337 else
338 {
339 m_WeaponDebug = null;
340 }
341 }
342
344 {
345 return m_WeaponDebug != null;
346 }
347
348 void SetFallYDiff(float value)
349 {
350 m_FallYDiff = value;
351 }
352
353 override float GetCurrentWaterLevel()
354 {
355 return m_CurrentWaterLevel;
356 }
357
358 override void SetCurrentWaterLevel(float pWaterLevel)
359 {
360 m_CurrentWaterLevel = pWaterLevel;
361 }
362
363 void SetIronsights(bool value)
364 {
365 Weapon_Base weapon = Weapon_Base.Cast(GetEntityInHands());
366 if (weapon)
367 weapon.SetWasIronSight(m_CameraIronsight);
368
369 m_CameraIronsight = value;
370
371 if (value)
372 {
373 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
374 if (hcw)
375 hcw.SetADS(true);
376
377 HumanInputController hic = GetInputController();
378 if (hic)
380 }
381 }
382
383 void SetOptics(bool value)
384 {
385 m_CameraOptics = value;
386
387 if (value)
388 {
389 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
390 if (hcw)
392
393 HumanInputController hic = GetInputController();
394 if (hic)
396 }
397 }
398
400 {
401 ItemOptics optics = null;
402 EntityAI entityInHands = GetEntityInHands();
403 Weapon weapon = Weapon.Cast(entityInHands);
404 if (weapon)
405 {
406 optics = weapon.GetAttachedOptics();
407 }
408 else
409 {
410 optics = ItemOptics.Cast(entityInHands);
411 }
412
413 SetIronsights(false);
414 SetOptics(false);
415
416 if (optics)
417 {
418 SwitchOptics(optics,false);
419 }
420
421 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
422 if (hcw)
423 {
424 hcw.SetADS(false);
425 }
426 }
427
428 void SwitchOptics(ItemOptics optic, bool state)
429 {
430 if (optic && !optic.IsSightOnly())
431 {
432 if (state)
433 {
434 if (optic.HasEnergyManager())
435 optic.GetCompEM().SwitchOn();
436
437 optic.EnterOptics();
438 optic.OnOpticEnter();
439 }
440 else
441 {
442 optic.ExitOptics();
443 optic.OnOpticExit();
444 if (optic.HasEnergyManager())
445 optic.GetCompEM().SwitchOff();
446 }
447 }
448
449 if (m_CameraOptics != state)
450 {
451 SetOptics(state);
452 }
453 }
454
455 void SetClimbingLadderType(string value)
456 {
457 m_ClimbingLadderType = value;
458 }
459
462 void DepleteStaminaEx(EStaminaModifiers modifier, float dT = -1, float coef = 1.0);
464 {
465 return CachedEquipmentStorage.Cast(m_CachedEquipmentStorage);
466 }
467
469 {
470 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_VEHICLE || (GetParent() != null && GetParent().IsInherited(Transport));
471 }
472
474 {
475 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_SWIM;
476 }
477
479 {
480 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_LADDER;
481 }
482
484 bool PlaySoundEventType(ESoundEventType soundType, int soundEventID, int param = 0) {};
485 bool PlaySoundEvent(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false) {};
486 bool PlaySoundEventEx(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false, int param = 0) {};
487 bool StopSoundEvent(EPlayerSoundEventID id, bool is_from_server = false, int param = 0) {};
488
490 {
492 }
493
494 float GetDeltaT()
495 {
496 return m_dT;
497 }
498
499 //-------------------------------------------------------------
503
505 float m_DeathHitDir = 0;
506 bool m_DeathJuctureSent = false;
507
513
514 override string GetDebugText()
515 {
516 string text = super.GetDebugText();
517 text += "Parent: " + Object.GetDebugName(Object.Cast(GetParent())) + "\n";//keep
518 text += "IsSimulationDisabled: " + GetIsSimulationDisabled() + "\n";//keep
519 /*
520 text += "DamageDestroyed: " + IsDamageDestroyed() + "\n";
521 text += "DeathProcessed: " + IsDeathProcessed() + "\n";
522 text += "DeathConditionMet: " + IsDeathConditionMet() + "\n";
523 text += "PullOutOfVehicleState: " + m_PullPlayerOutOfVehicleState + "\n";
524 text += "PullOutOfVehicleSynch: " + m_TriggerPullPlayerOutOfVehicleSynch + "\n";
525 text += "Position: " + GetPosition() + "\n";*/
526 return text;
527 }
528
530 {
531 if (!g_Game.IsServer())
532 {
533 return;
534 }
535
536 Transport transport;
537 if (!Class.CastTo(transport, GetParent()))
538 {
539 return;
540 }
541
542 int crewIdx = -1;
543 for (int i = 0; i < transport.CrewSize(); ++i)
544 {
545 if (transport.CrewMember(i) == this)
546 {
547 crewIdx = i;
548 break;
549 }
550 }
551
552 if (crewIdx == -1)
553 {
554 return;
555 }
556
557 transport.CrewGetOut(crewIdx);
559
560 if (crewIdx == DayZPlayerConstants.VEHICLESEAT_DRIVER)
561 {
563
564#ifdef FEATURE_NETWORK_RECONCILIATION
565 PlayerIdentity identity = GetIdentity();
566
567 if (identity)
568 {
570 identity.Possess(this);
571 }
572#endif
573 }
574
575 SetSynchDirty();
576 }
577
579 {
582
584 DisableSimulation(false);
585
586 switch (GetInstanceType())
587 {
588 case DayZPlayerInstanceType.INSTANCETYPE_SERVER:
589 case DayZPlayerInstanceType.INSTANCETYPE_CLIENT:
590 case DayZPlayerInstanceType.INSTANCETYPE_AI_SERVER:
591 case DayZPlayerInstanceType.INSTANCETYPE_AI_SINGLEPLAYER:
594 break;
595 }
596 }
597
599 {
600 if (m_TriggerPullPlayerOutOfVehicleSynch && !g_Game.IsDedicatedServer())
601 {
603 }
604
605 super.OnVariablesSynchronized();
606 }
607
609 {
610 if (!g_Game.IsServer())
611 {
612 return;
613 }
614
615#ifdef ENABLE_LOGGING
617 {
618 syncDebugPrint("DZPI::OnSimulationEnd - trying to drop item");
619 }
620#endif
621
622 EntityAI itemInHands = GetEntityInHands();
623 if (!itemInHands)
624 {
625 return;
626 }
627
628 int boneIndex = GetBoneIndexByName("RightHand_Dummy");
629
630 vector m4[4];
631 GetBoneTransformWS(boneIndex, m4);
632
633 // TODO(kumarjac): Change to occur on the earlier event and drop with physics instead?
634 // aside from dynamic lifetime of entities being too low, physics is stable now.
635 GetInventory().DropEntityWithTransform(InventoryMode.SERVER, this, itemInHands, m4);
636
637 CEApi ceApi = GetCEApi();
638 if (ceApi)
639 {
640 int deadBodyLifetime = ceApi.GetCEGlobalInt("CleanupLifetimeDeadPlayer");
641 if (deadBodyLifetime <= 0)
642 {
643 deadBodyLifetime = 3600;
644 }
645
646 itemInHands.SetLifetime(deadBodyLifetime);
647 }
648 }
649
650 bool HandleDeath(int pCurrentCommandID)
651 {
652 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_DEATH)
653 {
655 {
656 case -1:
657 break;
658 case 0:
660
661 PhysicsSetSolid(true);
662
664 DayZPlayerVehicleCommandDeathCallback callbackVeh;
665 Class.CastTo(callbackVeh, StartCommand_Death(DayZPlayerConstants.DEATH_PULL_OUT_TRANSPORT, 0, DayZPlayerVehicleCommandDeathCallback, m_PullPlayerOutOfVehicleKeepsInLocalSpace));
666 Class.CastTo(callbackVeh.m_pPlayer, this);
667 break;
668 }
669
670 return true;
671 }
672
673 if (m_DeathAnimType != -2 && g_Game.GetMissionState() == g_Game.MISSION_STATE_GAME)
674 {
675 if (!CommitedSuicide())
676 {
677 int type = m_DeathAnimType;
678 if (type == DayZPlayerConstants.DEATH_DEFAULT)
679 type = GetTypeOfDeath(pCurrentCommandID);
680
681 m_WasInVehicle = false;
682 HumanCommandVehicle hcv = GetCommand_Vehicle();
683 if (hcv)
684 {
686 m_WasInVehicle = !hcv.IsGettingIn() && !hcv.IsGettingOut();
687 }
688
689 int seatIndex = -1;
691 {
692 seatIndex = m_TransportCache.CrewMemberIndex(this);
693 }
694
696 m_ShouldBeUnconscious = false;
697
698 bool keepInLocalSpace = m_PullPlayerOutOfVehicleKeepsInLocalSpace;
700 {
701 if (IsUnconscious() || m_WasInVehicle)
702 {
703 keepInLocalSpace = true;
704 m_TransportCache.CrewDeath(seatIndex);
705 }
706 else
707 {
708 m_TransportCache.CrewGetOut(seatIndex);
709 }
710
711 m_TransportCache.MarkCrewMemberDead(seatIndex);
712
713 if (seatIndex == DayZPlayerConstants.VEHICLESEAT_DRIVER)
714 {
716
717#ifdef FEATURE_NETWORK_RECONCILIATION
718 PlayerIdentity identity = GetIdentity();
719
720 if (identity)
721 {
723 identity.Possess(this);
724 }
725#endif
726 }
727
728 Motorbike motorbike = Motorbike.Cast(m_TransportCache);
729 if (motorbike)
730 {
731 motorbike.FallOver();
732 }
733 }
734
735 DisableSimulation(false);
736 GetItemAccessor().HideItemInHands(false);
737 m_TransportCache = null;
738
740 Class.CastTo(callback, StartCommand_Death(type, m_DeathHitDir, DayZPlayerCommandDeathCallback, keepInLocalSpace));
741 Class.CastTo(callback.m_pPlayer, this);
742 }
743 else
744 {
745 PhysicsSetSimpleDeath(true);
746 }
747
748 // disable voice communication
749 g_Game.GetWorld().SetVoiceOn(false, false);
750
751 return true;
752 }
753
754 return false;
755 }
756
758 {
760 }
761
762 int GetTypeOfDeath(int pCurrentCommandID)
763 {
764 switch (pCurrentCommandID)
765 {
766 case DayZPlayerConstants.COMMANDID_SWIM:
767 return DayZPlayerConstants.DEATH_WATER;
768 case DayZPlayerConstants.COMMANDID_FALL:
769 return DayZPlayerConstants.DEATH_FALL;
770 case DayZPlayerConstants.COMMANDID_UNCONSCIOUS:
771 HumanCommandUnconscious hcu = GetCommand_Unconscious();
772 if (hcu)
773 {
774 if (hcu.IsOnLand())
775 return DayZPlayerConstants.DEATH_UNCON_ON_LAND;
776 if (hcu.IsInWater())
777 return DayZPlayerConstants.DEATH_UNCON_IN_WATER;
778 }
779
780 break;
781 }
782
783 return DayZPlayerConstants.DEATH_BODY;
784 }
785
786 void SendDeathJuncture(int pAnimTypeDeath, float pAnimHitDirDeath)
787 {
789 return;
790
791 DayZPlayerSyncJunctures.SendDeath(this, pAnimTypeDeath, pAnimHitDirDeath);
792 m_DeathJuctureSent = true;
793 }
794
795 override void EEKilled(Object killer)
796 {
797 SendDeathJuncture(-1, 0);
798
799 super.EEKilled(killer);
800 }
801
802 void ShowDeadScreen(bool show, float duration)
803 {
804 #ifndef NO_GUI
805 if (show && IsPlayerSelected())
806 {
807 #ifdef PLATFORM_PS4
809 #endif
810
811 string message = "";
812 if (!g_Game.GetMission().IsPlayerRespawning())
813 {
814 message = "#dayz_implement_dead";
815 }
816
817 #ifdef PLATFORM_CONSOLE
818 g_Game.GetUIManager().ScreenFadeIn(duration, message, FadeColors.DARK_RED, FadeColors.WHITE);
819 #else
820 g_Game.GetUIManager().ScreenFadeIn(duration, message, FadeColors.BLACK, FadeColors.WHITE);
821 #endif
822 }
823 else
824 {
825 g_Game.GetUIManager().ScreenFadeOut(duration);
826
827 if (duration > 0)
828 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(StopDeathDarkeningEffect, duration*1000, false);
829 else
831 }
832 #endif
833 }
834
836 {
837 if (m_DeathEffectTimer && m_DeathEffectTimer.IsRunning())
838 {
839 m_DeathEffectTimer.Stop();
840 m_DeathEffectTimer = null;
841 }
842 }
843
844 void SimulateDeath(bool state)
845 {
846 if (g_Game.GetMissionState() != DayZGame.MISSION_STATE_GAME)
847 return;
848
849 LockControls(state);
850
851 if (state)
852 {
853 float duration = DEFAULT_DYING_TIME;
854 if (m_KilledByHeadshot)
855 {
856 duration = 0;
857 }
858
859 if (duration > DYING_PROGRESSION_TIME && !m_IsUnconscious)
860 {
862 m_DeathEffectTimer = new DeathEffectTimer();
863
865 m_DeathEffectTimer.Run(DYING_PROGRESSION_TIME, this, "SetDeathDarknessLevel", par, true);
866 }
867
868 ShowDeadScreen(state, duration);
869
870 g_Game.GetSoundScene().SetSoundVolume(0,0);
871 g_Game.GetSoundScene().SetSpeechExVolume(0,0);
872 g_Game.GetSoundScene().SetMusicVolume(0,0);
873 g_Game.GetSoundScene().SetVOIPVolume(0,0);
874 g_Game.GetSoundScene().SetRadioVolume(0,0);
875 }
876 else
877 {
879 ShowDeadScreen(state, 0);
880 }
881 }
882
883 void LockControls(bool state)
884 {
885 if (state == true)
886 {
887 g_Game.GetInput().ChangeGameFocus(1, INPUT_DEVICE_MOUSE);
888 g_Game.GetInput().ChangeGameFocus(1, INPUT_DEVICE_KEYBOARD);
889 g_Game.GetInput().ChangeGameFocus(1, INPUT_DEVICE_GAMEPAD);
890
891 if (g_Game.GetUIManager())
892 {
893 g_Game.GetUIManager().ShowUICursor(true);
894 if (g_Game.GetUIManager().IsDialogVisible())
895 g_Game.GetUIManager().CloseDialog();
896 }
897 }
898 else
899 {
900 g_Game.GetInput().ChangeGameFocus(-1, INPUT_DEVICE_MOUSE);
901 g_Game.GetInput().ChangeGameFocus(-1, INPUT_DEVICE_KEYBOARD);
902 g_Game.GetInput().ChangeGameFocus(-1, INPUT_DEVICE_GAMEPAD);
903
904 if (g_Game.GetUIManager())
905 {
906 if (g_Game.GetUIManager().GetMenu())
907 {
908 g_Game.GetUIManager().ShowUICursor(true);
909 }
910 else
911 {
912 g_Game.GetUIManager().ShowUICursor(false);
913 }
914 }
915 }
916 }
917
918 void SetDeathDarknessLevel(float duration, float tick_time);
919
921 {
924 HumanInputController hic = GetInputController();
925 if (hic)
927 }
928
930 {
933 }
934
936 {
938 }
939
941 {
942 DayZPlayerInventory inv = DayZPlayerInventory.Cast(GetInventory());
943 return inv;
944 }
945
947 {
948 int userDataType = 0;
949 if (!ctx.Read(userDataType))
950 {
951 Error("DayZPlayer: OnInputForRemote - cannot read input type");
952 return;
953 }
954
955 switch (userDataType)
956 {
958 GetDayZPlayerInventory().OnEventForRemoteWeapon(ctx);
959 break;
961 GetDayZPlayerInventory().OnHandEventForRemote(ctx);
962 break;
964 GetDayZPlayerInventory().OnInputUserDataForRemote(ctx);
965 break;
966 default:
967 Error("OnInputForRemote - unknown userDataType=" + userDataType);
968 break;
969 }
970 }
971
973 {
974 int userDataType = 0;
975 if (!ctx.Read(userDataType))
976 {
977 Error("DayZPlayer: OnInputFromServer - cannot read input type");
978 return;
979 }
980
981 switch (userDataType)
982 {
984 GetDayZPlayerInventory().OnServerInventoryCommand(ctx);
985 break;
986 default:
987 Error("OnInputFromServer - unknown userDataType=" + userDataType);
988 break;
989 }
990 }
991 void RequestSoundEvent(EPlayerSoundEventID id, bool from_server_and_client = false);
992 void RequestSoundEventEx(EPlayerSoundEventID id, bool from_server_and_client = false, int param = 0);
993 void RequestSoundEventStop(EPlayerSoundEventID id, bool from_server_and_client = false, int param = EPlayerSoundEventParam.STOP_PLAYBACK);
995 protected void SendSoundEventEx(EPlayerSoundEventID id, int param = 0);
996
997 override void OnItemInHandsChanged()
998 {
1000 }
1001
1002 override void OnItemInHandsChangedEx(bool pInstant = false, bool pChangeAnimationInstance = true)
1003 {
1004 //Print("inv: DayZPlayerImplement::OnItemInHandsChanged: "/* + GetEntityInHands()*/);
1006 GetItemAccessor().OnItemInHandsChanged(pInstant, pChangeAnimationInstance);
1007
1008 if (!IsAlive())
1009 {
1010 //Print("inv: DayZPlayerImplement::OnItemInHandsChanged - human not alive! calling ResetWeaponInHands");
1011 GetItemAccessor().ResetWeaponInHands();
1012 }
1013
1014 HumanInventoryWithFSM.Cast(GetHumanInventory()).CheckFSMState();
1015 }
1016
1018
1019 //-------------------------------------------------------------
1023 void HandleWeapons(float pDt, Entity pInHands, HumanInputController pInputs, out bool pExitIronSights)
1024 {
1025 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
1026 GetDayZPlayerInventory().HandleWeaponEvents(pDt, pExitIronSights);
1027
1028 Weapon_Base weapon;
1029 Class.CastTo(weapon, pInHands);
1030 ItemOptics optic = weapon.GetAttachedOptics();
1031
1034
1035 GetMovementState(m_MovementState);
1036
1037 // obstruction
1038 bool wantedLift = m_LiftWeapon_player;
1039 bool currentLift = hcw.IsWeaponLifted();
1040 if (wantedLift != currentLift)
1041 {
1042 hcw.LiftWeapon(wantedLift);
1043 // Reset the velocity, cause at this point we might need to start moving in the opposite direction rather rapidly,
1044 // to prevent the obstruction from smashing the player's head while lifting
1046 }
1047
1048 float wantedObstruction = m_ObstructWeapon_player;
1049 float currentObstruction = hcw.GetWeaponObstruction();
1050 if (wantedObstruction != currentObstruction)
1051 {
1052 // The following times are times chosen by observation; the following values produced
1053 // consistent and relatively nicely looking results and were OK'd by the animators.
1054 const float outTime = 0.150; // duration when smoothing hi -> lo
1055 const float inTime = 0.010; // duration when smoothing lo -> hi
1056 const float inTimeLift = 0.100; // duration when smoothing in during lift
1057
1058 float smoothTime;
1059 if (wantedLift) // When lifting always transition rather quickly
1060 {
1061 wantedObstruction = 0.0;
1062 smoothTime = inTimeLift;
1063 }
1064 else // Otherwise we can take our time based on the delta
1065 {
1066 float t = Math.Clamp(Math.AbsFloat(wantedObstruction-currentObstruction), 0, 1);
1067 smoothTime = Math.Lerp(outTime, inTime, t);
1068 }
1069
1070 // Do the interpolation and clamp to wanted value if the change is below certain threshold, to prevent uneccessary interpolation
1071 m_fObstructionSmooth = Math.SmoothCD(m_fObstructionSmooth, wantedObstruction, m_fObstructionSmoothVelocity, smoothTime, 6.0, pDt);
1072 if (Math.AbsFloat(m_fObstructionSmooth-wantedObstruction) < 0.0001)
1073 {
1074 m_fObstructionSmooth = wantedObstruction;
1075 }
1076
1077 #ifdef DIAG_DEVELOPER
1078 if (DiagMenu.GetValue(DiagMenuIDs.WEAPON_DISABLE_OBSTRUCTION_INTERPOLATION))
1079 m_fObstructionSmooth = wantedObstruction;
1080 #endif
1081
1083
1084 #ifndef SERVER
1085 #ifdef DIAG_DEVELOPER
1086 PluginDiagMenuClient.GetWeaponLiftDiag().Data().SetInterpolation( inTime, inTimeLift, outTime, smoothTime, m_fObstructionSmooth, currentObstruction, wantedObstruction );
1087 #endif
1088 #endif
1089 }
1090 // !obstruction
1091
1092 // hold breath
1093 if (pInputs.IsHoldBreath() && m_MovementState.IsRaised() && (IsInIronsights() || IsInOptics()))
1094 {
1095 m_IsTryingHoldBreath = true;
1096 }
1097 else
1098 {
1099 m_IsTryingHoldBreath = false;
1100 }
1101
1102 if (pInputs.IsFireModeChange())
1103 {
1104 GetWeaponManager().SetNextMuzzleMode();
1105 }
1106 if (pInputs.IsZeroingUp())
1107 {
1108 if (optic && (optic.IsInOptics() || optic.IsUsingWeaponIronsightsOverride()))
1109 {
1110 optic.StepZeroingUp();
1111 }
1112 else
1113 {
1114 weapon.StepZeroingUpAllMuzzles();
1115 }
1116 }
1117 if (pInputs.IsZeroingDown())
1118 {
1119 if (optic && (optic.IsInOptics() || optic.IsUsingWeaponIronsightsOverride()))
1120 {
1121 optic.StepZeroingDown();
1122 }
1123 else
1124 {
1125 weapon.StepZeroingDownAllMuzzles();
1126 }
1127 }
1128
1129 if (!m_LiftWeapon_player && (m_CameraIronsight || !weapon.CanEnterIronsights() || m_CameraOptics/*m_ForceHandleOptics*/)) // HACK straight to optics, if ironsights not allowed
1130 {
1131 if (optic)
1132 HandleOptic(optic, false, pInputs, pExitIronSights);
1133 }
1134
1135 if (!m_MovementState.IsRaised())
1136 {
1137 m_IsFireWeaponRaised = false; //legacy reasons
1138 if (weapon && weapon.IsInOptics())
1139 {
1140 weapon.ExitOptics();
1141 }
1142
1144
1145 return; // if not raised => return
1146 }
1147 else
1148 {
1149 m_IsFireWeaponRaised = true; //legacy reasons
1151 {
1152 m_WeaponRaiseTime += pDt;
1153 }
1154
1156 {
1158 }
1159 }
1160
1162 if (GetWeaponManager().CanFire(weapon))
1163 {
1164 bool autofire = weapon.GetCurrentModeAutoFire(weapon.GetCurrentMuzzle()) && weapon.IsChamberEjectable(weapon.GetCurrentMuzzle());
1165 int burst = weapon.GetCurrentModeBurstSize(weapon.GetCurrentMuzzle());
1166 int burst_count = weapon.GetBurstCount();
1167 if (!autofire && (burst < 2 || burst_count < 1))
1168 {
1169 if (pInputs.IsAttackButtonDown() && GetInputInterface().SyncedValue("UAWeaponMeleeAttack") == 0 && GetInputInterface().SyncedValue("UAHeavyMeleeAttack") == 0)
1170 {
1171 GetWeaponManager().Fire(weapon);
1172 }
1173 }
1174 else if (autofire || burst > 1)
1175 {
1176#ifdef DIAG_DEVELOPER
1177 int burst_option = GetWeaponManager().GetBurstOption();
1178 if (burst_option == 0)
1179 {
1180#endif
1181 if (pInputs.IsAttackButton() && GetInputInterface().SyncedValue("UAWeaponMeleeAttack") == 0 && GetInputInterface().SyncedValue("UAHeavyMeleeAttack") == 0)
1182 {
1183 if (autofire || burst_count < burst)
1184 {
1185 GetWeaponManager().Fire(weapon);
1186 }
1187 }
1188 else
1189 {
1190 weapon.ResetBurstCount();
1191 }
1192#ifdef DIAG_DEVELOPER
1193 }
1194 else if (burst_option == 1)
1195 {
1196 if (burst > 1 && burst_count == burst)
1197 {
1198 weapon.ResetBurstCount();
1199 }
1200 else if (burst > 1 && burst_count < burst)
1201 {
1202 GetWeaponManager().Fire(weapon);
1203 }
1204 else
1205 {
1206 //Autofire
1207 if (pInputs.IsAttackButton())
1208 {
1209 GetWeaponManager().Fire(weapon);
1210 }
1211 }
1212 }
1213#endif
1214 }
1215 }
1216
1217 #ifdef PLATFORM_CONSOLE
1218 if (g_Game.GetInput().LocalRelease("UAFire", false) || m_ShouldReload)
1219 {
1220 if (!weapon.IsWaitingForActionFinish() && !IsFighting())
1221 {
1222 int muzzle_index = weapon.GetCurrentMuzzle();
1223
1224 if (weapon.IsChamberFiredOut(muzzle_index))
1225 {
1226 if (weapon.CanProcessWeaponEvents())
1227 {
1228 if (GetWeaponManager().CanEjectBullet(weapon))
1229 {
1230 GetWeaponManager().EjectBullet();
1231 pExitIronSights = true;
1232 m_ShouldReload = false;
1233 }
1234 }
1235 }
1236 }
1237 else
1238 {
1239 m_ShouldReload = true;
1240 }
1241 }
1242 #endif
1243 }
1244
1245 void HandleOptic(notnull ItemOptics optic, bool inHands, HumanInputController pInputs, out bool pExitOptics)
1246 {
1247 UAInterface input = GetInputInterface();
1248 if (!input)
1249 {
1250 return;
1251 }
1252
1253 Weapon_Base weapon;
1254 int FOVcount;
1255 bool controllerPressIn;
1256 bool controllerPressOut;
1257
1258 if (input.SyncedPress_ID(UAZoomInOptics))
1259 {
1260 weapon = Weapon_Base.Cast(optic.GetHierarchyParent());
1261 FOVcount = optic.GetStepFOVCount();
1262 controllerPressIn = input.SyncedPress_ID(UAZoomInOpticsControllerHelper);
1263
1264 if (weapon && m_CameraIronsight && !m_CameraOptics)
1265 {
1266 SetIronsights(false);
1267 SwitchOptics(optic,true);
1268 optic.SetStepFOVIndex(0);
1269 }
1270 else if (m_CameraOptics)
1271 {
1272 if (controllerPressIn) //controller
1273 {
1274 if (!optic.StepFOVUp())
1275 {
1276 if (FOVcount > 0)
1277 {
1278 optic.SetStepFOVIndex(0); //loop to minimum magnification
1279 }
1280
1281 if (weapon && weapon.CanEnterIronsights()) //loop into ironsights
1282 {
1283 SwitchOptics(optic,false);
1284 SetIronsights(true);
1285 }
1286 }
1287 }
1288 else //m&k
1289 {
1290 optic.StepFOVUp();
1291 }
1292 }
1293 }
1294
1295 if (input.SyncedPress_ID(UAZoomOutOptics))
1296 {
1297 weapon = Weapon_Base.Cast(optic.GetHierarchyParent());
1298 FOVcount = optic.GetStepFOVCount();
1299 controllerPressOut = input.SyncedPress_ID(UAZoomOutOpticsControllerHelper);
1300 if (m_CameraOptics)
1301 {
1302 if (!optic.StepFOVDown())
1303 {
1304 if (controllerPressOut)
1305 {
1306 if (FOVcount > 0 && (!weapon || !weapon.CanEnterIronsights()))
1307 {
1308 optic.SetStepFOVIndex(FOVcount - 1); //loop to maximum magnification
1309 }
1310 }
1311
1312 if (weapon && weapon.CanEnterIronsights())
1313 {
1314 SwitchOptics(optic,false);
1315 SetIronsights(true);
1316 }
1317 }
1318 }
1319 else if (controllerPressOut && weapon && m_CameraIronsight)
1320 {
1321 SwitchOptics(optic,true);
1322 if (FOVcount > 0)
1323 {
1324 optic.SetStepFOVIndex(FOVcount - 1); //loop to maximum magnification
1325 }
1326 }
1327 }
1328 }
1329
1330 //-------------------------------------------------------------
1334
1337 float m_DamageHitDir = 0.0;
1338 float m_DamageHealth = 0.0;
1339
1340 const float HIT_INTERVAL_MIN = 0.3; // Minimum time in seconds before a COMMANDID_HIT to COMMANDID_HIT transition is allowed
1342
1344 {
1345 return (m_DamageHitFullbody && m_DamageHitAnimType != -1) || GetCommand_Damage() != null;
1346 }
1347
1349 void EvaluateDamageHit(int pCurrentCommandID)
1350 {
1353
1354 if (!m_SyncedHitDataArray || m_SyncedHitDataArray.Count() == 0)
1355 {
1356 return;
1357 }
1358
1359 //evaluate all hit data
1360 SyncHitInfo data;
1361 SyncHitInfo greatest_hit;
1362 int nSyncedHitDataArray = m_SyncedHitDataArray.Count();
1363 for (int i = 0; i < nSyncedHitDataArray; ++i)
1364 {
1365 data = m_SyncedHitDataArray[i];
1366 m_DamageHitDir = data.m_HitDir;
1367
1368 //client-side effects
1369 #ifndef SERVER
1370 if (IsAlive() && !IsUnconscious() && data.m_HasSource && g_Game.GetMission().GetHud() && g_Game.GetPlayer() == this) //only for controlled players
1371 {
1372 m_DamageHealth = data.m_HealthDamage;
1373 #ifndef NO_GUI
1374 if (m_DamageHealth > 0.0)
1375 {
1376 float rel = m_DamageHealth / (GetMaxHealth("","Health") * PlayerConstants.HEAVY_HIT_THRESHOLD);
1377 g_Game.GetMission().GetHud().SpawnHitDirEffect(this,m_DamageHitDir,rel);
1378 }
1379 #endif
1380 }
1381 #endif
1382
1383 if (!greatest_hit)
1384 {
1385 greatest_hit = data;
1386 }
1387 //else if (data.m_HealthDamage > greatest_hit.m_HealthDamage || (data.m_Fullbody && !greatest_hit.m_Fullbody)) //TODO - revisit cumulative calculation for animation evaluation purposes (stagger on shotgun to the chest)
1388 else if (data.m_Fullbody) //temporary solution; last fullbody hit is used for animation purposes, some light hit otherwise
1389 {
1390 greatest_hit = data;
1391 }
1392 }
1393
1394 m_SyncedHitDataArray.Clear();
1395 m_DamageHealth = 0.0;
1396
1398 if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE || IsUnconscious())
1399 {
1400 return;
1401 }
1402
1403 //general effects
1404 m_DamageHitFullbody = greatest_hit.m_Fullbody;
1405 m_DamageHitAnimType = greatest_hit.m_AnimType;
1406 m_DamageHitDir = greatest_hit.m_HitDir;
1407 }
1408
1409 bool HandleDamageHit(int pCurrentCommandID)
1410 {
1411 // Update elapsed time since hit first
1412 if ( pCurrentCommandID == DayZPlayerConstants.COMMANDID_DAMAGE )
1413 {
1414 // Throttle heavy hit command up to a fixed rate
1416 {
1418 ResetDamageHitState(false);
1419 return false;
1420 }
1421 }
1422
1423 // If transportcache is not null, player is unconscious inside of a car and should not head into a damage command
1424 if (m_DamageHitAnimType != -1 && m_TransportCache == null && !CommitedSuicide())
1425 {
1426 HumanCommandVehicle vehCommand = GetCommand_Vehicle();
1427 if (m_DamageHitFullbody && (!vehCommand || vehCommand.IsGettingIn() || vehCommand.IsGettingOut()))
1428 {
1429 StartCommand_Damage(m_DamageHitAnimType, m_DamageHitDir);
1430 ResetDamageHitState(true);
1431 return true;
1432 }
1433 else
1434 {
1435 AddCommandModifier_Damage(m_DamageHitAnimType, m_DamageHitDir);
1436 ResetDamageHitState(false);
1437 return false;
1438 }
1439 }
1440
1441 return pCurrentCommandID == DayZPlayerConstants.COMMANDID_DAMAGE;
1442 }
1443
1444 void ResetDamageHitState(bool resetTimer)
1445 {
1447 m_DamageHitFullbody = false;
1448
1449 if (resetTimer)
1450 {
1451 m_HitElapsedTime = 0;
1452 }
1453 }
1454
1456 bool EvaluateDeathAnimation(int pDamageType, EntityAI pSource, string pAmmoType, out int pAnimType, out float pAnimHitDir)
1457 {
1458 bool doPhxImpulse = g_Game.ConfigGetInt("cfgAmmo " + pAmmoType + " doPhxImpulse") > 0;
1459
1460 pAnimType = DayZPlayerConstants.DEATH_DEFAULT;
1461 if (doPhxImpulse)
1462 pAnimType = DayZPlayerConstants.DEATH_FAST;
1463
1465 vector targetDirection = GetDirection();
1466 vector toSourceDirection = (pSource.GetPosition() - GetPosition());
1467
1468 targetDirection[1] = 0;
1469 toSourceDirection[1] = 0;
1470
1471 targetDirection.Normalize();
1472 toSourceDirection.Normalize();
1473
1474 float cosFi = vector.Dot(targetDirection, toSourceDirection);
1475 vector cross = targetDirection * toSourceDirection;
1476
1477 pAnimHitDir = Math.Acos(cosFi) * Math.RAD2DEG;
1478 if (cross[1] < 0)
1479 pAnimHitDir = -pAnimHitDir;
1480
1481 return true;
1482 }
1483
1485 bool EvaluateDamageHitAnimation(TotalDamageResult pDamageResult, int pDamageType, EntityAI pSource, string pComponent, string pAmmoType, vector pModelPos, out int pAnimType, out float pAnimHitDir, out bool pAnimHitFullbody)
1486 {
1487 int invertHitDir = 0; //Used to flip the heavy hit animation direction
1488
1489 pAnimType = 0;
1490 pAnimHitFullbody = false; // additive anm
1491 GetMovementState(m_MovementState);
1492
1493 switch (pDamageType)
1494 {
1495 case DamageType.CLOSE_COMBAT:
1497 if (pSource.IsInherited(DayZInfected))
1498 break;
1499
1500 pAnimType = g_Game.ConfigGetInt("cfgAmmo " + pAmmoType + " hitAnimation");
1501 invertHitDir = g_Game.ConfigGetInt("cfgAmmo " + pAmmoType + " invertHitDir");
1502 if (!IsUnconscious() && pAnimType == 1 && !m_MeleeFightLogic.IsInBlock())
1503 pAnimHitFullbody = true;
1504 break;
1505
1506 case DamageType.FIRE_ARM:
1507 int impactBehaviour = 0;
1508
1509 if (!IsUnconscious() && GetHealth("", "Shock") > 25)
1510 {
1512 if (pComponent == "Torso" || pComponent == "Head")
1513 {
1514 impactBehaviour = g_Game.ConfigGetInt("cfgAmmo " + pAmmoType + " impactBehaviour");
1515 float fireDamage = pDamageResult.GetHighestDamage("Health");
1516 float shockDamage = pDamageResult.GetHighestDamage("Shock");
1517 if ((fireDamage > 80.0 || shockDamage > 40.0) && impactBehaviour == 1)
1518 pAnimHitFullbody = true;
1519 }
1520 }
1521
1522 break;
1523
1524 case DamageType.EXPLOSION:
1525 break;
1526
1527 case DamageType.CUSTOM:
1528 pAnimType = g_Game.ConfigGetInt("cfgAmmo " + pAmmoType + " hitAnimation");
1529 if (pAnimType == 1)
1530 pAnimHitFullbody = true;
1531 else if (pAmmoType != "HeatDamage" || IsSwimming() || IsInVehicle())
1532 return false;
1533
1534 break;
1535 }
1536
1538 vector targetDirection = GetDirection();
1539 vector toSourceDirection = (pSource.GetPosition() - GetPosition());
1540
1541 targetDirection[1] = 0;
1542 toSourceDirection[1] = 0;
1543
1544 targetDirection.Normalize();
1545 toSourceDirection.Normalize();
1546
1547 float cosFi = vector.Dot(targetDirection, toSourceDirection);
1548 vector cross = targetDirection * toSourceDirection;
1549
1550 pAnimHitDir = Math.Acos(cosFi) * Math.RAD2DEG;
1551
1552 // We will invert direction of the hit
1553 if (invertHitDir > 0)
1554 pAnimHitDir -= 180;
1555
1556 if (cross[1] < 0)
1557 pAnimHitDir = -pAnimHitDir;
1558
1559 return true;
1560 }
1561
1563 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
1564 {
1565 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
1566
1567 m_TransportHitRegistered = false;
1568
1569 if (!IsAlive())
1570 {
1571 int animTypeDeath;
1572 float animHitDirDeath;
1573 if (EvaluateDeathAnimation(damageType, source, ammo, animTypeDeath, animHitDirDeath))
1574 {
1575 SendDeathJuncture(animTypeDeath, animHitDirDeath);
1576 }
1577
1578 if (!m_DeathSyncSent) //checked until the death is evaluated by 'OnCommandHandlerTick' higher up the road
1579 {
1580 Man killer = source.GetHierarchyRootPlayer();
1581
1582 if (!m_KillerData) //only one player is considered killer in the event of crossfire
1583 {
1584 m_KillerData = new KillerData();
1585 m_KillerData.m_Killer = killer;
1586 m_KillerData.m_MurderWeapon = source;
1587 }
1588
1589 if (killer && killer.IsPlayer())
1590 {
1591 // was player killed by headshot?
1592 if (dmgZone == "Brain")
1593 {
1594 m_KilledByHeadshot = true;
1595 if (m_KillerData.m_Killer == killer)
1596 m_KillerData.m_KillerHiTheBrain = true;
1597 }
1598 }
1599 }
1600 }
1601 else
1602 {
1603 int animType;
1604 float animHitDir;
1605 bool animHitFullbody;
1606 if (EvaluateDamageHitAnimation(damageResult, damageType, source, dmgZone, ammo, modelPos, animType, animHitDir, animHitFullbody))
1607 DayZPlayerSyncJunctures.SendDamageHitEx(this, animType, animHitDir, animHitFullbody, damageResult, damageType, source, dmgZone, ammo, modelPos);
1608 else
1609 {
1610 bool skipSoundRequest = false;
1611 if (damageType == DamageType.CUSTOM && GetCommand_Fall())
1612 skipSoundRequest = GetFallDamage().GetLandType() < HumanCommandFall.LANDTYPE_MEDIUM;
1613
1614 if (!skipSoundRequest)
1615 RequestSoundEvent(EPlayerSoundEventID.TAKING_DMG_LIGHT);
1616 }
1617 }
1618
1619 // interupt melee for non-blocked hit or heavy hit
1620 if (animHitFullbody)
1621 {
1622 HumanCommandMelee2 hcm = GetCommand_Melee2();
1623 if (hcm)
1624 hcm.Cancel();
1625 }
1626 }
1627
1628 //-------------------------------------------------------------
1633
1635 override bool HeadingModel(float pDt, SDayZPlayerHeadingModel pModel)
1636 {
1637 if (!IsAlive())
1638 {
1639 return false;
1640 }
1641
1642 GetMovementState(m_MovementState);
1643
1645 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_LADDER)
1646 {
1648 return false;
1649 }
1650 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_VEHICLE)
1651 {
1652 HumanCommandVehicle hmv = GetCommand_Vehicle();
1653 if (hmv.IsGettingOut() || hmv.IsGettingIn())
1654 {
1656 }
1657
1659 return false;
1660 }
1661 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
1662 {
1663 HumanCommandUnconscious hcu = GetCommand_Unconscious();
1664 if (!hcu.IsWakingUp())
1665 {
1667 //pModel.m_iCamMode = DayZPlayerConstants.CAMERAMODE_HEAD;
1668 return false;
1669 }
1670 }
1671
1672 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_CLIMB)
1673 {
1675 return false;
1676 }
1677
1678#ifdef DEVELOPER
1679 int actMenuValue = DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_TURNSLIDE);
1680 if (actMenuValue != 0)
1681 {
1684 }
1685#endif
1686
1687 if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
1688 {
1690 return false;
1691 }
1692
1694 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_MOVE)
1695 {
1696 HumanCommandMove hcm = GetCommand_Move();
1697 if (hcm.IsStandingFromBack())
1698 {
1700 return false;
1701 }
1702 }
1703
1704 HumanItemAccessor hia = GetItemAccessor();
1705 HumanItemBehaviorCfg hibcfg = hia.GetItemInHandsBehaviourCfg();
1706 if (hibcfg && hibcfg.m_StanceRotation[m_MovementState.m_iStanceIdx] == DayZPlayerConstants.ROTATION_DISABLE)
1707 {
1709 }
1710 if (IsUnconscious() || (GetCommand_Move() && GetCommand_Move().IsLeavingUncon()))
1711 {
1713 }
1714
1716 }
1717
1718
1719 //-------------------------------------------------------------
1723 override bool AimingModel(float pDt, SDayZPlayerAimingModel pModel)
1724 {
1725 GetMovementState(m_MovementState);
1726 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_MELEE2)
1727 {
1728 HumanCommandMelee2 hcm = GetCommand_Melee2();
1729 if (hcm.IsFinisher())
1730 {
1732 {
1733 m_AimingModel.OnFinisherBegin(pModel.m_fCurrentAimY);
1735 }
1736 m_AimingModel.ProcessStealthFilters(pDt, pModel);
1737 }
1738
1739 return true;
1740 }
1741
1742 if (m_MovementState.IsRaised())
1743 {
1744 if (!m_RaiseStarted)
1745 {
1746 m_AimingModel.OnRaiseBegin(this);
1747 m_RaiseStarted = true;
1748 }
1749 m_AimingModel.ProcessAimFilters(pDt, pModel, m_MovementState.m_iStanceIdx);
1750
1751 return true;
1752 }
1753
1754 m_RaiseStarted = false;
1756
1757 return true;
1758 }
1759
1760 //-------------------------------------------------------------
1764
1766 bool ProcessJumpOrClimb(float pDt, int pCurrentCommandID)
1767 {
1768 HumanInputController hic = GetInputController();
1769 if (!hic || !hic.IsJumpClimb())
1770 {
1771 return false;
1772 }
1773
1774 m_JumpClimb.JumpOrClimb();
1775
1776 if (!m_JumpClimb.WasSuccessful())
1777 {
1778 return false;
1779 }
1780
1781 return true;
1782 }
1783
1785 bool CanJump()
1786 {
1787 if (IsFBSymptomPlaying() || IsRestrained() || IsUnconscious() || IsInFBEmoteState())
1788 return false;
1789
1790 if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
1791 return false;
1792
1793 if (IsRaised() && GetInputInterface().SyncedPress("UAGetOverControllerHelper")) //no raised jump on cotroller
1794 {
1795 return false;
1796 }
1797
1798 HumanItemBehaviorCfg hibcfg = GetItemAccessor().GetItemInHandsBehaviourCfg();
1799 if (!hibcfg.m_bJumpAllowed)
1800 return false;
1801
1802 if (!DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_ERECT) || !DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_RAISEDERECT))
1803 return false;
1804
1805 HumanCommandMove hcm = GetCommand_Move();
1806 if (hcm)
1807 {
1808 if (hcm.IsChangingStance())
1809 return false;
1810 }
1811
1812 HumanCommandSwim hcs = GetCommand_Swim();
1813 if (hcs)
1814 {
1815 return false;
1816 }
1817
1818 return true;
1819 }
1820
1821 bool CanClimb(int climbType, SHumanCommandClimbResult climbRes)
1822 {
1823 if (IsFBSymptomPlaying() || IsRestrained() || IsUnconscious() || IsInFBEmoteState() || GetCommand_Action() || GetCommandModifier_Action())
1824 return false;
1825
1826 if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
1827 return false;
1828
1829 if (IsRaised() && GetInputInterface().SyncedPress("UAGetOverControllerHelper")) //no raised climb on cotroller
1830 {
1831 return false;
1832 }
1833
1834 HumanItemBehaviorCfg hibcfg = GetItemAccessor().GetItemInHandsBehaviourCfg();
1835 if (!hibcfg.m_bJumpAllowed)
1836 return false;
1837
1838 if (climbRes)
1839 {
1840 EntityAI entity;
1841 if (Class.CastTo(entity,climbRes.m_GrabPointParent) && entity.IsHologram())
1842 return false;
1843 if (Class.CastTo(entity,climbRes.m_ClimbStandPointParent) && entity.IsHologram())
1844 return false;
1845 if (Class.CastTo(entity,climbRes.m_ClimbOverStandPointParent) && entity.IsHologram())
1846 return false;
1847 }
1848
1849 return true;
1850 }
1851
1852
1854 {
1855 }
1856
1857 void OnJumpEnd(int pLandType = 0)
1858 {
1859 }
1860
1862 {
1863 GetDayZPlayerInventory().CancelHandEvent();
1864 }
1865
1867 {
1868 GetDayZPlayerInventory().CancelWeaponEvent();
1869 }
1870
1872 {
1873 GetDayZPlayerInventory().AbortWeaponEvent();
1874 }
1875
1876 // Please on't depend on this, we will eventually hopefully remove this
1878 {
1879 GetDayZPlayerInventory().SyncDeferredEventToRemotes();
1880 }
1881
1882 //-------------------------------------------------------------
1887 {
1888 if (!IsAlive())
1889 {
1891 {
1892 ExitSights();
1893 }
1894 return;
1895 }
1896
1897 bool bADSToggle = false;
1898 bool exitSights = false;
1899 HumanInputController hic = GetInputController();
1900 HumanItemAccessor hia = GetItemAccessor();
1901 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
1902 PlayerBase playerPB = PlayerBase.Cast(this);
1903 GetMovementState(m_MovementState);
1904
1905 if (playerPB.IsRolling())
1906 {
1907 exitSights = true;
1908 }
1909
1910 bool isItemInHandsWeapon = hia.IsItemInHandsWeapon();
1911 if (m_ResetADS || (!isItemInHandsWeapon && hic.WeaponADS()))
1912 {
1913 hic.ResetADS();
1914 m_ResetADS = false;
1915 }
1916
1917 if (!m_MovementState.IsRaised() || m_LiftWeapon_player)
1918 {
1920 exitSights = true;
1921 }
1922 else
1923 {
1924 bool isWeaponADS = hic.WeaponADS();
1925 if (m_bADS != isWeaponADS)
1926 {
1927 m_bADS = isWeaponADS;
1928 bADSToggle = true;
1929 }
1930
1932 {
1935 {
1936 bADSToggle = false;
1937 exitSights = true;
1938 }
1939 else
1940 {
1941 bADSToggle = true;
1942 }
1943 }
1944 }
1945
1946 if (bADSToggle && !GetCommand_Melee2() && !GetThrowing().IsThrowingModeEnabled())
1947 {
1948 if (hia.IsItemInHandsWeapon() && playerPB.GetWeaponManager() && !playerPB.GetWeaponManager().IsRunning())
1949 {
1950 Weapon_Base weapon = Weapon_Base.Cast(GetEntityInHands());
1951 ItemOptics optic = weapon.GetAttachedOptics();
1952 bool switchToADS = false;
1953 bool canUseIronsights = weapon.CanEnterIronsights();
1954 bool canUseOptics = optic != NULL;
1955
1956 if (canUseIronsights || canUseOptics)
1957 switchToADS = m_bADS;
1958
1959 // go to ironsights - disable ironsights when
1962 if (!m_MovementState.IsRaised() || m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
1963 {
1964 switchToADS = false;
1965 }
1966
1967 // fixes camera switching during item transitions
1969 {
1970 exitSights = true;
1971 }
1972 else if (switchToADS) // enter ironsights or optics
1973 {
1974 // filter by usability
1975 if (weapon.GetWasIronSight() && !canUseIronsights)
1976 {
1977 weapon.SetWasIronSight(false);
1978 }
1979 else if (!weapon.GetWasIronSight() && !canUseOptics)
1980 {
1981 weapon.SetWasIronSight(true);
1982 }
1983
1984 if (weapon.GetWasIronSight())
1985 {
1986 SwitchOptics(optic,false);
1987 SetIronsights(true);
1988 }
1989 else if (!weapon.GetWasIronSight() || (!canUseIronsights && canUseOptics))
1990 {
1991 SetIronsights(false);
1992 SwitchOptics(optic,true);
1993 }
1994 else
1995 {
1996 exitSights = true;
1997 }
1998
1999 if (hcw && (m_CameraOptics/* || m_CameraIronsight*/))
2000 {
2001 hcw.SetADS(true);
2002 }
2003 }
2004 else
2005 {
2006 exitSights = true;
2007 }
2008 }
2009 }
2010
2011 // leave ironsight and/ or optics
2012 if (exitSights && !IsHandheldOpticsInUse() && (m_CameraIronsight || m_CameraOptics) || GetCommand_Melee2())
2013 {
2014 ExitSights();
2015 }
2016 }
2017
2019 {
2020 if (!IsAlive())
2021 {
2023 {
2024 ExitSights();
2025 }
2026 return;
2027 }
2028
2029 HumanInputController hic = GetInputController();
2030
2031 bool camChange = hic.CameraViewChanged();
2032 int thirdPersonViewMode = g_Game.GetWorld().GetThirdPersonViewMode();
2033
2034 if (IsRaised())
2035 {
2036 if (m_IsWeapon)
2037 {
2038 camChange = false;
2039 }
2040 }
2041
2043 if (thirdPersonViewMode == ThirdPersonMode.DISABLED)
2044 {
2045 m_Camera3rdPerson = false;
2046 }
2047 else if (camChange)
2048 {
2050 }
2051
2052 // exits optics completely, comment to return to ADS
2054 ExitSights();
2055
2056 if (IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDPRONE) && (m_CameraOptics || m_CameraIronsight))
2057 {
2058 SetVerticalMinimumAimLimit(DayZPlayerCameraIronsights.CONST_UD_MIN_BACK);
2060 }
2062 {
2063 SetVerticalMinimumAimLimit(DayZPlayerCameraIronsights.CONST_UD_MIN);
2065 }
2066
2067 if (hic.IsZoomToggle() && !m_MovementState.IsRaised())
2068 {
2070 if ((IsClimbingLadder() && Math.AbsInt(m_MovementState.m_iMovement) == 2) || (IsSwimming() && m_MovementState.m_iMovement == 3))
2071 {
2073 }
2074 else if (!IsClimbingLadder() && !IsSwimming() && !IsInVehicle())
2075 {
2076 float pSpeed;
2077 vector pLocalDirection;
2078 hic.GetMovement(pSpeed ,pLocalDirection);
2079
2080 if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT && pSpeed == 3)
2081 {
2083 }
2084 }
2085 }
2086 else
2087 {
2089 }
2090
2091 if (m_MovementState.IsRaisedInProne())
2092 {
2093 float headingAngle = MiscGameplayFunctions.GetHeadingAngle(this);
2094 float headingAngleDiffBlock = Math.AbsFloat(m_LastHeadingAngleBlock - headingAngle);
2095 float headingAngleDiffBlock2 = Math.AbsFloat(m_LastHeadingAngleBlock2 - headingAngle);
2096 float headingAngleDiff = 0.0;
2097
2098 if (m_LastHeadingAngle * headingAngle < 0.0)
2099 {
2100 headingAngleDiff = Math.AbsFloat(m_LastHeadingAngle + headingAngle);
2101 }
2102 else
2103 {
2104 headingAngleDiff = Math.AbsFloat(m_LastHeadingAngle - headingAngle);
2105 }
2106
2107 if (headingAngleDiff > 0.2)
2108 {
2109 int time = g_Game.GetTime();
2110
2111 float timefilterconstant = 400 - (headingAngleDiff * 100);
2112
2113 if (headingAngleDiffBlock > 0.8 && time - m_LastBackSoundTime > timefilterconstant)
2114 {
2115 float volume = headingAngleDiff / 0.5;
2116 if (volume > 1)
2117 {
2118 volume = 1;
2119 }
2120 if (volume < 0.25)
2121 {
2122 volume = 0.25;
2123 }
2124
2125 m_SoundOffset = headingAngleDiff / 2;
2126 if (m_SoundOffset > 0.25)
2127 {
2128 m_SoundOffset = 0.25;
2129 }
2130
2131 string soundSetName = "Cloth_Body_longmove_TShirt_Soundset";
2132
2133 string bodyClothName = "";
2134 EntityAI attachment = GetInventory().FindAttachment(InventorySlots.BODY);
2135 if (attachment)
2136 {
2137 bodyClothName = attachment.GetAttachmentSoundType();
2138 }
2139
2140 if (bodyClothName != "")
2141 {
2142 string path = "CfgSoundTables CfgAttachmentSoundTables Cloth_Body_Longmove_LookupTable";
2143 int soundCount = g_Game.ConfigGetChildrenCount(path);
2144
2145 for (int i = 0; i < soundCount; i++)
2146 {
2147 string name = "";
2148 g_Game.ConfigGetChildName(path, i, name);
2149
2150 if (name == bodyClothName)
2151 {
2152 TStringArray stringArray = new TStringArray();
2153 g_Game.ConfigGetTextArray(path + " " + name + " soundSets", stringArray);
2154 soundSetName = stringArray.Get(0);
2155
2156 delete stringArray;
2157 }
2158 }
2159 }
2160
2161 SoundParams soundParams = new SoundParams(soundSetName);
2162 SoundObjectBuilder soundObjectBuilder = new SoundObjectBuilder(soundParams);
2163
2164 if (soundObjectBuilder != NULL)
2165 {
2166 SoundObject soundObject = soundObjectBuilder.BuildSoundObject();
2167
2168 if (soundObject != NULL)
2169 {
2170 soundObject.SetPosition(GetPosition());
2171
2172 AbstractWave wave = g_Game.GetSoundScene().Play3D(soundObject, soundObjectBuilder);
2173 wave.SetStartOffset(m_SoundOffset);
2174 wave.SetVolumeRelative(volume);
2175
2176 m_LastBackSoundTime = g_Game.GetTime();
2177 m_LastHeadingAngleBlock = headingAngle;
2178 }
2179 }
2180 }
2181
2182 if (headingAngleDiffBlock2 > 1.5 && time - m_LastBackSoundTime2 > (timefilterconstant * 2))
2183 {
2184 float volume2 = headingAngleDiff * 2;
2185 if (volume2 > 1)
2186 {
2187 volume2 = 1;
2188 }
2189
2190 m_SoundOffset = headingAngleDiff / 1.8;
2191 if (m_SoundOffset < 0.1)
2192 {
2193 m_SoundOffset = 0.1;
2194 }
2195 if (m_SoundOffset > 0.3)
2196 {
2197 m_SoundOffset = 0.3;
2198 }
2199
2200 string soundSetName2 = "walkProne_noHS_asphalt_ext_Char_SoundSet";
2201 string surfaceType = GetSurfaceType();
2202
2203 if (surfaceType != "")
2204 {
2205 string movementSurfaceType = "walkProne_" + surfaceType;
2206
2207 string path2 = "CfgSoundTables CfgStepSoundTables walkProne_noHS_Char_LookupTable";
2208 int soundCount2 = g_Game.ConfigGetChildrenCount(path2);
2209
2210 for (int i2 = 0; i2 < soundCount2; i2++)
2211 {
2212 string name2 = "";
2213 g_Game.ConfigGetChildName(path2, i2, name2);
2214
2215 if (name2 == movementSurfaceType)
2216 {
2217 TStringArray stringArray2 = new TStringArray();
2218 g_Game.ConfigGetTextArray(path2 + " " + name2 + " soundSets", stringArray2);
2219 soundSetName2 = stringArray2.Get(0);
2220
2221 delete stringArray2;
2222 }
2223 }
2224 }
2225
2226 SoundParams soundParams2 = new SoundParams(soundSetName2);
2227 SoundObjectBuilder soundObjectBuilder2 = new SoundObjectBuilder(soundParams2);
2228
2229 if (soundObjectBuilder2 != NULL)
2230 {
2231 SoundObject soundObject2 = soundObjectBuilder2.BuildSoundObject();
2232
2233 if (soundObject2 != NULL)
2234 {
2235 soundObject2.SetPosition(GetPosition());
2236
2237 AbstractWave wave2 = g_Game.GetSoundScene().Play3D(soundObject2, soundObjectBuilder2);
2238 wave2.SetStartOffset(m_SoundOffset);
2239 wave2.SetVolumeRelative(volume2);
2240
2241 m_LastBackSoundTime2 = g_Game.GetTime();
2242 m_LastHeadingAngleBlock2 = headingAngle;
2243 }
2244 }
2245 }
2246
2247 m_LastHeadingAngle = headingAngle;
2248 }
2249 }
2250 }
2251
2258
2259
2260 //-------------------------------------------------------------
2264 // these functions are for modded overide in script command mods
2265
2266 bool ModCommandHandlerBefore(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
2267 {
2268 return false;
2269 }
2270
2271 bool ModCommandHandlerInside(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
2272 {
2273 return false;
2274 }
2275
2276 bool ModCommandHandlerAfter(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
2277 {
2278 return false;
2279 }
2280
2281 //-------------------------------------------------------------
2285
2286
2288 override void CommandHandler(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
2289 {
2290 m_dT = pDt;
2291
2292 vector playerPosition = PhysicsGetPositionWS();
2293
2294 GetDayZPlayerInventory().HandleInventory(pDt);
2295 GetHumanInventory().Update(pDt);
2296
2297 if (ModCommandHandlerBefore(pDt, pCurrentCommandID, pCurrentCommandFinished))
2298 {
2299 return;
2300 }
2301
2303
2304 HumanInputController hic = GetInputController();
2305 EntityAI entityInHands = GetEntityInHands();
2306 GetMovementState(m_MovementState);
2307
2308 bool isRaisedNow = m_MovementState.IsRaised();
2309 bool isWeapon = entityInHands && entityInHands.IsInherited(Weapon);
2310
2311 bool updateAimingMdfr = false;
2312 if (isWeapon != m_IsWeapon)
2313 {
2314 m_IsWeapon = isWeapon;
2315 updateAimingMdfr = true;
2316 }
2317
2318 if (isRaisedNow != m_IsRaised)
2319 {
2320 updateAimingMdfr = true;
2321 m_IsRaised = m_MovementState.IsRaised();
2322 }
2323
2324 if (updateAimingMdfr)
2325 {
2326 if (isRaisedNow && isWeapon)
2327 GetUApi().ActivateModificator("aiming");
2328 else
2329 GetUApi().DeactivateModificator("aiming");
2330 }
2331
2332 // handle ADS ironsights/optics transition logic
2333 HandleADS();
2334
2335 // handle weapons
2336 if (hic)
2337 {
2338 ItemOptics opticInHands = ItemOptics.Cast(entityInHands);
2339 if (isWeapon && (!m_ProcessFirearmMeleeHit || !m_ContinueFirearmMelee))
2340 {
2342 bool exitIronSights = false;
2343 HandleWeapons(pDt, entityInHands, hic, exitIronSights);
2344 }
2345 else if (IsHandheldOpticsInUse() && m_CameraOptics && opticInHands)
2346 {
2347 bool exitOptic = false;
2348 HandleOptic(opticInHands, true, hic, exitOptic);
2349 }
2350 }
2351
2353 HandleView();
2354
2355 if (m_MovementState.m_iMovement != m_MovementState.m_LocalMovement)
2356 {
2358 m_MovementState.m_LocalMovement = m_MovementState.m_iMovement;
2359 }
2360
2362 if (HandleDeath(pCurrentCommandID))
2363 {
2364 return;
2365 }
2366
2369 if ( pCurrentCommandID == DayZPlayerConstants.COMMANDID_VEHICLE )
2370 {
2371 HumanCommandVehicle cmdVehicle = GetCommand_Vehicle();
2372 if ( cmdVehicle && cmdVehicle.IsGettingOut() )
2373 {
2374 vector waterLevel;
2375 if ( m_Swimming.CheckSwimmingStart( waterLevel ) )
2376 {
2377 // not all the events may have been called as getting out could have occurred while under water
2378 cmdVehicle.ProcessLeaveEvents();
2379
2380 StartCommand_Swim();
2381 return;
2382 }
2383 }
2384 }
2385
2387 if (pCurrentCommandFinished)
2388 {
2389 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
2390 {
2391 if ((m_LastCommandBeforeUnconscious == DayZPlayerConstants.COMMANDID_VEHICLE) && (m_TransportCache != null))
2392 {
2393 int crew_index = m_TransportCache.CrewMemberIndex(this);
2394 int seat = m_TransportCache.GetSeatAnimationType(crew_index);
2395 StartCommand_Vehicle(m_TransportCache, crew_index, seat, true);
2396 m_TransportCache = null;
2397 return;
2398 }
2399 }
2400
2401 // start moving
2402
2403 // start falling ? (could happen after climbing)
2404 if (PhysicsIsFalling(true))
2405 {
2406 StartCommand_Fall(0);
2407 SetFallYDiff(playerPosition[1]);
2408 return;
2409 }
2410
2412 if (m_Swimming.m_bWasSwimming)
2413 {
2414 StartCommand_Swim();
2415 return;
2416 }
2417
2418 StartCommand_Move();
2419
2420 if (entityInHands)
2421 ForceStandUpForHeavyItems(entityInHands);
2422
2423 return;
2424 }
2425
2426
2427 //--------------------------------------------
2429
2430 if (ModCommandHandlerInside(pDt, pCurrentCommandID, pCurrentCommandFinished))
2431 {
2432 return;
2433 }
2434
2435
2436 //--------------------------------------------
2437 // vehicle handling
2438 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_VEHICLE)
2439 {
2440 hcv = GetCommand_Vehicle();
2441 if (hcv.WasGearChange())
2442 {
2443 GearChangeActionCallback cb = GearChangeActionCallback.Cast(AddCommandModifier_Action(DayZPlayerConstants.CMD_ACTIONMOD_SHIFTGEAR, GearChangeActionCallback));
2444 cb.SetVehicleCommand(hcv);
2445 }
2446
2447 Transport transport;
2448 int seatPos;
2449
2450 transport = hcv.GetTransport();
2451 seatPos = hcv.GetVehicleSeat();
2452 if (IsAlive() && IsAuthority() && transport && transport.CrewShouldEject(seatPos))
2453 {
2454 // TODO(kumarjac): Temporary code until we have a ragdoll command to activate instead
2455 // Due to lack of time, we opted to re-use unconsciousness here instead
2456 ModifiersManager mdfMan;
2457 GetGame().GetMission().MissionScript.CallFunction(this, "GetModifiersManager", mdfMan, null);
2458 mdfMan.ActivateModifier(eModifiers.MDF_UNCONSCIOUSNESS);
2459 }
2460
2461 return;
2462 }
2463
2465 //--------------------------------------------
2466 HumanCommandMove hcm = GetCommand_Move();
2467 if (hcm && m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT && hcm.GetCurrentMovementSpeed() > 2.99)
2468 {
2469 m_SprintedTime += pDt;
2471 {
2472 m_SprintFull = true;
2474 }
2475 else
2476 m_SprintFull = false;
2477 }
2478 else
2479 {
2480 m_SprintedTime = 0.0;
2481 m_SprintFull = false;
2482 }
2483
2484 //--------------------------------------------
2485 // swimming handling
2486 if (m_Swimming.HandleSwimming(pCurrentCommandID, hcm, m_MovementState))
2487 {
2488 if (ProcessJumpOrClimb(pDt, pCurrentCommandID))
2489 {
2490 return;
2491 }
2492
2493 m_JumpClimb.CheckAndFinishJump();
2494 return;
2495 }
2496
2497 //--------------------------------------------
2498 // ladder handling
2499 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_LADDER)
2500 {
2502 return;
2503 }
2504
2505 //--------------------------------------------
2506 // climb handling
2507 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_CLIMB)
2508 {
2509 return;
2510 }
2511
2512 //--------------------------------------------
2513 // fall handling
2514
2515 if (IsAlreadyInFallingCommand(pCurrentCommandID))
2516 {
2517 if (IsLanded(pCurrentCommandID))
2518 {
2520 NoiseParams npar;
2521
2522 FallDamageData fallDamageData = new FallDamageData();
2523 fallDamageData.m_Height = m_FallYDiff - playerPosition[1];
2524
2525 // land
2526 if (fallDamageData.m_Height < 0.5)
2527 {
2528 fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_NONE;
2529 OnLand(pCurrentCommandID, fallDamageData);
2530 npar = type.GetNoiseParamsLandLight();
2531 AddNoise(npar);
2532 }
2533 else if (fallDamageData.m_Height < 3.0)
2534 {
2535 if (m_MovementState.IsInProne() || m_MovementState.IsInRaisedProne())
2536 fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_NONE;
2537 else
2538 fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_LIGHT;
2539
2540 OnLand(pCurrentCommandID, fallDamageData);
2541 npar = type.GetNoiseParamsLandLight();
2542 AddNoise(npar);
2543 }
2544 else if (fallDamageData.m_Height < 5.0)
2545 {
2546 fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_MEDIUM;
2547 OnLand(pCurrentCommandID, fallDamageData);
2548 npar = type.GetNoiseParamsLandHeavy();
2549 AddNoise(npar);
2550 }
2551 else
2552 {
2553 fallDamageData.m_LandType = HumanCommandFall.LANDTYPE_HEAVY;
2554 OnLand(pCurrentCommandID, fallDamageData);
2555 npar = type.GetNoiseParamsLandHeavy();
2556 AddNoise(npar);
2557 }
2558
2559 if (fallDamageData.m_Height >= DayZPlayerImplementFallDamage.HEALTH_HEIGHT_LOW && GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
2560 {
2561 OnPlayerRecievedHit();
2562 }
2563
2564 m_FallDamage.HandleFallDamage(fallDamageData);
2565 m_JumpClimb.CheckAndFinishJump(fallDamageData.m_LandType);
2566 }
2567
2569 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
2570 {
2571 return;
2572 }
2573 }
2574 else if (PhysicsIsFalling(false))
2575 {
2576 // Not in a falling command but the controller is falling, start default fall
2577 StartCommand_Fall(0);
2578 SetFallYDiff(playerPosition[1]);
2579 return;
2580 }
2581
2582 //--------------------------------------------
2583 // handle jumping
2584
2585#ifndef NO_GUI
2586#ifdef DEVELOPER
2588
2589 if (DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_ENABLEJUMP))
2590 {
2591 SHumanCommandClimbSettings hcls = GetDayZPlayerType().CommandClimbSettingsW();
2592
2593 if (m_MovementState.m_iMovement != DayZPlayerConstants.MOVEMENTIDX_IDLE)
2594 hcls.m_fFwMaxDistance = 3;
2595 else
2596 hcls.m_fFwMaxDistance = 1.2;
2597
2598 SHumanCommandClimbResult ret;
2599
2601 HumanCommandClimb.DoClimbTest(this, ret, 0x3);
2602 }
2603
2604#endif
2605#endif
2606
2607 // start jump
2608 if (ProcessJumpOrClimb(pDt, pCurrentCommandID))
2609 {
2610 return;
2611 }
2612
2613 HumanCommandAdditives ad = GetCommandModifier_Additives();
2614
2615 bool force = false;
2616#ifndef NO_GUI
2617#ifdef DEVELOPER
2619 force = DiagMenu.GetEngineValue(DayZPlayerConstants.DEBUG_ENABLETALKING);
2620#endif
2621#endif
2622 float amplitude = IsPlayerSpeaking();
2623
2624 if (amplitude > 0.1 || force)
2625 {
2626 if (ad)
2627 ad.SetTalking(true);
2628
2629 // add noises on server
2630 if (g_Game.IsServer())
2631 {
2632 int now = g_Game.GetTime();
2633 if (now >= m_NextVoNNoiseTime)
2634 {
2635 m_NextVoNNoiseTime = now + 1000;
2636
2637 int voiceLevel = g_Game.GetVoiceLevel(this);
2639
2640 // add noise every second while talking
2641 NoiseParams vonpar;
2642 switch (voiceLevel)
2643 {
2644 case VoiceLevelWhisper:
2645 vonpar = pt.GetNoiseParamsWhisper();
2646 break;
2647 case VoiceLevelTalk:
2648 vonpar = pt.GetNoiseParamsTalk();
2649 break;
2650 case VoiceLevelShout:
2651 vonpar = pt.GetNoiseParamsShout();
2652 break;
2653 }
2654 AddNoise(vonpar);
2655 }
2656 }
2657 }
2658 else
2659 {
2660 if (ad)
2661 ad.SetTalking(false);
2662 }
2663
2664 //--------------------------------------------
2665 // anything whats handled by InputController
2666
2668
2669 if (hic)
2670 {
2672 HumanCommandWeapons hcw = GetCommandModifier_Weapons();
2673 m_Throwing.HandleThrowing(hic, hcw, entityInHands, pDt);
2674
2676 if (m_MeleeFightLogic.CanFight())
2677 {
2678 if (m_MeleeFightLogic.HandleFightLogic(pCurrentCommandID, hic, entityInHands, m_MovementState, m_ContinueFirearmMelee))
2679 {
2681 return;
2682 }
2683 }
2684 }
2685
2686
2688 if (ModCommandHandlerAfter(pDt, pCurrentCommandID, pCurrentCommandFinished))
2689 {
2690 return;
2691 }
2692 }
2693
2694 void HideClothing(ItemOptics optic, bool state) {}
2695
2696 //-------------------------------------------------------------
2700
2703 bool m_DebugTypeVal = false;
2704
2708
2710 void CommandHandlerDebug(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
2711 {
2712 if (GetPluginManager())
2713 {
2715 if (playerDebug)
2716 {
2717 playerDebug.CommandHandler();
2718
2720 if (m_DebugWeaponChangeStage == 0)
2721 {
2722
2723 // debug weapon change
2724 int hideSlot;
2725
2726 if (playerDebug.IsWeaponChange(m_DebugWeaponChangeItem, hideSlot, m_DebugWeaponChangeShowSlot))
2727 {
2728 //Print("Change Weapon started: " + m_DebugWeaponChangeItem + "," + hideSlot.ToString() + "," + m_DebugWeaponChangeShowSlot.ToString());
2729
2730 HumanCommandWeapons w = GetCommandModifier_Weapons();
2731 w.StartAction(WeaponActions.HIDE, hideSlot);
2732
2734 }
2735 }
2736 else if (m_DebugWeaponChangeStage == 1)
2737 {
2738 // wait for weapon hide to meet event
2739 HumanCommandWeapons w2 = GetCommandModifier_Weapons();
2740 if (w2 && w2.GetRunningAction() == WeaponActions.HIDE)
2741 {
2742 if (w2.IsEvent() == WeaponEvents.CHANGE_HIDE)
2743 {
2745 //Print("Change Weapon - hidden: ");
2746
2748 PlayerBase player = PlayerBase.Cast(this);
2749 EntityAI item_in_hands = player.GetEntityInHands();
2750 if (item_in_hands != NULL && player.CanDropEntity(item_in_hands) && g_Game.GetPlayer().GetHumanInventory().CanRemoveEntityInHands())
2751 {
2752 player.PredictiveDropEntity(item_in_hands);
2753 }
2754
2755 if (m_DebugWeaponChangeItem != "")
2756 {
2758 dst.SetHands(this, NULL);
2760 }
2761
2763 w2.StartAction(WeaponActions.SHOW, 3);
2764
2766 }
2767 }
2768 }
2769 else if (m_DebugWeaponChangeStage == 2)
2770 {
2771 HumanCommandWeapons w3 = GetCommandModifier_Weapons();
2772 if (w3 && w3.IsActionFinished())
2773 {
2775 }
2776 }
2777 }
2778 }
2779
2780
2782 if (m_TestDamageCounter >= 0)
2783 {
2784 if (m_TestDamageCounter > 3)
2785 {
2788
2789 if (m_DebugDirectionVal > 90)
2790 {
2791 m_DebugDirectionVal = -180;
2793 }
2794
2795 if (m_DebugTypeVal)
2796 {
2797 AddCommandModifier_Damage(0, m_DebugDirectionVal); // starts light
2798 }
2799 else
2800 {
2801 StartCommand_Damage(0, m_DebugDirectionVal); // starts heavy (full body)
2802 }
2803 // 0.. types
2804 // from: -180 back, -90 left, 0 front, 90 right, 180 back
2805 //AddCommandModifier_Damage(0, directionVal); // starts light
2806 //StartCommand_Damage(0, 0); // starts heavy (full body)
2807 }
2808
2809 m_TestDamageCounter += pDt;
2810 }
2811
2812
2813#ifndef NO_GUI
2814#ifdef DEVELOPER
2815
2816 // injury / exhaustion
2817 {
2818 HumanCommandAdditives ad = GetCommandModifier_Additives();
2819
2821 float v = DiagMenu.GetEngineRangeValue(DayZPlayerConstants.DEBUG_SHOWINJURY);
2822 if (v > 0)
2823 {
2824 ad.SetInjured(v, true);
2825 }
2826
2828 v = DiagMenu.GetEngineRangeValue(DayZPlayerConstants.DEBUG_SHOWEXHAUSTION);
2829 if (v > 0)
2830 {
2831 ad.SetExhaustion(v, true);
2832 }
2833 }
2834#endif
2835#endif
2836
2837 }
2838
2839
2840
2841 //-------------------------------------------------------------
2845 override int CameraHandler(int pCameraMode)
2846 {
2849 {
2850 ItemOptics optics = null;
2851 EntityAI entityInHands = GetEntityInHands();
2852 Weapon weapon = Weapon.Cast(entityInHands);
2853 if (weapon)
2854 optics = weapon.GetAttachedOptics();
2855 else if (entityInHands)
2856 Class.CastTo(optics,entityInHands);
2857
2858 if (m_CameraOptics && optics)
2859 {
2861 }
2862 else if (m_CameraIronsight && weapon)
2863 {
2865 }
2866 }
2867
2868 // If the logic above doesn't reach optics nor ironsights camera,
2869 // yet weapon is still raised and ads is wanted, enforce 1pv camera
2870 // as this will reduce erratic behaviour of camera switching in 3pv
2871 HumanInputController hic = GetInputController();
2872 if (m_Camera3rdPerson && m_IsWeapon && m_IsRaised && hic && hic.WeaponADS())
2873 {
2875 }
2876
2877 //uncon
2878 if ( GetCurrentCommandID() == DayZPlayerConstants.COMMANDID_UNCONSCIOUS )
2879 {
2880#ifdef USER_kumarjac
2881 HumanCommandUnconscious hcu = GetCommand_Unconscious();
2882 if (hcu && hcu.IsRagdoll() && m_Camera3rdPerson)
2883 {
2885 }
2886#endif
2887
2889 }
2890
2891 // Vehicle
2892 HumanCommandVehicle vehicleCommand = GetCommand_Vehicle();
2893 int thirdPersonViewMode = g_Game.GetWorld().GetThirdPersonViewMode();
2894 if (vehicleCommand)
2895 {
2896 if (thirdPersonViewMode >= ThirdPersonMode.ENABLED)
2897 {
2898 if (!m_Camera3rdPerson)
2899 {
2901 }
2902 else
2903 {
2904 Transport transport = vehicleCommand.GetTransport();
2905 if (transport && GetParent())
2906 {
2907 return transport.Get3rdPersonCameraType();
2908 }
2909 }
2910 }
2911 else
2912 {
2914 }
2915 }
2916
2917 // Character
2918 if (thirdPersonViewMode == ThirdPersonMode.DISABLED || thirdPersonViewMode == ThirdPersonMode.VEHICLES_ONLY)
2919 m_Camera3rdPerson = false;
2920
2921 if (!m_Camera3rdPerson)
2922 {
2924 }
2925 else
2926 {
2928 GetMovementState(m_MovementState);
2929
2933
2935
2937
2938 if (m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_CLIMB)
2939 {
2941 }
2942
2943 if (m_JumpClimb.m_bIsJumpInProgress)
2944 {
2946 }
2947
2948 int targetStanceIndex = m_MovementState.m_iStanceIdx;
2949
2951 HumanCommandMove commandMove = GetCommand_Move();
2952 if (commandMove && commandMove.IsChangingStance() && m_MovementState.IsRaised())
2953 {
2954 targetStanceIndex = m_MovementState.m_iStanceIdx - DayZPlayerConstants.STANCEIDX_RAISED;
2955 }
2956
2957 //
2958 // normal movement cameras
2959 if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_CROUCH)
2960 {
2962 }
2963 else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
2964 {
2966 }
2967 else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_PRONE)
2968 {
2970 }
2971 else if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
2972 {
2974 }
2975
2976 if (targetStanceIndex == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
2977 {
2978 if (m_IsWeapon)
2979 {
2981 }
2982 else
2983 {
2985 }
2986 }
2987 else if (targetStanceIndex == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
2988 {
2990 }
2991
2992 // DayZPlayerConstants.STANCEIDX_ERECT
2994 }
2995
2997 }
2998
3000 void OnMovementChanged()//(int state_old, int state_new)
3001 {
3002 if (m_MovementState.m_LocalMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
3003 {
3004 OnSprintEnd();
3005 }
3006
3007 if (m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
3008 {
3009 OnSprintStart();
3010 }
3011 }
3012
3014 {
3015 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3016 {
3017 GetUApi().GetInputByID(UALeanLeft).Lock();
3018 GetUApi().GetInputByID(UALeanRight).Lock();
3019 }
3020 }
3021
3023 {
3024 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3025 {
3026 #ifdef PLATFORM_CONSOLE
3027 if (GetUApi().GetInputByID(UAVoiceModifierHelper).LocalValue() == 0)
3028 #endif
3029 {
3030 GetUApi().GetInputByID(UALeanLeft).Unlock();
3031 GetUApi().GetInputByID(UALeanRight).Unlock();
3032 }
3033 }
3034 }
3035 //-------------------------------------------------------------
3039
3041 {
3042 int userDataTypeParam = 0;
3043 if (!ctx.Read(userDataTypeParam))
3044 {
3045 Error("DayZPlayerImplement: cannot read input type");
3046 return;
3047 }
3048
3049 OnInputUserDataProcess(userDataTypeParam, ctx);
3050 }
3051
3052 bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
3053 {
3054 m_MeleeCombat.SetTargetObject(null);
3055 m_MeleeCombat.SetHitPos(vector.Zero);
3056 m_MeleeCombat.SetHitZoneIdx(-1);
3057 m_MeleeCombat.SetFinisherType(-1);
3058
3059 if (userDataType == INPUT_UDT_MELEE_TARGET)
3060 {
3061 EntityAI target = null;
3062 if (ctx.Read(target))
3063 {
3064 m_MeleeCombat.SetTargetObject(target);
3065 }
3066
3067 vector hitPos = vector.Zero;
3068 if (ctx.Read(hitPos))
3069 {
3070 m_MeleeCombat.SetHitPos(hitPos);
3071 }
3072
3073 int hitZoneIdx = -1;
3074 if (ctx.Read(hitZoneIdx))
3075 {
3076 m_MeleeCombat.SetHitZoneIdx(hitZoneIdx);
3077 }
3078
3079 int finisherType = -1;
3080 if (ctx.Read(finisherType))
3081 {
3082 if (finisherType != -1 && target)
3083 {
3084 bool isWithinRange = vector.Distance(GetPosition(), target.GetPosition()) <= PlayerConstants.MAX_FINISHER_RANGE;
3085 if (!target.IsAlive() || !target.CanBeBackstabbed() || !isWithinRange)
3086 {
3087 finisherType = -1;
3088 }
3089 }
3090 m_MeleeCombat.SetFinisherType(finisherType);
3091 }
3092
3093 return true;
3094 }
3095
3096 return false;
3097 }
3098
3099 //-------------------------------------------------------------
3103 void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
3104 {
3105 switch (pJunctureID)
3106 {
3108 if (m_DeathAnimType == -2)
3110 break;
3111
3113 SyncHitInfo data = new SyncHitInfo;
3114 if (DayZPlayerSyncJunctures.ReadDamageHitParamsEx(pCtx, data) && data != null)
3115 {
3116 m_SyncedHitDataArray.Insert(data);
3117 }
3118 break;
3119 }
3120 }
3121
3123 {
3124 EntityAI boots = GetInventory().FindAttachment(InventorySlots.FEET);
3125 if (boots)
3126 {
3127 switch (boots.GetAttachmentSoundType())
3128 {
3129 case "Sneakers":
3130 return AnimBootsType.Sneakers;
3131 case "Boots":
3132 return AnimBootsType.Boots;
3133 }
3134 }
3135
3136 return AnimBootsType.None;
3137 }
3138
3139 //Get top body clothes
3140 AnimUpperBodyType GetBodyAttachmentType()
3141 {
3142 EntityAI attachment = GetInventory().FindAttachment(InventorySlots.BODY);
3143 if (attachment)
3144 {
3145 switch (attachment.GetAttachmentSoundType())
3146 {
3147 case "NylonJacket":
3148 return AnimUpperBodyType.NylonJacket;
3149 case "TShirt":
3150 return AnimUpperBodyType.TShirt;
3151 case "WoolShirt":
3152 return AnimUpperBodyType.WoolShirt;
3153 case "HeavyJacket":
3154 return AnimUpperBodyType.HeavyJacket;
3155 case "LeatherJacket":
3156 return AnimUpperBodyType.LeatherJacket;
3157 case "Coat":
3158 return AnimUpperBodyType.Coat;
3159 case "ChemlonDress":
3160 return AnimUpperBodyType.ChemlonDress;
3161 case "Ghillie":
3162 return AnimUpperBodyType.Ghillie;
3163 case "Chainmail":
3164 return AnimUpperBodyType.Chainmail;
3165 }
3166 }
3167
3168 return AnimUpperBodyType.None;
3169 }
3170
3172 {
3173 EntityAI back = GetInventory().FindAttachment(InventorySlots.BACK);
3174 if (back)
3175 {
3176 switch (back.GetAttachmentSoundType())
3177 {
3178 case "Small":
3179 return AnimBackType.Small;
3180 case "Military":
3181 return AnimBackType.Military;
3182 case "Outdoor":
3183 return AnimBackType.Outdoor;
3184 case "Ghillie":
3185 return AnimBackType.Ghillie;
3186 }
3187 }
3188
3189 return AnimBackType.None;
3190 }
3191
3192 //Get weapon on back
3193 AnimRangedWeaponType GetShoulderAttachmentType()
3194 {
3195 EntityAI shoulderAttachment = GetInventory().FindAttachment(InventorySlots.SHOULDER);
3196 EntityAI meleeAttachment = GetInventory().FindAttachment(InventorySlots.MELEE);
3197
3198 AnimRangedWeaponType shoulderAttType = AnimRangedWeaponType.None;
3199 AnimRangedWeaponType meleeAttType = AnimRangedWeaponType.None;
3200
3201 if (shoulderAttachment)
3202 {
3203 switch (shoulderAttachment.GetAttachmentSoundType())
3204 {
3205 case "Shotgun":
3206 {
3207 shoulderAttType = AnimRangedWeaponType.Shotgun;
3208 break;
3209 }
3210 case "Rifle":
3211 {
3212 shoulderAttType = AnimRangedWeaponType.Rifle;
3213 break;
3214 }
3215 }
3216 }
3217 if (meleeAttachment)
3218 {
3219 switch (meleeAttachment.GetAttachmentSoundType())
3220 {
3221 case "Shotgun":
3222 {
3223 meleeAttType = AnimRangedWeaponType.Shotgun;
3224 break;
3225 }
3226 case "Rifle":
3227 {
3228 meleeAttType = AnimRangedWeaponType.Rifle;
3229 break;
3230 }
3231 }
3232 }
3233
3234 if (shoulderAttType == AnimRangedWeaponType.Shotgun || meleeAttType == AnimRangedWeaponType.Shotgun)
3235 return AnimRangedWeaponType.Shotgun;
3236
3237 if (shoulderAttType == AnimRangedWeaponType.Rifle || meleeAttType == AnimRangedWeaponType.Rifle)
3238 return AnimRangedWeaponType.Rifle;
3239
3240 return AnimRangedWeaponType.None;
3241 }
3242
3243 //-------------------------------------------------------------
3247
3249 {
3250 if (so == null)
3251 return null;
3252
3254 AbstractWave wave = g_Game.GetSoundScene().Play3D(so, sob);
3255 return wave;
3256 }
3257
3258 void AddNoise(NoiseParams noisePar, float noiseMultiplier = 1.0)
3259 {
3260 if (noisePar != null)
3261 g_Game.GetNoiseSystem().AddNoise(this, noisePar, noiseMultiplier);
3262 }
3263
3264 //-------------------------------------------------------------
3268
3269 void OnStepEvent(string pEventType, string pUserString, int pUserInt)
3270 {
3273 DayZPlayerType playerType = GetDayZPlayerType();
3275 GetMovementState(state);
3276
3277 SurfaceInfo surfaceInfo;
3278 if (pUserInt < 100)
3279 {
3280 string boneName = "";
3281 if (pUserInt % 2 == 1)
3282 {
3283 boneName = "leftfoot";
3284 surfaceInfo = g_Game.GetSurfaceInfoUnderObjectByBone(this, SurfaceAnimationBone.LeftBackLimb);
3285 if (!surfaceInfo)
3286 {
3287 surfaceInfo = g_Game.GetSurfaceInfoUnderObjectByBone(this, SurfaceAnimationBone.RightBackLimb);
3288 boneName = "rightfoot";
3289 }
3290 }
3291 else
3292 {
3293 boneName = "rightfoot";
3294 surfaceInfo = g_Game.GetSurfaceInfoUnderObjectByBone(this, SurfaceAnimationBone.RightBackLimb);
3295 if (!surfaceInfo)
3296 {
3297 surfaceInfo = g_Game.GetSurfaceInfoUnderObjectByBone(this, SurfaceAnimationBone.LeftBackLimb);
3298 boneName = "leftfoot";
3299 }
3300 }
3301
3302 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !GetGame().IsMultiplayer())
3303 {
3304 //synced dusty ceiling effect
3305 if (surfaceInfo)
3306 {
3307 HandleCeilingDustStepEffect(surfaceInfo, boneName);
3308 }
3309 }
3310
3311 #ifdef DIAG_DEVELOPER
3312 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3313 {
3314 if (DiagMenu.GetBool(DiagMenuIDs.MISC_PLAYER_SURFACE_DEBUG))
3315 {
3316 string surfaceType = "NULL";
3317 if (surfaceInfo)
3318 surfaceType = surfaceInfo.GetSurfaceType();
3319
3320 CharacterStepsDebug.SetStepData(boneName, surfaceType);
3321 }
3322 }
3323 #endif
3324 }
3325
3326 #ifndef SERVER
3327 #ifndef NO_GUI
3328 DayZPlayerTypeStepSoundLookupTable table = playerType.GetStepSoundLookupTable();
3329 SoundObjectBuilder soundBuilder = NULL;
3330 if (pUserInt < 100)
3331 {
3332 if (surfaceInfo)
3333 {
3334 m_LastSurfaceUnderHash = surfaceInfo.GetSurfaceType().Hash();
3335
3336 if (state.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SPRINT)
3337 {
3338 orientation = -GetDirection();//Using direction to compute forward dot product of surface in the direction oposite player
3339
3340 vector surfaceNormal = g_Game.SurfaceGetNormal(position[0], position[2]);
3341 float dotWithForward = vector.Dot(surfaceNormal, orientation);
3342
3343 float pitch = Math.Atan2(-dotWithForward, surfaceNormal[1]) * Math.RAD2DEG;
3344
3345 //VectorToYaw using first and second float insted of first and third then why it is need adjustment
3346 orientation[1] = orientation[2];
3347 orientation[2] = 0;
3348
3349 float yaw = orientation.VectorToYaw();
3350
3351 orientation[0] = -yaw + 90;
3352 orientation[1] = pitch;
3353
3354
3355 int stepParticleID = surfaceInfo.GetStepParticleId();
3356 if (stepParticleID > 0)
3357 {
3358 ParticleSource source = ParticleManager.GetInstance().PlayInWorldEx(stepParticleID, null, position);
3359 //Direction align with surface in the opposite direction to the player
3360 source.SetOrientation(orientation);
3361 }
3362 }
3363
3364 soundBuilder = table.GetSoundBuilder(pUserInt, state.m_iMovement, m_LastSurfaceUnderHash, GetBootsType());
3365 }
3366 }
3367 else
3368 {
3369 surfaceInfo = g_Game.GetSurfaceInfoUnderObject(this);
3370 if (surfaceInfo)
3371 m_LastSurfaceUnderHash = surfaceInfo.GetSurfaceType().Hash();
3372
3373 soundBuilder = table.GetSoundBuilder(pUserInt, state.m_iMovement, m_LastSurfaceUnderHash, GetBootsType());
3374 }
3375
3376 if (soundBuilder != null && g_Game.GetPlayer())
3377 {
3378 m_StepCounterVegetation++;
3379
3380 if (m_StepCounterVegetation >= 3)
3381 {
3382 m_StepCounterVegetation = 0;
3383 g_Game.ProfilerStart("Player_Vegetation_Sounds");
3384
3386 vector edgeLength = Vector(0.75, 2.5, 0.75);
3387 array<Object> excludedObjects = new array<Object>();
3388 excludedObjects.Insert(this);
3389 array<Object> collidedObjects = new array<Object>();
3390
3391 if (g_Game.IsBoxCollidingGeometry(position, orientation, edgeLength, ObjIntersectView, ObjIntersectNone, excludedObjects, collidedObjects))
3392 {
3393 foreach (Object obj : collidedObjects)
3394 {
3395 WoodBase colPlant;
3396 if (Class.CastTo(colPlant, obj))
3397 {
3398 if (colPlant.HasPlayerCollisionParticle() && state.m_iMovement > DayZPlayerConstants.MOVEMENTIDX_WALK)
3400
3401 if (colPlant.HasPlayerCollisionSound())
3402 {
3403 SoundObject vegSoundObject;
3404
3405 StaticObjectType plantType = StaticObjectType.Cast(colPlant.GetEntityType());
3406
3407 //custom lookup first
3408 SoundObjectBuilder vegSoundObjectBuilder = plantType.GetVegetationSoundBuilderFromEventID(pUserInt);
3409 if (vegSoundObjectBuilder)
3410 {
3411 vegSoundObject = vegSoundObjectBuilder.BuildSoundObject();
3412 }
3413 else //then generic
3414 {
3415 array<ref VegetationSound> vegSoundArray = playerType.GetVegetationSounds();
3416 foreach (VegetationSound vegetationSound: vegSoundArray)
3417 {
3418 if (vegetationSound.GetAnimEventIds().Find(pUserInt) >= 0)
3419 {
3420 vegSoundObjectBuilder = vegetationSound.GetSoundObjectBuilder();
3421 vegSoundObject = vegSoundObjectBuilder.BuildSoundObject();
3422 break;
3423 }
3424 }
3425 }
3426
3427 if (vegSoundObject != null)
3428 {
3429 AttenuateSoundIfNecessary(vegSoundObject);
3430 PlaySound(vegSoundObject, vegSoundObjectBuilder);
3431 }
3432
3433 break;
3434 }
3435 }
3436 }
3437 }
3438
3439 g_Game.ProfilerStop("Player_Vegetation_Sounds");
3440 }
3441
3442 SoundObject soundObject = soundBuilder.BuildSoundObject();
3443 if (soundObject != null)
3444 {
3445 AttenuateSoundIfNecessary(soundObject);
3446 PlaySound(soundObject, soundBuilder);
3447 }
3448
3449 }
3450 #endif
3451 #endif
3452
3453 if (g_Game.IsServer())
3454 {
3455 m_StepCounter++;//move outside of server condition if needed on client as well
3456
3457 float noiseMultiplier = 0;
3458
3459 NoiseParams noiseParams;
3460 if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
3461 noiseParams = playerType.GetNoiseParamsStand();
3462 else if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
3463 noiseParams = playerType.GetNoiseParamsCrouch();
3464 else if (state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_PRONE || state.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
3465 noiseParams = playerType.GetNoiseParamsProne();
3466 else
3467 {
3468 Debug.Log(string.Format("Wrong stance, id: %1 using backup with stand stance (id: 0)", state.m_iStanceIdx));
3469 noiseParams = playerType.GetNoiseParamsStand();
3470 }
3471
3472 noiseMultiplier = NoiseAIEvaluate.GetNoiseMultiplier(this);
3473
3474 AddNoise(noiseParams, noiseMultiplier);
3475
3477 {
3478 ProcessFeetDamageServer(pUserInt);
3479 m_StepCounter = 0;
3480 }
3481 }
3482 }
3483
3484 void OnSoundEvent(string pEventType, string pUserString, int pUserInt)
3485 {
3486 int eventReplaceID = 0;
3487
3488 if (pEventType == "Sound")
3489 {
3490 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
3491 {
3492 eventReplaceID = m_ReplaceSoundEventHandler.GetSoundEventID(pUserInt, ESoundEventType.SOUND_COMMON);
3493 if (eventReplaceID > 0 && PlaySoundEventType(ESoundEventType.SOUND_COMMON, eventReplaceID))
3494 return; //return only when 'PlaySoundEventType' successful
3495 }
3496
3497 ProcessSoundEvent(pEventType, pUserString, pUserInt);
3498 }
3499 else if (pEventType == "SoundWeapon")
3500 {
3501 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
3502 {
3503 eventReplaceID = m_ReplaceSoundEventHandler.GetSoundEventID(pUserInt, ESoundEventType.SOUND_WEAPON);
3504 if (eventReplaceID > 0 && PlaySoundEventType(ESoundEventType.SOUND_WEAPON, eventReplaceID))
3505 return; //return only when 'PlaySoundEventType' successful
3506 }
3507
3508 ProcessWeaponEvent(pEventType, pUserString, pUserInt);
3509 }
3510 else if (pEventType == "SoundAttachment")
3511 {
3512 ProcessAttachmentEvent(pEventType, pUserString, pUserInt);
3513 }
3514 else if (pEventType == "SoundVoice")
3515 {
3516 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
3517 {
3519 eventReplaceID = m_ReplaceSoundEventHandler.GetSoundEventID(pUserInt, ESoundEventType.SOUND_VOICE); //check if some animation override registered
3520
3521 if (eventReplaceID > 0 && PlaySoundEventType(ESoundEventType.SOUND_VOICE, eventReplaceID))
3522 {
3523 return; //return only when 'PlaySoundEventType' successful
3524 }
3525 else
3526 {
3527 //made this a secondary override, since there is some weirdness in sharing sound event IDs between unrelated animations (eating X forcefeeding etc.) and redundant translations (888 -> 888)
3528 int eventID = m_PlayerSoundEventHandler.ConvertAnimIDtoEventID(pUserInt);
3529 if (eventID > 0)
3530 {
3531 PlaySoundEvent(eventID);
3532 return;
3533 }
3534 }
3535 }
3536
3537 ProcessVoiceEvent(pEventType, pUserString, pUserInt);
3538 }
3539 else
3540 {
3541 Debug.Log("OnSoundEvent: Unknown sound event \"" + pEventType + "\"");
3542 }
3543 }
3544
3545 void OnParticleEvent(string pEventType, string pUserString, int pUserInt)
3546 {
3547
3548 }
3549
3550
3551 void ProcessWeaponEvent(string pEventType, string pUserString, int pUserInt)
3552 {
3554 AnimSoundEvent soundEvent = null;
3555
3556 float quantity = 0;
3557
3558 EntityAI entityInHands = GetEntityInHands();
3559 if (entityInHands && entityInHands.IsInherited(ItemBase))
3560 {
3561 ItemBase item;
3562 Class.CastTo(item, entityInHands);
3563 if (item.HasQuantity())
3564 quantity = (float)item.GetQuantity() / (item.GetQuantityMax() - item.GetQuantityMin());
3565 InventoryItemType invItemType = item.GetInventoryItemType();
3566 soundEvent = invItemType.GetSoundEvent(pUserInt);
3567 }
3568
3569 if (soundEvent == null)
3570 {
3571 quantity = 0;
3572 soundEvent = type.GetSoundWeaponEvent(pUserInt);
3573 }
3574
3575 if (soundEvent != null)
3576 {
3577 if (!g_Game.IsHeadlessOrDedicatedServer())
3578 {
3579 SoundObjectBuilder builder = soundEvent.GetSoundBuilderEx(m_ActionSoundCategoryHash);
3580 if (builder)
3581 {
3582 builder.AddVariable("quantity", quantity);
3583 builder.AddVariable("interior", IsSoundInsideBuilding());
3584
3585 SoundObject soundObject = builder.BuildSoundObject();
3586 if (soundObject != NULL)
3587 {
3588 AttenuateSoundIfNecessary(soundObject);
3589 AbstractWave sound = PlaySound(soundObject, builder);
3590
3591 if (pUserString == "StopOnAnimEnd")
3592 m_PerformedActionSounds.Insert(sound);
3593 }
3594 }
3595 else
3596 {
3597 //TODO:Userful error message
3598 }
3599 }
3600
3601 if (g_Game.IsServer())
3602 {
3603 AddNoise(soundEvent.m_NoiseParams);
3604 }
3605 }
3606 }
3607
3608 void ProcessAttachmentEvent(string pEventType, string pUserString, int pUserInt)
3609 {
3610#ifndef NO_GUI
3612 DayZPlayerTypeAttachmentSoundLookupTable table = type.GetAttachmentSoundLookupTable();
3613
3614 array<string> attachments = new array<string>();
3615 pUserString.Split(",", attachments);
3616 for (int i = 0; i < attachments.Count(); i++)
3617 {
3618 int attachmentHash = -1;
3619 if (attachments[i] == "shoulder")
3620 attachmentHash = GetShoulderAttachmentType();
3621 else if (attachments[i] == "body")
3622 attachmentHash = GetBodyAttachmentType();
3623 else if (attachments[i] == "back")
3624 attachmentHash = GetBackAttachmentType();
3625
3626 SoundObjectBuilder soundBuilder = table.GetSoundBuilder(pUserInt, attachments[i], attachmentHash);
3627
3628 if (soundBuilder != NULL)
3629 {
3630 SoundObject soundObject = soundBuilder.BuildSoundObject();
3631 if (soundObject != NULL)
3632 {
3633 AttenuateSoundIfNecessary(soundObject);
3634 PlaySound(soundObject, soundBuilder);
3635 }
3636 }
3637 }
3638#endif
3639 }
3640
3642 {
3643 if (m_ClimbingLadderType == "wood")
3644 {
3645 soundObjectBuilder.AddVariable("laddertype", 1);
3646 }
3647 else
3648 {
3649 soundObjectBuilder.AddVariable("laddertype", 0);
3650 }
3651
3652 AnimBootsType pBoots = GetBootsType();
3653
3654 if (pBoots == AnimBootsType.None)
3655 {
3656 soundObjectBuilder.AddVariable("bare", 1);
3657 soundObjectBuilder.AddVariable("sneakers", 0);
3658 soundObjectBuilder.AddVariable("boots", 0);
3659 }
3660 else if (pBoots == AnimBootsType.Sneakers)
3661 {
3662 soundObjectBuilder.AddVariable("bare", 0);
3663 soundObjectBuilder.AddVariable("sneakers", 1);
3664 soundObjectBuilder.AddVariable("boots", 0);
3665 }
3666 else if (pBoots == AnimBootsType.Boots)
3667 {
3668 soundObjectBuilder.AddVariable("bare", 0);
3669 soundObjectBuilder.AddVariable("sneakers", 0);
3670 soundObjectBuilder.AddVariable("boots", 1);
3671 }
3672 }
3673
3674 void ProcessSoundEvent(string pEventType, string pUserString, int pUserInt)
3675 {
3677 DayZPlayerTypeAnimTable table = type.GetSoundTable();
3678 AnimSoundEvent soundEvent;
3679 if (table)
3680 {
3681 soundEvent = table.GetSoundEvent(pUserInt);
3682 }
3683
3684 if (soundEvent != NULL)
3685 {
3686 if (!g_Game.IsHeadlessOrDedicatedServer())
3687 {
3688 SoundObjectBuilder objectBuilder = soundEvent.GetSoundBuilder();
3689 if (GetCommand_Ladder())
3690 {
3692 }
3693 objectBuilder.AddEnvSoundVariables(GetPosition());
3694
3695 SoundObject soundObject = objectBuilder.BuildSoundObject();
3696 if (soundObject != NULL)
3697 {
3698 AttenuateSoundIfNecessary(soundObject);
3699 AbstractWave sound = PlaySound(soundObject, objectBuilder);
3700
3701 if (pUserString == "StopOnAnimEnd")
3702 m_PerformedActionSounds.Insert(sound);
3703 }
3704 }
3705
3706 if (g_Game.IsServer())
3707 {
3708 if (soundEvent.m_NoiseParams != NULL)
3709 g_Game.GetNoiseSystem().AddNoise(this, soundEvent.m_NoiseParams);
3710 }
3711 }
3712 }
3713
3714
3715
3716 AbstractWave ProcessVoiceEvent(string pEventType, string pUserString, int pUserInt)
3717 {
3718 #ifdef SERVER//none of this code needs to run on server, ifdef put here rather than before the method call to maintain mod compatibility
3719 return null;
3720 #endif
3722 DayZPlayerTypeVoiceSoundLookupTable table = type.GetVoiceSoundLookupTable();
3723 if (!table)
3724 return null;
3725 AbstractWave wave;
3726 GameInventory inventory = GetInventory();
3727 EntityAI mask = inventory.FindAttachment(InventorySlots.MASK);
3728 EntityAI head_gear = inventory.FindAttachment(InventorySlots.HEADGEAR);
3729
3730 string category;
3731 if (mask || head_gear)
3732 {
3733 string category_mask;
3734 string category_headgear;
3735
3736 int priority_mask;
3737 int priority_headgear;
3738
3739 if (mask)
3740 {
3741 category_mask = mask.ConfigGetString("soundVoiceType");
3742 priority_mask = mask.ConfigGetInt("soundVoicePriority");
3743 }
3744 if (head_gear)
3745 {
3746 category_headgear = head_gear.ConfigGetString("soundVoiceType");
3747 priority_headgear = head_gear.ConfigGetInt("soundVoicePriority");
3748 }
3749
3750 if (priority_headgear >= priority_mask && category_headgear != "")
3751 {
3752 category = category_headgear;
3753 }
3754 else
3755 {
3756 category = category_mask;
3757 }
3758 }
3759
3760 if (category == "")
3761 {
3762 category = "none";
3763 }
3764
3765 SoundObjectBuilder soundBuilder = table.GetSoundBuilder(pUserInt, category.Hash());
3766
3767 if (soundBuilder)
3768 {
3769 PlayerBase player = PlayerBase.Cast(this);
3770 //this code block looks super shady, but it's the only way the sounds play correctly, god knows what's going on on c++ side
3771 int maleVoiceType = 0;
3772 int femaleVoiceType = 0;
3773 if (player.IsMale())
3774 {
3775 maleVoiceType = player.GetVoiceType();
3776 }
3777 else
3778 {
3779 femaleVoiceType = player.GetVoiceType();
3780 }
3781
3782 soundBuilder.AddVariable("male", maleVoiceType);
3783 soundBuilder.AddVariable("female", femaleVoiceType);
3784
3785 // end of weirdness
3786 SoundObject soundObject = soundBuilder.BuildSoundObject();
3787 if (soundObject != NULL)
3788 {
3789 AttenuateSoundIfNecessary(soundObject);
3790 wave = PlaySound(soundObject, soundBuilder);
3791 }
3792
3793 }
3794
3795 return wave;
3796 }
3797
3798 void ProcessFeetDamageServer(int pUserInt);
3799
3800 protected void HandleCeilingDustStepEffect(SurfaceInfo surfaceInfo, string boneName)
3801 {
3802 //player variant, synced
3803 m_CeilingDustHandler.OnStepUpdate(surfaceInfo, boneName);
3804 }
3805
3806 //-------------------------------------------------------------
3810
3812 {
3813 bool restrained = IsRestrained(); // IsRestrained()
3814 bool unconscious = IsUnconscious(); // IsRestrained()
3815
3816 ItemBase ib = ItemBase.Cast(item);
3817 if (ib && (PlayerBase.DEBUG_INVENTORY_ACCESS || !IsAlive() || restrained || unconscious || ib.CanBeMovedOverride()))
3818 return true;
3819 return false;
3820 }
3821
3823 {
3824 /*
3825 bool restrained = IsRestrained(); // IsRestrained()
3826 bool unconscious = IsUnconscious(); // IsRestrained()
3827
3828 ItemBase ib = ItemBase.Cast(item);
3829 if (!IsAlive() || restrained || unconscious || ib.CanBeMovedOverride())
3830 return true;
3831 return false;
3832 */
3833 return CheckForTakeItem(item); //the two functions are currently identical
3834 }
3835
3836 //-------------------------------------------------------------
3841 {
3842 PlayerBase player = PlayerBase.Cast(this);
3843 if (!player)
3844 return true;
3845
3846 if (!IsAlive() || player.IsUnconscious())
3847 return true;
3848 return false;
3849 }
3850
3851#ifdef DEVELOPER
3852
3853 // -------------------------------------------------------------------------
3854 override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
3855 {
3856 super.OnRPC(sender, rpc_type, ctx);
3857
3858 if (rpc_type == ERPCs.RPC_DAYZPLAYER_DEBUGSERVERWALK)
3859 {
3860 Print("ERPCs.RPC_DAYZPLAYER_DEBUGSERVERWALK");
3861
3862 Param1<bool> rp = new Param1<bool>(false);
3863 ctx.Read(rp);
3864
3865 GetInputController().OverrideMovementSpeed(rp.param1, 1);
3866 GetInputController().OverrideAimChangeX(rp.param1, 0.01);
3867
3868 }
3869 }
3870
3871#endif
3872
3873 bool IsLanded(int pCurrentCommandID)
3874 {
3875 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
3876 {
3877 HumanCommandFall fall = GetCommand_Fall();
3878
3879 if (fall)
3880 {
3881 return fall.PhysicsLanded();
3882 }
3883 }
3884
3885 return false;
3886 }
3887
3888 bool OnLand(int pCurrentCommandID, FallDamageData fallDamageData)
3889 {
3890 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL)
3891 {
3892 HumanCommandFall fall = GetCommand_Fall();
3893
3894 if (fall)
3895 {
3896 fall.Land(fallDamageData.m_LandType);
3897 return true;
3898 }
3899 }
3900
3901 return false;
3902 }
3903
3904 bool IsAlreadyInFallingCommand(int pCurrentCommandID)
3905 {
3906 return pCurrentCommandID == DayZPlayerConstants.COMMANDID_FALL;
3907 }
3908
3910 void OverrideSlidePoseAngle(float value)
3911 {
3912 if (!m_MoveSettings)
3913 m_MoveSettings = GetDayZPlayerType().CommandMoveSettingsW();
3914 if (m_MoveSettings.m_fSlidingPoseAngle != value)
3915 {
3916 m_MoveSettings.m_fSlidingPoseAngle = value;
3917 StartCommand_Move(); //nescessary, re-initializes with adjusted values
3918 }
3919 }
3920
3922 {
3923 return GetDayZPlayerType().CommandMoveSettingsW().m_fSlidingPoseAngle;
3924 }
3925
3927 {
3928 }
3929
3931 {
3932 return m_PlayerSelected;
3933 }
3934
3936
3939
3940 void SetSuicide(bool state)
3941 {
3942 m_Suicide = state;
3943 }
3944
3946 {
3947 return m_Suicide;
3948 }
3949
3951 void OnLadder(float delta_time, HumanMovementState pState);
3952
3953 //-------------------------------------------------------------
3957
3958 override protected void EOnContact(IEntity other, Contact extra)
3959 {
3960 if (!IsAlive())
3961 return;
3962
3963 if (GetParent() == other)
3964 return;
3965
3966 Transport transport = Transport.Cast(other);
3967 if (transport)
3968 {
3969 if (g_Game.IsServer())
3970 {
3971 RegisterTransportHit(transport);
3972 }
3973 }
3974 }
3975
3976 protected void AttenuateSoundIfNecessary(SoundObject soundObject)
3977 {
3978 if (g_Game.GetPlayer() != NULL && (IsSoundInsideBuilding() != g_Game.GetPlayer().IsSoundInsideBuilding() || IsCameraInsideVehicle() != g_Game.GetPlayer().IsCameraInsideVehicle()))
3979 {
3980 soundObject.SetKind(WaveKind.WAVEATTALWAYS);
3981 }
3982 else
3983 {
3984 soundObject.SetKind(WaveKind.WAVEEFFECTEX);
3985 }
3986 }
3987
3990
3991 void SetHandheldOpticsInUse(bool state)
3992 {
3993 m_HandheldOpticsInUse = state;
3994 }
3995
3997 {
3998 return m_HandheldOpticsInUse;
3999 }
4000
4004
4006 {
4007 return m_IsRaised;
4008 }
4009
4011
4013 // Will return true when the item is not heavy as well
4014 bool CanPickupHeavyItem(notnull EntityAI item)
4015 {
4016 return !item.IsHeavyBehaviour() || (item.IsHeavyBehaviour() && DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_ERECT));
4017 }
4018
4019 bool CanPickupHeavyItemSwap(notnull EntityAI item1, notnull EntityAI item2)
4020 {
4021 return CanPickupHeavyItem(item1) && CanPickupHeavyItem(item2);
4022 }
4023
4031 {
4032 array<InventoryItem> optics;
4033
4034 // Find preferred optics, i.e. active on in hands (if any are held) or the ones attached to weapon (if any is held)
4035 ItemOptics preferredOptics;
4036 {
4037 HumanInventory inventory = GetHumanInventory();
4038 EntityAI itemInHands = inventory.GetEntityInHands();
4039
4040 ItemOptics opticsInHands = ItemOptics.Cast(itemInHands);
4041 if (opticsInHands)
4042 {
4043 preferredOptics = opticsInHands;
4044 }
4045 else
4046 {
4047 Weapon_Base weaponInHands = Weapon_Base.Cast(itemInHands);
4048 if (weaponInHands)
4049 {
4050 preferredOptics = weaponInHands.GetAttachedOptics();
4051 }
4052 }
4053 }
4054
4055 // Draw selected optics when the player is viewing through them
4056 if (preferredOptics && preferredOptics.IsInOptics() && preferredOptics.IsUsingOptics2DModel())
4057 {
4058 optics = {}; // only allocate the array when necessary
4059 optics.Insert(preferredOptics);
4060 }
4061
4062 // Draw equipped NVGs
4064
4066 query.m_Placement = ECachedEquipmentPlacement.ATTACHMENT;
4067 query.m_ParentPlacement = {InventorySlots.HEADGEAR, InventorySlots.EYEWEAR};
4068
4069 array<Entity> nvgs = GetCachedEquipment().GetEntitiesByCategory(query);
4070
4071 EntityAI nvAttachment;
4072 foreach (Entity nvg : nvgs)
4073 {
4074 nvAttachment = EntityAI.Cast(nvg);
4075 break;
4076 }
4077
4078 if (nvAttachment)
4079 {
4080 bool blockedByOptics = preferredOptics && preferredOptics.IsInOptics() && !preferredOptics.IsUsingOptics2DModel();
4081 if ((!blockedByOptics || preferredOptics.IsUsableWithNV()) && PlayerBase.Cast(this).IsNVGWorking())
4082 {
4083 NVGoggles goggles = NVGoggles.Cast(nvAttachment);
4084 if (goggles)
4085 {
4086 if (!optics)
4087 optics = {};
4088
4089 optics.Insert(goggles);
4090 }
4091 }
4092 }
4093
4094 return optics;
4095 }
4096
4097#ifdef DIAG_DEVELOPER
4098 Weapon_Base SpawnWeaponInHands(string type)
4099 {
4100 return Weapon_Base.Cast(GetHumanInventory().CreateInHands(type));
4101 }
4102#endif
4103
4105 //Obsolete stuff below this point//
4107
4108 static const int DEAD_SCREEN_DELAY = 1000;
4109 protected bool m_CameraEyeZoom; //DEPRECATED
4110 ref Timer m_ADSAutomationTimer; //DEPRECATED
4111 protected bool m_ADSTimerLaunched; //DEPRECATED
4112 protected bool m_ProcessWeaponRaiseCompleted; //DEPRECATED
4113 protected bool m_IsFireWeaponRaised; //DEPRECATED, value still set for legacy reasons
4114 protected bool m_WasIronSight; // moved from player to weapon
4115 void SetReturnToOptics(bool state); //DEPRECATED
4116 void RunADSTimer(); //DEPRECATED
4117 void StopADSTimer(); //DEPRECATED
4119 void DepleteStamina(EStaminaModifiers modifier, float dT = -1) {};
4120
4121 [Obsolete("1.30: uses CGame GetSurfaceInfo* methods instead")]
4122 string GetSurfaceType(SurfaceAnimationBone limbType)
4123 {
4124 string surfaceType;
4125 int liquidType;
4126
4127 g_Game.SurfaceUnderObjectByBoneCorrectedLiquid(this, limbType, surfaceType, liquidType);
4128
4129 return surfaceType;
4130 }
4131}
void InventoryItemType()
void syncDebugPrint(string s)
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_MELEE_TARGET
const int INPUT_UDT_INVENTORY
const int INPUT_UDT_WEAPON_REMOTE_EVENT
const int INPUT_UDT_HAND_REMOTE_EVENT
void HandleCeilingDustStepEffect(SurfaceInfo surfaceInfo)
Определения AnimalBase.c:99
void OnRPC(PlayerIdentity sender, int rpcType, ParamsReadContext ctx)
Определения BunkerBroadcastComponent.c:182
class CEItemProfile CEApi
API to interact with Central Economy.
Определения CentralEconomy.c:229
proto native CEApi GetCEApi()
Get the CE API.
proto native void SpawnEntity(string sClassName, vector vPos, float fRange, int iCount)
Spawn an entity through CE.
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:37
const int RF_DEFAULT
Определения CentralEconomy.c:66
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
AnimBootsType
Определения DayZAnimEvents.c:98
bool ModCommandHandlerInside(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZAnimal.c:180
proto native int GetBoneIndexByName(string pBoneName)
returns bone index for a name (-1 if pBoneName doesn't exist)
proto native void ResetDeathCooldown()
bool ModCommandHandlerBefore(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZAnimal.c:175
bool ModCommandHandlerAfter(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZAnimal.c:185
DayZGame g_Game
Определения DayZGame.c:4074
void DayZPlayerImplementFallDamage(DayZPlayer pPlayer)
Определения DayZPlayerImplementFallDamage.c:73
void DayZPlayerImplementMeleeCombat(DayZPlayerImplement player)
void DayZPlayerMeleeFightLogic_LightHeavy(DayZPlayerImplement player)
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
vector position
Определения DustKickupEffects.c:20
vector orientation
Определения DustKickupEffects.c:21
ECachedEquipmentItemCategory
Определения ECachedEquipmentItemCategory.c:2
ECachedEquipmentPlacement
Определения ECachedEquipmentPlacement.c:2
ECameraZoomType
Определения ECameraZoomType.c:2
DiagMenuIDs
Определения EDiagMenuIDs.c:2
ERPCs
Определения ERPCs.c:2
EStaminaConsumers
Определения EStaminaConsumers.c:2
EStaminaModifiers
Определения EStaminaModifiers.c:2
bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
Определения EmoteManager.c:517
bool IsProcessing()
returns true when FP is heating or cooling
Определения FireplaceBase.c:1663
void PlaySound()
Определения HungerSoundHandler.c:39
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
void ModifiersManager(PlayerBase player)
Определения ModifiersManager.c:80
MotorbikeOwnerState TransportOwnerState GetOwnerStateType()
Native class for motorbikes - handles physics simulation.
Определения Motorbike.c:33
override event GetMoveType()
Определения Motorbike.c:39
proto void AddNoise(EntityAI source_entity, NoiseParams noise_params, float external_strenght_multiplier=1.0)
class NoiseSystem NoiseParams()
Определения Noise.c:18
string path
Определения OptionSelectorMultistate.c:142
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
Определения ParticleManager.c:88
void PlayerSoundEventHandler(PlayerBase player)
Определения PlayerSoundEventHandler.c:55
EPlayerSoundEventID
Определения PlayerSoundEventHandler.c:3
void PluginDayzPlayerDebug()
Определения PluginDayzPlayerDebug.c:275
PluginManager GetPluginManager()
Returns registred plugin by class type, better is to use global funtion GetPlugin(typename plugin_typ...
Определения PluginManager.c:284
void ReplaceSoundEventHandler(PlayerBase player)
Определения ReplaceSoundEventHandler.c:27
ESoundEventType
Определения ReplaceSoundEventHandler.c:2
WaveKind
Определения Sound.c:2
int GetCurrentCommandID()
Определения StateManager.c:279
proto native UAInputAPI GetUApi()
void WoodBase()
Определения WoodBase.c:30
ECachedEquipmentItemCategory m_Category
Определения CachedEquipmentStorageBase.c:5
ref TIntArray m_ParentPlacement
Определения CachedEquipmentStorageBase.c:4
ECachedEquipmentPlacement m_Placement
Определения CachedEquipmentStorageBase.c:6
Super root of all classes in Enforce script.
Определения EnScript.c:11
Определения Contact.c:10
Определения ZombieBase.c:2
int m_DamageHitAnimType
Определения DayZPlayerImplement.c:1336
void ProcessSoundEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3674
void DepleteStamina(EStaminaModifiers modifier, float dT=-1)
Определения DayZPlayerImplement.c:4119
void ProcessLiftWeapon()
bool IsWeaponDebugEnabled()
Определения DayZPlayerImplement.c:343
bool m_RaiseStarted
Определения DayZPlayerImplement.c:153
void ResetWeaponRaiseProgress()
Определения DayZPlayerImplement.c:929
void SendSoundEventEx(EPlayerSoundEventID id, int param=0)
DayZPlayerImplementThrowing GetThrowing()
Определения DayZPlayerImplement.c:257
void LockControls(bool state)
Определения DayZPlayerImplement.c:883
override void StopDeathDarkeningEffect()
Определения DayZPlayerImplement.c:835
override bool IsShootingFromCamera()
Определения DayZPlayerImplement.c:282
bool m_IsUnconsciousFalling
Определения DayZPlayerImplement.c:126
bool m_HandheldOpticsInUse
Определения DayZPlayerImplement.c:143
float m_SprintedTime
Определения DayZPlayerImplement.c:104
int m_NextVoNNoiseTime
Определения DayZPlayerImplement.c:148
ref PlayerSoundEventHandler m_PlayerSoundEventHandler
Определения DayZPlayerImplement.c:100
void OverrideShootFromCamera(bool pState)
Определения DayZPlayerImplement.c:287
float m_DamageHitDir
Определения DayZPlayerImplement.c:1337
WeaponManager GetWeaponManager()
Определения DayZPlayerImplement.c:1017
void SendCompleteWeaponRaiseJuncture()
bool m_Suicide
Определения DayZPlayerImplement.c:123
AnimBackType GetBackAttachmentType()
Определения DayZPlayerImplement.c:3171
void ShowDeadScreen(bool show, float duration)
Определения DayZPlayerImplement.c:802
void OverrideSlidePoseAngle(float value)
movement sliding override, originally for FB gestures
Определения DayZPlayerImplement.c:3910
float m_WeaponRaiseTime
Определения DayZPlayerImplement.c:112
void StopHandEvent()
Определения DayZPlayerImplement.c:1861
bool IsWeaponRaiseCompleted()
Определения DayZPlayerImplement.c:935
ref DayZPlayerImplementJumpClimb m_JumpClimb
Определения DayZPlayerImplement.c:98
bool m_Camera3rdPerson
Определения DayZPlayerImplement.c:109
bool m_WeaponRaiseCompleted
measures time from the weapon raise start to complete raise (once per)
Определения DayZPlayerImplement.c:113
bool IsTryingHoldBreath()
Определения DayZPlayerImplement.c:321
void ResetDamageHitState(bool resetTimer)
Определения DayZPlayerImplement.c:1444
void SetFallYDiff(float value)
Определения DayZPlayerImplement.c:348
bool IsLanded(int pCurrentCommandID)
Определения DayZPlayerImplement.c:3873
void CompleteWeaponRaise()
Определения DayZPlayerImplement.c:920
float m_SprintedTimePerStanceMin
Определения DayZPlayerImplement.c:105
void OnSoundEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3484
void ShowWeaponDebug(bool show)
Определения DayZPlayerImplement.c:331
float m_FallYDiff
Определения DayZPlayerImplement.c:103
bool m_ShouldBeUnconscious
Определения DayZPlayerImplement.c:125
void SetIronsights(bool value)
Определения DayZPlayerImplement.c:363
ref array< AbstractWave > m_PerformedActionSounds
Определения DayZPlayerImplement.c:150
void TriggerPullPlayerOutOfVehicle()
Определения DayZPlayerImplement.c:529
ref Timer m_ADSAutomationTimer
Определения DayZPlayerImplement.c:4110
bool IsFBSymptomPlaying()
Определения DayZPlayerImplement.c:489
AbstractWave ProcessVoiceEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3716
bool CheckForRespawn(EntityAI item)
Определения DayZPlayerImplement.c:3840
override bool IsEyeZoom()
Legacy.
Определения DayZPlayerImplement.c:272
bool IsLiftWeapon()
bool m_IsShootingFromCamera
Определения DayZPlayerImplement.c:121
bool m_CameraIronsight
Определения DayZPlayerImplement.c:115
void ProcessAttachmentEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3608
void RequestSoundEventEx(EPlayerSoundEventID id, bool from_server_and_client=false, int param=0)
float GetSlidePoseAngle()
Определения DayZPlayerImplement.c:3921
bool CommitedSuicide()
Определения DayZPlayerImplement.c:3945
void OnParticleEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3545
void ~DayZPlayerImplement()
Определения DayZPlayerImplement.c:267
bool HandleDamageHit(int pCurrentCommandID)
Определения DayZPlayerImplement.c:1409
override CachedEquipmentStorage GetCachedEquipment()
Определения DayZPlayerImplement.c:463
void HandleCeilingDustStepEffect(SurfaceInfo surfaceInfo, string boneName)
Определения DayZPlayerImplement.c:3800
void RequestSoundEventStop(EPlayerSoundEventID id, bool from_server_and_client=false, int param=EPlayerSoundEventParam.STOP_PLAYBACK)
override array< InventoryItem > OnDrawOptics2D()
Определения DayZPlayerImplement.c:4030
void SetIsInThirdPerson(bool state)
Определения DayZPlayerImplement.c:307
bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
Определения DayZPlayerImplement.c:3052
void SetSuicide(bool state)
Определения DayZPlayerImplement.c:3940
bool m_CameraOpticsAimOverride
Определения DayZPlayerImplement.c:117
bool ModCommandHandlerBefore(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZPlayerImplement.c:2266
void StopADSTimer()
void HandleWeapons(float pDt, Entity pInHands, HumanInputController pInputs, out bool pExitIronSights)
Определения DayZPlayerImplement.c:1023
bool m_IsUnconscious
Определения DayZPlayerImplement.c:124
bool m_ProcessLiftWeapon
Определения DayZPlayerImplement.c:136
ref DayZPlayerMeleeFightLogic_LightHeavy m_MeleeFightLogic
Определения DayZPlayerImplement.c:95
void EOnContact(IEntity other, Contact extra)
Определения DayZPlayerImplement.c:3958
void CheckAnimationOverrides()
Определения DayZPlayerImplement.c:3926
void OnSprintEnd()
Определения DayZPlayerImplement.c:3022
AbstractWave PlaySound(SoundObject so, SoundObjectBuilder sob)
Определения DayZPlayerImplement.c:3248
bool m_ProcessResetADS
Определения DayZPlayerImplement.c:145
bool IsWeaponObstructionBlockingADS()
override void OnItemInHandsChangedEx(bool pInstant=false, bool pChangeAnimationInstance=true)
Определения DayZPlayerImplement.c:1002
bool m_CameraZoomToggle
Определения DayZPlayerImplement.c:110
bool ProcessJumpOrClimb(float pDt, int pCurrentCommandID)
Определения DayZPlayerImplement.c:1766
bool m_IsFireWeaponRaised
Определения DayZPlayerImplement.c:4113
ref DayZPlayerImplementAiming m_AimingModel
Определения DayZPlayerImplement.c:93
void RequestSoundEvent(EPlayerSoundEventID id, bool from_server_and_client=false)
bool m_ProcessLiftWeaponState
Определения DayZPlayerImplement.c:137
string GetSurfaceType(SurfaceAnimationBone limbType)
Определения DayZPlayerImplement.c:4122
ref DeathEffectTimer m_DeathEffectTimer
Определения DayZPlayerImplement.c:130
void OnSprintStart()
Определения DayZPlayerImplement.c:3013
void SetClimbingLadderType(string value)
Определения DayZPlayerImplement.c:455
static const float DEFAULT_DYING_TIME
Определения DayZPlayerImplement.c:88
ref DayZPlayerImplementThrowing m_Throwing
Определения DayZPlayerImplement.c:97
override float GetCurrentWaterLevel()
Определения DayZPlayerImplement.c:353
bool ModCommandHandlerAfter(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZPlayerImplement.c:2276
void HideClothing(ItemOptics optic, bool state)
Определения DayZPlayerImplement.c:2694
bool CanPickupHeavyItemSwap(notnull EntityAI item1, notnull EntityAI item2)
Определения DayZPlayerImplement.c:4019
override void SetCurrentWaterLevel(float pWaterLevel)
Определения DayZPlayerImplement.c:358
void TriggerPullPlayerOutOfVehicleImpl()
Определения DayZPlayerImplement.c:578
bool m_ContinueFirearmMelee
Определения DayZPlayerImplement.c:133
float m_fObstructionSmooth
Определения DayZPlayerImplement.c:168
bool m_TriggerPullPlayerOutOfVehicleSynch
Определения DayZPlayerImplement.c:160
int m_DeathAnimType
Определения DayZPlayerImplement.c:504
bool IsAlreadyInFallingCommand(int pCurrentCommandID)
Определения DayZPlayerImplement.c:3904
int m_LastCommandBeforeUnconscious
Определения DayZPlayerImplement.c:128
bool IsInFBEmoteState()
Checks if fullbody animation or specific locked state is active in emote manager.
bool CanConsumeStamina(EStaminaConsumers consumer)
bool m_DeathJuctureSent
Определения DayZPlayerImplement.c:506
bool OnLand(int pCurrentCommandID, FallDamageData fallDamageData)
Определения DayZPlayerImplement.c:3888
float m_TestDamageCounter
Определения DayZPlayerImplement.c:2701
bool m_PlayerSelected
Определения DayZPlayerImplement.c:122
override void OnItemInHandsChanged()
Определения DayZPlayerImplement.c:997
static const int DEAD_SCREEN_DELAY
Определения DayZPlayerImplement.c:4108
ref DayZPlayerImplementMeleeCombat m_MeleeCombat
Определения DayZPlayerImplement.c:94
override int CameraHandler(int pCameraMode)
Определения DayZPlayerImplement.c:2845
float m_LastHeadingAngle
Определения DayZPlayerImplement.c:2254
int m_DebugWeaponChangeShowSlot
Определения DayZPlayerImplement.c:2707
override int GetEyeZoomLevel()
Определения DayZPlayerImplement.c:277
Transport GetTransportCache()
Get the transport that was cached when entering unconsciousness.
Определения DayZPlayerImplement.c:509
string m_DebugWeaponChangeItem
Определения DayZPlayerImplement.c:2706
bool CanStartConsumingStamina(EStaminaConsumers consumer)
bool PlaySoundEvent(EPlayerSoundEventID id, bool from_anim_system=false, bool is_from_server=false)
Определения DayZPlayerImplement.c:485
bool ModCommandHandlerInside(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZPlayerImplement.c:2271
bool IsInIronsights()
Определения DayZPlayerImplement.c:292
override bool IsInThirdPerson()
Определения DayZPlayerImplement.c:302
void ProcessFeetDamageServer(int pUserInt)
bool m_IsWeapon
Определения DayZPlayerImplement.c:155
int m_PullPlayerOutOfVehicleState
Определения DayZPlayerImplement.c:162
void SetVariablesLadderSoundObjectBuilder(SoundObjectBuilder soundObjectBuilder)
Определения DayZPlayerImplement.c:3641
DayZPlayerImplementMeleeCombat GetMeleeCombat()
Определения DayZPlayerImplement.c:247
bool m_DebugTypeVal
Определения DayZPlayerImplement.c:2703
bool StopSoundEvent(EPlayerSoundEventID id, bool is_from_server=false, int param=0)
Определения DayZPlayerImplement.c:487
bool IsClimbingLadder()
Определения DayZPlayerImplement.c:478
void SetHandheldOpticsInUse(bool state)
Определения DayZPlayerImplement.c:3991
ref array< ref SyncHitInfo > m_SyncedHitDataArray
Определения DayZPlayerImplement.c:149
void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
Определения DayZPlayerImplement.c:3103
DayZPlayerImplementFallDamage GetFallDamage()
Определения DayZPlayerImplement.c:262
ref WeaponDebug m_WeaponDebug
Определения DayZPlayerImplement.c:129
bool m_bADS
Определения DayZPlayerImplement.c:111
float m_LastHeadingAngleBlock
Определения DayZPlayerImplement.c:2252
void OnLadder(float delta_time, HumanMovementState pState)
called every command handler tick when player is on ladder
ref DustEffectCeilingHandlerSynced m_CeilingDustHandler
Определения DayZPlayerImplement.c:166
bool IsSwimming()
Определения DayZPlayerImplement.c:473
void AttenuateSoundIfNecessary(SoundObject soundObject)
Определения DayZPlayerImplement.c:3976
bool m_ProcessWeaponRaiseCompleted
Определения DayZPlayerImplement.c:4112
void EvaluateDamageHit(int pCurrentCommandID)
Must be ran at the start of CommandHandler before Jump is triggered.
Определения DayZPlayerImplement.c:1349
void OnMovementChanged()
Event, called when HumanMovementState.m_iMovement changes...walk, run, sprint, etc....
Определения DayZPlayerImplement.c:3000
bool CanClimb(int climbType, SHumanCommandClimbResult climbRes)
Определения DayZPlayerImplement.c:1821
bool m_PullPlayerOutOfVehicleKeepsInLocalSpace
Определения DayZPlayerImplement.c:161
override bool HeadingModel(float pDt, SDayZPlayerHeadingModel pModel)
is replayed after correction when 'NetworkRewindType.REPLAY' is used
Определения DayZPlayerImplement.c:1635
void DeathDropHandEntity()
Определения DayZPlayerImplement.c:608
bool m_CameraOptics
Определения DayZPlayerImplement.c:116
void OnJumpStart()
Определения DayZPlayerImplement.c:1853
void SetOptics(bool value)
Определения DayZPlayerImplement.c:383
bool IsFighting()
void ExitSights()
Определения DayZPlayerImplement.c:399
int m_DebugWeaponChangeStage
Определения DayZPlayerImplement.c:2705
bool IsInFullbodyDamageAnimation()
Определения DayZPlayerImplement.c:1343
bool IsPlayerSelected()
Определения DayZPlayerImplement.c:3930
void SetReturnToOptics(bool state)
ref Timer m_FightEndBlendTimer
Определения DayZPlayerImplement.c:131
bool IsSprintFull()
Определения DayZPlayerImplement.c:326
bool PlaySoundEventType(ESoundEventType soundType, int soundEventID, int param=0)
Handle sound event by respective sound handler based on its type.
Определения DayZPlayerImplement.c:484
void SyncDeferredEventToRemotes()
Определения DayZPlayerImplement.c:1877
float m_LastHeadingAngleBlock2
Определения DayZPlayerImplement.c:2253
bool m_isFBsymptomPlaying
Определения DayZPlayerImplement.c:142
bool CanJump()
Определения DayZPlayerImplement.c:1785
bool m_WasInVehicle
Определения DayZPlayerImplement.c:159
override void OnInputForRemote(ParamsReadContext ctx)
Определения DayZPlayerImplement.c:946
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
event from damage system
Определения DayZPlayerImplement.c:1563
bool m_WasIronSight
Определения DayZPlayerImplement.c:4114
override void EEKilled(Object killer)
Определения DayZPlayerImplement.c:795
bool m_ResetADS
Определения DayZPlayerImplement.c:144
string m_ClimbingLadderType
Определения DayZPlayerImplement.c:141
float m_ProcessObstructWeapon
Определения DayZPlayerImplement.c:138
float m_DebugDirectionVal
VKOSTIK - tady dat 0 misto -1.
Определения DayZPlayerImplement.c:2702
AnimRangedWeaponType GetShoulderAttachmentType()
Определения DayZPlayerImplement.c:3193
bool m_AimingFinisherStarted
Определения DayZPlayerImplement.c:154
bool IsInVehicle()
Определения DayZPlayerImplement.c:468
void CommandHandlerDebug(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZPlayerImplement.c:2710
void HandleADS()
Определения DayZPlayerImplement.c:1886
int GetTypeOfDeath(int pCurrentCommandID)
Определения DayZPlayerImplement.c:762
int m_StepCounter
Определения DayZPlayerImplement.c:146
ref HumanMovementState m_MovementState
time step for gradual update of dead screen visibilibty up to full visbility [s]
Определения DayZPlayerImplement.c:92
ref DayZPlayerImplementFallDamage m_FallDamage
Определения DayZPlayerImplement.c:99
int m_ActionSoundCategoryHash
Определения DayZPlayerImplement.c:163
int m_LastBackSoundTime
Определения DayZPlayerImplement.c:2255
void SendDeathJuncture(int pAnimTypeDeath, float pAnimHitDirDeath)
Определения DayZPlayerImplement.c:786
bool IsHandheldOpticsInUse()
Определения DayZPlayerImplement.c:3996
bool m_CameraEyeZoom
DEPRECATED.
Определения DayZPlayerImplement.c:4109
override void OnVariablesSynchronized()
Определения DayZPlayerImplement.c:598
int m_LastSurfaceUnderHash
Определения DayZPlayerImplement.c:139
AnimBootsType GetBootsType()
Определения DayZPlayerImplement.c:3122
float GetWeaponObstruction()
bool IsInOptics()
Определения DayZPlayerImplement.c:297
bool m_IsTryingHoldBreath
Определения DayZPlayerImplement.c:120
bool m_LiftWeapon_player
Определения DayZPlayerImplement.c:134
void SimulateDeath(bool state)
Определения DayZPlayerImplement.c:844
DayZPlayerInventory GetDayZPlayerInventory()
Определения DayZPlayerImplement.c:940
bool EvaluateDamageHitAnimation(TotalDamageResult pDamageResult, int pDamageType, EntityAI pSource, string pComponent, string pAmmoType, vector pModelPos, out int pAnimType, out float pAnimHitDir, out bool pAnimHitFullbody)
selects animation type and direction based on damage system data
Определения DayZPlayerImplement.c:1485
static const float DYING_PROGRESSION_TIME
how long does it take to full death screen [s]
Определения DayZPlayerImplement.c:89
bool IsFireWeaponRaised()
Определения DayZPlayerImplement.c:312
bool HandleDeath(int pCurrentCommandID)
Определения DayZPlayerImplement.c:650
float m_ObstructWeapon_player
Определения DayZPlayerImplement.c:135
const float HIT_INTERVAL_MIN
Определения DayZPlayerImplement.c:1340
bool IsRestrained()
void DayZPlayerImplement()
constructor
Определения DayZPlayerImplement.c:172
bool m_IsRaised
Определения DayZPlayerImplement.c:107
float m_fLastHeadingDiff
Определения DayZPlayerImplement.c:1632
bool m_DamageHitFullbody
Определения DayZPlayerImplement.c:1335
float m_dT
Определения DayZPlayerImplement.c:165
bool CheckForTakeItem(EntityAI item)
Определения DayZPlayerImplement.c:3811
override string GetDebugText()
Определения DayZPlayerImplement.c:514
AnimUpperBodyType GetBodyAttachmentType()
Определения DayZPlayerImplement.c:3140
float m_DamageHealth
Определения DayZPlayerImplement.c:1338
void ProcessWeaponEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3551
bool CanPickupHeavyItem(notnull EntityAI item)
-------------— Checks if player can pick up heavy item ----------------------—
Определения DayZPlayerImplement.c:4014
bool m_ProcessFirearmMeleeHit
Определения DayZPlayerImplement.c:132
SHumanCommandMoveSettings m_MoveSettings
Определения DayZPlayerImplement.c:102
void OnJumpEnd(int pLandType=0)
Определения DayZPlayerImplement.c:1857
void AddNoise(NoiseParams noisePar, float noiseMultiplier=1.0)
Определения DayZPlayerImplement.c:3258
DayZPlayerImplementAiming GetAimingModel()
Определения DayZPlayerImplement.c:242
int m_LastBackSoundTime2
Определения DayZPlayerImplement.c:2256
void CheckLiftWeapon()
float m_DeathDarkeningCurrentTime
Определения DayZPlayerImplement.c:119
bool PlaySoundEventEx(EPlayerSoundEventID id, bool from_anim_system=false, bool is_from_server=false, int param=0)
Определения DayZPlayerImplement.c:486
bool CheckForDropItem(EntityAI item)
Определения DayZPlayerImplement.c:3822
bool m_SprintFull
Определения DayZPlayerImplement.c:106
void HandleOptic(notnull ItemOptics optic, bool inHands, HumanInputController pInputs, out bool pExitOptics)
Определения DayZPlayerImplement.c:1245
bool EvaluateDeathAnimation(int pDamageType, EntityAI pSource, string pAmmoType, out int pAnimType, out float pAnimHitDir)
selects animation type and direction based on damage system data
Определения DayZPlayerImplement.c:1456
void RunADSTimer()
void StopWeaponEvent()
Определения DayZPlayerImplement.c:1866
float m_CurrentWaterLevel
Определения DayZPlayerImplement.c:157
void OnStepEvent(string pEventType, string pUserString, int pUserInt)
Определения DayZPlayerImplement.c:3269
void ResetDeathStartTime()
Определения DayZPlayerImplement.c:757
override bool AimingModel(float pDt, SDayZPlayerAimingModel pModel)
Определения DayZPlayerImplement.c:1723
ref ReplaceSoundEventHandler m_ReplaceSoundEventHandler
Определения DayZPlayerImplement.c:101
DayZPlayerMeleeFightLogic_LightHeavy GetMeleeFightLogic()
Определения DayZPlayerImplement.c:252
void SendSoundEvent(EPlayerSoundEventID id)
float m_fObstructionSmoothVelocity[1]
Определения DayZPlayerImplement.c:169
bool m_ADSTimerLaunched
Определения DayZPlayerImplement.c:4111
void SwitchOptics(ItemOptics optic, bool state)
Определения DayZPlayerImplement.c:428
float GetDeltaT()
Определения DayZPlayerImplement.c:494
void OnInputUserDataReceived(ParamsReadContext ctx)
Определения DayZPlayerImplement.c:3040
override void CommandHandler(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения DayZPlayerImplement.c:2288
override void OnInputFromServer(ParamsReadContext ctx)
Определения DayZPlayerImplement.c:972
bool IsRaised()
Определения DayZPlayerImplement.c:4005
float m_SoundOffset
Определения DayZPlayerImplement.c:2257
ref DayZPlayerImplementSwimming m_Swimming
Определения DayZPlayerImplement.c:96
bool m_ShouldReload
Определения DayZPlayerImplement.c:108
void SetDeathDarknessLevel(float duration, float tick_time)
void AbortWeaponEvent()
Определения DayZPlayerImplement.c:1871
void DepleteStaminaEx(EStaminaModifiers modifier, float dT=-1, float coef=1.0)
void HandleView()
Определения DayZPlayerImplement.c:2018
ECameraZoomType m_CameraEyeZoomLevel
Определения DayZPlayerImplement.c:114
float m_DeathHitDir
Определения DayZPlayerImplement.c:505
float m_HitElapsedTime
Определения DayZPlayerImplement.c:1341
bool m_UnconsciousDebug
Определения DayZPlayerImplement.c:127
Transport m_TransportCache
Определения DayZPlayerImplement.c:140
static const int DAYZCAMERA_OPTICS
optics
Определения DayZPlayerCameras.c:13
static const int DAYZCAMERA_1ST
1st person camera
Определения DayZPlayerCameras.c:3
static const int DAYZCAMERA_3RD_PRO_RAISED
3rd - laying raised
Определения DayZPlayerCameras.c:10
static const int DAYZCAMERA_3RD_CLIMB
climb / vault
Определения DayZPlayerCameras.c:16
static const int DAYZCAMERA_3RD_CRO_RAISED
3rd - crouch
Определения DayZPlayerCameras.c:8
static const int DAYZCAMERA_3RD_ERC_SPR
3rd - standing sprint
Определения DayZPlayerCameras.c:5
static const int DAYZCAMERA_3RD_PRO
3rd - laying
Определения DayZPlayerCameras.c:9
static const int DAYZCAMERA_3RD_ERC
3rd - standing
Определения DayZPlayerCameras.c:4
static const int DAYZCAMERA_IRONSIGHTS
ironsights camera
Определения DayZPlayerCameras.c:12
static const int DAYZCAMERA_3RD_CRO
3rd - crouch
Определения DayZPlayerCameras.c:7
static const int DAYZCAMERA_3RD_ERC_RAISED
3rd - standing raised
Определения DayZPlayerCameras.c:6
static const int DAYZCAMERA_1ST_UNCONSCIOUS
unconscious
Определения DayZPlayerCameras.c:14
static const int DAYZCAMERA_3RD_ERC_RAISED_MELEE
3rd - laying raised
Определения DayZPlayerCameras.c:11
static const int DAYZCAMERA_1ST_VEHICLE
vehicle 1st person
Определения DayZPlayerCameras.c:18
static const int DAYZCAMERA_3RD_JUMP
jump
Определения DayZPlayerCameras.c:15
override void OnSimulationEnd()
Определения DayZPlayerImplement.c:15
override bool ShouldSimulationBeDisabled()
Определения DayZPlayerImplement.c:20
Определения DayZPlayerImplement.c:87
at which point does the stabilization start to get affected
Определения DayZPlayerImplementAiming.c:33
static bool NoHeading(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff)
Определения DayZPlayerImplementHeading.c:187
static bool RotateOrient(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff)
Определения DayZPlayerImplementHeading.c:67
static bool ClampHeading(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff)
Определения DayZPlayerImplementHeading.c:19
static void SendDamageHitEx(DayZPlayer pPlayer, int pType, float pHitDir, bool pFullbody, TotalDamageResult pDamageResult, int pDamageType, EntityAI pSource, string pComponent, string pAmmoType, vector pModelPos)
Определения DayZPlayerSyncJunctures.c:99
static const int SJ_DEATH
Определения DayZPlayerSyncJunctures.c:18
static bool ReadDamageHitParamsEx(ParamsReadContext pCtx, out SyncHitInfo pData)
Определения DayZPlayerSyncJunctures.c:132
static void SendDeath(DayZPlayer pPlayer, int pType, float pHitDir)
Определения DayZPlayerSyncJunctures.c:65
static const int SJ_DAMAGE_HIT
Определения DayZPlayerSyncJunctures.c:6
static bool ReadDeathParams(ParamsReadContext pCtx, out int pType, out float pHitDir)
Определения DayZPlayerSyncJunctures.c:74
SoundObjectBuilder GetSoundBuilder(int eventId, string slotName, int attachmentHash)
Определения dayzplayer.c:172
SoundObjectBuilder GetSoundBuilder(int eventId, int pMovement, int pSurfaceHash, AnimBootsType pBoots)
Определения dayzplayer.c:148
override SoundObjectBuilder GetSoundBuilder(int eventId, int parameterHash)
Определения DayZPlayerCfgSounds.c:211
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.
Определения 3_Game/DayZ/tools/Debug.c:183
Определения 3_Game/DayZ/tools/Debug.c:2
Определения EnDebug.c:241
Generic synced solution.
Определения DustEffectCeilingHandler.c:93
Определения Camera.c:2
proto native EntityAI FindAttachment(int slot)
Returns attached entity in slot (you can use InventorySlots.GetSlotIdFromString(name) to get slot id)
script counterpart to engine's class Inventory
void SetVehicleCommand(HumanCommandVehicle hcv)
Определения DayZPlayerImplementVehicle.c:6
proto static native bool DoClimbTest(Human pHuman, SHumanCommandClimbResult pResult, int pDebugDrawLevel)
command itself
Определения human.c:800
void OnSimulationEnd()
Определения human.c:620
proto native bool IsFinisher()
proto native void Cancel()
cancels command melee and goes to HumanCommandMove
Определения human.c:557
proto native float GetCurrentMovementSpeed()
0,1,2..3 idle, walk, run, sprint
proto native bool IsStandingFromBack()
return true if prone on back is chaning to crounch/stand
proto native bool IsChangingStance()
returns true if character is changing stance
Определения human.c:454
proto native bool IsWakingUp()
proto native bool IsRagdoll()
proto native bool IsInWater()
proto native bool IsOnLand()
Определения human.c:640
proto native Transport GetTransport()
proto native bool IsGettingIn()
proto native void ProcessLeaveEvents()
proto native bool WasGearChange()
proto native int GetVehicleSeat()
proto native bool IsGettingOut()
Определения human.c:712
proto native bool IsActionFinished()
proto native int GetRunningAction()
returns -1 when no action is running or RELOAD,MECHANISM, ....
proto native void LiftWeapon(bool pState)
command for lifting weapon near obstacles (works only when weapon is raised)
proto native void ObstructWeapon(float pState01)
command for obstruction weapon near obstacles
proto native float GetWeaponObstruction()
return obstruction value
proto native bool IsWeaponLifted()
return if lifting weapon is active
proto native bool StartAction(WeaponActions pAction, int pActionType)
start reload,mechanism,chambering,unjam ...
proto native void SetADS(bool pState)
sets head tilt to optics
proto native int IsEvent()
return -1 when there is no event, otherwise it returns pId of event from animation
Определения human.c:1027
proto native bool WeaponADS()
returns true if weapon ADS mode
proto native bool IsZeroingDown()
zeroing down
proto void GetMovement(out float pSpeed, out vector pLocalDirection)
returns pSpeed 0,1..2..3 (idle, walk, run, sprint), local normalized direction vector
proto native void ResetFreeLookToggle()
reset freelook toggle
proto native bool IsAttackButton()
returns true if 'UAFire' button is pressed (== true for multiple ticks). Synced.
proto native bool IsHoldBreath()
holding breath
proto native bool CameraViewChanged()
1st/3rd person camera view
proto native bool IsFireModeChange()
fire mode has changed
proto native bool IsZoomToggle()
zooming toggle
proto native bool IsMeleeWeaponAttack()
return weapon melee attack modifier
proto native bool IsJumpClimb()
jump/climb action was pressed
proto native void ResetADS()
resets ADS mode to default
proto native bool IsZeroingUp()
zeroing up
proto native bool IsAttackButtonDown()
returns true if 'UAFire' button has just been pressed (== true for 1 tick only). Synced.
Определения human.c:18
proto native EntityAI GetEntityInHands()
inventory for plain man/human
Определения HumanInventory.c:10
void CheckFSMState()
Определения HumanInventoryWithFSM.c:134
HumanInventory... with FSM (synchronous, no anims)
Определения HumanInventoryWithFSM.c:6
bool m_bJumpAllowed
default false
Определения humanitems.c:39
int m_StanceRotation[6]
6 stances -> all has movement mask, STANCEIDX_ ... is index
Определения humanitems.c:19
Определения humanitems.c:6
int m_iMovement
current stance (DayZPlayerConstants.STANCEIDX_ERECT, ...), only if the command has a stance
Определения human.c:1184
int m_iStanceIdx
current command's id
Определения human.c:1183
Определения human.c:1181
Определения EnEntity.c:165
proto native void SetHands(notnull EntityAI parent, EntityAI e)
sets current inventory location type to Hands
InventoryLocation.
Определения InventoryLocation.c:30
provides access to slot configuration
Определения InventorySlots.c:6
proto native bool StepZeroingUp()
sets zeroing to next defined (respective to current) value in zeroing config array
proto native bool ExitOptics()
switches out of optics mode (if possible)
bool IsUsingOptics2DModel()
Returns whether this ItemOptics uses the 2D optics model.
Определения ItemOptics.c:207
void OnOpticExit()
Определения ItemOptics.c:569
bool IsUsableWithNV()
Определения ItemOptics.c:218
proto native bool IsInOptics()
is weapon in optics mode or not
proto native bool IsUsingWeaponIronsightsOverride()
is optics using ironsights override settings or not
void OnOpticEnter()
Определения ItemOptics.c:562
proto native bool EnterOptics()
switches to optics mode if possible
bool IsSightOnly()
Определения ItemOptics.c:213
proto native bool StepZeroingDown()
sets zeroing to previous (respective to current) defined value in zeroing config array
Определения ItemOptics.c:2
Определения KillerData.c:2
static bool IsSyncLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:789
Определения EnMath.c:7
static void PlayVegetationCollideParticles(Object object, DayZPlayerImplement player)
Определения MiscEffects.c:7
Определения MiscEffects.c:2
static float GetNoiseMultiplier(DayZPlayerImplement playerImplement)
Определения SensesAIEvaluate.c:5
Определения ObjectTyped.c:2
static void SetMultiplayState(bool state)
Определения OnlineServices.c:520
Определения OnlineServices.c:2
Определения PPEConstants.c:68
Entity which has the particle instance as an ObjectComponent.
Определения ParticleSource.c:128
Определения PlayerBaseClient.c:2
static const float WEAPON_RAISE_BLEND_DELAY
Определения PlayerConstants.c:3
static const float MAX_FINISHER_RANGE
Определения PlayerConstants.c:6
static const float FULL_SPRINT_DELAY_DEFAULT
[meters]
Определения PlayerConstants.c:8
static const float HEAVY_HIT_THRESHOLD
Определения PlayerConstants.c:5
static const int CHECK_EVERY_N_STEP
Определения PlayerConstants.c:22
Определения PlayerConstants.c:2
The class that will be instanced (moddable)
Определения gameplay.c:389
float m_fCurrentAimY
Определения dayzplayer.c:1118
proto bool Read(void value_in)
Определения Sound.c:112
SoundObjectBuilder GetVegetationSoundBuilderFromEventID(int stepEventID)
Определения StaticObjectType.c:44
proto int GetStepParticleId()
proto string GetSurfaceType()
Определения SurfaceInfo.c:9
Определения SyncedValue.c:2
override void Stop()
Определения DayZPlayerImplement.c:40
Определения DayZPlayerImplement.c:39
proto native float GetHighestDamage(string healthType)
Определения DamageSystem.c:2
Native class for boats - handles physics simulation.
Определения Boat.c:29
proto native void Unlock()
proto native UAInput GetInputByID(int iID)
returns list of all bindable (i.e. visible) inputs from the active group ('core' by default)
proto native void ActivateModificator(string sModName)
proto native void DeactivateModificator(string sModName)
proto native void Lock()
proto native bool SyncedPress_ID(int action, bool check_focus=true)
Returns true just in frame, when action was invoked (button was pressed)
Определения UAInput.c:107
Определения dayzplayer.c:191
shorthand
Определения BoltActionRifle_Base.c:6
Определения WeaponDebug.c:9
script counterpart to engine's class Weapon
Определения WeaponManager.c:2
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
Определения EnConvert.c:110
static float Dot(vector v1, vector v2)
Returns Dot product of vector v1 and vector v2.
Определения EnConvert.c:305
static const vector Zero
Определения EnConvert.c:123
proto float Normalize()
Normalizes vector. Returns length.
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
Определения EnConvert.c:119
void DayZPlayerType()
Определения dayzplayer.c:512
proto native void SetVerticalMinimumAimLimit(float value)
sets vertical minimum aim limit for a player
void SDayZPlayerHeadingModel()
cannot be created from script
Определения dayzplayer.c:1105
void ForceStandUpForHeavyItems(notnull EntityAI item)
-------------— Forces player to stand up when swapping to heavy item ----------------------—
Определения dayzplayer.c:1378
DayZPlayerInstanceType
defined in C++
Определения dayzplayer.c:1084
proto native DayZPlayerType GetDayZPlayerType()
returns appropriate DayZPlayerType
proto native DayZPlayerInstanceType GetInstanceType()
proto native float IsPlayerSpeaking()
-------------— speaking anim ----------------------—
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
DayZPlayer m_pPlayer
data
Определения dayzplayer.c:135
int GetEyeZoomLevel()
returns eye zoom level, uses ECameraZoomType values
proto native bool IsPlayerInStance(int pStanceMask)
-------------— camera additiona functions ----------------------—
eModifiers
Определения eModifiers.c:2
Serializer ParamsReadContext
Определения gameplay.c:15
DayZGame GetGame()
Определения gameplay.c:636
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
proto void Print(void var)
Prints content of variable to console/log.
static proto bool GetBool(int id, bool reverse=false)
Get value as bool from the given script id.
static proto int GetEngineValue(int id)
Get value at the given engine id.
static proto int GetValue(int id)
Get value as int from the given script id.
static proto float GetEngineRangeValue(int id)
Get range value at the given engine id.
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
class array< Class T > TStringArray
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
const int INPUT_DEVICE_MOUSE
Определения 1_Core/DayZ/constants.c:24
const int INPUT_DEVICE_GAMEPAD
Определения 1_Core/DayZ/constants.c:28
const int INPUT_DEVICE_KEYBOARD
Определения 1_Core/DayZ/constants.c:23
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static proto float Acos(float c)
Returns angle in radians from cosinus.
static proto int AbsInt(int i)
Returns absolute value.
static proto float Atan2(float y, float x)
Returns angle in radians from tangent.
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 const float RAD2DEG
Определения EnMath.c:16
static proto float AbsFloat(float f)
Returns absolute value.
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.
class AbstractSoundScene SoundObjectBuilder(SoundParams soundParams)
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
void AbstractWave()
Определения Sound.c:167
class SoundObject SoundParams(string name)
proto native void SetPosition(vector position)
Note: Sets the position locally if parented, retrieves globally with the sound offset.
proto native void SetKind(WaveKind kind)
proto string Get(int index)
Gets n-th character from string.
proto native int Hash()
Returns hash of string.
void Split(string sample, out array< string > output)
Splits string into array of strings separated by 'sample'.
Определения EnString.c:396
ThirdPersonMode
Определения World.c:302
const int CALL_CATEGORY_GUI
Определения 3_Game/DayZ/tools/tools.c:9
proto native Widget GetParent()
Get parent of the Effect.
Определения Effect.c:422
class HumanCommandLadder HumanCommandSwim()
Определения human.c:695
WeaponActions
actions
Определения human.c:843
WeaponEvents
events
Определения human.c:996
class HumanCommandMelee2 HumanCommandFall()
Определения human.c:594
proto native bool IsLeavingUncon()
return true if character transitions out of uncon
class HumanCommandWeapons HumanCommandAdditives()
Определения human.c:1154
void HumanItemAccessor()
Определения humanitems.c:147
class SHumanGlobalSettings SHumanCommandMoveSettings()
Определения humansettings.c:12
class SHumanCommandSwimSettings SHumanCommandClimbSettings()
Определения humansettings.c:74