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