Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
actionpushobject.c
Go to the documentation of this file.
1class ActionPushObjectDataReceiveData : ActionReciveData
2{
3 Object m_PushTarget;
4}
5
6class ActionPushObjectData : ActionData
7{
9 int m_EndType = 0;
10 vector m_Origin = "0 0 0";
11
13}
14
16{
17 void CAContinuousRepeatPushObject(float time_to_complete_action)
18 {
19 m_DefaultTimeToComplete = time_to_complete_action;
20 }
21
22 override int Execute(ActionData action_data)
23 {
24 if (!action_data.m_Player)
25 return UA_ERROR;
26
28 {
29 m_TimeElpased += action_data.m_Player.GetDeltaT();
30 m_TotalTimeElpased += action_data.m_Player.GetDeltaT();
31 return UA_PROCESSING;
32 }
33 else
34 {
38 OnCompletePogress(action_data);
39
40 return UA_CANCEL;
41 }
42
43 return UA_FINISHED;
44 }
45}
46
47class ActionPushObjectCB : ActionContinuousBaseCB
48{
49 protected float PUSH_FORCE_INCREMENT = 3000.0;
50 protected ActionPushObjectData m_ActionDataPushObject;
51
52 override void CreateActionComponent()
53 {
54 m_ActionData.m_ActionComponent = new CAContinuousRepeatPushObject(10);
55 }
56
58 {
59 super.ProgressActionComponent();
60
61 ActionPushObjectData data = ActionPushObjectData.Cast(m_ActionData);
62 ApplyForce(data);
63 }
64
65 override void EndActionComponent()
66 {
67 m_ActionDataPushObject = ActionPushObjectData.Cast(m_ActionData);
68
70 {
71 super.EndActionComponent();
72 return;
73 }
74
76 {
77 if (m_ActionDataPushObject.m_EndType == 1)
78 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_FINISH);
79 else if (m_ActionDataPushObject.m_EndType == 0)
80 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_END);
81 }
82 else if (m_ActionDataPushObject.m_State == UA_CANCEL)
83 {
85 if (action.HasAlternativeInterrupt())
86 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_FINISH);
87 else
88 SetCommand(DayZPlayerConstants.CMD_ACTIONINT_END);
89
90 return;
91 }
92
94 }
95
96 protected void ApplyForce(ActionPushObjectData actionData)
97 {
98 Object entity = actionData.m_Object;
99
100 float bodyMass = dBodyGetMass(entity);
101 float invBodyMass = 1.0 / bodyMass;
102 float force = bodyMass * PUSH_FORCE_INCREMENT;
103 float easedProgress = Easing.EaseInOutSine(actionData.m_ActionComponent.GetProgress());
104
105 vector impulse = force * actionData.m_Player.GetDirection() * invBodyMass * easedProgress;
106
107 actionData.m_Player.DepleteStamina(EStaminaModifiers.PUSH_CAR);
108
109 dBodyApplyImpulseAt(entity, impulse, entity.ModelToWorld(vector.Zero));
110 }
111}
112
114{
115
116 override typename GetInputType()
117 {
119 }
120
121 override void CreateConditionComponents()
122 {
125 }
126
127 override bool HasAlternativeInterrupt()
128 {
129 return true;
130 }
131
132 override ActionData CreateActionData()
133 {
134 ActionPushObjectData data = new ActionPushObjectData();
135 return data;
136 }
137
138 override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
139 {
140 if (!player.IsPlayerInStance(DayZPlayerConstants.STANCEMASK_ERECT|DayZPlayerConstants.STANCEMASK_CROUCH))
141 return false;
142
143 if (player.PhysicsGetLinkedEntity() == target.GetObject())
144 return false;
145
146 if (!player.GetSurfaceType())
147 return false;
148
149 if (!player.CanConsumeStamina(EStaminaConsumers.PUSH))
150 return false;
151
152 return true;
153 }
154
155 override void OnUpdate(ActionData action_data)
156 {
157 super.OnUpdate(action_data);
158
159 ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
160 if (data.m_NeedUpdate)
161 {
162 if (!data.m_Player.CanConsumeStamina(EStaminaConsumers.PUSH))
163 {
164 data.m_State = UA_CANCEL;
165 data.m_NeedUpdate = false;
166
167 return;
168 }
169
170 if (vector.Distance(data.m_Object.GetPosition(), data.m_Origin) > 0.5)
171 {
172 data.m_State = UA_FINISHED;
173 data.m_EndType = 0;
174 data.m_NeedUpdate = false;
175 }
176 }
177 }
178
179 override void OnStart(ActionData action_data)
180 {
181 super.OnStart(action_data);
182
183 ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
184 data.m_Object = GetPushObject(action_data.m_Target);
185 data.m_Origin = data.m_Object.GetPosition();
186 data.m_NeedUpdate = true;
187 }
188
189 override void OnEndInput(ActionData action_data)
190 {
191 super.OnEndInput(action_data);
192
193 ActionPushObjectData data = ActionPushObjectData.Cast(action_data);
194 data.m_State = UA_CANCEL;
195 data.m_EndType = 1;
196 data.m_NeedUpdate = false;
197 }
198
199 protected Object GetPushObject(ActionTarget target)
200 {
201 if (target.IsProxy())
202 return target.GetParent();
203
204 return target.GetObject();
205 }
206}
ActionEat CreateActionComponent
Definition actioneat.c:39
void ApplyForce(ActionPushObjectData actionData)
ActionPushObjectData m_ActionDataPushObject
Object m_Object
vector m_Origin
int m_EndType
override void ProgressActionComponent()
ActionPushObjectDataReceiveData m_NeedUpdate
CAContinuousRepeatPushObject PUSH_FORCE_INCREMENT
override void EndActionComponent()
ref CCIBase m_ConditionItem
Definition actionbase.c:64
ref CCTBase m_ConditionTarget
Definition actionbase.c:65
Object GetPushObject(ActionTarget target)
void SetACData(Param units)
Definition cabase.c:40
ref Param1< float > m_SpentUnits
Input value between 0 and 1, returns value adjusted by easing, no automatic clamping of input(do your...
Definition easing.c:3
DayZPlayerConstants
defined in C++
Definition dayzplayer.c:602
EStaminaConsumers
EStaminaModifiers
proto void dBodyApplyImpulseAt(notnull IEntity body, vector impulse, vector pos)
Applies impuls on a pos position in world coordinates.
proto native float dBodyGetMass(notnull IEntity ent)
const int UA_FINISHED
Definition constants.c:466
const int UA_ERROR
Definition constants.c:485
const int UA_PROCESSING
Definition constants.c:464
const int UA_CANCEL
Definition constants.c:467