Dayz Explorer 1.29.162510
Loading...
Searching...
No Matches
actionbase.c
Go to the documentation of this file.
15class ActionReciveData
16{
18 ref ActionTarget m_Target;
19}
20
22{
23 int m_CommandUID = -1;
24 int m_CommandUIDProne = -1;
25 int m_StanceMask = -1;
26}
27
28class ActionData
29{
30 void ActionData()
31 {
33 }
34
35 event float OnJunctureTimedOut()
36 {
37 // extend juncture another 1 second
38 return 1.0;
39 }
40
46 ref ActionTarget m_Target;
56}
57
59{
60 //STATIC DATA
61 protected int m_RefreshReservationTimerValue = 140;
62 // Configurable action parameters
63 protected string m_Sound; //sound played at the beggining of action
64 protected string m_Text;
65
66 protected bool m_LockTargetOnUse; //this parameter sets wheter player can perform actions on target while other player is already performing action on it. defaulted as true
67 protected bool m_FullBody; //tells whether action is full body or additive
68 protected int m_StanceMask;
69 protected ref TStringArray m_Sounds; //User action sound is picked from this array randomly
70 ref CCIBase m_ConditionItem; //Condition Component
71 ref CCTBase m_ConditionTarget; //Condition Component
73 protected int m_ActionID;
74 protected int m_VariantID;
77
78 //RUNTIME DATA
79 protected ref Param1<string> m_MessageParam; //used for passing messages from server to client
80 //protected ref Param2<int,int> m_MessagesParam;
81
82 //SOFT SKILLS
83 protected float m_SpecialtyWeight;
84
85 //-----------------------------------------------------
86 // Action events and methods
87 //-----------------------------------------------------
88 void ActionBase()
89 {
90 // definable
91 m_StanceMask = DayZPlayerConstants.STANCEMASK_ERECT | DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_PRONE;
92 m_FullBody = false;
93 m_Sound = "";
94 m_Text = "default action text";
96 // dont override
97 m_MessageParam = new Param1<string>("");
98 //m_MessagesParam = new Param2<int,int>(0,0);
100 m_Input = null;
101 m_ActionID = 0;
103 }
104
106 {
107 return m_LockTargetOnUse;
108 }
109
111 {
112 m_ConditionMask = ActionConditionMask.ACM_NO_EXEPTION;
113 if (CanBeUsedInVehicle())
114 {
115 m_ConditionMask |= ActionConditionMask.ACM_IN_VEHICLE;
116 }
117
118 if (CanBeUsedOnLadder())
119 {
120 m_ConditionMask |= ActionConditionMask.ACM_ON_LADDER;
121 }
122
123 if (CanBeUsedSwimming())
124 {
125 m_ConditionMask |= ActionConditionMask.ACM_SWIMMING;
126 }
127
129 {
130 m_ConditionMask |= ActionConditionMask.ACM_RESTRAIN;
131 }
132
133 if (CanBeUsedRaised())
134 {
136 }
137
138 if (CanBeUsedOnBack())
139 {
141 }
142
143 if (CanBeUsedThrowing())
144 {
145 m_ConditionMask |= ActionConditionMask.ACM_THROWING;
146 }
147
148 if (CanBeUsedLeaning())
149 {
151 }
152
154 {
155 m_ConditionMask |= ActionConditionMask.ACM_BROKEN_LEGS;
156 }
157
159 m_ConditionMask |= ActionConditionMask.ACM_IN_FREELOOK;
160 }
161
162 bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL )
163 {
164 action_data = CreateActionData();
165 action_data.m_Action = this;
166 action_data.m_Player = player;
167 action_data.m_Target = target;
168 action_data.m_MainItem = item;
169 action_data.m_PossibleStanceMask = GetStanceMask(player);
170 action_data.m_ReservedInventoryLocations = new array<ref InventoryLocation>;
171 action_data.m_RefreshReservationTimer = m_RefreshReservationTimerValue;
172 action_data.m_WasExecuted = false;
173 action_data.m_WasActionStarted = false;
174 action_data.m_ReciveEndInput = false;
175
176 ActionReciveData action_recive_data = player.GetActionManager().GetReciveData();
177 if ( action_recive_data )
178 {
179 HandleReciveData(action_recive_data,action_data);
180
182 {
183 if ( player.GetItemInHands() != action_data.m_MainItem )
184 {
185 return false;
186 }
187 }
188 }
189
190 if ( !Post_SetupAction( action_data ) )
191 return false;
192
193 if ( !g_Game.IsDedicatedServer() && !IsInstant() )
194 {
195 if (!InventoryReservation(action_data))
196 {
197 ClearInventoryReservationEx(action_data);
198 return false;
199 }
200
201 if ( LogManager.IsActionLogEnable() )
202 {
203 for ( int i = 0; i < action_data.m_ReservedInventoryLocations.Count(); i++)
204 {
205 Debug.ActionLog( InventoryLocation.DumpToStringNullSafe( action_data.m_ReservedInventoryLocations[i] ), action_data.m_Action.ToString() , "n/a", "LockInventoryList", action_data.m_Player.ToString() );
206 }
207 }
208 }
209
210 return true;
211 }
212
213 bool Post_SetupAction( ActionData action_data )
214 {
215 return true;
216 }
217
218 void ActionCleanup( ActionData action_data )
219 {}
220
221 typename GetInputType()
222 {
223 return DefaultActionInput;
224 }
225
227 {
228 m_Input = ai;
229 }
230
232 {
233 return new ActionData;
234 }
235
236 void CreateConditionComponents() //Instantiates components, called once from ActionManager on actions construction
237 {
240 }
241
242 Object GetDisplayInteractObject(PlayerBase player, ActionTarget target)
243 {
244 return null;
245 }
246
251 {
252 return true;
253 }
254
257 {
258 return true;
259 }
260
261 //Action isn't synchronize to server
262 bool IsLocal()
263 {
264 return false;
265 }
266
267 //Action not using animation/callback action are executed instantly (OnStart)
269 {
270 return false;
271 }
272
275 {
276 return false;
277 }
278
280 {
281 return true;
282 }
283
285 {
286 return AC_UNCATEGORIZED;
287 }
288
289 bool IsEat()
290 {
291 return false;
292 }
293
294 bool IsDrink()
295 {
296 return false;
297 }
298
300 {
301 return false;
302 }
303
304 string GetText() //text game displays in HUD hint
305 {
306 return m_Text;
307 }
308
310 {
311 return false;
312 }
313
315 {
316 return false;
317 }
318
321 {
322 return true;
323 }
324
326 {
328 }
329
331 {
332 return false;
333 }
334
336 {
337 return false;
338 }
339
341 {
342 return false;
343 }
344
346 {
347 return false;
348 }
349
351 {
352 return false;
353 }
354
356 {
357 return false;
358 }
359
361 {
362 return false;
363 }
364
366 {
367 return false;
368 }
369
371 {
372 return true;
373 }
374
376 {
377 return true;
378 }
379
381 {
382 return true;
383 }
384
387 {
388 return false;
389 }
390
392 {
393 return true;
394 }
395
397 {
398 return true;
399 }
400
406 {
407 return false;
408 }
409
410 protected bool ActionConditionContinue(ActionData action_data) //condition for action
411 {
412 return ActionCondition(action_data.m_Player,action_data.m_Target,action_data.m_MainItem);
413 }
414
415 protected bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item) //condition for action
416 {
417 return true;
418 }
419
426 string GetTargetName(PlayerBase player, ActionTarget target)
427 {
428 return string.Empty;
429 }
430
431 void ApplyModifiers(ActionData action_data);
432
437
439 {
440 int componentIndex = -1;
441 int proxyBoneIdx = -1;
442 vector cursorHitPos = vector.Zero;
443
444 array<string> selectionNames = new array<string>();
445
446 Object targetObject = null;
447 Object targetParent = null;
448
449 if (UseMainItem())
450 {
451 ctx.Write(action_data.m_MainItem);
452 }
453
454 if (HasTarget() && !IsUsingProxies())
455 {
456 // callback data
457 targetObject = action_data.m_Target.GetObject();
458 ctx.Write(targetObject);
459 targetParent = action_data.m_Target.GetParent();
460 ctx.Write(targetParent);
461 componentIndex = action_data.m_Target.GetComponentIndex();
462 ctx.Write(componentIndex);
463 cursorHitPos = action_data.m_Target.GetCursorHitPos();
464 ctx.Write(cursorHitPos);
465 }
466 else if( HasTarget() && IsUsingProxies() )
467 {
470 Entity entParent = Entity.Cast(action_data.m_Target.GetParent());
471 if (entParent)
472 {
473 action_data.m_Target.GetObject().GetActionComponentNameList(action_data.m_Target.GetComponentIndex(), selectionNames);
474 for (int s = 0; s < selectionNames.Count(); s++)
475 {
476 proxyBoneIdx = entParent.GetBoneIndex(selectionNames[s]);
477 if( proxyBoneIdx > -1 )
478 {
479 break;
480 }
481 }
482 }
483
484 ctx.Write(proxyBoneIdx);
485 targetParent = action_data.m_Target.GetParent();
486 ctx.Write(targetParent);
487 componentIndex = action_data.m_Target.GetComponentIndex();
488 ctx.Write(componentIndex);
489 cursorHitPos = action_data.m_Target.GetCursorHitPos();
490 ctx.Write(cursorHitPos);
491 }
492 }
493
494 bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
495 {
496 if ( !action_recive_data )
497 {
498 action_recive_data = new ActionReciveData;
499 }
500 Object actionTargetObject = null;
501 Object actionTargetParent = null;
502 int componentIndex = -1;
503 int proxyBoneIdx = -1;
504 vector cursorHitPos = vector.Zero;
505 ItemBase mainItem = null;
506
507 ref ActionTarget target;
508
509 if ( UseMainItem() )
510 {
511 if ( !ctx.Read(mainItem) )
512 return false;
513 }
514
515 if ( HasTarget() && !IsUsingProxies() )
516 {
517 if ( !ctx.Read(actionTargetObject) )
518 return false;
519
520 if ( !ctx.Read(actionTargetParent))
521 return false;
522
523 if ( !ctx.Read(componentIndex) )
524 return false;
525
526 if ( !ctx.Read(cursorHitPos) )
527 return false;
528
529 target = new ActionTarget(actionTargetObject, actionTargetParent, componentIndex, cursorHitPos, 0);
530
531 action_recive_data.m_Target = target;
532 }
533 else if( HasTarget() && IsUsingProxies() )
534 {
535 if ( !ctx.Read(proxyBoneIdx) )
536 return false;
537
538 if ( !ctx.Read(actionTargetParent))
539 return false;
540
541 if ( !ctx.Read(componentIndex) )
542 return false;
543
544 if ( !ctx.Read(cursorHitPos) )
545 return false;
546
548 if ( proxyBoneIdx > -1 )
549 {
550 Entity entParent = Entity.Cast(actionTargetParent);
551
552 if (entParent)
553 {
554 actionTargetObject = entParent.GetBoneObject(proxyBoneIdx);
555 }
556 }
557 else
558 {
559 return false;
560 }
561
562 target = new ActionTarget(actionTargetObject, actionTargetParent, componentIndex, cursorHitPos, 0);
563
564 action_recive_data.m_Target = target;
565 }
566
567 action_recive_data.m_MainItem = mainItem;
568 return true;
569 }
570
571 void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
572 {
573 action_data.m_MainItem = action_recive_data.m_MainItem;
574
575 if(HasTarget())
576 {
577 if (action_recive_data.m_Target)
578 {
579 action_data.m_Target = action_recive_data.m_Target;
580 }
581 else
582 {
583 Error("Action target not created.");
584 action_data.m_Target = new ActionTarget(NULL, NULL, -1, vector.Zero, 0);
585 }
586 }
587 }
588
589 //----------------------------------------------------------------------------------------------
590 // Core methods don't override unless you know what you are doing
591 //----------------------------------------------------------------------------------------------
592 // COMMANDS -----------------------------------------------------------------------
593 protected int GetStanceMaskEx(PlayerBase player, ActionTarget target, ItemBase item)
594 {
595 return GetStanceMask(player);
596 }
597
598 protected int GetStanceMask(PlayerBase player)
599 {
600 if ( HasProneException() )
601 {
602 if ( player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDERECT | DayZPlayerConstants.STANCEMASK_RAISEDCROUCH | DayZPlayerConstants.STANCEMASK_RAISEDPRONE))
603 return -1;
604 else if ( player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT))
605 return DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT;
606 else
607 return DayZPlayerConstants.STANCEMASK_PRONE;
608 }
609 return m_StanceMask;
610 }
611
612 protected int GetClosestPossibleStance(PlayerBase player, ActionTarget target, ItemBase item)
613 {
614 int stanceMask = GetStanceMaskEx(player, target, item);
615
616 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_ERECT))
617 {
618 if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
619 return DayZPlayerConstants.STANCEMASK_ERECT;
620 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
621 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
622 else if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
623 return DayZPlayerConstants.STANCEMASK_CROUCH;
624 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
625 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
626 else if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
627 return DayZPlayerConstants.STANCEMASK_PRONE;
628 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
629 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
630 }
631
632 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDERECT))
633 {
634 if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
635 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
636 else if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
637 return DayZPlayerConstants.STANCEMASK_ERECT;
638 else if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
639 return DayZPlayerConstants.STANCEMASK_CROUCH;
640 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
641 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
642 else if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
643 return DayZPlayerConstants.STANCEMASK_PRONE;
644 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
645 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
646 }
647
648 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH))
649 {
650 if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
651 return DayZPlayerConstants.STANCEMASK_CROUCH;
652 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
653 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
654 else if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
655 return DayZPlayerConstants.STANCEMASK_ERECT;
656 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
657 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
658 else if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
659 return DayZPlayerConstants.STANCEMASK_PRONE;
660 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
661 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
662 }
663
664 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDCROUCH))
665 {
666 if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
667 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
668 else if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
669 return DayZPlayerConstants.STANCEMASK_CROUCH;
670 else if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
671 return DayZPlayerConstants.STANCEMASK_ERECT;
672 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
673 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
674 else if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
675 return DayZPlayerConstants.STANCEMASK_PRONE;
676 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
677 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
678 }
679
680 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_PRONE))
681 {
682 if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
683 return DayZPlayerConstants.STANCEMASK_PRONE;
684 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
685 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
686 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
687 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
688 else if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
689 return DayZPlayerConstants.STANCEMASK_CROUCH;
690 else if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
691 return DayZPlayerConstants.STANCEMASK_ERECT;
692 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
693 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
694 }
695
696 if (player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_RAISEDPRONE))
697 {
698 if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDPRONE)
699 return DayZPlayerConstants.STANCEMASK_RAISEDPRONE;
700 else if (stanceMask & DayZPlayerConstants.STANCEMASK_PRONE)
701 return DayZPlayerConstants.STANCEMASK_PRONE;
702 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDCROUCH)
703 return DayZPlayerConstants.STANCEMASK_RAISEDCROUCH;
704 else if (stanceMask & DayZPlayerConstants.STANCEMASK_CROUCH)
705 return DayZPlayerConstants.STANCEMASK_CROUCH;
706 else if (stanceMask & DayZPlayerConstants.STANCEMASK_ERECT)
707 return DayZPlayerConstants.STANCEMASK_ERECT;
708 else if (stanceMask & DayZPlayerConstants.STANCEMASK_RAISEDERECT)
709 return DayZPlayerConstants.STANCEMASK_RAISEDERECT;
710 }
711
712 return -1;
713 }
714
715 protected bool IsFullBodyEx(PlayerBase player, ActionTarget target, ItemBase item)
716 {
717 return IsFullBody(player);
718 }
719
721 {
722 if ( HasProneException() )
723 {
724 return !( player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT) );
725 }
726 return m_FullBody;
727 }
728
729 // if it is set to true if action have special fullbody animation for prone and additive for crouch and erect
730 protected bool HasProneException()
731 {
732 return false;
733 }
734
735 // ACTION LOGIC -------------------------------------------------------------------
736 // called from actionmanager.c
737 void Start( ActionData action_data ) //Setup on start of action
738 {
739 action_data.m_State = UA_START;
740
741 if ( LogManager.IsActionLogEnable() )
742 {
743 Debug.ActionLog("Time stamp: " + action_data.m_Player.GetSimulationTimeStamp(), this.ToString() , "n/a", "OnStart", action_data.m_Player.ToString() );
744 }
745
746 OnStart(action_data);
747
748 if ( g_Game.IsServer() )
749 {
750 OnStartServer(action_data);
751
752 string soundCat = GetSoundCategory(action_data);
753 if (soundCat)
754 action_data.m_Player.SetSoundCategoryHash(soundCat.Hash());
755 }
756 else
757 {
758 OnStartClient(action_data);
759 }
760
761 InformPlayers(action_data.m_Player,action_data.m_Target,UA_START);
762 }
763
764 void End( ActionData action_data )
765 {
766 if ( action_data.m_Player )
767 {
768 OnEnd(action_data);
769
770 if ( g_Game.IsServer() )
771 {
772 OnEndServer(action_data);
773 }
774 else
775 {
776 OnEndClient(action_data);
777 }
778
779 action_data.m_Player.GetActionManager().OnActionEnd();
780 }
781 }
782
783 void Interrupt(ActionData action_data)
784 {
785 End(action_data);
786 }
787
788 void OnEndInput(ActionData action_data)
789 {}
790
791 void EndInput(ActionData action_data)
792 {
793 action_data.m_ReciveEndInput = true;
794 OnEndInput(action_data);
795 }
796
797 void OnEndRequest(ActionData action_data)
798 {}
799
800 void EndRequest(ActionData action_data)
801 {
802 OnEndRequest(action_data);
803 }
804
805 bool CanReceiveAction(ActionTarget target)
806 {
807 bool result = true;
808 PlayerBase target_player = PlayerBase.Cast(target.GetObject());
809
810 if (target_player)
811 {
812 result = !target_player.IsJumpInProgress();
813 result = result && !(target_player.GetCommand_Ladder() || (target_player.GetCommand_Vehicle() && !CanTargetBeInVehicle()) || target_player.GetCommand_Swim());
814 }
815
816 return result;
817 }
818
819 static int ComputeConditionMask( PlayerBase player, ActionTarget target, ItemBase item )
820 {
821 int mask = 0;
822 if ( player.GetCommand_Vehicle() )
823 {
824 mask |= ActionConditionMask.ACM_IN_VEHICLE;
825 }
826
827 if ( player.GetCommand_Ladder() )
828 {
829 mask |= ActionConditionMask.ACM_ON_LADDER;
830 }
831
832 if ( player.IsRestrained() )
833 {
834 mask |= ActionConditionMask.ACM_RESTRAIN;
835 }
836
837 if ( player.GetCommand_Swim() )
838 {
839 mask |= ActionConditionMask.ACM_SWIMMING;
840 }
841
842 if ( player.IsRaised() )
843 {
844 mask |= ActionConditionMask.ACM_RAISED;
845 }
846
847 if ( player.GetCommand_Move() && player.GetCommand_Move().IsOnBack() )
848 {
849 mask |= ActionConditionMask.ACM_ON_BACK;
850 }
851
852 if ( player.GetThrowing().IsThrowingModeEnabled())
853 {
854 mask |= ActionConditionMask.ACM_THROWING;
855 }
856
857 if (player.IsLeaning())
858 {
859 mask |= ActionConditionMask.ACM_LEANING;
860 }
861
862 if (player.GetBrokenLegs() == eBrokenLegs.BROKEN_LEGS)
863 {
864 mask |= ActionConditionMask.ACM_BROKEN_LEGS;
865 }
866
867 if (player.GetInputController() && player.GetInputController().CameraIsFreeLook())
868 mask |= ActionConditionMask.ACM_IN_FREELOOK;
869
870 return mask;
871 }
872
873 bool Can( PlayerBase player, ActionTarget target, ItemBase item, int condition_mask )
874 {
875 if (( (condition_mask & m_ConditionMask) != condition_mask ) || ( !IsFullBodyEx(player, target, item) && !player.IsPlayerInStance(GetStanceMaskEx(player, target, item)) ) || player.IsRolling())
876 return false;
877
878 if (HasTarget())
879 {
880 if (!FirearmActionBase.Cast(this))
881 {
882 EntityAI entity = EntityAI.Cast(target.GetObject());
883 if (entity && !target.GetObject().IsMan())
884 {
885 Man man = entity.GetHierarchyRootPlayer();
886 if (man && man != player)
887 return false;
888 }
889 }
890
891 if (m_ConditionTarget && !m_ConditionTarget.Can(player, target))
892 return false;
893 }
894
895 if (m_ConditionItem && !m_ConditionItem.Can(player, item))
896 return false;
897
898 if (!ActionCondition(player, target, item))
899 return false;
900
901 if (IsFullBodyEx(player, target, item))
902 {
903 int nextStance = GetClosestPossibleStance(player, target, item);
904 int stanceIdx = DayZPlayerUtils.ConvertStanceMaskToStanceIdx(nextStance);
905 if (stanceIdx != -1 && !DayZPlayerUtils.PlayerCanChangeStance(player, stanceIdx ))
906 return false;
907 }
908
909 return true;
910 }
911
912 bool Can(PlayerBase player, ActionTarget target, ItemBase item)
913 {
914 int condition_mask = ComputeConditionMask(player, target, item);
915
916 return Can( player, target, item, condition_mask);
917 }
918
919 protected bool CanContinue( ActionData action_data )
920 {
921 if (!action_data.m_Player.IsPlayerInStance(action_data.m_PossibleStanceMask) || !m_ConditionItem || !m_ConditionItem.CanContinue(action_data.m_Player,action_data.m_MainItem) || !m_ConditionTarget || !m_ConditionTarget.CanContinue(action_data.m_Player,action_data.m_Target))
922 return false;
923
924 return ActionConditionContinue(action_data);
925 }
926
928 {
929 return m_VariantManager != null;
930 }
931
933 {
935 return m_VariantManager.GetActionsCount();
936
937 return 0;
938 }
939
941 {
943 return m_VariantManager.GetActions(variants);
944
945 return 0;
946 }
947
948 void SetVariantID(int ID)
949 {
950 m_VariantID = ID;
951 }
952
954 {
955 return m_VariantID;
956 }
957
958 void UpdateVariants(Object item, Object target, int componet_index)
959 {
960 if ( m_VariantManager )
961 {
962 m_VariantManager.UpdateVariants(item, target, componet_index);
963 }
964 }
965
967 {
968 if ( !m_VariantManager )
970 return m_VariantManager;
971 }
972
973 // Called when item changes location during performed action
976
977 // call only on client side for lock inventory before action
978 // return if has successfuly reserved inventory
980 {
981 if (g_Game.IsDedicatedServer())
982 return true;
983
984 if ((IsLocal() || !UseAcknowledgment()) && IsInstant())
985 return true;
986
987 //action_data.m_ReservedInventoryLocations = new array<ref InventoryLocation>;
988 bool success = true;
989 InventoryLocation targetInventoryLocation = NULL;
990 InventoryLocation handInventoryLocation = NULL;
991
992 // lock target if it has target
993 if (HasTarget())
994 {
995 ItemBase targetItem;
996 if ( ItemBase.CastTo(targetItem,action_data.m_Target.GetObject()) )
997 {
998 targetInventoryLocation = new InventoryLocation;
999 targetItem.GetInventory().GetCurrentInventoryLocation(targetInventoryLocation);
1000 if ( action_data.m_Player.GetInventory().HasInventoryReservation( targetItem, targetInventoryLocation) )
1001 {
1002 success = false;
1003 }
1004 else
1005 {
1006 action_data.m_Player.GetInventory().AddInventoryReservationEx( targetItem, targetInventoryLocation, GameInventory.c_InventoryReservationTimeoutMS);
1007 }
1008 }
1009 }
1010
1011 handInventoryLocation = new InventoryLocation;
1012 handInventoryLocation.SetHands(action_data.m_Player,action_data.m_Player.GetItemInHands());
1013
1014 if (action_data.m_Player.GetInventory().HasInventoryReservation( action_data.m_Player.GetItemInHands(), handInventoryLocation))
1015 {
1016 if (HasTarget())
1017 {
1018 action_data.m_Player.GetInventory().ClearInventoryReservation(targetItem, targetInventoryLocation);
1019 }
1020
1021 success = false;
1022 }
1023 else
1024 {
1025 action_data.m_Player.GetInventory().AddInventoryReservationEx( action_data.m_Player.GetItemInHands(), handInventoryLocation, GameInventory.c_InventoryReservationTimeoutMS);
1026 }
1027
1028 if (success)
1029 {
1030 if (targetInventoryLocation)
1031 action_data.m_ReservedInventoryLocations.Insert(targetInventoryLocation);
1032
1033 if (handInventoryLocation)
1034 action_data.m_ReservedInventoryLocations.Insert(handInventoryLocation);
1035 }
1036
1037 return success;
1038 }
1039
1041 {
1042 if (action_data.m_Player.GetInstanceType() != DayZPlayerInstanceType.INSTANCETYPE_SERVER)
1043 {
1044 if (action_data.m_ReservedInventoryLocations)
1045 {
1047 for ( int i = 0; i < action_data.m_ReservedInventoryLocations.Count(); i++)
1048 {
1049 il = action_data.m_ReservedInventoryLocations.Get(i);
1050 action_data.m_Player.GetInventory().ClearInventoryReservationEx( il.GetItem() , il );
1051 }
1052
1053 action_data.m_ReservedInventoryLocations.Clear();
1054 }
1055 }
1056 }
1057
1059 {
1060 if (action_data.m_Player.GetInstanceType() != DayZPlayerInstanceType.INSTANCETYPE_SERVER)
1061 {
1062 if (action_data.m_ReservedInventoryLocations)
1063 {
1065 for (int i = 0; i < action_data.m_ReservedInventoryLocations.Count(); i++)
1066 {
1067 il = action_data.m_ReservedInventoryLocations.Get(i);
1068 EntityAI entity = il.GetItem();
1069 action_data.m_Player.GetInventory().ExtendInventoryReservationEx(il.GetItem() , il, 10000);
1070 }
1071 }
1072 }
1073 }
1074
1076 {
1077 bool accepted = true;
1078 if (action_data.m_Player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
1079 {
1080 if (HasTarget() && IsLockTargetOnUse() && action_data.m_Target)
1081 {
1082 EntityAI targetEntity;
1083 if (EntityAI.CastTo(targetEntity, action_data.m_Target.GetObject()))
1084 {
1085 InventoryLocation targetIl = new InventoryLocation();
1086 targetEntity.GetInventory().GetCurrentInventoryLocation(targetIl);
1087
1088 //Lock target
1089 if (!g_Game.AddInventoryJunctureEx(action_data.m_Player, targetEntity, targetIl, true, 10000, action_data))
1090 {
1091 accepted = false;
1092 }
1093 else
1094 {
1095 action_data.m_ReservedInventoryLocations.Insert(targetIl);
1096 }
1097 }
1098 }
1099 }
1100
1101 return accepted;
1102 }
1103
1105 {
1106 if (action_data.m_Player.GetInstanceType() == DayZPlayerInstanceType.INSTANCETYPE_SERVER)
1107 {
1108 if (action_data.m_ReservedInventoryLocations)
1109 {
1111 for ( int i = 0; i < action_data.m_ReservedInventoryLocations.Count(); i++)
1112 {
1113 il = action_data.m_ReservedInventoryLocations.Get(i);
1114 EntityAI entity = il.GetItem();
1115 if (entity)
1116 {
1117 g_Game.ClearJunctureEx(action_data.m_Player, entity);
1118 }
1119 }
1120
1121 action_data.m_ReservedInventoryLocations.Clear();
1122 }
1123 }
1124 }
1125
1126 [Obsolete("Handled by 'ActionData.OnJunctureTimedOut' now")]
1128 {
1130 if (action_data.m_ReservedInventoryLocations)
1131 {
1133 for (int i = 0; i < action_data.m_ReservedInventoryLocations.Count(); i++)
1134 {
1135 il = action_data.m_ReservedInventoryLocations.Get(i);
1136 EntityAI entity = il.GetItem();
1137 if (entity)
1138 {
1139 g_Game.ExtendActionJuncture(action_data.m_Player, entity, 10000);
1140 }
1141 }
1142 }
1143 }
1144
1145 // action need first have permission from server before can start
1147 {
1148 return true;
1149 }
1150
1152 protected void InformPlayers( PlayerBase player, ActionTarget target, int state );
1153
1154 void SendMessageToClient( Object reciever, string message ) //sends given string to client, don't use if not nescessary
1155 {
1156 PlayerBase man;
1157 if (g_Game.IsServer() && Class.CastTo(man, reciever) && m_MessageParam && reciever.IsAlive() && message != "")
1158 {
1159 m_MessageParam.param1 = message;
1160 g_Game.RPCSingleParam(man, ERPCs.RPC_USER_ACTION_MESSAGE, m_MessageParam, true, man.GetIdentity());
1161 }
1162 }
1163
1164 // ActionCondition Rules
1165 // ------------------------------------------------------
1166 protected bool IsDamageDestroyed(ActionTarget target)
1167 {
1168 return target.GetObject() && target.GetObject().IsDamageDestroyed();
1169 }
1170
1171 protected bool IsBuilding(ActionTarget target)
1172 {
1173 return target.GetObject() && target.GetObject().IsBuilding();
1174 }
1175
1176 protected bool IsTransport(ActionTarget target)
1177 {
1178 return target.GetObject() && target.GetObject().IsTransport();
1179 }
1180
1181 protected bool IsInReach(PlayerBase player, ActionTarget target, float maxDistance = 1.0)
1182 {
1183 Object obj = target.GetObject();
1184 if (!obj)
1185 return false;
1186
1187 float distanceRoot, distanceHead;
1188 vector modelPos, worldPos, playerHeadPos;
1189
1190 // we're using sq distance in comparison
1191 maxDistance = maxDistance * maxDistance;
1192
1193 // get position of Head bone
1194 MiscGameplayFunctions.GetHeadBonePos(player, playerHeadPos);
1195
1196 array<string> componentNames = new array<string>();
1197 obj.GetActionComponentNameList(target.GetComponentIndex(), componentNames);
1198 foreach (string componentName : componentNames)
1199 {
1200 if (componentName.Contains("doorstwin"))
1201 continue;
1202
1203 modelPos = obj.GetSelectionPositionMS(componentName);
1204 worldPos = obj.ModelToWorld(modelPos);
1205
1206 break;
1207 }
1208
1209 distanceRoot = vector.DistanceSq(worldPos, player.GetPosition());
1210 distanceHead = vector.DistanceSq(worldPos, playerHeadPos);
1211
1212 return distanceRoot <= maxDistance || distanceHead <= maxDistance;
1213 }
1214 // ------------------------------------------------------
1215
1216
1217
1218 // SOUNDS ------------------------------------------------------
1219 SoundOnVehicle PlayActionSound( PlayerBase player )
1220 {
1221 if ( g_Game.IsServer() && player )
1222 {
1223 if ( m_Sound != "" )
1224 {
1225 return g_Game.CreateSoundOnObject(player, m_Sound, 6, false);
1226 }
1227 else if ( m_Sounds && m_Sounds.Count() > 0 )
1228 {
1229 int rand_num = Math.RandomInt(0, m_Sounds.Count());
1230 return g_Game.CreateSoundOnObject(player, m_Sounds.Get(rand_num), 6, false);
1231 }
1232 }
1233
1234 return NULL;
1235 }
1236
1237 void OnActionInfoUpdate( PlayerBase player, ActionTarget target, ItemBase item )
1238 {
1239 }
1240
1241 //sound category matches with a soundtable category in config, selects correct soundset
1242 string GetSoundCategory(ActionData action_data)
1243 {
1244 return "";
1245 }
1246
1247 // EVENTS ------------------------------------------------
1248 void OnUpdate(ActionData action_data)
1249 {}
1250
1251 void OnUpdateClient(ActionData action_data)
1252 {
1253 if ( !g_Game.IsDedicatedServer() )
1254 {
1255 if (action_data.m_RefreshReservationTimer > 0)
1256 {
1257 action_data.m_RefreshReservationTimer--;
1258 }
1259 else
1260 {
1261 action_data.m_RefreshReservationTimer = m_RefreshReservationTimerValue;
1262 RefreshReservations(action_data);
1263 }
1264 }
1265 }
1266
1267 void OnUpdateServer(ActionData action_data)
1268 {
1269 }
1270
1271 void OnStart(ActionData action_data)
1272 {
1273 if (action_data.m_Player != NULL && action_data.m_Player.IsPlacingLocal() && !IsDeploymentAction())
1274 action_data.m_Player.PlacingCancelLocal();
1275 }
1276
1277 void OnStartClient(ActionData action_data)
1278 {}
1279
1280 void OnStartServer(ActionData action_data)
1281 {
1282
1283 }
1284
1285 void OnEnd(ActionData action_data)
1286 {
1287
1288 }
1289
1290 void OnEndClient(ActionData action_data)
1291 {}
1292
1293 void OnEndServer(ActionData action_data)
1294 {
1295 }
1296
1297 // SOFT SKILLS ------------------------------------------------
1299 {
1300 if(m_SpecialtyWeight == 0)
1301 {
1302#ifdef DEVELOPER
1303 //Print("UserAction does not use SoftSkills");
1304#endif
1305 }
1306
1307 return m_SpecialtyWeight;
1308 }
1309
1310 int GetState( ActionData action_data )
1311 {
1312 return action_data.m_State;
1313 }
1314
1315 float GetProgress( ActionData action_data )
1316 {
1317 return -1;
1318 }
1319
1320 float GetProgressWidgetMultiplier( ActionData action_data ) // override when action length is not supposed to be the same length as progress widget
1321 {
1322 return 1;
1323 }
1324
1326 {
1327 return m_Input;
1328 }
1329
1330 void SetID(int actionId)
1331 {
1332 m_ActionID = actionId;
1333 }
1334
1335 int GetID()
1336 {
1337 return m_ActionID;
1338 }
1339
1340 string GetAdminLogMessage(ActionData action_data)
1341 {
1342 return "";
1343 }
1344};
const int AC_UNCATEGORIZED
Definition _constants.c:1
event float OnJunctureTimedOut()
Definition actionbase.c:35
ActionConditionMask
Definition actionbase.c:2
@ ACM_THROWING
Definition actionbase.c:10
@ ACM_NO_EXEPTION
Definition actionbase.c:3
@ ACM_ON_LADDER
Definition actionbase.c:5
@ ACM_SWIMMING
Definition actionbase.c:6
@ ACM_RAISED
Definition actionbase.c:8
@ ACM_LEANING
Definition actionbase.c:11
@ ACM_IN_VEHICLE
Definition actionbase.c:4
@ ACM_RESTRAIN
Definition actionbase.c:7
@ ACM_ON_BACK
Definition actionbase.c:9
@ ACM_BROKEN_LEGS
Definition actionbase.c:12
@ ACM_IN_FREELOOK
Definition actionbase.c:13
int m_PossibleStanceMask
Definition actionbase.c:48
bool m_ReciveEndInput
Definition actionbase.c:55
int m_RefreshReservationTimer
Definition actionbase.c:50
ref ActionBase m_Action
Definition actionbase.c:41
bool m_WasActionStarted
Definition actionbase.c:54
bool m_WasExecuted
Definition actionbase.c:53
int m_DelayedAnimationEventID
Definition actionbase.c:52
ref array< ref InventoryLocation > m_ReservedInventoryLocations
Definition actionbase.c:49
int m_RefreshJunctureTimer
Definition actionbase.c:51
ref CABase m_ActionComponent
Definition actionbase.c:44
ref ActionTarget m_Target
Definition actionbase.c:18
ActionBase ActionData
Definition actionbase.c:30
map m_Player
class BaitData m_MainItem
Definition actionbase.c:42
float GetProgressWidgetMultiplier(ActionData action_data)
void OnEndClient(ActionData action_data)
bool CanBeUsedRaised()
Definition actionbase.c:360
bool CanBeUsedSwimming()
Definition actionbase.c:350
bool IsShaveSelf()
Definition actionbase.c:299
bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:415
void SendMessageToClient(Object reciever, string message)
int GetVariants(out array< ref ActionBase > variants)
Definition actionbase.c:940
float m_SpecialtyWeight
Definition actionbase.c:83
ActionData CreateActionData()
Definition actionbase.c:231
void ClearActionJuncture(ActionData action_data)
void RefreshActionJuncture(ActionData action_data)
bool CanTargetBeInVehicle()
Definition actionbase.c:340
int m_RefreshReservationTimerValue
Definition actionbase.c:61
void ApplyModifiers(ActionData action_data)
bool DisplayTargetInActionText()
Definition actionbase.c:405
Object GetDisplayInteractObject(PlayerBase player, ActionTarget target)
Definition actionbase.c:242
int GetClosestPossibleStance(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:612
bool IsEat()
Definition actionbase.c:289
int m_ActionID
Definition actionbase.c:73
bool HasProgress()
For UI: hiding of progress bar.
Definition actionbase.c:256
string m_Sound
Definition actionbase.c:63
bool HasVariants()
Definition actionbase.c:927
void End(ActionData action_data)
Definition actionbase.c:764
void OnEndRequest(ActionData action_data)
Definition actionbase.c:797
bool RemoveForceTargetAfterUse()
Definition actionbase.c:279
string GetAdminLogMessage(ActionData action_data)
int GetState(ActionData action_data)
void OnEnd(ActionData action_data)
int m_StanceMask
Definition actionbase.c:68
bool IsDamageDestroyed(ActionTarget target)
bool CanBeUsedInVehicle()
Definition actionbase.c:335
ref ActionVariantManager m_VariantManager
Definition actionbase.c:76
void UpdateVariants(Object item, Object target, int componet_index)
Definition actionbase.c:958
bool CanBePerformedWhileChangingStance()
Condition used in PlayerBase::CanChangeStance to check if stance can be changed while action is perfo...
Definition actionbase.c:320
bool CanBePerformedFromInventory()
Definition actionbase.c:314
bool IsDrink()
Definition actionbase.c:294
int GetStanceMaskEx(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:593
void OnUpdateServer(ActionData action_data)
bool HasTarget()
Definition actionbase.c:250
bool InventoryReservation(ActionData action_data)
Definition actionbase.c:979
void OnItemLocationChanged(ItemBase item)
Definition actionbase.c:974
void Start(ActionData action_data)
Definition actionbase.c:737
string GetSoundCategory(ActionData action_data)
void OnActionInfoUpdate(PlayerBase player, ActionTarget target, ItemBase item)
void ActionBase()
Definition actionbase.c:88
bool IsInReach(PlayerBase player, ActionTarget target, float maxDistance=1.0)
bool CanBePerformedFromQuickbar()
Definition actionbase.c:309
bool IsLockTargetOnUse()
Definition actionbase.c:105
void EndInput(ActionData action_data)
Definition actionbase.c:791
void OnUpdateClient(ActionData action_data)
bool Can(PlayerBase player, ActionTarget target, ItemBase item, int condition_mask)
Definition actionbase.c:873
bool CanBeUsedInRestrain()
Definition actionbase.c:330
string GetTargetName(PlayerBase player, ActionTarget target)
Definition actionbase.c:426
int GetRefreshReservationTimerValue()
Definition actionbase.c:433
bool CanBeUsedInFreelook()
Definition actionbase.c:380
bool IsTransport(ActionTarget target)
bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data=NULL)
Definition actionbase.c:162
string m_Text
Definition actionbase.c:64
bool UseAcknowledgment()
bool CanBeUsedOnBack()
Definition actionbase.c:345
int m_VariantID
Definition actionbase.c:74
ref CCIBase m_ConditionItem
Definition actionbase.c:70
ref TStringArray m_Sounds
Definition actionbase.c:69
int GetStanceMask(PlayerBase player)
Definition actionbase.c:598
bool Can(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:912
void OnUpdate(ActionData action_data)
bool AddActionJuncture(ActionData action_data)
int GetVariantsCount()
Definition actionbase.c:932
void RefreshReservations(ActionData action_data)
void ActionCleanup(ActionData action_data)
Definition actionbase.c:218
bool CanBeUsedOnLadder()
Definition actionbase.c:355
int GetActionCategory()
Definition actionbase.c:284
float GetProgress(ActionData action_data)
bool IsBuilding(ActionTarget target)
bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
Definition actionbase.c:494
bool IsFullBodyEx(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:715
void OnStartClient(ActionData action_data)
void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
Definition actionbase.c:438
int m_ConditionMask
Definition actionbase.c:75
void OnStartServer(ActionData action_data)
ActionVariantManager GetVariantManager()
Definition actionbase.c:966
bool HasProneException()
Definition actionbase.c:730
ActionInput m_Input
Definition actionbase.c:72
bool IsInstant()
Definition actionbase.c:268
bool CanBeUsedThrowing()
Definition actionbase.c:365
bool Post_SetupAction(ActionData action_data)
Definition actionbase.c:213
bool IsDeploymentAction()
Is an action directly related to deployment/advanced placing.
Definition actionbase.c:386
bool ActionConditionContinue(ActionData action_data)
Definition actionbase.c:410
void SetID(int actionId)
void EndRequest(ActionData action_data)
Definition actionbase.c:800
void ClearInventoryReservationEx(ActionData action_data)
bool UseMainItem()
Definition actionbase.c:391
bool CanBeSetFromInventory()
Definition actionbase.c:325
SoundOnVehicle PlayActionSound(PlayerBase player)
void InformPlayers(PlayerBase player, ActionTarget target, int state)
DEPRECATED delivers message ids to clients based on given context.
void OnStart(ActionData action_data)
bool IsUsingProxies()
not using plane object - it's using multiple proxies
Definition actionbase.c:274
ActionInput GetInput()
void SetInput(ActionInput ai)
Definition actionbase.c:226
int GetVariantID()
Definition actionbase.c:953
bool CanReceiveAction(ActionTarget target)
Definition actionbase.c:805
void OnEndInput(ActionData action_data)
Definition actionbase.c:788
void CreateConditionComponents()
Definition actionbase.c:236
float GetSpecialtyWeight()
bool m_LockTargetOnUse
Definition actionbase.c:66
void Interrupt(ActionData action_data)
Definition actionbase.c:783
void SetVariantID(int ID)
Definition actionbase.c:948
void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
Definition actionbase.c:571
bool IsFullBody(PlayerBase player)
Definition actionbase.c:720
bool MainItemAlwaysInHands()
Definition actionbase.c:396
void InitConditionMask()
Definition actionbase.c:110
bool m_FullBody
Definition actionbase.c:67
ref CCTBase m_ConditionTarget
Definition actionbase.c:71
ref Param1< string > m_MessageParam
Definition actionbase.c:79
bool CanContinue(ActionData action_data)
Definition actionbase.c:919
string GetText()
Definition actionbase.c:304
bool CanBeUsedWithBrokenLegs()
Definition actionbase.c:375
bool CanBeUsedLeaning()
Definition actionbase.c:370
void OnEndServer(ActionData action_data)
bool IsLocal()
Definition actionbase.c:262
static int ComputeConditionMask(PlayerBase player, ActionTarget target, ItemBase item)
Definition actionbase.c:819
Definition cabase.c:2
Super root of all classes in Enforce script.
Definition enscript.c:11
Definition debug.c:2
Definition camera.c:2
script counterpart to engine's class Inventory
Definition inventory.c:81
const int c_InventoryReservationTimeoutMS
reservations
Definition inventory.c:714
InventoryLocation.
TODO doc.
Definition enscript.c:118
Definition enmath.c:7
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Definition param.c:12
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
DayZGame g_Game
Definition dayzgame.c:3942
DayZPlayerInstanceType
defined in C++
DayZPlayerConstants
defined in C++
Definition dayzplayer.c:602
eBrokenLegs
Definition ebrokenlegs.c:2
EmoteCB m_Callback
void End()
called on surrender end request end
ERPCs
Definition erpcs.c:2
Serializer ParamsReadContext
Definition gameplay.c:15
Serializer ParamsWriteContext
Definition gameplay.c:16
class GP5GasMask extends MaskBase ItemBase
void Error(string err)
Messagebox with error message.
Definition endebug.c:90
array< string > TStringArray
Definition enscript.c:712
void Obsolete(string msg="")
Definition enscript.c:371
void OnEnd()
Definition sound.c:226
const int UA_START
Definition constants.c:472
const int UA_NONE
Definition constants.c:465
string Type
enum EObjectTemperatureState m_State
bool IsFullBody()
int GetStanceMask()