Dayz  1.11.153731
Dayz Code Explorer by Zeroy
ActionDeployObject.c
Go to the documentation of this file.
1 class PlaceObjectActionReciveData : ActionReciveData
2 {
5 }
6 
7 class PlaceObjectActionData : ActionData
8 {
12 }
13 
15 {
16  override void CreateActionComponent()
17  {
19  }
20 
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  {
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 ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
97  {
98  //Client
99  if ( !GetGame().IsMultiplayer() || GetGame().IsClient() )
100  {
101  //Action not allowed if player has broken legs
102  if (player.m_BrokenLegState == eBrokenLegs.BROKEN_LEGS)
103  return false;
104 
105  if ( player.IsPlacingLocal() )
106  {
107  if ( !player.GetHologramLocal().IsColliding() )
108  {
109  if ( item.CanBePlaced(player, player.GetHologramLocal().GetProjectionEntity().GetPosition()) )
110  {
111  return true;
112  }
113  }
114  }
115  return false;
116  }
117  //Server
118  return true;
119  }
120 
121  override bool ActionConditionContinue( ActionData action_data )
122  {
123  //Client
124  if ( !GetGame().IsMultiplayer() || GetGame().IsClient() )
125  {
126  //Action not allowed if player has broken legs
127  if (action_data.m_Player.m_BrokenLegState == eBrokenLegs.BROKEN_LEGS)
128  return false;
129 
130  return true; //redundant?
131  }
132  //Server
133  else
134  {
135  /*if ( !action_data.m_Player.IsPlacingServer() )
136  {
137  return true;
138  }
139  else*/
140  if (action_data.m_Player.IsPlacingServer())
141  {
142  action_data.m_Player.GetHologramServer().EvaluateCollision(action_data.m_MainItem);
143  if ( !action_data.m_Player.GetHologramServer().IsColliding() )
144  {
145  if ( action_data.m_MainItem.CanBePlaced(action_data.m_Player, action_data.m_Player.GetHologramServer().GetProjectionEntity().GetPosition()) )
146  {
147  return true;
148  }
149  }
150  return false;
151  }
152  return false;
153  }
154  }
155 
157  {
158  PlaceObjectActionData action_data = new PlaceObjectActionData;
159  return action_data;
160  }
161 
162  override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data = NULL)
163  {
164  if ( super.SetupAction(player, target, item, action_data, extra_data ))
165  {
166  PlaceObjectActionData poActionData;
167  poActionData = PlaceObjectActionData.Cast(action_data);
168  poActionData.m_AlreadyPlaced = false;
169  if (!GetGame().IsMultiplayer() || GetGame().IsClient() )
170  {
171  Hologram hologram = player.GetHologramLocal();
172  if (hologram)
173  {
174  poActionData.m_Position = player.GetHologramLocal().GetProjectionPosition();
175  poActionData.m_Orientation = player.GetHologramLocal().GetProjectionOrientation();
176 
177  poActionData.m_Player.SetLocalProjectionPosition( poActionData.m_Position );
178  poActionData.m_Player.SetLocalProjectionOrientation( poActionData.m_Orientation );
179  }
180  else
181  {
182  return false;
183  }
184  }
185 
186  if ( !action_data.m_MainItem )
187  return false;
188 
189  SetupAnimation( action_data.m_MainItem );
190  return true;
191  }
192  return false;
193  }
194 
195  override void OnStartClient( ActionData action_data )
196  {
197  PlaceObjectActionData poActionData;
198  poActionData = PlaceObjectActionData.Cast(action_data);
199 
200  if ( !poActionData ) { return; }
201 
202  if (GetGame().IsMultiplayer())
203  action_data.m_Player.PlacingCompleteLocal();
204  }
205 
206  override void OnStartServer( ActionData action_data )
207  {
208  if ( GetGame().IsMultiplayer() )
209  {
210  PlaceObjectActionData poActionData;
211  poActionData = PlaceObjectActionData.Cast(action_data);
212 
213  if ( !poActionData ) { return; }
214 
215  EntityAI entity_for_placing = action_data.m_MainItem;
216  poActionData.m_Player.SetLocalProjectionPosition( poActionData.m_Position );
217  poActionData.m_Player.SetLocalProjectionOrientation( poActionData.m_Orientation );
218 
219  if ( action_data.m_MainItem )
220  {
221  poActionData.m_Player.PlacingStartServer(action_data.m_MainItem);
222 
223  GetGame().AddActionJuncture( action_data.m_Player, entity_for_placing, 10000 );
224  action_data.m_MainItem.SetIsBeingPlaced( true );
225  }
226  }
227  else
228  {
229  //local singleplayer
230  action_data.m_Player.PlacingStartServer(action_data.m_MainItem);
231  action_data.m_Player.GetHologramLocal().SetUpdatePosition( false );
232  action_data.m_MainItem.SetIsBeingPlaced( true );
233  }
234  }
235 
236  override void OnFinishProgressClient( ActionData action_data )
237  {
238  PlaceObjectActionData poActionData;
239  poActionData = PlaceObjectActionData.Cast(action_data);
240 
241  if ( !poActionData ) { return; }
242 
243  EntityAI entity_for_placing = action_data.m_MainItem;
244  vector position = action_data.m_Player.GetLocalProjectionPosition();
245  vector orientation = action_data.m_Player.GetLocalProjectionOrientation();
246 
247  poActionData.m_AlreadyPlaced = true;
248 
249  entity_for_placing.OnPlacementComplete( action_data.m_Player, position, orientation);
250  }
251 
252  override void OnFinishProgressServer( ActionData action_data )
253  {
254  PlaceObjectActionData poActionData;
255  poActionData = PlaceObjectActionData.Cast(action_data);
256 
257  if ( !poActionData ) { return; }
258  if( !action_data.m_MainItem ) { return; }
259 
260  EntityAI entity_for_placing = action_data.m_MainItem;
261  vector position = action_data.m_Player.GetLocalProjectionPosition();
262  vector orientation = action_data.m_Player.GetLocalProjectionOrientation();
263 
264  action_data.m_Player.GetHologramServer().EvaluateCollision(action_data.m_MainItem);
265  if (action_data.m_Player.GetHologramServer().IsColliding())
266  {
267  return;
268  }
269 
270  action_data.m_Player.GetHologramServer().PlaceEntity( entity_for_placing );
271 
272  if ( GetGame().IsMultiplayer() )
273  action_data.m_Player.GetHologramServer().CheckPowerSource();
274 
275  action_data.m_Player.PlacingCompleteServer();
276  entity_for_placing.OnPlacementComplete( action_data.m_Player, position, orientation );
277 
278  MoveEntityToFinalPosition( action_data, position, orientation );
279  GetGame().ClearJuncture( action_data.m_Player, entity_for_placing );
280  action_data.m_MainItem.SetIsBeingPlaced( false );
281  action_data.m_Player.GetSoftSkillsManager().AddSpecialty( m_SpecialtyWeight );
282  poActionData.m_AlreadyPlaced = true;
283  action_data.m_MainItem.SoundSynchRemoteReset();
284  }
285 
286  override void OnEndClient( ActionData action_data )
287  {
288  PlaceObjectActionData poActionData;
289  poActionData = PlaceObjectActionData.Cast(action_data);
290  if ( !poActionData.m_AlreadyPlaced )
291  {
292  EntityAI entity_for_placing = action_data.m_MainItem;
293  action_data.m_Player.PlacingCancelLocal();
294  action_data.m_Player.PredictiveTakeEntityToHands( entity_for_placing );
295  action_data.m_Player.LockHandsUntilItemHeld();
296  }
297  }
298 
299  override void OnEndServer( ActionData action_data )
300  {
301  if( !action_data || !action_data.m_MainItem )
302  return;
303 
304  PlaceObjectActionData poActionData;
305  poActionData = PlaceObjectActionData.Cast(action_data);
306  if ( !poActionData.m_AlreadyPlaced )
307  {
308  EntityAI entity_for_placing = action_data.m_MainItem;
309  GetGame().ClearJuncture( action_data.m_Player, entity_for_placing );
310  action_data.m_MainItem.SetIsBeingPlaced( false );
311 
312  if ( GetGame().IsMultiplayer() )
313  {
314  action_data.m_Player.PlacingCancelServer();
315  //action_data.m_Player.ServerTakeEntityToHands( entity_for_placing );
316  action_data.m_MainItem.SoundSynchRemoteReset();
317  }
318  else
319  {
320  //local singleplayer
321  action_data.m_Player.PlacingCancelLocal();
322  action_data.m_Player.PlacingCancelServer();
323 
325  InventoryLocation destination = new InventoryLocation;
326 
327  if ( action_data.m_MainItem.GetInventory().GetCurrentInventoryLocation( source ) )
328  {
329  destination.SetHands( action_data.m_Player, action_data.m_MainItem );
330  action_data.m_Player.GetDayZPlayerInventory().RedirectToHandEvent(InventoryMode.LOCAL, source, destination);
331  }
332  }
333 
334  GetGame().ClearJuncture( action_data.m_Player, action_data.m_MainItem );
335  }
336  else
337  {
338  //TODO: make OnEND placement event and move there
339 
340  action_data.m_MainItem.SetIsDeploySound( false );
341  action_data.m_MainItem.SetIsPlaceSound( false );
342  action_data.m_MainItem.SoundSynchRemoteReset();
343 
344  if ( action_data.m_MainItem.IsBasebuildingKit() )
345  {
346  action_data.m_MainItem.Delete();
347  }
348  else
349  {
350  GetGame().ClearJuncture( action_data.m_Player, action_data.m_MainItem );
351  }
352  }
353  }
354 
355  override void OnStartAnimationLoop( ActionData action_data )
356  {
357  if ( GetGame().IsClient() || !GetGame().IsMultiplayer() )
358  {
359  if ( action_data.m_Player.GetItemInHands() )
361  }
362  }
363 
364  override void OnExecuteServer( ActionData action_data )
365  {
366  action_data.m_MainItem.SoundSynchRemote();
367  }
368 
369  override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
370  {
371  super.WriteToContext(ctx, action_data);
372 
373  PlaceObjectActionData poActionData;
374  poActionData = PlaceObjectActionData.Cast(action_data);
375 
376  ctx.Write( poActionData.m_Position );
377  ctx.Write( poActionData.m_Orientation );
378  }
379 
380  override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data )
381  {
382  if(!action_recive_data)
383  {
384  action_recive_data = new PlaceObjectActionReciveData;
385  }
386  super.ReadFromContext(ctx, action_recive_data );
387  PlaceObjectActionReciveData action_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
388 
389  vector entity_position = "0 0 0";
390  vector entity_orientation = "0 0 0";
391  if (!ctx.Read(entity_position))
392  return false;
393  if (!ctx.Read(entity_orientation))
394  return false;
395 
396  action_data_po.m_Position = entity_position;
397  action_data_po.m_Orientation = entity_orientation;
398 
399  return true;
400  }
401 
402  override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
403  {
404  super.HandleReciveData(action_recive_data, action_data);
405 
406  PlaceObjectActionReciveData recive_data_po = PlaceObjectActionReciveData.Cast(action_recive_data);
407  PlaceObjectActionData action_data_po = PlaceObjectActionData.Cast(action_data);
408 
409  action_data_po.m_Position = recive_data_po.m_Position;
410  action_data_po.m_Orientation = recive_data_po.m_Orientation;
411  }
412 
413  void MoveEntityToFinalPosition( ActionData action_data, vector position, vector orientation )
414  {
415  if ( action_data.m_MainItem.IsBasebuildingKit() ) return;
416 
417  EntityAI entity_for_placing = action_data.m_MainItem;
418  vector rotation_matrix[3];
419  float direction[4];
421  InventoryLocation destination = new InventoryLocation;
422 
423  Math3D.YawPitchRollMatrix( orientation, rotation_matrix );
424  Math3D.MatrixToQuat( rotation_matrix, direction );
425 
426  if ( entity_for_placing.GetInventory().GetCurrentInventoryLocation( source ) )
427  {
428  destination.SetGroundEx( entity_for_placing, position, direction );
429 
430  if ( GetGame().IsMultiplayer() )
431  {
432  action_data.m_Player.ServerTakeToDst(source, destination);
433  }
434  //local singleplayer
435  else
436  {
437  MoveEntityToFinalPositionSinglePlayer(action_data, source, destination);
438  }
439  }
440  }
441 
443  {
444  action_data.m_Player.GetInventory().TakeToDst(InventoryMode.LOCAL, source, destination);
445  }
446 
448  {
449  if ( item.IsDeployable() )
450  {
451  if ( item.IsHeavyBehaviour() )
452  {
453  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_HEAVY;
454  }
455  else if ( item.IsOneHandedBehaviour() )
456  {
457  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_1HD;
458  }
459  else if ( item.IsTwoHandedBehaviour() )
460  {
461  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_DEPLOY_2HD;
462  }
463  else
464  {
465  Print("Error: check " + item + " behaviour");
466  }
467  }
468  else
469  {
470  if ( item.IsHeavyBehaviour() )
471  {
472  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_HEAVY;
473  }
474  else if ( item.IsOneHandedBehaviour() )
475  {
476  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_1HD;
477  }
478  else if ( item.IsTwoHandedBehaviour() )
479  {
480  m_CommandUID = DayZPlayerConstants.CMD_ACTIONFB_PLACING_2HD;
481  }
482  else
483  {
484  Print("Error: check " + item + " behaviour");
485  }
486  }
487  }
488 };
ItemBase
Definition: InventoryItem.c:445
ActionDeployObject::HasTarget
override bool HasTarget()
Definition: ActionDeployObject.c:76
ActionDeployObject::HasAlternativeInterrupt
override bool HasAlternativeInterrupt()
Definition: ActionDeployObject.c:86
GetGame
proto native CGame GetGame()
CGame::ClearJuncture
proto native bool ClearJuncture(Man player, notnull EntityAI item)
ActionDeployObject::WriteToContext
override void WriteToContext(ParamsWriteContext ctx, ActionData action_data)
Definition: ActionDeployObject.c:369
ActionData::m_ActionComponent
ref CABase m_ActionComponent
Definition: ActionBase.c:28
PlaceObjectActionReciveData::m_Position
vector m_Position
Definition: ActionDeployObject.c:3
m_ConditionTarget
ref CCTBase m_ConditionTarget
Definition: ActionBase.c:53
ActionDeployObject::GetText
override string GetText()
Definition: ActionDeployObject.c:91
Param
Base Param Class with no parameters.
Definition: param.c:11
CAContinuousTime
Definition: CAContinuousTime.c:1
m_AlreadyPlaced
bool m_AlreadyPlaced
Definition: ActionDeployObject.c:11
ActionDeployObject::OnEndServer
override void OnEndServer(ActionData action_data)
Definition: ActionDeployObject.c:299
AnimatedActionBase::m_CommandUID
protected int m_CommandUID
Definition: AnimatedActionBase.c:125
ActionDeployObject::ActionConditionContinue
override bool ActionConditionContinue(ActionData action_data)
Definition: ActionDeployObject.c:121
vector::DistanceSq
static proto native float DistanceSq(vector v1, vector v2)
Returns the squere distance between tips of two 3D vectors.
ActionDeployObject::OnFinishProgressClient
override void OnFinishProgressClient(ActionData action_data)
Definition: ActionDeployObject.c:236
UASoftSkillsWeight
Definition: ActionConstants.c:106
m_StanceMask
int m_StanceMask
Definition: SmptAnimMeta.c:78
ActionData::m_Player
PlayerBase m_Player
Definition: ActionBase.c:31
CCINone
Definition: CCINone.c:1
Math3D::MatrixToQuat
static proto void MatrixToQuat(vector mat[3], out float d[4])
Converts rotation matrix to quaternion.
Print
proto void Print(void var)
Prints content of variable to console/log.
ActionDeployObject::HasProgress
override bool HasProgress()
Definition: ActionDeployObject.c:81
ItemBase::IsBasebuildingKit
override bool IsBasebuildingKit()
Definition: KitBase.c:21
InventoryMode
InventoryMode
Definition: Inventory.c:19
ActionDeployObject::CreateActionData
override ActionData CreateActionData()
Definition: ActionDeployObject.c:156
InventoryLocation
InventoryLocation.
Definition: InventoryLocation.c:27
CCTNone
Definition: CCTNone.c:1
Hologram
Definition: Hologram.c:1
ActionDeployObject::CreateConditionComponents
override void CreateConditionComponents()
Definition: ActionDeployObject.c:70
ItemBase::IsDeployable
override bool IsDeployable()
Definition: BaseBuildingBase.c:315
ActionDeployObject::HandleReciveData
override void HandleReciveData(ActionReciveData action_recive_data, ActionData action_data)
Definition: ActionDeployObject.c:402
ActionDeployObject::OnExecuteServer
override void OnExecuteServer(ActionData action_data)
Definition: ActionDeployObject.c:364
m_SpecialtyWeight
protected float m_SpecialtyWeight
Definition: ActionBase.c:63
UATimeSpent::DEFAULT_DEPLOY
const float DEFAULT_DEPLOY
Definition: ActionConstants.c:36
AnimatedActionBase::m_CallbackClass
protected m_CallbackClass
Definition: AnimatedActionBase.c:127
UAMaxDistances
Definition: ActionConstants.c:95
ActionData::m_MainItem
ItemBase m_MainItem
Definition: ActionBase.c:26
UAMaxDistances::DEFAULT
const float DEFAULT
Definition: ActionConstants.c:98
ActionDeployObject::MoveEntityToFinalPositionSinglePlayer
void MoveEntityToFinalPositionSinglePlayer(ActionData action_data, InventoryLocation source, InventoryLocation destination)
Definition: ActionDeployObject.c:442
Serializer::Write
proto bool Write(void value_out)
ActionDeployObject::OnFinishProgressServer
override void OnFinishProgressServer(ActionData action_data)
Definition: ActionDeployObject.c:252
Serializer
Serialization general interface.
Definition: Serializer.c:55
m_Orientation
vector m_Orientation
Definition: ActionDeployObject.c:10
ActionDeployObject::OnEndClient
override void OnEndClient(ActionData action_data)
Definition: ActionDeployObject.c:286
ActionDeployObject
Definition: ActionDeployObject.c:59
PlayerBase
Definition: PlayerBaseClient.c:1
ActionDeployObject::OnStartAnimationLoop
override void OnStartAnimationLoop(ActionData action_data)
Definition: ActionDeployObject.c:355
CGame::AddActionJuncture
proto native bool AddActionJuncture(Man player, notnull EntityAI item, int timeout_ms)
vector
Definition: EnConvert.c:95
ActionDeployObject::SetupAnimation
void SetupAnimation(ItemBase item)
Definition: ActionDeployObject.c:447
ActionData
Definition: ActionBase.c:18
m_FullBody
protected bool m_FullBody
Definition: ActionBase.c:49
ItemBase::CanBePlaced
override bool CanBePlaced(Man player, vector position)
Definition: TentBase.c:996
DayZPlayerConstants
DayZPlayerConstants
defined in C++
Definition: dayzplayer.c:568
ActionBaseCB::m_ActionData
protected ActionData m_ActionData
Definition: AnimatedActionBase.c:3
ActiondeployObjectCB::CreateActionComponent
override void CreateActionComponent()
Definition: ActionDeployObject.c:16
UASoftSkillsWeight::PRECISE_LOW
const float PRECISE_LOW
Definition: ActionConstants.c:111
InventoryLocation::SetHands
proto native void SetHands(notnull EntityAI parent, EntityAI e)
ActionDeployObject::OnStartClient
override void OnStartClient(ActionData action_data)
Definition: ActionDeployObject.c:195
UATimeSpent
Definition: ActionConstants.c:25
ActionContinuousBaseCB
Definition: ActionContinuousBase.c:1
ActionDeployObject::SetupAction
override bool SetupAction(PlayerBase player, ActionTarget target, ItemBase item, out ActionData action_data, Param extra_data=NULL)
Definition: ActionDeployObject.c:162
ActionTarget
class ActionTargets ActionTarget
CGame::SurfaceY
proto native float SurfaceY(float x, float z)
ActionDeployObject::ActionCondition
override bool ActionCondition(PlayerBase player, ActionTarget target, ItemBase item)
Definition: ActionDeployObject.c:96
PlaceObjectActionReciveData
Definition: ActionDeployObject.c:1
InventoryLocation::SetGroundEx
proto native void SetGroundEx(EntityAI e, vector pos, float dir[4])
ActiondeployObjectCB::DropDuringPlacing
void DropDuringPlacing()
Definition: ActionDeployObject.c:21
ActionDeployObject::MoveEntityToFinalPosition
void MoveEntityToFinalPosition(ActionData action_data, vector position, vector orientation)
Definition: ActionDeployObject.c:413
m_ConditionItem
ref CCIBase m_ConditionItem
Definition: ActionBase.c:52
Serializer::Read
proto bool Read(void value_in)
ActionDeployObject::ReadFromContext
override bool ReadFromContext(ParamsReadContext ctx, out ActionReciveData action_recive_data)
Definition: ActionDeployObject.c:380
ActionContinuousBase
Definition: ActionContinuousBase.c:129
eBrokenLegs
eBrokenLegs
Definition: PlayerBase.c:3
PlaceObjectActionReciveData::m_Orientation
vector m_Orientation
Definition: ActionDeployObject.c:4
m_Position
PlaceObjectActionReciveData m_Position
ActionDeployObject::ActionDeployObject
void ActionDeployObject()
Definition: ActionDeployObject.c:61
ActiondeployObjectCB
Definition: ActionDeployObject.c:14
ActionDeployObject::OnStartServer
override void OnStartServer(ActionData action_data)
Definition: ActionDeployObject.c:206
EntityAI
Base native class of all vehicles in game.
Definition: Building.c:4
Math3D::YawPitchRollMatrix
static proto void YawPitchRollMatrix(vector ang, out vector mat[3])
Creates rotation matrix from angles.
ActionData::m_Callback
ActionBaseCB m_Callback
Definition: ActionBase.c:27
Math3D
Definition: EnMath3D.c:27