DayZ 1.30
DayZ Explorer by KGB
 
Загрузка...
Поиск...
Не найдено
PlayerBase.c
См. документацию.
5
6#ifdef FEATURE_NETWORK_RECONCILIATION
7class PlayerBaseOwnerState : DayZPlayerImplementOwnerState
8{
9 protected override event void Write(PawnStateWriter ctx)
10 {
11 super.Write(ctx);
12 }
13
14 protected override event void Read(PawnStateReader ctx)
15 {
16 super.Read(ctx);
17 }
18};
19
20class PlayerBaseMove : DayZPlayerImplementMove
21{
24 float m_fStaminaValue;
25 float m_fStaminaCapacity;
26 float m_fStaminaDepletion;
27
28 bool m_bStaminaSynced;
29 float m_fStaminaSyncedValue;
30 float m_fStaminaSyncedCapacity;
31
32 protected void PlayerBaseMove()
33 {
34 m_bStaminaSynced = false;
35 }
36
37 protected override event void Write(PawnMoveWriter ctx, PawnMove prev)
38 {
39 super.Write(ctx, prev);
40 }
41
42 protected override event void Read(PawnMoveReader ctx, PawnMove prev)
43 {
44 super.Read(ctx, prev);
45 }
46};
47#endif
48
49class PlayerBase extends ManBase
50{
51 const int SIMPLIFIED_SHOCK_CAP = 63;
52 const int SHAKE_LEVEL_MAX = 7;
53 private int m_LifeSpanState;
55 private int m_BloodType;
57 private bool m_LiquidTendencyDrain; //client-side only - Obsolete
60
61 protected bool m_HasHeatBuffer;
62 protected int m_HeatBufferStage;
63 protected float m_HeatBufferDynamicMax;
64
65 protected bool m_IsInColdArea;
66 protected bool m_PlayerLoaded;
68 protected bool m_ProcessUIWarning;
70 protected int m_RefreshAnimStateIdx;
71 private int m_StoreLoadVersion;
73 protected int m_LifespanLevelLocal; //control variable for change calls
74 protected int m_AnimCommandStarting; //signals the command that is about to start the next frame (e.g. Swim, Fall...)
76
77 private PluginPlayerStatus m_ModulePlayerStatus;
78 PluginConfigEmotesProfile m_ConfigEmotesProfile;
81
84 PluginRecipesManager m_ModuleRecipesManager;
85 ref BleedingSourcesManagerServer m_BleedingManagerServer;
86 ref BleedingSourcesManagerRemote m_BleedingManagerRemote;
87
93 ref Environment m_Environment;
99 ref ShockHandler m_ShockHandler; //New shock handler
102 ref TransferValues m_TrasferValues;
104 const int OVERLOAD_LIMIT = 30000;
113 ref Param3<float,float,bool> m_StaminaParam;
114 ref Param1<string> m_UAParamMessage;
115 ref Param1<float> m_UnconParam;
116 ref Param1<float> m_DeathDarkeningParam;
122 ref TInputActionMap m_InputActionMap; // Backwards compatibility
126 //ref CraftingMeta m_CraftingMeta;
133 ref PlayerSoundManagerServer m_PlayerSoundManagerServer;
138 bool m_QuickBarFT = false;
140 protected int m_RecipePick;
141 protected bool m_IsHoldingBreath;
142 protected bool m_IsInWater;
144 //AbstractWave m_SaySoundWave;
148 protected int m_CorpseStateLocal;
149 protected bool m_IsHeadingRestricted;
150 protected ref HeadingRestrictData m_HeadingRestrictData;
151
156 float m_CurrentShock; //Used to synchronize shock between server and client, utilized by ShockHandler
163 bool m_AreHandsLocked; //Currently only used to block quickbar usage after canceling placement
173 protected bool m_AllowQuickRestrain;
174 protected bool m_AllowQuickFishing;
175 protected int m_Shakes;
176 protected int m_ShakesForced;
184 Head_Default m_CharactersHead;
191 int m_BrokenLegState = eBrokenLegs.NO_BROKEN_LEGS; //Describe the current leg state, can go bellow 0, cannot be used directly to obtain broken legs state, use GetBrokenLegs() instead
192 int m_LocalBrokenState = eBrokenLegs.NO_BROKEN_LEGS;
195 const string SOUND_BREAK_LEG = "broken_leg_SoundSet";
196 bool m_CanPlayBrokenLegSound; //Used to check if sound has already been played
197 static bool DEBUG_INVENTORY_ACCESS = false;
198 static ref array<string> m_BleedingSourcesLow; //Stores all LOWER body part bleeding sources
199 static ref array<string> m_BleedingSourcesUp; //Stores all UPPER body part bleeding sources EXCLUDING HEAD
202
203
204 // CONTAMINATED AREA RELATED
206 const string CONTAMINATED_AREA_AMBIENT = "ContaminatedArea_SoundSet";//obsolete, use EffectTrigger::GetAmbientSoundsetName() instead
209 protected int m_EffectAreaCount;
210 protected bool m_InsideEffectArea;
213
214 // effect areas
215 protected EEffectAreaType m_InEffectAreaType; // flags for identifying which area the player is in, synchronized by EffectTriggers
216 protected ref map<EEffectAreaType, int> m_EffectAreaOverlap = new map<EEffectAreaType, int>(); // type -> how many of such areas is player currently in
217 protected ref map<EEffectAreaType, float> m_EffectAreaTimeToTick = new map<EEffectAreaType, float>(); // type -> how long has player spent in an area since last effect tick
220
221 protected string m_CachedPlayerName;//cached from player identity
222 protected string m_CachedPlayerID;//cached from player identity
223
224 #ifdef DIAG_DEVELOPER
225 int m_IsInsideTrigger;
226 bool m_CanBeTargetedDebug; //server-side only
227 ref array<EntityAI> m_PresetItems = new array<EntityAI>;
228 bool m_PresetSpawned;
229 ref CameraToolsMenuClient m_CameraToolsMenuClient;
230 protected PluginTargetTemperature m_TargetTemperatureDiag;
231 #endif
232
233 #ifdef DEVELOPER
234 Transport m_GetInVehicleTransportDebug;
235 #endif
236
237 #ifdef ROBOCLIENT
238 ref Bot m_Bot;
239 #endif
240
241 //Temp QuickBar load
243
244 //hologram
249
250 //Sheduler
251 float m_LastTick = -1;
253 //crafting start
254 int m_RecipeID = -1;
261 //crafting end
266 //input control
268
269 //Action data for construction actions
271 //Action data for fireplace (indoor)
275
277 bool m_IsFighting = false;
278 bool m_IsDrowning;//Set only via the setter SetDrowning
279
280 // debug monitor
282
283 //map
286 bool m_MapCloseRequestProcessed; //DEPRECATED
287 protected bool m_MapClosingSyncSent;
288 protected float m_LastMapScale = -1.0;
291
292 //inventory soft locking
293 protected bool m_InventorySoftLocked; //obsolete, count should be checked instead. Left in here for legacy's sake.
294 protected int m_InventorySoftLockCount = 0;
296
297 //Analytics
300
302 protected bool m_MeleeDebug;
303 //protected bool m_CheckMeleeItem;
305
307 protected string m_UALastMessage;
309 protected int m_PerformedAnimActionID = -1; // animated action being performed, -1 if none
310 protected int m_ActivePrimarySymptomID = 0; // active primary symptom, 0 if none, symptom has to be overriden to allow sync
311
312 bool m_WorkingNVGHeadset; //Deprecated
314 protected bool m_IsSurrendered;
317 protected const float m_SurrenderAnimationTransitionTime = 0.8;
319 //bool m_PreviousNVGState;
322 PluginAdminLog m_AdminLog;
324
327
340
345
346 //postprocess processing
349
351
356
358
360 {
361 Init();
362 }
363
364 void Init()
365 {
366 SetEventMask(EntityEvent.INIT|EntityEvent.POSTFRAME|EntityEvent.FRAME);
368 m_IsCraftingReady = false;
369 m_Recipes = new array<int>;
371 m_BloodType = 0;
372 m_HasBloodTypeVisible = false;
373 m_LifeSpanState = 0;
375 m_CorpseState = 0;
378 m_PlayerLoaded = false;
379 m_PlayerSelected = false;
380 m_ProcessUIWarning = false;
382 m_LiquidTendencyDrain = false;
383 m_UAParamMessage = new Param1<string>("");
384 m_UnconParam = new Param1<float>(0);
385 m_DeathDarkeningParam = new Param1<float>(0);
386 m_UAParam = new Param2<int,int>(0,0);
388 m_QuickBarBase = new QuickBarBase(this);
389 m_QuickBarBonus = Math.Max(ConfigGetInt("quickBarBonus"), 0);
390 m_VisibilityCoef = 1.0;
391 m_Hud = g_Game.GetMission().GetHud();
392 m_RecipePick = 0;
393 m_ActionQBControl = false;
394 m_QuickBarHold = false;
395 m_HideHairAnimated = true;
396 m_WorkingNVGHeadset = false;
397 m_LoweredNVGHeadset = false;
398 m_IsSurrendered = false;
400 m_AreHandsLocked = false;
402 m_AnimCommandStarting = HumanMoveCommandID.None;
403 m_EmptyGloves = new HiddenSelectionsData(ConfigGetString("emptyGloves"));
405 m_HeadingRestrictData = new HeadingRestrictData();
406
407 #ifdef DIAG_DEVELOPER
408 m_CanBeTargetedDebug = true;
409 //RegisterNetSyncVariableBool("m_CanBeTargetedDebug");
410 #endif
411
413
414 m_StaminaHandler = new StaminaHandler(this);//current stamina calculation
416 m_ShockHandler = new ShockHandler(this); //New shock handler
418 m_PlayerStats = new PlayerStats(this);//player stats
420
421 if (g_Game.IsServer())
422 {
423 m_PlayerStomach = new PlayerStomach(this);
424 m_NotifiersManager = new NotifiersManager(this); // player notifiers
425 m_AgentPool = new PlayerAgentPool(this); // agent pool manager
427 m_BleedingManagerServer = new BleedingSourcesManagerServer(this);
428 m_Environment = new Environment(this);//environment effects on player
429
430 m_ModifiersManager = new ModifiersManager(this); // player modifiers
431 m_PlayerSoundManagerServer = new PlayerSoundManagerServer(this);
433
434 m_AdminLog = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
435 }
436
437 m_SymptomManager = new SymptomManager(this); // state manager
438 m_ModuleRecipesManager = PluginRecipesManager.Cast(GetPlugin(PluginRecipesManager));
439
440 m_TrasferValues = new TransferValues(this);
441 m_EmoteManager = new EmoteManager(this);
442 m_SoftSkillsManager = new SoftSkillsManager(this);//Soft Skills calculation
443
444 m_WeaponManager = new WeaponManager(this);
447
448 if (!g_Game.IsDedicatedServer())
449 {
450 m_MeleeDebug = false;
451 m_UALastMessage = "";
454 m_BleedingManagerRemote = new BleedingSourcesManagerRemote(this);
457 m_ActionsInitialize = false;
459
465 }
466
467 m_ActionManager = NULL;
468
469 m_ConfigEmotesProfile = PluginConfigEmotesProfile.Cast(GetPlugin(PluginConfigEmotesProfile));
470
471 if (GetDayZGame().IsDebug())
472 {
473 PluginConfigDebugProfileFixed m_ConfigDebugProfileFixed = PluginConfigDebugProfileFixed.Cast(GetPlugin(PluginConfigDebugProfileFixed));
475 PluginDeveloper m_Developer = PluginDeveloper.Cast(GetPlugin(PluginDeveloper));
476
477 PlayerBase player = this;
478
480 {
481 string default_preset = m_ConfigDebugProfile.GetDefaultPreset();
482 if (player && default_preset != "")
483 {
484 TStringArray preset_array = new TStringArray;
485 m_ConfigDebugProfileFixed.GetPresetItems(default_preset, preset_array);
486
487 bool is_preset_fixed = true;
488 if (preset_array.Count() == 0)
489 {
490 m_ConfigDebugProfile.GetPresetItems(default_preset, preset_array);
491 is_preset_fixed = false;
492 }
493
494 if (preset_array.Count() > 0)
495 {
496 m_Developer.ClearInventory(player);
497
498 for (int i = 0; i < preset_array.Count(); i++)
499 {
500 float health = -1;
501 int quantity = -1;
502 if (is_preset_fixed)
503 {
504 health = m_ConfigDebugProfileFixed.GetItemHealth(default_preset, i);
505 quantity = m_ConfigDebugProfileFixed.GetItemQuantity(default_preset, i);
506 }
507 else
508 {
509 health = m_ConfigDebugProfile.GetItemHealth(default_preset, i);
510 quantity = m_ConfigDebugProfile.GetItemQuantity(default_preset, i);
511 }
512 m_Developer.SpawnEntityInPlayerInventory(player, preset_array.Get(i), health, quantity);
513 }
514 }
515 }
516 }
517 }
518
520
522
523 m_ModulePlayerStatus = PluginPlayerStatus.Cast(GetPlugin(PluginPlayerStatus));
525
527 m_BleedingSourcesLow.Insert("RightToeBase");
528 m_BleedingSourcesLow.Insert("RightFoot");
529 m_BleedingSourcesLow.Insert("LeftToeBase");
530 m_BleedingSourcesLow.Insert("LeftFoot");
531 m_BleedingSourcesLow.Insert("RightUpLegRoll");
532 m_BleedingSourcesLow.Insert("RightUpLeg");
533 m_BleedingSourcesLow.Insert("RightLegRoll");
534 m_BleedingSourcesLow.Insert("RightLeg");
535 m_BleedingSourcesLow.Insert("LeftUpLegRoll");
536 m_BleedingSourcesLow.Insert("LeftUpLeg");
537 m_BleedingSourcesLow.Insert("LeftLegRoll");
538 m_BleedingSourcesLow.Insert("LeftLeg");
539
541 m_BleedingSourcesUp.Insert("RightForeArmRoll");
542 m_BleedingSourcesUp.Insert("LeftForeArmRoll");
543 m_BleedingSourcesUp.Insert("RightForeArm");
544 m_BleedingSourcesUp.Insert("RightArmRoll");
545 m_BleedingSourcesUp.Insert("RightArm");
546 m_BleedingSourcesUp.Insert("RightShoulder");
547 m_BleedingSourcesUp.Insert("LeftForeArm");
548 m_BleedingSourcesUp.Insert("LeftArmRoll");
549 m_BleedingSourcesUp.Insert("LeftArm");
550 m_BleedingSourcesUp.Insert("LeftShoulder");
551 m_BleedingSourcesUp.Insert("Spine3");
552 m_BleedingSourcesUp.Insert("Spine2");
553 m_BleedingSourcesUp.Insert("Spine1");
554 m_BleedingSourcesUp.Insert("Spine");
555 m_BleedingSourcesUp.Insert("Pelvis");
556 m_BleedingSourcesUp.Insert("Neck");
557
558 RegisterNetSyncVariableInt("m_PersistentFlags", 0, 1<<(EnumTools.GetEnumSize(PersistentFlag) + 1));
559 RegisterNetSyncVariableInt("m_LifeSpanState", LifeSpanState.BEARD_NONE, LifeSpanState.COUNT);
560 RegisterNetSyncVariableInt("m_BloodType", 0, 128);
561 RegisterNetSyncVariableInt("m_ShockSimplified",0, SIMPLIFIED_SHOCK_CAP);
562 RegisterNetSyncVariableInt("m_SoundEvent",0, EPlayerSoundEventID.ENUM_COUNT - 1);
563 RegisterNetSyncVariableInt("m_SoundEventParam", 0, ((EPlayerSoundEventParam.ENUM_COUNT - 1) * 2) - 1);
564 RegisterNetSyncVariableInt("m_StaminaState",0, eStaminaState.COUNT - 1);
565 RegisterNetSyncVariableInt("m_BleedingBits");
566 RegisterNetSyncVariableInt("m_Shakes", 0, SHAKE_LEVEL_MAX);
567 RegisterNetSyncVariableInt("m_BreathVapour", 0, BREATH_VAPOUR_LEVEL_MAX);
568 RegisterNetSyncVariableInt("m_HealthLevel", eInjuryHandlerLevels.PRISTINE, eInjuryHandlerLevels.RUINED);
569 RegisterNetSyncVariableInt("m_MixedSoundStates", 0, eMixedSoundStates.COUNT - 1);
570 RegisterNetSyncVariableInt("m_CorpseState",-PlayerConstants.CORPSE_STATE_DECAYED,PlayerConstants.CORPSE_STATE_DECAYED);//do note the negative min, negative sign denotes a special meaning
571 RegisterNetSyncVariableInt("m_RefreshAnimStateIdx",0,3);
572 RegisterNetSyncVariableInt("m_BrokenLegState", -eBrokenLegs.BROKEN_LEGS_SPLINT, eBrokenLegs.BROKEN_LEGS_SPLINT);
573 RegisterNetSyncVariableInt("m_SyncedModifiers", 0, ((eModifierSyncIDs.LAST_INDEX - 1) * 2) - 1);
574 RegisterNetSyncVariableInt("m_HasBloodyHandsVisible", 0, eBloodyHandsTypes.LAST_INDEX - 1);
575 RegisterNetSyncVariableInt("m_ActionSoundCategoryHash");
576 RegisterNetSyncVariableInt("m_PerformedAnimActionID", -1, 2048); // generous upper limit for modding reasons
577 RegisterNetSyncVariableInt("m_ActivePrimarySymptomID", 0, SymptomIDs.LAST_INDEX);
578
579 RegisterNetSyncVariableInt("m_HeatBufferStage", 0, HeatBufferMdfr.NUMBER_OF_STAGES - 1);
580 RegisterNetSyncVariableFloat("m_HeatBufferDynamicMax", 0.0, 1.0, 2);
581
582 RegisterNetSyncVariableBool("m_IsUnconscious");
583 RegisterNetSyncVariableBool("m_IsRestrained");
584 RegisterNetSyncVariableBool("m_IsInWater");
585 RegisterNetSyncVariableBool("m_InsideEffectArea");
586
587 RegisterNetSyncVariableBool("m_HasBloodTypeVisible");
588 RegisterNetSyncVariableBool("m_IsRestrainStarted");
589 RegisterNetSyncVariableBool("m_IsRestrainPrelocked");
590 RegisterNetSyncVariableBool("m_HasHeatBuffer");
591 RegisterNetSyncVariableBool("m_IsInColdArea");
592
593 RegisterNetSyncVariableFloat("m_CurrentShock"); //Register shock synchronized variable
594
595 m_OriginalSlidePoseAngle = GetSlidePoseAngle();
596
599
600 m_DecayedTexture = ConfigGetString("decayedTexture");
601 m_FliesIndex = -1;
602
604
605 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Call(this.OnPlayerLoaded);
606
607#ifdef ROBOCLIENT
608 if (!m_Bot)
609 {
610 m_Bot = new Bot(this);
611 m_Bot.Start();
612 }
613#endif
614 }
615
617 {
618 if (g_Game && (!g_Game.IsDedicatedServer()))
619 {
622 }
623
625 StopSoundSet(m_SoundFliesEffect);
626 }
627
628 // Toggles an energy manager on or off based on the given state.
629 // If state is true, the energy manager is switched on.
630 // If state is false, the energy manager is switched off.
631 void SetEnergyManagerState(ItemBase itemInHands, bool state)
632 {
633 if(!itemInHands)
634 return;
635 //checking if the item in hands has an attached light source with an Energy Manager
636 if(itemInHands.m_LightSourceItem && itemInHands.m_LightSourceItem.GetCompEM())
637 {
638 if(state && itemInHands.m_LightSourceItem.GetCompEM().GetPreviousSwitchState())
639 itemInHands.m_LightSourceItem.GetCompEM().SwitchOn();
640 else if (!state)
641 itemInHands.m_LightSourceItem.GetCompEM().SwitchOff();
642
643 return;
644 }
645 //checking if the item in hands itself has an Energy Manager
646 else if(itemInHands.GetCompEM())
647 {
648 if(state && itemInHands.GetCompEM().GetPreviousSwitchState())
649 itemInHands.GetCompEM().SwitchOn();
650 else if (!state)
651 itemInHands.GetCompEM().SwitchOff();
652
653 return;
654 }
655 }
656
657#ifdef FEATURE_NETWORK_RECONCILIATION
658 protected override event typename GetOwnerStateType()
659 {
660 return PlayerBaseOwnerState;
661 }
662
663 protected override event typename GetMoveType()
664 {
665 return PlayerBaseMove;
666 }
667
668 protected override event void ObtainMove(/*inout*/ PawnMove pMove)
669 {
670 super.ObtainMove(pMove);
671
672 PlayerBaseMove move = PlayerBaseMove.Cast(pMove);
673 GetStaminaHandler().ObtainMove(move);
674 }
675
676 protected override event bool ReplayMove(PawnMove pMove)
677 {
678 if (!super.ReplayMove(pMove))
679 return false;
680
681 PlayerBaseMove move = PlayerBaseMove.Cast(pMove);
682 GetStaminaHandler().ReplayMove(move);
683 UpdateMovementInertia();
684
685 return true;
686 }
687
688 protected override event void ObtainState(/*inout*/ PawnOwnerState pState)
689 {
690 super.ObtainState(pState);
691
692 PlayerBaseOwnerState state = PlayerBaseOwnerState.Cast(pState);
693
694 GetStaminaHandler().ObtainState(state);
695 }
696
697 protected override event void RewindState(PawnOwnerState pState, /*inout*/ PawnMove pMove, inout NetworkRewindType pRewindType)
698 {
699 super.RewindState(pState, pMove, pRewindType);
700
701 PlayerBaseOwnerState state = PlayerBaseOwnerState.Cast(pState);
702 PlayerBaseMove move = PlayerBaseMove.Cast(pMove);
703 GetStaminaHandler().RewindState(state, move);
704 }
705#endif
706
714
722
730
732 {
733 if (!IsAuthority())
734 return;
735
736 GetOnPlayerLoadChanged().Invoke();
737 }
738
740 {
741 if ((m_MedicalDrugsActive & drugType) != drugType)
743 }
744
746 {
747 if ((m_MedicalDrugsActive & drugType) == drugType)
748 m_MedicalDrugsActive &= ~drugType;
749 }
750
752 {
753 return (m_MedicalDrugsActive & EMedicalDrugsType.CHELATION) == EMedicalDrugsType.CHELATION;
754 }
755
757 {
758 return (m_MedicalDrugsActive & EMedicalDrugsType.ANTIBIOTICS) == EMedicalDrugsType.ANTIBIOTICS;
759 }
760
761 void SetSoundCategoryHash(int hash)
762 {
763 m_ActionSoundCategoryHash = hash;
764 SetSynchDirty();
765 }
766
768 {
770 SetSynchDirty();
771 }
772
774 {
776 }
777
778 void SetActivePrimarySymptomID(SymptomIDs id)
779 {
781 SetSynchDirty();
782 }
783
785 {
787 }
788
789 void RequestTriggerEffect(EffectTrigger trigger, int ppeIdx = -1, int aroundId = ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId = ParticleList.CONTAMINATED_AREA_GAS_TINY, string soundset = "", bool partDynaUpdate = false, int newBirthRate = 0, bool forceUpdate = false)
790 {
791 //do note multiple triggers can be calling this method within a single frame depending on the contaminated area setup and dynamic gameplay events(such as gas grenades being deployed)
792
794 return;
795 bool allow = false;
797 {
798 allow = true;
799 }
800 else if (trigger == m_CurrentEffectTrigger && forceUpdate)
801 {
802 allow = true;
803 //Print("ON Enabling effect FORCED " + trigger);
804 }
805 else if (trigger.GetEffectsPriority() > m_CurrentEffectTrigger.GetEffectsPriority())
806 {
808 allow = true;
809 }
810 if (allow)
811 {
812 /*
813 Print("--------------------------------------------------");
814 Print("ON Enabling effect " + trigger);
815 Print("------------> soundset " + soundset);
816 Print("--------------------------------------------------");
817 */
818 m_CurrentEffectTrigger = trigger;
819 SetContaminatedEffectEx( true, ppeIdx, aroundId, tinyId, soundset,partDynaUpdate, newBirthRate );
820 }
821 }
822
823
825 {
827 {
828 /*
829 Print("--------------------------------------------------");
830 Print("OFF Disabling effect");
831 Print("--------------------------------------------------");
832 */
833 SetContaminatedEffectEx( false, m_CurrentEffectTrigger.m_PPERequester );
835 }
836 }
837
844
855 {
856 if (m_EffectAreaCount == 0)
857 {
858 m_InsideEffectArea = true;
859 SetSynchDirty();
861 }
863 }
864
866 {
868 if (m_EffectAreaCount <= 0)
869 {
871 m_InsideEffectArea = false;
872 SetSynchDirty();
874 }
875 }
876
877 void SetInEffectAreaTypeFlag(EEffectAreaType flag)
878 {
879 int areaCount = m_EffectAreaOverlap.Get(flag);
880
881 if (areaCount > 0)
882 m_EffectAreaOverlap.Set(flag, m_EffectAreaOverlap.Get(flag) + 1);
883 else
884 m_EffectAreaOverlap.Set(flag, 1);
885
886 m_InEffectAreaType |= flag;
887 }
888
889 void UnsetInEffectAreaTypeFlag(EEffectAreaType flag)
890 {
891 int areaCount = m_EffectAreaOverlap.Get(flag);
892
893 if (areaCount > 1)
894 m_EffectAreaOverlap.Set(flag, m_EffectAreaOverlap.Get(flag) - 1);
895 else
896 {
897 m_EffectAreaOverlap.Set(flag, 0);
898 m_InEffectAreaType &= ~flag;
899 }
900 }
901
902 bool IsInEffectArea(EEffectAreaType area)
903 {
904 if (m_InEffectAreaType & area)
905 return true;
906
907 return false;
908 }
909
910 // Server side update when player is present in any effect area
911 protected void OnUpdateEffectAreaServer(float timeSlice)
912 {
913 float timeSpent;
914
915 if (IsInEffectArea(EEffectAreaType.HOT_SPRING))
916 {
917 float waterLevel = GetCurrentWaterLevel();
918 if (waterLevel > 0.5)
919 {
920 timeSpent = m_EffectAreaTimeToTick.Get(EEffectAreaType.HOT_SPRING);
921 timeSpent += timeSlice;
923 {
924 m_EffectAreaTimeToTick.Set(EEffectAreaType.HOT_SPRING, 0);
926 }
927 else
928 m_EffectAreaTimeToTick.Set(EEffectAreaType.HOT_SPRING, timeSpent);
929 }
930 }
931
932 if (IsInEffectArea(EEffectAreaType.VOLCANIC))
933 {
934 timeSpent = m_EffectAreaTimeToTick.Get(EEffectAreaType.VOLCANIC);
935 timeSpent += timeSlice;
937 {
938 m_EffectAreaTimeToTick.Set(EEffectAreaType.VOLCANIC, 0);
940 }
941 else
942 m_EffectAreaTimeToTick.Set(EEffectAreaType.VOLCANIC, timeSpent);
943 }
944 }
945
947 {
948 GetModifiersManager().ActivateModifier( eModifiers.MDF_AREAEXPOSURE );
949 //Print("Contaminated ENTERED <------------------------------------------------------------- FINAL");
950 }
951
953 {
954 GetModifiersManager().DeactivateModifier( eModifiers.MDF_AREAEXPOSURE );
955 //Print("Contaminated LEFT <------------------------------------------------------------- FINAL");
956 }
957
959 {
960 //Print("ANY EFFECT AREA ENTERED <------------------------------------------------------------- FINAL");
961 }
962
964 {
965 //Print("ANY EFFECT AREA LEFT <------------------------------------------------------------- FINAL");
966 }
967
969 {
970 //Print("ANY EFFECT AREA ENTERED CLIENT <------------------------------------------------------------- FINAL");
971 }
972
974 {
976 //Print("ANY EFFECT AREA LEFT CLIENT <------------------------------------------------------------- FINAL");
977 }
978
980 ItemBase GetItemOnSlot(string slot_type)
981 {
982 int slot_id = InventorySlots.GetSlotIdFromString(slot_type);
983 EntityAI item_EAI = this.GetInventory().FindAttachment(slot_id);
984 ItemBase item_IB = ItemBase.Cast(item_EAI);
985
986 if (item_EAI && !item_IB)
987 {
988 string str = "Warning! GetItemOnSlot() >> found item on slot " + slot_type + " can't be cast to ItemBase! Found item is " + item_EAI.GetType() + " and the player is " + GetType() + "!";
989 Error(str);
990 return null;
991 }
992
993 return item_IB;
994 }
995
998 {
999 return GetItemOnSlot("Headgear");
1000 }
1001
1002 override int GetQuickBarBonus()
1003 {
1004 return m_QuickBarBonus;
1005 }
1006
1007 //--------------------------------------------------------------------------
1008 // Inventory overrides
1009 //--------------------------------------------------------------------------
1010 override bool CanDropEntity (notnull EntityAI item)
1011 {
1012 if (GetInventory().HasInventoryReservation(item, null))
1013 {
1014 return false;
1015 }
1016
1017 if (IsRestrained())
1018 {
1019 if (GetEntityInHands() == item)
1020 return false;
1021 }
1022
1023 return true;
1024 }
1025
1026 //--------------------------------------------------------------------------
1027 // PLAYER DAMAGE EVENT HANDLING
1028 //--------------------------------------------------------------------------
1029
1031 {
1032 return m_BreathVapour;
1033 }
1034
1035 // adds state to and syncs sound states variable which is used to generate sound client-side
1037 {
1038 int bit_mask_remove = ~state;
1039
1040 eMixedSoundStates new_states = m_MixedSoundStates & bit_mask_remove;
1041
1042 if (new_states != m_MixedSoundStates)
1043 {
1044 m_MixedSoundStates = new_states;
1045 SetSynchDirty();
1046 }
1047 }
1048
1049 // adds state to and syncs sound states variable which is used to generate sound client-side
1051 {
1052 eMixedSoundStates new_states = m_MixedSoundStates | state;
1053
1054 if (new_states != m_MixedSoundStates)
1055 {
1056 m_MixedSoundStates = new_states;
1057 SetSynchDirty();
1058 }
1059 }
1060
1061 override bool IsPlayer()
1062 {
1063 return true;
1064 }
1065
1067 {
1068 return (m_BleedingBits != 0);
1069 }
1070
1071 void SetBleedingBits(int bits)
1072 {
1073 if (m_BleedingBits != bits)
1074 {
1075 if (m_BleedingBits == 0)
1076 {
1078 }
1079 else if (bits == 0)
1080 {
1081 OnBleedingEnd();
1082 }
1083 }
1084 m_BleedingBits = bits;
1085 SetSynchDirty();
1086 }
1087
1089 {
1090 return m_BleedingBits;
1091 }
1092
1094 {
1096 }
1097
1099 {
1101 }
1102
1104 {
1106 }
1107
1109 {
1111 }
1112
1113
1115 {
1116 return m_HealingsCount >= 1;//0 for no healings, 1+ for healings, gets truncated to 1
1117 }
1118
1120 {
1121 return m_DiseaseCount >= 1;//0 for no disease, 1+ for disease, gets truncated to 1
1122 }
1123
1124
1126 {
1127 return m_PulseType;
1128 }
1129
1130 void SetPulseType(EPulseType pulse_type)
1131 {
1132 m_PulseType = pulse_type;
1133 }
1134
1136 {
1137 m_ProcessAddEffectWidgets.InsertArray(effects);
1138 }
1139
1141 {
1142 m_ProcessRemoveEffectWidgets.InsertArray(effects);
1143 }
1144
1146 {
1147 m_ProcessAddGlassesEffects.Insert(id);
1148 }
1149
1151 {
1153 }
1154
1159
1161 {
1163 {
1164 delete m_DamageDealtEffect;
1165 }
1166
1168 {
1170 }
1171 }
1172
1173 void SpawnDamageDealtEffect2(Param param1 = null, Param param2 = null)
1174 {
1175 if (m_EffectRadial)
1176 {
1177 delete m_EffectRadial;
1178 }
1179
1180 m_EffectRadial = new EffectRadial(param1,param2);
1181 }
1182
1187
1188 void SpawnFlashbangEffect(PlayerBase player, bool visual)
1189 {
1191 {
1192 m_FlashbangEffect.Stop();
1193 delete m_FlashbangEffect;
1194 }
1195
1196 m_FlashbangEffect = new FlashbangEffect(player, visual);
1197 }
1198
1203
1204 void SpawnShockEffect(float intensity_max)
1205 {
1207 {
1208 delete m_ShockDealtEffect;
1209 }
1210
1211 m_ShockDealtEffect = new ShockDealtEffect(intensity_max);
1212 }
1213
1214 override void EEKilled(Object killer)
1215 {
1216 //Print(Object.GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " event EEKilled, player has died at STS=" + GetSimulationTimeStamp());
1217
1218 if (m_AdminLog)
1219 {
1220 m_AdminLog.PlayerKilled(this, killer);
1221 }
1222
1224 delete GetBleedingManagerServer();
1225
1226 // kill character in database
1227 if (GetHive())
1228 {
1229 GetHive().CharacterKill(this);
1230 }
1231
1232 // disable voice communication
1233 g_Game.EnableVoN(this, false);
1234 if (!g_Game.IsDedicatedServer())
1236 GetSymptomManager().OnPlayerKilled();
1237
1238 if (GetEconomyProfile() && !m_CorpseProcessing && m_CorpseState == 0 && g_Game.GetMission().InsertCorpse(this))
1239 {
1240 m_CorpseProcessing = true;
1241 //Print("EEKilled - processing corpse");
1242 }
1243
1244 if (g_Game.IsMultiplayer() && g_Game.IsServer())
1245 {
1246 if (g_Game.GetMission())
1247 {
1248 g_Game.GetMission().SyncRespawnModeInfo(GetIdentity());
1249 }
1250 }
1251
1252 super.EEKilled(killer);
1253 }
1254
1255 override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
1256 {
1257 super.EEHitBy(damageResult, damageType, source, component, dmgZone, ammo, modelPos, speedCoef);
1258
1259 if (m_AdminLog)
1260 {
1261 m_AdminLog.PlayerHitBy(damageResult, damageType, this, source, component, dmgZone, ammo);
1262 }
1263
1264 if (damageResult != null && damageResult.GetDamage(dmgZone, "Shock") > 0)
1265 {
1266 m_LastShockHitTime = g_Game.GetTime();
1267
1268 if (!IsUnconscious())
1269 {
1270 if (g_Game.ConfigIsExisting("cfgAmmo " + ammo + " unconRefillModifier"))
1271 {
1272 m_UnconRefillModifier = g_Game.ConfigGetInt("cfgAmmo " + ammo + " unconRefillModifier");
1273 }
1274 else
1275 {
1277 }
1278 }
1279 }
1280
1282 if (damageType == DamageType.EXPLOSION && ammo == "FlashGrenade_Ammo")
1283 {
1284 GetStaminaHandler().DepleteStaminaEx(EStaminaModifiers.OVERALL_DRAIN);
1285 }
1286
1287 //new bleeding computation
1288 //---------------------------------------
1289 if (damageResult != null && GetBleedingManagerServer())
1290 {
1291 float dmg = damageResult.GetDamage(dmgZone, "Blood");
1292 GetBleedingManagerServer().ProcessHit(dmg, source, component, dmgZone, ammo, modelPos);
1293 }
1294 //---------------------------------------
1295
1296 #ifdef DIAG_DEVELOPER
1297 if (DiagMenu.GetBool(DiagMenuIDs.MELEE_DEBUG))
1298 Print("EEHitBy() | " + GetDisplayName() + " hit by " + source.GetDisplayName() + " to " + dmgZone);
1299
1300 PluginRemotePlayerDebugServer plugin_remote_server = PluginRemotePlayerDebugServer.Cast(GetPlugin(PluginRemotePlayerDebugServer));
1301 if (plugin_remote_server)
1302 {
1303 plugin_remote_server.OnDamageEvent(this, damageResult);
1304 }
1305 #endif
1306
1307 if (g_Game.IsDebugMonitor())
1308 m_DebugMonitorValues.SetLastDamage(source.GetDisplayName());
1309
1310 if (m_ActionManager)
1311 m_ActionManager.Interrupt();
1312
1313 int transferShockToDamageCoef = g_Game.ConfigGetInt(string.Format("%1 %2 DamageApplied transferShockToDamage", CFG_AMMO, ammo));
1314 if (transferShockToDamageCoef == 1)
1315 {
1316 //Print("PlayerBase | EEHitBy | nonlethal hit");
1317 AddHealth("", "Health", -ConvertNonlethalDamage(damageResult.GetDamage(dmgZone, "Shock"), damageType));
1318 if (dmgZone != "Head")
1319 AddHealth(dmgZone, "Health", -damageResult.GetDamage(dmgZone, "Shock")); //Also deal damage to zone health, no dmg reduction
1320 }
1321
1322 if (g_Game.IsServer())
1323 {
1324 if (GetHealth("RightLeg", "Health") <= 1 || GetHealth("LeftLeg", "Health") <= 1 || GetHealth("RightFoot", "Health") <= 1 || GetHealth("LeftFoot", "Health") <= 1)
1325 {
1326 if (GetModifiersManager().IsModifierActive(eModifiers.MDF_BROKEN_LEGS))//effectively resets the modifier
1327 {
1328 GetModifiersManager().DeactivateModifier(eModifiers.MDF_BROKEN_LEGS);
1329 }
1330 GetModifiersManager().ActivateModifier(eModifiers.MDF_BROKEN_LEGS);
1331 }
1332
1333 if (ammo == "Bullet_CupidsBolt" && IsAlive())
1334 {
1335 DamageSystem.ResetAllZones(this);
1336 m_ModifiersManager.ResetAll();
1337 m_ModifiersManager.ActivateModifier(eModifiers.MDF_IMMUNITYBOOST);
1338
1339 // bleeding sources
1341 m_BleedingManagerServer.RemoveAllSources();
1342
1343 // Stats
1344 if (GetPlayerStats())
1345 {
1346 int bloodType = GetStatBloodType().Get();
1347 float energyValue = GetStatEnergy().Get();
1348 float waterValue = GetStatWater().Get();
1349 float heatBuffer = GetStatHeatBuffer().Get();
1350 float heatComfort = GetStatHeatComfort().Get();
1351 float thermalBias = GetThermalBiasHandler().Get();
1352
1353 GetPlayerStats().ResetAllStats();
1354
1355 GetStatBloodType().Set(bloodType);
1356 GetStatWater().Set(waterValue);
1357 GetStatEnergy().Set(energyValue);
1358 GetStatHeatBuffer().Set(heatBuffer);
1359 GetStatHeatComfort().Set(heatComfort);
1360 GetThermalBiasHandler().Set(thermalBias);
1361 }
1362
1363 // Agents
1364 if (m_AgentPool)
1365 m_AgentPool.RemoveAllAgents();
1366
1367 if (m_StaminaHandler)
1369
1370 // uncon
1371 if (IsUnconscious())
1373 }
1374 }
1375
1376 m_ShockHandler.CheckValue(true);
1377
1378 //analytics
1379 g_Game.GetAnalyticsServer().OnEntityHit(source, this);
1380 }
1381
1382 override void EEHitByRemote(int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
1383 {
1384 super.EEHitByRemote(damageType, source, component, dmgZone, ammo, modelPos);
1385
1386 if (m_MeleeFightLogic.IsInBlock())
1387 {
1388 EffectSound sound = SEffectManager.PlaySoundOnObject("BlockingAttack_SoundSet", this);
1389 sound.SetAutodestroy(true);
1390 }
1391 }
1392
1393 override void EEDelete(EntityAI parent)
1394 {
1396 StopSoundSet(m_SoundFliesEffect);
1397
1398 if (GetArrowManager())
1400 }
1401
1402 override protected float ConvertNonlethalDamage(float damage, DamageType damageType)
1403 {
1404 if (damageType == DamageType.FIRE_ARM)
1406
1407 return super.ConvertNonlethalDamage(damage, damageType);
1408 }
1409
1413 override void OnReceivedHit(ImpactEffectsData hitData)
1414 {
1415 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
1416 {
1417 float shakeStrength = Math.InverseLerp(0, 500, hitData.m_InSpeed.Length());
1418 GetCurrentCamera().SpawnCameraShake(shakeStrength);
1420
1421#ifdef ROBOCLIENT
1422 if (m_Bot)
1423 m_Bot.CheckForEnemies();
1424#endif
1425 }
1426
1427 if (hitData.m_AmmoType == "Bullet_CupidsBolt")
1428 Ammo_CupidsBolt.PlayOnHitParticle(hitData.m_Position);
1429 }
1430
1431 // DEPRECATED by method OnReceivedHit
1432 override void OnPlayerRecievedHit()
1433 {
1434 #ifndef NO_GUI
1435 if (m_MeleeFightLogic.IsInBlock())
1436 {
1437 EffectSound sound = SEffectManager.PlaySoundOnObject("BlockingAttack_SoundSet", this);
1438 sound.SetAutodestroy(true);
1439 return;
1440 }
1441
1446
1447 CloseMapEx(true);
1448 #endif
1449 }
1450
1452 {
1453 SpawnFlashbangEffect(this, visual);
1454 }
1455
1457
1458 //--------------------------------------------------------------------------
1460 //--------------------------------------------------------------------------
1461
1463 override string GetHitComponentForAI()
1464 {
1465 return GetDayZPlayerType().GetHitComponentForAI();
1466 }
1467
1469 override string GetDefaultHitComponent()
1470 {
1471 return GetDayZPlayerType().GetDefaultHitComponent();
1472 }
1473
1475 {
1476 return m_DefaultHitPosition;
1477 }
1478
1481 {
1482 return GetDayZPlayerType().GetSuitableFinisherHitComponents();
1483 }
1484
1485 protected vector SetDefaultHitPosition(string pSelection)
1486 {
1487 return GetSelectionPositionMS(pSelection);
1488 }
1489
1490 //--------------------------------------------------------------------------
1496
1501 //--------------------------------------------------------------------------
1502 override void EEItemAttached(EntityAI item, string slot_name)
1503 {
1504 super.EEItemAttached(item, slot_name);
1505
1506 ItemBase itemIB = ItemBase.Cast(item);
1507 SwitchItemSelectionTexture(item, slot_name);
1508 Param1<PlayerBase> p = new Param1<PlayerBase>(this);
1509 item.SwitchItemSelectionTextureEx(EItemManipulationContext.ATTACHING, p);
1510 m_QuickBarBase.updateSlotsCount();
1512 UpdateShoulderProxyVisibility(item, slot_name);
1513
1514 HideHairSelections(itemIB,true);
1515
1516 g_Game.GetAnalyticsClient().OnItemAttachedAtPlayer(item, slot_name);
1517 Clothing clothing = Clothing.Cast(item);
1518 if (clothing)
1519 {
1520 if (!g_Game.IsHeadlessOrDedicatedServer())
1521 {
1522 if (clothing.GetEffectWidgetTypes())
1523 {
1524 QueueAddEffectWidget(clothing.GetEffectWidgetTypes());
1525 }
1526
1527 if (clothing.GetGlassesEffectID() > -1)
1528 {
1529 QueueAddGlassesEffect(clothing.GetGlassesEffectID());
1530 }
1531
1532 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(UpdateCorpseStateVisual, 200, false);//sometimes it takes a while to load in
1533 UpdateCorpseStateVisual();//....but if possible, we don't want a delay
1534 }
1535 else if (g_Game.IsServer())
1536 {
1537 if (clothing.IsGasMask())
1538 {
1539 GetModifiersManager().ActivateModifier(eModifiers.MDF_MASK);
1540 }
1541 }
1542
1543 clothing.UpdateNVGStatus(this,true);
1544 }
1545
1546 AdjustBandana(item,slot_name);
1547 AdjustShemag(item,slot_name);
1548 AdjustKeffiyeh(item,slot_name);
1549 }
1550
1551 override void EEItemDetached(EntityAI item, string slot_name)
1552 {
1553 super.EEItemDetached(item, slot_name);
1554
1555 ItemBase item_base = ItemBase.Cast(item);
1556 SwitchItemSelectionTexture(item, slot_name);
1557 item.SwitchItemSelectionTextureEx(EItemManipulationContext.DETACHING);
1558 m_QuickBarBase.updateSlotsCount();
1560
1561 HideHairSelections(item_base,false);
1562
1563 Clothing clothing = Clothing.Cast(item);
1564
1565 if (clothing)
1566 {
1567 if (!g_Game.IsHeadlessOrDedicatedServer())
1568 {
1569 if (clothing.GetEffectWidgetTypes())
1570 {
1571 QueueRemoveEffectWidget(clothing.GetEffectWidgetTypes());
1572 }
1573
1574 if (clothing.GetGlassesEffectID() > -1)
1575 {
1576 QueueRemoveGlassesEffect(clothing.GetGlassesEffectID());
1577 }
1578 }
1579
1580 if (g_Game.IsServer())
1581 {
1582 if (clothing.IsGasMask())
1583 {
1584 GetModifiersManager().DeactivateModifier(eModifiers.MDF_MASK);
1585 }
1586 }
1587
1588 clothing.UpdateNVGStatus(this, false, true);
1589 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(UpdateCorpseStateVisual, 200, false);//sometimes it takes a while to load in
1590 UpdateCorpseStateVisual();//....but if possible, we don't want a delay
1591 }
1592 }
1593
1594 void UpdateShoulderProxyVisibility(EntityAI item, string slot_name)
1595 {
1596 string slot = slot_name;
1597 bool boo;
1598 boo = item.IsWeapon();
1599
1600 if (slot == "Melee")
1601 {
1602 SetSimpleHiddenSelectionState(SIMPLE_SELECTION_MELEE_RIFLE,boo);
1603 SetSimpleHiddenSelectionState(SIMPLE_SELECTION_MELEE_MELEE,!boo);
1604 }
1605 else if (slot == "Shoulder")
1606 {
1607 SetSimpleHiddenSelectionState(SIMPLE_SELECTION_SHOULDER_RIFLE,boo);
1608 SetSimpleHiddenSelectionState(SIMPLE_SELECTION_SHOULDER_MELEE,!boo);
1609 }
1610 }
1611
1612 override void SwitchItemSelectionTexture(EntityAI item, string slot_name)
1613 {
1614 super.SwitchItemSelectionTexture(item,slot_name);
1615
1616 //shirt + armband
1617 EntityAI armband = FindAttachmentBySlotName("Armband");
1618 if (slot_name == "Body" && armband)
1619 {
1620 Param1<PlayerBase> p = new Param1<PlayerBase>(this);
1621 armband.SwitchItemSelectionTextureEx(EItemManipulationContext.UPDATE,p);
1622 }
1623 }
1624
1626 {
1627 array<EntityAI> itemsArray = new array<EntityAI>;
1628 ItemBase item;
1629 GameInventory inventory = GetInventory();
1630 inventory.EnumerateInventory(InventoryTraversalType.PREORDER, itemsArray);
1631
1632 for (int i = 0; i < itemsArray.Count(); i++)
1633 {
1634 Class.CastTo(item, itemsArray.Get(i));
1635 if (item && !item.IsInherited(SurvivorBase))
1636 inventory.LocalDestroyEntity(item);
1637 }
1638 }
1639
1641 {
1643 }
1644
1645 void SetHitPPEEnabled(bool enabled)
1646 {
1647 m_CanDisplayHitEffectPPE = enabled;
1648 }
1649
1650 bool IsMale()
1651 {
1652 if (ConfigGetBool("woman") != 1)
1653 {
1654 return true;
1655 }
1656 return false;
1657 }
1658
1660 {
1661 int voice_type = ConfigGetInt("voiceType");
1662
1663 if (voice_type == 0)
1664 {
1665 voice_type = 1;
1666 }
1667
1668 return voice_type;
1669 }
1670
1671 PlayerSoundManagerServer GetPlayerSoundManagerServer()
1672 {
1674 }
1675
1676
1678 {
1679 if (!m_UndergroundHandler && IsAlive())
1680 {
1682 }
1683
1684 return m_UndergroundHandler;
1685 }
1686
1688 {
1689 m_UndergroundHandler = null;
1691 }
1692 // --------------------------------------------------
1693 // User Actions
1694 //---------------------------------------------------
1695 void SetActions(out TInputActionMap InputActionMap)
1696 {
1697 AddAction(ActionOpenDoors, InputActionMap);
1698 AddAction(ActionCloseDoors, InputActionMap);
1699 AddAction(ActionLockedDoors, InputActionMap);
1700 AddAction(ActionEnterLadder, InputActionMap);
1701 AddAction(ActionExitLadder, InputActionMap);
1702 AddAction(ActionInteractCodeLockItem, InputActionMap);
1703 AddAction(ActionResetCodeOnCodeLock, InputActionMap);
1704 AddAction(ActionDetachBattery, InputActionMap);
1705
1706 //-----------CheckIfCanMOveToTarget----------
1707 AddAction(ActionStartEngine, InputActionMap);
1708 AddAction(ActionStartEngineBoat, InputActionMap);
1709 AddAction(ActionStartEngineMotorbike, InputActionMap);
1710 AddAction(ActionStopEngine, InputActionMap);
1711 AddAction(ActionStopEngineBoat, InputActionMap);
1712 AddAction(ActionStopEngineMotorbike, InputActionMap);
1713 AddAction(ActionSwitchSeats, InputActionMap);
1714 AddAction(ActionOpenCarDoors,InputActionMap);
1715 AddAction(ActionCloseCarDoors,InputActionMap);
1716 AddAction(ActionUncoverHeadSelf, InputActionMap);
1717 AddAction(ActionDrinkPondContinuous, InputActionMap);
1718 AddAction(ActionEatSnowContinuous, InputActionMap);
1719
1720 AddAction(ActionIgniteFireplaceByAir, InputActionMap);
1721 AddAction(ActionMineBushByHand, InputActionMap);
1722
1723 AddAction(ActionUngagSelf, InputActionMap);
1724 AddAction(ActionWashHandsWater, InputActionMap);
1725 AddAction(ActionWashHandsSnow, InputActionMap);
1726 AddAction(ActionWashHeadWater, InputActionMap);
1728 AddAction(ActionGetOutTransport, InputActionMap);
1729
1730 AddAction(ActionUnrestrainTargetHands, InputActionMap);
1731 AddAction(ActionTakeArrow, InputActionMap);
1732 AddAction(ActionTakeArrowToHands, InputActionMap);
1734
1736 //AddAction(ActionConstructionPartInfoInteract, InputActionMap);
1737 AddAction(ActionBuildPartHandsGeneric, InputActionMap);
1739
1740 #ifdef DIAG_DEVELOPER
1741 AddAction(ActionBuildPartInstantDebug);
1742 AddAction(ActionDestroyPartInstantDebug);
1743 AddAction(ActionDismantlePartInstantDebug);
1744 #endif
1745 }
1746
1747 void SetActions() // Backwards compatibility, not recommended to use
1748 {
1749 }
1750
1752 {
1753 AddAction(ActionCPR, InputActionMap);
1754 AddAction(ActionUncoverHeadTarget, InputActionMap);
1755 AddAction(ActionUngagTarget, InputActionMap);
1756 AddAction(ActionPullBodyFromTransport, InputActionMap);
1757 AddAction(ActionCheckPulseTarget, InputActionMap);
1758 }
1759
1760 void SetActionsRemoteTarget() // Backwards compatibility, not recommended to use
1761 {
1762 }
1763
1765 {
1766 // Backwards compatibility
1767 if (IsControlledPlayer())
1768 {
1770 SetActions();
1771 }
1772 else
1773 {
1776 }
1778
1781
1784 }
1785
1786 override void GetActions(typename action_input_type, out array<ActionBase_Basic> actions)
1787 {
1789 {
1790 m_ActionsInitialize = true;
1792 }
1793
1794 // Backwards compatibility
1795 array<ActionBase_Basic> bcActions = m_InputActionMap.Get(action_input_type);
1796 if (!bcActions)
1797 {
1798 if (IsControlledPlayer())
1799 actions = m_InputActionMapControled.Get(action_input_type);
1800 else
1801 actions = m_InputActionMapAsTarget.Get(action_input_type);
1802 }
1803 else
1804 {
1805 if (!actions)
1806 actions = new array<ActionBase_Basic>();
1807
1808 if (IsControlledPlayer())
1809 actions.InsertAll(m_InputActionMapControled.Get(action_input_type));
1810 else
1811 actions.InsertAll(m_InputActionMapAsTarget.Get(action_input_type));
1812
1813 actions.InsertAll(bcActions);
1814 }
1815 }
1816
1817 void AddAction(typename actionName, out TInputActionMap InputActionMap)
1818 {
1819 ActionBase action = GetActionManager().GetAction(actionName);
1820
1821 typename ai = action.GetInputType();
1822 if (!ai)
1823 {
1824 m_ActionsInitialize = false;
1825 return;
1826 }
1827
1828 ref array<ActionBase_Basic> action_array = InputActionMap.Get(ai);
1829
1830 if (!action_array)
1831 {
1832 action_array = new array<ActionBase_Basic>;
1833 InputActionMap.Insert(ai, action_array);
1834 }
1835 action_array.Insert(action);
1836 }
1837
1838 void AddAction(typename actionName) // Backwards compatibility, not recommended to use
1839 {
1840 AddAction(actionName, m_InputActionMap);
1841 }
1842
1843 void RemoveAction(typename actionName, out TInputActionMap InputActionMap)
1844 {
1845 ActionBase action = GetActionManager().GetAction(actionName);
1846 typename ai = action.GetInputType();
1847 ref array<ActionBase_Basic> action_array = InputActionMap.Get(ai);
1848
1849 if (action_array)
1850 {
1851 for (int i = 0; i < action_array.Count(); i++)
1852 {
1853 if (action == action_array.Get(i))
1854 {
1855 action_array.Remove(i);
1856 }
1857 }
1858 action_array = new array<ActionBase_Basic>;
1859 InputActionMap.Insert(ai, action_array);
1860 }
1861 action_array.Insert(action);
1862 }
1863
1864 void RemoveAction(typename actionName) // Backwards compatibility, not recommended to use
1865 {
1866 RemoveAction(actionName, m_InputActionMap);
1867 }
1868
1870 {
1871 return m_RecipePick;
1872 }
1873
1875 {
1876 m_RecipePick++;
1877 }
1878
1880 {
1881 m_RecipePick = 0;
1882 }
1883
1884 //---------------------------------------------------
1885
1886
1891
1893 {
1894 return m_EmoteManager;
1895 }
1896
1901
1903 override void OnLadder(float delta_time, HumanMovementState pState)
1904 {
1905 ProcessHandDamage(delta_time, pState);
1906 }
1907
1908 void ProcessHandDamage(float delta_time, HumanMovementState pState)
1909 {
1910 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !g_Game.IsMultiplayer())
1911 {
1912 if (pState.m_iMovement == DayZPlayerConstants.MOVEMENTIDX_SLIDE)
1913 {
1914 //Print("sliding down");
1915 EntityAI gloves = GetInventory().FindAttachment(InventorySlots.GLOVES);
1916
1917 if (gloves && gloves.GetHealthLevel() < 4)
1918 {
1919 gloves.AddHealth("","", PlayerConstants.GLOVES_DAMAGE_SLIDING_LADDER_PER_SEC * delta_time);
1920 return;
1921 }
1922
1924 {
1925 if (Math.RandomFloat01() < 0.5)
1926 {
1927 if (GetBleedingManagerServer().AttemptAddBleedingSourceBySelection("LeftForeArmRoll"))
1928 {
1929 SendSoundEvent(EPlayerSoundEventID.INJURED_LIGHT);
1930 }
1931 }
1932 else
1933 {
1934 if (GetBleedingManagerServer().AttemptAddBleedingSourceBySelection("RightForeArmRoll"))
1935 {
1936 SendSoundEvent(EPlayerSoundEventID.INJURED_LIGHT);
1937 }
1938 }
1939 }
1940
1941 }
1942 }
1943 }
1944
1945 override void ProcessFeetDamageServer(int pUserInt)
1946 {
1947 //InventorySlots.HEADGEAR
1948 EntityAI shoes = GetInventory().FindAttachment(InventorySlots.FEET);
1949
1950 string surface; int liquid;
1951 g_Game.SurfaceUnderObject(this, surface, liquid);
1952 float modifier_surface = Surface.GetParamFloat(surface, "footDamage");
1953
1954 if (shoes && shoes.GetHealthLevel() < 4)
1955 {
1956 shoes.AddHealth("", "", -1 * modifier_surface * PlayerConstants.SHOES_MOVEMENT_DAMAGE_PER_STEP * (float)PlayerConstants.CHECK_EVERY_N_STEP);
1957
1958 return;
1959 }
1960
1961 float rnd = Math.RandomFloat01();
1962 float modifier_movement = GetFeetDamageMoveModifier();
1963 float chance = modifier_movement * modifier_surface * PlayerConstants.BAREFOOT_MOVEMENT_BLEED_MODIFIER * (float)PlayerConstants.CHECK_EVERY_N_STEP;
1964 if (rnd < chance)
1965 {
1966 if (pUserInt % 2 == 0)
1967 {
1968 if (GetBleedingManagerServer().AttemptAddBleedingSourceBySelection("RightFoot"))
1969 SendSoundEvent(EPlayerSoundEventID.INJURED_LIGHT);
1970
1971 }
1972 else
1973 {
1974 if (GetBleedingManagerServer().AttemptAddBleedingSourceBySelection("LeftFoot"))
1975 SendSoundEvent(EPlayerSoundEventID.INJURED_LIGHT);
1976 }
1977 }
1978 }
1979
1981 {
1982 float modifier;
1983 switch(m_MovementState.m_iMovement)
1984 {
1985 case DayZPlayerConstants.MOVEMENTIDX_SPRINT:
1986 modifier = 1;
1987 break
1988 case DayZPlayerConstants.MOVEMENTIDX_RUN:
1989 modifier = 0.5;
1990 break
1991 case DayZPlayerConstants.MOVEMENTIDX_WALK:
1992 modifier = 0;
1993 break
1994 }
1995 return modifier;
1996 }
1997
1998 void SetStamina(int value, int range)
1999 {
2001 m_ModulePlayerStatus.SetStamina(value, range);
2002 }
2003
2004 #ifdef DIAG_DEVELOPER
2005 void SetStaminaDisabled(bool value)
2006 {
2007 if (m_StaminaHandler)
2008 m_StaminaHandler.SetStaminaDisabled(value);
2009 }
2010 #endif
2011
2012 void SetQuickRestrain(bool enable)
2013 {
2014 m_AllowQuickRestrain = enable;
2015 }
2016
2017 void SetQuickFishing(bool enable)
2018 {
2019 m_AllowQuickFishing = enable;
2020 }
2021
2023 {
2024 return m_AllowQuickRestrain;
2025 }
2026
2028 {
2029 return m_AllowQuickFishing;
2030 }
2031
2033 {
2034 return m_PlayerStats;
2035 }
2036
2041
2046
2048 {
2049 return m_WeaponManager;
2050 }
2051
2053 {
2054 return m_ArrowManager;
2055 }
2056
2057 protected void StopAllMovement()
2058 {
2059 HumanInputController hic = GetInputController();
2060 hic.SetErectSpeedLimit(true, DayZPlayerConstants.MOVEMENTIDX_IDLE);
2061 hic.SetCrouchSpeedLimit(true, DayZPlayerConstants.MOVEMENTIDX_IDLE);
2062 hic.SetProneSpeedLimit(true, DayZPlayerConstants.MOVEMENTIDX_IDLE);
2063 }
2064
2065 protected void RestartAllMovement()
2066 {
2067 HumanInputController hic = GetInputController();
2068 hic.SetErectSpeedLimit(false);
2069 hic.SetCrouchSpeedLimit(false);
2070 hic.SetProneSpeedLimit(false);
2071 }
2072
2074 {
2076 HumanInputController hic = GetInputController();
2077 hic.SetErectSpeedLimit(true, DayZPlayerConstants.MOVEMENTIDX_WALK);
2078 g_Game.GetMission().RemoveActiveInputRestriction(EInputRestrictors.SURRENDER_TRANSITION);
2079 }
2080
2082 {
2084 HumanInputController hic = GetInputController();
2086 g_Game.GetMission().AddActiveInputRestriction(EInputRestrictors.SURRENDER_TRANSITION);
2087 GetItemAccessor().EnableAutoAnimInstUpdateOnHandsChange(false);
2088 SetAnimationInstanceByName("dz/anims/workspaces/player/player_main/player_main_surrender.asi", 1);
2090 }
2091
2093 {
2095 HumanInputController hic = GetInputController();
2099 }
2100
2101 protected void OnStartTransitionFromSurrender(bool changeStance = true)
2102 {
2104 GetItemAccessor().EnableAutoAnimInstUpdateOnHandsChange(true);
2105 if (changeStance)
2106 {
2107 SetAnimationInstanceByName("dz/anims/workspaces/player/player_main/player_main.asi", 1);
2109 }
2110 else
2111 {
2113 }
2114 }
2115
2116 void SetSurrenderState(bool newState)
2117 {
2119 return;
2120
2121 m_IsSurrendered = newState;
2122 GetDayZPlayerInventory().CheckFSMState();
2123 if (GetDayZPlayerInventory().GetCurrentStateID() == HandStateID.UNKNOWN)
2124 {
2125 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(SetSurrenderState, 10, false, newState);
2126 return;
2127 }
2128
2129 if (m_IsSurrendered)
2130 {
2131 ItemBase item = GetItemInHands();
2132
2133 if (item)
2134 {
2135 if (!CanDropEntity(item))
2136 {
2137 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(SetSurrenderState, 10, false, newState);
2138 return;
2139 }
2140
2142 m_HandInventoryLocation.SetHands(this, null);
2143
2144 if (GetInventory().HasInventoryReservation(null, m_HandInventoryLocation))
2145 GetInventory().ClearInventoryReservationEx(null, m_HandInventoryLocation);
2146
2147 if (g_Game.IsMultiplayer())
2148 {
2149 if (g_Game.IsServer())
2150 ServerDropEntity(item);
2151 }
2152 else
2153 {
2154 PhysicalPredictiveDropItem(item); //SP only
2155 }
2156
2157 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(SetSurrenderState, 10, false, newState);
2158 return;
2159 }
2160
2163 }
2164 else
2165 {
2168 }
2169 }
2170
2172 {
2173 if (IsInVehicle() || IsRaised() || IsSwimming() || IsClimbing() || IsClimbingLadder() || IsRestrained() || !GetWeaponManager() || GetWeaponManager().IsRunning() || !GetActionManager() || GetActionManager().GetRunningAction() != null || IsMapOpen())
2174 {
2175 return false;
2176 }
2177 if (GetThrowing() && GetThrowing().IsThrowingModeEnabled())
2178 {
2179 return false;
2180 }
2181 return true;
2182 }
2183
2184 void SetRestrainStarted(bool restrain_started)
2185 {
2186 m_IsRestrainStarted = restrain_started;
2187 SetSynchDirty();
2188 }
2189
2191 {
2192 return m_IsRestrainStarted;
2193 }
2194
2195 void SetRestrainPrelocked(bool restrain_prelock)
2196 {
2197 m_IsRestrainPrelocked = restrain_prelock;
2198 SetSynchDirty();
2199 }
2200
2202 {
2203 return m_IsRestrainPrelocked;
2204 }
2205
2206 void SetRestrained(bool is_restrained)
2207 {
2208 m_IsRestrained = is_restrained;
2209 if (m_IsSurrendered)
2210 {
2211 m_IsSurrendered = false;
2213 m_EmoteManager.SetEmoteLockState(false);
2214 }
2215
2216 SetSynchDirty();
2217 }
2218
2219 override bool IsRestrained()
2220 {
2221 return m_IsRestrained;
2222 }
2223
2225 {
2226 if (m_IsRestrainStarted && IsControlledPlayer())
2227 {
2228 UIManager uiManager = g_Game.GetUIManager();
2229 if (uiManager.IsMenuOpen(MENU_RADIAL_QUICKBAR))
2230 uiManager.FindMenu(MENU_RADIAL_QUICKBAR).Close();
2231 if (uiManager.IsMenuOpen(MENU_INVENTORY))
2232 g_Game.GetMission().HideInventory();
2233 }
2234 }
2235
2237 {
2238 if (m_IsRestrained && IsControlledPlayer())
2239 {
2240 UIManager uiManager = g_Game.GetUIManager();
2241 if (uiManager.IsMenuOpen(MENU_RADIAL_QUICKBAR))
2242 uiManager.FindMenu(MENU_RADIAL_QUICKBAR).Close();
2243 if (uiManager.IsMenuOpen(MENU_INVENTORY))
2244 g_Game.GetMission().HideInventory();
2245 }
2246 }
2247
2248 override bool IsInventoryVisible()
2249 {
2250 return true;
2251 }
2252
2254 {
2255 if (IsControlledPlayer())
2256 {
2258 }
2259 return true;
2260 }
2261
2262 override bool CanReleaseAttachment (EntityAI attachment)
2263 {
2264 return super.CanReleaseAttachment(attachment);
2265 }
2266
2267 override bool CanReleaseCargo (EntityAI cargo)
2268 {
2269 return super.CanReleaseCargo(cargo);
2270 }
2271
2273 {
2274 return super.CanReceiveItemIntoCargo(item);
2275 }
2276
2277 override bool CanSwapItemInCargo (EntityAI child_entity, EntityAI new_entity)
2278 {
2279 return super.CanSwapItemInCargo(child_entity, new_entity);
2280 }
2281
2282 override bool CanReceiveItemIntoHands(EntityAI item_to_hands)
2283 {
2284 if (IsInVehicle())
2285 return false;
2286
2287 if (!CanPickupHeavyItem(item_to_hands))
2288 return false;
2289
2290 return super.CanReceiveItemIntoHands(item_to_hands);
2291 }
2292
2293
2295 {
2296 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
2297 {
2298 return GetCraftingManager().GetRecipeID();
2299 }
2300 else
2301 {
2302 return m_RecipeID;
2303 }
2304 }
2305
2306 void SetCraftingRecipeID(int recipeID)
2307 {
2308 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
2309 {
2310 GetCraftingManager().SetRecipeID(recipeID);
2311 }
2312 else
2313 {
2314 m_RecipeID = recipeID;
2315 }
2316 }
2317
2318 // --------------------------------------------------
2319 // Action data for construction actions
2320 //---------------------------------------------------
2325
2327 {
2329 {
2330 m_ConstructionActionData.ResetActionIndexes();
2331 }
2332 }
2333
2334 // --------------------------------------------------
2335 // Action data for fireplace (indoor)
2336 //---------------------------------------------------
2338 {
2339 return m_LastFirePoint;
2340 }
2342 {
2343 return m_LastFirePointRot;
2344 }
2346 {
2347 return m_LastFirePointIndex;
2348 }
2349
2350 void SetLastFirePoint(vector last_fire_point)
2351 {
2352 m_LastFirePoint = last_fire_point;
2353 }
2354 void SetLastFirePointRot(float last_fire_point_rot)
2355 {
2356 m_LastFirePointRot = last_fire_point_rot;
2357 }
2358 void SetLastFirePointIndex(int last_fire_point_index)
2359 {
2360 m_LastFirePointIndex = last_fire_point_index;
2361 }
2362
2363 // --------------------------------------------------
2364 // QuickBar
2365 //---------------------------------------------------
2366
2368 {
2369 int index = m_QuickBarBase.FindEntityIndex(entity);
2370 if (index != -1)
2371 m_QuickBarBase.SetEntityShortcut(entity,-1);
2372 }
2373 //---------------------------------------------------
2375 {
2376 int index = m_QuickBarBase.FindEntityIndex(entity);
2377 if (index != -1)
2378 m_QuickBarBase.SetShotcutEnable(index,value);
2379
2380 }
2381 //---------------------------------------------------
2383 {
2384 int index;
2385 index = m_QuickBarBase.FindEntityIndex(entity);
2386
2387 if (m_QuickBarBase.GetEntity(index) == NULL)
2388 return -1;
2389
2390 return index;
2391 }
2392 //---------------------------------------------------
2393
2395 {
2396 return m_QuickBarBase.GetSize();
2397 }
2398 //---------------------------------------------------
2400 {
2401 return m_QuickBarBase.GetEntity(index);
2402 }
2403 //---------------------------------------------------
2405 {
2406 int i = FindQuickBarEntityIndex(entity);
2407 if (i >= 0)
2408 m_QuickBarBase.UpdateShotcutVisibility(i);
2409 }
2410 //---------------------------------------------------
2411 void SetQuickBarEntityShortcut(EntityAI entity, int index, bool force = false)
2412 {
2413 m_QuickBarBase.SetEntityShortcut(entity, index, force);
2414 }
2415 //---------------------------------------------------
2417 {
2418 m_QuickBarBase.OnSetEntityRequest(ctx);
2419 }
2420 //---------------------------------------------------
2421
2422 // Applies splint on all limbs.
2424 {
2425 float add_health_coef = 0.33;
2426 // The idea is to slightly increase health of broken limb so the player is still limping. Using more splints will help but each time less. 100% recovery can be achieved only through long term healing.
2427 if (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
2428 {
2429 AddHealth("LeftLeg", "Health", (GetMaxHealth("LeftLeg", "Health") - GetHealth("LeftLeg", "Health") ) * add_health_coef );
2430 AddHealth("RightLeg", "Health", (GetMaxHealth("RightLeg", "Health") - GetHealth("RightLeg", "Health")) * add_health_coef );
2431 AddHealth("RightFoot", "Health", (GetMaxHealth("RightFoot", "Health") - GetHealth("RightFoot", "Health")) * add_health_coef );
2432 AddHealth("LeftFoot", "Health", (GetMaxHealth("LeftFoot", "Health") - GetHealth("LeftFoot", "Health")) * add_health_coef );
2433 }
2434 }
2435
2436 void ProcessDrowning(float dT)
2437 {
2438 GetStaminaHandler().DepleteStaminaEx(EStaminaModifiers.DROWN,dT);
2439
2440 #ifndef SERVER
2441 #ifndef NO_GUI
2442 //PP EFFECTS
2443 PPERequester_Drowning req = PPERequester_Drowning.Cast(PPERequesterBank.GetRequester(PPERequesterBank.REQ_DROWNING));
2444 req.SetStamina01(GetStaminaHandler().GetStaminaNormalized());
2445 #endif
2446 #endif
2447 }
2448
2450 {
2452 return;
2454 int boneIdx = GetBoneIndexByName("Head");
2455
2456 if (boneIdx != -1)
2457 {
2458 Particle p = ParticleManager.GetInstance().PlayInWorld(ParticleList.DROWNING_BUBBLES, "-0.03 0.15 0");
2459 if (p)
2460 AddChild(p, boneIdx);
2461 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(SpawnDrowningBubbles, bubbleFrequency);
2462 }
2463 }
2464
2465 void ProcessHoldBreath(float dT)
2466 {
2467 if (IsTryingHoldBreath() && CanStartConsumingStamina(EStaminaConsumers.HOLD_BREATH))
2468 {
2469 if (!m_IsHoldingBreath)
2470 {
2472 m_IsHoldingBreath = true;
2473 }
2474 }
2475 else if (!IsTryingHoldBreath() || !CanConsumeStamina(EStaminaConsumers.HOLD_BREATH))
2476 {
2478 m_IsHoldingBreath = false;
2479 }
2480 }
2481
2483 {
2484 //SendSoundEvent(SoundSetMap.GetSoundSetID("holdBreath_male_Char_SoundSet"));
2485 RequestSoundEventEx(EPlayerSoundEventID.HOLD_BREATH, true, EPlayerSoundEventParam.SKIP_CONTROLLED_PLAYER);
2486 }
2487
2489 {
2490 RequestSoundEventEx(EPlayerSoundEventID.EXHAUSTED_BREATH, true, EPlayerSoundEventParam.SKIP_CONTROLLED_PLAYER);
2491 }
2492
2494 {
2495 //SendSoundEvent(SoundSetMap.GetSoundSetID("releaseBreath_male_Char_SoundSet"));
2496 RequestSoundEventEx(EPlayerSoundEventID.RELEASE_BREATH, true, EPlayerSoundEventParam.SKIP_CONTROLLED_PLAYER);
2497 }
2498
2499 override bool IsHoldingBreath()
2500 {
2501 return m_IsHoldingBreath;
2502 }
2503
2505 {
2506 return false;
2507 }
2508
2510 {
2511 return IsAlive();
2512 }
2513
2518
2520 {
2522 {
2525
2527 }
2528
2529 m_SaySoundObject = m_SaySoundBuilder.BuildSoundObject();
2530 m_SaySoundObject.SetPosition(GetPosition());
2531 return g_Game.GetSoundScene().Play3D(m_SaySoundObject, m_SaySoundBuilder);
2532 }
2533
2534 EntityAI FindCargoByBaseType(string searched_item)
2535 {
2536 EntityAI attachment;
2537 string item_name;
2538 GameInventory inventory = GetInventory();
2539 int attcount = inventory.AttachmentCount();
2540
2541 for (int att = 0; att < attcount; ++att)
2542 {
2543 attachment = inventory.GetAttachmentFromIndex(att);
2544 if (attachment.IsItemBase())
2545 {
2546 item_name = attachment.GetType();
2547 if (g_Game.IsKindOf(item_name, searched_item))
2548 {
2549 return attachment;
2550 }
2551 }
2552 }
2553 return NULL;
2554 }
2555
2557 {
2558 if (g_Game.IsDebug())
2559 {
2560 if (!g_Game.IsMultiplayer() && g_Game.GetPlayer() && g_Game.GetPlayer().GetID() == this.GetID())
2561 {
2562 PluginSceneManager scene_editor = PluginSceneManager.Cast(GetPlugin(PluginSceneManager));
2563 scene_editor.InitLoad();
2564 }
2565 }
2566 }
2567
2568 //---------------------------------------------------------------------------------------------------------------------------
2570 {
2571 InitEditor();
2572
2574 if (m_Environment)
2575 m_Environment.Init();
2576
2577 if (g_Game.IsMultiplayer() || g_Game.IsServer())
2578 {
2579 if (m_ModuleLifespan)
2580 {
2582 }
2583 }
2584
2585 if (IsControlledPlayer())//true only on client for the controlled character
2586 {
2588
2589 Mission mission = g_Game.GetMission();
2590 if (m_Hud)
2591 {
2592 m_Hud.UpdateBloodName();
2593 PPEManagerStatic.GetPPEManager().StopAllEffects(PPERequesterCategory.GAMEPLAY_EFFECTS);
2594 g_Game.GetUIManager().CloseAll();
2595 mission.SetPlayerRespawning(false);
2596 mission.OnPlayerRespawned(this);
2597
2598 m_Hud.ShowQuickbarUI(true);
2599 m_Hud.UpdateQuickbarGlobalVisibility();
2600 m_Hud.InitHeatBufferUI(this);
2601 m_Hud.OnPlayerLoaded();
2602 }
2603 m_EffectWidgets = mission.GetEffectWidgets();
2604 }
2605 if (!g_Game.IsHeadlessOrDedicatedServer())
2606 {
2607 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(UpdateCorpseStateVisual, 2000, false);//sometimes it takes a while to load in
2608 m_PlayerSoundEventHandler = new PlayerSoundEventHandler(this);
2609 m_ReplaceSoundEventHandler = new ReplaceSoundEventHandler(this);
2610 }
2611 int slotId = InventorySlots.GetSlotIdFromString("Head");
2612 m_CharactersHead = Head_Default.Cast(GetInventory().FindPlaceholderForSlot(slotId));
2616
2618 if (wpn)
2619 {
2620 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_REMOTE)
2621 {
2622 wpn.DelayedValidateAndRepair();
2623 }
2624 else
2625 {
2626 wpn.ValidateAndRepair();
2627 }
2628 }
2629
2630 m_PlayerLoaded = true;
2631 }
2632
2633 void SetPlayerDisconnected(bool state)
2634 {
2636 }
2637
2639 {
2641 }
2642
2643 // --------------------------------------------------
2644 // Advanced placement
2645 //---------------------------------------------------
2646
2647 //get hologram
2649 {
2650 return m_HologramServer;
2651 }
2652
2654 {
2655 return m_HologramLocal;
2656 }
2657
2659 {
2660 if (item)
2661 {
2663 m_HologramServer.SetProjectionPosition(GetLocalProjectionPosition());
2664 m_HologramServer.SetProjectionOrientation(GetLocalProjectionOrientation());
2665 m_HologramServer.GetProjectionEntity().OnPlacementStarted(this);
2666 m_HologramServer.CheckPowerSource();
2667 m_HologramServer.RefreshVisual();
2668 }
2669 }
2670
2672 {
2673 if (g_Game.IsMultiplayer() && g_Game.IsServer())
2674 return;
2675
2676 if (item)
2677 {
2679 m_HologramLocal.GetProjectionEntity().OnPlacementStarted(this);
2680 }
2681 }
2682
2684 {
2685 EntityAI entityInHands = GetEntityInHands();
2686
2687 if (IsPlacingServer())
2688 {
2689 m_HologramServer.CheckPowerSource();
2690 m_HologramServer.GetParentEntity().OnPlacementCancelled(this);
2691
2692 delete m_HologramServer;
2693
2694 return;
2695 }
2696 else if (entityInHands && entityInHands.HasEnergyManager())
2697 {
2698 if (entityInHands.GetCompEM().IsPlugged())
2699 entityInHands.OnPlacementCancelled(this);
2700 }
2701 }
2702
2703 //Called when item placement is canceled, will prevent quickbar usage until the item the player was placing is back in hands
2705 {
2706 m_AreHandsLocked = true;
2707 }
2708
2710 {
2711 EntityAI entityInHands = GetEntityInHands();
2712 if (entityInHands && entityInHands.HasEnergyManager())
2713 {
2714 if (entityInHands.GetCompEM().IsPlugged())
2715 entityInHands.OnPlacementCancelled(this);
2716 }
2717
2718 delete m_HologramLocal;
2719 }
2720
2726
2732
2734 {
2735 return m_HologramServer != null;
2736 }
2737
2739 {
2740 return m_HologramLocal != null;
2741 }
2742
2743 void SetDrowning(bool enable)
2744 {
2745 if (enable != m_IsDrowning)
2746 {
2747 if (enable)
2749 else
2750 OnDrowningEnd();
2751 }
2752
2753 m_IsDrowning = enable;
2754 }
2755
2757 {
2758 #ifndef SERVER
2759 #ifndef NO_GUI
2760 if (IsControlledPlayer())
2761 {
2762 PPERequester_Drowning req = PPERequester_Drowning.Cast(PPERequesterBank.GetRequester(PPERequesterBank.REQ_DROWNING));
2763 req.Start();
2764 }
2765 //Particles
2767 #endif
2768 #endif
2769 }
2770
2772 {
2773 #ifndef SERVER
2774 #ifndef NO_GUI
2775 if (IsControlledPlayer())
2776 {
2777 PPERequester_Drowning req = PPERequester_Drowning.Cast(PPERequesterBank.GetRequester(PPERequesterBank.REQ_DROWNING));
2778 req.Stop();
2779 }
2780 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(SpawnDrowningBubbles);
2781 #endif
2782 #endif
2783 }
2784
2785 bool TogglePlacingServer(int userDataType, ParamsReadContext ctx)
2786 {
2787 if (userDataType == INPUT_UDT_ADVANCED_PLACEMENT)
2788 {
2790 return true;
2791 }
2792
2793 return false;
2794 }
2795
2797 {
2798 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT && g_Game.IsMultiplayer())
2799 {
2800 m_ProcessResetADS = true;
2802 }
2803 else if (!g_Game.IsMultiplayer())
2804 {
2805 m_ResetADS = true;
2806 }
2807 }
2808
2810 {
2812 {
2815 ctx.Send();
2816
2817 m_ProcessResetADS = false;
2818 }
2819 }
2820
2822 bool ResetADSPlayerSync(int userDataType, ParamsReadContext ctx)
2823 {
2824 if (userDataType == INPUT_UDT_RESET_ADS)
2825 {
2828 return true;
2829 }
2830
2831 return false;
2832 }
2833
2834 override bool CanPlaceItem(EntityAI item)
2835 {
2837 {
2838 TStringSet disallowedUndergroundTypes = CfgGameplayHandler.GetDisallowedTypesInUnderground();
2839 foreach (string t: disallowedUndergroundTypes)
2840 {
2841 if (item.IsKindOf(t))
2842 return false;
2843 }
2844 }
2845 return true;
2846 }
2847
2852
2854 {
2855 if (m_UndergroundPresence != presence)
2856 {
2857 m_UndergroundPresence = presence;
2858
2859 if (g_Game.IsMultiplayer())
2860 {
2864 ctx.Send();
2865 }
2866 }
2867 }
2868
2870 {
2871 if (IsPlacingLocal())
2872 {
2873 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT && g_Game.IsMultiplayer())
2874 {
2876 {
2879 ctx.Send();
2880
2882 }
2883 }
2884 else
2886 }
2887 else if (!item)
2888 {
2890 }
2891 else
2892 {
2893 PlacingStartLocal(item);
2894 }
2895 }
2896
2898 {
2899 m_LocalProjectionPosition = local_position;
2900
2901 #ifdef DEVELOPER
2902 if (IsCLIParam("hologramLogs"))
2903 {
2904 Debug.Log(string.Format("SetLocalProjectionPosition | pos: %1", m_LocalProjectionPosition), "hologramLogs");
2905 }
2906 #endif
2907 }
2908
2910 {
2911 m_LocalProjectionOrientation = local_orientation;
2912 }
2913
2918
2923
2924 void SetInColdArea(bool state)
2925 {
2926 if (m_IsInColdArea != state)
2927 {
2928 m_IsInColdArea = state;
2929 SetSynchDirty();
2930 }
2931 }
2932
2934 {
2935 return m_IsInColdArea;
2936 }
2937
2938 // ------------------------------------------------------------------------
2939
2941 void SetInWater(bool pState)
2942 {
2943 m_IsInWater = pState;
2944 SetSynchDirty();
2945 }
2946
2948 {
2949 return m_IsInWater;
2950 }
2951
2952 // -------------------------------------------------------------------------
2953
2955 {
2956 m_CameraSwayModifier = new_camera.GetWeaponSwayModifier();
2957 m_CurrentCamera = new_camera;
2958 }
2959
2964
2966 {
2967 if (!m_CurrentCamera)
2968 return false;
2969
2970 return m_CurrentCamera.GetCurrentPitch() < PlayerConstants.CAMERA_THRESHOLD_PITCH;
2971 }
2972
2973 BleedingSourcesManagerServer GetBleedingManagerServer()
2974 {
2976 }
2977
2978 BleedingSourcesManagerRemote GetBleedingManagerRemote()
2979 {
2981 }
2982
2988 {
2989 if (!m_VirtualHud)
2990 {
2991 m_VirtualHud = new VirtualHud(this);
2992 }
2993 return m_VirtualHud;
2994 }
2995
2996 TransferValues GetTransferValues()
2997 {
2998 return m_TrasferValues;
2999 }
3000
3005
3006 //--------------------------------------------------------------------------
3007 void OnScheduledTick(float deltaTime)
3008 {
3009 if (!IsPlayerSelected() || !IsAlive())
3010 return;
3012 m_ModifiersManager.OnScheduledTick(deltaTime);
3013 if (m_NotifiersManager)
3014 m_NotifiersManager.OnScheduledTick();
3015 if (m_TrasferValues)
3016 m_TrasferValues.OnScheduledTick(deltaTime);
3017 if (m_VirtualHud)
3018 m_VirtualHud.OnScheduledTick();
3020 GetBleedingManagerServer().OnTick(deltaTime);
3021 if (m_Environment)
3022 m_Environment.Update(deltaTime);
3024 m_ThermalBiasHandler.OnTick(deltaTime);
3025
3026 // Check if electric device needs to be unplugged
3027 EntityAI heldEntity = GetEntityInHands();
3028 if (heldEntity && heldEntity.HasEnergyManager() && heldEntity.GetCompEM().IsPlugged())
3029 {
3030 // Now we know we are working with an electric device which is plugged into a power source.
3031 EntityAI placed_entity = heldEntity;
3032
3033 // Unplug the device when the player is too far from the power source.
3034 placed_entity.GetCompEM().UpdatePlugState();
3035 }
3036 }
3037
3038 void OnCommandHandlerTick(float delta_time, int pCurrentCommandID)
3039 {
3040 if (!IsAlive())
3041 {
3042 if (!m_DeathSyncSent && m_KillerData)
3043 {
3044 SyncEvents.SendEntityKilled(this, m_KillerData.m_Killer, m_KillerData.m_MurderWeapon, m_KillerData.m_KillerHiTheBrain);
3045 m_DeathSyncSent = true;
3046 }
3047 return;
3048 }
3050 m_DebugMonitorValues.OnScheduledTick(delta_time);
3051 if (GetSymptomManager())
3052 GetSymptomManager().OnTick(delta_time, pCurrentCommandID, m_MovementState);//needs to stay in command handler tick as it's playing animations
3053 //if (GetBleedingManagerServer()) GetBleedingManagerServer().OnTick(delta_time);
3054
3056 if (instType == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3057 {
3058 if (m_PlayerSoundEventHandler)
3059 m_PlayerSoundEventHandler.OnTick(delta_time);
3060
3062 {
3063 m_EffectWidgets.RemoveActiveEffects(m_ProcessRemoveEffectWidgets);
3064 }
3065
3067 {
3069 }
3070
3072
3075
3076 #ifdef DIAG_DEVELOPER
3077 if (m_WeaponDebug)
3078 {
3079 m_WeaponDebug.OnCommandHandlerUpdate();
3080 }
3081 #endif
3082
3083 m_ProcessAddEffectWidgets.Clear(); //clears array for remotes as well
3084 m_ProcessRemoveEffectWidgets.Clear(); //clears array for remotes as well
3085 }
3086
3087 m_AnimCommandStarting = HumanMoveCommandID.None;
3088
3091
3092 if (m_ProcessResetADS)
3094 }
3095
3098 {
3099 HumanCommandMove hcm = GetCommand_Move();
3100 if (hcm)
3101 {
3102 float staminaPercentage = GetStaminaHandler().GetSyncedStaminaNormalized();
3103 hcm.SetTurnSpanSprintModifier(2 - staminaPercentage);
3104 hcm.SetRunSprintFilterModifier((2 - staminaPercentage) * 0.5);
3105 hcm.SetDirectionSprintFilterModifier(2 - staminaPercentage);
3106 }
3107 }
3108
3109 bool m_ShowDbgUI = true;
3111 float m_DbgSliderValue = 0.0;
3112 ref array<string> m_DbgOptions = {"jedna", "dva", "tri"};
3113
3118
3119 //--------------------------------------------------------------------------
3120 void OnTick()
3121 {
3122 int currentTime = g_Game.GetTime();
3123 float deltaT = (currentTime - m_LastTick) * 0.001;
3124 if (m_LastTick < 0)
3125 deltaT = 0; //first tick protection
3126
3127 m_LastTick = currentTime;
3128
3129 OnScheduledTick(deltaT);
3130 }
3131
3132 // -------------------------------------------------------------------------
3133 override void EEItemIntoHands(EntityAI item)
3134 {
3135 super.EEItemIntoHands(item);
3136
3137 if (item)
3138 {
3139 MiscGameplayFunctions.RemoveAllAttachedChildrenByTypename(item, {Bolt_Base});
3140
3141 Weapon_Base w;
3142 if (Class.CastTo(w, item))
3143 {
3144 w.ResetWeaponAnimState();
3145
3146 HumanCommandMove cm = GetCommand_Move();
3147 if (cm)
3148 {
3149 cm.SetMeleeBlock(false);
3150 GetMeleeFightLogic().SetBlock(false);
3151 }
3152 }
3153
3155 if (item.IsHeavyBehaviour() && IsRaised())
3156 {
3157 HumanCommandMove cm2 = GetCommand_Move();
3158 if (cm2)
3159 {
3160 cm2.ForceStance(DayZPlayerConstants.STANCEIDX_ERECT);
3161 }
3162 }
3163
3165 }
3166 }
3167
3168 override void EEItemOutOfHands(EntityAI item)
3169 {
3170 super.EEItemOutOfHands(item);
3171
3172 if (IsPlacingLocal())
3173 {
3174 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Call(TogglePlacingLocal, item);
3175 }
3176 }
3177
3179 {
3180 return m_PlayerStomach;
3181 }
3182
3184 {
3185 if (!IsSurrendered())
3186 return;
3187
3189 GetMovementState(hms);
3190
3191 switch (hms.m_CommandTypeId)
3192 {
3193 case DayZPlayerConstants.COMMANDID_DEATH:
3194 case DayZPlayerConstants.COMMANDID_FALL:
3195 case DayZPlayerConstants.COMMANDID_UNCONSCIOUS:
3196 case DayZPlayerConstants.COMMANDID_SWIM:
3197 {
3198 m_IsSurrendered = false;
3200 m_EmoteManager.SetEmoteLockState(false);
3201 break;
3202 }
3203 }
3204 }
3205
3206 override void CommandHandler(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
3207 {
3208 EvaluateDamageHit(pCurrentCommandID);
3209
3210 // lower implement
3211 super.CommandHandler(pDt,pCurrentCommandID,pCurrentCommandFinished);
3212
3214
3215 vector playerPosition = PhysicsGetPositionWS();
3216
3217 HumanInputController hic = GetInputController();
3218
3221
3223
3224 if (m_BrokenLegsJunctureReceived)//was there a change in broken legs state ?
3225 {
3227 bool initial = m_BrokenLegState < 0;//negative values indicate initial activation
3228
3229 if (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
3230 {
3231 DropHeavyItem();
3232 if (initial)
3233 {
3235 hic.ResetADS();
3236 GetUApi().GetInputByID(UATempRaiseWeapon).Supress();
3237 ExitSights();
3238 }
3239 }
3240 }
3241
3242 if (IsFireWeaponRaised() || m_IsHoldingBreath)
3243 {
3244 ProcessHoldBreath(pDt);
3245 }
3246
3248
3249 if (m_AreHandsLocked && GetEntityInHands())
3250 {
3251 m_AreHandsLocked = false;
3252 }
3253
3254 // freelook camera memory for weapon raycast
3256 {
3257 if (hic.CameraIsFreeLook())
3258 {
3259 m_DirectionToCursor = g_Game.GetCurrentCameraDirection();
3260 }
3261 }
3262 else
3263 {
3264 if (!hic.CameraIsFreeLook())
3265 {
3267 }
3268 }
3269
3271 {
3274 {
3275 if (m_IsSurrendered)
3277 else
3279 }
3280 }
3281
3282 if (m_WeaponManager)
3283 {
3284 m_WeaponManager.Update(pDt);
3285 }
3286 if (m_EmoteManager && IsPlayerSelected())
3287 {
3288 m_EmoteManager.Update(pDt);
3289 }
3290 if (m_RGSManager)
3291 {
3292 m_RGSManager.Update();
3293 }
3294 if (m_StanceIndicator)
3295 {
3296 m_StanceIndicator.Update();
3297 }
3298 if (m_StaminaHandler)
3299 {
3300 m_StaminaHandler.Update(pDt, pCurrentCommandID);
3301 }
3302 if (m_InjuryHandler)
3303 {
3304 m_InjuryHandler.Update(pDt);
3305 }
3306 if (m_HCAnimHandler)
3307 {
3308 m_HCAnimHandler.Update(pDt, m_MovementState);
3309 }
3310 if (m_ShockHandler)
3311 {
3312 m_ShockHandler.Update(pDt);
3313 }
3314
3315 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3316 {
3318 }
3319
3320 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !GetGame().IsMultiplayer())
3321 {
3322 GetPlayerSoundManagerServer().Update();
3323 ShockRefill(pDt);
3324 FreezeCheck();
3325 }
3326
3327 if (m_IsDrowning)
3328 {
3329 ProcessDrowning(pDt);
3330 }
3331 UpdateDelete();
3332
3333 HandleDamageHit(pCurrentCommandID);
3334
3335 if (mngr && hic)
3336 {
3337 //invalidate construction data before client update, to be validated during variants update
3338 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT || !GetGame().IsMultiplayer() && GetConstructionActionData())
3339 GetConstructionActionData().Invalidate();
3340
3341 mngr.Update(pCurrentCommandID);
3342
3343 HumanCommandUnconscious hcu = GetCommand_Unconscious();
3344 HumanCommandVehicle hcv = GetCommand_Vehicle();
3345
3346 if (hcu && hcu.IsRagdoll())
3347 {
3348 // Don't attach us back to the vehicle once we wake up
3349 m_TransportCache = null;
3350 }
3351
3352 if (!m_UnconsciousDebug)
3353 {
3355 if (m_ShouldBeUnconscious && m_IsUnconscious)
3356 {
3357 if (hcu)
3358 {
3360 m_Swimming.m_bWasSwimming |= hcu.IsInWater();
3361 }
3362
3363 if (m_Swimming.m_bWasSwimming)
3364 {
3365 m_LastCommandBeforeUnconscious = DayZPlayerConstants.COMMANDID_SWIM;
3366 }
3367
3368 OnUnconsciousUpdate(pDt, m_LastCommandBeforeUnconscious);
3369 }
3371 else if (m_ShouldBeUnconscious)
3372 {
3374 bool isTransitioning = hcv && (hcv.IsGettingIn() || hcv.IsGettingOut() || hcv.IsSwitchSeat());
3375
3376 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
3377 {
3378 OnUnconsciousUpdate(pDt, m_LastCommandBeforeUnconscious);
3379
3380 m_IsUnconscious = true;
3382 }
3386 else if (pCurrentCommandID != DayZPlayerConstants.COMMANDID_DEATH && pCurrentCommandID != DayZPlayerConstants.COMMANDID_FALL && !isTransitioning)
3387 {
3388 m_LastCommandBeforeUnconscious = pCurrentCommandID;
3389
3390 if (hcv)
3391 {
3392 m_TransportCache = hcv.GetTransport();
3393 }
3394 else
3395 {
3396 m_TransportCache = null;
3397 }
3398
3399 Motorbike motorbike = Motorbike.Cast(m_TransportCache);
3400 if (motorbike)
3401 {
3402 motorbike.FallOver();
3403 }
3404
3406 m_JumpClimb.CheckAndFinishJump();
3407 hcu = StartCommand_Unconscious(0);
3408 SetFallYDiff(playerPosition[1]);
3409 }
3410 }
3412 else if (m_IsUnconscious)
3413 {
3415 if (hcu && pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
3416 {
3417 OnUnconsciousUpdate(pDt, m_LastCommandBeforeUnconscious);
3418
3420 if (m_UnconsciousTime > 2)
3421 {
3422 // If the player is falling then prevent waking up
3423 if (false == PhysicsIsFalling(false))
3424 {
3425 int wakeUpStance = DayZPlayerConstants.STANCEIDX_PRONE;
3426
3428 if (m_Swimming.m_bWasSwimming || m_LastCommandBeforeUnconscious == DayZPlayerConstants.COMMANDID_VEHICLE)
3429 wakeUpStance = -1;
3430
3431 hcu.WakeUp(wakeUpStance);
3432
3433 m_IsUnconscious = false;
3434 OnUnconsciousStop(pCurrentCommandID);
3435 }
3436 }
3437 }
3438 else
3439 {
3441 if (IsAlive())
3442 {
3443 m_IsUnconscious = false;
3444 OnUnconsciousStop(pCurrentCommandID);
3445 }
3446 }
3447 }
3448 }
3449
3450 // quickbar use
3451 int quickBarSlot = hic.IsQuickBarSlot();
3452 if (quickBarSlot && IsAlive())
3453 {
3454 if (hic.IsQuickBarSingleUse())
3455 {
3456 OnQuickBarSingleUse(quickBarSlot);
3457 //Print("PlayerBase.c IsQuickBarSingleUse - slot: " + quickBarSlot.ToString());
3458 }
3459 if (hic.IsQuickBarContinuousUseStart() && ((!g_Game.IsDedicatedServer()) && !g_Game.GetUIManager().GetMenu()))
3460 {
3461 OnQuickBarContinuousUseStart(quickBarSlot);
3462 //Print("PlayerBase.c IsQuickBarContinuousUseStart - slot: " + quickBarSlot.ToString());
3463 }
3464 if (hic.IsQuickBarContinuousUseEnd() && ((!g_Game.IsDedicatedServer())))
3465 {
3466 OnQuickBarContinuousUseEnd(quickBarSlot);
3467 //Print("PlayerBase.c IsQuickBarContinuousUseEnd - slot: " + quickBarSlot.ToString());
3468 }
3469 }
3470
3471 /*if ((pCurrentCommandID == DayZPlayerConstants.COMMANDID_ACTION || pCurrentCommandID == DayZPlayerConstants.COMMANDID_MOVE || pCurrentCommandID == DayZPlayerConstants.COMMANDID_LADDER || pCurrentCommandID == DayZPlayerConstants.COMMANDID_SWIM))
3472 {
3473 mngr.Update(); // checks for suitable action and sets it
3474 }*/
3475 }
3476
3477 if (m_StaminaHandler && hic)
3478 {
3479 HumanCommandMove hcm = GetCommand_Move();
3480 bool isSwimmingOrClimbing = GetCommand_Swim() || GetCommand_Climb() || GetCommand_Ladder();
3481 bool isStaminaLimitAppliable = hcm || isSwimmingOrClimbing;
3482
3483 if (isStaminaLimitAppliable)
3484 {
3486 }
3487 }
3488
3489 //map closing - feel free to move to different "update" if it does not belong here
3490 if (IsMapOpen())
3491 {
3492 if (!g_Game.IsDedicatedServer())
3493 {
3494 if (!CfgGameplayHandler.GetUse3DMap() && !g_Game.GetUIManager().IsMenuOpen(MENU_MAP))
3495 {
3496 CloseMapEx(false);
3497 }
3499 {
3501 {
3502 CloseMapEx(true);
3503 }
3504 else if (IsMapCallbackEndInput())
3505 {
3506 CloseMapEx(false);
3507 }
3508 }
3509 }
3510 }
3511
3512
3513 #ifdef ROBOCLIENT
3514 if (m_Bot)
3515 m_Bot.OnUpdate(pDt);
3516 #endif
3517
3518 if (m_CheckMeleeItem && (!g_Game.IsDedicatedServer()))
3519 {
3522 }
3523
3524 #ifdef DEVELOPER
3525 TryGetInVehicleDebug();
3526 #endif
3527
3528 OnCommandHandlerTick(pDt, pCurrentCommandID);
3529 }
3530
3531 #ifdef DEVELOPER
3532 void SetGetInVehicleDebug(EntityAI ent)
3533 {
3534 m_GetInVehicleTransportDebug = Transport.Cast(ent);
3535 }
3536
3537 void TryGetInVehicleDebug()
3538 {
3539 if (m_GetInVehicleTransportDebug)
3540 {
3541 HumanCommandVehicle vehCommand = StartCommand_Vehicle(m_GetInVehicleTransportDebug, 0, 0);
3542 if (vehCommand)
3543 {
3544 vehCommand.SetVehicleType(m_GetInVehicleTransportDebug.GetAnimInstance());
3545 }
3546 m_GetInVehicleTransportDebug = null;
3547 }
3548 }
3549 #endif
3550
3551 //MAP handling
3554 {
3555 CloseMapEx(false);
3556 }
3557
3558 void CloseMapEx(bool cancelled)
3559 {
3560 if (m_hac && !GetMapClosingSyncSent())
3561 {
3562 Mission mission = g_Game.GetMission();
3564 {
3565 if (g_Game.IsMultiplayer() && g_Game.IsClient())
3566 {
3567 ActionManagerClient mngr_client;
3568 CastTo(mngr_client, GetActionManager());
3569
3570 if (cancelled)
3571 {
3572 mngr_client.RequestInterruptAction();
3573 }
3574 else
3575 {
3576 mngr_client.RequestEndAction();
3577 }
3578
3579 mission.RemoveActiveInputExcludes({"map"});
3580 mission.RemoveActiveInputRestriction(EInputRestrictors.MAP);
3581 }
3582 else if (!g_Game.IsMultiplayer())
3583 {
3584 int command_ID = DayZPlayerConstants.CMD_ACTIONINT_END;
3585 if (cancelled)
3586 {
3587 command_ID = DayZPlayerConstants.CMD_ACTIONINT_INTERRUPT;
3588 }
3589 m_hac.InternalCommand(command_ID);
3590 }
3592 }
3593 }
3594
3595 if (!g_Game.IsHeadlessOrDedicatedServer())
3596 {
3597 UIManager uiManager = g_Game.GetUIManager();
3598 if (uiManager.IsMenuOpen(MENU_MAP))
3599 {
3600 uiManager.FindMenu(MENU_MAP).Close();
3601 if (m_Hud)
3602 {
3603 m_Hud.ShowQuickbarPlayer(true);
3604 }
3605
3606 mission.RemoveActiveInputExcludes({"map"});
3607 mission.RemoveActiveInputRestriction(EInputRestrictors.MAP);
3608 }
3609 }
3610 }
3611
3612 void SetMapOpen(bool state)
3613 {
3614 m_MapOpen = state;
3615 }
3616
3618 {
3619 return m_MapOpen;
3620 }
3621
3622 void SetMapClosingSyncSet(bool state)
3623 {
3624 m_MapClosingSyncSent = state;
3625 }
3626
3628 {
3629 return m_MapClosingSyncSent;
3630 }
3631
3633 {
3634 if (IsRaised())
3635 {
3636 return true;
3637 }
3638
3639 return false;
3640 }
3641
3643 {
3644 if (GetUApi().GetInputByID(UADefaultAction).LocalPress() || GetUApi().GetInputByID(UAUIMenu).LocalPress() || GetUApi().GetInputByID(UAGear).LocalPress())
3645 {
3646 return true;
3647 }
3648
3649 return false;
3650 }
3651
3656
3658 {
3660 {
3661 GetMapNavigationBehaviour().OnItemInPlayerPossession(item);
3662 }
3663 }
3664
3666 {
3668 {
3669 GetMapNavigationBehaviour().OnItemNotInPlayerPossession(item);
3670 }
3671 }
3672
3673 void SetCheckMeleeItem(ItemBase item = null)
3674 {
3675 m_CheckMeleeItem = item;
3676 }
3677
3678 void SetShakesForced(int value)
3679 {
3680 m_ShakesForced = value;
3681 }
3682
3684 {
3685 int level;
3686 if (m_ShakesForced > 0)
3687 {
3688 level = m_ShakesForced;
3689 }
3690 else
3691 {
3692 float heat_comfort = GetStatHeatComfort().Get();
3694 {
3696 level = Math.Lerp(1,7,value);
3697 level = Math.Clamp(value,1,7);
3698 /*
3699 value = Math.Clamp(value,0,1);
3700 level = Math.Round(value * SHAKE_LEVEL_MAX);//translate from normalized value to levels
3701 */
3702 }
3703 }
3704 if (level != m_Shakes)
3705 {
3706 m_Shakes = level;
3707 SetSynchDirty();
3708 }
3709 }
3710
3711 override bool IsLanded(int pCurrentCommandID)
3712 {
3713 if (super.IsLanded(pCurrentCommandID))
3714 {
3715 return true;
3716 }
3717
3719 if (pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS)
3720 {
3721 bool wasFalling = m_IsUnconsciousFalling;
3722 m_IsUnconsciousFalling = PhysicsIsFalling(false);
3723 return wasFalling && !m_IsUnconsciousFalling;
3724 }
3725
3727
3728 return false;
3729 }
3730
3731 override bool OnLand(int pCurrentCommandID, FallDamageData fallDamageData)
3732 {
3733 if (super.OnLand(pCurrentCommandID, fallDamageData))
3734 {
3735 return true;
3736 }
3737
3740
3741 return false;
3742 }
3743
3744 override bool IsAlreadyInFallingCommand(int pCurrentCommandID)
3745 {
3746 if (super.IsAlreadyInFallingCommand(pCurrentCommandID))
3747 {
3748 return true;
3749 }
3750
3753 return pCurrentCommandID == DayZPlayerConstants.COMMANDID_UNCONSCIOUS || pCurrentCommandID == DayZPlayerConstants.COMMANDID_DAMAGE;
3754 }
3755
3757 {
3759
3761
3762 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3763 {
3764#ifndef NO_GUI
3765 g_Game.GetMission().GetHud().ShowHudUI(false);
3766#endif
3768 HumanCommandUnconscious hcu = GetCommand_Unconscious();
3769 if (hcu.IsRagdoll() || m_LastCommandBeforeUnconscious != DayZPlayerConstants.COMMANDID_VEHICLE)
3770 {
3771 EntityAI entityInHands = GetEntityInHands();
3772 if (entityInHands && CanDropEntity(entityInHands) && !IsRestrained() && !IsSurrendered())
3773 {
3774 DropItem(ItemBase.Cast(entityInHands));
3775 }
3776 }
3777
3778 g_Game.GetSoundScene().SetSoundVolume(0,2);
3779#ifndef NO_GUI
3780 m_EffectWidgets.AddSuspendRequest(EffectWidgetSuspends.UNCON);
3781#endif
3782
3783#ifdef ROBOCLIENT
3784 RequestRespawnBot();
3785#endif
3786 }
3787
3788 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || (!g_Game.IsMultiplayer() && GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT))
3789 {
3790 SetSynchDirty();
3791
3792 if (m_LastCommandBeforeUnconscious == DayZPlayerConstants.COMMANDID_VEHICLE)
3793 {
3794 if (m_TransportCache)
3795 m_TransportCache.MarkCrewMemberUnconscious(m_TransportCache.CrewMemberIndex(this));
3796 }
3797
3798 // disable voice communication
3799 g_Game.EnableVoN(this, false);
3800
3801 if (m_AdminLog)
3802 {
3803 m_AdminLog.UnconStart(this);
3804 }
3805
3806 // When we fall uncon we force out of block
3807 if (GetMeleeFightLogic())
3808 {
3809 GetMeleeFightLogic().SetBlock(false);
3810 }
3811 }
3812
3813 SetMasterAttenuation("UnconsciousAttenuation");
3814
3816 m_OnUnconsciousStart.Invoke(this);
3817 }
3818
3819 void OnUnconsciousStop(int pCurrentCommandID)
3820 {
3822 SetSynchDirty();
3825 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3826 {
3827#ifndef NO_GUI
3828 Hud hud = g_Game.GetMission().GetHud();
3829 hud.ShowHudUI(true);
3830 if (pCurrentCommandID != DayZPlayerConstants.COMMANDID_DEATH)
3831 {
3832 g_Game.GetSoundScene().SetSoundVolume(g_Game.m_volume_sound,1);
3833 PPERequester_UnconEffects requester = PPERequester_UnconEffects.Cast(PPERequesterBank.GetRequester(PPERequester_UnconEffects));
3834 requester.FadeOutEffect(); //fading
3835 hud.ShowQuickbarUI(true);
3836 UIManager uiManager = g_Game.GetUIManager();
3837 if (uiManager.IsDialogVisible())
3838 {
3839 uiManager.CloseDialog();
3840 }
3841 if (uiManager.IsMenuOpen(MENU_RESPAWN_DIALOGUE))
3842 {
3843 uiManager.FindMenu(MENU_RESPAWN_DIALOGUE).Close();
3844 }
3845 }
3846#endif
3847 SetInventorySoftLock(false);
3848#ifndef NO_GUI
3849 m_EffectWidgets.RemoveSuspendRequest(EffectWidgetSuspends.UNCON);
3850#endif
3851 }
3852 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
3853 {
3854 // enable voice communication
3855 if (IsAlive())
3856 g_Game.EnableVoN(this, true);
3857
3858 if (m_AdminLog)
3859 {
3860 m_AdminLog.UnconStop(this);
3861 }
3862 }
3863
3864 SetMasterAttenuation("");
3865
3867 m_OnUnconsciousStop.Invoke(this);
3868 }
3869
3870 void OnUnconsciousUpdate(float pDt, int last_command)
3871 {
3872 m_UnconsciousTime += pDt;
3873 if (g_Game.IsServer())
3874 {
3875 int shock_simplified = SimplifyShock();
3876
3877 if (m_ShockSimplified != shock_simplified)
3878 {
3879 m_ShockSimplified = shock_simplified;
3880 SetSynchDirty();
3881 }
3882
3884 {
3885 PluginAdminLog adm = PluginAdminLog.Cast(GetPlugin(PluginAdminLog));
3886 adm.PlayerKilledByDrowningUncon(this);
3887
3888 SetHealth("","",-100);
3889 }
3890 }
3891 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
3892 {
3893#ifndef NO_GUI
3894 g_Game.GetMission().GetHud().ShowQuickbarUI(false);
3895#endif
3896 if (GetPulseType() == EPulseType.REGULAR)
3897 {
3898 float shock_simple_normalized = GetSimplifiedShockNormalized();
3899
3900 float sin = Math.Sin(m_UnconsciousTime * 0.35);
3901 float sin_normalized = (sin + 1) / 2;
3902 if (sin_normalized < 0.05)
3903 {
3904 m_UnconsciousVignetteTarget = (1 - shock_simple_normalized / 3) * 2/*vignette max*/;
3905 }
3906 float vignette = Math.Lerp(2,m_UnconsciousVignetteTarget, sin_normalized);
3907 m_UnconParam.param1 = vignette;
3908 PPERequesterBank.GetRequester(PPERequester_UnconEffects).Start(m_UnconParam);
3909 }
3910 }
3911 }
3912
3914 {
3915 int shock = Math.Lerp(0, SIMPLIFIED_SHOCK_CAP, GetHealth("","Shock") / GetMaxHealth("","Shock"));
3916 shock = Math.Clamp(shock, 0, SIMPLIFIED_SHOCK_CAP);
3917 return shock;
3918 }
3919
3924
3925 override bool IsUnconscious()
3926 {
3927 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_UNCONSCIOUS || m_IsUnconscious;
3928 }
3929
3931 {
3932 return m_IsUnconscious;
3933 }
3934
3935 override bool CanBeTargetedByAI(EntityAI ai)
3936 {
3937 #ifdef DIAG_DEVELOPER
3938 if (!m_CanBeTargetedDebug)
3939 {
3940 return false;
3941 }
3942 #endif
3943
3944 return super.CanBeTargetedByAI(ai) && !IsUnconscious() && !IsInVehicle();
3945 }
3946
3947 void GiveShock(float shock)
3948 {
3949 AddHealth("","Shock",shock);
3950 }
3951
3952
3954 {
3956 g_Game.GetMission().RemoveActiveInputExcludes({"inventory"},true);
3957 g_Game.GetMission().RemoveActiveInputRestriction(EInputRestrictors.INVENTORY);
3958 }
3959
3961 void ShockRefill(float pDt);
3962
3963 //BrokenLegs
3964 // -----------------------
3965
3967 {
3968 return Math.AbsInt(m_BrokenLegState);//negative value denotes first time activation
3969 }
3970
3971 //Server side
3972 void SetBrokenLegs(int stateId)
3973 {
3974 m_BrokenLegState = stateId;
3975
3977 eBrokenLegs state = GetBrokenLegs();//m_BrokenLegState can go bellow 0, cannot be used directly
3978
3979 if (state == eBrokenLegs.NO_BROKEN_LEGS)
3980 {
3981 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS;
3982 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS_SPLINT;
3983 }
3984 else if (state == eBrokenLegs.BROKEN_LEGS)
3985 {
3986 SetLegHealth();
3987 }
3988 else if (state == eBrokenLegs.BROKEN_LEGS_SPLINT)
3989 {
3990 // handle splint here
3991 }
3992
3993 SetSynchDirty();
3994 }
3995
3996 //Update of state
3997 void UpdateBrokenLegs(int stateId)
3998 {
3999 eBrokenLegs state = GetBrokenLegs();
4000 //Raise broken legs flag and force to prone
4001 if (state != eBrokenLegs.NO_BROKEN_LEGS)
4002 {
4003 if (state == eBrokenLegs.BROKEN_LEGS_SPLINT)
4004 {
4005 if (m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_PRONE)
4006 {
4007 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.PRONE_ANIM_OVERRIDE;
4008 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS;
4009 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask | eInjuryOverrides.BROKEN_LEGS_SPLINT;
4010 }
4011 m_InjuryHandler.CheckValue(false);
4012
4013 }
4014 else if (state == eBrokenLegs.BROKEN_LEGS)
4015 {
4016
4017 if (m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_PRONE)
4018 {
4019 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.PRONE_ANIM_OVERRIDE;
4020 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS_SPLINT;
4021 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask | eInjuryOverrides.BROKEN_LEGS;
4022 }
4023
4025 m_InjuryHandler.CheckValue(false);
4026
4027 }
4028 }
4029 else if (state == eBrokenLegs.NO_BROKEN_LEGS)
4030 {
4031 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS;
4032 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.BROKEN_LEGS_SPLINT;
4033 }
4034
4035 }
4036
4038 {
4039 PlaySoundSet(m_BrokenLegSound, SOUND_BREAK_LEG, 0.1, 0.1);
4040 }
4041 void BrokenLegForceProne(bool forceOverride = false)
4042 {
4043 if (!IsInWater() && !IsSwimming() && !IsClimbingLadder() && !IsInVehicle() && !IsClimbing() && DayZPlayerUtils.PlayerCanChangeStance(this, DayZPlayerConstants.STANCEIDX_PRONE))
4044 {
4045 if (m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_PRONE && m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
4046 {
4047 EntityAI attachment;
4048 Class.CastTo(attachment, GetItemOnSlot("Splint_Right"));
4049 if (attachment && attachment.GetType() == "Splint_Applied")
4050 {
4051 attachment.Delete();
4052 }
4053
4055 m_ShockHandler.CheckValue(true);
4056
4057
4058 if (m_ShockHandler.GetCurrentShock() >= 25) //Prevent conflict with unconsciousness by not forcing prone when going uncon (25 shock or less left)
4059 {
4060
4061 //calcels user action
4062 HumanCommandActionCallback cmd = GetCommand_Action();
4063 if (cmd)
4064 {
4065 cmd.Cancel();
4066 }
4067
4068 StopHandEvent();
4069 //Get command move and verify not null
4070 HumanCommandMove hcm = StartCommand_Move();//not sure why this is here
4071 hcm = GetCommand_Move();
4072 if (hcm)
4073 {
4074 hcm.ForceStance(DayZPlayerConstants.STANCEIDX_PRONE);
4075 }
4076 }
4077 }
4078 }
4079
4080 m_JumpClimb.CheckAndFinishJump();
4081 }
4082
4083 //Used to inflict shock when player is walking (only inflicted on Update timer)
4085 {
4086 //No need to pursue here if player is prone as the following logic is not applied
4087 if (m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_PRONE && m_MovementState.m_iStanceIdx != DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
4088 {
4089 float avgLegHealth = GetHealth("RightLeg","") + GetHealth("LeftLeg","") + GetHealth("RightFoot","") + GetHealth("LeftFoot","");
4090 avgLegHealth *= 0.25; //divide by 4 to make the average leg health;
4091
4092 if (IsSwimming())
4093 {
4094 //swimming other than forward is not detectable in script other than through velocity check
4095 vector v;
4096 PhysicsGetVelocity(v);
4097
4098 if (v.LengthSq() > 0)
4099 {
4101 }
4102 }
4103 else if (m_MovementState.m_iMovement != 0)
4104 {
4105 if (IsClimbingLadder())
4106 {
4108 }
4109 else if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_ERECT || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDERECT)
4110 {
4111 if (m_MovementState.m_iMovement > 1)//only jog and faster
4112 {
4114 }
4115 }
4116 else if (m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_CROUCH || m_MovementState.m_iStanceIdx == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
4117 {
4118 //any speed other than idle
4120 }
4121 }
4122 else
4123 {
4124 //Here apply shock if player is standing or crouched and STANDING STILL
4126 }
4127
4128 m_ShockHandler.CheckValue(true);
4129 }
4130 }
4131
4132 //Always use the same thresholds but allow passing of different shock values
4133 void MovingShock(float legHealth, float highShock, float midShock, float lowShock)
4134 {
4136 {
4137 //Inflict "high shock"
4138 m_ShockHandler.SetShock(highShock);
4139 }
4141 {
4142 //Inflict "low shock"
4143 m_ShockHandler.SetShock(lowShock);
4144 }
4145 else
4146 {
4147 //If neither high nore low, inflict "mid shock"
4148 m_ShockHandler.SetShock(midShock);
4149 }
4150 }
4151
4152 void DealShock(float dmg)
4153 {
4154 Param1<float> damage = new Param1<float>(0);
4155 damage.param1 = dmg;
4156 g_Game.RPCSingleParam(this, ERPCs.RPC_SHOCK, damage, true, GetIdentity());
4157 }
4158
4159 //Prevent player from picking up heavy items when legs are broken
4160 override bool CanPickupHeavyItem(notnull EntityAI item)
4161 {
4162 if (item.IsHeavyBehaviour() && (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS || GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS_SPLINT))
4163 return false;
4164
4165 return super.CanPickupHeavyItem(item);
4166 }
4167
4168 //Set all leg zones' health to 0 in order to limit emergent behaviour and prevent confusion as to how broken legs really work
4170 {
4171 SetHealth("RightLeg", "", 0);
4172 SetHealth("RightFoot", "", 0);
4173 SetHealth("LeftLeg", "", 0);
4174 SetHealth("LeftFoot", "", 0);
4175 }
4176
4178 {
4179 ItemBase itemInHands = GetItemInHands();
4180 if (itemInHands && itemInHands.IsHeavyBehaviour())
4181 DropItem(itemInHands);
4182 }
4183
4185 {
4186 EntityAI attachment;
4187 Class.CastTo(attachment, GetItemOnSlot("Splint_Right"));
4188 if (attachment && attachment.GetType() == "Splint_Applied")
4189 {
4190 return true;
4191 }
4192 return false;
4193 }
4194
4195 // -----------------------
4196
4197
4198#ifdef ROBOCLIENT
4199 private void RequestRespawnBot()
4200 {
4201 bool respawn = false;
4202 int respawnTime = -1;
4203 m_Bot.GetRespawnData(respawn, respawnTime);
4204 if(respawn)
4205 {
4206 if (m_Bot)
4207 m_Bot.Stop();
4208 g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).CallLaterByName(g_Game, "RespawnPlayer", respawnTime * 1000);
4209 }
4210 }
4211#endif
4212
4213
4214 // -----------------------
4215
4216
4217 override void OnCommandSwimStart()
4218 {
4219 ItemBase itemInHands = GetItemInHands();
4220 if (itemInHands)
4221 {
4222 if (itemInHands.IsHeavyBehaviour())
4223 {
4224 TryHideItemInHands(false);
4225 #ifdef SERVER
4226 ServerDropEntity(itemInHands); // Let server handle the hand item drop
4227 #endif
4228 }
4229 else
4230 {
4231 TryHideItemInHands(true);
4232 }
4233 itemInHands.OnItemInHandsPlayerSwimStart(this);
4234 }
4235 m_AnimCommandStarting = HumanMoveCommandID.CommandSwim;
4236
4237 GameInventory inventory = GetInventory();
4238 if (inventory)
4239 inventory.LockInventory(LOCK_FROM_SCRIPT);
4240
4242 GetDayZGame().GetBacklit().OnSwimmingStart();
4243
4245 GetWeaponManager().DelayedRefreshAnimationState(10);
4247
4248 g_Game.GetMission().AddActiveInputExcludes({"swimming"});
4249 }
4250
4251 override void OnCommandSwimFinish()
4252 {
4253 TryHideItemInHands(false, true);
4254
4255 GameInventory inventory = GetInventory();
4256 if (inventory)
4257 inventory.UnlockInventory(LOCK_FROM_SCRIPT);
4258
4259 GetDayZGame().GetBacklit().OnSwimmingStop();
4260
4261 GetWeaponManager().RefreshAnimationState();
4262
4263 g_Game.GetMission().RemoveActiveInputExcludes({"swimming"});
4264 }
4265
4266 override void OnCommandLadderStart()
4267 {
4268 m_AnimCommandStarting = HumanMoveCommandID.CommandLadder;
4269 TryHideItemInHands(true);
4270
4271 GameInventory inventory = GetInventory();
4272 if (inventory)
4273 inventory.LockInventory(LOCK_FROM_SCRIPT);
4274
4276
4277 g_Game.GetMission().AddActiveInputExcludes({"ladderclimbing"});
4278 }
4279
4281 {
4282 TryHideItemInHands(false, true);
4283
4284 GameInventory inventory = GetInventory();
4285 if (inventory)
4286 inventory.UnlockInventory(LOCK_FROM_SCRIPT);
4287
4288 g_Game.GetMission().RemoveActiveInputExcludes({"ladderclimbing"});
4289 }
4290
4291 override void OnCommandFallStart()
4292 {
4293 m_AnimCommandStarting = HumanMoveCommandID.CommandFall;
4294
4295 GameInventory inventory = GetInventory();
4296 if (inventory)
4297 inventory.LockInventory(LOCK_FROM_SCRIPT);
4298
4300
4302 GetWeaponManager().DelayedRefreshAnimationState(10);
4304 }
4305
4306 override void OnCommandFallFinish()
4307 {
4308 GameInventory inventory = GetInventory();
4309 if (inventory)
4310 inventory.UnlockInventory(LOCK_FROM_SCRIPT);
4311
4312 // properly finish jump in case it was interrupted by smth (heavy hit for example in the FOV expoit)
4313 m_JumpClimb.CheckAndFinishJump();
4314
4315 GetWeaponManager().RefreshAnimationState();
4316 }
4317
4318 override void OnCommandClimbStart()
4319 {
4320 m_AnimCommandStarting = HumanMoveCommandID.CommandClimb;
4321
4322 GameInventory inventory = GetInventory();
4323 if (inventory)
4324 inventory.LockInventory(LOCK_FROM_SCRIPT);
4325
4327
4329 GetWeaponManager().DelayedRefreshAnimationState(10);
4331 }
4332
4333 override void OnCommandClimbFinish()
4334 {
4335 GameInventory inventory = GetInventory();
4336 if (inventory)
4337 inventory.UnlockInventory(LOCK_FROM_SCRIPT);
4338
4339 GetWeaponManager().RefreshAnimationState();
4340 }
4341
4343 {
4344 m_AnimCommandStarting = HumanMoveCommandID.CommandVehicle;
4345
4346 if (m_EmoteManager && (m_IsSurrendered || m_EmoteManager.IsEmotePlaying()))
4347 {
4348 m_EmoteManager.ClearSurrenderState();
4349
4350 #ifdef SERVER
4351 m_EmoteManager.ServerRequestEmoteCancel();
4352 #endif
4353 }
4354
4355 GameInventory inventory = GetInventory();
4356 if (inventory)
4357 inventory.LockInventory(LOCK_FROM_SCRIPT);
4358
4360
4361 ItemBase itemInHand = GetItemInHands();
4362 EntityAI itemOnHead = FindAttachmentBySlotName("Headgear");
4363
4364 if (itemInHand && itemInHand.GetCompEM())
4365 itemInHand.GetCompEM().SwitchOff();
4366
4367 TryHideItemInHands(true);
4368
4369 if (itemOnHead && itemOnHead.GetCompEM())
4370 itemOnHead.GetCompEM().SwitchOff();
4371
4372 g_Game.GetMission().AddActiveInputExcludes({"vehicledriving"});
4373 }
4374
4376 {
4377 GameInventory inventory = GetInventory();
4378 if (inventory)
4379 inventory.UnlockInventory(LOCK_FROM_SCRIPT);
4380
4381 if (!m_ShouldBeUnconscious)
4382 TryHideItemInHands(false, true);
4383
4385
4386 g_Game.GetMission().RemoveActiveInputExcludes({"vehicledriving"});
4387 }
4388
4389 override void OnCommandMelee2Start()
4390 {
4391 m_AnimCommandStarting = HumanMoveCommandID.CommandMelee2;
4392 m_IsFighting = true;
4393
4395 GetWeaponManager().DelayedRefreshAnimationState(10);
4397 }
4398
4400 {
4402
4403 GetWeaponManager().RefreshAnimationState();
4404
4405 }
4406
4407 override void OnCommandDeathStart()
4408 {
4409 m_AnimCommandStarting = HumanMoveCommandID.CommandDeath;
4410
4412 GetWeaponManager().DelayedRefreshAnimationState(10);
4414
4415 super.OnCommandDeathStart();
4416
4417#ifdef ROBOCLIENT
4418 RequestRespawnBot();
4419#endif
4420 }
4421
4422 override void OnJumpStart()
4423 {
4424 m_ActionManager.OnJumpStart();
4425
4427 GetWeaponManager().DelayedRefreshAnimationState(10);
4429 CloseMapEx(true);
4430 }
4431
4432 override void OnJumpEnd(int pLandType = 0)
4433 {
4435 {
4436 switch (pLandType)
4437 {
4438 case HumanCommandFall.LANDTYPE_NONE:
4439 case HumanCommandFall.LANDTYPE_LIGHT:
4440 m_PresenceNotifier.ProcessEvent(EPresenceNotifierNoiseEventType.LAND_LIGHT);
4441 break;
4442 case HumanCommandFall.LANDTYPE_MEDIUM:
4443 case HumanCommandFall.LANDTYPE_HEAVY:
4444 m_PresenceNotifier.ProcessEvent(EPresenceNotifierNoiseEventType.LAND_HEAVY);
4445 break;
4446 }
4447 }
4448
4449 GetWeaponManager().RefreshAnimationState();
4450 }
4451
4452 bool IsStance(int stance, int stanceMask)
4453 {
4454 return ((1 << stance) & stanceMask) != 0;
4455 }
4456
4457 override void OnStanceChange(int previousStance, int newStance)
4458 {
4459 int prone = DayZPlayerConstants.STANCEMASK_PRONE | DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
4460 int notProne = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_RAISEDERECT | DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
4461
4462 if (IsStance(previousStance, DayZPlayerConstants.STANCEMASK_PRONE) && IsStance(newStance, DayZPlayerConstants.STANCEMASK_ERECT))
4463 m_SprintedTimePerStanceMin = PlayerConstants.FULL_SPRINT_DELAY_FROM_PRONE;
4464
4465 if (IsStance(previousStance, DayZPlayerConstants.STANCEMASK_PRONE) && IsStance(previousStance, DayZPlayerConstants.STANCEMASK_CROUCH) || (IsStance(previousStance, DayZPlayerConstants.STANCEMASK_CROUCH) && IsStance(newStance, DayZPlayerConstants.STANCEMASK_ERECT)))
4466 m_SprintedTimePerStanceMin = PlayerConstants.FULL_SPRINT_DELAY_FROM_CROUCH;
4467
4468 if ((IsStance(previousStance, prone) && IsStance(newStance, notProne)) || (IsStance(previousStance, notProne) && IsStance(newStance, prone)))
4469 {
4471 GetWeaponManager().RefreshAnimationState();
4472 }
4473 }
4474
4475 override bool CanChangeStance(int previousStance, int newStance)
4476 {
4477 // Check if the player is trying to perform restricted action while changing stance
4479 return false;
4480
4481 // Allow stance changes in plain throwing mode, but not once the actual throw wind-up / release animation has started
4482 if (GetThrowing().IsThrowingInProgress() || GetThrowing().IsThrowingAnimationPlaying())
4483 return false;
4484
4485 // don't allow base stance change, only raised hands change
4486 if (IsRolling())
4487 {
4488 if (Math.AbsInt(previousStance - newStance) == 3)
4489 return true;
4490
4491 return false;
4492 }
4493
4494 // Check if the player tries to drop or throw an item in hands while changing stance
4495 UAInterface inputInterface = GetInputInterface();
4496 if (inputInterface.SyncedValue_ID(UAThrowitem) > 0 || inputInterface.SyncedValue_ID(UADropitem) > 0)
4497 return false;
4498
4499 // Check if the player is going to crouch or raised crouch
4500 if (newStance == DayZPlayerConstants.STANCEIDX_CROUCH || newStance == DayZPlayerConstants.STANCEIDX_RAISEDCROUCH)
4501 {
4502 return GetCurrentWaterLevel() <= GetDayZPlayerType().CommandSwimSettingsW().m_fToErectLevel;
4503 }
4504
4505 // Check if the player is going to prone
4506 if (newStance == DayZPlayerConstants.STANCEIDX_PRONE || newStance == DayZPlayerConstants.STANCEIDX_RAISEDPRONE)
4507 {
4508 return GetCurrentWaterLevel() <= GetDayZPlayerType().CommandSwimSettingsW().m_fToCrouchLevel;
4509 }
4510
4511 // The player can change stance if none of the conditions above are met
4512 return true;
4513 }
4514
4515
4516 override void OnCommandMoveStart()
4517 {
4518 if (g_Game.IsServer())
4519 {
4520 //In case player changes stance through a different command, we refresh the anim overrides
4521 int prone = DayZPlayerConstants.STANCEMASK_PRONE | DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
4522 if (!IsPlayerInStance(prone))
4523 {
4524 m_InjuryHandler.m_ForceInjuryAnimMask = m_InjuryHandler.m_ForceInjuryAnimMask & ~eInjuryOverrides.PRONE_ANIM_OVERRIDE;
4526 }
4527 }
4528 }
4529
4530 override bool CanRoll()
4531 {
4533 return false;
4534
4535 if (IsInFBEmoteState() || m_EmoteManager.m_MenuEmote)
4536 {
4537 return false;
4538 }
4539
4540 return IsPlayerInStance(DayZPlayerConstants.STANCEMASK_PRONE | DayZPlayerConstants.STANCEMASK_RAISEDPRONE) && GetCommand_Move() && !GetCommand_Move().IsOnBack();
4541 }
4542
4543 override void OnRollStart(bool isToTheRight)
4544 {
4546
4547 if (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
4549 }
4550
4551 override void OnRollFinish()
4552 {
4553 }
4554
4555 void OnJumpOutVehicleFinish(float carSpeed);
4556
4557 void OnVehicleSwitchSeat(int seatIndex)
4558 {
4559 }
4560
4562 {
4563 m_IsVehicleSeatDriver = true;
4564 if (m_Hud)
4565 m_Hud.ShowVehicleInfo();
4566
4567#ifdef FEATURE_NETWORK_RECONCILIATION
4568 PlayerIdentity identity = GetIdentity();
4569 if (identity)
4570 {
4571 Pawn pawn = Pawn.Cast(GetParent());
4572
4574 identity.Possess(pawn);
4575 }
4576#endif
4577 }
4578
4580 {
4581#ifdef FEATURE_NETWORK_RECONCILIATION
4582 PlayerIdentity identity = GetIdentity();
4583
4584 if (identity)
4585 {
4587 identity.Possess(this);
4588 }
4589#endif
4590
4591 m_IsVehicleSeatDriver = false;
4592 if (m_Hud)
4593 m_Hud.HideVehicleInfo();
4594 }
4595
4596 override void OnThrowingModeChange(bool change_to_enabled)
4597 {
4598 if (change_to_enabled)
4599 {
4602 }
4603 }
4604
4605 override void EOnFrame(IEntity other, float timeSlice)
4606 {
4607 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
4608 {
4609 #ifndef NO_GUI
4610 if (IsControlledPlayer() && m_EffectWidgets && m_EffectWidgets.IsAnyEffectRunning())
4611 {
4612 m_EffectWidgets.Update(timeSlice);
4613 }
4614 #endif
4615
4617 m_UndergroundHandler.Tick(timeSlice);
4618
4620 m_UndergroundBunkerHandler.Tick(timeSlice);
4621 }
4622
4623 if (m_InEffectAreaType != 0 && g_Game.IsServer())
4624 OnUpdateEffectAreaServer(timeSlice);
4625 }
4626
4627 override void EOnPostFrame(IEntity other, int extra)
4628 {
4629 int currentTime = g_Game.GetTime();
4630 float delta_time = (currentTime - m_LastPostFrameTickTime) / 1000;
4631 m_LastPostFrameTickTime = currentTime;
4632 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
4633 {
4635 {
4636 if (IsAlive())
4637 GetDamageDealtEffect().Update(delta_time);
4638 else
4639 delete GetDamageDealtEffect();
4640 }
4641
4642 if (m_EffectRadial)
4643 {
4644 if (IsAlive())
4645 {
4646 m_EffectRadial.Update(delta_time);
4647 }
4648 else
4649 m_EffectRadial = null;
4650 }
4651
4652
4653 if (GetFlashbangEffect())
4654 {
4655 if (IsAlive())
4656 {
4657 GetFlashbangEffect().Update(delta_time);
4658 }
4659 else
4660 {
4661 GetFlashbangEffect().Stop();
4662 delete GetFlashbangEffect();
4663 }
4664 }
4665
4666 if (GetShockEffect())
4667 {
4668 if (IsAlive())
4669 GetShockEffect().Update(delta_time);
4670 else
4671 delete GetShockEffect();
4672 }
4673
4674 m_InventoryActionHandler.OnUpdate();
4675 }
4676
4677 #ifdef DIAG_DEVELOPER
4678 DiagOnPostFrame(other, extra);
4679 #endif
4680 }
4681
4682#ifdef DIAG_DEVELOPER
4683 protected void DiagOnPostFrame(IEntity other, int extra)
4684 {
4685 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
4686 {
4687 if (m_WeaponDebug)
4688 {
4689 m_WeaponDebug.OnPostFrameUpdate();
4690 }
4691
4692 if (GetBleedingManagerRemote())
4693 {
4694 GetBleedingManagerRemote().OnUpdate();
4695 }
4696
4697 if (m_MeleeCombat)
4698 {
4699 if (DiagMenu.GetBool(DiagMenuIDs.MELEE_DEBUG))
4700 {
4701 m_MeleeDebug = true;
4702 m_MeleeCombat.Debug(GetItemInHands(), m_MeleeCombat.GetHitType());
4703 }
4704 else if (!DiagMenu.GetBool(DiagMenuIDs.MELEE_DEBUG) && m_MeleeDebug)
4705 {
4706 m_MeleeDebug = false;
4707 m_MeleeCombat.Debug(GetItemInHands(), m_MeleeCombat.GetHitType());
4708 }
4709 }
4710
4711 if (DiagMenu.GetBool(DiagMenuIDs.SOUNDS_ITEM_IMPACT_SOUNDS))
4712 InventoryItem.DrawImpacts();
4713
4714 if (GetPluginManager())
4715 {
4716 PluginDrawCheckerboard drawCheckerboard = PluginDrawCheckerboard.Cast(GetPluginManager().GetPluginByType(PluginDrawCheckerboard));
4717 if (drawCheckerboard && !drawCheckerboard.IsActive())
4718 {
4719 drawCheckerboard.ShowWidgets(DiagMenu.GetBool(DiagMenuIDs.MISC_DRAW_CHECKERBOARD));
4720 }
4721 }
4722
4723 if (m_PresenceNotifier)
4724 {
4725 m_PresenceNotifier.EnableDebug(DiagMenu.GetBool(DiagMenuIDs.MISC_PRESENCE_NOTIFIER_DBG));
4726 }
4727
4728 if (m_TargetTemperatureDiag)
4729 {
4730 m_TargetTemperatureDiag.ShowDebug(DiagMenu.GetBool(DiagMenuIDs.MISC_TARGET_TEMPERATURE));
4731 }
4732
4733 if (DiagMenu.GetBool(DiagMenuIDs.TRIGGER_PLAYER_DEBUG))
4734 {
4735 vector minmax[2];
4736 GetCollisionBox(minmax);
4737
4738 int color = COLOR_RED_A;
4739 if (m_IsInsideTrigger)
4740 color = COLOR_GREEN_A;
4741
4742 Shape dbgShape = Debug.DrawBoxEx(minmax[0], minmax[1], color, ShapeFlags.TRANSP|ShapeFlags.NOZWRITE|ShapeFlags.ONCE);
4743
4744 vector mat[4];
4745 GetTransform(mat);
4746 dbgShape.CreateMatrix(mat);
4747 dbgShape.SetMatrix(mat);
4748 }
4749 }
4750
4751 if (m_Environment && m_Environment.m_Debug)
4752 {
4753 #ifdef SERVER
4754 EnvDebugData envDebugData = m_Environment.GetEnvDebugData();
4755 g_Game.RPCSingleParam(this, ERPCs.DIAG_MISC_ENVIRONMENT_DEBUG_DATA, envDebugData, false, GetIdentity());
4756 #else
4757 m_Environment.ShowEnvDebugPlayerInfo(DiagMenu.GetBool(DiagMenuIDs.MISC_ENVIRONMENT_DEBUG));
4758 #endif
4759 }
4760
4761 if (m_FallDamage && m_FallDamage.m_Debug)
4762 {
4763 #ifdef SERVER
4764 FallDamageDebugData fallDamageDebugData = m_FallDamage.GetFallDamageDebugData();
4765 g_Game.RPCSingleParam(this, ERPCs.DIAG_MISC_FALLDAMAGE_DEBUG_DATA, fallDamageDebugData, false, GetIdentity());
4766 #else
4767 m_FallDamage.ShowFallDamageDebugInfo(DiagMenu.GetBool(DiagMenuIDs.MISC_FALLDAMAGE_DEBUG));
4768 #endif
4769 }
4770 }
4771
4772 override void OnEnterTrigger(ScriptedEntity trigger)
4773 {
4774 super.OnEnterTrigger(trigger);
4775
4776 ++m_IsInsideTrigger;
4777 }
4778
4779 override void OnLeaveTrigger(ScriptedEntity trigger)
4780 {
4781 super.OnLeaveTrigger(trigger);
4782
4783 --m_IsInsideTrigger;
4784 }
4785#endif
4786
4787 void StaminaHUDNotifier(bool show)
4788 {
4789 if (m_Hud)
4790 m_Hud.SetStaminaBarVisibility(show);
4791 }
4792
4793 override void DepleteStaminaEx(EStaminaModifiers modifier, float dT = -1, float coef = 1.0)
4794 {
4795 if (GetStaminaHandler())
4796 GetStaminaHandler().DepleteStaminaEx(modifier,dT,coef);
4797 }
4798
4799 override bool CanConsumeStamina(EStaminaConsumers consumer)
4800 {
4801 if (!GetStaminaHandler())
4802 return false;
4803
4804 bool val = (GetStaminaHandler().HasEnoughStaminaFor(consumer) && !IsRestrained() && !IsInFBEmoteState());
4805
4806 if (!val)
4807 StaminaHUDNotifier(false);
4808
4809 return val;
4810 }
4811
4813 {
4814 if (!GetStaminaHandler())
4815 return false;
4816
4817 bool val = (GetStaminaHandler().HasEnoughStaminaToStart(consumer) && !IsRestrained() && !IsInFBEmoteState());
4818
4819 if (!val)
4820 StaminaHUDNotifier(false);
4821
4822 return val;
4823 }
4824
4825 override bool CanClimb(int climbType, SHumanCommandClimbResult climbRes)
4826 {
4827 if (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
4828 return false;
4829
4830 if (climbType == 1 && !CanConsumeStamina(EStaminaConsumers.VAULT))
4831 return false;
4832
4834 if (IsSwimming())
4835 return true;
4836
4837 if (climbType == 2 && (!CanConsumeStamina(EStaminaConsumers.CLIMB) || GetBrokenLegs() != eBrokenLegs.NO_BROKEN_LEGS))
4838 return false;
4839
4840 if (climbType > 0 && m_InjuryHandler && m_InjuryHandler.GetInjuryAnimValue() >= InjuryAnimValues.LVL3)
4841 return false;
4842
4843 return super.CanClimb(climbType,climbRes);
4844 }
4845
4846 override bool CanJump()
4847 {
4848 if (GetBrokenLegs() != eBrokenLegs.NO_BROKEN_LEGS)
4849 {
4850 return false;
4851 }
4852
4854 return false;
4855
4857 if (m_InjuryHandler && m_InjuryHandler.GetInjuryAnimValue() >= InjuryAnimValues.LVL3)
4858 return false;
4859
4860 if (IsInFBEmoteState() || m_EmoteManager.m_MenuEmote)
4861 {
4862 return false;
4863 }
4864
4865 return super.CanJump();
4866 }
4867
4869 {
4870 return m_JumpClimb.m_bIsJumpInProgress;
4871 }
4872
4874 {
4875 array<vector> temp = new array<vector>;
4876 temp = g_Game.GetMission().GetActiveRefresherLocations();
4877 int count = temp.Count();
4878 if (count > 0)
4879 {
4880 vector pos = target.GetPosition();
4881 for (int i = 0; i < count; i++)
4882 {
4883 if (vector.Distance(pos,temp.Get(i)) < GameConstants.REFRESHER_RADIUS)
4884 return true;
4885 }
4886
4887 return false;
4888 }
4889 else
4890 {
4891 return false;
4892 }
4893 }
4894
4896 {
4897 if ((g_Game.IsMultiplayer() && g_Game.IsServer()))
4898 {
4900 if (m_RefreshAnimStateIdx > 3)
4902 SetSynchDirty();
4903 }
4904 }
4905
4906 void RefreshHandAnimationState(int delay = 0)
4907 {
4908 if (delay == 0)
4909 {
4910 GetItemAccessor().OnItemInHandsChanged(true);
4911 GetItemAccessor().ResetWeaponInHands();
4912 }
4913 else
4914 {
4915 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(RefreshHandAnimationState,delay,false,0);
4916 }
4917 }
4918
4919 // -------------------------------------------------------------------------
4920 // USER ACTIONS
4921 // -------------------------------------------------------------------------
4922
4924 {
4925 vector pdir = GetDirection();
4926 vector ptv = target.GetPosition() - GetPosition();
4927 pdir.Normalize();
4928 ptv.Normalize();
4929
4930 if (Math.AbsFloat(pdir[0]-ptv[0]) < 0.5 && Math.AbsFloat(pdir[2]-ptv[2]) < 0.5)
4931 {
4932 return true;
4933 }
4934 return false;
4935 }
4936
4937 //---------------------------------------------------------
4938 void OnQuickBarSingleUse(int slotClicked)
4939 {
4940 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
4941 return;
4942
4943 if (m_AreHandsLocked)
4944 return; //Player is in the short window of time after interrupting placement of an item and before getting it back in hands
4945
4946 GameInventory inventory = GetInventory();
4947 if (inventory.IsInventoryLocked() || IsEmotePlaying())
4948 return;
4949
4950 if (GetThrowing().IsThrowingModeEnabled() || GetThrowing().IsThrowingAnimationPlaying())
4951 return;
4952
4953 if (IsRaised() || GetCommand_Melee() || IsSwimming() || IsClimbingLadder() || IsClimbing() || IsRestrained() || IsRestrainPrelocked())
4954 return;
4955
4956 if (GetDayZPlayerInventory().IsProcessing() || IsItemsToDelete())
4957 return;
4958
4959 if (GetActionManager().GetRunningAction() != null)
4960 return;
4961
4963 return;
4964
4966 return;
4967
4968 //TODO MW change locking method
4969 //if (GetDayZPlayerInventory().HasLockedHands())
4970 // return;
4971
4972 EntityAI quickBarEntity = GetQuickBarEntity(slotClicked - 1);//GetEntityInQuickBar(slotClicked - 1);
4973
4974 if (!quickBarEntity)
4975 return;
4976
4977 Magazine mag;
4978 Weapon_Base wpn;
4979
4980 if (Class.CastTo(mag, quickBarEntity) && Class.CastTo(wpn, mag.GetHierarchyParent()))
4981 return;
4982
4983 EntityAI inHandEntity = GetEntityInHands();
4984
4985 if (!GetDayZPlayerInventory().IsIdle())
4986 return; // player is already performing some animation
4987
4988 InventoryLocation handInventoryLocation = new InventoryLocation;
4989 handInventoryLocation.SetHands(this,quickBarEntity);
4990 if (inventory.HasInventoryReservation(quickBarEntity, handInventoryLocation))
4991 return;
4992
4993 if (inHandEntity == quickBarEntity)
4994 {
4995 if (GetHumanInventory().CanRemoveEntityInHands())
4996 {
4997 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[QB] Stash - PredictiveMoveItemFromHandsToInventory HND=" + Object.GetDebugName(inHandEntity));
4998 PredictiveMoveItemFromHandsToInventory();
4999 }
5000 }
5001 else
5002 {
5003 InventoryLocation invLocQBItem = new InventoryLocation;
5004 quickBarEntity.GetInventory().GetCurrentInventoryLocation(invLocQBItem);
5005 if (inventory.HasInventoryReservation(quickBarEntity,invLocQBItem))
5006 return;
5007
5008 if (inHandEntity)
5009 {
5010 InventoryLocation inHandEntityFSwapDst = new InventoryLocation;
5011
5012 int index = GetHumanInventory().FindUserReservedLocationIndex(inHandEntity);
5013 if (index >= 0)
5014 GetHumanInventory().GetUserReservedLocation(index, inHandEntityFSwapDst);
5015
5016
5017 if (index < 0 && GameInventory.CanSwapEntitiesEx(quickBarEntity, inHandEntity))
5018 {
5019 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[QB] PredictiveSwapEntities QB=" + Object.GetDebugName(quickBarEntity) + " HND=" + Object.GetDebugName(inHandEntity));
5020 PredictiveSwapEntities(quickBarEntity, inHandEntity);
5021 }
5022 else if (GameInventory.CanForceSwapEntitiesEx(quickBarEntity, handInventoryLocation, inHandEntity, inHandEntityFSwapDst))
5023 {
5024 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[QB] Swap - PredictiveForceSwapEntities HND=" + Object.GetDebugName(inHandEntity) + " QB=" + Object.GetDebugName(quickBarEntity) + " fswap_dst=" + InventoryLocation.DumpToStringNullSafe(inHandEntityFSwapDst));
5025 PredictiveForceSwapEntities(quickBarEntity, inHandEntity, inHandEntityFSwapDst);
5026 }
5027 }
5028 else
5029 {
5030 if (inventory.HasInventoryReservation(quickBarEntity,handInventoryLocation))
5031 return;
5032
5033 if (inventory.CanAddEntityIntoHands(quickBarEntity))
5034 {
5035 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[QB] Stash - PredictiveTakeEntityToHands QB=" + Object.GetDebugName(quickBarEntity));
5036 PredictiveTakeEntityToHands(quickBarEntity);
5037 }
5038 }
5039 }
5040 }
5041 //---------------------------------------------------------
5042 void OnQuickBarContinuousUseStart(int slotClicked)
5043 {
5044 if (GetInventory().IsInventoryLocked())
5045 return;
5046
5047 if (IsSwimming() || IsClimbingLadder() || GetCommand_Melee() || IsClimbing() || IsRestrained() || IsRestrainPrelocked())
5048 return;
5049
5050 ItemBase quickBarItem = ItemBase.Cast(GetQuickBarEntity(slotClicked - 1));
5051
5052 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
5053 {
5054 ItemBase itemInHands = GetItemInHands();
5055
5056 if (itemInHands != quickBarItem)
5057 {
5059
5060 if (amc.CanPerformActionFromQuickbar(itemInHands, quickBarItem))
5061 {
5062 amc.PerformActionFromQuickbar(itemInHands, quickBarItem);
5063 }
5064 else
5065 {
5066 if (IsRaised() || GetCommand_Melee())
5067 return;
5068
5069 amc.ForceTarget(quickBarItem);
5070 m_QuickBarFT = true;
5071 }
5072 }
5073 }
5074 m_QuickBarHold = true;
5075 }
5076 //---------------------------------------------------------
5077 void OnQuickBarContinuousUseEnd(int slotClicked)
5078 {
5079 if (m_QuickBarHold)
5080 {
5081 if ( GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
5082 {
5084
5086 {
5087 ActionBase action = am.GetRunningAction();
5088 if (action)
5089 {
5090 if (!action.GetInput().IsActive())
5091 {
5092 am.EndActionInput();
5093 }
5094
5095 }
5096 }
5097
5098 if (m_QuickBarFT)
5099 {
5100 am.ClearForceTarget();
5101 m_QuickBarFT = false;
5102 }
5103 }
5104 }
5105 m_QuickBarHold = false;
5106 }
5108 {
5109 m_ActionQBControl = !action.GetInput().IsActive();
5110 }
5111
5113 {
5114 return m_ActionQBControl;
5115 }
5117 {
5118 m_ActionQBControl = false;
5119 }
5120
5121 //---------------------------------------------------------
5122 // RADIAL QUICKBAR AND RELOAD ACTIONS
5123 //---------------------------------------------------------
5124 //the same functionality as normal quick bar slot key press
5125 void RadialQuickBarSingleUse(int slotClicked)
5126 {
5127 OnQuickBarSingleUse(slotClicked);
5128 }
5129
5130 //removed the need for holding down quick bar slot key
5131 void RadialQuickBarCombine(int slotClicked)
5132 {
5133 EntityAI quickBarEntity = GetQuickBarEntity(slotClicked - 1);
5134 EntityAI entity_in_hands = GetEntityInHands();
5135
5136 ReloadWeapon(entity_in_hands, quickBarEntity);
5137 }
5138
5139 //removed the need for holding down quick bar slot key
5141 {
5142 EntityAI magazine = GetMagazineToReload(weapon);
5143 ReloadWeapon(weapon, magazine);
5144 }
5145
5146 //Reload weapon with given magazine
5147 void ReloadWeapon(EntityAI weapon, EntityAI magazine)
5148 {
5149 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
5150 {
5151 ActionManagerClient mngr_client;
5152 CastTo(mngr_client, GetActionManager());
5153
5154 if (mngr_client && FirearmActionLoadMultiBulletRadial.Cast(mngr_client.GetRunningAction()))
5155 {
5156 mngr_client.Interrupt();
5157 }
5158 else if (GetEntityInHands()!= magazine)
5159 {
5160 Weapon_Base wpn;
5161 Magazine mag;
5162 Class.CastTo(wpn, weapon);
5163 Class.CastTo(mag, magazine);
5164 if (GetWeaponManager().CanUnjam(wpn))
5165 {
5166 GetWeaponManager().Unjam();
5167 }
5168 else if (GetWeaponManager().CanAttachMagazine(wpn, mag))
5169 {
5170 GetWeaponManager().AttachMagazine(mag);
5171 }
5172 else if (GetWeaponManager().CanSwapMagazine(wpn, mag))
5173 {
5174 GetWeaponManager().SwapMagazine(mag);
5175 }
5176 else if (GetWeaponManager().CanLoadBullet(wpn, mag))
5177 {
5178 //GetWeaponManager().LoadMultiBullet(mag);
5179
5180 ActionTarget atrg = new ActionTarget(mag, this, -1, vector.Zero, -1.0);
5181 if (mngr_client && !mngr_client.GetRunningAction() && mngr_client.GetAction(FirearmActionLoadMultiBulletRadial).Can(this, atrg, wpn))
5182 mngr_client.PerformActionStart(mngr_client.GetAction(FirearmActionLoadMultiBulletRadial), atrg, wpn);
5183 }
5184 }
5185 }
5186 }
5187
5188 //returns compatible magazine from player inventory with highest ammo count
5190 {
5191 Weapon_Base weapon_base = Weapon_Base.Cast(weapon);
5192 WeaponManager weapon_manager = GetWeaponManager();
5193 EntityAI magazine_to_reload;
5194
5195 EntityAI ammo_magazine; //magazine
5196 int last_ammo_magazine_count;
5197 int ammo_magazine_count;
5198
5199 EntityAI ammo_pile; //ammo pile
5200 int last_ammo_pile_count;
5201 int ammo_pile_count;
5202
5203 //Get all magazines in (player) inventory
5204 GameInventory inventory = GetInventory();
5205 int nAttachment = inventory.AttachmentCount();
5206 for (int att_i = 0; att_i < nAttachment; ++att_i)
5207 {
5208 EntityAI attachment = inventory.GetAttachmentFromIndex(att_i);
5209 ref CargoBase attachment_cargo = attachment.GetInventory().GetCargo();
5210
5211 if (attachment_cargo)
5212 {
5213 int nAttachmentCargoItem = attachment_cargo.GetItemCount();
5214 for (int cgo_i = 0; cgo_i < nAttachmentCargoItem; ++cgo_i)
5215 {
5216 EntityAI cargo_item = attachment_cargo.GetItem(cgo_i);
5217
5218 //check for proper magazine
5219 if (cargo_item.IsMagazine())
5220 {
5221 Magazine magazine = Magazine.Cast(cargo_item);
5222 ammo_pile_count = magazine.GetAmmoCount();
5223
5224 //magazines (get magazine with max ammo count)
5225 if (weapon_manager.CanAttachMagazine(weapon_base, magazine) || weapon_manager.CanSwapMagazine(weapon_base, magazine))
5226 {
5227 if (ammo_pile_count > 0)
5228 {
5229 if (last_ammo_magazine_count == 0)
5230 {
5231 ammo_magazine = magazine;
5232 last_ammo_magazine_count = ammo_pile_count;
5233 }
5234 else
5235 {
5236 if (last_ammo_magazine_count < ammo_pile_count)
5237 {
5238 ammo_magazine = magazine;
5239 last_ammo_magazine_count = ammo_pile_count;
5240 }
5241 }
5242 }
5243 }
5244 //bullets (get ammo pile with min ammo count)
5245 else if (weapon_manager.CanLoadBullet(weapon_base, magazine))
5246 {
5247 if (ammo_pile_count > 0)
5248 {
5249 if (last_ammo_pile_count == 0)
5250 {
5251 ammo_pile = magazine;
5252 last_ammo_pile_count = ammo_pile_count;
5253 }
5254 else
5255 {
5256 if (last_ammo_pile_count > ammo_pile_count)
5257 {
5258 ammo_pile = magazine;
5259 last_ammo_pile_count = ammo_pile_count;
5260 }
5261 }
5262 }
5263 }
5264 }
5265 }
5266 }
5267 }
5268
5269 //prioritize magazine
5270 if (ammo_magazine)
5271 {
5272 return ammo_magazine;
5273 }
5274
5275 return ammo_pile;
5276 }
5277 //---------------------------------------------------------
5278
5279
5280 //---------------------------------------------------------
5282 {
5283 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !g_Game.IsMultiplayer())
5284 {
5285 g_Game.GetMission().AddDummyPlayerToScheduler(this);
5287 }
5288
5289#ifdef ROBOCLIENT
5290 if (!m_Bot)
5291 {
5292 m_Bot = new Bot(this);
5293 m_Bot.Start();
5294 }
5295#endif
5296 }
5297
5298 //---------------------------------------------------------
5299 //Obsolete
5301 {
5302 return m_LiquidTendencyDrain;
5303 }
5304 //---------------------------------------------------------
5305 //Obsolete
5306 void SetLiquidTendencyDrain(bool state)
5307 {
5308 m_LiquidTendencyDrain = state;
5309 }
5310
5311 //---------------------------------------------------------
5314 {
5315 return m_FlagRaisingTendency;
5316 }
5317 //---------------------------------------------------------
5319 void SetFlagTendencyRaise(bool state)
5320 {
5321 m_FlagRaisingTendency = state;
5322 }
5323
5324 override SoundOnVehicle PlaySound(string sound_name, float range, bool create_local = false)
5325 {
5326 return BetaSound.SaySound(this, sound_name, range, false);
5327 }
5328
5330 {
5331 return GetWeightEx();
5332 }
5333
5335 {
5336 return GetWeightEx() >= OVERLOAD_LIMIT;
5337 }
5338
5340 {
5341 return GetInventory().HasEntityInInventory(entity);
5342 }
5343
5344 override bool NeedInventoryJunctureFromServer(notnull EntityAI item, EntityAI currParent, EntityAI newParent)
5345 {
5346 if (g_Game.IsMultiplayer())
5347 {
5349 switch (t)
5350 {
5351 case DayZPlayerInstanceType.INSTANCETYPE_AI_SINGLEPLAYER:
5352 return false;
5353 case DayZPlayerInstanceType.INSTANCETYPE_CLIENT:
5354 case DayZPlayerInstanceType.INSTANCETYPE_SERVER:
5355 case DayZPlayerInstanceType.INSTANCETYPE_AI_SERVER:
5356 case DayZPlayerInstanceType.INSTANCETYPE_AI_REMOTE:
5357 case DayZPlayerInstanceType.INSTANCETYPE_REMOTE:
5358 return true; // Might help mitigate "megabugged" (desync)
5359
5360 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[syncinv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " NeedInventoryJunctureFromServer item=" + Object.GetDebugName(item) + " currPar=" + currParent + " newPar=" + newParent);
5361
5362 bool i_owned = GetHumanInventory().HasEntityInInventory(item);
5363
5364 bool cp_owned = false;
5365 if (currParent)
5366 cp_owned = GetHumanInventory().HasEntityInInventory(currParent);
5367
5368 bool np_owned = false;
5369 if (newParent)
5370 np_owned = GetHumanInventory().HasEntityInInventory(newParent);
5371
5372 bool all_owned = i_owned && cp_owned && (np_owned || (newParent == null));
5373 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[syncinv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " NeedInventoryJunctureFromServer=" + !all_owned + " i_pwn=" + i_owned + " cp_pwn=" + cp_owned + " np_pwn=" + np_owned);
5374
5375 return !all_owned;
5376 default:
5377 Error("[syncinv] unsupported instance type t=" + t);
5378 break;
5379 }
5380 }
5381 return false;
5382 }
5383
5384
5385 override protected float GetWeightSpecialized(bool forceRecalc = false)
5386 {
5387 float totalWeight = super.GetWeightSpecialized(forceRecalc);
5388
5389 ItemBase itemHands = GetItemInHands();
5390 if (itemHands) // adds weight of item carried in hands
5391 {
5392 totalWeight += itemHands.GetWeightEx(forceRecalc);
5393 }
5394 #ifdef DEVELOPER
5395 if (WeightDebug.m_VerbosityFlags & WeightDebugType.RECALC_FORCED)
5396 {
5397 float itemInHandsWeight = totalWeight - super.GetWeightSpecialized(forceRecalc);
5398 WeightDebugData dta = WeightDebug.GetWeightDebug(this);
5399 dta.SetCalcDetails("TMan: " + (super.GetWeightSpecialized(forceRecalc)+ itemInHandsWeight) +"(contents weight[includes item in hands])");
5400 }
5401 #endif
5402 return totalWeight;
5403 }
5404
5406 {
5407 const int VISIBILITY_SLOTS_COUNT = 10;
5408
5409 int attcount = GetInventory().AttachmentCount();
5410 float sumVisibility = 0;
5411 float countVisibility = 0;
5412 float visibilityMean = 0;
5413
5414 if (attcount > 0)
5415 {
5416 for (int att = 0; att < attcount; att++)
5417 {
5418 EntityAI attachment = GetInventory().GetAttachmentFromIndex(att);
5419 if (attachment.IsClothing())
5420 {
5421 ClothingBase clothing;
5422 Class.CastTo(clothing, attachment);
5423 sumVisibility += clothing.GetItemVisibility();
5424 countVisibility++;
5425 }
5426 }
5427
5428 visibilityMean = (sumVisibility + (VISIBILITY_SLOTS_COUNT - countVisibility)) / VISIBILITY_SLOTS_COUNT;
5429 SetVisibilityCoef(visibilityMean);
5430 }
5431 else
5432 {
5433 visibilityMean = 1;
5434 SetVisibilityCoef(visibilityMean);
5435 }
5436 }
5437
5438 void SetVisibilityCoef(float pVisibility)
5439 {
5440 m_VisibilityCoef = pVisibility;
5441 }
5442
5444 {
5445 return m_VisibilityCoef;
5446 }
5447
5448
5450 {
5451 return m_Shakes;
5452 }
5453
5454
5460
5466
5472
5478
5484
5492
5493 //-------------------------------------
5500
5501
5503 {
5504 float health = GetHealth("","");
5505 float health_max = GetMaxHealth("","");
5507 }
5508
5510 {
5511 float toxicity = GetStatToxicity().Get();
5512 float toxicity_max = GetStatToxicity().GetMax();
5514 }
5515
5517 {
5518 float blood = GetHealth("","Blood");
5519 float blood_max = GetMaxHealth("","Blood");
5521 }
5522
5524 {
5525 float energy = GetStatEnergy().Get();
5526 float energy_max = GetStatEnergy().GetMax();
5528 }
5529
5531 {
5532 float water = GetStatWater().Get();
5533 float water_max = GetStatWater().GetMax();
5535 }
5536
5537 //------------------------------------
5538
5539 float GetStatLevelBorders(float stat_value, float critical, float low, float normal, float high, float max)
5540 {
5541 if (stat_value <= critical)
5542 {
5543 return Math.InverseLerp(0, critical, stat_value);
5544 }
5545 if (stat_value <= low)
5546 {
5547 return Math.InverseLerp(critical, low, stat_value);
5548 }
5549 if (stat_value <= normal)
5550 {
5551 return Math.InverseLerp(low, normal, stat_value);
5552 }
5553 if (stat_value <= high)
5554 {
5555 return Math.InverseLerp(normal, high, stat_value);
5556 }
5557 return Math.InverseLerp(high, max, stat_value);
5558 }
5559
5560 EStatLevels GetStatLevel(float stat_value, float critical, float low, float normal, float high)
5561 {
5562 if (stat_value <= critical)
5563 {
5564 return EStatLevels.CRITICAL;
5565 }
5566 if (stat_value <= low)
5567 {
5568 return EStatLevels.LOW;
5569 }
5570 if (stat_value <= normal)
5571 {
5572 return EStatLevels.MEDIUM;
5573 }
5574 if (stat_value <= high)
5575 {
5576 return EStatLevels.HIGH;
5577 }
5578 return EStatLevels.GREAT;
5579 }
5580
5581 void SetImmunityBoosted(bool boosted)
5582 {
5583 m_ImmunityBoosted = boosted;
5584 }
5585
5586
5587
5590 {
5591 float immunity;
5592 if (GetPlayerStats())
5593 {
5594 float max_health = GetMaxHealth("GlobalHealth", "Health") + 0.01;//addition to prevent divisioin by zero in case of some messup
5595 float max_blood = GetMaxHealth("GlobalHealth", "Blood") + 0.01;//addition to prevent divisioin by zero in case of some messup
5596 float energy_normalized = GetStatEnergy().Get() / PlayerConstants.SL_ENERGY_MAX;
5597 float water_normalized = GetStatWater().Get() / PlayerConstants.SL_WATER_MAX;
5598 float health_normalized = GetHealth("GlobalHealth", "Health") / max_health;
5599 float blood_normalized = GetHealth("GlobalHealth", "Blood") / max_blood;
5600 immunity = energy_normalized + water_normalized + health_normalized + blood_normalized;
5601 immunity = immunity / 4;//avg
5602 immunity = Math.Clamp(immunity,0,1);
5603 }
5604 return immunity;
5605 }
5606
5608 {
5609 return m_MovementState.m_iMovement == DayZPlayerConstants.MOVEMENT_SPRINT;
5610 }
5611
5613 {
5614 ItemBase item = GetItemInHands();
5615 if (IsRaised() || (item && item.IsHeavyBehaviour()))
5616 return false;
5617
5618 if(m_InjuryHandler.GetInjuryAnimValue() >= InjuryAnimValues.LVL3)
5619 return false;
5620
5621 if (item && GetThrowing() && GetThrowing().IsThrowingModeEnabled())
5622 return false;
5623
5624 if (GetBrokenLegs() != eBrokenLegs.NO_BROKEN_LEGS)
5625 return false;
5626
5627 return true;
5628 }
5629
5631 {
5632 return m_MovementState.IsInProne();
5633 }
5634
5636 {
5637 return m_MovementState.IsInRaisedProne();
5638 }
5639
5641 {
5642 return m_MovementState.IsLeaning();
5643 }
5644
5646 {
5647 return GetCommand_Move() && GetCommand_Move().IsInRoll();
5648 }
5649
5651 {
5652 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_CLIMB;
5653 }
5654
5656 {
5657 return m_MovementState.m_CommandTypeId == DayZPlayerConstants.COMMANDID_FALL;
5658 }
5659 override bool IsFighting()
5660 {
5661 return m_IsFighting;
5662 }
5663
5665 {
5666 return m_EmoteManager && m_EmoteManager.IsEmotePlaying();
5667 }
5668
5670 {
5671 return IsRuined();
5672 }
5673
5678 bool AnimCommandCheck(HumanMoveCommandID mask)
5679 {
5680 return m_AnimCommandStarting & mask;
5681 }
5682
5684 {
5685 if (!m_FightEndBlendTimer)
5686 m_FightEndBlendTimer = new Timer();
5687 if (!m_FightEndBlendTimer.IsRunning())
5688 {
5689 m_FightEndBlendTimer.Run(PlayerConstants.MELEE2_MOVEMENT_BLEND_DELAY,this,"EndFighting");
5690 }
5691 }
5692
5694 {
5695 m_IsFighting = false;
5696 }
5697
5699 {
5700 //on-hit drop of melee weapons
5701 //bayonets & buttstocks
5702 if (item && item.GetHierarchyParent() && item.GetHierarchyParent().IsWeapon() && item.IsRuined()/*&& item.FindAttachmentBySlotName()*/)
5703 {
5705 return DropItem(item);
5706 }
5707 //handheld items themselves
5708 if (item && item == GetItemInHands() && item.IsRuined())
5709 {
5710 return PredictiveDropEntity(item);
5711 }
5712 return false;
5713 }
5714
5716 {
5717 //TODO
5718 }
5719
5720 // -------------------------------------------------------------------------
5721 override void RPC(int rpc_type, array<ref Param> params, bool guaranteed, PlayerIdentity recipient = NULL)
5722 {
5723 super.RPC(rpc_type, params, guaranteed, recipient);
5724 }
5725
5726 // -------------------------------------------------------------------------
5727 override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
5728 {
5729 super.OnRPC(sender, rpc_type, ctx);
5730
5731 switch (rpc_type)
5732 {
5733 #ifndef SERVER
5734
5735 case ERPCs.RPC_PLAYER_STAT:
5736 if (GetPlayerStats())
5737 GetPlayerStats().OnRPC(ctx);
5738 break;
5739
5740 case ERPCs.RPC_SYNC_DISPLAY_STATUS:
5741 if (GetVirtualHud())
5742 {
5743 GetVirtualHud().OnRPC(ctx);
5744 }
5745 break;
5746
5747 case ERPCs.RPC_PLAYER_SYMPTOM_ON:
5748 if (GetSymptomManager())
5749 {
5750 GetSymptomManager().OnRPC(ERPCs.RPC_PLAYER_SYMPTOM_ON, ctx);
5751 }
5752 break;
5753
5754 case ERPCs.RPC_PLAYER_SYMPTOM_OFF:
5755 if (GetSymptomManager())
5756 {
5757 GetSymptomManager().OnRPC(ERPCs.RPC_PLAYER_SYMPTOM_OFF, ctx);
5758 }
5759 break;
5760
5761 case ERPCs.RPC_SYMPTOM_PARAM_SYNC:
5762 if (GetSymptomManager())
5763 {
5764 GetSymptomManager().OnRPC(ERPCs.RPC_SYMPTOM_PARAM_SYNC, ctx);
5765 }
5766 break;
5767
5768 case ERPCs.RPC_DAMAGE_VALUE_SYNC:
5769 if (m_TrasferValues)
5770 m_TrasferValues.OnRPC(ctx);
5771 break;
5772
5773 case ERPCs.RPC_USER_ACTION_MESSAGE:
5774 if (!GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
5775 {
5776 break;
5777 }
5778 if (ctx.Read(m_UAParamMessage))
5779 {
5780 string actiontext = m_UAParamMessage.param1;
5781 MessageAction(actiontext);
5782 }
5783 break;
5784
5785 case ERPCs.RPC_SOFT_SKILLS_SPECIALTY_SYNC:
5786 ref Param1<float> p_synch = new Param1<float>(0);
5787 ctx.Read(p_synch);
5788 float specialty_level = p_synch.param1;
5789 GetSoftSkillsManager().SetSpecialtyLevel(specialty_level);
5790 break;
5791
5792 case ERPCs.RPC_SOFT_SKILLS_STATS_SYNC:
5793 ref Param5<float, float, float, float, bool> p_debug_synch = new Param5<float, float ,float, float, bool>(0, 0, 0, 0, false);
5794 ctx.Read(p_debug_synch);
5795 float general_bonus_before = p_debug_synch.param1;
5796 float general_bonus_after = p_debug_synch.param2;
5797 float last_UA_value = p_debug_synch.param3;
5798 float cooldown_value = p_debug_synch.param4;
5799 float cooldown_active = p_debug_synch.param5;
5800 GetSoftSkillsManager().SetGeneralBonusBefore(general_bonus_before);
5801 GetSoftSkillsManager().SetGeneralBonusAfter(general_bonus_after);
5802 GetSoftSkillsManager().SetLastUAValue(last_UA_value);
5803 GetSoftSkillsManager().SetCoolDownValue(cooldown_value);
5804 GetSoftSkillsManager().SetCoolDown(cooldown_active);
5805 break;
5806
5807 case ERPCs.RPC_WARNING_ITEMDROP:
5808 {
5809 if (g_Game.IsClient() && g_Game.GetUIManager() && !g_Game.GetUIManager().FindMenu(MENU_WARNING_ITEMDROP))
5810 {
5811 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).Call(g_Game.GetUIManager().EnterScriptedMenu,MENU_WARNING_ITEMDROP,null);
5812 g_Game.GetMission().AddActiveInputExcludes({"menu"});
5813 }
5814 break;
5815 }
5816
5817 case ERPCs.RPC_WARNING_TELEPORT:
5818 {
5819 if (g_Game.IsClient() && g_Game.GetUIManager() && !g_Game.GetUIManager().FindMenu(MENU_WARNING_TELEPORT))
5820 {
5821 g_Game.GetCallQueue(CALL_CATEGORY_GAMEPLAY).Call(g_Game.GetUIManager().EnterScriptedMenu,MENU_WARNING_TELEPORT,null);
5822 g_Game.GetMission().AddActiveInputExcludes({"menu"});
5823 }
5824 break;
5825 }
5826 case ERPCs.RPC_INIT_SET_QUICKBAR:
5827 ref Param1<int> count = new Param1<int>(0);
5828 if (ctx.Read(count))
5829 {
5830 for (int i = 0; i < count.param1 ; i++)
5831 {
5832 m_QuickBarBase.OnSetEntityRPC(ctx);
5833 }
5834 }
5835 break;
5836
5837 case ERPCs.RPC_SYNC_THERMOMETER:
5838 {
5839 float value;
5840 if (ctx.Read(value))
5841 m_Hud.SetTemperature(value.ToString() + "#degrees_celsius");
5842 break;
5843 }
5844
5845
5846 case ERPCs.RPC_CHECK_PULSE:
5848 EPulseType pulse;
5850 {
5851 pulse = EPulseType.REGULAR;
5852 }
5853 else
5854 {
5855 pulse = EPulseType.IRREGULAR;
5856 }
5857
5860 {
5861 m_CheckPulseLastTarget.SetLastUAMessage(ActionCheckPulse.GetPulseMessage(pulse, blood_level));
5862 }
5863 break;
5864
5866 //woodcutting
5867 case PlantType.TREE_HARD:
5868 SoundHardTreeFallingPlay();
5869 break;
5870
5871 case PlantType.TREE_SOFT:
5872 SoundSoftTreeFallingPlay();
5873 break;
5874
5875 case PlantType.BUSH_HARD:
5876 SoundHardBushFallingPlay();
5877 break;
5878
5879 case PlantType.BUSH_SOFT:
5880 SoundSoftBushFallingPlay();
5881 break;
5882
5883 case ERPCs.RPC_DEBUG_MONITOR_FLT:
5885 {
5886 m_DebugMonitorValues.OnRPCFloat(ctx);
5887 }
5888 break;
5889
5890 case ERPCs.RPC_DEBUG_MONITOR_STR:
5892 {
5893 m_DebugMonitorValues.OnRPCString(ctx);
5894 }
5895 break;
5896
5897 case ERPCs.RPC_ITEM_REPAIR:
5898 PluginInventoryRepair repairPlugin = PluginInventoryRepair.Cast(GetPlugin(PluginInventoryRepair));
5899 repairPlugin.OnRPC(ctx);
5900 #endif
5901
5902
5903 /*
5904 case ERPCs.RPC_CRAFTING_INVENTORY_INSTANT:
5905 ref Param3<int, ItemBase, ItemBase> craftParam = new Param3<int, ItemBase, ItemBase>(-1, NULL, NULL);
5906 if (ctx.Read(craftParam))
5907 {
5908 m_ModuleRecipesManager.PerformRecipeServer(craftParam.param1, craftParam.param2, craftParam.param3, this);
5909 }
5910 break;
5911 */
5912
5913
5914
5915 #ifdef DIAG_DEVELOPER
5916 case ERPCs.DEV_RPC_AGENT_RESET:
5917 {
5918 bool val;
5919 if (ctx.Read(val))
5920 m_AgentPool.RemoveAllAgents();
5921 break;
5922 }
5923
5924 case ERPCs.DEV_PLAYER_DEBUG_REQUEST:
5925 {
5926 PluginRemotePlayerDebugServer plugin_remote_server = PluginRemotePlayerDebugServer.Cast(GetPlugin(PluginRemotePlayerDebugServer));
5927 plugin_remote_server.OnRPC(ctx, this);
5928 break;
5929 }
5930
5931 case ERPCs.DEV_PLAYER_DEBUG_DATA:
5932 {
5933 PluginRemotePlayerDebugClient plugin_remote_client = PluginRemotePlayerDebugClient.Cast(GetPlugin(PluginRemotePlayerDebugClient));
5934 PluginDeveloper plugin_dev = PluginDeveloper.Cast(GetPlugin(PluginDeveloper));
5935 if (plugin_dev.m_ScriptConsole)
5936 plugin_dev.m_ScriptConsole.OnRPCEx(rpc_type, ctx);
5937 else
5938 plugin_remote_client.OnRPC(ctx);
5939 break;
5940 }
5941
5942 case ERPCs.DEV_AGENT_GROW:
5943 {
5944 m_AgentPool.RemoteGrowRequestDebug(ctx);
5945 break;
5946 }
5947
5948 case ERPCs.RPC_ITEM_DIAG_CLOSE:
5949 {
5951 mid.StopWatchRequest(this);
5952 break;
5953 }
5954
5956 case ERPCs.DEV_REQUEST_UTS_DEBUG:
5957 {
5958 PluginUniversalTemperatureSourceServer plugin_uts_server = PluginUniversalTemperatureSourceServer.Cast(GetPlugin(PluginUniversalTemperatureSourceServer));
5959 plugin_uts_server.OnRPC(ctx, this);
5960 break;
5961 }
5962
5963 case ERPCs.DEV_UTS_DEBUG_DATA:
5964 {
5965 PluginUniversalTemperatureSourceClient plugin_uts_client = PluginUniversalTemperatureSourceClient.Cast(GetPlugin(PluginUniversalTemperatureSourceClient));
5966 plugin_uts_client.OnRPC(ctx);
5967 break;
5968 }
5970 #endif
5971
5972 #ifdef DEVELOPER
5973 case ERPCs.DEV_RPC_SERVER_SCRIPT:
5974 {
5975 //PluginItemDiagnostic plugin = PluginItemDiagnostic.Cast(GetPlugin(PluginItemDiagnostic));
5976 //SetDebugDeveloper_item(plugin.GetWatchedItem(this));//!! needs to be inside DEVELOPER ifdef
5977
5979 {
5980 _player = this;
5981 string code = CachedObjectsParams.PARAM1_STRING.param1;
5982 bool success = g_Game.ExecuteEnforceScript("void scConsMain() \n{\n" + code + "\n}\n", "scConsMain");
5983 CachedObjectsParams.PARAM1_BOOL.param1 = success;
5984 RPCSingleParam(ERPCs.DEV_RPC_SERVER_SCRIPT_RESULT, CachedObjectsParams.PARAM1_BOOL,true, GetIdentity());
5985 }
5986 break;
5987 }
5988
5989 case ERPCs.DEV_RPC_SERVER_SCRIPT_RESULT:
5990 {
5991 PluginDeveloper dev = PluginDeveloper.Cast(GetPlugin(PluginDeveloper));
5992 if (dev.m_ScriptConsole)
5993 dev.m_ScriptConsole.OnRPCEx(rpc_type, ctx);
5994 break;
5995 }
5996
5997 case ERPCs.DEV_SET_DEV_ITEM:
5998 {
5999 Param1<EntityAI> ent = new Param1<EntityAI>(null);
6000 if (ctx.Read(ent) && ent.param1)
6001 {
6003 mid2.RegisterDebugItem(ent.param1, this);
6004 }
6005 //SetDebugDeveloper_item(this);
6006 break;
6007 }
6008
6009 case ERPCs.RPC_ITEM_DIAG:
6010 {
6011 Param1<EntityAI> p1 = new Param1<EntityAI>(null);
6012 if (ctx.Read(p1))
6013 {
6015 plgn.OnRPC(p1.param1, ctx);
6016 }
6017 break;
6018 }
6019 #endif
6020 }
6021
6022 #ifdef DIAG_DEVELOPER
6023 PluginDeveloper module_rc = PluginDeveloper.Cast(GetPlugin(PluginDeveloper));
6024 if (module_rc)
6025 module_rc.OnRPC(this, rpc_type, ctx);
6026
6027 PluginDeveloperSync module_rcs = PluginDeveloperSync.Cast(GetPlugin(PluginDeveloperSync));
6028 if (module_rcs)
6029 module_rcs.OnRPC(this, rpc_type, ctx);
6030
6031 #ifdef SERVER
6033 #else
6035 #endif
6036
6037 if (plugin_diag_menu)
6038 plugin_diag_menu.OnRPC(this, rpc_type, ctx);
6039 #endif
6040 }
6041
6043 {
6044 super.OnGameplayDataHandlerSync();
6045
6047 g_Game.GetMission().SetRespawnModeClient(CfgGameplayHandler.GetDisableRespawnDialog());
6049 }
6050
6052 {
6053 Mission mission = g_Game.GetMission();
6054 if (mission)
6055 {
6056 WorldLighting wLighting = mission.GetWorldLighting();
6057 if (wLighting)
6059 }
6060 }
6061
6062 void SetContaminatedEffectEx(bool enable, int ppeIdx = -1, int aroundId = ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId = ParticleList.CONTAMINATED_AREA_GAS_TINY, string soundset = "", bool partDynaUpdate = false, int newBirthRate = 0)
6063 {
6064 if (enable) // enable
6065 {
6066 // We assume that if this is set to true the PPE is already active
6067 if (m_ContaminatedAreaEffectEnabled == enable)
6068 return;
6069
6070 if (aroundId !=0)
6071 {
6073 {
6074 m_ContaminatedAroundPlayer = ParticleManager.GetInstance().PlayInWorld(aroundId, GetPosition());
6075 }
6076 // First entry in an area with dynamic tweaks to particles
6077 if (partDynaUpdate)
6078 {
6079 m_ContaminatedAroundPlayer.SetParameter(0, EmitorParam.BIRTH_RATE, newBirthRate);
6080 }
6081 }
6082
6083 if (!m_ContaminatedAroundPlayerTiny && tinyId !=0)
6084 {
6085 m_ContaminatedAroundPlayerTiny = ParticleManager.GetInstance().PlayInWorld(tinyId, GetPosition());
6086 }
6087
6088 if (ppeIdx != -1)
6089 {
6090 PPERequesterBase ppeRequester;
6091 if (Class.CastTo(ppeRequester, PPERequesterBank.GetRequester(ppeIdx)))
6092 ppeRequester.Start();
6093 }
6094
6095 // We start playing the ambient sound
6096 if (!m_AmbientContamination && soundset != "")
6097 PlaySoundSetLoop(m_AmbientContamination, soundset, 0.1, 0.1);
6098
6099 SetSoundControllerOverride("contamination",1,SoundControllerAction.Overwrite);
6100 }
6101 else // disable
6102 {
6104 {
6107 }
6108
6110 {
6113 }
6114 if (ppeIdx != -1)
6115 PPERequesterBank.GetRequester(ppeIdx).Stop(new Param1<bool>(true)); //fade out
6116
6117 // We stop the ambient sound
6119 StopSoundSet(m_AmbientContamination);
6120
6121 SetSoundControllerOverride("contamination",0,SoundControllerAction.None);
6122 // We make sure to reset the state
6123 }
6125 }
6126
6127 void SetContaminatedEffect(bool enable, int ppeIdx = -1, int aroundId = ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId = ParticleList.CONTAMINATED_AREA_GAS_TINY, bool partDynaUpdate = false, int newBirthRate = 0)
6128 {
6129 SetContaminatedEffectEx(enable, ppeIdx, aroundId, tinyId, "", partDynaUpdate, newBirthRate);
6130 }
6131
6132 // -------------------------------------------------------------------------
6134 {
6136 if (m_CorpseState > 0 && !GetIsFrozen() && AllowDecayEffects())
6138 else
6139 SetDecayEffects();//no params means remove the effects
6141 }
6142
6143 protected bool AllowDecayEffects()
6144 {
6145 float min,max;
6146 g_Game.GetWeather().GetSnowfall().GetLimits(min,max);
6147
6148 return max <= 0;
6149 }
6150
6151 // -------------------------------------------------------------------------
6152 override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
6153 {
6154 super.EEHealthLevelChanged(oldLevel, newLevel, zone);
6155 if (!g_Game.IsHeadlessOrDedicatedServer())
6156 {
6157 if (newLevel == GameConstants.STATE_RUINED)
6158 {
6160 }
6161 if (m_CorpseState != 0)
6162 {
6163 g_Game.GetCallQueue(CALL_CATEGORY_GUI).CallLater(UpdateCorpseState, 0, false);
6164 }
6165 }
6166 }
6167
6168
6169 // -------------------------------------------------------------------------
6171 {
6172 super.OnVariablesSynchronized();
6173
6174 if (m_ModuleLifespan)
6175 {
6177
6178 if (m_LifespanLevelLocal != m_LifeSpanState) //client solution, lifespan level changed
6179 {
6182 }
6183 }
6184
6186
6188 {
6189 GetBleedingManagerRemote().OnVariablesSynchronized(GetBleedingBits());
6190 }
6191
6192 if (m_CorpseStateLocal != m_CorpseState && (IsPlayerLoaded() || IsControlledPlayer()))
6193 {
6195 }
6196
6198 {
6199 RefreshHandAnimationState(396); //mean animation blend time
6201 }
6203 {
6205 {
6207 }
6208 else
6209 {
6211 }
6213 }
6214
6215 //-------MODIFIERS START--------
6217 {
6218 int diff = (m_SyncedModifiers & ~m_SyncedModifiersPrev) | (~m_SyncedModifiers & m_SyncedModifiersPrev);//XOR gets us a mask for modifiers that changed by either deactivating, or activating
6219
6220 if (eModifierSyncIDs.MODIFIER_SYNC_DROWNING & diff)//has this modifier's status as active/inactive changed ?
6221 {
6222 if (eModifierSyncIDs.MODIFIER_SYNC_DROWNING & m_SyncedModifiers)//is this modifier currently active ? if so, it means it's been just activated
6223 {
6224 SetDrowning(true);
6225 }
6226 else
6227 {
6228 SetDrowning(false);
6229 }
6230
6231 }
6232
6234 }
6235 //-------MODIFIERS END--------
6236
6238
6240 ItemBase itemHands = GetItemInHands();
6241 if (itemHands)
6242 {
6243 RemotelyActivatedItemBehaviour raib = itemHands.GetRemotelyActivatedItemBehaviour();
6244 if (raib)
6246 }
6247
6248 //restrain events
6250 {
6253 }
6254
6256 {
6259 }
6260 }
6261
6264 {
6265 return (m_SyncedModifiers & modifier) != 0;
6266 }
6267
6269 {
6271 {
6273 if (GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
6274 {
6275 if (m_BrokenLegState < 0)
6276 BreakLegSound();
6277 }
6278 }
6279 }
6280
6282 {
6283 array<EntityAI> items = new array<EntityAI>();
6284 GetInventory().EnumerateInventory(InventoryTraversalType.INORDER, items);
6285 foreach (EntityAI item : items)
6286 {
6287 item.SetHealthMax("", "");
6288 item.SetWet(item.GetWetInit());
6289 item.SetTemperatureDirect(GameConstants.ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE);
6290 item.SetFrozen(false);
6291 }
6292 }
6293
6296
6297 //--------------------------------------------------------------------------
6299 {
6300 //Print("PlayerBase | OnSelectPlayer()");
6301 m_PlayerSelected = true;
6302
6303 m_QuickBarBase.updateSlotsCount();
6304
6305 m_WeaponManager.SortMagazineAfterLoad();
6306
6307 PlayerIdentity identity = GetIdentity();
6308
6309#ifdef FEATURE_NETWORK_RECONCILIATION
6310 if (identity)
6311 {
6313 identity.Possess(this);
6314 }
6315#endif
6316
6317 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !g_Game.IsMultiplayer())
6318 {
6319 if (identity)
6320 {
6321 m_CachedPlayerID = identity.GetId();
6322 m_CachedPlayerName = identity.GetName();
6323 }
6324
6326 SetAITargetCallbacks(new AITargetCallbacksPlayer(this));
6327
6328 array<ref Param> params = new array<ref Param>;
6329 if (m_aQuickBarLoad)
6330 {
6331 int count = m_aQuickBarLoad.Count();
6332 Param1<int> paramCount = new Param1<int>(count);
6333 params.Insert(paramCount);
6334 for (int i = 0; i < count; i++)
6335 {
6336 m_QuickBarBase.OnSetEntityNoSync(m_aQuickBarLoad.Get(i).param1,m_aQuickBarLoad.Get(i).param2);
6337 params.Insert(m_aQuickBarLoad.Get(i));
6338 }
6339
6340 if (count > 0 && g_Game.IsMultiplayer())
6341 {
6342 g_Game.RPC(this, ERPCs.RPC_INIT_SET_QUICKBAR, params, true, identity);
6343 }
6344 m_aQuickBarLoad = NULL;
6345 }
6346
6347 GetSoftSkillsManager().InitSpecialty(GetStatSpecialty().Get());
6348 GetModifiersManager().SetModifiers(true);
6349
6350 SetSynchDirty();
6351
6352 if (g_Game.IsMultiplayer())
6353 {
6354 //Drop item warning
6356 {
6357 g_Game.RPCSingleParam(this, ERPCs.RPC_WARNING_ITEMDROP, null, true, identity);
6358 m_ProcessUIWarning = false;
6359 }
6360
6361 g_Game.GetMission().SyncRespawnModeInfo(identity);
6362 }
6363 }
6364
6365 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
6366 {
6369
6370 CheckForGag();
6371 }
6372 else if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
6373 {
6378 }
6379 else if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_AI_SINGLEPLAYER)
6380 {
6382 }
6383
6384 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
6385 {
6386 if (g_Game.GetMission())
6387 {
6388 g_Game.GetMission().ResetGUI();
6389 // force update player
6390 GetDayZGame().GetBacklit().UpdatePlayer(true);
6391 }
6392
6393 m_DeathCheckTimer = new Timer();
6394 m_DeathCheckTimer.Run(0.1, this, "CheckDeath", null, true);
6397
6398 int characterCount = g_Game.GetMenuData().GetCharactersCount() - 1;
6399 int idx = g_Game.GetMenuData().GetLastPlayedCharacter();
6400 if (idx == GameConstants.DEFAULT_CHARACTER_MENU_ID || idx > characterCount)
6401 {
6402 g_Game.GetCallQueue(CALL_CATEGORY_GUI).Call(SetNewCharName);
6403 }
6404
6405 g_Game.GetMission().EnableAllInputs(true);
6406
6408 m_PresenceNotifier.Init(this);
6409 #ifdef DIAG_DEVELOPER
6410 m_TargetTemperatureDiag = PluginTargetTemperature.Cast(GetPlugin(PluginTargetTemperature));
6411 m_TargetTemperatureDiag.Init(this);
6412 #endif
6413 OnGameplayDataHandlerSync();//only here for legacy reasons
6414 }
6415
6416 GetCachedEquipment().UpdateParents();
6417 }
6418
6419 override void SimulateDeath(bool state)
6420 {
6421 super.SimulateDeath(state);
6422
6423 m_UndergroundHandler = null;
6425 if (m_EffectWidgets)
6426 {
6427 m_EffectWidgets.StopAllEffects();
6428 m_EffectWidgets.ClearSuspendRequests();
6429 }
6430 }
6431
6433 {
6434 MenuData menuData = g_Game.GetMenuData();
6435 menuData.SaveCharacter(false, true);
6436 menuData.SetCharacterName(menuData.GetLastPlayedCharacter(), g_Game.GetMenuDefaultCharacterData(false).GetCharacterName());
6437 menuData.SaveCharactersLocal();
6438 }
6439
6441 {
6442 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
6443 {
6444 BurlapSackCover attachment;
6445 Class.CastTo(attachment, GetInventory().FindAttachment(InventorySlots.HEADGEAR));
6446
6447 PPERequester_BurlapSackEffects req;
6448 if (Class.CastTo(req,PPERequesterBank.GetRequester(PPERequesterBank.REQ_BURLAPSACK)))
6449 {
6450 if (attachment)
6451 {
6452 req.Start();
6453 }
6454 else if (req.IsRequesterRunning())
6455 {
6456 PPERequesterBank.GetRequester(PPERequester_BurlapSackEffects).Stop();
6457 }
6458 }
6459 }
6460 }
6461
6463 {
6464 #ifdef SERVER
6465 Clothing item;
6466 GameInventory inventory = GetInventory();
6467 Class.CastTo(item, inventory.FindAttachment(InventorySlots.MASK));
6468 if (!item)
6469 {
6470 Class.CastTo(item, inventory.FindAttachment(InventorySlots.HEADGEAR));
6471 }
6472
6473 if (item && item.IsObstructingVoice())
6474 {
6475 item.MutePlayer(this,true);
6476 }
6477 else //should probably check for relevant types before removing mumbling and obstruction specifically..
6478 {
6479 g_Game.SetVoiceEffect(this, VoiceEffectMumbling, false);
6480 g_Game.SetVoiceEffect(this, VoiceEffectObstruction, false);
6481 }
6482 #endif
6483 }
6484
6485 void UpdateMaskBreathWidget(notnull MaskBase mask, bool is_start = false)
6486 {
6487 if (is_start)
6488 m_EffectWidgets.ResetMaskUpdateCount();
6489 float resistance = 0;
6490 if (mask.HasIntegratedFilter() || mask.IsExternalFilterAttached())
6491 resistance = 1 - mask.GetFilterQuantity01();
6492
6493
6494 m_EffectWidgets.OnVoiceEvent(resistance);
6495 m_EffectWidgets.IncreaseMaskUpdateCount();
6496
6497 }
6498
6499
6500 // -------------------------------------------------------------------------
6502 {
6503 if (m_EffectWidgets)
6504 {
6505 MaskBase mask = MaskBase.Cast(GetInventory().FindAttachment(InventorySlots.MASK));
6506 if (mask)
6507 {
6508 UpdateMaskBreathWidget(mask, true);
6509 //m_EffectWidgets.SetBreathIntensityStamina(GetStaminaHandler().GetStaminaCap(),GetStaminaHandler().GetStamina());
6510 }
6511 }
6512 }
6513
6514 // -------------------------------------------------------------------------
6516 void OnVoiceEventPlayback(PlayerSoundEventBase voice_event, AbstractWave callback, float playback_time)
6517 {
6518 if (m_EffectWidgets)
6519 {
6520 MaskBase mask = MaskBase.Cast(GetInventory().FindAttachment(InventorySlots.MASK));
6521 if (mask)
6522 {
6523 if (m_EffectWidgets.m_MaskWidgetUpdateCount < 2 && callback.GetLength() > 2 && playback_time > 0.5 )
6525 }
6526 }
6527 }
6528
6529
6530 // -------------------------------------------------------------------------
6531 override bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
6532 {
6533 if (super.OnInputUserDataProcess(userDataType, ctx))
6534 return true;
6535
6536 if (m_QuickBarBase.OnInputUserDataProcess(userDataType, ctx))
6537 return true;
6538
6539 if (m_WeaponManager.OnInputUserDataProcess(userDataType, ctx))
6540 return true;
6541
6542 if (HandleRemoteItemManipulation(userDataType, ctx))
6543 return true;
6544
6545 if (userDataType == INPUT_UDT_INVENTORY && GetHumanInventory().OnInputUserDataProcess(ctx))
6546 return true;
6547
6548 if (GetHumanInventory().OnInventoryCheck(userDataType, ctx))
6549 return true;
6550
6551 if (TogglePlacingServer(userDataType, ctx))
6552 return true;
6553
6554 if (ResetADSPlayerSync(userDataType, ctx))
6555 return true;
6556
6557 if (userDataType == INPUT_UDT_UNDERGROUND_SYNC)
6558 {
6559 int presence;
6560 if (!ctx.Read(presence))
6561 return false;
6562
6564 m_UndergroundPresence = presence;
6565
6566 return true;
6567 }
6568
6569 string uid;
6570 bool mute;
6571 if (userDataType == INPUT_UDT_USER_MUTE_XBOX)
6572 {
6573 if (ctx.Read(uid) && ctx.Read(mute))
6574 {
6575 g_Game.MutePlayer(uid, GetIdentity().GetPlainId(), mute);
6576 // commented because plainID should not be present in logs
6577 //Print("Player: " + GetIdentity().GetId() + " set mute for " + uid + " to " + mute);
6578 }
6579 }
6580
6581 if (m_EmoteManager && userDataType == INPUT_UDT_GESTURE)
6582 return m_EmoteManager.OnInputUserDataProcess(userDataType, ctx);
6583
6584 if (userDataType == INPUT_UDT_WEAPON_LIFT_EVENT)
6585 return ReadLiftWeaponRequest(userDataType, ctx);
6586
6587 if (m_ActionManager)
6588 return m_ActionManager.OnInputUserDataProcess(userDataType, ctx);
6589 return false;
6590 }
6591
6593 {
6594 float blood = GetHealth("GlobalHealth", "Blood");
6595 float blood_scale_normalized = Math.InverseLerp(PlayerConstants.BLOOD_THRESHOLD_FATAL, GetMaxHealth("", "Blood"), blood);
6596 blood_scale_normalized = Math.Clamp(blood_scale_normalized,0,1);
6598 }
6599
6601 {
6602 if (userDataType == INPUT_UDT_ITEM_MANIPULATION)
6603 {
6604 int type = -1;
6605 ItemBase item1 = null;
6606 ItemBase item2 = null;
6609 bool use_stack_max = false;
6610 int slot_id = -1;
6611
6612 DayZPlayerInventory inventory = GetDayZPlayerInventory();
6613
6614 if (!ctx.Read(type))
6615 return false;
6616
6617 if (type == 4)
6618 {
6619 if (!ctx.Read(item1))
6620 return false;
6621
6622 if (!dstIL.ReadFromContext(ctx))
6623 return false;
6624
6625 bool dummy;
6626 if (!ctx.Read(dummy))
6627 return false;
6628
6629 if (item1 && dstIL.IsValid())
6630 {
6631 item1.GetInventory().GetCurrentInventoryLocation(srcIL);
6632
6633 if (!inventory.PlayerCheckRequestSrc(srcIL, GameInventory.c_MaxItemDistanceRadius))
6634 return false;
6635
6636 if (!inventory.PlayerCheckRequestDst(srcIL, dstIL, GameInventory.c_MaxItemDistanceRadius))
6637 return false;
6638
6639 if (dummy)
6640 item1.SplitItemToInventoryLocation(dstIL);
6641 else
6642 item1.SplitIntoStackMaxToInventoryLocation(dstIL);
6643 return true;
6644 }
6645 return false;
6646 }
6647
6648 if (!ctx.Read(item1))
6649 return false;
6650 if (!ctx.Read(item2))
6651 return false;
6652 if (!ctx.Read(use_stack_max))
6653 return false;
6654 if (!ctx.Read(slot_id))
6655 return false;
6656
6657 if (!item1)
6658 return false;
6659
6660 item1.GetInventory().GetCurrentInventoryLocation(srcIL);
6661
6662 if (!inventory.PlayerCheckRequestSrc(srcIL, GameInventory.c_MaxItemDistanceRadius))
6663 return false;
6664
6665 if (type == -1 && item1 && item2)//combine
6666 {
6667 item2.GetInventory().GetCurrentInventoryLocation(dstIL);
6668 if (!inventory.PlayerCheckRequestSrc(dstIL, GameInventory.c_MaxItemDistanceRadius))
6669 return false;
6670 item1.CombineItems(item2, use_stack_max);
6671 }
6672 else if (type == 1 && item1)
6673 {
6674 if (use_stack_max)
6675 {
6676 if (item2)
6677 {
6678 if(slot_id == -1)
6679 {
6680 GameInventory destinationInventory = item2.GetInventory();
6681 destinationInventory.FindFreeLocationFor(item1, FindInventoryLocationType.ANY, dstIL);
6682 }
6683 else
6684 {
6685 dstIL.SetAttachment(item2, item1, slot_id);
6686 }
6687
6688 if (!inventory.PlayerCheckRequestDst(srcIL, dstIL, GameInventory.c_MaxItemDistanceRadius))
6689 return false;
6690
6691
6692 }
6693
6694
6695 item1.SplitIntoStackMax(item2, slot_id, this);
6696 }
6697 else
6698 {
6699 GetInventory().FindFirstFreeLocationForNewEntity(GetType(), FindInventoryLocationType.ATTACHMENT, dstIL);
6700 if (!inventory.PlayerCheckRequestDst(srcIL, dstIL, GameInventory.c_MaxItemDistanceRadius))
6701 return false;
6702
6703 item1.SplitItem(this);
6704 }
6705 }
6706 else if (type == 2 && item1 && item2)
6707 {
6708 int row, col;
6709 if (!ctx.Read(row))
6710 return false;
6711 if (!ctx.Read(col))
6712 return false;
6713
6714 dstIL.SetCargo(item2, item1, slot_id, row, col, false);
6715 if (!inventory.PlayerCheckRequestDst(srcIL, dstIL, GameInventory.c_MaxItemDistanceRadius))
6716 return false;
6717
6718 item1.SplitIntoStackMaxCargo(item2, slot_id, row, col);
6719 }
6720 else if (type == 3 && item1)
6721 {
6722 dstIL.SetHands(this, item1);
6723 if (!inventory.PlayerCheckRequestDst(srcIL, dstIL, GameInventory.c_MaxItemDistanceRadius))
6724 return false;
6725 item1.SplitIntoStackMaxHands(this);
6726 }
6727 return true;
6728 }
6729 return false;
6730 }
6731
6732 // --------------------------------------------------------------------------
6734 {
6735 return ItemBase.Cast(GetEntityInHands());
6736 }
6737
6738 //--------------------------------------------------------------------------
6739
6740
6741 override EntityAI SpawnEntityOnGroundPos(string object_name, vector pos)
6742 {
6743 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER || !g_Game.IsMultiplayer())
6744 {
6746 float surfaceY = g_Game.SurfaceY(pos[0], pos[2]);
6747 float roadY = g_Game.SurfaceRoadY(pos[0], pos[2]);
6748 float diffY = surfaceY - roadY;
6749
6750 if (diffY > 0)
6751 {
6754 if (surfaceY != roadY)
6755 {
6756 pos[1] = roadY;
6757 }
6758 }
6759 else
6760 {
6761 float ownerY = GetPosition()[1];
6762 diffY = surfaceY - ownerY;
6763 if (diffY > 0)
6764 {
6766 pos[1] = ownerY + 0.05;
6767 }
6768 }
6769
6770 bool is_AI = g_Game.IsKindOf(object_name, "DZ_LightAI");
6771 if (is_AI)
6772 {
6773 return SpawnAI(object_name, pos);
6774 }
6775 else
6776 {
6778 vector mtx[4];
6780 mtx[3] = pos;
6781 inv_loc.SetGround(null, mtx);
6782
6783 int flags = ECE_PLACE_ON_SURFACE;
6784 #ifdef DEVELOPER
6785 if (g_Game.IsKindOf(object_name, "Boat"))
6786 flags = ECE_KEEPHEIGHT;
6787 #endif
6788
6789 return EntityAI.Cast(g_Game.CreateObjectEx(object_name, inv_loc.GetPos(), flags));
6790 }
6791 }
6792 return null;
6793 }
6794
6795 EntityAI SpawnEntityOnGroundRaycastDispersed(string object_name, float raycastDistance = DEFAULT_SPAWN_DISTANCE, float radius = UAItemsSpreadRadius.DEFAULT)
6796 {
6797 vector posRandom = MiscGameplayFunctions.GetRandomizedPositionVerifiedPlayer(this,raycastDistance,radius,this);
6798 return SpawnEntityOnGroundPos(object_name,posRandom);
6799 }
6800
6801 EntityAI SpawnEntityOnGroundOnCursorDir(string object_name, float distance)
6802 {
6803 vector position = GetPosition() + (GetDirection() * distance);
6804 return SpawnEntityOnGroundPos(object_name, position);
6805 }
6806
6807 EntityAI SpawnAI(string object_name, vector pos)
6808 {
6809 bool is_ai = g_Game.IsKindOf(object_name, "DZ_LightAI");
6810 if (is_ai)
6811 {
6812 return EntityAI.Cast(g_Game.CreateObjectEx(object_name, pos, ECE_PLACE_ON_SURFACE|ECE_INITAI|ECE_EQUIP_ATTACHMENTS));
6813 }
6814 return NULL;
6815 }
6816
6817 //--------------------------------------------------------------------------
6819 {
6820 bool can_be_dropped = CanDropEntity(item);
6821 if (can_be_dropped)
6822 {
6823 can_be_dropped = PredictiveDropEntity(item);
6824 }
6825
6826 vector pos_spawn = GetPosition() + GetDirection();
6827 pos_spawn[0] = pos_spawn[0] + Math.RandomFloat(-0.2, 0.2);
6828 pos_spawn[2] = pos_spawn[2] + Math.RandomFloat(-0.2, 0.2);
6829
6830 item.SetPosition(pos_spawn);
6831 item.PlaceOnSurface();
6832 return can_be_dropped;
6833 }
6834
6835 // -------------------------------------------------------------------------
6844
6845
6846 EntityAI CreateInInventory(string item_name, string cargo_type = "", bool full_quantity = false)
6847 {
6849 if (GetInventory().FindFirstFreeLocationForNewEntity(item_name, FindInventoryLocationType.ANY, inv_loc))
6850 {
6851 return SpawnItemOnLocation(item_name, inv_loc, full_quantity);
6852 }
6853 return NULL;
6854 }
6855
6857 {
6859 string t = src.GetType();
6860 GameInventory inventory = GetInventory();
6862 {
6863 bool locked = g_Game.HasInventoryJunctureDestination(this, loc);
6864 if (locked)
6865 {
6866 Print("Warning: Split: CreateCopyOfItemInInventory - Cannot create entity at locked inventory at loc=" + InventoryLocation.DumpToStringNullSafe(loc));
6867 return null;
6868 }
6870 if (dst)
6871 {
6872 MiscGameplayFunctions.TransferItemProperties(src, dst);
6873
6874 g_Game.RemoteObjectTreeCreate(dst);
6875
6876 Print("CreateCopyOfItemInInventory - created " + dst.GetName() + " at loc=" + InventoryLocation.DumpToStringNullSafe(loc));
6877 }
6878 return dst;
6879 }
6880 return NULL;
6881 }
6882
6887
6888 ItemBase CreateCopyOfItemInInventoryOrGroundEx(ItemBase src, bool markItemAsSplitResult = false)
6889 {
6891 if (!dst)
6892 {
6893 dst = ItemBase.Cast(SpawnEntityOnGroundPos(src.GetType(), this.GetPosition()));
6894 dst.PlaceOnSurface();
6895 dst.SetResultOfSplit(markItemAsSplitResult);
6896 MiscGameplayFunctions.TransferItemProperties(src, dst);
6897 }
6898
6899 return dst;
6900 }
6901
6902
6903
6904 // -------------------------------------------------------------------------
6911 void Message(string text, string style)
6912 {
6913 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
6914 {
6915 g_Game.ChatMP(this, text, style);
6916 }
6917 else
6918 {
6919 g_Game.Chat(text, style);
6920 }
6921 }
6922
6923 // -------------------------------------------------------------------------
6924 void MessageStatus(string text)
6925 {
6926 Message(text, "colorStatusChannel");
6927 }
6928
6929 // -------------------------------------------------------------------------
6930 void MessageAction(string text)
6931 {
6932 Message(text, "colorAction");
6933 }
6934
6935 // -------------------------------------------------------------------------
6936 void MessageFriendly(string text)
6937 {
6938 Message(text, "colorFriendly");
6939 }
6940
6941 // -------------------------------------------------------------------------
6942 void MessageImportant(string text)
6943 {
6944 Message(text, "colorImportant");
6945 }
6946
6948 {
6949 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
6950 {
6951#ifndef NO_GUI
6952 UIScriptedMenu menu = g_Game.GetUIManager().GetMenu();
6953 if (menu && (menu.GetID() == MENU_INVENTORY || menu.GetID() == MENU_INSPECT))
6954 {
6955 Mission mission = g_Game.GetMission();
6956 g_Game.GetUIManager().CloseAll();
6957 mission.RemoveActiveInputExcludes({"inventory"},false);
6958 mission.RemoveActiveInputRestriction(EInputRestrictors.INVENTORY);
6959 }
6960#endif
6961 }
6962 }
6963
6964 // -------------------------------------------------------------------------
6973 override void ClearInventory()
6974 {
6975 GameInventory inventory = GetInventory();
6976 if ((g_Game.IsServer() || !g_Game.IsMultiplayer()) && inventory)
6977 {
6978 array<EntityAI> items = new array<EntityAI>;
6979 inventory.EnumerateInventory(InventoryTraversalType.INORDER, items);
6980 int nItems = items.Count();
6981 for (int i = 0; i < nItems; ++i)
6982 {
6983 ItemBase item = ItemBase.Cast(items.Get(i));
6984 if (item)
6985 {
6986 g_Game.ObjectDelete(item);
6987 }
6988 }
6989
6990 ItemBase item_in_hands = GetItemInHands();
6991
6992 if (item_in_hands)
6993 {
6994 LocalDestroyEntityInHands();
6995 }
6996 }
6997 }
6998
7001 {
7002 array<EntityAI> itemsArray = new array<EntityAI>;
7003 ItemBase item;
7004 GetInventory().EnumerateInventory(InventoryTraversalType.LEVELORDER, itemsArray);
7005 int count = itemsArray.Count();
7006
7007 for (int i = 0; i < count; ++i)
7008 {
7009 Class.CastTo(item, itemsArray.Get(i));
7010
7011 if (item && !item.IsInherited(SurvivorBase))
7012 {
7013 ServerDropEntity(item);
7014 }
7015 }
7016 }
7017
7019 {
7020 string type;
7021 g_Game.ObjectGetType(this, type);
7022 return type;
7023 }
7024
7025 // --------------------------------------------------
7026 // Lifespan
7027 //---------------------------------------------------
7028
7030 {
7032
7033 m_ModuleLifespan.UpdateLifespan(this, true);
7034 }
7035
7037 {
7039 {
7040 return true;
7041 }
7042 else
7043 {
7044 return false;
7045 }
7046 }
7047
7048
7049 override void OnParticleEvent(string pEventType, string pUserString, int pUserInt)
7050 {
7051 super.OnParticleEvent(pEventType ,pUserString, pUserInt);
7052
7053 if (!g_Game.IsHeadlessOrDedicatedServer())
7054 {
7055 if (pUserInt == 123456) // 123456 is ID for vomiting effect. The current implementation is WIP.
7056 {
7057 PlayerBase player = PlayerBase.Cast(this);
7058 int boneIdx = player.GetBoneIndexByName("Head");
7059
7060 if (boneIdx != -1)
7061 {
7062 EffectParticle eff;
7063
7064 if (m_SyncedModifiers & eModifierSyncIDs.MODIFIER_SYNC_CONTAMINATION2)
7065 {
7066 eff = new EffVomitBlood();
7067 }
7068 else
7069 {
7070 eff = new EffVomit();
7071 }
7072
7073 eff.SetDecalOwner(player);
7074 eff.SetAutodestroy(true);
7076 Particle p = eff.GetParticle();
7077 player.AddChild(p, boneIdx);
7078 }
7079 }
7080 }
7081 }
7082
7083
7085 {
7086 if (!ToDelete() && IsAlive() && !IsSwimming() && !m_IsDrowning)
7087 {
7088 return true;
7089 }
7090 return false;
7091 }
7092
7093
7095 {
7096 if (m_AddModifier != -1)
7097 {
7098 HumanCommandAdditives ad = GetCommandModifier_Additives();
7099 if (ad)
7100 ad.StartModifier(m_AddModifier);
7101
7102 m_AddModifier = -1;
7103 }
7104 }
7105
7107 {
7108 //Print("SpawnBreathVaporEffect:"+g_Game.GetTime());
7109 int boneIdx = GetBoneIndexByName("Head");
7110 if (boneIdx != -1)
7111 {
7112 Particle p;
7113 switch (m_BreathVapour)
7114 {
7115 case 1:
7116 p = ParticleManager.GetInstance().PlayInWorld(ParticleList.BREATH_VAPOUR_LIGHT, "-0.03 0.15 0");
7117 break;
7118 case 2:
7119 p = ParticleManager.GetInstance().PlayInWorld(ParticleList.BREATH_VAPOUR_MEDIUM, "-0.03 0.15 0");
7120 break;
7121 case 3:
7122 p = ParticleManager.GetInstance().PlayInWorld(ParticleList.BREATH_VAPOUR_HEAVY, "-0.03 0.15 0");
7123 break;
7124 default:
7125 break;
7126 }
7127
7128 if (p)
7129 AddChild(p, boneIdx);
7130 }
7131 }
7132
7133 // returns 'true' if the player is submerged under water deep enough so that we consider him/her to be eligible for drowning, do note some other conditions may apply for actual drowning to be turned on
7135 {
7136 int index = GetBoneIndexByName("head");
7137 vector pos = GetBonePositionWS(index);
7138 float depth = g_Game.GetWaterDepth(pos);
7139
7140 if (IsSwimming())
7141 {
7143 }
7144 else if (IsUnconscious())
7145 {
7147 }
7149 }
7150
7151 void SetLifeSpanStateVisible(int show_state)
7152 {
7153 bool state_changed;
7154 if (show_state != m_LifeSpanState)
7155 state_changed = true;
7156 m_LifeSpanState = show_state;
7157 SetSynchDirty();
7158
7159 if (state_changed) //server only, client solution in OnVariablesSynchronized()
7160 {
7161 //SendLifespanSyncEvent(m_LifeSpanState);
7162
7164 }
7165 }
7166
7168 {
7169 return m_LifeSpanState;
7170 }
7171
7173 {
7174 return m_LastShavedSeconds;
7175 }
7176
7177 void SetLastShavedSeconds(int last_shaved_seconds)
7178 {
7179 m_LastShavedSeconds = last_shaved_seconds;
7180 }
7181
7183 {
7184 return IsExclusionFlagPresent(GetFaceCoverageShaveValues());
7185 }
7186
7189 {
7190 set<int> ret = new set<int>;
7191 ret.Insert(EAttExclusions.SHAVING_MASK_ATT_0);
7192 ret.Insert(EAttExclusions.SHAVING_HEADGEAR_ATT_0);
7193 //ret.Insert(EAttExclusions.SHAVING_EYEWEAR_ATT_0);
7194
7195 return ret;
7196 }
7197
7202
7204 {
7206 }
7207
7208 void SetBloodyHands(bool show)
7209 {
7210 SetBloodyHandsBase(show);
7211 }
7212
7214 {
7215 SetBloodyHandsBase(type);
7216 }
7217
7218 private void SetBloodyHandsBase(int type)
7219 {
7221 SetSynchDirty();
7222
7223 #ifdef DIAG_DEVELOPER
7224 #ifndef SERVER
7225 if (IsControlledPlayer())
7226 {
7227 bool enable = type;
7228 DiagMenu.SetValue(DiagMenuIDs.LIFESPAN_BLOODY_HANDS, enable);
7229 }
7230 #endif
7231 #endif
7232 }
7233
7235 {
7236 if (HasBloodyHands())
7237 {
7238 if (GetInventory().FindAttachment(InventorySlots.GLOVES))
7239 return 0;
7240
7241 float randomValue = Math.RandomFloat01();
7242 if (GetBloodyHandsPenaltyChancePerAgent(eAgents.SALMONELLA) >= randomValue)
7243 return eAgents.SALMONELLA;
7244
7245 return eAgents.FOOD_POISON;
7246 }
7247
7248 return 0;
7249 }
7250
7252 {
7253 float value = 0.0;
7254 if (m_BloodyHandsPenaltyChancePerAgent.Find(type, value))
7255 return value;
7256
7257 return value;
7258 }
7259
7262 {
7263 float storedValue = GetBloodyHandsPenaltyChancePerAgent(type);
7264 if (amount > storedValue)
7265 m_BloodyHandsPenaltyChancePerAgent.Set(type, Math.Clamp(amount, 0.0, 1.0));
7266 }
7267
7272
7274 {
7275 return m_HasBloodTypeVisible;
7276 }
7277
7278 void SetBloodTypeVisible(bool show)
7279 {
7280 m_HasBloodTypeVisible = show;
7281 SetSynchDirty();
7282 }
7283
7285 {
7286 return m_BloodType;
7287 }
7288
7289 void SetBloodType(int blood_type)
7290 {
7291 m_BloodType = blood_type;
7292 SetSynchDirty();
7293 }
7294
7295 // --------------------------------------------------
7296 // Soft Skills
7297 //---------------------------------------------------
7298
7303
7305 {
7306 if (IsPlayerSelected() && !IsAlive())
7307 {
7308 SimulateDeath(true);
7309 m_DeathCheckTimer.Stop();
7310 }
7311 }
7312
7313 // -------------------------------------------------------------------------
7314
7315 // --------------------------------------------------
7316 // AI Presence
7317 //---------------------------------------------------
7318
7321 {
7323 {
7324 return m_PresenceNotifier.GetNoisePresence();
7325 }
7326
7327 return 0;
7328 }
7329
7330 // is a bit on in the persistent flags
7332 {
7333 return (m_PersistentFlags & bit);
7334 }
7335 // turn on/off a bit in the persistent flag
7336 void SetPersistentFlag(PersistentFlag bit, bool enable)
7337 {
7338 if (enable)//turn on bit
7340 else//turn off bit
7342
7343 }
7344
7345
7346 // -------------------------------------------------------------------------
7347
7349 {
7350 return m_StoreLoadVersion;
7351 }
7352
7354 {
7355 //Print("OnStoreSave");
7356 if (g_Game.SaveVersion() < 102)
7357 {
7358 ctx.Write(ACT_STORE_SAVE_VERSION);//to be removed after we push 102+
7359 }
7360
7361 super.OnStoreSave(ctx);
7362
7363 GetHumanInventory().OnStoreSave(ctx); // FSM of hands
7365
7366 if (GetDayZGame().IsServer() && GetDayZGame().IsMultiplayer())
7367 {
7368 GetPlayerStats().SaveStats(ctx);// save stats
7369 m_ModifiersManager.OnStoreSave(ctx);// save modifiers
7370 m_AgentPool.OnStoreSave(ctx);//save agents
7371 GetSymptomManager().OnStoreSave(ctx);//save states
7373 {
7374 GetBleedingManagerServer().OnStoreSave(ctx);//save bleeding sources
7375 }
7376 m_PlayerStomach.OnStoreSave(ctx);
7377 ctx.Write(GetBrokenLegs());
7378 //ctx.Write(m_LocalBrokenState);
7380
7381 HumanCommandLadder ladder = GetCommand_Ladder();
7382 if (ladder)
7383 {
7384 ctx.Write(true);
7385 ctx.Write(ladder.GetLogoutPosition());
7386 }
7387 else
7388 {
7389 ctx.Write(false);
7390 }
7391
7393 arrowManager.Save(ctx);
7394
7395 m_ThermalBiasHandler.OnStoreSave(ctx); //save thermal bias handler
7396 }
7397 }
7398
7399
7401 {
7402 if (GetModifiersManager())
7403 SetPersistentFlag(PersistentFlag.AREA_PRESENCE, GetModifiersManager().IsModifierActive(eModifiers.MDF_AREAEXPOSURE));//set the flag for player's presence in contaminated area
7405 }
7406
7407
7408 override bool OnStoreLoad(ParamsReadContext ctx, int version)
7409 {
7410 //Print("---- PlayerBase OnStoreLoad START ----, version: "+version);
7412
7413 // todo :: this should be after base call !!!!
7414 if (version < 102)//write removed in v. 102
7415 {
7416 if (!ctx.Read(m_StoreLoadVersion))
7417 return false;
7418 }
7419
7420 if (!super.OnStoreLoad(ctx, version))
7421 return false;
7422
7423 // FSM of hands
7424 if (!GetHumanInventory().OnStoreLoad(ctx, version))
7425 return false;
7426
7427 if (!OnStoreLoadLifespan(ctx, version))
7428 return false;
7429
7430 if (GetDayZGame().IsServer() && GetDayZGame().IsMultiplayer())
7431 {
7432 if (!GetPlayerStats().LoadStats(ctx, version)) // load stats
7433 {
7434 Print("---- failed to load PlayerStats ----");
7435 return false;
7436 }
7437
7438 if (!m_ModifiersManager.OnStoreLoad(ctx, version))
7439 {
7440 Print("---- failed to load ModifiersManager, read fail ----");
7441 return false;
7442 }
7443
7444 if (!m_AgentPool.OnStoreLoad(ctx, version))
7445 {
7446 Print("---- failed to load AgentPool, read fail ----");
7447 return false;
7448 }
7449
7450 if (!GetSymptomManager().OnStoreLoad(ctx, version))
7451 {
7452 Print("---- failed to load SymptomManager, read fail ----");
7453 return false;
7454 }
7455
7456 if (!GetBleedingManagerServer().OnStoreLoad(ctx, version))
7457 {
7458 Print("---- failed to load BleedingManagerServer, read fail ----");
7459 return false;
7460 }
7461
7462 if (!m_PlayerStomach.OnStoreLoad(ctx, version))
7463 {
7464 Print("---- failed to load PlayerStomach, read fail ----");
7465 return false;
7466 }
7467
7468 //Check for broken leg value
7469 if (version >= 116)
7470 {
7471 if (!ctx.Read(m_BrokenLegState))
7472 {
7473 return false;
7474 }
7475 if (version <= 126)// WHILE >= 116
7476 {
7477 if (!ctx.Read(m_LocalBrokenState))
7478 {
7479 return false;
7480 }
7481 }
7482 }
7483 //Load persistent flags value
7484 if (version >= 125 && (!ctx.Read(m_PersistentFlags)))
7485 {
7486 Print("---- failed to load Persistent Flags, read fail ----");
7487 return false;
7488 }
7489
7490 if (version >= 131)
7491 {
7492 bool onLadder;
7493 if (!ctx.Read(onLadder))
7494 {
7495 return false;
7496 }
7497
7498 if (onLadder)
7499 {
7501 if (!ctx.Read(position))
7502 {
7503 return false;
7504 }
7505
7506 Hive hive = GetHive();
7507 if (!hive || !hive.CharacterIsLoginPositionChanged(this))
7508 {
7510 }
7511 }
7512 }
7513
7514 if (version >= 134)
7515 {
7517 arrowManager.Load(ctx);
7518 }
7519
7520 if (!m_ThermalBiasHandler.OnStoreLoad(ctx, version))
7521 {
7522 Print("---- failed to load ThermalBiasHandler, read fail ----");
7523 return false;
7524 }
7525 }
7526
7527 Print("---- PlayerBase OnStoreLoad SUCCESS ----");
7528 return true;
7529 }
7530
7531 override void AfterStoreLoad()
7532 {
7533 GetHumanInventory().OnAfterStoreLoad();
7534 if (m_EmoteManager)
7535 m_EmoteManager.AfterStoreLoad();
7536
7537 if (GetPlayerStats())
7538 GetPlayerStats().OnAfterStoreLoad();
7539
7541 vector currentPos = GetPosition();
7542 if (g_Game.GetGameState() != DayZGameState.MAIN_MENU && CfgPlayerRestrictedAreaHandler.IsInitialized() && CfgPlayerRestrictedAreaHandler.IsPointInPlayerRestrictedArea(currentPos,pra))
7543 {
7544 //vector safePos = pra.GetClosestSafePos3D(currentPos);
7545 vector safePos = pra.GetRandomSafePos3D(currentPos);
7546 if (MiscGameplayFunctions.TeleportPlayerToSafeLocation3D(this,safePos) && m_AdminLog)
7547 m_AdminLog.PlayerTeleportedLog(this,currentPos,safePos,"Spawning in Player Restricted Area: " + pra.areaName);
7548 }
7549 }
7550
7559
7561 {
7562 int lifespan_state = 0;
7563 if (!ctx.Read(lifespan_state))
7564 return false;
7565 m_LifeSpanState = lifespan_state;
7566
7567 int last_shaved = 0;
7568 if (!ctx.Read(last_shaved))
7569 return false;
7570 m_LastShavedSeconds = last_shaved;
7571
7572 if (version < 122)
7573 {
7574 bool bloody_hands_old;
7575 if (!ctx.Read(bloody_hands_old))
7576 return false;
7577 m_HasBloodyHandsVisible = bloody_hands_old;
7578 }
7579 else
7580 {
7581 int bloody_hands = 0;
7582 if (!ctx.Read(bloody_hands))
7583 return false;
7584 m_HasBloodyHandsVisible = bloody_hands;
7585 }
7586
7587
7588 bool blood_visible = false;
7589 if (!ctx.Read(blood_visible))
7590 return false;
7591 m_HasBloodTypeVisible = blood_visible;
7592
7593 int blood_type = 0;
7594 if (!ctx.Read(blood_type))
7595 return false;
7596 m_BloodType = blood_type;
7597
7598 return true;
7599 }
7600
7603 {
7604 int hour, minute, second;
7605 GetHourMinuteSecond(hour, minute, second);
7606 float distance;
7607 distance = StatGet(AnalyticsManagerServer.STAT_DISTANCE);
7608 if (m_AnalyticsTimer)
7609 {
7611 data.m_CharacterId = g_Game.GetDatabaseID();
7612 data.m_TimeInterval = m_AnalyticsTimer.GetRemaining();
7613 data.m_DaytimeHour = hour;
7615 data.m_PositionEnd = GetPosition();
7616 data.m_DistanceOnFoot = distance;
7618 }
7619
7621 }
7622
7624 {
7625 Debug.Log("Player connected:"+this.ToString(),"Connect");
7626
7627 // analytics
7628 g_Game.GetAnalyticsServer().OnPlayerConnect(this);
7629
7631 if (m_AnalyticsTimer)
7632 m_AnalyticsTimer.Run(60, this, "UpdatePlayerMeasures", null, true);
7633
7634 //construction action data
7636 }
7637
7639 {
7640 Debug.Log("Player reconnected:"+this.ToString(),"Reconnect");
7641
7642 //construction action data
7643
7645 }
7646
7648 {
7649 Debug.Log("Player disconnected:"+this.ToString(),"Connect");
7650
7651 // analytics
7652 // force update of the stats
7653 // if player disconnect too soon, UpdatePlayersStats() is not called
7654 g_Game.GetAnalyticsServer().OnPlayerDisconnect(this);
7655
7657 data.m_CharacterId = g_Game.GetDatabaseID();
7658 data.m_Reason = "Disconnected";
7660
7661 if (m_AnalyticsTimer)
7662 m_AnalyticsTimer.Stop();
7664
7666
7667 // Remove player data from scripted sandstorm controller
7668 ScriptedSandstormController sandstormController = ScriptedSandstormController.Cast(g_Game.GetWeather().GetSandstorm());
7669 if (sandstormController)
7670 {
7671 if (GetIdentity())
7672 {
7674 sandstormController.CleanupDisconnectedPlayer(GetIdentity().GetId());
7675 }
7676 else
7677 {
7679 sandstormController.CheckConnectedPlayers();
7680 }
7681 }
7682 }
7683
7684 void SetModifiers(bool enable)
7685 {
7686 GetModifiersManager().SetModifiers(enable);
7687 }
7688
7690 {
7691 PluginTransmissionAgents plugin = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
7692 WorldData worldData = g_Game.GetMission().GetWorldData();
7693 int pollution = worldData.GetPollution();
7694 float temperature = 0;
7695
7696 if (data.m_Type == EConsumeType.ENVIRO_POND || data.m_Type == EConsumeType.ENVIRO_WELL || data.m_Type == EConsumeType.ENVIRO_SNOW)
7697 {
7698 if (data.m_Type != EConsumeType.ENVIRO_WELL)
7699 {
7700 if (pollution & EPollution.HEAVYMETAL)
7701 data.m_Agents = data.m_Agents | eAgents.HEAVYMETAL;
7702
7703 if (data.m_Type == EConsumeType.ENVIRO_POND)
7704 data.m_Agents = data.m_Agents | eAgents.CHOLERA;
7705 }
7706
7707 temperature = worldData.GetLiquidTypeEnviroTemperature(data.m_LiquidType);
7708 m_PlayerStomach.AddToStomach(Liquid.GetLiquidClassname(LIQUID_WATER), data.m_Amount, 0 , data.m_Agents, temperature);
7709
7710 return true;
7711 }
7712
7713 Edible_Base edibleItem = Edible_Base.Cast(data.m_Source);
7714 if (!edibleItem || !edibleItem.CanBeConsumed())
7715 return false;
7716
7717 if (data.m_Type == EConsumeType.ITEM_SINGLE_TIME || data.m_Type == EConsumeType.ITEM_CONTINUOUS)
7718 {
7719 data.m_Agents = edibleItem.FilterAgents(data.m_Agents | edibleItem.GetAgents());
7720 temperature = edibleItem.GetTemperature();
7721
7722 if (data.m_Type == EConsumeType.ITEM_SINGLE_TIME)
7723 plugin.TransmitAgents(edibleItem, this, AGT_UACTION_CONSUME, data.m_Amount);
7724
7725 if (edibleItem.IsLiquidContainer())
7726 {
7727 int liquidType = edibleItem.GetLiquidType();
7728 string liquidClassName = Liquid.GetLiquidClassname(liquidType);
7729 if (liquidClassName.Length() == 0)
7730 Error("Error! Trying to add unknown liquid to stomach with item=" + Object.GetDebugName(edibleItem) + " data.m_Type=" + data.m_Type + " liquid_type=" + liquidType);
7731
7732 m_PlayerStomach.AddToStomach(liquidClassName, data.m_Amount, 0, data.m_Agents, temperature);
7733 }
7734 else
7735 {
7736 int foodStageType;
7737 if (edibleItem.GetFoodStage())
7738 foodStageType = edibleItem.GetFoodStage().GetFoodStageType();
7739
7740 m_PlayerStomach.AddToStomach(data.m_Source.GetType(), data.m_Amount, foodStageType, data.m_Agents, temperature);
7741 }
7742
7743 edibleItem.Consume(data.m_Amount, this);
7744
7745 return true;
7746
7747 }
7748
7749 return false;
7750 }
7751
7753 {
7754 #ifndef NO_GUI
7755 if (show)
7756 {
7757 g_Game.GetUIManager().ScreenFadeIn(0, "You are Unconscious", FadeColors.BLACK, FadeColors.WHITE);
7758 PrintString("Fade in");
7759 }
7760 else
7761 {
7762 g_Game.GetUIManager().ScreenFadeOut(0);
7763 PrintString("Fade out");
7764 }
7765 #endif
7766 }
7767
7768 override void RequestSoundEventEx(EPlayerSoundEventID id, bool from_server_and_client = false, int param = 0)
7769 {
7770 if (from_server_and_client && GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
7771 {
7772 PlaySoundEventEx(id, false, false, param);
7773 return;
7774 }
7775
7776 SendSoundEventEx(id, param);
7777 }
7778
7779 override void RequestSoundEvent(EPlayerSoundEventID id, bool from_server_and_client = false)
7780 {
7781 RequestSoundEventEx(id, from_server_and_client);
7782 }
7783
7784 override void RequestSoundEventStop(EPlayerSoundEventID id, bool from_server_and_client = false, int param = EPlayerSoundEventParam.STOP_PLAYBACK)
7785 {
7786 if (from_server_and_client && GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
7787 {
7788 StopSoundEvent(id, false, param);
7789 return;
7790 }
7791
7792 SendSoundEventEx(id, param);
7793 }
7794
7795 override protected void SendSoundEvent(EPlayerSoundEventID id)
7796 {
7797 SendSoundEventEx(id);
7798 }
7799
7800 override protected void SendSoundEventEx(EPlayerSoundEventID id, int param = 0)
7801 {
7802 if (!g_Game.IsServer())
7803 {
7804 return;
7805 }
7806 m_SoundEvent = id;
7807 m_SoundEventParam = param;
7808 SetSynchDirty();
7809
7810 if (!g_Game.IsMultiplayer())
7811 {
7813 }
7814
7815 //PrintString(g_Game.GetTime().ToString() + " Set SoundEvent, id:" + id.ToString());
7816 }
7817
7819 {
7820 if (m_SoundEvent != 0 && m_SoundEventSent)
7821 {
7822 m_SoundEvent = 0;
7824 m_SoundEventSent = false;
7825 SetSynchDirty();
7826 }
7827 }
7828
7830 {
7831 if (m_SoundEvent!= 0 && !m_SoundEventSent)
7832 {
7833 m_SoundEventSent = true;
7834 }
7835 }
7836
7837 override bool PlaySoundEventType(ESoundEventType soundType, int soundEventID, int param = 0)
7838 {
7839 if (m_ReplaceSoundEventHandler)
7840 return m_ReplaceSoundEventHandler.PlayReplaceSound(soundEventID, soundType, param);
7841
7842 return false;
7843 }
7844
7845 override bool PlaySoundEvent(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false)
7846 {
7847 return PlaySoundEventEx(id, from_anim_system, is_from_server);
7848 }
7849
7850 override bool PlaySoundEventEx(EPlayerSoundEventID id, bool from_anim_system = false, bool is_from_server = false, int param = 0)
7851 {
7852 if (!m_PlayerSoundEventHandler)
7853 return false;
7854
7855 return m_PlayerSoundEventHandler.PlayRequestEx(id, is_from_server, param);
7856 }
7857
7858 override bool StopSoundEvent(EPlayerSoundEventID id, bool is_from_server = false, int param = 0)
7859 {
7860 if (!m_PlayerSoundEventHandler)
7861 return false;
7862
7863 return m_PlayerSoundEventHandler.StopRequest(id, is_from_server, param);
7864 }
7865
7867 {
7868 return m_PlayerSoundEventHandler;
7869 }
7870
7873
7875 {
7877 if (IsControlledPlayer())
7878 {
7879 if (!g_Game.IsHeadlessOrDedicatedServer())
7880 {
7881 DisplayElementBadge dis_elm = DisplayElementBadge.Cast(GetVirtualHud().GetElement(eDisplayElements.DELM_BADGE_BLEEDING));
7882 if (dis_elm)
7883 {
7884 dis_elm.SetValue(GetBleedingSourceCount());
7885 }
7886
7887
7888 //Print("----------bleeding_SoundSet----------");
7889 SEffectManager.PlaySoundOnObject("bleeding_SoundSet", this);
7890 }
7891 }
7892 }
7893
7895 {
7897 if (g_Game.IsServer())
7898 {
7899 ArrowManagerBase arrowManager = GetArrowManager();
7900 if (GetBleedingSourceCount() > 0)
7901 {
7902 arrowManager.DropFirstArrow();
7903 }
7904 else
7905 {
7906 arrowManager.DropAllArrows();
7907 }
7908 }
7909
7910 if (IsControlledPlayer())
7911 {
7912 if (!g_Game.IsHeadlessOrDedicatedServer())
7913 {
7914 //Print("GetBleedingSourceCount() "+GetBleedingSourceCount());
7915 DisplayElementBadge dis_elm = DisplayElementBadge.Cast(GetVirtualHud().GetElement(eDisplayElements.DELM_BADGE_BLEEDING));
7916 if (dis_elm)
7917 {
7918 dis_elm.SetValue(GetBleedingSourceCount());
7919 }
7920 }
7921 }
7922 }
7923
7924
7929
7931 {
7932 return m_BleedingSourceCount;
7933 }
7934
7935 // for debug purposes, should reset some systems like Modifiers, Stats, Damage etc.....
7936 void ResetPlayer(bool set_max)
7937 {
7938 #ifdef DIAG_DEVELOPER
7939 if (g_Game.IsServer() || !g_Game.IsMultiplayer())
7940 {
7941 GetStomach().ClearContents();
7942
7943 DamageSystem.ResetAllZones(this);
7944 GetModifiersManager().ResetAll();
7945
7946 // bleeding sources
7948 m_BleedingManagerServer.RemoveAllSources();
7949
7950 // Stats
7951 if (GetPlayerStats())
7952 {
7953 int bloodType = GetStatBloodType().Get();
7954 GetPlayerStats().ResetAllStats();
7955 GetStatBloodType().Set(bloodType);
7956 }
7957
7958 // Agents
7959 if (m_AgentPool)
7960 m_AgentPool.RemoveAllAgents();
7961
7962 m_DiseaseCount = 0;
7963
7964 if (m_StaminaHandler)
7966
7967 // uncon
7968 if (IsUnconscious())
7970
7971 // set max
7972 if (set_max)
7973 {
7974 GetStatWater().Set(GetStatWater().GetMax());
7976 }
7977
7978 // fix up inventory
7980
7981 //remove bloody hands
7982 PluginLifespan moduleLifespan = PluginLifespan.Cast(GetPlugin(PluginLifespan));
7983 moduleLifespan.UpdateBloodyHandsVisibilityEx(this, eBloodyHandsTypes.CLEAN);
7985
7986 if (GetArrowManager())
7988
7990 GetThermalBiasHandler().SetTemporaryResistance(0.0);
7991 }
7992
7993 // client + single + server
7994 HumanCommandVehicle vehCmd = GetCommand_Vehicle();
7995 if (vehCmd)
7996 {
7997 Transport transport = vehCmd.GetTransport();
7998 if (transport)
7999 transport.FixEntity();
8000 }
8001 #endif
8002 }
8003
8005 {
8006 if (m_SoundEvent != 0 && (m_SoundEventParam & EPlayerSoundEventParam.STOP_PLAYBACK) != EPlayerSoundEventParam.STOP_PLAYBACK)
8008 else if (m_SoundEventParam & EPlayerSoundEventParam.STOP_PLAYBACK)
8010
8011 m_SoundEvent = 0;
8013
8014 // cancelling marked interrupted sounds
8015 if (m_PerformedAnimActionID == -1)
8016 {
8017 if (m_PerformedActionSounds.Count() == 0)
8018 return;
8019
8020 foreach (AbstractWave sound : m_PerformedActionSounds)
8021 {
8022 if (sound)
8023 sound.Stop();
8024 }
8025
8026 m_PerformedActionSounds.Clear();
8027 }
8028 }
8029
8031 {
8032 if (g_Game.IsClient()) return;
8033 RequestSoundEvent(1234);
8034 //Math.RandomInt(1,4096)
8035 }
8036
8037 void SetStaminaState(eStaminaState state)
8038 {
8039 if (state != m_StaminaState)
8040 {
8041 m_StaminaState = state;
8042 //PrintString("m_StaminaState:"+m_StaminaState.ToString());
8043 SetSynchDirty();
8044 }
8045 }
8046
8048 {
8049 return m_StaminaState;
8050 }
8051
8053 {
8054 m_QuickBarBase.updateSlotsCount();
8055 }
8056
8057 bool Save()
8058 {
8059 // saved player must be alive and not captive
8060 if (GetPlayerState() == EPlayerStates.ALIVE && !IsRestrained())
8061 {
8062 GetHive().CharacterSave(this);
8063 Debug.Log("Player "+this.ToString()+ " saved as alive");
8064
8065 return true;
8066 }
8067 return false;
8068 }
8069
8070 // agent transfer
8072 void SpreadAgentsEx(float distance = 3,float chance = 0.25)
8073 {
8074 if (Math.RandomFloat01() > chance)
8075 return;
8076
8077 g_Game.GetPlayers(m_ServerPlayers);
8078 float dist_check = distance * distance;//make it sq
8079 PluginTransmissionAgents plugin = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
8080
8081 foreach (Man target: m_ServerPlayers)
8082 {
8083 if (vector.DistanceSq(GetWorldPosition(), target.GetWorldPosition()) < dist_check && target != this)
8084 {
8085 plugin.TransmitAgents(this, target, AGT_AIRBOURNE_BIOLOGICAL, 1);
8086 }
8087 }
8088 }
8089
8090 void SpreadAgents()//legacy method
8091 {
8092 SpreadAgentsEx(3,1);
8093 }
8094
8095 //--------------------------------------------------------------------------------------------
8096 override int GetAgents()
8097 {
8098 return m_AgentPool.GetAgents();
8099 }
8100
8101 //--------------------------------------------------------------------------------------------
8102 override void RemoveAgent(int agent_id) //removes a single agent type from the player agent pool
8103 {
8104 m_AgentPool.RemoveAgent(agent_id);
8105 }
8106
8107 //--------------------------------------------------------------------------------------------
8108 override void RemoveAllAgents()
8109 {
8110 m_AgentPool.RemoveAllAgents();
8111 }
8112
8113
8114 //--------------------------------------------------------------------------------------------
8115 override void InsertAgent(int agent, float count = 1) //adds a single agent type to the player agent pool
8116 {
8117 m_AgentPool.AddAgent(agent,count);
8118 }
8119
8120 //--------------------------------------------------------------------------------------------
8121 int GetSingleAgentCount(int agent_id)
8122 {
8123 return m_AgentPool.GetSingleAgentCount(agent_id);
8124 }
8125
8126 //--------------------------------------------------------------------------------------------
8128 {
8129 int max_count = PluginTransmissionAgents.GetAgentMaxCount(agent_id);
8130 return m_AgentPool.GetSingleAgentCount(agent_id) / max_count;
8131 }
8132
8134 {
8135 return m_AgentPool.GetTotalAgentCount();
8136 }
8137
8139 {
8140 m_AgentPool.PrintAgents();
8141 }
8142
8143 void ImmuneSystemTick(float value, float deltaT)
8144 {
8145 m_AgentPool.ImmuneSystemTick(value, deltaT);
8146 }
8147
8148 void SetTemporaryResistanceToAgent(int agent, float time)
8149 {
8150 m_AgentPool.SetTemporaryResistance(agent, time);
8151 }
8152
8154 {
8155 return m_AgentPool.GetTemporaryResistance(agent);
8156 }
8157
8162
8163 //Get aim (player crosshair) position
8165 {
8166 float min_distance = 0.5; //min distance, default = 5m
8167
8168 vector from = g_Game.GetCurrentCameraPosition();
8169 vector to = from + (g_Game.GetCurrentCameraDirection() * min_distance);
8170 vector contactPos;
8171 vector contactDir;
8172 int contactComponent;
8173
8174 DayZPhysics.RaycastRV(from, to, contactPos, contactDir, contactComponent, NULL, NULL, NULL, false, true);
8175
8176 return contactPos;
8177 }
8178
8179
8181 {
8182 ItemBase mask = ItemBase.Cast(GetInventory().FindAttachment(InventorySlots.MASK));
8183 return (!mask || (mask && mask.AllowFoodConsumption()));
8184 }
8185
8187 {
8188 return true;
8189 }
8190
8191 //get modifier manager
8196
8198 {
8199 if (!m_StatWater && m_PlayerStats)
8200 {
8202 }
8203 return m_StatWater;
8204 }
8205
8207 {
8209 {
8211 }
8212 return m_StatToxicity;
8213 }
8214
8216 {
8217 if (!m_StatEnergy && m_PlayerStats)
8218 {
8220 }
8221 return m_StatEnergy;
8222 }
8223
8225 {
8227 {
8228 m_StatHeatComfort = PlayerStat<float>.Cast(m_PlayerStats.GetStatObject(EPlayerStats_current.HEATCOMFORT));
8229 }
8230 return m_StatHeatComfort;
8231 }
8232
8234 {
8235 if (!m_StatTremor && m_PlayerStats)
8236 {
8238 }
8239 return m_StatTremor;
8240 }
8241
8243 {
8244 if (!m_StatWet && m_PlayerStats)
8245 {
8247 }
8248 return m_StatWet;
8249 }
8250
8252 {
8253 if (!m_StatDiet && m_PlayerStats)
8254 {
8256 }
8257 return m_StatDiet;
8258 }
8259
8261 {
8263 {
8265 }
8266 return m_StatStamina;
8267 }
8268
8270 {
8272 {
8274 }
8275 return m_StatSpecialty;
8276 }
8277
8279 {
8281 {
8282 m_StatBloodType = PlayerStat<int>.Cast(m_PlayerStats.GetStatObject(EPlayerStats_current.BLOODTYPE));
8283 }
8284 return m_StatBloodType;
8285 }
8286
8288 {
8290 {
8291 m_StatHeatBuffer = PlayerStat<float>.Cast(m_PlayerStats.GetStatObject(EPlayerStats_current.HEATBUFFER));
8292 }
8293 return m_StatHeatBuffer;
8294 }
8295
8296 void SetHeatBufferDynamicMax(float value)
8297 {
8298 m_HeatBufferDynamicMax = value;
8299 SetSynchDirty();
8300 }
8301
8303 {
8305 }
8306
8308 {
8309 m_HasHeatBuffer = show;
8310 SetSynchDirty();
8311 }
8312
8313 void ToggleHeatBufferVisibility(int heatbufferStage)
8314 {
8315 m_HeatBufferStage = heatbufferStage;
8316 SetSynchDirty();
8317 }
8318
8321 {
8322 return m_UALastMessage;
8323 }
8324
8325 void SetLastUAMessage(string pMsg)
8326 {
8327 m_UALastMessage = pMsg;
8328
8329 if (m_UALastMessageTimer.IsRunning())
8330 {
8331 m_UALastMessageTimer.Stop();
8332 }
8333
8334 m_UALastMessageTimer.Run(PlayerConstants.LAST_UA_MSG_LIFETIME, this, "ClearLastUAMessage", null);
8335 }
8336
8337 protected void ClearLastUAMessage()
8338 {
8339 if (m_UALastMessageTimer.IsRunning())
8340 {
8341 m_UALastMessageTimer.Stop();
8342 }
8343
8344 m_UALastMessage = "";
8345 }
8346
8349
8352 {
8353 m_InjuryHandler.CheckValue(true);
8354 }
8355
8356 override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
8357 {
8358#ifdef ROBOCLIENT
8359 if (m_Bot && action_id > EActions.PLAYER_BOT_INTERNAL_START && action_id < EActions.PLAYER_BOT_END)
8360 {
8361 m_Bot.StartAction(action_id);
8362 return true;
8363 }
8364#endif
8365
8366 if (super.OnAction(action_id, player, ctx))
8367 return true;
8368
8369 if (g_Game.IsClient() || !g_Game.IsMultiplayer())
8370 {
8371 switch (action_id)
8372 {
8373 case EActions.GIZMO_OBJECT:
8374 if (GetGizmoApi())
8375 GetGizmoApi().SelectObject(this);
8376 return true;
8377 case EActions.GIZMO_PHYSICS:
8378 if (GetGizmoApi())
8379 GetGizmoApi().SelectPhysics(GetPhysics());
8380 return true;
8381 }
8382 }
8383
8384 if (g_Game.IsServer())
8385 {
8386 switch (action_id)
8387 {
8388 case EActions.DELETE:
8389 Delete();
8390 return true;
8391 }
8392 }
8393
8394 return false;
8395 }
8396
8397 // -------------------------------------------------------------------------
8398 override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
8399 {
8400 int i;
8401
8402 PluginTransmissionAgents pluginTransmissionAgents = PluginTransmissionAgents.Cast(GetPlugin(PluginTransmissionAgents));
8403
8404#ifdef ROBOCLIENT
8405 if (pluginTransmissionAgents && !(m_Bot || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_AI_REMOTE))
8406#else
8407 if (pluginTransmissionAgents && !(GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_AI_REMOTE))
8408#endif
8409 {
8410 map<int, string> agentList = pluginTransmissionAgents.GetSimpleAgentList();
8411
8412 if (agentList)
8413 {
8414 foreach (int tid, string tname : agentList)
8415 {
8416 string injectName = "Inject " + tname;
8417 string removeName = "Remove " + tname;
8418
8419 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DEBUG_AGENTS_RANGE_INJECT_START + tid, injectName, Colors.WHITE));
8420 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DEBUG_AGENTS_RANGE_REMOVE_START + tid, removeName, Colors.WHITE));
8421 }
8422 }
8423
8424 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
8425 }
8426
8427#ifdef ROBOCLIENT
8428 if (m_Bot || GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_AI_REMOTE)
8429 {
8430 typename e = EActions;
8431
8432 int cnt = e.GetVariableCount();
8433 int val;
8434
8435 for (i = 0; i < cnt; i++)
8436 {
8437 if (!e.GetVariableValue(null, i, val))
8438 continue;
8439
8440 if (val <= EActions.PLAYER_BOT_INTERNAL_START)
8441 continue;
8442
8443 if (val == EActions.PLAYER_BOT_START)
8444 {
8445 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
8446 continue;
8447 }
8448
8449 if (val >= EActions.PLAYER_BOT_END)
8450 break;
8451
8452 string name = e.GetVariableName(i);
8453
8454 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, val, name, FadeColors.LIGHT_GREY));
8455 }
8456
8457 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
8458 }
8459#endif
8460
8461 super.GetDebugActions(outputList);
8462
8463 if (Gizmo_IsSupported())
8464 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_OBJECT, "Gizmo Object", FadeColors.LIGHT_GREY));
8465 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.GIZMO_PHYSICS, "Gizmo Physics (SP Only)", FadeColors.LIGHT_GREY)); // intentionally allowed for testing physics desync
8466 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_AI_SINGLEPLAYER) // Prevent deleting ourselves
8467 {
8468 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.DELETE, "Delete", FadeColors.RED));
8469 }
8470 outputList.Insert(new TSelectableActionInfoWithColor(SAT_DEBUG_ACTION, EActions.SEPARATOR, "___________________________", FadeColors.RED));
8471 }
8472
8473 //-------------------------------------------------------------
8477
8478 override void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
8479 {
8480 super.OnSyncJuncture(pJunctureID, pCtx);
8481
8482 switch(pJunctureID)
8483 {
8486 bool enable;
8487 DayZPlayerSyncJunctures.ReadInjuryParams(pCtx, enable, level);
8488 m_InjuryHandler.SetInjuryCommandParams(enable, level);
8489 break;
8491 GetSymptomManager().SetAnimation(pCtx);
8492 break;
8495 break;
8497 GetInventory().OnInventoryJunctureFromServer(pCtx);
8498 break;
8500 GetInventory().OnInventoryJunctureFailureFromServer(pCtx);
8501 break;
8505 m_ActionManager.OnSyncJuncture(pJunctureID,pCtx);
8506 break;
8510 m_WeaponManager.OnSyncJuncture(pJunctureID,pCtx);
8511 break;
8513 DayZPlayerSyncJunctures.ReadPlayerUnconsciousnessParams(pCtx, m_ShouldBeUnconscious);
8514 break;
8516 GetSymptomManager().SetAnimation(pCtx);
8517 break;
8519 float amount;
8520 if (DayZPlayerSyncJunctures.ReadKuruRequest(pCtx, amount))
8521 {
8522 if (GetAimingModel() && IsFireWeaponRaised())
8523 {
8524 GetAimingModel().RequestKuruShake(amount);
8525 }
8526 }
8527 break;
8529 m_EmoteManager.OnSyncJuncture(pJunctureID, pCtx);
8530 break;
8531 case DayZPlayerSyncJunctures.SJ_WEAPON_LIFT: // Obsolete
8532 SetLiftWeapon(pJunctureID, pCtx);
8533 break;
8535 m_ResetADS = true;
8536 break;
8538 SetToDelete(pCtx);
8539 break;
8543 break;
8546 break;
8548 m_StaminaHandler.OnSyncJuncture(pJunctureID, pCtx);
8549 break;
8551 m_StaminaHandler.OnSyncJuncture(pJunctureID, pCtx);
8552 break;
8553 #ifdef DEVELOPER
8554 case DayZPlayerSyncJunctures.SJ_DEBUG_GET_IN_VEHICLE:
8555 EntityAI vehicle;
8556 DayZPlayerSyncJunctures.ReadGetInVehicleParams(pCtx, vehicle);
8557 SetGetInVehicleDebug(vehicle);
8558 break;
8559 #endif
8560 }
8561 }
8562
8564 {
8565 return m_ItemsToDelete.Count() > 0;
8566 }
8567
8569 {
8570 EntityAI item;
8571 pCtx.Read(item);
8572 AddItemToDelete(item);
8573 }
8574
8575 override void AddItemToDelete(EntityAI item)
8576 {
8577 if (item)
8578 {
8579 item.SetPrepareToDelete();
8580 m_ItemsToDelete.Insert(item);
8581 }
8582 }
8583
8585 {
8586 return !(GetThrowing().IsThrowingAnimationPlaying() || GetDayZPlayerInventory().IsProcessing() || (GetActionManager() && GetActionManager().GetRunningAction()));
8587 }
8588
8589 override void JunctureDeleteItem(EntityAI item)
8590 {
8592 }
8593
8595 {
8596 int count = m_ItemsToDelete.Count();
8597 if (count > 0)
8598 {
8599 if (CanDeleteItems())
8600 {
8601 EntityAI itemToDelete;
8602
8603 if (g_Game.IsClient() && g_Game.IsMultiplayer())
8604 {
8606 for (int i = count - 1; i >= 0 ; i--)
8607 {
8608 itemToDelete = m_ItemsToDelete.Get(i);
8609 if (itemToDelete != null)
8610 {
8611 itemToDelete.GetInventory().GetCurrentInventoryLocation(il);
8612 }
8613
8614 if (itemToDelete == null || (GetItemInHands() == null && il.GetType() == InventoryLocationType.UNKNOWN))
8615 {
8616 m_ItemsToDelete.Remove(i);
8617 }
8618 }
8619 }
8620 else
8621 {
8622 for (int j = count - 1; j >= 0 ; j--)
8623 {
8624 itemToDelete = m_ItemsToDelete.Get(j);
8625 if (itemToDelete == null)
8626 {
8627 m_ItemsToDelete.Remove(j);
8628 }
8629 else
8630 {
8631 itemToDelete.Delete();
8632 m_ItemsToDelete.Remove(j);
8633 }
8634 }
8635 }
8636 }
8637 }
8638 }
8639
8640 override bool HeadingModel(float pDt, SDayZPlayerHeadingModel pModel)
8641 {
8642 if (GetActionManager()) // disable character turning while performing actions
8643 {
8645 if (action && action.IsFullBody(this) && action.IsCameraLockOnPerform())
8646 {
8648 {
8649 m_IsHeadingRestricted = true;
8650 m_HeadingRestrictData.InitData(pModel.m_fHeadingAngle, action.GetCameraLRAngle());
8651 }
8652
8653 return DayZPlayerImplementHeading.RestrictHeading(pDt, pModel, m_fLastHeadingDiff, m_HeadingRestrictData);
8654 }
8655 else
8656 m_IsHeadingRestricted = false;
8657 }
8658
8661 {
8662 HumanItemAccessor hia = GetItemAccessor();
8663 HumanItemBehaviorCfg hibcfg = hia.GetItemInHandsBehaviourCfg();
8664 if (hibcfg && hibcfg.m_StanceRotation[m_MovementState.m_iStanceIdx] == DayZPlayerConstants.ROTATION_DISABLE)
8665 {
8666 return DayZPlayerImplementHeading.NoHeading(pDt, pModel, m_fLastHeadingDiff);
8667 }
8668 else
8669 {
8670 m_fLastHeadingDiff = 0;
8671 return DayZPlayerImplementHeading.ClampHeading(pDt, pModel, m_fLastHeadingDiff);
8672 }
8673 }
8674
8675 return super.HeadingModel(pDt, pModel);
8676 }
8677
8679 {
8680 return m_InventorySoftLockCount > 0;
8681 }
8682
8684 override void SetInventorySoftLock(bool status)
8685 {
8686 if (status)
8688 else
8690
8693
8695 }
8696
8697 void SetLoadedQuickBarItemBind(EntityAI entity, int index)
8698 {
8699 if (m_aQuickBarLoad)
8700 m_aQuickBarLoad.Insert(new Param2<EntityAI, int>(entity,index));
8701 }
8702
8703 override bool IsLiftWeapon()
8704 {
8705 return m_LiftWeapon_player;
8706 }
8707
8708 override float GetWeaponObstruction()
8709 {
8710 return m_ObstructWeapon_player;
8711 }
8712
8714 {
8715 Weapon_Base weapon = Weapon_Base.Cast(GetItemInHands());
8716 if (!weapon)
8717 return false;
8718
8719 // Recompute the relative obstruction [0 ... 1] value into actual distance ...
8720 float obstruction = GetWeaponObstruction();
8721
8722 // ... unless there is no obstruction to begin with at which point the
8723 // additional checks are rendered competely irrelevant.
8724 if (obstruction <= 0.0)
8725 {
8726 return false;
8727 }
8728
8729 float penetration = weapon.GetObstructionPenetrationDistance(obstruction);
8730 bool inSights = m_CameraIronsight || m_CameraOptics;
8731 // Create a threshold that allows the user to remain in ADS for lesser obstruction
8732 // values, significantly reducing the continuous state changes near the edge.
8733 if (inSights)
8734 {
8735 return penetration > 0.040; // 4.0 cm
8736 }
8737 // Prevent the user from entering ADS if there is even a tiny fraction of obstruction,
8738 // further reinforcing the statement above.
8739 else
8740 {
8741 return penetration > 0.005; // 0.5 cm
8742 }
8743 }
8744
8745 //Server
8746 bool ReadLiftWeaponRequest(int userDataType, ParamsReadContext ctx)
8747 {
8748 bool state;
8749 float obstruct;
8750 ctx.Read(state);
8751 ctx.Read(obstruct);
8752 SetLiftWeapon(state, obstruct);
8753
8754 return true;
8755 }
8756
8757 void SetLiftWeapon(int pJunctureID, ParamsReadContext ctx) // Obsolete
8758 {
8759 bool state;
8760 float obstruct;
8761 ctx.Read(state);
8762 ctx.Read(obstruct);
8763
8764 SetLiftWeapon(state, obstruct);
8765
8766 //Print("SetLiftWeapon | STS: " + GetSimulationTimeStamp());
8767 }
8768
8769 void SetLiftWeapon(bool state, float obstruct = 0)
8770 {
8771 m_ProcessLiftWeaponState = state;
8772 m_ProcessLiftWeapon = true;
8773 m_ProcessObstructWeapon = obstruct;
8774 }
8775
8777 void SendLiftWeaponSync(bool state, float obstruct = 0)
8778 {
8780
8781 bool liftChange = m_LiftWeapon_player != state;
8782 bool obstructChange = Math.AbsFloat(m_ObstructWeapon_player-obstruct) > 0.03;
8783
8784 // Apply state immediately
8785 m_LiftWeapon_player = state;
8786 m_ObstructWeapon_player = obstruct;
8787
8788 if (liftChange)
8789 {
8790 GetWeaponManager().OnLiftWeapon();
8791 }
8792
8793 if (!liftChange && !obstructChange)
8794 {
8795 // insignificant difference
8796 return;
8797 }
8798
8799 // Notify server to apply same state
8800 if (g_Game.IsMultiplayer() && g_Game.IsClient())
8801 {
8803 if (!ctx.CanStoreInputUserData())
8804 {
8805 // ctx not available??
8806 return;
8807 }
8808
8810 ctx.Write(state);
8811 ctx.Write(obstruct);
8812 ctx.Send();
8813 }
8814 }
8815
8816 override void CheckLiftWeapon()
8817 {
8818 // lift weapon check
8819 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
8820 {
8821 Weapon_Base weap;
8822 if (Weapon_Base.CastTo(weap, GetItemInHands()))
8823 {
8824 Object hitObject;
8825 float obstruct;
8826 bool limited = weap.LiftWeaponCheckEx(this, obstruct, hitObject);
8827 if (weap.UseWeaponObstruction(this, obstruct, hitObject))
8828 {
8829 limited = false;
8830 }
8831 else
8832 {
8833 obstruct = 0.0;
8834 }
8835
8836 obstruct = Math.Clamp( obstruct, 0, 1 );
8837
8838 if (m_LiftWeapon_player != limited || m_ObstructWeapon_player != obstruct)
8839 {
8840 SendLiftWeaponSync(limited, obstruct);
8841 }
8842 }
8843 else if (m_LiftWeapon_player || m_ObstructWeapon_player > 0)
8844 {
8845 SendLiftWeaponSync(false);
8846 }
8847 }
8848 }
8849
8850 override void ProcessLiftWeapon()
8851 {
8852 if (m_ProcessLiftWeapon)
8853 {
8854 bool liftChange = m_LiftWeapon_player != m_ProcessLiftWeaponState;
8855 if (liftChange)
8856 {
8857 GetWeaponManager().OnLiftWeapon();
8858 }
8859 m_LiftWeapon_player = m_ProcessLiftWeaponState;
8860 m_ObstructWeapon_player = m_ProcessObstructWeapon;
8861 m_ProcessLiftWeapon = false;
8862
8863 //Debug.Log("SimulationStamp_server: " + this.GetSimulationTimeStamp());
8864 }
8865 }
8866
8868 override void HideClothing(ItemOptics optic, bool state)
8869 {
8870 super.HideClothing(optic, state);
8871 array<int> clothingArray = new array<int>;
8872 Clothing clothes;
8873
8874 if (state && DayZPlayerCameraOptics.Cast(m_CurrentCamera))
8875 {
8876 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
8877 {
8878 clothingArray.Insert(InventorySlots.BACK);
8879 clothingArray.Insert(InventorySlots.SHOULDER);
8880 clothingArray.Insert(InventorySlots.MELEE);
8882 {
8883 clothingArray.Insert(InventorySlots.BODY);
8884 clothingArray.Insert(InventorySlots.VEST);
8885 }
8886
8887 SetInvisibleRecursive(true,this,clothingArray);
8888 }
8889 }
8890 //showing should be instant (called directly, not via CallLater)
8891 else
8892 {
8893 if (GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
8894 {
8895 clothingArray = {InventorySlots.BACK,InventorySlots.BODY,InventorySlots.VEST,InventorySlots.SHOULDER,InventorySlots.MELEE};
8896
8897 SetInvisibleRecursive(false,this,clothingArray);
8898 }
8899 }
8900 }
8901
8902 void RequestUnconsciousness(bool enable)
8903 {
8905 }
8906
8907 override void SetDeathDarknessLevel(float duration, float tick_time)
8908 {
8909 super.SetDeathDarknessLevel(duration, tick_time);
8910
8911 if (IsControlledPlayer())
8912 {
8913 float actual_tick = tick_time;
8915 m_DamageDealtEffect = null;
8916
8917 if (GetFlashbangEffect())
8918 m_FlashbangEffect = null;
8919
8920 float progress;
8921 if (duration > 0)
8922 progress = 1 - ((duration - m_DeathDarkeningCurrentTime) / duration);
8923
8924 m_DeathDarkeningCurrentTime += actual_tick;
8925
8926 if (!IsAlive() && IsPlayerSelected())
8927 {
8928 m_DeathDarkeningParam.param1 = progress;
8929 PPERequesterBank.GetRequester(PPERequester_DeathDarkening).Start(m_DeathDarkeningParam);
8930 }
8931
8932 if (m_DeathDarkeningCurrentTime >= duration)
8933 {
8934 StopDeathDarkeningEffect();
8935 }
8936 }
8937 else
8938 {
8939 StopDeathDarkeningEffect();
8940 }
8941 }
8942
8943 override bool IsInFBEmoteState()
8944 {
8945 if (!IsEmotePlaying())
8946 return false;
8947
8948 if ((m_EmoteManager.m_Callback && m_EmoteManager.m_Callback.m_IsFullbody) || m_IsSurrendered)
8949 {
8950 return true;
8951 }
8952 return false;
8953 }
8954
8957 {
8958 if (m_EmoteManager)
8959 m_EmoteManager.EndSurrenderRequest(data);
8960 }
8961
8962 override bool IsSurrendered()
8963 {
8964 return m_IsSurrendered;
8965 }
8966
8968 {
8969 return m_PlayerLoaded;
8970 }
8971
8972 //disconnected, caused problems. Awaiting refactor
8974 {
8975 //FB gesture slideposeangle override
8976 if (IsInFBEmoteState() && IsControlledPlayer() && IsPlayerSelected())
8977 {
8978 OverrideSlidePoseAngle(Math.PI2);
8979 }
8980 else if (!IsInFBEmoteState() && IsControlledPlayer() && IsPlayerSelected())
8981 {
8982 OverrideSlidePoseAngle(m_OriginalSlidePoseAngle);
8983 }
8984
8985 //+add more, if needed
8986 }
8987
8988 /*void OnSurrenderEnd()
8989 {
8990 }*/
8991
8992 bool CanRedirectToWeaponManager (notnull EntityAI item, out bool isActionPossible)
8993 {
8994 isActionPossible = false;
8995 Magazine mag = Magazine.Cast(item);
8996 Weapon_Base wpn = Weapon_Base.Cast(item.GetHierarchyParent());
8997 if (mag && wpn)
8998 {
8999 if (GetWeaponManager().CanDetachMagazine(wpn, mag))
9000 {
9001 //Print("[inv] PlayerBase.CanRedirectToWeaponManager OK, can detach mag=" + mag + " from wpn=" + wpn);
9002 isActionPossible = true;
9003 }
9004 else
9005 {
9006 //Print("[inv] PlayerBase.CanRedirectToWeaponManager cannot detach mag=" + mag + " from wpn=" + wpn);
9007 }
9008 return true;
9009 }
9010 return false;
9011 }
9012
9013 // Inventory actions with redirection to weapon manager
9014 override bool PredictiveTakeEntityToTargetInventory (notnull EntityAI target, FindInventoryLocationType flags, notnull EntityAI item)
9015 {
9016 bool can_detach;
9017 if (CanRedirectToWeaponManager(item,can_detach))
9018 {
9020 if (can_detach && target.GetInventory().FindFreeLocationFor(item, flags, il))
9021 {
9022 return GetWeaponManager().DetachMagazine(il);
9023 }
9024 return false;
9025 }
9026 return super.PredictiveTakeEntityToTargetInventory(target, flags, item);
9027 }
9028
9030 {
9031 bool can_detach;
9032 if (CanRedirectToWeaponManager(item,can_detach))
9033 {
9035 if (can_detach && GetInventory().FindFreeLocationFor(item, flags, il))
9036 {
9037 return GetWeaponManager().DetachMagazine(il);
9038 }
9039 return false;
9040 }
9041 return super.PredictiveTakeEntityToInventory(flags, item);
9042 }
9043
9044 override bool PredictiveTakeEntityToTargetAttachment (notnull EntityAI target, notnull EntityAI item)
9045 {
9046 Weapon_Base parentWpn = Weapon_Base.Cast(target);
9047 Magazine mag = Magazine.Cast(item);
9048 if (parentWpn && mag)
9049 {
9050 if (GetWeaponManager().CanAttachMagazine(parentWpn, mag))
9051 return GetWeaponManager().AttachMagazine(mag);
9052
9053 return false;
9054 }
9055 return super.PredictiveTakeEntityToTargetAttachment(target, item);
9056 }
9057
9058 override bool PredictiveTakeEntityToTargetAttachmentEx (notnull EntityAI target, notnull EntityAI item, int slot)
9059 {
9060 Weapon_Base parentWpn = Weapon_Base.Cast(target);
9061 Magazine mag = Magazine.Cast(item);
9062 if (parentWpn && mag)
9063 {
9064 if (target.CanReceiveAttachment(item,slot) && GetWeaponManager().CanAttachMagazine(parentWpn, mag))
9065 return GetWeaponManager().AttachMagazine(mag);
9066
9067 return false;
9068 }
9069 return super.PredictiveTakeEntityToTargetAttachmentEx(target, item,slot);
9070 }
9071
9072 override bool PredictiveTakeEntityToTargetCargo (notnull EntityAI target, notnull EntityAI item)
9073 {
9074 bool can_detach;
9075 if (CanRedirectToWeaponManager(item,can_detach))
9076 {
9078 if (can_detach && target.GetInventory().FindFreeLocationFor(item, FindInventoryLocationType.CARGO, il))
9079 {
9080 return GetWeaponManager().DetachMagazine(il);
9081 }
9082 return false;
9083 }
9084 return super.PredictiveTakeEntityToTargetCargo(target,item);
9085 }
9086
9087 override bool PredictiveTakeEntityToTargetCargoEx (notnull CargoBase cargo, notnull EntityAI item, int row, int col)
9088 {
9089 bool can_detach;
9090 if (CanRedirectToWeaponManager(item, can_detach))
9091 {
9092 if (can_detach)
9093 {
9095 dst.SetCargoAuto(cargo, item, row, col, item.GetInventory().GetFlipCargo());
9096
9097 return GetWeaponManager().DetachMagazine(dst);
9098 }
9099 return false;
9100 }
9101 return super.PredictiveTakeEntityToTargetCargoEx (cargo, item, row, col);
9102 }
9103
9104 override bool PredictiveDropEntity (notnull EntityAI item)
9105 {
9106 bool can_detach;
9107 if (CanRedirectToWeaponManager(item,can_detach))
9108 {
9109 if (can_detach)
9110 {
9111 vector m4[4];
9113
9117 il.SetGround(item, m4);
9118 return GetWeaponManager().DetachMagazine(il);
9119 }
9120 return false;
9121 }
9122 return super.PredictiveDropEntity(item);
9123 }
9124
9125 override bool PredictiveSwapEntities (notnull EntityAI item1, notnull EntityAI item2)
9126 {
9127 //Print("PlayerBase | PredictiveSwapEntities");
9128 Magazine swapmag1 = Magazine.Cast(item1);
9129 Magazine swapmag2 = Magazine.Cast(item2);
9130
9131 if (swapmag1 && swapmag2)
9132 {
9133 Weapon_Base parentWpn;
9134
9135 if (Class.CastTo(parentWpn, swapmag1.GetHierarchyParent()))
9136 {
9137 if (GetWeaponManager().CanSwapMagazine(parentWpn, swapmag2))
9138 {
9139 Print("[inv] PlayerBase.PredictiveSwapEntities: swapping mag1=" + swapmag1 + " to parent wpn=" + parentWpn + " of mag1=" + swapmag1);
9140 return GetWeaponManager().SwapMagazine(swapmag2);
9141 }
9142 else
9143 {
9144 Print("[inv] PlayerBase.PredictiveSwapEntities: can not swap magazines");
9145 return false;
9146 }
9147 }
9148
9149 if (Class.CastTo(parentWpn, swapmag2.GetHierarchyParent()))
9150 {
9151 if (GetWeaponManager().CanSwapMagazine(parentWpn, swapmag1))
9152 {
9153 Print("[inv] PlayerBase.PredictiveSwapEntities: swapping mag1=" + swapmag1 + " to parent wpn=" + parentWpn + " of mag2=" + swapmag2);
9154 return GetWeaponManager().SwapMagazine(swapmag1);
9155 }
9156 else
9157 {
9158 Print("[inv] PlayerBase.PredictiveSwapEntities: can not swap magazines");
9159 return false;
9160 }
9161 }
9162 }
9163
9164 EntityAI item_hands;
9165 EntityAI item_ground;
9166 if (IsSwapBetweenHandsAndGroundLargeItem(item1,item2,item_hands,item_ground) && !m_ActionManager.GetRunningAction())
9167 {
9168 ActionManagerClient mngr_client;
9169 CastTo(mngr_client,m_ActionManager);
9170
9171 ActionTarget atrg = new ActionTarget(item_ground,null,-1,vector.Zero,-1.0);
9172 if (mngr_client.GetAction(ActionSwapItemToHands).Can(this,atrg,ItemBase.Cast(item_hands)))
9173 {
9174 mngr_client.PerformActionStart(mngr_client.GetAction(ActionSwapItemToHands),atrg,ItemBase.Cast(item_hands));
9175 return true;
9176 }
9177 return super.PredictiveSwapEntities(item1, item2);
9178 }
9179 else
9180 return super.PredictiveSwapEntities(item1, item2);
9181 }
9182
9183 override bool PredictiveForceSwapEntities (notnull EntityAI item1, notnull EntityAI item2, notnull InventoryLocation item2_dst)
9184 {
9186 if (item1.IsHeavyBehaviour() && item1.GetInventory().GetCurrentInventoryLocation(il) && il.GetType() == InventoryLocationType.GROUND && !m_ActionManager.GetRunningAction())
9187 {
9188 //Print("override bool PredictiveForceSwapEntities (notnull EntityAI item1, notnull EntityAI item2, notnull InventoryLocation item2_dst)");
9189 ActionManagerClient mngr_client;
9190 CastTo(mngr_client,m_ActionManager);
9191
9192 ActionTarget atrg = new ActionTarget(item1,null,-1,vector.Zero,-1.0);
9193 if (mngr_client.GetAction(ActionSwapItemToHands).Can(this,atrg,ItemBase.Cast(item2)))
9194 {
9195 mngr_client.PerformActionStart(mngr_client.GetAction(ActionSwapItemToHands),atrg,ItemBase.Cast(item2));
9196 }
9197 return true;
9198 }
9199 else
9200 return super.PredictiveForceSwapEntities(item1, item2, item2_dst);
9201 }
9202
9204 {
9205 if (item.IsHeavyBehaviour() && !m_ActionManager.GetRunningAction() && !item.GetHierarchyParent())
9206 {
9207 ActionManagerClient mngr_client;
9208 if (CastTo(mngr_client,m_ActionManager))
9209 {
9210 ActionTarget atrg = new ActionTarget(item,null,-1,vector.Zero,-1.0);
9211
9212 if (mngr_client.GetAction(ActionTakeItemToHands).Can(this,atrg,null))
9213 {
9214 mngr_client.PerformActionStart(mngr_client.GetAction(ActionTakeItemToHands),atrg,null);
9215 }
9216 /*).Can(this,
9217 mngr_client.ActionStart(mngr_client.GetAction(ActionTakeItemToHands),mngr_client.FindActionTarget(),null);
9218 return;*/
9219 }
9220 }
9221 else
9222 super.PredictiveTakeEntityToHands(item);
9223 }
9224
9225 override bool PredictiveTakeToDst (notnull InventoryLocation src, notnull InventoryLocation dst)
9226 {
9227 EntityAI item = src.GetItem();
9228 if (item)
9229 {
9230 bool can_detach;
9231
9232 if (CanRedirectToWeaponManager(item,can_detach))
9233 {
9234 if (can_detach)
9235 {
9236 return GetWeaponManager().DetachMagazine(dst);
9237 }
9238 return false;
9239 }
9240 return super.PredictiveTakeToDst(src,dst);
9241 }
9242 return false;
9243 }
9244
9245 bool IsSwapBetweenHandsAndGroundLargeItem(notnull EntityAI item1, notnull EntityAI item2, out EntityAI item_hands, out EntityAI item_ground)
9246 {
9248 if (item1.GetInventory().GetCurrentInventoryLocation(il) && il.GetType() == InventoryLocationType.HANDS)
9249 item_hands = item1;
9250 if (item2.GetInventory().GetCurrentInventoryLocation(il) && il.GetType() == InventoryLocationType.HANDS)
9251 item_hands = item2;
9252 if (item1.GetInventory().GetCurrentInventoryLocation(il) && il.GetType() == InventoryLocationType.GROUND)
9253 item_ground = item1;
9254 if (item2.GetInventory().GetCurrentInventoryLocation(il) && il.GetType() == InventoryLocationType.GROUND)
9255 item_ground = item2;
9256
9257 return item_hands && item_ground && item_ground.IsHeavyBehaviour();
9258 }
9259
9261 void SetHairLevelToHide(int level, bool state, bool was_debug = false)
9262 {
9263 if (was_debug && GetInstanceType() != DayZPlayerInstanceType.INSTANCETYPE_CLIENT)
9264 return;
9265
9266 if (!m_CharactersHead)
9267 {
9268 ErrorEx("No valid head detected on character!");
9269 return;
9270 }
9271
9272 if (level == -1) //hide/show ALL
9273 {
9275 for (int i = 0; i < m_CharactersHead.m_HeadHairSelectionArray.Count(); ++i)
9276 {
9277 //m_CharactersHead.SetSimpleHiddenSelectionState(i,m_HideHairAnimated);
9278 SelectionTranslation stt = SelectionTranslation.Cast(m_CharactersHead.m_HeadHairHidingStateMap.Get(i));
9280 m_CharactersHead.m_HeadHairHidingStateMap.Set(i, stt);
9281#ifdef DIAG_DEVELOPER
9282#ifndef SERVER
9284 diagmenu.m_HairHidingStateMap.Set(i, m_HideHairAnimated);
9285#endif
9286#endif
9287 }
9288 }
9289 else //hide/show selected level only
9290 {
9291 bool switchState;
9292 if (was_debug)
9293 {
9294#ifdef DIAG_DEVELOPER
9295#ifndef SERVER
9297 switchState = !diagmenuu.m_HairHidingStateMap.Get(level);
9298 diagmenuu.m_HairHidingStateMap.Set(level, switchState);
9299#endif
9300#endif
9301 }
9302 else
9303 {
9304 switchState = !state;
9305 }
9306 //m_CharactersHead.SetSimpleHiddenSelectionState(level,switchState);
9307 stt = SelectionTranslation.Cast(m_CharactersHead.m_HeadHairHidingStateMap.Get(level));
9308 stt.SetSelectionState(switchState);
9309 m_CharactersHead.m_HeadHairHidingStateMap.Set(level, stt); //nescessary?
9310 }
9311 }
9312
9313 void HideHairSelections(ItemBase item, bool state)
9314 {
9315 if (!item || !item.GetHeadHidingSelection() || !m_CharactersHead)
9316 return;
9317
9318 int slot_id; //item currently attached (or detaching from) here
9319 string slot_name; //item currently attached (or detaching from) here
9320 string str
9321 int idx = 0;
9322 int i;
9323 int count;
9324 GameInventory itemInventory = item.GetInventory();
9325 itemInventory.GetCurrentAttachmentSlotInfo(slot_id,slot_name);
9326
9327 if (item.HidesSelectionBySlot())
9328 {
9329 count = itemInventory.GetSlotIdCount();
9330 for (i = 0; i < count; ++i)
9331 {
9332 if (itemInventory.GetSlotId(i) == slot_id)
9333 {
9334 str = item.GetHeadHidingSelection().Get(i);
9335 idx = m_CharactersHead.m_HeadHairSelectionArray.Find(str);
9336 if (idx != -1)
9337 SetHairLevelToHide(idx,state);
9338 #ifdef DEVELOPER
9339 else
9340 Debug.Log("No valid selection '" + str + "' found on head of " + GetType() + ". Verify the p3d, model config, and the 'HAIR_HIDING_SELECTIONS' macro in basicDefines.");
9341 #endif
9342 }
9343 }
9344 }
9345 else
9346 {
9347 count = item.GetHeadHidingSelection().Count();
9348 for (i = 0; i < count; i++)
9349 {
9350 str = item.GetHeadHidingSelection().Get(i);
9351 idx = m_CharactersHead.m_HeadHairSelectionArray.Find(str);
9352 if (idx != -1)
9353 SetHairLevelToHide(idx,state);
9354 #ifdef DEVELOPER
9355 else
9356 Debug.Log("No valid selection '" + str + "' found on head of " + GetType() + ". Verify the p3d, model config, and the 'HAIR_HIDING_SELECTIONS' macro in basicDefines.");
9357 #endif
9358 }
9359 }
9361 }
9362
9363 void UpdateHairSelectionVisibility(bool was_debug = false)
9364 {
9365 if (!m_CharactersHead)
9366 return;
9367 bool shown;
9368 bool exception_hidden = false;
9369 int i;
9370 int count = m_CharactersHead.m_HeadHairHidingStateMap.Count();
9372
9373 //hide/show beard
9374 if (IsMale() && m_CharactersHead.GetBeardIndex() > -1 && !was_debug)
9375 {
9376 SetHairLevelToHide(m_CharactersHead.GetBeardIndex(),GetLifeSpanState() != LifeSpanState.BEARD_EXTRA);
9377 }
9378
9379 //show all first
9380 for (i = 0; i < count; i++)
9381 {
9382 m_CharactersHead.SetSimpleHiddenSelectionState(i,true);
9383 }
9384 //then carve it up
9385 for (i = 0; i < count; i++)
9386 {
9387 stt = m_CharactersHead.m_HeadHairHidingStateMap.Get(i);
9388 shown = stt.GetSelectionState();
9389 if (!shown)
9390 {
9391 if (/*IsMale() && */!m_CharactersHead.IsHandlingException())
9392 {
9393 m_CharactersHead.SetSimpleHiddenSelectionState(i,shown);
9395 //Print("hidden idx: " + i);
9396 }
9397 else
9398 {
9399 exception_hidden = true;
9400 }
9401 }
9402 }
9403
9404 //exceptions handled differently; hides hair
9405 if (exception_hidden)
9406 {
9407 m_CharactersHead.SetSimpleHiddenSelectionState(m_CharactersHead.GetHairIndex(),false);
9408 if (IsMale())
9409 m_CharactersHead.SetSimpleHiddenSelectionState(m_CharactersHead.GetBeardIndex(),false);
9410 }
9411 }
9412
9414 {
9415 int index;
9416 array<int> translatedSelectinosArray = stt.GetTranslatedSelections();
9417 for (int i = 0; i < translatedSelectinosArray.Count(); i++)
9418 {
9419 index = translatedSelectinosArray.Get(i);
9420 //if (index > -1)
9421 m_CharactersHead.SetSimpleHiddenSelectionState(index,false); //safe this way, only hiding/carving from shown parts
9422 }
9423 }
9424
9427 {
9428 ItemBase headgear = ItemBase.Cast(GetInventory().FindAttachment(InventorySlots.HEADGEAR));
9429 ItemBase mask = ItemBase.Cast(GetInventory().FindAttachment(InventorySlots.MASK));
9430
9431 HideHairSelections(headgear,true);
9432 HideHairSelections(mask,true);
9433 }
9434
9436 {
9437 return m_ActiveNVTypes && m_ActiveNVTypes.Count() > 0;
9438 }
9439
9441 {
9442 return m_LoweredNVGHeadset;
9443 }
9444
9446 {
9447 if (!m_ActiveNVTypes || m_ActiveNVTypes.Count() == 0)
9448 {
9449 return NVTypes.NONE;
9450 }
9451 else
9452 {
9453 return m_ActiveNVTypes[m_ActiveNVTypes.Count() - 1];
9454 }
9455 }
9456
9458 {
9459 return m_ActiveNVTypes;
9460 }
9461
9462 void SetNVGLowered(bool state)
9463 {
9464 m_LoweredNVGHeadset = state;
9465 }
9466
9467 void AddActiveNV(int type)
9468 {
9469 if (!m_ActiveNVTypes || (g_Game.IsMultiplayer() && g_Game.IsServer()))
9470 {
9471 #ifdef DEVELOPER
9472 Error("AddActiveNV | illegal server-side call!");
9473 #endif
9474
9475 return;
9476 }
9477
9478 if (m_ActiveNVTypes.Find(type) == -1)
9479 m_ActiveNVTypes.Insert(type);
9480 }
9481
9482 void RemoveActiveNV(int type)
9483 {
9484 if (!m_ActiveNVTypes || (g_Game.IsMultiplayer() && g_Game.IsServer()))
9485 {
9486 #ifdef DEVELOPER
9487 Error("RemoveActiveNV | illegal server-side call!");
9488 #endif
9489
9490 return;
9491 }
9492
9493 if (m_ActiveNVTypes.Find(type) != -1)
9494 m_ActiveNVTypes.RemoveItem(type);
9495 }
9496
9498 {
9499 m_ActiveNVTypes.Clear();
9500 }
9501
9502#ifdef DEVELOPER
9503 override string GetDebugText()
9504 {
9505 string text = super.GetDebugText();
9506 /*
9507 text += "GetMovementTimeToStrafeJog:" + CfgGameplayHandler.GetMovementTimeToStrafeJog() + "\n";
9508 text += "GetMovementTimeToStrafeSprint:" + CfgGameplayHandler.GetMovementTimeToStrafeSprint()+ "\n";
9509
9510 SHumanCommandMoveSettings moveSettings = GetDayZPlayerType().CommandMoveSettingsW();
9511 if (moveSettings)
9512 {
9513 text += "hmcs.m_fDirFilterTimeout:" + moveSettings.m_fDirFilterTimeout + "\n";
9514 text += "hmcs.m_fDirFilterSprintTimeout:" + moveSettings.m_fDirFilterSprintTimeout+ "\n";
9515 }*/
9516
9517 text += string.Format("UndergroundPresence: %1", EnumTools.EnumToString(EUndergroundPresence, m_UndergroundPresence));
9518
9519 return text;
9520 }
9521
9522
9523
9524 void DEBUGRotateNVG()
9525 {
9526 NVGoggles nvg;
9527
9528 if (FindAttachmentBySlotName("Eyewear"))
9529 {
9530 nvg = NVGoggles.Cast(FindAttachmentBySlotName("Eyewear").FindAttachmentBySlotName("NVG"));
9531 }
9532 else if (FindAttachmentBySlotName("Headgear"))
9533 {
9534 nvg = NVGoggles.Cast(FindAttachmentBySlotName("Headgear").FindAttachmentBySlotName("NVG"));
9535 }
9536
9537 if (nvg)
9538 {
9539 nvg.RotateGoggles(nvg.m_IsLowered);
9540 }
9541 }
9542#endif
9543
9544 void AdjustBandana(EntityAI item, string slot_name)
9545 {
9546 if (Bandana_ColorBase.Cast(item))
9547 {
9548 if (slot_name == "Headgear")
9549 {
9550 item.SetSimpleHiddenSelectionState(0,1);
9551 item.SetSimpleHiddenSelectionState(1,0);
9552 }
9553 else if (slot_name == "Mask")
9554 {
9555 item.SetSimpleHiddenSelectionState(0,0);
9556 item.SetSimpleHiddenSelectionState(1,1);
9557 }
9558 }
9559 }
9560
9561 void AdjustShemag(EntityAI item, string slot_name)
9562 {
9563 if (Shemag_ColorBase.Cast(item))
9564 {
9565 if (slot_name == "Headgear")
9566 {
9567 item.SetSimpleHiddenSelectionState(0,1);
9568 item.SetSimpleHiddenSelectionState(1,0);
9569 }
9570 else if (slot_name == "Mask")
9571 {
9572 item.SetSimpleHiddenSelectionState(0,0);
9573 item.SetSimpleHiddenSelectionState(1,1);
9574 }
9575 }
9576 }
9577
9578 void AdjustKeffiyeh(EntityAI item, string slot_name)
9579 {
9580 if (Keffiyeh_ColorBase.Cast(item))
9581 {
9582 if (slot_name == "Headgear")
9583 {
9584 item.SetSimpleHiddenSelectionState(0,1);
9585 item.SetSimpleHiddenSelectionState(1,0);
9586 }
9587 else if (slot_name == "Mask")
9588 {
9589 item.SetSimpleHiddenSelectionState(0,0);
9590 item.SetSimpleHiddenSelectionState(1,1);
9591 }
9592 }
9593 }
9594
9595 //client-side
9597 {
9598 //Print("---Prettying up corpses... | " + g_Game.GetTime() + " | " + this + " | " + GetType() + "---");
9599 //Print("m_DecayedTexture = " + m_DecayedTexture);
9600 int state = Math.AbsInt(m_CorpseState);//negative sign denotes a special meaning(state was forced to a live player), but we are only intetested in the positive value here
9602 {
9603 EntityAI bodypart;
9604 ItemBase item;
9605
9606 string path;
9607 int idx;
9608 int slot_id;
9609 array<string> bodyparts = {"Gloves","Body","Legs","Feet"};
9610
9611 GameInventory inventory = GetInventory();
9612 int nBodyparts = bodyparts.Count();
9613 for (int i = 0; i < nBodyparts; ++i)
9614 {
9615 slot_id = InventorySlots.GetSlotIdFromString(bodyparts.Get(i));
9616 bodypart = inventory.FindPlaceholderForSlot(slot_id);
9617 item = ItemBase.Cast(inventory.FindAttachment(slot_id));
9618
9619 if (bodypart)
9620 {
9621 path = "cfgVehicles " + bodypart.GetType();
9622 idx = bodypart.GetHiddenSelectionIndex("personality");
9623 if (idx > -1)
9624 {
9625 bodypart.SetObjectTexture(idx,m_DecayedTexture);
9626 }
9627 }
9628 if (item)
9629 {
9630 path = "cfgVehicles " + item.GetType();
9631 idx = item.GetHiddenSelectionIndex("personality");
9632 if (idx > -1)
9633 {
9634 item.SetObjectTexture(idx,m_DecayedTexture);
9635 }
9636 }
9637 }
9638
9639 SetFaceTexture(m_DecayedTexture);
9640 }
9641 }
9642
9643 void SetDecayEffects(int effect = -1)
9644 {
9645 #ifndef NO_GUI
9646 return;
9647 #endif
9648
9649 int boneIdx = GetBoneIndexByName("Spine2");
9650 Particle p;
9651
9652 switch (effect)
9653 {
9655 //play medium sound/flies particle
9656 if (!m_FliesEff)
9658
9660 {
9661 m_FliesEff.SetDecalOwner(this);
9663 p = m_FliesEff.GetParticle();
9664 AddChild(p, boneIdx);
9665 if (!m_SoundFliesEffect)
9666 {
9667 PlaySoundSetLoop(m_SoundFliesEffect, "Flies_SoundSet", 1.0, 1.0);
9668 }
9669 }
9670 break;
9672 //play serious sound/flies particle
9673 if (!m_FliesEff)
9675
9677 {
9678 m_FliesEff.SetDecalOwner(this);
9680 p = m_FliesEff.GetParticle();
9681 AddChild(p, boneIdx);
9682 if (!m_SoundFliesEffect)
9683 {
9684 PlaySoundSetLoop(m_SoundFliesEffect, "Flies_SoundSet", 1.0, 1.0);
9685 }
9686 }
9687 break;
9688 //remove
9689 default:
9691 StopSoundSet(m_SoundFliesEffect);
9692 break;
9693 }
9694 }
9695
9697 {
9698 int idx = GetHiddenSelectionIndex("decay_preload");
9699 if (idx > -1)
9700 SetObjectTexture(idx, m_DecayedTexture);
9701 }
9702
9703 void SetLastMapInfo(float scale, vector pos)
9704 {
9705 m_LastMapScale = scale;
9706 m_LastMapPos = pos;
9707 }
9708
9709 bool GetLastMapInfo(out float scale, out vector pos)
9710 {
9711 scale = m_LastMapScale;
9712 pos = m_LastMapPos;
9713
9714 return m_LastMapScale != -1.0;
9715 }
9716
9717 override bool PhysicalPredictiveDropItem(EntityAI entity, bool heavy_item_only = true)
9718 {
9719 vector dir;
9720 ItemBase item = ItemBase.Cast(entity);
9721
9723 if (GetItemInHands() == item)
9724 {
9725 return PredictiveDropEntity(item);
9726 }
9727 else
9728 {
9730 if (actionManager)
9731 {
9732 ActionTarget actionTarget = new ActionTarget(null, null, -1, vector.Zero, -1);
9733 if (actionManager.GetAction(ActionDropItemSimple).Can(this, actionTarget, item))
9734 {
9735 actionManager.PerformActionStart(actionManager.GetAction(ActionDropItemSimple), actionTarget, item);
9736 return true;
9737 }
9738 }
9739 else
9740 return true;
9741 }
9742
9743 return false;
9744 }
9745
9746 override void SetProcessUIWarning(bool state)
9747 {
9748 m_ProcessUIWarning = state;
9749 }
9750
9751 void dmgDebugPrint(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
9752 {
9753 /*Print("ProjectileDebugging | Damage Health: " + damageResult.GetDamage(dmgZone,"Health") + " | Component: " + component + " | Zone: " + dmgZone + "| Timestamp: " + GetSimulationTimeStamp());
9754 Print("ProjectileDebugging | speedCoef: " + speedCoef);
9755 Print("ProjectileDebugging | GetWorldTime(): " + GetWorldTime());
9756 Print("-----------------------------------------------");*/
9757 }
9758
9759 //Use this method to process additionnal dmg to legs specifically (must use the dmg system to fire relevant events)
9760 //Legzone is a dummy to inflict damage once and NOT transfer damage to other zones. All leg zones will drop to 0 anyway
9761 void DamageAllLegs(float inputDmg)
9762 {
9763 array<string> legZones = new array<string>;
9764 legZones.Insert("LeftLeg");
9765 legZones.Insert("RightLeg");
9766 legZones.Insert("RightFoot");
9767 legZones.Insert("LeftFoot");
9768
9769 foreach (string legZone : legZones)
9770 DecreaseHealth(legZone, "", inputDmg);
9771 }
9772
9774 void TryHideItemInHands(bool hide, bool force = false)
9775 {
9776 ItemBase item = GetItemInHands();
9777
9778 if (!hide && ((!IsSwimming() && !IsClimbingLadder() && !IsInVehicle() && !AnimCommandCheck(HumanMoveCommandID.CommandSwim | HumanMoveCommandID.CommandLadder | HumanMoveCommandID.CommandVehicle)) || force))
9779 {
9780 SetEnergyManagerState(item, true);
9781 GetItemAccessor().HideItemInHands(false);
9782 }
9783 else
9784 {
9785 SetEnergyManagerState(item, false);
9786 GetItemAccessor().HideItemInHands(true);
9787 }
9788 }
9789
9792 {
9794 if (target.GetInventory().FindFreeLocationFor(item, flags, il))
9795 {
9797 }
9798 return false;
9799 }
9800
9802 {
9803 int slotID = il.GetSlot();
9804 float stackableTarget = item.GetTargetQuantityMax(slotID);
9805 if (stackableTarget > 0 && stackableTarget < item.GetQuantity())
9806 {
9807 ItemBase itemB;
9808 if (CastTo(itemB, item))
9809 {
9810 itemB.SplitIntoStackMaxToInventoryLocationClient(il);
9811 return true;
9812 }
9813 }
9814 return false;
9815 }
9816
9817 override protected bool TakeEntityToInventoryImpl(InventoryMode mode, FindInventoryLocationType flags, notnull EntityAI item)
9818 {
9819 if (CheckAndExecuteStackSplit(flags, item, this))
9820 {
9821 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2Inv(SPLIT) item=" + GetDebugName(item));
9822 return true;
9823 }
9824
9825 return super.TakeEntityToInventoryImpl(mode, flags, item);
9826 }
9827
9829 {
9831 {
9832 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2Hands(SPLIT) item=" + GetDebugName(item));
9833 return;
9834 }
9835
9836 super.TakeEntityToHandsImpl(mode, item);
9837 }
9838
9839 override protected bool TakeEntityToTargetInventoryImpl(InventoryMode mode, notnull EntityAI target, FindInventoryLocationType flags, notnull EntityAI item)
9840 {
9841 if (CheckAndExecuteStackSplit(flags, item, target))
9842 {
9843 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2TargetInv(SPLIT) item=" + GetDebugName(item));
9844 return true;
9845 }
9846
9847 return super.TakeEntityToTargetInventoryImpl(mode, target, flags, item);
9848 }
9849
9850 override protected bool TakeEntityToTargetCargoImpl(InventoryMode mode, notnull EntityAI target, notnull EntityAI item)
9851 {
9853 {
9854 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2TargetCgo(SPLIT) item=" + GetDebugName(item));
9855 return true;
9856 }
9857
9858 return super.TakeEntityToTargetCargoImpl(mode, target, item);
9859 }
9860
9861 override protected bool TakeEntityToTargetAttachmentImpl(InventoryMode mode, notnull EntityAI target, notnull EntityAI item)
9862 {
9863 if (CheckAndExecuteStackSplit(FindInventoryLocationType.ATTACHMENT, item, target))
9864 {
9865 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2TargetAtt(SPLIT) item=" + GetDebugName(item));
9866 return true;
9867 }
9868
9869 return super.TakeEntityToTargetAttachmentImpl(mode, target, item);
9870 }
9871
9872 override protected bool TakeToDstImpl(InventoryMode mode, notnull InventoryLocation src, notnull InventoryLocation dst)
9873 {
9874 if (CheckAndExecuteStackSplitToInventoryLocation(dst, dst.GetItem()))
9875 {
9876 if (LogManager.IsSyncLogEnable()) syncDebugPrint("[inv] " + GetDebugName(this) + " STS=" + GetSimulationTimeStamp() + " Take2Dst(SPLIT) item=" + GetDebugName(dst.GetItem()));
9877 return true;
9878 }
9879
9880 return super.TakeToDstImpl(mode, src, dst);
9881 }
9882
9884 {
9885 return GetBonePositionWS(GetBoneIndexByName("spine3"));
9886 }
9887
9888
9889 // contaminated areas - temp stuff
9891 {
9893 {
9894 float playerSpeed = GetCommand_Move().GetCurrentMovementSpeed();
9895 //Print(playerSpeed);
9896
9897 // 1 - prone, crouch
9898 // 2 - jog
9899 // 3 - sprint
9900 float particleLifetime = 5.25;
9901 float particleSpeed = 0.25;
9902 if (playerSpeed >= 1)
9903 {
9904 particleLifetime = 3.5;
9905 particleSpeed = 3.25;
9906 }
9907 if (playerSpeed >= 2)
9908 {
9909 particleLifetime = 2.5;
9910 particleSpeed = 5.25;
9911 }
9912 if (playerSpeed >= 3)
9913 {
9914 particleLifetime = 1.5;
9915 particleSpeed = 8.25;
9916 }
9917 m_ContaminatedAroundPlayer.SetParameter(0, EmitorParam.LIFETIME, particleLifetime);
9918 m_ContaminatedAroundPlayer.SetParameter(1, EmitorParam.LIFETIME, particleLifetime);
9919 m_ContaminatedAroundPlayer.SetParameter(2, EmitorParam.LIFETIME, particleLifetime);
9920 m_ContaminatedAroundPlayer.SetParameter(3, EmitorParam.LIFETIME, particleLifetime);
9921
9922 m_ContaminatedAroundPlayerTiny.SetParameter(0, EmitorParam.VELOCITY, particleSpeed);
9923 vector transform[4];
9924 GetTransform(transform);
9925 m_ContaminatedAroundPlayer.SetTransform(transform);
9926 m_ContaminatedAroundPlayerTiny.SetTransform(transform);
9927 }
9928 }
9929
9931 {
9932 if (!IsControlledPlayer())
9933 return;
9934 int i;
9935
9937 {
9938 for (i = 0; i < m_ProcessRemoveGlassesEffects.Count(); i++)
9939 {
9940 PPERequesterBank.GetRequester(m_ProcessRemoveGlassesEffects[i]).Stop();
9941 }
9943 }
9944
9946 {
9947 for (i = 0; i < m_ProcessAddGlassesEffects.Count(); i++)
9948 {
9949 PPERequesterBank.GetRequester(m_ProcessAddGlassesEffects[i]).Start();
9950 }
9952 }
9953 }
9954
9955 override void AddArrow(Object arrow, int componentIndex, vector closeBonePosWS, vector closeBoneRotWS)
9956 {
9958 GetActionComponentNameList(componentIndex, CachedObjectsArrays.ARRAY_STRING, LOD.NAME_FIRE);
9959
9960 int pivot = componentIndex;
9961 int newPivot = -1;
9962 string compName;
9963 for (int i = 0; i < CachedObjectsArrays.ARRAY_STRING.Count() && newPivot == -1; i++)
9964 {
9965 compName = CachedObjectsArrays.ARRAY_STRING.Get(i);
9966 newPivot = GetBoneIndexByName(compName);
9967
9968 }
9969
9970 if (newPivot != -1)
9971 {
9972 pivot = newPivot;
9973
9974 }
9975
9976 vector parentTransMat[4];
9977 vector arrowTransMat[4];
9978
9979 arrow.GetTransform(arrowTransMat);
9980
9981 if (pivot == -1)
9982 {
9983 GetTransformWS(parentTransMat);
9984 }
9985 else
9986 {
9987 vector rotMatrix[3];
9988 Math3D.YawPitchRollMatrix(closeBoneRotWS * Math.RAD2DEG,rotMatrix);
9989
9990 parentTransMat[0] = rotMatrix[0];
9991 parentTransMat[1] = rotMatrix[1];
9992 parentTransMat[2] = rotMatrix[2];
9993 parentTransMat[3] = closeBonePosWS;
9994 }
9995
9996 Math3D.MatrixInvMultiply4(parentTransMat, arrowTransMat, arrowTransMat);
9997 Math3D.MatrixOrthogonalize4(arrowTransMat);
9998 arrow.SetTransform(arrowTransMat);
9999
10000 AddChild(arrow, pivot);
10001
10002 #ifdef SERVER
10003 // creating bleeding source
10004 BleedingSourcesManagerServer bleedingManager = GetBleedingManagerServer();
10005 if (bleedingManager)
10006 {
10007 if (!bleedingManager.AttemptAddBleedingSourceBySelection(compName))
10008 bleedingManager.AttemptAddBleedingSourceBySelection("Pelvis");//fallback, if we can't attach bleeding source to the fallback location because there already is another one, it's fine, we are just trying make sure there is at least one
10009 }
10010 #endif
10011 }
10012
10013 override bool IsManagingArrows()
10014 {
10015 return true;
10016 }
10017
10019 {
10020 return m_CachedPlayerName;
10021 }
10022
10024 {
10025 return m_CachedPlayerID;
10026 }
10027
10029 {
10030 super.OnFreezeStateChangeClient();
10031
10033 }
10034
10036 {
10037 return m_HasHeatBuffer;
10038 }
10039
10041 {
10042 return m_HeatBufferStage;
10043 }
10044
10048
10051
10053
10056
10058
10059 void SwitchItemTypeAttach(EntityAI item, string slot)
10060 {
10061 if (!g_Game.IsServer())
10062 return;
10063 }
10064
10065 void SwitchItemTypeDetach(EntityAI item, string slot);
10066 void AddToEnvironmentTemperature(float pTemperature);
10067
10069 {
10071 }
10072
10074 {
10076 }
10077
10078 bool Consume(ItemBase source, float amount, EConsumeType consume_type)
10079 {
10080 PlayerConsumeData consumeData = new PlayerConsumeData();
10081 consumeData.m_Type = consume_type;
10082 consumeData.m_Amount = amount;
10083 consumeData.m_Source = source;
10084 consumeData.m_Agents = 0;
10085
10086 return Consume(consumeData);
10087 }
10088
10090 {
10091 if (!GetStaminaHandler())
10092 return false;
10093
10094 return GetStaminaHandler().GetStamina() > 0;
10095 }
10096
10098 {
10099 InsertAgent(eAgents.SALMONELLA, 1);
10100 }
10101
10102 override void DepleteStamina(EStaminaModifiers modifier, float dT = -1)
10103 {
10104 if (GetStaminaHandler())
10105 GetStaminaHandler().DepleteStaminaEx(modifier,dT);
10106 }
10107
10108 [Obsolete("use the GetUndergroundHandler instead")]
10113
10114 [Obsolete("no replacement")]
10115 void SetNVGWorking(bool state)
10116 {
10117 //Deprecated, below is for legacy's sake
10118 AddActiveNV(NVTypes.NV_GOGGLES);
10119 }
10120
10121 [Obsolete("not used but kept in the case of modders needing/using it")]
10122 void AntibioticsAttack(float value)
10123 {
10124 m_AgentPool.DrugsAttack(EMedicalDrugsType.ANTIBIOTICS, value);
10125 }
10126
10127 [Obsolete("1.30: Not used but kept in the case of modders needing/using it")]
10128 void SetPlayerLoad(float load)//Deprecated
10129 {
10130 m_CargoLoad = load;
10131 }
10132
10133 [Obsolete("1.30: Not used but kept in the case of modders needing/using it")]
10134 void AddPlayerLoad(float addedload)//Deprecated
10135 {
10136 float newload = GetPlayerLoad() + addedload;
10137 SetPlayerLoad(newload);
10138 }
10139}
10140
10141
10142#ifdef DEVELOPER
10144#endif
Param4< int, int, string, int > TSelectableActionInfoWithColor
void syncDebugPrint(string s)
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
const int INPUT_UDT_UNDERGROUND_SYNC
const int INPUT_UDT_INVENTORY
const int INPUT_UDT_ITEM_MANIPULATION
const int INPUT_UDT_RESET_ADS
const int INPUT_UDT_WEAPON_LIFT_EVENT
const int INPUT_UDT_USER_MUTE_XBOX
const int INPUT_UDT_GESTURE
const int INPUT_UDT_ADVANCED_PLACEMENT
eBleedingSourceType GetType()
void ActionBase()
Определения ActionBase.c:82
bool CanBePerformedWhileChangingStance()
Condition used in PlayerBase::CanChangeStance to check if stance can be changed while action is perfo...
Определения ActionBase.c:346
ActionBuildPart ActionContinuousBase ActionBuildPartHandsGeneric()
Определения ActionBuildPart.c:379
void ActionDrinkPondContinuous()
Определения ActionDrinkPondContinuous.c:16
ActionEatSnowContinuousCB ActionContinuousBaseCB ActionEatSnowContinuous()
Определения ActionEatSnowContinuous.c:11
void ActionManagerBase(PlayerBase player)
Определения ActionManagerBase.c:63
map< typename, ref array< ActionBase_Basic > > TInputActionMap
Определения ActionManagerClient.c:1
ActionStartCarCB ActionContinuousBaseCB ActionStartEngine()
Определения ActionStartEngine.c:11
ActionStartEngineBoatCB ActionContinuousBaseCB ActionStartEngineBoat()
Определения ActionStartEngineBoat.c:11
ActionStartEngineMotorbikeCB ActionContinuousBaseCB ActionStartEngineMotorbike()
Определения ActionStartEngineMotorBike.c:11
void ActionTarget(Object object, Object parent, int componentIndex, vector cursorHitPos, float utility, string surfaceName="")
Определения ActionTargets.c:125
ActionUncoverHeadBase ActionContinuousBase ActionUncoverHeadSelf()
Определения ActionUncoverHeadSelf.c:46
ActionWashHandsSnowCB ActionContinuousBaseCB ActionWashHandsSnow()
Определения ActionWashHandsSnow.c:11
ActionWashHandsWaterCB ActionContinuousBaseCB ActionWashHandsWater()
Определения ActionWashHandsWater.c:11
ActionWashHeadWaterCB ActionContinuousBaseCB ActionWashHeadWater()
Определения ActionWashHeadWater .c:11
void AddAction(typename actionName)
Определения AdvancedCommunication.c:220
void RemoveAction(typename actionName)
Определения AdvancedCommunication.c:252
void InitializeActions()
Определения AdvancedCommunication.c:190
override ArrowManagerBase GetArrowManager()
Определения AnimalBase.c:73
const int BREATH_VAPOUR_LEVEL_MAX
Определения BreathVapourMdfr.c:1
void EffectRadial(Param param1, Param param2)
Определения BulletHitReaction.c:59
string Debug()
Определения CachedEquipmentStorageBase.c:26
const int ECE_EQUIP_ATTACHMENTS
Определения CentralEconomy.c:21
const int ECE_PLACE_ON_SURFACE
Определения CentralEconomy.c:38
const int ECE_INITAI
Определения CentralEconomy.c:18
const int ECE_KEEPHEIGHT
Определения CentralEconomy.c:28
const int ECE_IN_INVENTORY
Определения CentralEconomy.c:37
const int RF_DEFAULT
Определения CentralEconomy.c:66
PlayerSpawnPresetDiscreteItemSetSlotData name
one set for cargo
bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения CodeLockComponent.c:264
int GetId()
Определения ConstructionPart.c:725
void GetActionManager()
Определения CrossHairSelector.c:131
DamageType
exposed from C++ (do not change)
Определения DamageSystem.c:11
proto native void SetAnimationInstanceByName(string animation_instance_name, int instance_uuid, float duration)
proto native int GetBoneIndexByName(string pBoneName)
returns bone index for a name (-1 if pBoneName doesn't exist)
DayZGame g_Game
Определения DayZGame.c:4074
override Widget Init()
Определения DayZGame.c:127
DayZGame GetDayZGame()
Определения DayZGame.c:4076
ref HumanMovementState m_MovementState
movement state
Определения DayZPlayerCamera3rdPerson.c:324
NVTypes
Определения DayZPlayerCamera_Base.c:55
void DayZPlayerCameraOptics(DayZPlayer pPlayer, HumanInputController pInput)
Определения DayZPlayerCameraIronsights.c:367
void AbortWeaponEvent()
Определения DayZPlayerInventory.c:284
override bool OnInventoryCheck(int userDataType, ParamsReadContext ctx)
Определения DayZPlayerInventory.c:5003
ref DayZPlayerImplementMeleeCombat m_MeleeCombat
void DayZPlayerUtils()
cannot be instantiated
Определения DayZPlayerUtils.c:465
DisplayElementBase GetElement(eDisplayElements element_id)
Определения DisplayStatus.c:96
Mission mission
Определения DisplayStatus.c:28
void VirtualHud(PlayerBase player)
Определения DisplayStatus.c:36
vector position
Определения DustKickupEffects.c:20
EActions
Определения EActions.c:2
eAgents
Определения EAgents.c:3
eBrokenLegs
Определения EBrokenLegs.c:2
EConsumeType
Определения EConsumeType.c:2
DiagMenuIDs
Определения EDiagMenuIDs.c:2
EMedicalDrugsType
Определения EMedicalDrugsType.c:2
eMixedSoundStates
bits
Определения EMixedSoundStates.c:3
EPlayerStates
Определения EPlayerStates.c:2
EPulseType
Определения EPulseType.c:2
ERPCs
Определения ERPCs.c:2
EStaminaConsumers
Определения EStaminaConsumers.c:2
EStaminaModifiers
Определения EStaminaModifiers.c:2
EStatLevels
Определения EStatLevels.c:2
bool Consume(float amount, PlayerBase consumer)
Определения Edible_Base.c:1207
void EmoteManager(PlayerBase player)
Определения EmoteManager.c:160
bool IsControllsLocked()
Определения EmoteManager.c:1021
ref InventoryLocation m_HandInventoryLocation
Определения EmoteManager.c:124
bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
Определения EmoteManager.c:517
bool IsEmotePlaying()
Определения EmoteManager.c:1328
proto string ToString()
bool IsProcessing()
returns true when FP is heating or cooling
Определения FireplaceBase.c:1663
proto GizmoApi GetGizmoApi()
HandStateID
states
Определения Hand_States.c:4
override int GetCurrentStateID()
Определения Hand_States.c:29
proto native Hive GetHive()
eInjuryHandlerLevels
Определения InjuryHandler.c:19
void InjuryAnimationHandler(PlayerBase player)
Определения InjuryHandler.c:59
FindInventoryLocationType
flags for searching locations in inventory
Определения InventoryLocation.c:18
InventoryLocationType
types of Inventory Location
Определения InventoryLocation.c:4
class BoxCollidingParams component
ComponentInfo for BoxCollidingResult.
override void InsertAgent(int agent, float count=1)
Определения ItemBase.c:3984
EntityAI SpawnItemOnLocation(string object_name, notnull InventoryLocation loc, bool full_quantity)
Определения ItemBase.c:4952
static string GetDisplayName(int liquid_type)
Определения Liquid.c:383
void MapNavigationBehaviour(PlayerBase pPlayer, EMapNavigationType pNavigationType=EMapNavigationType.BASIC)
Определения MapNavigationBehaviour.c:27
string GetDebugText()
Определения ModifierBase.c:71
eModifierSyncIDs
Определения ModifiersManager.c:3
void ModifiersManager(PlayerBase player)
Определения ModifiersManager.c:80
MotorbikeOwnerState TransportOwnerState GetOwnerStateType()
Native class for motorbikes - handles physics simulation.
Определения Motorbike.c:33
override event GetMoveType()
Определения Motorbike.c:39
void NotifiersManager(PlayerBase player)
Определения NotifiersManager.c:49
void OnScheduledTick()
Определения NotifiersManager.c:303
VirtualHud GetVirtualHud()
Определения NotifiersManager.c:110
string path
Определения OptionSelectorMultistate.c:142
PPERequesterCategory
Определения PPEConstants.c:29
void ParticleManager(ParticleManagerSettings settings)
Constructor (ctor)
Определения ParticleManager.c:88
PersistentFlag
Определения PersistentFlag.c:6
void PlayerSoundEventHandler(PlayerBase player)
Определения PlayerSoundEventHandler.c:55
EPlayerSoundEventID
Определения PlayerSoundEventHandler.c:3
void PlayerSoundManagerClient(PlayerBase player)
Определения PlayerSoundManager.c:102
override float Get()
Определения PlayerStatBase.c:134
void PlayerStat(T min, T max, T init, string label, int flags)
Определения PlayerStatBase.c:43
bool LoadStats(ParamsReadContext ctx, int version)
Определения PlayerStats.c:115
void PlayerStats(Man player)
Определения PlayerStats.c:19
EPlayerStats_current
Определения PlayerStatsPCO.c:357
void PlayerStomach(PlayerBase player)
Определения PlayerStomach.c:142
PluginConfigDebugProfile m_ConfigDebugProfile
Определения PluginItemDiagnostic.c:58
void PluginItemDiagnostic()
Определения PluginItemDiagnostic.c:74
void PluginLifespan()
Определения PluginLifespan.c:45
eBloodyHandsTypes
Определения PluginLifespan.c:9
PluginManager GetPluginManager()
Returns registred plugin by class type, better is to use global funtion GetPlugin(typename plugin_typ...
Определения PluginManager.c:284
PluginBase GetPlugin(typename plugin_type)
Определения PluginManager.c:326
void PluginPresenceNotifier()
Определения PluginPresenceNotifier.c:107
EPresenceNotifierNoiseEventType
Определения PluginPresenceNotifier.c:2
void QuickBarBase(PlayerBase player)
Определения QuickBarBase.c:21
PlayerBase _player
Определения QuickBarBase.c:18
void RandomGeneratorSyncManager(DayZPlayer player)
Определения RandomGeneratorSyncManager.c:18
const float DEFAULT_SPAWN_DISTANCE
Определения RecipeBase.c:3
void ReplaceSoundEventHandler(PlayerBase player)
Определения ReplaceSoundEventHandler.c:27
ESoundEventType
Определения ReplaceSoundEventHandler.c:2
StaminaHandler m_StaminaHandler
Определения StaminaSoundHandler.c:108
void SymptomManager(PlayerBase player)
Определения StateManager.c:171
proto native UAInputAPI GetUApi()
void UndergroundHandlerClient(PlayerBase player)
Определения UndergroundHandlerClient.c:37
EUndergroundPresence
Определения UndergroundHandlerClient.c:2
override bool IsIdle()
Определения WeaponStableState.c:95
Определения ActionCPR.c:12
static string GetPulseMessage(EPulseType pulse_type, int blood_level)
Определения ActionCheckPulse.c:18
const int TARGET_IRREGULAR_PULSE_BIT
Определения ActionCheckPulse.c:4
DEPRECATED.
Определения ActionCheckPulse.c:3
Vector2 GetCameraLRAngle()
Определения ActionContinuousBase.c:173
bool IsCameraLockOnPerform()
Определения ActionContinuousBase.c:158
bool CanPerformActionFromQuickbar(ItemBase mainItem, ItemBase targetItem)
Определения ActionManagerClient.c:971
void ClearForceTarget()
Определения ActionManagerClient.c:491
void PerformActionFromQuickbar(ItemBase mainItem, ItemBase targetItem)
Определения ActionManagerClient.c:1029
override void RequestInterruptAction()
client requests action interrupt
Определения ActionManagerClient.c:1341
override void RequestEndAction()
Определения ActionManagerClient.c:278
void PerformActionStart(ActionBase action, ActionTarget target, ItemBase item, Param extra_data=NULL)
Определения ActionManagerClient.c:804
override void EndActionInput()
Определения ActionManagerClient.c:286
void ForceTarget(Object targetObject)
Определения ActionManagerClient.c:482
Определения ActionOpenDoors.c:2
Определения ActionTakeArrow.c:2
Определения ActionUngagSelf.c:2
static void PlayerDisconnected(StatsEventDisconnectedData data)
Определения ScriptAnalytics.c:160
static void PlayerMeasures(StatsEventMeasuresData data)
Определения ScriptAnalytics.c:166
Определения ScriptAnalytics.c:146
const string STAT_PLAYTIME
Определения AnalyticsManagerServer.c:4
const string STAT_DISTANCE
Определения AnalyticsManagerServer.c:3
void ClearArrows()
Определения ArrowManagerBase.c:23
void DropFirstArrow()
Определения ArrowManagerBase.c:59
void DropAllArrows()
Определения ArrowManagerBase.c:64
bool Save(ParamsWriteContext ctx)
Определения ArrowManagerPlayer.c:33
bool Load(ParamsReadContext ctx)
Определения ArrowManagerPlayer.c:75
Определения consumables.c:2
static SoundOnVehicle SaySound(Object source, string sound_name, float distance, bool looped)
Определения BetaSound.c:3
Определения BetaSound.c:2
Определения AmmunitionPiles.c:84
static ref TStringArray ARRAY_STRING
Определения UtilityClasses.c:49
static ref Param1< bool > PARAM1_BOOL
Определения UtilityClasses.c:12
static ref Param1< int > PARAM1_INT
Определения UtilityClasses.c:11
static ref Param1< string > PARAM1_STRING
Определения UtilityClasses.c:14
static ref Param2< float, float > PARAM2_FLOAT_FLOAT
Определения UtilityClasses.c:21
represents base for cargo storage for entities
Определения Cargo.c:7
static bool GetUse3DMap()
Определения CfgGameplayHandler.c:417
static int GetLightingConfig()
Определения CfgGameplayHandler.c:136
static bool GetAllowStaminaAffectInertia()
Определения CfgGameplayHandler.c:473
static bool GetHitIndicationPPEEnabled()
Определения CfgGameplayHandler.c:412
static TStringSet GetDisallowedTypesInUnderground()
Определения CfgGameplayHandler.c:372
static bool GetDisableRespawnDialog()
Определения CfgGameplayHandler.c:183
static bool IsPointInPlayerRestrictedArea(vector point, out PlayerRestrictedAreaInstance hitArea)
Super root of all classes in Enforce script.
Определения EnScript.c:11
static void RemovePlayerBase(Man player)
Определения ClientData.c:29
static void AddPlayerBase(Man player)
Определения ClientData.c:23
Определения ClientData.c:2
Определения DallasMask.c:2
Определения Armband_ColorBase.c:2
const int WHITE
Определения Colors.c:15
Определения Colors.c:4
Client only - manage set up crafting on client.
Определения CraftingManager.c:3
static proto bool RaycastRV(vector begPos, vector endPos, out vector contactPos, out vector contactDir, out int contactComponent, set< Object > results=NULL, Object with=NULL, Object ignore=NULL, bool sorted=false, bool ground_only=false, int iType=ObjIntersectView, float radius=0.0, CollisionFlags flags=CollisionFlags.NEARESTCONTACT)
Raycasts world by given parameters.
Определения DayZPhysics.c:124
this is main camera class
Определения DayZPlayerCamera1stPerson.c:5
static bool NoHeading(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff)
Определения DayZPlayerImplementHeading.c:187
static bool RestrictHeading(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff, HeadingRestrictData restrictData)
Определения DayZPlayerImplementHeading.c:122
static bool ClampHeading(float pDt, SDayZPlayerHeadingModel pModel, out float pLastHeadingDiff)
Определения DayZPlayerImplementHeading.c:19
static const int SJ_BROKEN_LEGS
Определения DayZPlayerSyncJunctures.c:27
static const int SJ_ACTION_INTERRUPT
Определения DayZPlayerSyncJunctures.c:8
static const int SJ_PLAYER_STATES
Определения DayZPlayerSyncJunctures.c:9
static const int SJ_ACTION_ACK_REJECT
Определения DayZPlayerSyncJunctures.c:13
static const int SJ_WEAPON_LIFT
Определения DayZPlayerSyncJunctures.c:24
static const int SJ_STAMINA
Определения DayZPlayerSyncJunctures.c:29
static bool ReadShockParams(ParamsReadContext pCtx, out float shockValue)
Определения DayZPlayerSyncJunctures.c:421
static const int SJ_KURU_REQUEST
Определения DayZPlayerSyncJunctures.c:21
static const int SJ_PLAYER_ADD_MODIFIER
Определения DayZPlayerSyncJunctures.c:20
static const int SJ_WEAPON_ACTION_ACK_REJECT
Определения DayZPlayerSyncJunctures.c:15
static const int SJ_SHOCK
Определения DayZPlayerSyncJunctures.c:28
static void SendDeleteItem(DayZPlayer pPlayer, EntityAI item)
Определения DayZPlayerSyncJunctures.c:356
static bool ReadKuruRequest(ParamsReadContext pCtx, out float amount)
Определения DayZPlayerSyncJunctures.c:306
static const int SJ_GESTURE_REQUEST
Определения DayZPlayerSyncJunctures.c:22
static const int SJ_QUICKBAR_SET_SHORTCUT
Определения DayZPlayerSyncJunctures.c:10
static bool ReadBrokenLegsParamsEx(ParamsReadContext pCtx, out int currentState)
Определения DayZPlayerSyncJunctures.c:400
static const int SJ_INVENTORY_FAILURE
Определения DayZPlayerSyncJunctures.c:32
static const int SJ_WEAPON_ACTION_ACK_ACCEPT
Определения DayZPlayerSyncJunctures.c:14
static const int SJ_UNCONSCIOUSNESS
Определения DayZPlayerSyncJunctures.c:17
static const int SJ_DELETE_ITEM
Определения DayZPlayerSyncJunctures.c:26
static const int SJ_ADS_RESET
Определения DayZPlayerSyncJunctures.c:31
static const int SJ_WEAPON_SET_JAMMING_CHANCE
Определения DayZPlayerSyncJunctures.c:16
static bool ReadInjuryParams(ParamsReadContext pCtx, out bool pEnable, out eInjuryHandlerLevels level)
Определения DayZPlayerSyncJunctures.c:153
static void SendPlayerUnconsciousness(DayZPlayer pPlayer, bool enable)
Определения DayZPlayerSyncJunctures.c:168
static const int SJ_ACTION_ACK_ACCEPT
Определения DayZPlayerSyncJunctures.c:12
static bool ReadPlayerUnconsciousnessParams(ParamsReadContext pCtx, out bool enable)
Определения DayZPlayerSyncJunctures.c:177
static void SendBrokenLegsEx(DayZPlayer pPlayer, int currentState)
Определения DayZPlayerSyncJunctures.c:392
static const int SJ_INJURY
Определения DayZPlayerSyncJunctures.c:7
static const int SJ_STAMINA_MISC
Определения DayZPlayerSyncJunctures.c:30
static const int SJ_INVENTORY
Определения DayZPlayerSyncJunctures.c:11
static void Log(string message=LOG_DEFAULT, string plugin=LOG_DEFAULT, string author=LOG_DEFAULT, string label=LOG_DEFAULT, string entity=LOG_DEFAULT)
Prints debug message with normal prio.
Определения 3_Game/DayZ/tools/Debug.c:183
Определения 3_Game/DayZ/tools/Debug.c:2
Определения EnDebug.c:241
static DustEffectManager GetDustEffectManager()
Определения DustEffectsManager.c:6
void Update(float deltaT)
Определения DustEffectsManager.c:160
void Init(PlayerBase player)
Определения DustEffectsManager.c:77
int FilterAgents(int agentsIn)
Filter agents from the item (override on higher implementations)
Определения Edible_Base.c:112
bool Consume(float amount, PlayerBase consumer)
Определения Edible_Base.c:95
override FoodStage GetFoodStage()
Определения Edible_Base.c:361
Определения Edible_Base.c:2
Определения SwarmingFlies.c:2
Определения VomitBlood.c:2
Определения Vomit.c:2
Particle GetParticle()
Gets the main particle which this Effect is managing.
Определения EffectParticle.c:166
void SetDecalOwner(Object o)
Определения EffectParticle.c:643
Wrapper class for managing particles through SEffectManager.
Определения EffectParticle.c:5
override void SetAutodestroy(bool auto_destroy)
Sets whether Effect automatically cleans up when it stops.
Определения EffectSound.c:607
Wrapper class for managing sound through SEffectManager.
Определения EffectSound.c:5
int GetEffectsPriority()
Определения EffectTrigger.c:55
bool PredictiveSwapEntities(notnull EntityAI item1, notnull EntityAI item2)
Определения 3_Game/DayZ/Entities/Man.c:422
static int GetEnumSize(typename e)
Return amount of values in enum.
Определения EnConvert.c:726
static string EnumToString(typename e, int enumValue)
Return string name of enum value.
Определения EnConvert.c:699
Определения EnConvert.c:688
Определения FlashbangEffect.c:2
bool LocalDestroyEntity(notnull EntityAI item)
proto native bool FindFirstFreeLocationForNewEntity(string item_type, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFirstFreeLocationForNewEntity.
proto native EntityAI GetAttachmentFromIndex(int index)
static proto native bool PrepareDropEntityPos(EntityAI owner, notnull EntityAI item, out vector mat[4], bool useValuesInMatrix=false, int conflictCheckDepth=-1)
Finds a transformation for the item to be dropped to If the initial transforation overlaps with anoth...
proto native EntityAI FindPlaceholderForSlot(int slot)
Returns placeholder entity for slot (naked arms, legs etc)
proto native bool EnumerateInventory(InventoryTraversalType tt, out array< EntityAI > items)
enumerate inventory using traversal type and filling items array
proto native void LockInventory(int lockType)
bool CanAddEntityIntoHands(notnull EntityAI item)
Test if entity can be put into hands.
proto native bool IsInventoryLocked()
proto native void UnlockInventory(int lockType)
static bool CanSwapEntitiesEx(notnull EntityAI item1, notnull EntityAI item2)
static proto native EntityAI LocationCreateLocalEntity(notnull InventoryLocation inv_loc, string type, int iSetupFlags, int iRotation)
creates new local item directly at location @NOTE: the item is created localy, i.e....
proto native int GetSlotId(int index)
attachments
bool GetCurrentAttachmentSlotInfo(out int slot_id, out string slot_name)
Returns true if the item is currently attached and outputs attachment slot id and name.
static proto native bool HasInventoryReservation(EntityAI item, InventoryLocation dst)
Internally: HasInventoryReservationEx(item, dst, FindInventoryReservationMode.LEGACY,...
static bool CanForceSwapEntitiesEx(notnull EntityAI item1, InventoryLocation item1_dst, notnull EntityAI item2, out InventoryLocation item2_dst)
const float c_MaxItemDistanceRadius
anti-cheats
proto native int AttachmentCount()
Returns count of attachments attached to this item.
proto native int GetSlotIdCount()
proto native bool FindFreeLocationFor(notnull EntityAI item, FindInventoryLocationType flags, out notnull InventoryLocation loc)
FindFreeLocationFor.
proto native EntityAI FindAttachment(int slot)
Returns attached entity in slot (you can use InventorySlots.GetSlotIdFromString(name) to get slot id)
script counterpart to engine's class Inventory
grouped gameplay effect widgets and their handling
Определения GameplayEffectWidgets.c:7
proto void SelectObject(Object object)
proto void SelectPhysics(Physics physics)
const int NUMBER_OF_STAGES
Определения HeatBuffer.c:3
Определения HeatBuffer.c:2
proto native void CharacterSave(Man player)
proto native bool CharacterIsLoginPositionChanged(Man player)
Only valid during login.
proto native void CharacterKill(Man player)
Определения Hive.c:6
Определения Hologram.c:2
static void ApplyEffects(PlayerBase player)
Определения HotSpringTrigger.c:99
static const float HEAT_DAMAGE_TICK_TIME
Определения HotSpringTrigger.c:6
Hot spring area trigger.
Определения HotSpringTrigger.c:3
void ShowHudUI(bool show)
void ShowQuickbarUI(bool show)
Определения gameplay.c:638
proto native vector GetLogoutPosition()
Определения human.c:667
proto native void SetTurnSpanSprintModifier(float value)
sets the multiplier for HumanItemBehaviorCfg::m_fMoveHeadingSprintFilterSpan
proto native void ForceStance(int pStanceIdx)
proto native void SetRunSprintFilterModifier(float value)
sets the multiplier for SHumanCommandMoveSettings::m_fRunSpringTimeout
proto native void SetDirectionSprintFilterModifier(float value)
sets the multiplier for SHumanCommandMoveSettings::m_fDirFilterSprintTimeout
proto native void SetMeleeBlock(bool pBlock)
this enables/disables block
Определения human.c:454
proto native bool IsRagdoll()
proto native bool IsInWater()
proto native void WakeUp(int targetStance=-1)
Определения human.c:640
proto native Transport GetTransport()
proto native bool IsGettingIn()
proto native void SetVehicleType(int pVehicleType)
proto native bool IsSwitchSeat()
proto native bool IsGettingOut()
Определения human.c:712
Определения human.c:1027
proto native bool CameraIsFreeLook()
returns true if freelook is active
proto native void LimitsDisableSprint(bool pDisable)
this disables sprint
proto native void DisableProneCameraHorizontalRotation(bool pDisable)
proto native bool IsQuickBarContinuousUseStart()
proto native void SetCrouchSpeedLimit(bool bShouldDisable, int pMaxErectSpeed=DayZPlayerConstants.MOVEMENTIDX_SPRINT)
proto native void ResetADS()
resets ADS mode to default
proto native void SetErectSpeedLimit(bool bShouldDisable, int pMaxErectSpeed=DayZPlayerConstants.MOVEMENTIDX_SPRINT)
set maximum speed (0 - Idle, 1 - Walk, 2 - Run, 3 - Sprint)
proto native void SetProneSpeedLimit(bool bShouldDisable, int pMaxErectSpeed=DayZPlayerConstants.MOVEMENTIDX_SPRINT)
proto native int IsQuickBarSlot()
returns 1..10 if some quickbar slot is used, 0 otherwise
proto native bool IsQuickBarSingleUse()
proto native bool IsQuickBarContinuousUseEnd()
Определения human.c:18
int m_StanceRotation[6]
6 stances -> all has movement mask, STANCEIDX_ ... is index
Определения humanitems.c:19
Определения humanitems.c:6
int m_iMovement
current stance (DayZPlayerConstants.STANCEIDX_ERECT, ...), only if the command has a stance
Определения human.c:1184
int m_CommandTypeId
Определения human.c:1182
Определения human.c:1181
Определения EnEntity.c:165
const float LVL3
Определения InjuryHandler.c:14
Определения InjuryHandler.c:10
Client only - manage set up crafting on client.
Определения InventoryActionHandler.c:3
proto native bool IsValid()
verify current set inventory location
proto native void SetHands(notnull EntityAI parent, EntityAI e)
sets current inventory location type to Hands
static string DumpToStringNullSafe(InventoryLocation loc)
Определения InventoryLocation.c:233
proto native vector GetPos()
returns position of item in world if type is Ground
proto native void SetAttachment(notnull EntityAI parent, EntityAI e, int slotId)
sets current inventory location type to Attachment with slot id set to <slotId>
proto native int GetSlot()
returns slot id if current type is Attachment
proto native void SetGround(EntityAI e, vector mat[4])
sets current inventory location type to Ground with transformation mat
proto native void SetCargoAuto(notnull CargoBase cargo, EntityAI e, int row, int col, bool flip)
based on Cargo.IsProxyCargo uses SetProxyCargo or SetCargo respectively
proto native int GetType()
returns type of InventoryLocation
proto native void SetCargo(notnull EntityAI parent, EntityAI e, int idx, int row, int col, bool flip)
sets current inventory location type to Cargo with coordinates (idx, row, col)
bool ReadFromContext(ParamsReadContext ctx)
Определения InventoryLocation.c:310
InventoryLocation.
Определения InventoryLocation.c:30
static proto native int GetSlotIdFromString(string slot_name)
converts string to slot_id
provides access to slot configuration
Определения InventorySlots.c:6
proto native float GetCurrentStepFOV()
returns fov value at current index, or 'OpticsInfo.opticsZoomInit' config value (non-zooming optics)
Определения ItemOptics.c:2
static const string NAME_FIRE
Определения gameplay.c:208
LOD class.
Определения gameplay.c:204
static bool IsSyncLogEnable()
Определения 3_Game/DayZ/tools/Debug.c:789
ref MapNavigationBehaviour m_MapNavigationBehaviour
Определения PlayerBase.c:290
override bool StopSoundEvent(EPlayerSoundEventID id, bool is_from_server=false, int param=0)
Определения PlayerBase.c:7858
bool AnimCommandCheck(HumanMoveCommandID mask)
Определения PlayerBase.c:5678
void UpdateLighting()
Определения PlayerBase.c:6051
bool IsTargetInActiveRefresherRange(EntityAI target)
Определения PlayerBase.c:4873
override void PredictiveTakeEntityToHands(EntityAI item)
Определения PlayerBase.c:9203
float GetSimplifiedShockNormalized()
Определения PlayerBase.c:3920
string m_UALastMessage
user actions & symptoms
Определения PlayerBase.c:307
ref PlayerSoundManagerServer m_PlayerSoundManagerServer
Определения PlayerBase.c:133
SymptomManager GetSymptomManager()
Определения PlayerBase.c:2983
void UpdateCorpseState()
Определения PlayerBase.c:6133
PlayerStat< float > m_StatDiet
Определения PlayerBase.c:335
bool m_StartedSurrenderTransition
Определения PlayerBase.c:315
void UpdateHairSelectionVisibility(bool was_debug=false)
Определения PlayerBase.c:9363
PlayerStat< float > GetStatSpecialty()
Определения PlayerBase.c:8269
DayZPlayerCameraBase m_CurrentCamera
Определения PlayerBase.c:167
ref Param2< float, float > m_UAProgressParam
Определения PlayerBase.c:111
void SetNVGWorking(bool state)
Определения PlayerBase.c:10115
bool GetLiquidTendencyDrain()
Определения PlayerBase.c:5300
bool IsAntibioticsActive()
Определения PlayerBase.c:756
PlayerStat< float > GetStatToxicity()
Определения PlayerBase.c:8206
bool m_CorpseProcessing
Определения PlayerBase.c:146
PlayerBase m_CheckPulseLastTarget
Определения PlayerBase.c:186
override bool IsUnconsciousStateOnly()
Определения PlayerBase.c:3930
float GetSingleAgentCountNormalized(int agent_id)
Определения PlayerBase.c:8127
override bool IsRefresherSignalingViable()
Определения PlayerBase.c:2504
ref BleedingSourcesManagerRemote m_BleedingManagerRemote
Определения PlayerBase.c:86
ref array< int > m_ProcessAddGlassesEffects
Определения PlayerBase.c:347
int m_ShockSimplified
Определения PlayerBase.c:155
override bool PredictiveTakeEntityToTargetCargoEx(notnull CargoBase cargo, notnull EntityAI item, int row, int col)
Определения PlayerBase.c:9087
void SetPlayerLoad(float load)
Определения PlayerBase.c:10128
void AddToEnvironmentTemperature(float pTemperature)
void SetEnergyManagerState(ItemBase itemInHands, bool state)
Определения PlayerBase.c:631
bool HasBloodyHands()
Определения PlayerBase.c:7203
override void ProcessLiftWeapon()
Определения PlayerBase.c:8850
ref CraftingManager m_CraftingManager
Определения PlayerBase.c:129
void ResetActiveNV()
Определения PlayerBase.c:9497
bool ItemToInventory
Определения PlayerBase.c:276
void FixAllInventoryItems()
Определения PlayerBase.c:6281
override bool IsLanded(int pCurrentCommandID)
Определения PlayerBase.c:3711
void ReloadWeapon(EntityAI weapon, EntityAI magazine)
Определения PlayerBase.c:5147
override void GetActions(typename action_input_type, out array< ActionBase_Basic > actions)
Определения PlayerBase.c:1786
bool IsPlacingServer()
Определения PlayerBase.c:2733
void AddPossibleCoverFaceForShave()
DEPRECATED!
Определения PlayerBase.c:1492
int m_BrokenLegState
Определения PlayerBase.c:191
void EndFighting()
Определения PlayerBase.c:5693
void RefreshHandAnimationState(int delay=0)
Определения PlayerBase.c:4906
void ImmuneSystemTick(float value, float deltaT)
Определения PlayerBase.c:8143
bool m_IsInColdArea
Определения PlayerBase.c:65
override void OnReceivedHit(ImpactEffectsData hitData)
Определения PlayerBase.c:1413
override void OnVariablesSynchronized()
Определения PlayerBase.c:6170
ref array< int > m_ProcessRemoveEffectWidgets
Определения PlayerBase.c:344
void OnUnconsciousStart()
Определения PlayerBase.c:3756
bool HasHeatBuffer()
Определения PlayerBase.c:10035
void SetCraftingRecipeID(int recipeID)
Определения PlayerBase.c:2306
PlayerSoundManagerServer GetPlayerSoundManagerServer()
Определения PlayerBase.c:1671
void UpdateQuickBarEntityVisibility(EntityAI entity)
Определения PlayerBase.c:2404
vector m_PlayerOldPos
Определения PlayerBase.c:7601
override bool CanStartConsumingStamina(EStaminaConsumers consumer)
Определения PlayerBase.c:4812
override bool NeedInventoryJunctureFromServer(notnull EntityAI item, EntityAI currParent, EntityAI newParent)
Определения PlayerBase.c:5344
ItemBase GetItemOnSlot(string slot_type)
Returns item that's on this player's attachment slot. Parameter slot_type should be a string from con...
Определения PlayerBase.c:980
override void OnThrowingModeChange(bool change_to_enabled)
Определения PlayerBase.c:4596
override bool CanSwapItemInCargo(EntityAI child_entity, EntityAI new_entity)
Определения PlayerBase.c:2277
override void OnStoreSave(ParamsWriteContext ctx)
Определения PlayerBase.c:7353
void OnConnect()
Определения PlayerBase.c:7623
bool TakeEntityToInventoryImpl(InventoryMode mode, FindInventoryLocationType flags, notnull EntityAI item)
Определения PlayerBase.c:9817
void MessageAction(string text)
Определения PlayerBase.c:6930
void ClearLastUAMessage()
Определения PlayerBase.c:8337
void OnPlayerLoaded()
Определения PlayerBase.c:2569
void OnCommandHandlerTick(float delta_time, int pCurrentCommandID)
Определения PlayerBase.c:3038
ref SymptomManager m_SymptomManager
Определения PlayerBase.c:95
void SetImmunityBoosted(bool boosted)
Определения PlayerBase.c:5581
bool CheckAndExecuteStackSplit(FindInventoryLocationType flags, notnull EntityAI item, notnull EntityAI target)
Определения PlayerBase.c:9791
override SoundOnVehicle PlaySound(string sound_name, float range, bool create_local=false)
Определения PlayerBase.c:5324
void SetActivePrimarySymptomID(SymptomIDs id)
Определения PlayerBase.c:778
override void OnCommandClimbStart()
Определения PlayerBase.c:4318
void SwitchItemTypeDetach(EntityAI item, string slot)
void RadialQuickBarCombine(int slotClicked)
Определения PlayerBase.c:5131
void SetBloodType(int blood_type)
Определения PlayerBase.c:7289
void Message(string text, string style)
Определения PlayerBase.c:6911
bool m_ActionsInitialize
Определения PlayerBase.c:125
bool IsLeaning()
Определения PlayerBase.c:5640
void RemoveCurrentEffectTrigger()
Определения PlayerBase.c:824
void MapNavigationItemInPossession(EntityAI item)
Определения PlayerBase.c:3657
void SetBloodTypeVisible(bool show)
Определения PlayerBase.c:7278
void SetMixedSoundState(eMixedSoundStates state)
Определения PlayerBase.c:1050
ref map< EEffectAreaType, float > m_EffectAreaTimeToTick
Определения PlayerBase.c:217
const int SIMPLIFIED_SHOCK_CAP
Определения PlayerBase.c:51
PlayerStat< float > m_StatEnergy
Определения PlayerBase.c:330
void PlacingCancelServer()
Определения PlayerBase.c:2683
bool IsClimbing()
Определения PlayerBase.c:5650
bool m_MeleeDebug
melee stats
Определения PlayerBase.c:302
void IncreaseContaminatedAreaCount()
Определения PlayerBase.c:838
float GetImmunity()
returns player's immunity strength between 0..1
Определения PlayerBase.c:5589
bool IsInProne()
Определения PlayerBase.c:5630
override bool IsLiftWeapon()
Определения PlayerBase.c:8703
ItemBase CreateCopyOfItemInInventoryOrGroundEx(ItemBase src, bool markItemAsSplitResult=false)
Определения PlayerBase.c:6888
static ref array< string > m_BleedingSourcesLow
Определения PlayerBase.c:198
vector m_DirectionToCursor
Определения PlayerBase.c:169
bool AllowDecayEffects()
Определения PlayerBase.c:6143
void ProcessADSSyncResetRequest()
Определения PlayerBase.c:2809
bool CanEatAndDrink()
Определения PlayerBase.c:8180
void OnBleedingSourceAdded()
Определения PlayerBase.c:7874
DamageDealtEffect GetDamageDealtEffect()
Определения PlayerBase.c:1155
ref TInputActionMap m_InputActionMap
Определения PlayerBase.c:122
ref PlayerStats m_PlayerStats
Определения PlayerBase.c:83
void SendSoundEventEx(EPlayerSoundEventID id, int param=0)
Определения PlayerBase.c:7800
void ResetPlayer(bool set_max)
Определения PlayerBase.c:7936
bool CanDeleteItems()
Определения PlayerBase.c:8584
override void OnCommandDeathStart()
Определения PlayerBase.c:4407
EntityAI SpawnAI(string object_name, vector pos)
Определения PlayerBase.c:6807
void RestartAllMovement()
Определения PlayerBase.c:2065
override void OnPlayerRecievedHit()
Определения PlayerBase.c:1432
void StopAllMovement()
Определения PlayerBase.c:2057
PluginPlayerStatus m_ModulePlayerStatus
Определения PlayerBase.c:77
void EndSurrenderRequest(SurrenderData data=null)
ends surrender, originally intended for surrender->restrained transitioning
Определения PlayerBase.c:8956
ItemBase GetItemOnHead()
Returns item on player's head. For an example, a headtorch.
Определения PlayerBase.c:997
bool IsRolling()
Определения PlayerBase.c:5645
vector m_LastFirePoint
Определения PlayerBase.c:272
void OnInventoryMenuClose()
bool CanSpawnBreathVaporEffect()
Определения PlayerBase.c:7084
string GetCachedName()
Определения PlayerBase.c:10018
void CloseMapEx(bool cancelled)
Определения PlayerBase.c:3558
TransferValues GetTransferValues()
Определения PlayerBase.c:2996
EPulseType m_PulseType
Определения PlayerBase.c:185
int m_SyncedModifiersPrev
Определения PlayerBase.c:321
override bool OnStoreLoad(ParamsReadContext ctx, int version)
Определения PlayerBase.c:7408
override float GetWeaponObstruction()
Определения PlayerBase.c:8708
ref array< int > m_Recipes
Определения PlayerBase.c:260
void OnStartTransitionToSurrender()
Определения PlayerBase.c:2081
void UpdateBrokenLegs(int stateId)
Определения PlayerBase.c:3997
override bool IsUnconscious()
Определения PlayerBase.c:3925
override void SpawnDamageDealtEffect()
Определения PlayerBase.c:1160
void OnHoldBreathStart()
Определения PlayerBase.c:2482
int m_LastShavedSeconds
Определения PlayerBase.c:54
DebugMonitorValues GetDebugMonitorValues()
Определения PlayerBase.c:3001
bool m_MapCloseRequestProcessed
Определения PlayerBase.c:286
ref EffectParticle m_FliesEff
Определения PlayerBase.c:121
void DropHeavyItem()
Определения PlayerBase.c:4177
bool IsBleeding()
Определения PlayerBase.c:1066
int m_RecipeID
Определения PlayerBase.c:254
int m_QuickBarBonus
Определения PlayerBase.c:180
ref array< int > m_ProcessRemoveGlassesEffects
Определения PlayerBase.c:348
ref ArrowManagerPlayer m_ArrowManager
Определения PlayerBase.c:130
override bool IsPlayer()
Определения PlayerBase.c:1061
PlayerStat< int > m_StatWet
Определения PlayerBase.c:333
PlayerStat< float > m_StatHeatComfort
Определения PlayerBase.c:331
ref PlayerAgentPool m_AgentPool
Определения PlayerBase.c:91
void QueueRemoveEffectWidget(array< int > effects)
Определения PlayerBase.c:1140
bool m_LiquidTendencyDrain
Определения PlayerBase.c:57
EPulseType GetPulseType()
Определения PlayerBase.c:1125
override bool IsSurrendered()
Определения PlayerBase.c:8962
float m_LastTick
Определения PlayerBase.c:251
EEffectAreaType m_InEffectAreaType
Определения PlayerBase.c:215
override bool PredictiveDropEntity(notnull EntityAI item)
Определения PlayerBase.c:9104
EntityAI m_Item2
Определения PlayerBase.c:256
void SetPersistentFlag(PersistentFlag bit, bool enable)
Определения PlayerBase.c:7336
void SetStaminaState(eStaminaState state)
Определения PlayerBase.c:8037
override void OnRollFinish()
Определения PlayerBase.c:4551
void SetHeatBufferDynamicMax(float value)
Определения PlayerBase.c:8296
int GetBreathVapourLevel()
Определения PlayerBase.c:1030
bool IsSwapBetweenHandsAndGroundLargeItem(notnull EntityAI item1, notnull EntityAI item2, out EntityAI item_hands, out EntityAI item_ground)
Определения PlayerBase.c:9245
ref UndergroundHandlerClient m_UndergroundHandler
Определения PlayerBase.c:82
vector GetLocalProjectionOrientation()
Определения PlayerBase.c:2919
const int ACT_STORE_SAVE_VERSION
Определения PlayerBase.c:72
void SetStamina(int value, int range)
Определения PlayerBase.c:1998
bool IsEmotePlaying()
Определения PlayerBase.c:5664
void SetActionEndInput(ActionBase action)
Определения PlayerBase.c:5107
float GetStatBordersWater()
Определения PlayerBase.c:5530
bool TakeEntityToTargetAttachmentImpl(InventoryMode mode, notnull EntityAI target, notnull EntityAI item)
Определения PlayerBase.c:9861
void dmgDebugPrint(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения PlayerBase.c:9751
float GetTemporaryResistanceToAgent(int agent)
Определения PlayerBase.c:8153
override void OnLadder(float delta_time, HumanMovementState pState)
called every command handler tick when player is on ladder
Определения PlayerBase.c:1903
ref ThermalBiasHandler m_ThermalBiasHandler
Определения PlayerBase.c:339
EntityAI m_Item1
Определения PlayerBase.c:255
override bool OnInputUserDataProcess(int userDataType, ParamsReadContext ctx)
Определения PlayerBase.c:6531
void OnPlayerReceiveFlashbangHitStart(bool visual)
Определения PlayerBase.c:1451
override array< string > GetSuitableFinisherHitComponents()
returns list of suitable finisher hit components (defined on base entity/entity type)
Определения PlayerBase.c:1480
string GetLastUAMessage()
UA Last Message.
Определения PlayerBase.c:8320
eMixedSoundStates GetMixedSoundStates()
Определения PlayerBase.c:2514
void SpawnShockEffect(float intensity_max)
Определения PlayerBase.c:1204
void MessageFriendly(string text)
Определения PlayerBase.c:6936
float m_LastShockHitTime
Определения PlayerBase.c:166
bool IsMapCallbackCancelInput()
Определения PlayerBase.c:3632
int GetCurrentRecipe()
Определения PlayerBase.c:1869
override bool OnAction(int action_id, Man player, ParamsReadContext ctx)
Определения PlayerBase.c:8356
override int GetQuickBarBonus()
Определения PlayerBase.c:1002
ref Hologram m_HologramServer
Определения PlayerBase.c:245
override void EEHitBy(TotalDamageResult damageResult, int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos, float speedCoef)
Определения PlayerBase.c:1255
BleedingSourcesManagerServer GetBleedingManagerServer()
Определения PlayerBase.c:2973
void OnStartTransitionFromSurrender(bool changeStance=true)
Определения PlayerBase.c:2101
vector m_LocalProjectionOrientation
Определения PlayerBase.c:248
override bool PredictiveSwapEntities(notnull EntityAI item1, notnull EntityAI item2)
Определения PlayerBase.c:9125
bool IsInEffectArea(EEffectAreaType area)
Определения PlayerBase.c:902
void OnPlayerIsNowInsideEffectAreaEndServer()
Определения PlayerBase.c:963
void OnBleedingSourceRemovedEx(ItemBase item)
Определения PlayerBase.c:7925
bool m_LoweredNVGHeadset
Определения PlayerBase.c:313
static Particle m_ContaminatedAroundPlayerTiny
Определения PlayerBase.c:326
override void EEKilled(Object killer)
Определения PlayerBase.c:1214
void SetBloodyHands(bool show)
Определения PlayerBase.c:7208
float GetStatBordersEnergy()
Определения PlayerBase.c:5523
float m_UnconsciousTime
Определения PlayerBase.c:154
override bool CanReleaseAttachment(EntityAI attachment)
Определения PlayerBase.c:2262
void RadialQuickBarSingleUse(int slotClicked)
Определения PlayerBase.c:5125
override void EEItemOutOfHands(EntityAI item)
Определения PlayerBase.c:3168
int m_BloodType
Определения PlayerBase.c:55
float GetBordersImmunity()
Определения PlayerBase.c:5494
int m_ActivePrimarySymptomID
Определения PlayerBase.c:310
bool m_IsDrowning
Определения PlayerBase.c:278
SymptomIDs GetActivePrimarySymptomID()
Определения PlayerBase.c:784
void QuickReloadWeapon(EntityAI weapon)
Определения PlayerBase.c:5140
void PreloadDecayTexture()
Определения PlayerBase.c:9696
void DecreaseHealingsCount()
Определения PlayerBase.c:1108
bool CanConsumeFood(ConsumeConditionData data=null)
Определения PlayerBase.c:8186
VirtualHud GetVirtualHud()
Определения PlayerBase.c:2987
EffectSound m_AmbientContamination
Определения PlayerBase.c:207
override void EEItemIntoHands(EntityAI item)
Определения PlayerBase.c:3133
void MapNavigationItemNotInPossession(EntityAI item)
Определения PlayerBase.c:3665
void UpdateShoulderProxyVisibility(EntityAI item, string slot_name)
Определения PlayerBase.c:1594
int GetCraftingRecipeID()
Определения PlayerBase.c:2294
override bool IsRestrained()
Определения PlayerBase.c:2219
void OnSpawnedFromConsole()
Определения PlayerBase.c:5281
void SetLiftWeapon(bool state, float obstruct=0)
Определения PlayerBase.c:8769
ref Param2< int, int > m_UAParam
Определения PlayerBase.c:112
void ShowUnconsciousScreen(bool show)
Определения PlayerBase.c:7752
override bool PredictiveTakeEntityToTargetAttachment(notnull EntityAI target, notnull EntityAI item)
Определения PlayerBase.c:9044
ref array< int > m_ProcessAddEffectWidgets
Определения PlayerBase.c:343
override void SwitchItemSelectionTexture(EntityAI item, string slot_name)
Определения PlayerBase.c:1612
bool m_InsideEffectAreaPrev
Определения PlayerBase.c:211
bool ReadLiftWeaponRequest(int userDataType, ParamsReadContext ctx)
Определения PlayerBase.c:8746
void OnFinishTransitionFromSurrender()
Определения PlayerBase.c:2092
EStatLevels GetStatLevelEnergy()
Определения PlayerBase.c:5473
int GetHeatBufferStage()
Определения PlayerBase.c:10040
bool CanBeRestrained()
Определения PlayerBase.c:2171
bool m_AreHandsLocked
Определения PlayerBase.c:163
float m_DbgSliderValue
Определения PlayerBase.c:3111
bool m_AllowQuickRestrain
Определения PlayerBase.c:173
override bool IsFighting()
Определения PlayerBase.c:5659
ref EffectRadial m_EffectRadial
Определения PlayerBase.c:118
bool m_ShowDbgUI
Определения PlayerBase.c:3109
void SpreadAgents()
Определения PlayerBase.c:8090
void OnHoldBreathEnd()
Определения PlayerBase.c:2493
ref Environment m_Environment
Определения PlayerBase.c:93
void SetNVGLowered(bool state)
Определения PlayerBase.c:9462
void SetLocalProjectionOrientation(vector local_orientation)
Определения PlayerBase.c:2909
bool IsPersistentFlag(PersistentFlag bit)
Определения PlayerBase.c:7331
override void EOnFrame(IEntity other, float timeSlice)
Определения PlayerBase.c:4605
int m_ContaminatedAreaCount
Определения PlayerBase.c:208
int m_HealingsCount
Определения PlayerBase.c:172
PlayerStat< float > GetStatEnergy()
Определения PlayerBase.c:8215
void OnUnconsciousUpdate(float pDt, int last_command)
Определения PlayerBase.c:3870
bool IsQBControl()
Определения PlayerBase.c:5112
override void OnCommandLadderStart()
Определения PlayerBase.c:4266
int m_PerformedAnimActionID
Определения PlayerBase.c:309
GameplayEffectWidgets_base m_EffectWidgets
effect widgets
Определения PlayerBase.c:342
void DecreaseEffectAreaCount()
Определения PlayerBase.c:865
override void RemoveAgent(int agent_id)
Определения PlayerBase.c:8102
override vector GetDefaultHitPosition()
Определения PlayerBase.c:1474
float m_OriginalSlidePoseAngle
Определения PlayerBase.c:106
ThermalBiasHandler GetThermalBiasHandler()
Определения PlayerBase.c:8158
float m_UnconsciousEndTime
Определения PlayerBase.c:182
override EntityAI SpawnEntityOnGroundPos(string object_name, vector pos)
Определения PlayerBase.c:6741
PlayerStomach GetStomach()
Определения PlayerBase.c:3178
ref PlayerStomach m_PlayerStomach
Определения PlayerBase.c:323
int GetNVType()
Определения PlayerBase.c:9445
void OnQuickbarSetEntityRequest(ParamsReadContext ctx)
Определения PlayerBase.c:2416
PlayerStat< float > m_StatHeatBuffer
Определения PlayerBase.c:338
int m_RecipePick
Определения PlayerBase.c:140
void IncreaseDiseaseCount()
Определения PlayerBase.c:1093
void SetMapOpen(bool state)
Определения PlayerBase.c:3612
bool m_SoundEventSent
Определения PlayerBase.c:110
bool m_IsRestrained
Определения PlayerBase.c:157
const int OVERLOAD_LIMIT
Определения PlayerBase.c:104
CraftingManager GetCraftingManager()
Определения PlayerBase.c:2037
void AdjustBandana(EntityAI item, string slot_name)
Определения PlayerBase.c:9544
void SetLastMapInfo(float scale, vector pos)
Определения PlayerBase.c:9703
override string GetDefaultHitComponent()
returns default hit component (fallback)
Определения PlayerBase.c:1469
bool m_IsRestrainStarted
Определения PlayerBase.c:159
int m_SoundEvent
Определения PlayerBase.c:107
void SwitchItemTypeAttach(EntityAI item, string slot)
Определения PlayerBase.c:10059
bool m_BrokenLegsJunctureReceived
Определения PlayerBase.c:193
override void CommandHandler(float pDt, int pCurrentCommandID, bool pCurrentCommandFinished)
Определения PlayerBase.c:3206
void CheckForGag()
Определения PlayerBase.c:6462
override WeaponManager GetWeaponManager()
Определения PlayerBase.c:2047
bool IsInWater()
Определения PlayerBase.c:2947
ModifiersManager GetModifiersManager()
Определения PlayerBase.c:8192
void IncreaseAntibioticsCount()
Определения PlayerBase.c:10068
float GetStatLevelBorders(float stat_value, float critical, float low, float normal, float high, float max)
Определения PlayerBase.c:5539
void RequestUnconsciousness(bool enable)
Определения PlayerBase.c:8902
UndergroundHandlerClient GetUndergroundHandler()
Определения PlayerBase.c:1677
string m_CachedPlayerName
Определения PlayerBase.c:221
override void EEItemDetached(EntityAI item, string slot_name)
Определения PlayerBase.c:1551
void RemoveAction(typename actionName, out TInputActionMap InputActionMap)
Определения PlayerBase.c:1843
bool ResetADSPlayerSync(int userDataType, ParamsReadContext ctx)
server only
Определения PlayerBase.c:2822
void CheckForBurlap()
Определения PlayerBase.c:6440
void SetHairLevelToHide(int level, bool state, bool was_debug=false)
Dynamic hair hiding.
Определения PlayerBase.c:9261
void SpawnDrowningBubbles()
Определения PlayerBase.c:2449
void IncreaseHealingsCount()
Определения PlayerBase.c:1103
void SetActionsRemoteTarget(out TInputActionMap InputActionMap)
Определения PlayerBase.c:1751
override bool CanChangeStance(int previousStance, int newStance)
Определения PlayerBase.c:4475
void SetSoundCategoryHash(int hash)
Определения PlayerBase.c:761
override bool CanDropEntity(notnull EntityAI item)
Определения PlayerBase.c:1010
ref SoundObject m_SaySoundObject
Определения PlayerBase.c:264
EffectTrigger m_CurrentEffectTrigger
Определения PlayerBase.c:212
ItemBase m_CheckMeleeItem
Определения PlayerBase.c:304
void HandleBrokenLegsSync()
Определения PlayerBase.c:6268
void OnVoiceEventPlayback(PlayerSoundEventBase voice_event, AbstractWave callback, float playback_time)
called every cmd handler tick during a playback of PlayerSoundEvent, m_ProcessPlaybackEvent needs to ...
Определения PlayerBase.c:6516
void TogglePlacingLocal(ItemBase item=null)
Определения PlayerBase.c:2869
ref ShockDealtEffect m_ShockDealtEffect
Определения PlayerBase.c:120
void OnJumpOutVehicleFinish(float carSpeed)
float GetHeatBufferDynamicMax()
Определения PlayerBase.c:8302
void SetUnderground(EUndergroundPresence presence)
Определения PlayerBase.c:2853
int GetQuickBarSize()
Определения PlayerBase.c:2394
bool m_IsHoldingBreath
Определения PlayerBase.c:141
void QueueRemoveGlassesEffect(int id)
Определения PlayerBase.c:1150
void RequestTriggerEffect(EffectTrigger trigger, int ppeIdx=-1, int aroundId=ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId=ParticleList.CONTAMINATED_AREA_GAS_TINY, string soundset="", bool partDynaUpdate=false, int newBirthRate=0, bool forceUpdate=false)
Определения PlayerBase.c:789
bool m_ProcessUIWarning
Определения PlayerBase.c:68
bool m_IsRestrainStartedLocal
Определения PlayerBase.c:160
bool m_MapClosingSyncSent
Определения PlayerBase.c:287
bool m_CanPlayBrokenLegSound
Определения PlayerBase.c:196
override void OnStanceChange(int previousStance, int newStance)
Определения PlayerBase.c:4457
void PlacingCancelLocal()
Определения PlayerBase.c:2709
static ref array< CargoBase > SPREAD_AGENTS_PROXY_CARGOS
Определения PlayerBase.c:10050
string m_DatabaseID
Определения PlayerBase.c:298
void SetInWater(bool pState)
water contact (driven by Environment)
Определения PlayerBase.c:2941
void SetLastFirePointRot(float last_fire_point_rot)
Определения PlayerBase.c:2354
void OnVoiceEvent(PlayerSoundEventBase voice_event)
Определения PlayerBase.c:6501
void SetFirstRecipe()
Определения PlayerBase.c:1879
void SetEnableQuickBarEntityShortcut(EntityAI entity, bool value)
Определения PlayerBase.c:2374
EntityAI CreateInInventory(string item_name, string cargo_type="", bool full_quantity=false)
Определения PlayerBase.c:6846
void AntibioticsAttack(float value)
Определения PlayerBase.c:10122
override bool IsWeaponObstructionBlockingADS()
Определения PlayerBase.c:8713
ActionManagerBase GetActionManager()
Определения PlayerBase.c:1887
bool IsItemInInventory(EntityAI entity)
Определения PlayerBase.c:5339
int m_StaminaState
Определения PlayerBase.c:153
void AddActiveNV(int type)
Определения PlayerBase.c:9467
int m_RefreshAnimStateIdx
Определения PlayerBase.c:70
void SetLoadedQuickBarItemBind(EntityAI entity, int index)
Определения PlayerBase.c:8697
void CheckSendSoundEvent()
Определения PlayerBase.c:7829
int m_BleedingBits
Определения PlayerBase.c:168
int m_InventorySoftLockCount
Определения PlayerBase.c:294
void SetLifeSpanStateVisible(int show_state)
Определения PlayerBase.c:7151
override void OnJumpStart()
Определения PlayerBase.c:4422
void RemoveQuickBarEntityShortcut(EntityAI entity)
Определения PlayerBase.c:2367
vector SetDefaultHitPosition(string pSelection)
Определения PlayerBase.c:1485
override bool IsHoldingBreath()
Определения PlayerBase.c:2499
void UpdateTranslatedSelections(SelectionTranslation stt)
Определения PlayerBase.c:9413
ref DebugMonitorValues m_DebugMonitorValues
Определения PlayerBase.c:103
bool m_InventorySoftLocked
Определения PlayerBase.c:293
void MessageImportant(string text)
Определения PlayerBase.c:6942
void SetHitPPEEnabled(bool enabled)
Определения PlayerBase.c:1645
bool m_CanDisplayHitEffectPPE
Определения PlayerBase.c:219
vector m_LastMapPos
Определения PlayerBase.c:289
int GetStoreLoadVersion()
Определения PlayerBase.c:7348
SoftSkillsManager GetSoftSkillsManager()
Определения PlayerBase.c:7299
void ShavePlayer()
Определения PlayerBase.c:7029
ref Param3< float, float, bool > m_StaminaParam
Определения PlayerBase.c:113
bool Consume(ItemBase source, float amount, EConsumeType consume_type)
Определения PlayerBase.c:10078
bool CanSprint()
Определения PlayerBase.c:5612
Hologram GetHologramLocal()
Определения PlayerBase.c:2653
int m_FliesIndex
Определения PlayerBase.c:109
override void OnGameplayDataHandlerSync()
Определения PlayerBase.c:6042
void OnQuickBarContinuousUseStart(int slotClicked)
Определения PlayerBase.c:5042
float GetHealthRegenSpeed()
Определения PlayerBase.c:6592
void SaveAreaPersistenceFlag(ParamsWriteContext ctx)
Определения PlayerBase.c:7400
override bool PredictiveTakeEntityToTargetInventory(notnull EntityAI target, FindInventoryLocationType flags, notnull EntityAI item)
Определения PlayerBase.c:9014
float m_LastFirePointRot
Определения PlayerBase.c:273
void RemovePossibleCoverFaceForShave()
DEPRECATED!
Определения PlayerBase.c:1497
void SetBloodyHandsEx(eBloodyHandsTypes type)
Определения PlayerBase.c:7213
void UnsetMixedSoundState(eMixedSoundStates state)
Определения PlayerBase.c:1036
void IncreaseEffectAreaCount()
Определения PlayerBase.c:854
void SendLiftWeaponSync(bool state, float obstruct=0)
Client-side only.
Определения PlayerBase.c:8777
void UpdateMaskBreathWidget(notnull MaskBase mask, bool is_start=false)
Определения PlayerBase.c:6485
bool IsNVGWorking()
Определения PlayerBase.c:9435
int m_LocalBrokenState
Определения PlayerBase.c:192
override void OnCommandMoveStart()
Определения PlayerBase.c:4516
override void RequestSoundEvent(EPlayerSoundEventID id, bool from_server_and_client=false)
Определения PlayerBase.c:7779
ref Hologram m_HologramLocal
Определения PlayerBase.c:246
int GetSingleAgentCount(int agent_id)
Определения PlayerBase.c:8121
override bool PredictiveTakeEntityToInventory(FindInventoryLocationType flags, notnull EntityAI item)
Определения PlayerBase.c:9029
ref array< string > m_DbgOptions
Определения PlayerBase.c:3112
void QueueAddEffectWidget(array< int > effects)
Определения PlayerBase.c:1135
void SetQuickFishing(bool enable)
Определения PlayerBase.c:2017
override bool CanPickupHeavyItem(notnull EntityAI item)
Определения PlayerBase.c:4160
PluginPresenceNotifier m_PresenceNotifier
Определения PlayerBase.c:80
void SetInColdArea(bool state)
Определения PlayerBase.c:2924
void DecreaseContaminatedAreaCount()
Определения PlayerBase.c:845
bool IsQuickRestrain()
Определения PlayerBase.c:2022
bool IsFalling()
Определения PlayerBase.c:5655
void OnPlayerReceiveFlashbangHitEnd()
Определения PlayerBase.c:1456
EmoteManager GetEmoteManager()
Определения PlayerBase.c:1892
void RunFightBlendTimer()
Определения PlayerBase.c:5683
void SetFlagTendencyRaise(bool state)
DEPRECATED.
Определения PlayerBase.c:5319
void AddMedicalDrugsInUse(EMedicalDrugsType drugType)
Определения PlayerBase.c:739
float m_UnconsciousVignetteTarget
Определения PlayerBase.c:164
void CheckZeroSoundEvent()
Определения PlayerBase.c:7818
ref EffectSound m_SoundFliesEffect
Определения PlayerBase.c:136
void HandleGlassesEffect()
Определения PlayerBase.c:9930
int SimplifyShock()
Определения PlayerBase.c:3913
EUndergroundPresence GetUndergroundPresence()
Определения PlayerBase.c:2848
int GetShakeLevel()
Определения PlayerBase.c:5449
int m_Shakes
Определения PlayerBase.c:175
void SendSoundEvent(EPlayerSoundEventID id)
Определения PlayerBase.c:7795
float GetVisibilityCoef()
Определения PlayerBase.c:5443
DayZPlayerCamera GetCurrentPlayerCamera()
Определения PlayerBase.c:2960
EStatLevels GetStatLevelBlood()
Определения PlayerBase.c:5467
override bool IsManagingArrows()
Определения PlayerBase.c:10013
void OnPlayerIsNowInsideEffectAreaEndClient()
Определения PlayerBase.c:973
PlayerStat< float > m_StatTremor
Определения PlayerBase.c:332
EntityAI FindCargoByBaseType(string searched_item)
Определения PlayerBase.c:2534
void UpdateDelete()
Определения PlayerBase.c:8594
int m_FaceCoveredForShaveLayers
Определения PlayerBase.c:10054
static set< int > GetFaceCoverageShaveValues()
returns a set of face covering values
Определения PlayerBase.c:7188
bool IsPlayerLoaded()
Определения PlayerBase.c:8967
vector m_DefaultHitPosition
Определения PlayerBase.c:170
void OnBleedingBegin()
override void OnCommandLadderFinish()
Определения PlayerBase.c:4280
ref BleedingSourcesManagerServer m_BleedingManagerServer
Определения PlayerBase.c:85
override void JunctureDeleteItem(EntityAI item)
Определения PlayerBase.c:8589
bool IsMale()
Определения PlayerBase.c:1650
ScriptInvoker GetOnUnconsciousStart()
Определения PlayerBase.c:707
int GetBleedingSourceCount()
Определения PlayerBase.c:7930
override void OnCommandMelee2Finish()
Определения PlayerBase.c:4399
PlayerStat< float > m_StatSpecialty
Определения PlayerBase.c:337
override void OnCommandSwimStart()
Определения PlayerBase.c:4217
bool m_IsVehicleSeatDriver
Определения PlayerBase.c:181
void TestSend()
Определения PlayerBase.c:8030
override void RequestSoundEventStop(EPlayerSoundEventID id, bool from_server_and_client=false, int param=EPlayerSoundEventParam.STOP_PLAYBACK)
Определения PlayerBase.c:7784
void CloseInventoryMenu()
Определения PlayerBase.c:6947
void ClearBloodyHandsPenaltyChancePerAgent(eAgents type)
Определения PlayerBase.c:7268
int m_BleedingSourceCount
Определения PlayerBase.c:183
override void OnVehicleSeatDriverEnter()
Определения PlayerBase.c:4561
bool CheckMeleeItemDamage(ItemBase item)
Определения PlayerBase.c:5698
int FindQuickBarEntityIndex(EntityAI entity)
Определения PlayerBase.c:2382
void SetToDelete(ParamsReadContext pCtx)
Определения PlayerBase.c:8568
void OnUpdateEffectAreaServer(float timeSlice)
Определения PlayerBase.c:911
EMedicalDrugsType m_MedicalDrugsActive
Определения PlayerBase.c:350
override bool PredictiveTakeEntityToTargetAttachmentEx(notnull EntityAI target, notnull EntityAI item, int slot)
Определения PlayerBase.c:9058
bool m_FlagRaisingTendency
Определения PlayerBase.c:58
int GetBleedingBits()
Определения PlayerBase.c:1088
override bool CanRoll()
Определения PlayerBase.c:4530
float GetBloodyHandsPenaltyChancePerAgent(eAgents type)
Определения PlayerBase.c:7251
void SetActions()
Определения PlayerBase.c:1747
int m_MixedSoundStates
Определения PlayerBase.c:179
bool IsStance(int stance, int stanceMask)
Определения PlayerBase.c:4452
void SetModifiers(bool enable)
Определения PlayerBase.c:7684
bool IsCurrentCameraAimedAtGround()
Определения PlayerBase.c:2965
ref Timer m_UALastMessageTimer
Определения PlayerBase.c:308
void OnSelectPlayer()
Определения PlayerBase.c:6298
override bool PredictiveTakeEntityToTargetCargo(notnull EntityAI target, notnull EntityAI item)
Определения PlayerBase.c:9072
void OnVehicleSwitchSeat(int seatIndex)
Определения PlayerBase.c:4557
ref InventoryActionHandler m_InventoryActionHandler
Определения PlayerBase.c:131
int m_BreathVapour
Определения PlayerBase.c:177
EStatLevels GetImmunityLevel()
Определения PlayerBase.c:5485
int m_PersistentFlags
Определения PlayerBase.c:152
bool m_WorkingNVGHeadset
Определения PlayerBase.c:312
ref TransferValues m_TrasferValues
Определения PlayerBase.c:102
EStatLevels GetStatLevelToxicity()
Определения PlayerBase.c:5461
bool IsJumpInProgress()
Определения PlayerBase.c:4868
void ProcessHoldBreath(float dT)
Определения PlayerBase.c:2465
void KillUndergroundHandler()
Определения PlayerBase.c:1687
void UnsetInEffectAreaTypeFlag(EEffectAreaType flag)
Определения PlayerBase.c:889
PlayerStat< float > GetStatTremor()
Определения PlayerBase.c:8233
bool m_HasBloodTypeVisible
Определения PlayerBase.c:56
bool IsInRasedProne()
Определения PlayerBase.c:5635
bool Consume(PlayerConsumeData data)
Определения PlayerBase.c:7689
void AddAction(typename actionName)
Определения PlayerBase.c:1838
Hud m_Hud
Определения PlayerBase.c:139
void SpawnBreathVaporEffect()
Определения PlayerBase.c:7106
bool IsMapOpen()
Определения PlayerBase.c:3617
void BreakLegSound()
Определения PlayerBase.c:4037
void ApplySplint()
Определения PlayerBase.c:2423
ref Param1< float > m_DeathDarkeningParam
Определения PlayerBase.c:116
void SetMapClosingSyncSet(bool state)
Определения PlayerBase.c:3622
void OnPlayerIsNowInsideEffectAreaBeginClient()
Определения PlayerBase.c:968
bool TogglePlacingServer(int userDataType, ParamsReadContext ctx)
Определения PlayerBase.c:2785
override bool PredictiveTakeToDst(notnull InventoryLocation src, notnull InventoryLocation dst)
Определения PlayerBase.c:9225
ref VirtualHud m_VirtualHud
Определения PlayerBase.c:96
const float m_SurrenderAnimationTransitionTime
Определения PlayerBase.c:317
ScriptInvoker GetOnPlayerLoadChanged()
Определения PlayerBase.c:723
const int SHAKE_LEVEL_MAX
Определения PlayerBase.c:52
ref Timer m_AnalyticsTimer
Определения PlayerBase.c:299
void UpdateCorpseStateVisual()
Определения PlayerBase.c:9596
bool IsRestrainPrelocked()
Определения PlayerBase.c:2201
void AdjustShemag(EntityAI item, string slot_name)
Определения PlayerBase.c:9561
override bool IsAlreadyInFallingCommand(int pCurrentCommandID)
Определения PlayerBase.c:3744
ref TInputActionMap m_InputActionMapControled
Определения PlayerBase.c:123
override void OnCommandClimbFinish()
Определения PlayerBase.c:4333
ref HiddenSelectionsData m_EmptyGloves
Определения PlayerBase.c:127
bool m_IsSurrendered
Определения PlayerBase.c:314
NotifiersManager GetNotifiersManager()
Определения PlayerBase.c:3114
bool HasStaminaRemaining()
Определения PlayerBase.c:10089
bool IsQuickFishing()
Определения PlayerBase.c:2027
void SetLastFirePoint(vector last_fire_point)
Определения PlayerBase.c:2350
eBloodyHandsTypes HasBloodyHandsEx()
Определения PlayerBase.c:7198
float m_LastPostFrameTickTime
Определения PlayerBase.c:143
string m_CachedPlayerID
Определения PlayerBase.c:222
float GetStatBordersToxicity()
Определения PlayerBase.c:5509
void DecreaseDiseaseCount()
Определения PlayerBase.c:1098
void SetActions(out TInputActionMap InputActionMap)
Определения PlayerBase.c:1695
float m_HeatBufferDynamicMax
Определения PlayerBase.c:63
void SetActionsRemoteTarget()
Определения PlayerBase.c:1760
bool GetLastMapInfo(out float scale, out vector pos)
Определения PlayerBase.c:9709
int GetStaminaState()
Определения PlayerBase.c:8047
void ProcessADDModifier()
Определения PlayerBase.c:7094
void FreezeCheck()
Определения PlayerBase.c:3683
override int GetAgents()
Определения PlayerBase.c:8096
void SetRestrained(bool is_restrained)
Определения PlayerBase.c:2206
int GetLifeSpanState()
Определения PlayerBase.c:7167
void SetLocalProjectionPosition(vector local_position)
Определения PlayerBase.c:2897
ref ScriptInvoker m_OnUnconsciousStop
Определения PlayerBase.c:354
int GetVoiceType()
Определения PlayerBase.c:1659
void InitEditor()
Определения PlayerBase.c:2556
void OnRestrainStart()
Определения PlayerBase.c:3953
int m_HealthLevel
Определения PlayerBase.c:178
void OnDrowningEnd()
Определения PlayerBase.c:2771
ref SoftSkillsManager m_SoftSkillsManager
Определения PlayerBase.c:100
bool m_IsFighting
Определения PlayerBase.c:277
override string GetHitComponentForAI()
Melee helpers.
Определения PlayerBase.c:1463
override vector GetCenter()
Определения PlayerBase.c:9883
float GetWeightSpecialized(bool forceRecalc=false)
Определения PlayerBase.c:5385
override void EEItemAttached(EntityAI item, string slot_name)
Определения PlayerBase.c:1502
bool CheckAndExecuteStackSplitToInventoryLocation(InventoryLocation il, notnull EntityAI item)
Определения PlayerBase.c:9801
BleedingSourcesManagerRemote GetBleedingManagerRemote()
Определения PlayerBase.c:2978
PlayerStat< float > GetStatHeatComfort()
Определения PlayerBase.c:8224
ref ScriptInvoker m_OnUnconsciousStart
invokers
Определения PlayerBase.c:353
bool TakeEntityToTargetInventoryImpl(InventoryMode mode, notnull EntityAI target, FindInventoryLocationType flags, notnull EntityAI item)
Определения PlayerBase.c:9839
override void OnCommandSwimFinish()
Определения PlayerBase.c:4251
bool Save()
Определения PlayerBase.c:8057
override void OnCommandVehicleStart()
Определения PlayerBase.c:4342
bool IsSyncedModifierActive(eModifierSyncIDs modifier)
Checks whether modifier (which has syncing enabled) is currently active, works on both Client and Ser...
Определения PlayerBase.c:6263
FlashbangEffect GetFlashbangEffect()
Определения PlayerBase.c:1183
override bool PhysicalPredictiveDropItem(EntityAI entity, bool heavy_item_only=true)
Определения PlayerBase.c:9717
float m_UnconRefillModifier
Определения PlayerBase.c:200
ref ModifiersManager m_ModifiersManager
Определения PlayerBase.c:88
void PrintAgents()
Определения PlayerBase.c:8138
string GetPlayerClass()
Определения PlayerBase.c:7018
string m_DecayedTexture
Определения PlayerBase.c:189
ref map< EEffectAreaType, int > m_EffectAreaOverlap
Определения PlayerBase.c:216
int m_LastFirePointIndex
Определения PlayerBase.c:274
void CloseMap()
DEPRECATED; terminates map animation callback and re-enables controls.
Определения PlayerBase.c:3553
void OnDrowningStart()
Определения PlayerBase.c:2756
ShockDealtEffect GetShockEffect()
Определения PlayerBase.c:1199
ref ScriptInvoker m_OnPlayerLoadChanged
Определения PlayerBase.c:355
void PlacingStartServer(ItemBase item)
Определения PlayerBase.c:2658
ref array< EntityAI > m_ItemsToDelete
Определения PlayerBase.c:190
override void DepleteStamina(EStaminaModifiers modifier, float dT=-1)
Определения PlayerBase.c:10102
override void ProcessFeetDamageServer(int pUserInt)
Определения PlayerBase.c:1945
override void InsertAgent(int agent, float count=1)
Определения PlayerBase.c:8115
void OnReconnect()
Определения PlayerBase.c:7638
void SetQuickBarEntityShortcut(EntityAI entity, int index, bool force=false)
Определения PlayerBase.c:2411
PlayerStat< float > m_StatToxicity
Определения PlayerBase.c:329
bool m_ActionQBControl
Определения PlayerBase.c:267
override void OnFreezeStateChangeClient()
Определения PlayerBase.c:10028
bool m_PlayerDisconnectProcessed
Определения PlayerBase.c:67
bool GetDrowningWaterLevelCheck()
Определения PlayerBase.c:7134
int m_AnimCommandStarting
Определения PlayerBase.c:74
bool m_IsRestrainPrelocked
Определения PlayerBase.c:161
int m_ForceInjuryAnimMask
Определения PlayerBase.c:187
ref EffectSound m_BrokenLegSound
Определения PlayerBase.c:194
void SetPlayerDisconnected(bool state)
Определения PlayerBase.c:2633
PlayerStat< float > GetStatWater()
Определения PlayerBase.c:8197
override void OnCommandVehicleFinish()
Определения PlayerBase.c:4375
override bool PlaySoundEventType(ESoundEventType soundType, int soundEventID, int param=0)
Определения PlayerBase.c:7837
int m_DbgListSelection
Определения PlayerBase.c:3110
PlayerStat< int > GetStatBloodType()
Определения PlayerBase.c:8278
void SetLastUAMessage(string pMsg)
Определения PlayerBase.c:8325
override void GetDebugActions(out TSelectableActionInfoArrayEx outputList)
Определения PlayerBase.c:8398
override void OnVehicleSeatDriverLeft()
Определения PlayerBase.c:4579
void SetShakesForced(int value)
Определения PlayerBase.c:3678
bool CanManipulateInventory()
Определения PlayerBase.c:2253
float GetLastFirePointRot()
Определения PlayerBase.c:2341
void SpawnDamageDealtEffect2(Param param1=null, Param param2=null)
Определения PlayerBase.c:1173
int m_DebugMonitorEnabled
Определения PlayerBase.c:281
EntityAI GetQuickBarEntity(int index)
Определения PlayerBase.c:2399
StaminaHandler GetStaminaHandler()
Определения PlayerBase.c:2042
override bool CanReceiveItemIntoCargo(EntityAI item)
Определения PlayerBase.c:2272
ref SoundObjectBuilder m_SaySoundBuilder
Определения PlayerBase.c:263
int m_LifeSpanState
Определения PlayerBase.c:53
static ref array< Man > m_ServerPlayers
Определения PlayerBase.c:218
ref NotifiersManager m_NotifiersManager
Определения PlayerBase.c:89
override bool PlaySoundEvent(EPlayerSoundEventID id, bool from_anim_system=false, bool is_from_server=false)
Определения PlayerBase.c:7845
override void EOnPostFrame(IEntity other, int extra)
Определения PlayerBase.c:4627
ref StanceIndicator m_StanceIndicator
Определения PlayerBase.c:101
float ConvertNonlethalDamage(float damage, DamageType damageType)
Определения PlayerBase.c:1402
ItemBase GetItemInHands()
Определения PlayerBase.c:6733
void OnUnconsciousStop(int pCurrentCommandID)
Определения PlayerBase.c:3819
EntityAI SpawnEntityOnGroundRaycastDispersed(string object_name, float raycastDistance=DEFAULT_SPAWN_DISTANCE, float radius=UAItemsSpreadRadius.DEFAULT)
Определения PlayerBase.c:6795
float GetPlayerLoad()
Определения PlayerBase.c:5329
int GetLastFirePointIndex()
Определения PlayerBase.c:2345
void SetCheckMeleeItem(ItemBase item=null)
Определения PlayerBase.c:3673
static bool DEBUG_INVENTORY_ACCESS
Определения PlayerBase.c:197
void OnStoreSaveLifespan(ParamsWriteContext ctx)
Определения PlayerBase.c:7551
float m_SurrenderTransitionTimer
Определения PlayerBase.c:316
int m_HeatBufferStage
Определения PlayerBase.c:62
void SetDecayEffects(int effect=-1)
Определения PlayerBase.c:9643
bool GetHitPPEEnabled()
Определения PlayerBase.c:1640
PluginAdminLog m_AdminLog
Определения PlayerBase.c:322
bool CanRedirectToWeaponManager(notnull EntityAI item, out bool isActionPossible)
Определения PlayerBase.c:8992
bool HasCoveredFaceForShave()
Определения PlayerBase.c:7182
bool m_PlayerLoaded
Определения PlayerBase.c:66
ref array< ref Param2< EntityAI, int > > m_aQuickBarLoad
Определения PlayerBase.c:242
void DealShock(float dmg)
Определения PlayerBase.c:4152
void SetPulseType(EPulseType pulse_type)
Определения PlayerBase.c:1130
void SetDrowning(bool enable)
Определения PlayerBase.c:2743
void SetRestrainPrelocked(bool restrain_prelock)
Определения PlayerBase.c:2195
ActionUnfoldMapCB m_hac
Определения PlayerBase.c:284
PlayerStats GetPlayerStats()
Определения PlayerBase.c:2032
int m_LifespanLevelLocal
Определения PlayerBase.c:73
void OnCameraChanged(DayZPlayerCameraBase new_camera)
Определения PlayerBase.c:2954
void OnFinishTransitionToSurrender()
Определения PlayerBase.c:2073
override void OnCommandFallStart()
Определения PlayerBase.c:4291
ref SoundParams m_SaySoundParams
Определения PlayerBase.c:262
bool m_MapOpen
Определения PlayerBase.c:285
PlayerSoundEventHandler GetPlayerSoundEventHandler()
Определения PlayerBase.c:7866
EntityAI GetMagazineToReload(EntityAI weapon)
Определения PlayerBase.c:5189
void QueueAddGlassesEffect(int id)
Определения PlayerBase.c:1145
void OnDisconnect()
Определения PlayerBase.c:7647
bool m_HideHairAnimated
Определения PlayerBase.c:188
override bool IsInventoryVisible()
Определения PlayerBase.c:2248
void CalculateVisibilityForAI()
Определения PlayerBase.c:5405
bool IsSprinting()
Определения PlayerBase.c:5607
void SetBloodyHandsPenalty()
Определения PlayerBase.c:10097
float m_CurrentShock
Определения PlayerBase.c:156
RandomGeneratorSyncManager GetRandomGeneratorSyncManager()
Определения PlayerBase.c:1897
void OnScheduledTick(float deltaTime)
Определения PlayerBase.c:3007
void AddAction(typename actionName, out TInputActionMap InputActionMap)
Определения PlayerBase.c:1817
void SetBloodyHandsPenaltyChancePerAgent(eAgents type, float amount)
increments the chances per agents
Определения PlayerBase.c:7261
void SetLastFirePointIndex(int last_fire_point_index)
Определения PlayerBase.c:2358
PluginRecipesManager m_ModuleRecipesManager
Определения PlayerBase.c:84
void CheckSoundEvent()
Определения PlayerBase.c:8004
int m_AddModifier
Определения PlayerBase.c:252
vector m_CraftingInitialPos
Определения PlayerBase.c:259
PlayerStat< int > GetStatWet()
Определения PlayerBase.c:8242
override void HideClothing(ItemOptics optic, bool state)
state 'true' == hide
Определения PlayerBase.c:8868
void RemoveMedicalDrugsInUse(EMedicalDrugsType drugType)
Определения PlayerBase.c:745
vector GetLocalProjectionPosition()
Определения PlayerBase.c:2914
ItemBase CreateCopyOfItemInInventoryOrGround(ItemBase src)
Определения PlayerBase.c:6883
ref array< int > m_ActiveNVTypes
Определения PlayerBase.c:318
Head_Default m_CharactersHead
Определения PlayerBase.c:184
override bool HeadingModel(float pDt, SDayZPlayerHeadingModel pModel)
Определения PlayerBase.c:8640
EStatLevels GetStatLevelWater()
Определения PlayerBase.c:5479
void SetPerformedActionID(int id)
Определения PlayerBase.c:767
void ToggleHeatBufferVisibility(int heatbufferStage)
Определения PlayerBase.c:8313
void OnBleedingEnd()
PluginLifespan m_ModuleLifespan
Определения PlayerBase.c:79
int m_SoundEventParam
Определения PlayerBase.c:108
void OnRestrainChangeClient()
Определения PlayerBase.c:2236
PlayerStat< float > GetStatStamina()
Определения PlayerBase.c:8260
override void AfterStoreLoad()
Определения PlayerBase.c:7531
PlayerStat< float > m_StatStamina
Определения PlayerBase.c:336
void OnQuickBarContinuousUseEnd(int slotClicked)
Определения PlayerBase.c:5077
bool DropItem(ItemBase item)
Определения PlayerBase.c:6818
void ProcessHandDamage(float delta_time, HumanMovementState pState)
Определения PlayerBase.c:1908
float GetStatBordersHealth()
Определения PlayerBase.c:5502
float GetTotalAgentCount()
Определения PlayerBase.c:8133
override bool IsInventorySoftLocked()
Определения PlayerBase.c:8678
void PlacingStartLocal(ItemBase item)
Определения PlayerBase.c:2671
const string SOUND_BREAK_LEG
Определения PlayerBase.c:195
void CheckDeath()
Определения PlayerBase.c:7304
void ForceUpdateInjuredState()
update injured state immediately
Определения PlayerBase.c:8351
void OnPlayerIsNowInsideEffectAreaBeginServer()
Определения PlayerBase.c:958
bool IsPlayerDisconnected()
Определения PlayerBase.c:2638
ref WeaponManager m_WeaponManager
Определения PlayerBase.c:128
bool GetFlagTendencyRaise()
DEPRECATED.
Определения PlayerBase.c:5313
void SetTemporaryResistanceToAgent(int agent, float time)
Определения PlayerBase.c:8148
override void RequestSoundEventEx(EPlayerSoundEventID id, bool from_server_and_client=false, int param=0)
Определения PlayerBase.c:7768
void OnQuickBarSingleUse(int slotClicked)
Определения PlayerBase.c:4938
void MovingShock(float legHealth, float highShock, float midShock, float lowShock)
Определения PlayerBase.c:4133
void BrokenLegWalkShock()
Определения PlayerBase.c:4084
void OnBleedingSourceRemoved()
Определения PlayerBase.c:7894
void OnInventoryMenuOpen()
ref StaminaHandler m_StaminaHandler
Определения PlayerBase.c:97
int m_Agents
Определения PlayerBase.c:92
override void OnCommandMelee2Start()
Определения PlayerBase.c:4389
ref DamageDealtEffect m_DamageDealtEffect
Определения PlayerBase.c:117
bool IsNVGLowered()
Определения PlayerBase.c:9440
override void ClearInventory()
Определения PlayerBase.c:6973
PlayerStat< float > m_StatWater
Определения PlayerBase.c:328
override void DepleteStaminaEx(EStaminaModifiers modifier, float dT=-1, float coef=1.0)
Определения PlayerBase.c:4793
bool m_ContaminatedAreaEffectEnabled
Определения PlayerBase.c:205
bool HasDisease()
Определения PlayerBase.c:1119
override void RPC(int rpc_type, array< ref Param > params, bool guaranteed, PlayerIdentity recipient=NULL)
Определения PlayerBase.c:5721
void ResetConstructionActionData()
Определения PlayerBase.c:2326
void Init()
Определения PlayerBase.c:364
ref ConstructionActionData m_ConstructionActionData
Определения PlayerBase.c:270
MapNavigationBehaviour GetMapNavigationBehaviour()
Определения PlayerBase.c:3652
ItemBase CreateCopyOfItemInInventory(ItemBase src)
Определения PlayerBase.c:6856
RandomGeneratorSyncManager m_RGSManager
Определения PlayerBase.c:201
bool IsPlacingLocal()
Определения PlayerBase.c:2738
override bool IsIgnoredByConstruction()
Определения PlayerBase.c:5669
int m_HasBloodyHandsVisible
Определения PlayerBase.c:59
void DecreaseAntibioticsCount()
Определения PlayerBase.c:10073
static Particle m_ContaminatedAroundPlayer
Определения PlayerBase.c:325
ref Timer m_DeathCheckTimer
Определения PlayerBase.c:145
ref Param1< float > m_UnconParam
Определения PlayerBase.c:115
override void OnSyncJuncture(int pJunctureID, ParamsReadContext pCtx)
Определения PlayerBase.c:8478
static ref array< Object > SPREAD_AGENTS_OBJECTS
Определения PlayerBase.c:10049
override void OnRPC(PlayerIdentity sender, int rpc_type, ParamsReadContext ctx)
Определения PlayerBase.c:5727
array< int > GetNVTypesArray()
Определения PlayerBase.c:9457
bool m_ImmunityBoosted
Определения PlayerBase.c:162
int m_DiseaseCount
Определения PlayerBase.c:171
string m_SaySoundLastSetName
Определения PlayerBase.c:265
ConstructionActionData GetConstructionActionData()
Определения PlayerBase.c:2321
string GetCachedID()
Определения PlayerBase.c:10023
float m_CameraSwayModifier
Определения PlayerBase.c:165
int m_StoreLoadVersion
Определения PlayerBase.c:71
EntityAI SpawnEntityOnGroundOnCursorDir(string object_name, float distance)
Определения PlayerBase.c:6801
override void TakeEntityToHandsImpl(InventoryMode mode, EntityAI item)
Определения PlayerBase.c:9828
static ref TStringArray m_QBarItems
Определения PlayerBase.c:295
override bool OnLand(int pCurrentCommandID, FallDamageData fallDamageData)
Определения PlayerBase.c:3731
ref HeatComfortAnimHandler m_HCAnimHandler
Определения PlayerBase.c:135
override void RemoveAllAgents()
Определения PlayerBase.c:8108
bool m_IsCraftingReady
Определения PlayerBase.c:257
int GetLastShavedSeconds()
Определения PlayerBase.c:7172
bool m_InsideEffectArea
Определения PlayerBase.c:210
void SetLegHealth()
Определения PlayerBase.c:4169
void SpreadAgentsEx(float distance=3, float chance=0.25)
chance between [0..1] , distance in meters
Определения PlayerBase.c:8072
void SetLiftWeapon(int pJunctureID, ParamsReadContext ctx)
Определения PlayerBase.c:8757
bool HandleRemoteItemManipulation(int userDataType, ParamsReadContext ctx)
Определения PlayerBase.c:6600
bool GetInColdArea()
Определения PlayerBase.c:2933
void DamageAllLegs(float inputDmg)
Определения PlayerBase.c:9761
int GetBloodType()
Определения PlayerBase.c:7284
float m_VisibilityCoef
Определения PlayerBase.c:105
void RequestResetADSSync()
Определения PlayerBase.c:2796
void RemoveActiveNV(int type)
Определения PlayerBase.c:9482
bool GetMapClosingSyncSent()
Определения PlayerBase.c:3627
void SetInEffectAreaTypeFlag(EEffectAreaType flag)
Определения PlayerBase.c:877
bool m_QuickBarHold
Определения PlayerBase.c:137
void BrokenLegForceProne(bool forceOverride=false)
Определения PlayerBase.c:4041
void SetSurrenderState(bool newState)
Определения PlayerBase.c:2116
bool CanShave()
Определения PlayerBase.c:7036
void NotifyPlayerLoadChanged()
Определения PlayerBase.c:731
void UpdateQuickBarExtraSlots()
Определения PlayerBase.c:8052
override bool CanBeTargetedByAI(EntityAI ai)
Определения PlayerBase.c:3935
override bool CanPlaceItem(EntityAI item)
Определения PlayerBase.c:2834
void DropAllItems()
Drops all clothes/wearables this character is carrying on themselves.
Определения PlayerBase.c:7000
ref UndergroundBunkerHandlerClient m_UndergroundBunkerHandler
Определения PlayerBase.c:10052
ScriptInvoker GetOnUnconsciousStop()
Определения PlayerBase.c:715
void RemoveAllItems()
Определения PlayerBase.c:1625
float m_LastMapScale
Определения PlayerBase.c:288
override bool PlaySoundEventEx(EPlayerSoundEventID id, bool from_anim_system=false, bool is_from_server=false, int param=0)
Определения PlayerBase.c:7850
void SpawnFlashbangEffect(PlayerBase player, bool visual)
Определения PlayerBase.c:1188
void PlayerBase()
Определения PlayerBase.c:359
PluginConfigEmotesProfile m_ConfigEmotesProfile
Определения PlayerBase.c:78
void HideHairSelections(ItemBase item, bool state)
Определения PlayerBase.c:9313
ref FlashbangEffect m_FlashbangEffect
Определения PlayerBase.c:119
override void CheckAnimationOverrides()
Определения PlayerBase.c:8973
bool IsItemsToDelete()
Определения PlayerBase.c:8563
bool OnStoreLoadLifespan(ParamsReadContext ctx, int version)
Определения PlayerBase.c:7560
void SetVisibilityCoef(float pVisibility)
Определения PlayerBase.c:5438
EStatLevels GetStatLevelHealth()
Определения PlayerBase.c:5455
float GetStatBordersBlood()
Определения PlayerBase.c:5516
int GetBloodyHandsPenaltyAgents()
Определения PlayerBase.c:7234
override void OnParticleEvent(string pEventType, string pUserString, int pUserInt)
Определения PlayerBase.c:7049
void OnContaminatedAreaExitServer()
Определения PlayerBase.c:952
void PlacingCompleteLocal()
Определения PlayerBase.c:2727
bool m_IsRestrainedLocal
Определения PlayerBase.c:158
void SetNewCharName()
Определения PlayerBase.c:6432
EUndergroundPresence m_UndergroundPresence
Определения PlayerBase.c:75
override bool IsSelfAdjustingTemperature()
Определения PlayerBase.c:2509
vector GetAimPosition()
Определения PlayerBase.c:8164
override void SetInventorySoftLock(bool status)
'soft lock' meaning inventory screen cannot be displayed, but mechanically, inventory operations are ...
Определения PlayerBase.c:8684
bool TakeEntityToTargetCargoImpl(InventoryMode mode, notnull EntityAI target, notnull EntityAI item)
Определения PlayerBase.c:9850
AbstractWave SaySoundSet(string name)
Определения PlayerBase.c:2519
void PlacingCompleteServer()
Определения PlayerBase.c:2721
override bool IsInFBEmoteState()
Определения PlayerBase.c:8943
void SetRestrainStarted(bool restrain_started)
Определения PlayerBase.c:2184
QuickBarBase m_QuickBarBase
Определения PlayerBase.c:132
bool IsChelationActive()
Определения PlayerBase.c:751
void CheckShouldCancelSurrender()
Определения PlayerBase.c:3183
bool m_AllowQuickFishing
Определения PlayerBase.c:174
void ProcessDrowning(float dT)
Определения PlayerBase.c:2436
override void OnRollStart(bool isToTheRight)
Определения PlayerBase.c:4543
eBrokenLegs GetBrokenLegs()
Определения PlayerBase.c:3966
void ShockRefill(float pDt)
functionality moved to ShockMdfr::OnTick
void TryHideItemInHands(bool hide, bool force=false)
tries to hide item in player's hands, some exceptions for various movement states
Определения PlayerBase.c:9774
float m_RecipeAnimLength
Определения PlayerBase.c:258
ref Param1< string > m_UAParamMessage
Определения PlayerBase.c:114
override void CheckLiftWeapon()
Определения PlayerBase.c:8816
void InitializeActions()
Определения PlayerBase.c:1764
void SetQuickRestrain(bool enable)
Определения PlayerBase.c:2012
void AddPlayerLoad(float addedload)
Определения PlayerBase.c:10134
void RequestHandAnimationStateRefresh()
Определения PlayerBase.c:4895
ActionManagerBase m_ActionManager
Определения PlayerBase.c:90
override bool CanJump()
Определения PlayerBase.c:4846
override void OnJumpEnd(int pLandType=0)
Определения PlayerBase.c:4432
override void OnCommandFallFinish()
Определения PlayerBase.c:4306
bool IsOverloaded()
Определения PlayerBase.c:5334
ref ShockHandler m_ShockHandler
Определения PlayerBase.c:99
int m_LocalRefreshAnimStateIdx
Определения PlayerBase.c:69
bool m_HasHeatBuffer
Определения PlayerBase.c:61
bool IsMapCallbackEndInput()
Определения PlayerBase.c:3642
float GetFeetDamageMoveModifier()
Определения PlayerBase.c:1980
bool HasBloodTypeVisible()
Определения PlayerBase.c:7273
vector m_LocalProjectionPosition
Определения PlayerBase.c:247
int m_EffectAreaCount
Определения PlayerBase.c:209
void OnHoldBreathExhausted()
Определения PlayerBase.c:2488
ref TInputActionMap m_InputActionMapAsTarget
Определения PlayerBase.c:124
override bool PredictiveForceSwapEntities(notnull EntityAI item1, notnull EntityAI item2, notnull InventoryLocation item2_dst)
Определения PlayerBase.c:9183
PlayerStat< float > GetStatHeatBuffer()
Определения PlayerBase.c:8287
void SetBleedingBits(int bits)
Определения PlayerBase.c:1071
void ContaminatedParticleAdjustment()
Определения PlayerBase.c:9890
void OnTick()
Определения PlayerBase.c:3120
void LockHandsUntilItemHeld()
Определения PlayerBase.c:2704
void ResetActionEndInput()
Определения PlayerBase.c:5116
void ~PlayerBase()
Определения PlayerBase.c:616
void SetLiquidTendencyDrain(bool state)
Определения PlayerBase.c:5306
void UpdateMovementInertia()
Update movement inertia based on stamina available.
Определения PlayerBase.c:3097
UndergroundBunkerHandlerClient GetUndergroundBunkerHandler()
Определения PlayerBase.c:10109
bool m_IsHeadingRestricted
Определения PlayerBase.c:149
override bool CanReceiveItemIntoHands(EntityAI item_to_hands)
Определения PlayerBase.c:2282
override bool CanConsumeStamina(EStaminaConsumers consumer)
Определения PlayerBase.c:4799
void SetNextRecipe()
Определения PlayerBase.c:1874
ref InjuryAnimationHandler m_InjuryHandler
Определения PlayerBase.c:98
void UpdatePlayerMeasures()
Определения PlayerBase.c:7602
void OnContaminatedAreaEnterServer()
Определения PlayerBase.c:946
void ToggleHeatBufferVisibility(bool show)
Определения PlayerBase.c:8307
int m_AntibioticsActive
Определения PlayerBase.c:10055
void SetLastShavedSeconds(int last_shaved_seconds)
Определения PlayerBase.c:7177
int m_CorpseState
Определения PlayerBase.c:147
override void AddItemToDelete(EntityAI item)
Определения PlayerBase.c:8575
override void EEHealthLevelChanged(int oldLevel, int newLevel, string zone)
Определения PlayerBase.c:6152
override bool CanClimb(int climbType, SHumanCommandClimbResult climbRes)
Определения PlayerBase.c:4825
bool IsWearingSplint()
Определения PlayerBase.c:4184
ref PlayerSoundManagerClient m_PlayerSoundManagerClient
Определения PlayerBase.c:134
bool IsRestrainStarted()
Определения PlayerBase.c:2190
ref HeadingRestrictData m_HeadingRestrictData
Определения PlayerBase.c:150
override void EEHitByRemote(int damageType, EntityAI source, int component, string dmgZone, string ammo, vector modelPos)
Определения PlayerBase.c:1382
ref EmoteManager m_EmoteManager
Определения PlayerBase.c:94
void SetContaminatedEffect(bool enable, int ppeIdx=-1, int aroundId=ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId=ParticleList.CONTAMINATED_AREA_GAS_TINY, bool partDynaUpdate=false, int newBirthRate=0)
Определения PlayerBase.c:6127
int m_CorpseStateLocal
Определения PlayerBase.c:148
void OnRestrainStartedChangeClient()
Определения PlayerBase.c:2224
PlayerStat< int > m_StatBloodType
Определения PlayerBase.c:334
override ArrowManagerBase GetArrowManager()
Определения PlayerBase.c:2052
ref map< eAgents, float > m_BloodyHandsPenaltyChancePerAgent
Определения PlayerBase.c:357
float m_CargoLoad
Определения PlayerBase.c:10057
const string CONTAMINATED_AREA_AMBIENT
Определения PlayerBase.c:206
void GiveShock(float shock)
Определения PlayerBase.c:3947
override void SetProcessUIWarning(bool state)
Определения PlayerBase.c:9746
bool m_QuickBarFT
Определения PlayerBase.c:138
bool TakeToDstImpl(InventoryMode mode, notnull InventoryLocation src, notnull InventoryLocation dst)
Определения PlayerBase.c:9872
void SetBrokenLegs(int stateId)
Определения PlayerBase.c:3972
bool m_IsInWater
Определения PlayerBase.c:142
int m_SyncedModifiers
Определения PlayerBase.c:320
override void SimulateDeath(bool state)
Определения PlayerBase.c:6419
int GetPerformedActionID()
Определения PlayerBase.c:773
int GetNoisePresenceInAI()
Return actual noise presence of player.
Определения PlayerBase.c:7320
bool HasHealings()
Определения PlayerBase.c:1114
void CheckHairClippingOnCharacterLoad()
helper method for re-checking hairhiding on character load
Определения PlayerBase.c:9426
void SetBloodyHandsBase(int type)
Определения PlayerBase.c:7218
void SetContaminatedEffectEx(bool enable, int ppeIdx=-1, int aroundId=ParticleList.CONTAMINATED_AREA_GAS_AROUND, int tinyId=ParticleList.CONTAMINATED_AREA_GAS_TINY, string soundset="", bool partDynaUpdate=false, int newBirthRate=0)
Определения PlayerBase.c:6062
override void EEDelete(EntityAI parent)
Определения PlayerBase.c:1393
bool IsFacingTarget(Object target)
Определения PlayerBase.c:4923
override void SetDeathDarknessLevel(float duration, float tick_time)
Определения PlayerBase.c:8907
void AdjustKeffiyeh(EntityAI item, string slot_name)
Определения PlayerBase.c:9578
int m_ShakesForced
Определения PlayerBase.c:176
void StaminaHUDNotifier(bool show)
Определения PlayerBase.c:4787
vector GetLastFirePoint()
Определения PlayerBase.c:2337
static ref array< string > m_BleedingSourcesUp
Определения PlayerBase.c:199
Hologram GetHologramServer()
Определения PlayerBase.c:2648
override void AddArrow(Object arrow, int componentIndex, vector closeBonePosWS, vector closeBoneRotWS)
Определения PlayerBase.c:9955
void RemoveAction(typename actionName)
Определения PlayerBase.c:1864
override bool CanReleaseCargo(EntityAI cargo)
Определения PlayerBase.c:2267
EStatLevels GetStatLevel(float stat_value, float critical, float low, float normal, float high)
Определения PlayerBase.c:5560
void MessageStatus(string text)
Определения PlayerBase.c:6924
void PlayAttachmentDropSound()
Определения PlayerBase.c:5715
PlayerStat< float > GetStatDiet()
Определения PlayerBase.c:8251
Определения PlayerBase.c:50
Определения AirborneMask.c:2
Определения EnMath3D.c:28
Определения EnMath.c:7
proto native int GetLastPlayedCharacter()
proto native void SaveCharacter(bool localPlayer, bool verified)
proto native void SaveCharactersLocal()
Saves characters menu data to file.
proto native void SetCharacterName(int index, string newName)
Определения gameplay.c:917
Mission class.
Определения gameplay.c:686
Определения ObjectTyped.c:2
static PPEManager GetPPEManager()
Returns the manager instance singleton.
Определения PPEManager.c:27
Static component of PPE manager, used to hold the instance.
Определения PPEManager.c:3
void Start(Param par=null)
Определения PPERequestPlatformsBase.c:38
Определения PPEConstants.c:68
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Определения param.c:12
Legacy way of using particles in the game.
Определения Particle.c:7
static const int BREATH_VAPOUR_MEDIUM
Определения ParticleList.c:161
static const int BREATH_VAPOUR_LIGHT
Определения ParticleList.c:160
static const int DROWNING_BUBBLES
Определения ParticleList.c:355
static const int CONTAMINATED_AREA_GAS_AROUND
Определения ParticleList.c:317
static const int CONTAMINATED_AREA_GAS_TINY
Определения ParticleList.c:316
static const int BREATH_VAPOUR_HEAVY
Определения ParticleList.c:162
Определения ParticleList.c:12
Keeps track of agents and their simulation.
Определения PlayerAgentPool.c:9
override void OnGameplayDataHandlerSync()
Определения PlayerBaseClient.c:39
Определения PlayerBaseClient.c:2
Определения PlayerBase.c:2
static const float HEALTH_REGEN_MAX
Определения PlayerConstants.c:150
static const float SL_HEALTH_CRITICAL
Определения PlayerConstants.c:26
static const int LAST_UA_MSG_LIFETIME
Определения PlayerConstants.c:220
static const float BROKEN_LEGS_HIGH_HEALTH_THRESHOLD
Определения PlayerConstants.c:245
static const float SL_WATER_HIGH
Определения PlayerConstants.c:50
static const float SHOES_MOVEMENT_DAMAGE_PER_STEP
Определения PlayerConstants.c:21
static const float IMMUNITY_THRESHOLD_LEVEL_CRITICAL
Определения PlayerConstants.c:191
static const int CORPSE_STATE_MEDIUM
Определения PlayerConstants.c:229
static const float THRESHOLD_HEAT_COMFORT_MINUS_WARNING
Определения PlayerConstants.c:93
static const float SL_ENERGY_HIGH
Определения PlayerConstants.c:44
static const float BROKEN_LEGS_SHOCK_SWIM
Определения PlayerConstants.c:241
static const float BROKEN_LEGS_INITIAL_SHOCK
Определения PlayerConstants.c:237
static const float FULL_SPRINT_DELAY_FROM_CROUCH
[seconds]
Определения PlayerConstants.c:9
static const float SL_ENERGY_LOW
Определения PlayerConstants.c:42
static const float THRESHOLD_HEAT_COMFORT_MINUS_CRITICAL
Определения PlayerConstants.c:94
static const float SL_BLOOD_LOW
Определения PlayerConstants.c:37
static const float BROKEN_LEGS_ROLL_SHOCK
Определения PlayerConstants.c:248
static const int CORPSE_STATE_DECAYED
Определения PlayerConstants.c:230
static const float BROKEN_LEGS_LOW_SHOCK_WALK
Определения PlayerConstants.c:238
static const float SL_WATER_NORMAL
Определения PlayerConstants.c:49
static const float SL_BLOOD_CRITICAL
Определения PlayerConstants.c:36
static const float FULL_SPRINT_DELAY_FROM_PRONE
[seconds]
Определения PlayerConstants.c:10
static const float SL_ENERGY_MAX
Определения PlayerConstants.c:45
static const float SL_HEALTH_LOW
Определения PlayerConstants.c:27
static const float GLOVES_DAMAGE_SLIDING_LADDER_PER_SEC
Определения PlayerConstants.c:196
static const float UNCONSCIOUS_IN_WATER_TIME_LIMIT_TO_DEATH
Определения PlayerConstants.c:170
static const float SL_HEALTH_NORMAL
Определения PlayerConstants.c:28
static const float BROKEN_LEGS_STAND_SHOCK
Определения PlayerConstants.c:247
static const float SL_WATER_LOW
Определения PlayerConstants.c:48
static const float BROKEN_LEGS_MID_SHOCK_WALK
Определения PlayerConstants.c:239
static const float BROKEN_CROUCH_MODIFIER
Определения PlayerConstants.c:249
static const float SL_ENERGY_CRITICAL
Определения PlayerConstants.c:41
static const float HEALTH_REGEN_MIN
Определения PlayerConstants.c:149
static const int CHECK_EVERY_N_STEP
Определения PlayerConstants.c:22
static const int DROWNING_BUBBLE_FREQUENCY_MIN
Определения PlayerConstants.c:278
static const float IMMUNITY_THRESHOLD_LEVEL_LOW
Определения PlayerConstants.c:190
static const float CHANCE_TO_BLEED_SLIDING_LADDER_PER_SEC
Определения PlayerConstants.c:195
static const float IMMUNITY_THRESHOLD_LEVEL_HIGH
Определения PlayerConstants.c:188
static const float DROWNING_DEFAULT_THRESHOLD
Определения PlayerConstants.c:274
static const int DROWNING_BUBBLE_FREQUENCY_MAX
Определения PlayerConstants.c:277
static const float BAREFOOT_MOVEMENT_BLEED_MODIFIER
Определения PlayerConstants.c:20
static const float SL_BLOOD_NORMAL
Определения PlayerConstants.c:38
static const float MELEE2_MOVEMENT_BLEND_DELAY
Определения PlayerConstants.c:4
static const float SL_BLOOD_HIGH
Определения PlayerConstants.c:39
static const float DROWNING_UNCONSCIOUS_THRESHOLD
Определения PlayerConstants.c:276
static const int BLOOD_THRESHOLD_FATAL
Определения PlayerConstants.c:98
static const float SL_ENERGY_NORMAL
Определения PlayerConstants.c:43
static const float SL_WATER_CRITICAL
Определения PlayerConstants.c:47
static const float IMMUNITY_THRESHOLD_LEVEL_NORMAL
Определения PlayerConstants.c:189
static const float BROKEN_LEGS_LOW_HEALTH_THRESHOLD
Определения PlayerConstants.c:244
static const float DROWNING_SWIMMING_THRESHOLD
Определения PlayerConstants.c:275
static const float CAMERA_THRESHOLD_PITCH
Определения PlayerConstants.c:232
static const float SL_WATER_MAX
Определения PlayerConstants.c:51
static const float SL_HEALTH_HIGH
Определения PlayerConstants.c:29
static const float BROKEN_LEGS_HIGH_SHOCK_WALK
Определения PlayerConstants.c:240
Определения PlayerConstants.c:2
EConsumeType m_Type
Определения PlayerConsumeData.c:8
float m_Amount
Определения PlayerConsumeData.c:3
int m_LiquidType
Определения PlayerConsumeData.c:5
int m_Agents
Определения PlayerConsumeData.c:4
ItemBase m_Source
Определения PlayerConsumeData.c:7
proto string GetName()
nick (short) name of player
proto string GetId()
unique id of player (hashed steamID, database Xbox id...) can be used in database or logs
The class that will be instanced (moddable)
Определения gameplay.c:389
vector GetRandomSafePos3D(vector targetPos)
void OnRPC(PlayerBase player, int rpc_type, ParamsReadContext ctx)
Определения PluginDeveloper.c:110
Определения PluginDiagMenu.c:30
static int PlayInWorld(notnull Effect eff, vector pos)
Play an Effect.
Определения EffectManager.c:47
static int PlayOnObject(notnull Effect eff, Object obj, vector local_pos="0 0 0", vector local_ori="0 0 0", bool force_rotation_relative_to_world=false)
Play an Effect.
Определения EffectManager.c:70
static EffectSound PlaySoundOnObject(string sound_set, Object parent_object, float play_fade_in=0, float stop_fade_out=0, bool loop=false)
Create and play an EffectSound.
Определения EffectManager.c:256
static bool IsEffectExist(int effect_id)
Checks whether an Effect ID is registered in SEffectManager.
Определения EffectManager.c:303
static void DestroyEffect(Effect effect)
Unregisters, stops and frees the Effect.
Определения EffectManager.c:280
Manager class for managing Effect (EffectParticle, EffectSound)
Определения EffectManager.c:6
proto native void Send()
proto static native bool CanStoreInputUserData()
Returns true when the channel is free, AND the InputBuffer is NOT full (same as '!...
Определения gameplay.c:121
ScriptInvoker Class provide list of callbacks usage:
Определения 2_GameLib/DayZ/tools.c:116
Определения gameplay.c:152
void CleanupDisconnectedPlayer(string playerId)
Определения ScriptedSandstormController.c:76
void SetSelectionState(bool state)
Определения ManBase/BodyParts/Head.c:143
ref array< int > GetTranslatedSelections()
Определения ManBase/BodyParts/Head.c:153
bool GetSelectionState()
Определения ManBase/BodyParts/Head.c:148
proto bool Write(void value_out)
proto bool Read(void value_in)
Определения consumables.c:66
Определения ShockHandler.c:2
Определения Sound.c:112
Определения StaminaHandler.c:262
Определения StanceIndicator.c:2
string m_CharacterId
character ID
Определения ScriptAnalytics.c:61
string m_Reason
reason of disconnect (quit, kick, ban, sign-out...)
Определения ScriptAnalytics.c:62
vector m_PositionStart
player world position at the start of interval
Определения ScriptAnalytics.c:7
int m_TimeInterval
amount of real time in seconds covered by this event
Определения ScriptAnalytics.c:5
int m_DaytimeHour
current daytime in gameplay (hour in 24h format)
Определения ScriptAnalytics.c:6
vector m_PositionEnd
player world position at the end of interval
Определения ScriptAnalytics.c:8
string m_CharacterId
character ID
Определения ScriptAnalytics.c:4
float m_DistanceOnFoot
traveled distance on foot (meters) during interval
Определения ScriptAnalytics.c:9
static float GetParamFloat(string surface_name, string param_name)
Определения Surface.c:8
Определения Surface.c:2
Определения EmoteManager.c:1387
Определения SurvivorBase.c:7
static void SendEntityKilled(EntityAI victim, EntityAI killer, EntityAI source, bool is_headshot)
Определения SyncEvents.c:56
Определения SyncEvents.c:2
Определения DayZPlayerImplement.c:39
proto native float GetDamage(string zoneName, string healthType)
Определения DamageSystem.c:2
Native class for boats - handles physics simulation.
Определения Boat.c:29
proto native void Supress()
proto native UAInput GetInputByID(int iID)
returns list of all bindable (i.e. visible) inputs from the active group ('core' by default)
proto native float SyncedValue_ID(int action, bool check_focus=true)
Get action state.
Определения UAInput.c:107
const float DEFAULT
Определения ActionConstants.c:131
proto native bool IsDialogVisible()
UIScriptedMenu FindMenu(int id)
Returns menu with specific ID if it is open (see MenuID)
Определения UIManager.c:160
bool IsMenuOpen(int id)
Returns true if menu with specific ID is opened (see MenuID)
Определения UIManager.c:154
proto native void CloseDialog()
Определения UIManager.c:2
Определения DayZGame.c:64
static const float HEAT_DAMAGE_TICK_TIME
Определения VolcanicTrigger.c:6
static void ApplyEffects(PlayerBase player)
Определения VolcanicTrigger.c:100
Volcanic area trigger.
Определения VolcanicTrigger.c:3
shorthand
Определения BoltActionRifle_Base.c:6
bool CanLoadBullet(Weapon_Base wpn, Magazine mag, bool reservationCheck=true)
Определения WeaponManager.c:200
bool CanAttachMagazine(Weapon_Base wpn, Magazine mag, bool reservationCheck=true)
Определения WeaponManager.c:91
bool CanSwapMagazine(Weapon_Base wpn, Magazine mag, bool reservationCheck=true)
Определения WeaponManager.c:132
Определения WeaponManager.c:2
void SetCalcDetails(string details)
Определения 3_Game/DayZ/tools/Debug.c:934
int GetPollution()
Определения WorldData.c:292
float GetLiquidTypeEnviroTemperature(int liquidType)
Определения WorldData.c:239
Keeps information about currently loaded world, like temperature.
Определения WorldData.c:3
void SetGlobalLighting(int lightingID)
Определения WorldLighting.c:12
Определения WorldLighting.c:2
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto string ToString(bool simple=true)
Определения EnConvert.c:110
Определения Transport.c:70
static proto native float DistanceSq(vector v1, vector v2)
Returns the square distance between tips of two 3D vectors.
proto native float LengthSq()
Returns squared length (magnitudeSqr)
static const vector Zero
Определения EnConvert.c:123
proto float Normalize()
Normalizes vector. Returns length.
static proto native float Distance(vector v1, vector v2)
Returns the distance between tips of two 3D vectors.
Определения EnConvert.c:119
void Keffiyeh_ColorBase()
Определения consumables.c:158
Keffiyeh_LightBlue SetActions
Определения consumables.c:149
void DayZPlayerType()
Определения dayzplayer.c:512
const int SIMPLE_SELECTION_SHOULDER_RIFLE
Определения dayzplayer.c:1175
const int SIMPLE_SELECTION_SHOULDER_MELEE
Определения dayzplayer.c:1176
override string GetDebugName()
Определения dayzplayer.c:1191
void SDayZPlayerHeadingModel()
cannot be created from script
Определения dayzplayer.c:1105
DayZPlayerInstanceType
defined in C++
Определения dayzplayer.c:1084
proto native DayZPlayerType GetDayZPlayerType()
returns appropriate DayZPlayerType
proto native DayZPlayerCamera GetCurrentCamera()
-------------— camera additional functions ----------------------—
proto native DayZPlayerInstanceType GetInstanceType()
DayZPlayerConstants
defined in C++
Определения dayzplayer.c:602
proto native void SendSyncJuncture(int pJunctureID, ParamsWriteContext ctx)
-------------— sync stuff ----------------------—
class SDayZPlayerAimingModel SIMPLE_SELECTION_MELEE_RIFLE
float GetCurrentWaterLevel()
const int SIMPLE_SELECTION_MELEE_MELEE
Определения dayzplayer.c:1174
proto native bool IsPlayerInStance(int pStanceMask)
-------------— camera additiona functions ----------------------—
string GetDefaultHitPositionComponent()
Определения dayzplayer.c:502
class DayZPlayerCameraResult DayZPlayerCamera(DayZPlayer pPlayer, HumanInputController pInput)
Определения dayzplayer.c:56
eModifiers
Определения eModifiers.c:2
proto native float GetMax()
Определения PlayerStatBase.c:144
Serializer ParamsReadContext
Определения gameplay.c:15
InventoryTraversalType
tree traversal type, for more see http://en.wikipedia.org/wiki/Tree_traversal
Определения gameplay.c:6
Serializer ParamsWriteContext
Определения gameplay.c:16
DayZGame GetGame()
Определения gameplay.c:636
const int AGT_UACTION_CONSUME
Определения 3_Game/DayZ/constants.c:533
const int AGT_AIRBOURNE_BIOLOGICAL
Определения 3_Game/DayZ/constants.c:537
const int COLOR_RED_A
Определения 1_Core/DayZ/constants.c:71
const int COLOR_GREEN_A
Определения 1_Core/DayZ/constants.c:72
void Error(string err)
Messagebox with error message.
Определения EnDebug.c:90
proto void Print(void var)
Prints content of variable to console/log.
enum ShapeType ErrorEx
proto native void SetPosition(vector position)
Set the world position of the Effect.
Определения Effect.c:463
ShapeFlags
Определения EnDebug.c:126
static proto void SetValue(int id, int value)
Set value at the given script id.
static proto bool GetBool(int id, bool reverse=false)
Get value as bool from the given script id.
class DiagMenu Shape
don't call destructor directly. Use Destroy() instead
const int INVENTORY_ENTITY_DROP_OVERLAP_DEPTH
Определения 3_Game/DayZ/constants.c:1115
const float DZPLAYER_CAMERA_FOV_IRONSIGHTS
Определения 3_Game/DayZ/constants.c:1041
const float REFRESHER_RADIUS
Определения 3_Game/DayZ/constants.c:1086
const int DEFAULT_CHARACTER_MENU_ID
Определения 3_Game/DayZ/constants.c:1045
const float NL_DAMAGE_FIREARM_CONVERSION_PLAYERS
Определения 3_Game/DayZ/constants.c:1066
static proto bool CastTo(out Class to, Class from)
Try to safely down-cast base class to child class.
Obsolete Managed PrintString(string s)
Helper for printing out string expression. Example: PrintString("Hello " + var);.
Определения EnScript.c:369
class array< Class T > TStringArray
set< string > TStringSet
Определения EnScript.c:821
void Obsolete(string msg="")
Определения EnScript.c:371
EntityEvent
Entity events for event-mask, or throwing event from code.
Определения EnEntity.c:45
static const float ITEM_TEMPERATURE_NEUTRAL_ZONE_MIDDLE
Определения 3_Game/DayZ/constants.c:856
const int STATE_RUINED
Определения 3_Game/DayZ/constants.c:909
const int LIQUID_WATER
Определения 3_Game/DayZ/constants.c:578
static proto void YawPitchRollMatrix(vector ang, out vector mat[3])
Creates rotation matrix from angles.
static proto void MatrixInvMultiply4(vector mat0[4], vector mat1[4], out vector res[4])
Invert-transforms matrix.
static void MatrixIdentity4(out vector mat[4])
Creates identity matrix.
Определения EnMath3D.c:256
static proto void MatrixOrthogonalize4(vector mat[4])
Orthogonalizes matrix.
static const float PI2
Определения EnMath.c:13
static float RandomFloat01()
Returns a random float number between and min [inclusive] and max [inclusive].
Определения EnMath.c:126
static proto float Max(float x, float y)
Returns bigger of two given values.
static proto float Lerp(float a, float b, float time)
Linearly interpolates between 'a' and 'b' given 'time'.
static proto bool IsInRangeInt(int v, int min, int max)
Returns if value is between min and max (inclusive)
static proto int AbsInt(int i)
Returns absolute value.
static proto float RandomFloat(float min, float max)
Returns a random float number between and min[inclusive] and max[exclusive].
static proto float Clamp(float value, float min, float max)
Clamps 'value' to 'min' if it is lower than 'min', or to 'max' if it is higher than 'max'.
static proto float Sin(float angle)
Returns sinus of angle in radians.
static proto float InverseLerp(float a, float b, float value)
Calculates the linear value that produces the interpolant value within the range [a,...
static const float RAD2DEG
Определения EnMath.c:16
static proto float AbsFloat(float f)
Returns absolute value.
const string CFG_AMMO
Определения 3_Game/DayZ/constants.c:231
const int MENU_WARNING_TELEPORT
Определения 3_Game/DayZ/constants.c:216
const int MENU_INSPECT
Определения 3_Game/DayZ/constants.c:185
const int MENU_MAP
Определения 3_Game/DayZ/constants.c:197
const int MENU_WARNING_ITEMDROP
Определения 3_Game/DayZ/constants.c:214
const int MENU_RESPAWN_DIALOGUE
Определения 3_Game/DayZ/constants.c:215
const int MENU_INVENTORY
Определения 3_Game/DayZ/constants.c:186
const int MENU_RADIAL_QUICKBAR
Определения 3_Game/DayZ/constants.c:204
EmitorParam
Определения EnVisual.c:114
const int SAT_DEBUG_ACTION
Определения 3_Game/DayZ/constants.c:486
SetSoundControllerOverride(string controllerName, float value, SoundControllerAction action)
class AbstractSoundScene SoundObjectBuilder(SoundParams soundParams)
vector GetPosition()
Get the world position of the Effect.
Определения Effect.c:473
void AbstractWave()
Определения Sound.c:167
class SoundObject SoundParams(string name)
const float STAMINA_MAX
Определения 3_Game/DayZ/constants.c:749
proto native int Length()
Returns length of string.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
proto void GetHourMinuteSecond(out int hour, out int minute, out int second)
Returns system time.
proto native bool IsCLIParam(string param)
Returns if command line argument is present.
const int CALL_CATEGORY_GAMEPLAY
Определения 3_Game/DayZ/tools/tools.c:10
bool IsRunning()
Определения 3_Game/DayZ/tools/tools.c:264
const int CALL_CATEGORY_GUI
Определения 3_Game/DayZ/tools/tools.c:9
const int CALL_CATEGORY_SYSTEM
Определения 3_Game/DayZ/tools/tools.c:8
proto native Widget GetParent()
Get parent of the Effect.
Определения Effect.c:422
proto native void AddChild(Widget child, bool immedUpdate=true)
proto native bool IsModifierActive()
is modifier active
proto native int GetRunningAction()
returns -1 when no action is running or RELOAD,MECHANISM, ....
Определения ActionManagerBase.c:91
proto native bool IsInWater()
proto native float GetWeaponObstruction()
return obstruction value
class HumanCommandMelee2 HumanCommandFall()
Определения human.c:594
class HumanCommandWeapons HumanCommandAdditives()
Определения human.c:1154
void HumanItemAccessor()
Определения humanitems.c:147
class HumanItemBehaviorCfg OnItemInHandsChanged(bool pInstant=false, bool pChangeAnimationInstance=true)
signalization from script to engine that item in hands changed