Dayz Explorer  1.24.157551 (v105080)
Dayz Code Explorer by Zeroy
sceneobject.c
Go to the documentation of this file.
2 {
3  static const int COLOR_OBJ_BBOX_NORMAL = 0x00000000;
4  static const int COLOR_OBJ_BBOX_SELECT = 0x1f007C00;
5 
6  protected EntityAI m_ObjectPtr;
7  protected Shape m_DebugShapeBBox;
8  protected string m_InitScript;
9  protected string m_ObjectName;
10  protected string m_ObjectNameOrigin;
11 
12  protected ref array<SceneObject> m_LinkedSceneObjects;
13  protected ref map<SceneObject, Shape> m_LinkedSceneObjectsShapes;
14 
15  ref array<int> m_LinkedSceneObjectsIndices;
16 
17  //========================================
18  // SceneObject
19  //========================================
20  SceneObject Init(string obj_name, vector pos)
21  {
22  if (obj_name != STRING_EMPTY)
23  {
24  m_ObjectNameOrigin = obj_name;
25 
26  bool is_ai = GetGame().IsKindOf(obj_name, "DZ_LightAI");
27 
28  PluginDeveloper module_dev = PluginDeveloper.Cast(GetPlugin(PluginDeveloper));
29  EntityAI e = module_dev.SpawnEntityOnGroundPos(PluginSceneManager.PLAYER, obj_name, 100, 0.0, pos);
30 
31  if (e != NULL)
32  {
33  if (e.IsInherited(ItemBase))
34  {
35  ItemBase item = ItemBase.Cast(e);
36  if (item.HasQuantity())
37  item.SetQuantity(item.GetQuantityMax());
38  }
39 
40  m_ObjectName = e.GetType();
41  LinkEntityAI(e);
42  }
43  else if (obj_name != "player")
44  {
45  return NULL;
46  }
47  }
48 
49  m_LinkedSceneObjects = new array<SceneObject>;
50  m_LinkedSceneObjectsShapes = new map<SceneObject, Shape>;
51  m_LinkedSceneObjectsIndices = new array<int>;
52 
53  return this;
54  }
55 
56  //----------------------------------------
57  // GetObject
58  //----------------------------------------
59  EntityAI GetObject()
60  {
61  return m_ObjectPtr;
62  }
63 
64  //----------------------------------------
65  // GetName
66  //----------------------------------------
67  string GetName()
68  {
69  return m_ObjectName;
70  }
71 
72  //----------------------------------------
73  // IsPlayer
74  //----------------------------------------
75  bool IsPlayer()
76  {
77  return false;
78  }
79 
80  //----------------------------------------
81  // GetInitScript
82  //----------------------------------------
83  string GetInitScript()
84  {
85  return m_InitScript;
86  }
87 
88  //----------------------------------------
89  // SetInitScript
90  //----------------------------------------
91  void SetInitScript(string init_script)
92  {
93  m_InitScript = init_script;
94  }
95 
96  //========================================
97  // EditorShapeUpdatePos
98  //========================================
99  void EditorShapeUpdatePos()
100  {
101  if (m_DebugShapeBBox != NULL)
102  {
103  vector mat[4];
104  GetObject().GetTransform(mat);
105 
106  if (m_DebugShapeBBox != NULL)
107  {
108  m_DebugShapeBBox.SetMatrix(mat);
109  }
110  }
111  }
112 
113  //========================================
114  // EditorShapeSetColor
115  //========================================
116  void EditorShapeSetColor(int color)
117  {
118  if (m_DebugShapeBBox)
119  {
120  m_DebugShapeBBox.SetColor(color);
121  }
122  }
123 
124  //========================================
125  // EditorShapeSelect
126  //========================================
127  void EditorShapeSelect()
128  {
129  EditorShapeSetColor(COLOR_OBJ_BBOX_SELECT);
130  }
131 
132  //========================================
133  // EditorShapeDeselect
134  //========================================
135  void EditorShapeDeselect()
136  {
137  EditorShapeSetColor(COLOR_OBJ_BBOX_NORMAL);
138  }
139 
140  //========================================
141  // GetSize
142  //========================================
143  vector GetSize()
144  {
145  vector size = Vector(1,1,1);
146  vector min_max[2];
147 
148  if (GetObject())
149  {
150  GetObject().GetCollisionBox(min_max);
151 
152  size[0] = min_max[1][0] - min_max[0][0];
153  size[2] = min_max[1][2] - min_max[0][2];
154  size[1] = min_max[1][1] - min_max[0][1];
155 
156  return size;
157  }
158  else
159  {
160  Print("Error: SceneObject "+ m_ObjectNameOrigin +" dont has game object.");
161  }
162 
163  return size;
164  }
165 
166  //========================================
167  // EditorShapeAdd
168  //========================================
169  void EditorShapeAdd()
170  {
171  if (m_DebugShapeBBox != NULL)
172  return;
173 
174  vector min = "0 0 0";
175  vector max = "0 0 0";
176 
177  vector size = GetSize();
178 
179  float width = size[0];
180  float height = size[1];
181  float length = size[2];
182 
183  float width_h = width*0.5;
184  float lenght_h = length*0.5;
185 
186  min[0] = -width_h;
187  min[1] = 0;
188  min[2] = -lenght_h;
189 
190  max[0] = width_h;
191  max[1] = height;
192  max[2] = lenght_h;
193 
194  //Log("EditorShapeAdd -> "+m_ObjectPtr.Ptr().GetType());
195 
196  m_DebugShapeBBox = Debug.DrawBox(min, max);
197  EditorShapeUpdatePos();
198  EditorShapeDeselect();
199  }
200 
201  //========================================
202  // EditorShapeRemove
203  //========================================
204  void EditorShapeRemove()
205  {
206  if (m_DebugShapeBBox != NULL)
207  {
208  m_DebugShapeBBox.Destroy();
209  m_DebugShapeBBox = NULL;
210  }
211  }
212 
213  //========================================
214  // EditorLineRemove
215  //========================================
216  void EditorLineRemove(SceneObject obj)
217  {
218  for (int i = 0; i < m_LinkedSceneObjectsShapes.Count(); i++)
219  {
220  if (m_LinkedSceneObjectsShapes.GetKey(i) == obj)
221  {
222  m_LinkedSceneObjectsShapes.GetElement(i).Destroy();
223  m_LinkedSceneObjectsShapes.Remove(obj);
224  break;
225  }
226  }
227  }
228 
229  //========================================
230  // EditorLineAdd
231  //========================================
232  void EditorLineAdd(SceneObject obj)
233  {
234  if (obj.GetObject() != NULL && GetObject() != NULL)
235  {
236  if (m_LinkedSceneObjectsShapes.Contains(obj))
237  {
238  EditorLineRemove(obj);
239  }
240 
241  vector pos1 = obj.GetSize();
242  pos1[0] = 0; pos1[1] = pos1[1] / 2; pos1[2] = 0;
243  pos1 = pos1 + obj.GetObject().GetPosition();
244 
245  vector pos2 = GetSize();
246  pos2[0] = 0; pos2[1] = pos2[1] / 2; pos2[2] = 0;
247  pos2 = pos2 + GetObject().GetPosition();
248 
249  m_LinkedSceneObjectsShapes.Insert(obj, Debug.DrawArrow(pos1, pos2));
250  }
251  }
252 
253  //========================================
254  // LinkEntityAI
255  //========================================
256  void LinkEntityAI(EntityAI e)
257  {
258  m_ObjectPtr = e;
259  }
260 
261  //========================================
262  // IsLinkedWithSceneObject
263  //========================================
264  bool IsLinkedWithSceneObject(SceneObject scene_object)
265  {
266  int index = m_LinkedSceneObjects.Find(scene_object);
267  if (index >= 0)
268  {
269  return true;
270  }
271  else
272  {
273  return false;
274  }
275  }
276 
277  //========================================
278  // LinkEntityAI
279  //========================================
280  void LinkSceneObject(SceneObject scene_object, bool draw_line = true)
281  {
282  if (!IsLinkedWithSceneObject(scene_object))
283  {
284  if (draw_line)
285  {
286  EditorLineAdd(scene_object);
287  }
288  m_LinkedSceneObjects.Insert(scene_object);
289  }
290  }
291 
292  //========================================
293  // UnlinkSceneObject
294  //========================================
295  void UnlinkSceneObject(SceneObject scene_object)
296  {
297  int index = m_LinkedSceneObjects.Find(scene_object);
298  if (index >= 0 && index < m_LinkedSceneObjects.Count())
299  {
300  EditorLineRemove(scene_object);
301  m_LinkedSceneObjects.Remove(index);
302  }
303  }
304 
305  //========================================
306  // UnlinkAll
307  //========================================
308  void UnlinkAll()
309  {
310  int link_count = GetLinkedSceneObjectsCount();
311 
312  if (link_count > 0)
313  {
314  for (int i = 0; i < link_count; ++i)
315  {
316  PluginSceneManager.GetInstance().UnlinkSceneObjects(this, GetLinkedSceneObject(0));
317  }
318  }
319  }
320 
321  //========================================
322  // GetLinkedSceneObjects
323  //========================================
324  array<SceneObject> GetLinkedSceneObjects()
325  {
326  return m_LinkedSceneObjects;
327  }
328 
329  //========================================
330  // GetLinkedSceneObjectsCount
331  //========================================
332  int GetLinkedSceneObjectsCount()
333  {
334  return m_LinkedSceneObjects.Count();
335  }
336 
337  //========================================
338  // GetLinkedSceneObject
339  //========================================
340  SceneObject GetLinkedSceneObject(int i)
341  {
342  return m_LinkedSceneObjects.Get(i);
343  }
344 
345  //========================================
346  // GetLinkedObject
347  //========================================
348  EntityAI GetLinkedObject(int i)
349  {
350  return GetLinkedSceneObject(i).GetObject();
351  }
352 
353  //========================================
354  // Destructor
355  //========================================
356  void ~SceneObject()
357  {
358  if (m_ObjectPtr && m_ObjectPtr != GetGame().GetPlayer())
359  {
360  GetGame().ObjectDelete(m_ObjectPtr);
361  m_ObjectPtr = NULL;
362  }
363 
364  for (int i = 0; i < m_LinkedSceneObjects.Count(); i++)
365  {
366  EditorLineRemove(m_LinkedSceneObjects.Get(i));
367  }
368 
369  EditorShapeRemove();
370  }
371 
372  //========================================
373  // GetTypeName
374  //========================================
375  string GetTypeName()
376  {
377  return m_ObjectPtr.GetType();
378  }
379 
380  //========================================
381  // PlaceOnSurface
382  //========================================
383  void PlaceOnSurface()
384  {
385  if (m_ObjectPtr)
386  {
387  if (GetGame().IsClient() && GetGame().IsMultiplayer())
388  {
389  Param par = new Param3<string, EntityAI, Param>("PlaceOnSurface" , m_ObjectPtr, NULL);
390  SceneObjectSynch(par);
391  }
392  else
393  {
394  m_ObjectPtr.PlaceOnSurface();
395  }
396  }
397  }
398 
399  //========================================
400  // SetPosition
401  //========================================
402  void SetPosition(vector pos)
403  {
404  if (m_ObjectPtr)
405  {
406  if (GetGame().IsClient() && GetGame().IsMultiplayer())
407  {
408  Param par = new Param3<string, EntityAI, Param>("SetPosition" , m_ObjectPtr, new Param1<vector>(pos));
409  SceneObjectSynch(par);
410  }
411  else
412  {
413  m_ObjectPtr.SetPosition(pos);
414  }
415  }
416  PlaceOnSurface();
417  EditorShapeUpdatePos();
418  }
419 
420  //========================================
421  // GetPosition
422  //========================================
423  vector GetPosition()
424  {
425  if (m_ObjectPtr)
426  return m_ObjectPtr.GetPosition();
427  return Vector(0,0,0);
428  }
429 
430  //========================================
431  // GetHealth
432  //========================================
433  float GetHealth()
434  {
435  if (m_ObjectPtr)
436  return m_ObjectPtr.GetHealth("", "");
437  return 0;
438  }
439 
440  //========================================
441  // GetHealth
442  //========================================
443  float GetMaxHealth()
444  {
445  if (m_ObjectPtr)
446  return m_ObjectPtr.GetMaxHealth("", "");
447  return 0;
448  }
449 
450  //========================================
451  // SetHealth
452  //========================================
453  void SetHealth(float value)
454  {
455  if (m_ObjectPtr)
456  {
457  if (GetGame().IsClient() && GetGame().IsMultiplayer())
458  {
459  Param par = new Param3<string, EntityAI, Param>("SetHealth" , m_ObjectPtr, new Param1<float>(value));
460  SceneObjectSynch(par);
461  }
462  else
463  {
464  m_ObjectPtr.SetHealth("", "", value);
465  }
466  }
467  }
468 
469  //========================================
470  // GetPositionAsString
471  //========================================
472  string GetPositionAsString()
473  {
474  if (m_ObjectPtr)
475  return m_ObjectPtr.GetPosition().ToString(false);
476  return Vector(0,0,0).ToString(false);
477  }
478 
479  //========================================
480  // SetPositionAsString
481  //========================================
482  void SetPositionAsString(string string_pos)
483  {
484  SetPosition(string_pos.ToVector());
485  }
486 
487  //========================================
488  // GetRotation
489  //========================================
490  float GetRotation()
491  {
492  if (m_ObjectPtr)
493  {
494  vector v = m_ObjectPtr.GetOrientation();
495  return v[0];
496  }
497 
498  return 0;
499  }
500 
501  //========================================
502  // SetRotation
503  //========================================
504  void SetRotation(float rot)
505  {
506  if (m_ObjectPtr)
507  {
508  vector v = m_ObjectPtr.GetOrientation();
509  v[0] = rot;
510  m_ObjectPtr.SetOrientation(v);
511  EditorShapeUpdatePos();
512  }
513  }
514 
515  void SceneObjectSynch(Param p)
516  {
517  GetGame().RPCSingleParam(GetGame().GetPlayer(), ERPCs.RPC_SYNC_SCENE_OBJECT, p, true, NULL);
518  }
519 
520  //========================================
521  // AddRotation
522  //========================================
523  void AddRotation(float add_rot)
524  {
525  if (m_ObjectPtr)
526  {
527  if (GetGame().IsClient() && GetGame().IsMultiplayer())
528  {
529  Param par = new Param3<string, EntityAI, Param>("AddRotation" , m_ObjectPtr, new Param1<float>(add_rot));
530  SceneObjectSynch(par);
531  }
532  else
533  {
534  vector v = m_ObjectPtr.GetOrientation();
535  v[0] = v[0] + add_rot;
536  m_ObjectPtr.SetOrientation(v);
537 
538  EditorShapeUpdatePos();
539  }
540  }
541  }
542 
543  //========================================
544  // AddRotation
545  //========================================
546  void AddAttachment(string att_name)
547  {
548  GetObject().GetInventory().CreateAttachment(att_name);
549  }
550 
551  //========================================
552  // CanAttachment
553  //========================================
554  bool CanAttachment(EntityAI e)
555  {
556  return GetObject().GetInventory().CanAddAttachment(e);
557  }
558 
559  //========================================
560  // AddRotation
561  //========================================
562  void RemoveAttachment(EntityAI e)
563  {
564  GetGame().ObjectDelete(e);
565  }
566 
567  //========================================
568  // GetAttachments
569  //========================================
570  array<EntityAI> GetAttachments()
571  {
573 
574  for (int i = 0; i < GetObject().GetInventory().AttachmentCount(); ++i)
575  {
576  ret.Insert(GetObject().GetInventory().GetAttachmentFromIndex(i));
577  }
578 
579  return ret;
580  }
581 
582  //========================================
583  // GetConfigAttachments
584  //========================================
585  TStringArray GetConfigAttachments()
586  {
587  string type_name = GetTypeName();
588  TStringArray cfg_attachments = new TStringArray;
589 
590  string cfg_path;
591 
592  if (GetGame().ConfigIsExisting(CFG_VEHICLESPATH+" "+type_name))
593  {
594  cfg_path = CFG_VEHICLESPATH+" "+type_name+" attachments";
595  }
596  else if (GetGame().ConfigIsExisting(CFG_WEAPONSPATH+" "+type_name))
597  {
598  cfg_path = CFG_WEAPONSPATH+" "+type_name+" attachments";
599  }
600  else if (GetGame().ConfigIsExisting(CFG_MAGAZINESPATH+" "+type_name))
601  {
602  cfg_path = CFG_MAGAZINESPATH+" "+type_name+" attachments";
603  }
604 
605  GetGame().ConfigGetTextArray(cfg_path, cfg_attachments);
606 
607  return cfg_attachments;
608  }
609 }
ItemBase
Definition: inventoryitem.c:730
GetGame
proto native CGame GetGame()
STRING_EMPTY
const string STRING_EMPTY
Definition: constants.c:54
Param
Base Param Class with no parameters. Used as general purpose parameter overloaded with Param1 to Para...
Definition: param.c:11
TStringArray
array< string > TStringArray
Definition: enscript.c:685
Print
proto void Print(void var)
Prints content of variable to console/log.
SceneObject
Definition: sceneobject.c:1
Param3
Definition: entityai.c:95
GetPlugin
PluginBase GetPlugin(typename plugin_type)
Definition: pluginmanager.c:316
map
map
Definition: controlsxboxnew.c:3
vector
Definition: enconvert.c:105
CFG_VEHICLESPATH
const string CFG_VEHICLESPATH
Definition: constants.c:209
CFG_MAGAZINESPATH
const string CFG_MAGAZINESPATH
Definition: constants.c:211
CFG_WEAPONSPATH
const string CFG_WEAPONSPATH
Definition: constants.c:210
array< SceneObject >
GetPlayer
protected void GetPlayer()
Definition: crosshairselector.c:127
Debug
Definition: debug.c:13
ERPCs
ERPCs
Definition: erpcs.c:1
Vector
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
EntityAI
Definition: building.c:5
Shape
class DiagMenu Shape
don't call destructor directly. Use Destroy() instead