Dayz Explorer 1.28.160049
Loading...
Searching...
No Matches
actiondeployobject.c
Go to the documentation of this file.
1class PlaceObjectActionReciveData : ActionReciveData
2{
3 vector m_Position;
4 vector m_Orientation;
5}
6
7class PlaceObjectActionData : ActionData
8{
9 vector m_Position;
10 vector m_Orientation;
11 bool m_AlreadyPlaced;
12}
13
15{
16 override void CreateActionComponent()
17 {
18 m_ActionData.m_ActionComponent = new CAContinuousTime(UATimeSpent.DEFAULT_DEPLOY);
19 }
20
21 void DropDuringPlacing()
22 {
23 EntityAI entity_for_placing = m_ActionData.m_MainItem;
24 if ( entity_for_placing.IsBasebuildingKit() )
25 return;
26
27 vector orientation = m_ActionData.m_Player.GetOrientation();
28 vector position = m_ActionData.m_Player.GetPosition() + m_ActionData.m_Player.GetDirection();
29 vector rotation_matrix[3];
30 float direction[4];
32 InventoryLocation destination = new InventoryLocation;
33
34 Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
35 Math3D.MatrixToQuat( rotation_matrix, direction );
36
37 vector ground_position = position;
38 ground_position[1] = GetGame().SurfaceY(ground_position[0],ground_position[2]);
39
40 if ( vector.DistanceSq( m_ActionData.m_Player.GetPosition(), ground_position ) > UAMaxDistances.DEFAULT * UAMaxDistances.DEFAULT)
41 {
42 if ( entity_for_placing.GetInventory().GetCurrentInventoryLocation( source ) )
43 {
44 destination.SetGroundEx( entity_for_placing, position, direction );
45 m_ActionData.m_Player.PredictiveTakeToDst(source, destination);
46 }
47 }
48 else
49 {
50 if ( entity_for_placing.GetInventory().GetCurrentInventoryLocation( source ) )
51 {
52 destination.SetGroundEx( entity_for_placing, ground_position, direction );
53 m_ActionData.m_Player.PredictiveTakeToDst(source, destination);
54 }
55 }
56 }
57};
58
60{
62 {
64 m_SpecialtyWeight = UASoftSkillsWeight.PRECISE_LOW;
65 m_CommandUID = 0;
66 m_FullBody = true;
67 m_StanceMask = DayZPlayerConstants.STANCEMASK_CROUCH | DayZPlayerConstants.STANCEMASK_ERECT;
68 }
69
70 override void CreateConditionComponents()
71 {
74 }
75
76 override bool HasTarget()
77 {
78 return false;
79 }
80
81 override bool HasProgress()
82 {
83 return true;
84 }
85
86 override bool HasAlternativeInterrupt()
87 {
88 return true;
89 }
90
91 override string GetText()
92 {
93 return "#deploy_object";
94 }
95
96 override bool ActionConditionContinue( ActionData action_data )
97 {
98 return true;
99 }
100
101 override ActionData CreateActionData()
102 {
104 return action_data;
105 }
106
107 override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
108 {
109 if ( super.SetupAction(player, target, item, action_data, extra_data ))
110 {
111 PlaceObjectActionData poActionData;
112 poActionData = PlaceObjectActionData.Cast(action_data);
113 poActionData.m_AlreadyPlaced = false;
114 if (!GetGame().IsMultiplayer() || GetGame().IsClient() )
115 {
116 Hologram hologram = player.GetHologramLocal();
117 if (hologram)
118 {
119 poActionData.m_Position = player.GetHologramLocal().GetProjectionPosition();
120 poActionData.m_Orientation = player.GetHologramLocal().GetProjectionOrientation();
121
122 poActionData.m_Player.SetLocalProjectionPosition( poActionData.m_Position );
123 poActionData.m_Player.SetLocalProjectionOrientation( poActionData.m_Orientation );
124 }
125 else
126 {
127 return false;
128 }
129 }
130
131 if ( !action_data.m_MainItem )
132 return false;
133
134 SetupAnimation( action_data.m_MainItem );
135 return true;
136 }
137 return false;
138 }
139
140 override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
141 {
142 //Print("XXXXXX");
143 //Client
144 if ( !GetGame().IsMultiplayer() || GetGame().IsClient() )
145 {
146 if ( player.IsPlacingLocal() )
147 {
148 //Print("------");
149 if ( !player.GetHologramLocal().IsColliding() )
150 {
151 if ( item.CanBePlaced(player, player.GetHologramLocal().GetProjectionEntity().GetPosition()) )
152 {
153 return true;
154 }
155 }
156 }
157 return false;
158 }
159 //Server
160 return true;
161 }
162
163 /*override bool ActionConditionContinue( ActionData action_data )
164 {
165 //Client
166 if ( !GetGame().IsMultiplayer() || GetGame().IsClient() )
167 {
168 if ( player.IsPlacingLocal() )
169 {
170 if ( !player.GetHologramLocal().IsColliding() )
171 {
172 if ( item.CanBePlaced(player, player.GetHologramLocal().GetProjectionEntity().GetPosition()) )
173 {
174 return true;
175 }
176 }
177 }
178 return false;
179 }
180 //Server
181 return true;
182 }*/
183
184 override void OnStartClient( ActionData action_data )
185 {
186 PlaceObjectActionData poActionData;
187 poActionData = PlaceObjectActionData.Cast(action_data);
188
189 if ( !poActionData ) { return; }
190
191 if (GetGame().IsMultiplayer())
192 action_data.m_Player.PlacingCompleteLocal();
193 }
194
195 override void OnStartServer( ActionData action_data )
196 {
197 if ( GetGame().IsMultiplayer() )
198 {
199 PlaceObjectActionData poActionData;
200 poActionData = PlaceObjectActionData.Cast(action_data);
201
202 if ( !poActionData ) { return; }
203
204 EntityAI entity_for_placing = action_data.m_MainItem;
205 poActionData.m_Player.SetLocalProjectionPosition( poActionData.m_Position );
206 poActionData.m_Player.SetLocalProjectionOrientation( poActionData.m_Orientation );
207
208 if ( action_data.m_MainItem )
209 {
210 poActionData.m_Player.PlacingStartServer(action_data.m_MainItem);
211
212 GetGame().AddActionJuncture( action_data.m_Player, entity_for_placing, 10000 );
213 action_data.m_MainItem.SetIsBeingPlaced( true );
214 }
215 }
216 else
217 {
218 //local singleplayer
219 action_data.m_Player.PlacingStartServer(action_data.m_MainItem);
220 action_data.m_Player.GetHologramLocal().SetUpdatePosition( false );
221 action_data.m_MainItem.SetIsBeingPlaced( true );
222 }
223 }
224
225 override void OnFinishProgressClient( ActionData action_data )
226 {
227 PlaceObjectActionData poActionData;
228 poActionData = PlaceObjectActionData.Cast(action_data);
229
230 if ( !poActionData ) { return; }
231
232 EntityAI entity_for_placing = action_data.m_MainItem;
233 vector position = action_data.m_Player.GetLocalProjectionPosition();
234 vector orientation = action_data.m_Player.GetLocalProjectionOrientation();
235
236 poActionData.m_AlreadyPlaced = true;
237
238 entity_for_placing.OnPlacementComplete( action_data.m_Player, position, orientation);
239 }
240
241 override void OnFinishProgressServer( ActionData action_data )
242 {
243 PlaceObjectActionData poActionData;
244 poActionData = PlaceObjectActionData.Cast(action_data);
245
246 if ( !poActionData ) { return; }
247 if( !action_data.m_MainItem ) { return; }
248
249 EntityAI entity_for_placing = action_data.m_MainItem;
250 vector position = action_data.m_Player.GetLocalProjectionPosition();
251 vector orientation = action_data.m_Player.GetLocalProjectionOrientation();
252
253 action_data.m_Player.GetHologramServer().EvaluateCollision(action_data.m_MainItem);
254 //action_data.m_Player.GetHologramServer().SetIsColliding(true); //REMOVE
255 if (action_data.m_Player.GetHologramServer().IsColliding())
256 {
257 //Print("!!!IsColliding");
258 //return;
259 }
260
261 action_data.m_Player.GetHologramServer().PlaceEntity( entity_for_placing );
262
263 if ( GetGame().IsMultiplayer() )
264 action_data.m_Player.GetHologramServer().CheckPowerSource();
265
266 action_data.m_Player.PlacingCompleteServer();
267 entity_for_placing.OnPlacementComplete( action_data.m_Player, position, orientation );
268
269 MoveEntityToFinalPosition( action_data, position, orientation );
270 GetGame().ClearJuncture( action_data.m_Player, entity_for_placing );
271 action_data.m_MainItem.SetIsBeingPlaced( false );
272 action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
273 poActionData.m_AlreadyPlaced = true;
274 action_data.m_MainItem.SoundSynchRemoteReset();
275 }
276
277 override void OnEndClient( ActionData action_data )
278 {
279 PlaceObjectActionData poActionData;
280 poActionData = PlaceObjectActionData.Cast(action_data);
281 if ( !poActionData.m_AlreadyPlaced )
282 {
283 EntityAI entity_for_placing = action_data.m_MainItem;
284 action_data.m_Player.PlacingCancelLocal();
285 action_data.m_Player.PredictiveTakeEntityToHands( entity_for_placing );
286 action_data.m_Player.LockHandsUntilItemHeld();
287 }
288 }
289
290 override void OnEndServer( ActionData action_data )
291 {
292 if( !action_data || !action_data.m_MainItem )
293 return;
294
295 PlaceObjectActionData poActionData;
296 poActionData = PlaceObjectActionData.Cast(action_data);
297 if ( !poActionData.m_AlreadyPlaced )
298 {
299 EntityAI entity_for_placing = action_data.m_MainItem;
300 GetGame().ClearJuncture( action_data.m_Player, entity_for_placing );
301 action_data.m_MainItem.SetIsBeingPlaced( false );
302
303 if ( GetGame().IsMultiplayer() )
304 {
305 action_data.m_Player.PlacingCancelServer();
306 //action_data.m_Player.ServerTakeEntityToHands( entity_for_placing );
307 action_data.m_MainItem.SoundSynchRemoteReset();
308 }
309 else
310 {
311 //local singleplayer
312 action_data.m_Player.PlacingCancelLocal();
313 action_data.m_Player.PlacingCancelServer();
314
316 InventoryLocation destination = new InventoryLocation;
317
318 if ( action_data.m_MainItem.GetInventory().GetCurrentInventoryLocation( source ) )
319 {
320 destination.SetHands( action_data.m_Player, action_data.m_MainItem );
321 action_data.m_Player.GetDayZPlayerInventory().RedirectToHandEvent(InventoryMode.LOCAL, source, destination);
322 }
323 }
324
325 GetGame().ClearJuncture( action_data.m_Player, action_data.m_MainItem );
326 }
327 else
328 {
329 //TODO: make OnEND placement event and move there
330
331 action_data.m_MainItem.SetIsDeploySound( false );
332 action_data.m_MainItem.SetIsPlaceSound( false );
333 action_data.m_MainItem.SoundSynchRemoteReset();
334
335 if ( action_data.m_MainItem.IsBasebuildingKit() )
336 {
337 action_data.m_MainItem.Delete();
338 }
339 else
340 {
341 GetGame().ClearJuncture( action_data.m_Player, action_data.m_MainItem );
342 }
343 }
344 }
345
346 override void OnStartAnimationLoop( ActionData action_data )
347 {
348 if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
349 {
350 if ( action_data.m_Player.GetItemInHands() )
351 ActiondeployObjectCB.Cast(action_data.m_Callback).DropDuringPlacing();
352 }
353 }
354
355 override void OnExecuteServer( ActionData action_data )
356 {
357 action_data.m_MainItem.SoundSynchRemote();
358 }
359
360 override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
361 {
362 super.WriteToContext(ctx, action_data);
363
364 PlaceObjectActionData poActionData;
365 poActionData = PlaceObjectActionData.Cast(action_data);
366
367 ctx.Write( poActionData.m_Position );
368 ctx.Write( poActionData.m_Orientation );
369 }
370
371 override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
372 {
373 if(!action_recive_data)
374 {
375 action_recive_data = new PlaceObjectActionReciveData;
376 }
377 super.ReadFromContext(ctx, action_recive_data );
378 PlaceObjectActionReciveData action_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
379
380 vector entity_position = "0 0 0";
381 vector entity_orientation = "0 0 0";
382 if (!ctx.Read(entity_position))
383 return false;
384 if (!ctx.Read(entity_orientation))
385 return false;
386
387 action_data_po.m_Position = entity_position;
388 action_data_po.m_Orientation = entity_orientation;
389
390 return true;
391 }
392
393 override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
394 {
395 super.HandleReciveData(action_recive_data, action_data);
396
397 PlaceObjectActionReciveData recive_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
398 PlaceObjectActionData action_data_po = PlaceObjectActionData.Cast(action_data);
399
400 action_data_po.m_Position = recive_data_po.m_Position;
401 action_data_po.m_Orientation = recive_data_po.m_Orientation;
402 }
403
404 void MoveEntityToFinalPosition( ActionData action_data, vector position, vector orientation )
405 {
406 if ( action_data.m_MainItem.IsBasebuildingKit() ) return;
407
408 EntityAI entity_for_placing = action_data.m_MainItem;
409 vector rotation_matrix[3];
410 float direction[4];
412 InventoryLocation destination = new InventoryLocation;
413
414 Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
415 Math3D.MatrixToQuat( rotation_matrix, direction );
416
417 if ( entity_for_placing.GetInventory().GetCurrentInventoryLocation( source ) )
418 {
419 destination.SetGroundEx( entity_for_placing, position, direction );
420
421 if ( GetGame().IsMultiplayer() )
422 {
423 action_data.m_Player.ServerTakeToDst(source, destination);
424 }
425 //local singleplayer
426 else
427 {
428 MoveEntityToFinalPositionSinglePlayer(action_data, source, destination);
429 }
430 }
431 }
432
433 void MoveEntityToFinalPositionSinglePlayer(ActionData action_data, InventoryLocation source, InventoryLocation destination)
434 {
435 action_data.m_Player.GetInventory().TakeToDst(InventoryMode.LOCAL, source, destination);
436 }
437
438 void SetupAnimation( ItemBase item )
439 {
440 if ( item.IsDeployable() )
441 {
442 if ( item.IsHeavyBehaviour() )
443 {
444 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_HEAVY;
445 }
446 else if ( item.IsOneHandedBehaviour() )
447 {
448 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_1HD;
449 }
450 else if ( item.IsTwoHandedBehaviour() )
451 {
452 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
453 }
454 else
455 {
456 Print("Error: check " + item + " behaviour");
457 }
458 }
459 else
460 {
461 if ( item.IsHeavyBehaviour() )
462 {
463 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_HEAVY;
464 }
465 else if ( item.IsOneHandedBehaviour() )
466 {
467 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_1HD;
468 }
469 else if ( item.IsTwoHandedBehaviour() )
470 {
471 m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_2HD;
472 }
473 else
474 {
475 Print("Error: check " + item + " behaviour");
476 }
477 }
478 }
479};
InventoryMode
NOTE: PREDICTIVE is not to be used at all in multiplayer.
Definition inventory.c:22
ActionData m_ActionData
float m_SpecialtyWeight
Definition actionbase.c:77
int m_StanceMask
Definition actionbase.c:62
ref CCIBase m_ConditionItem
Definition actionbase.c:64
bool m_FullBody
Definition actionbase.c:61
ref CCTBase m_ConditionTarget
Definition actionbase.c:65
proto native float SurfaceY(float x, float z)
InventoryLocation.
override bool CanBePlaced(Man player, vector position)
Definition tentbase.c:947
override bool IsDeployable()
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Definition param.c:12
Serialization general interface. Serializer API works with:
Definition serializer.c:56
DayZPlayerConstants
defined in C++
Definition dayzplayer.c:602
proto native CGame GetGame()
proto void Print(void var)
Prints content of variable to console/log.