Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
MotionComponent.c
Go to the documentation of this file.
1// Script File
2
3[EntityEditorProps(category: "GameLib/Scripted/Autotest", description:"MotionAutoTest", dynamicBox: true)]
4class MotionAutoTestClass: GenericEntityClass
5{
6}
7
8class Measurement
9{
10 float m_Min = 100000000000;
11 float m_Max = 0;
13 float m_CurrentSum = 0;
14
15 void AddValue(float value)
16 {
17 if (value < m_Min)
18 {
19 m_Min = value;
20 }
21
22 if (value >= m_Max)
23 {
24 m_Max = value;
25 }
26
27 m_CurrentSum += value;
29 }
30
32 {
33 if (m_CountSamples <= 0)
34 return 0;
36 }
37}
38
39[EntityEditorProps(category: "GameLib/Scripted/Autotest", description:"MotionZonePoint", dynamicBox: true)]
40class MotionZonePointClass: GenericEntityClass
41{
42}
43
45{
46 void MotionZonePoint(IEntitySource src, IEntity parent)
47 {
49 SetFlags(EntityFlags.ACTIVE, true);
50
51 parent.AddChild(this, -1);
52 }
53}
54
55[EntityEditorProps(category: "GameLib/Scripted/Autotest", description:"MotionZone", dynamicBox: true)]
56class MotionZoneClass: GenericEntityClass
57{
58}
59
61{
64
66 {
68 SetFlags(EntityFlags.ACTIVE, true);
69
70 m_Min = Vector(0, 0, 0);
71 m_Max = Vector(0, 0, 0);
72 }
73
75 {
76 return m_Min;
77 }
78
80 {
81 return m_Max;
82 }
83
85 {
86 }
87
89 {
90 IEntity ent1st = MotionZonePoint.Cast(GetChildren());
91 IEntity ent2nd = ent1st.GetSibling();
92
93 vector p1 = ent1st.GetOrigin();
94 vector p2 = ent2nd.GetOrigin();
95
96 m_Min[0] = Math.Min(p1[0], p2[0]);
97 m_Min[1] = Math.Min(p1[1], p2[1]);
98 m_Min[2] = Math.Min(p1[2], p2[2]);
99
100 m_Max[0] = Math.Max(p1[0], p2[0]);
101 m_Max[1] = Math.Max(p1[1], p2[1]);
102 m_Max[2] = Math.Max(p1[2], p2[2]);
103 }
104
105 override void EOnInit(IEntity owner)
106 {
107 Initialize();
108 }
109}
110
111class MotionAutoTest: GenericEntity
112{
113 [Attribute("Camera1", UIWidgets.EditBox, "Name of camera entity", "")]
114 private string m_cameraEntityName; //< name of camera entity which will be used to take screenshots
115
116 [Attribute("60", UIWidgets.Slider, "Which FPS is considered as minimal", "0 240 1")]
117 private float m_FPSLimit; //< this time is waited for the screenshot to be captured and saved on disk
118
119 [Attribute("1.8", UIWidgets.Slider, "Distance between surface and camera on y-axis", "0 20 0.1")]
120 private float m_HeightAboveSurface;
121 [Attribute("5", UIWidgets.Slider, "Movement speed", "0 100 1")]
122 private float m_MovementSpeed;
123
124 [Attribute("true", UIWidgets.CheckBox, "If true a path is generated otherwise the path is created from child waypoints")]
125 private bool m_GeneratePath;
126 [Attribute("false", UIWidgets.CheckBox, "If true the generated path is drawn as a line - for debug purposes")]
127 private bool m_ShowGeneratePath;
128 [Attribute("0.15", UIWidgets.Slider, "The scale of the generated path that is centered in the map center", "0 1 0.01")]
129 private float m_GeneratedPathScale;
130 [Attribute("10", UIWidgets.Slider, "Number of sectors for the generated path", "1 100 1")]
131 private float m_GeneratedPathSectorsCount;
132
133 private IEntity m_camera;
134 private Screenshot_Waypoint m_waypoint;
135 private string m_directory;
136
137 private TextWidget m_FPSWidget;
138
139 private ref array<Shape> m_CreatedLines;
140
141 private float m_fTimeToTravel = -1;
142 private float m_fTimeTraveled = 0;
143
144 private int m_iCurrentPointsI;
145 private ref array<vector> m_Points;
146 protected float m_timeFromStart;
147 protected float m_timeLastStatsSnapshot;
148
149 private ref Measurement m_MeasureFPS;
150 private ref Measurement m_MeasureMemory;
151
152 private ref array<ref Measurement> m_MeasurementMemory;
153
154 [Attribute("MotionZone", UIWidgets.EditBox, "Motion Zone Object Name", "")]
155 private string m_MotionZone;
156
157 private MotionZone m_MotionZoneInstance;
158
159 void MotionAutoTest(IEntitySource src, IEntity parent)
160 {
162 SetFlags(EntityFlags.ACTIVE, true);
163 m_CreatedLines = new array<Shape>();
164 m_MeasureFPS = new Measurement();
165 m_MeasureMemory = new Measurement();
166 m_MeasurementMemory = new array<ref Measurement>();
167 int mc = MemoryStatsSnapshot.GetStatsCount();
168 for (int i = 0; i < mc; i++)
169 {
170 m_MeasurementMemory.Insert(new Measurement());
171 }
172
174
175 System.GetCLIParam("autotest-output-dir", m_directory);
176
177 if (m_directory.Length() == 0)
178 {
179 m_directory = "$logs:" + GetName();
180 }
181 }
182
183 void ~MotionAutoTest()
184 {
185
186 for (int i = 0; i < m_CreatedLines.Count(); i++)
187 {
188 Shape s = m_CreatedLines[i];
189 delete s;
190 }
191
192 delete m_CreatedLines;
193 delete m_Points;
194
195 }
196
197 void UpdateMeasurements()
198 {
199 int f = System.GetFPS();
200
201 m_MeasureFPS.AddValue(f);
202 m_MeasureMemory.AddValue(System.MemoryAllocationKB());
203
205 {
207
208 auto snapshot = new MemoryStatsSnapshot();
209 int count = snapshot.GetStatsCount();
210 for (int i = 0; i < count; i++)
211 {
212 int value = snapshot.GetStatValue(i);
213 m_MeasurementMemory[i].AddValue(value);
214 }
215 }
216 }
217
218 void CreateLines(array<vector> points, int color)
219 {
220 for (int i = 0; i < points.Count(); i++)
221 {
222 if (i + 1 < points.Count())
223 {
224 vector ppp[2];
225 ppp[0] = points[i];
226 ppp[1] = points[i + 1];
227
228 m_CreatedLines.Insert(Shape.CreateLines(color, ShapeFlags.VISIBLE, ppp, 2));
229 }
230 }
231 }
232
233 private void GeneratePathFromWaypoints()
234 {
235 m_Points = new array<vector>();
236 IEntity ee = GetChildren();
237
238 while (ee)
239 {
240 if (ee.GetSibling())
241 {
242 m_Points.Insert(ee.GetOrigin());
243 }
244 else
245 {
246 if (ee)
247 {
248 m_Points.Insert(ee.GetOrigin());
249 }
250 }
251
252 Print("??? -> " + ee.GetName());
253 ee = ee.GetSibling();
254 }
255 }
256
257 private void GeneratePath()
258 {
259 if (m_MotionZoneInstance)
260 {
261 Print("Bouding Area of motion zone |" + m_MotionZoneInstance.m_Min + "|" + m_MotionZoneInstance.m_Max);
262
263 Initialize(m_GeneratedPathScale, m_GeneratedPathSectorsCount, m_MotionZoneInstance.m_Min, m_MotionZoneInstance.m_Max);
264 }
265 else
266 {
267 vector mmin;
268 vector mmax;
269 GetWorld().GetBoundBox(mmin, mmax);
270
271 Print("World Bouding box |" + mmin + "|" + mmax);
272
273 Initialize(m_GeneratedPathScale, m_GeneratedPathSectorsCount, mmin, mmax);
274 }
275 }
276
277 override void EOnInit(IEntity owner)
278 {
279 m_camera = g_Game.FindEntity(m_cameraEntityName);
280
281 if (!m_camera)
282 {
283 Print("Camera not found 2!", LogLevel.ERROR);
284 }
285
286 m_MotionZoneInstance = MotionZone.Cast(g_Game.FindEntity(m_MotionZone));
287
288 if (m_MotionZoneInstance != null)
289 {
290 m_MotionZoneInstance.Initialize();
291 }
292
293
294 if (m_GeneratePath)
295 {
296 GeneratePath();
297 }
298 else
299 {
300 GeneratePathFromWaypoints();
301 }
302
303 TransformCameraToWaypoint();
304
305 m_FPSWidget = TextWidget.Cast(g_Game.GetWorkspace().CreateWidgetInWorkspace(WidgetType.TextWidgetTypeID, 16, 16, 512, 128, WidgetFlags.VISIBLE, new Color(0.0, 0.0, 0.0, 1.0), 1024));
306 m_FPSWidget.SetExactFontSize(64);
307 }
308
309 private void MakeSummeryFile(string filename)
310 {
311 FileHandle descrFile = FileIO.OpenFile(filename, FileMode.WRITE);
312
313 if(descrFile)
314 {
315 int sizeX = g_Game.GetWorkspace().GetWidth();
316 int sizeY = g_Game.GetWorkspace().GetHeight();
317 descrFile.WriteLine(string.Format("MOTION AUTO TEST"));
318 descrFile.WriteLine(string.Format("Resolution (px): %1x%2", sizeX, sizeY));
319#ifdef WORKBENCH
320 descrFile.WriteLine(string.Format("Entering playmode time (s): %1", g_Game.GetLoadTime() / 1000));
321#else
322 descrFile.WriteLine(string.Format("Load time (s): %1", g_Game.GetLoadTime() / 1000));
323#endif
324 descrFile.WriteLine(string.Format("Duration (s): %1", m_timeFromStart));
325
326 descrFile.WriteLine(string.Format("FPS average: %1", m_MeasureFPS.ComputeAverage()));
327 descrFile.WriteLine(string.Format("FPS min: %1", m_MeasureFPS.m_Min));
328 descrFile.WriteLine(string.Format("FPS max: %1", m_MeasureFPS.m_Max));
329
330 int count = MemoryStatsSnapshot.GetStatsCount();
331 for (int i = 0; i < count; i++)
332 {
333 string name = MemoryStatsSnapshot.GetStatName(i);
334 descrFile.WriteLine(string.Format("%1 average: %2", name, (int)m_MeasurementMemory[i].ComputeAverage()));
335 descrFile.WriteLine(string.Format("%1 min: %2", name, (int)m_MeasurementMemory[i].m_Min));
336 descrFile.WriteLine(string.Format("%1 max: %2", name, (int)m_MeasurementMemory[i].m_Max));
337 }
338
339 descrFile.WriteLine(string.Format("Timestamp: %1", GetCurrentTimestamp()));
340
341 descrFile.Close();
342 Print("Summary file successfully saved into " + filename);
343 }
344 }
345
346 private void MakeCSVFile(string filename)
347 {
348 FileHandle descrFile = FileIO.OpenFile(filename, FileMode.WRITE);
349
350 if (!descrFile)
351 return;
352
353 int sizeX = g_Game.GetWorkspace().GetWidth();
354 int sizeY = g_Game.GetWorkspace().GetHeight();
355
356 string CSVFormatString = "Resolution (px),Load time (s),Duration (s),FPS average (s),FPS min (s),FPS max (s)";
357 string CSVResultString = string.Format("%1x%2,%3,%4,%5,%6,%7", sizeX, sizeY, g_Game.GetLoadTime() * 0.001, m_timeFromStart, m_MeasureFPS.ComputeAverage(), m_MeasureFPS.m_Min, m_MeasureFPS.m_Max);
358
359 int count = MemoryStatsSnapshot.GetStatsCount();
360 for (int i = 0; i < count; i++)
361 {
362 CSVFormatString += string.Format(",%1 average,%1 min,%1 max", MemoryStatsSnapshot.GetStatName(i));
363 CSVResultString += string.Format(",%1,%2,%3", (int)m_MeasurementMemory[i].ComputeAverage(), (int)m_MeasurementMemory[i].m_Min, (int)m_MeasurementMemory[i].m_Max);
364 }
365
366 CSVFormatString += ",Timestamp";
367 CSVResultString += string.Format(",%1", GetCurrentTimestamp());
368
369 descrFile.WriteLine(CSVFormatString);
370 descrFile.WriteLine(CSVResultString);
371
372 descrFile.Close();
373 Print("CSV file successfully saved into " + filename);
374 }
375
376 private string GetCurrentTimestamp()
377 {
378 int year, month, day;
379 System.GetYearMonthDay(year, month, day);
380 return string.Format("%1-%2-%3", year.ToString(4), month.ToString(2), day.ToString(2));
381 }
382
383 override void EOnFrame(IEntity owner, float timeSlice)
384 {
385 g_Game.GetInputManager().ActivateContext("BlockInputContext");
386
387 //DO FPS
388 int fps = System.GetFPS();
389 m_FPSWidget.SetText("FPS " + fps);
390 if (fps < m_FPSLimit)
391 m_FPSWidget.SetColor(new Color(1.0, 0.0, 0.0, 1.0));
392 else
393 m_FPSWidget.SetColor(new Color(0.0, 1.0, 0.0, 1.0));
394
395 vector destination;
396 vector direction;
397
398 vector output[2];
399 UpdatePosition(timeSlice, output);
400
401 destination = output[0];
402 direction = output[1];
403
404 m_camera.SetYawPitchRoll(direction);
405
406 m_camera.SetOrigin(destination);
407
408 if (m_iCurrentPointsI > m_Points.Count())
409 {
410 FileIO.MakeDirectory(m_directory);
411 string summeryFilename = string.Format("%1/%2", m_directory, "summary.txt");
412 MakeSummeryFile(summeryFilename);
413 string csvFilename = string.Format("%1/%2", m_directory, "summary.csv");
414 MakeCSVFile(csvFilename);
415 Print("Autotest Finished; result in " + m_directory);
417 }
418
419 UpdateMeasurements();
420
421 m_timeFromStart += timeSlice;
422 }
423
424 float dCc = 0;
425 float prevQuatCc[4];
426 float currentQuatCc[4];
427 bool onceOnly = false;
428
429 private void UpdatePosition(float timeSlice, vector output[2])
430 {
431 UpdateState();
432
433 float quat[4];
434 vector pos = ComputePosition();
435 vector orientation = ComputeOrientation(quat);
436
437 output[0] = pos;
438 output[1] = orientation;
439
440 if (onceOnly == false)
441 {
442 onceOnly = true;
443 Math3D.QuatCopy(quat, prevQuatCc);
444 Math3D.QuatCopy(quat, currentQuatCc);
445 }
446
447 UpdateTime(timeSlice);
448
449 //handle camera rotation based on terrain inclination
450 vector posNext = ComputePosition();
451
452 vector dir = posNext - pos;
453 float d = dir.NormalizeSize();
454
455 vector mat[4];
456 Math3D.DirectionAndUpMatrix(dir, vector.Up, mat);
457
458 float quat2[4];
459 Math3D.MatrixToQuat(mat, quat2);
460
461 if (CompareQuat(currentQuatCc, quat2) == false)
462 {
463 float outQuat2[4];
464 Math3D.QuatLerp(outQuat2, prevQuatCc, currentQuatCc, dCc);
465
466 dCc = 0;
467 Math3D.QuatCopy(outQuat2, prevQuatCc);
468 Math3D.QuatCopy(quat2, currentQuatCc);
469 }
470
471 float outQuat[4];
472 Math3D.QuatLerp(outQuat, prevQuatCc, currentQuatCc, dCc);
473
474 output[1] = Math3D.QuatToAngles(outQuat);
475
476 dCc += 0.75 * timeSlice;
477
478 Math.Clamp(dCc, 0, 1);
479 }
480
481 //returns true if q1 "equals" q2
482 private bool CompareQuat(float q1[4], float q2[4])
483 {
484 if (
485 Math.AbsFloat(q1[0] - q2[0]) < 0.0001 &&
486 Math.AbsFloat(q1[1] - q2[1]) < 0.0001 &&
487 Math.AbsFloat(q1[2] - q2[2]) < 0.0001 &&
488 Math.AbsFloat(q1[3] - q2[3]) < 0.0001
489 )
490 {
491 return true;
492 }
493
494 return false;
495 }
496
497 private void UpdateState()
498 {
499 if (m_fTimeToTravel >= 0 && m_fTimeTraveled > m_fTimeToTravel)
500 {
501 m_iCurrentPointsI++;
502 }
503
504 if (m_iCurrentPointsI + 1 >= m_Points.Count())
505 {
506 return;
507 }
508
509 if (m_fTimeToTravel < 0 || m_fTimeTraveled >= m_fTimeToTravel)
510 {
511 vector start = m_Points[m_iCurrentPointsI];
512 vector end = m_Points[m_iCurrentPointsI + 1];
513
514 float distance = (end - start).Length();
515
516 m_fTimeToTravel = distance / m_MovementSpeed;
517 m_fTimeTraveled = 0;
518 //Print("??? CHECKPOINT " + m_iCurrentPointsI + "/" + m_Points.Count());
519 }
520 }
521
522 private void UpdateTime(float timeDelta)
523 {
524 m_fTimeTraveled += timeDelta;
525 }
526
527 private vector ComputePosition()
528 {
529 if (m_iCurrentPointsI + 1 >= m_Points.Count())
530 {
531 //Print("!!! CHECKPOINT " + m_iCurrentPointsI + "/" + m_Points.Count());
532 return m_Points[m_Points.Count() - 1];
533 }
534
535 vector start = m_Points[m_iCurrentPointsI];
536 vector end = m_Points[m_iCurrentPointsI + 1];
537
538 vector dir = (end - start);
539 float t = m_fTimeTraveled / m_fTimeToTravel;
540
541 vector ret = start + t * dir;
542 ret[1] = GetYDistance(ret[0], ret[2]) + m_HeightAboveSurface;
543
544 return ret;
545 }
546
547 private vector ComputeOrientation(out float quatOrientationOut[4])
548 {
549 vector start;
550 vector end;
551
552 if (m_iCurrentPointsI + 1 >= m_Points.Count())
553 {
554 start = m_Points[m_Points.Count() - 2];
555 end = m_Points[m_Points.Count() - 1];
556 }
557 else
558 {
559 start = m_Points[m_iCurrentPointsI];
560 end = m_Points[m_iCurrentPointsI + 1];
561 }
562
563 vector dir = (end - start);
564 float t = m_fTimeTraveled / m_fTimeToTravel;
565 vector currentPosition = start + t * dir;
566
567 float d = dir.NormalizeSize();
568 vector mat[4];
569 Math3D.DirectionAndUpMatrix(dir, vector.Up, mat);
570
571 float quat[4];
572 Math3D.MatrixToQuat(mat, quat);
573 quatOrientationOut = quat;
574
575 vector retDirAngles = Math3D.QuatToAngles(quat);
576
577 float dCurrent = (end - currentPosition).Length();
578
579 if (dCurrent < 0.1 * d && m_iCurrentPointsI < m_Points.Count() && m_iCurrentPointsI +2 < m_Points.Count())
580 {
581 start = m_Points[m_iCurrentPointsI + 1];
582 end = m_Points[m_iCurrentPointsI + 2];
583
584 dir = (end - start);
585 dir.Normalize();
586
587 Math3D.DirectionAndUpMatrix(dir, vector.Up, mat);
588
589 float quat2[4];
590 Math3D.MatrixToQuat(mat, quat2);
591 quatOrientationOut = quat2;
592
593 float ttt = (dCurrent / (0.1 * d));
594
595 float outQuat[4];
596 Math3D.QuatLerp(outQuat, quat, quat2, 1 - ttt);
597
598 retDirAngles = Math3D.QuatToAngles(outQuat);
599 }
600
601 return retDirAngles;
602 }
603
604 private string QuatToString(float q[4])
605 {
606 return "(" + q[0] + "," + q[1] + "," + q[2] + "," + q[3] + ")";
607 }
608
609 private void Initialize(float scale, int sectorCount, vector rectangleMin, vector rectangleMax)
610 {
611 m_Points = new array<vector>();
612
613 float xx = scale * rectangleMax[0] - rectangleMin[0];
614 float zz = scale * rectangleMax[2] - rectangleMin[2];
615
616 float shiftx = 0.5 * ((rectangleMax[0] - rectangleMin[0]) - xx);
617 float shiftz = 0.5 * ((rectangleMax[2] - rectangleMin[2]) - zz);
618
619 float zstep = zz;
620 if (sectorCount > 1)
621 {
622 zstep = zz / (sectorCount - 1);
623 }
624
625 for (int i = 0; i < sectorCount; i++)
626 {
627 float z = i * zstep;
628 if ((i % 2) == 0)
629 {
630 vector v = Vector(shiftx, 0, shiftz) + Vector(rectangleMin[0], 0.0, rectangleMin[2] + z);
631 v[1] = GetYDistance(v[0], v[2]) + m_HeightAboveSurface;
632 m_Points.Insert(v);
633
634 v = Vector(shiftx, 0, shiftz) + Vector(rectangleMin[0] + xx, 0.0, rectangleMin[2] + z);
635 v[1] = GetYDistance(v[0], v[2]) + m_HeightAboveSurface;
636 m_Points.Insert(v);
637 }
638 else
639 {
640 vector v = Vector(shiftx, 0, shiftz) + Vector(rectangleMin[0] + xx, 0.0, rectangleMin[2] + z);
641 v[1] = GetYDistance(v[0], v[2]) + m_HeightAboveSurface;
642 m_Points.Insert(v);
643
644 v = Vector(shiftx, 0, shiftz) + Vector(rectangleMin[0], 0.0, rectangleMin[2] + z);
645 v[1] = GetYDistance(v[0], v[2]) + m_HeightAboveSurface;
646 m_Points.Insert(v);
647 }
648 }
649
650 if (m_ShowGeneratePath == true)
651 {
652 CreateLines(m_Points, ARGB(255, 255, 255, 255));
653 }
654
655 m_iCurrentPointsI = 0;
656 }
657
658 private float GetYDistance(float x, float z)
659 {
660 float wy = GetWorld().GetSurfaceY(x, z);
661 float oh = 0;
662 if (GetWorld().IsOcean())
663 {
664 oh = GetWorld().GetOceanBaseHeight();
665 oh = Math.Ceil(Math.AbsFloat(oh));
666 }
667
668 float hh = wy;
669 if (oh > wy)
670 {
671 hh = oh;
672 }
673
674 return hh;
675 }
676
677 private void TransformCameraToWaypoint()
678 {
679 if (m_waypoint && m_camera)
680 {
681 vector mat[4];
682 m_waypoint.GetTransform(mat);
683 m_camera.SetTransform(mat);
684 m_waypoint.EOnEnter();
685 }
686 }
687}
vector scale
int m_CountSamples
float m_Max
void ~MotionZone()
void MotionZone(IEntitySource src, IEntity parent)
MotionZonePointClass GenericEntityClass MotionZonePoint(IEntitySource src, IEntity parent)
float m_CurrentSum
MotionAutoTestClass m_Min
float ComputeAverage()
vector GetMin()
vector GetMax()
void Initialize()
void AddValue(float value)
enum SCR_ECompassType EntityEditorProps(category:"GameScripted/Gadgets", description:"Compass", color:"0 0 255 255")
Prefab data class for compass component.
float distance
vector direction
void UpdatePosition()
Update light position.
void UpdateTime()
proto external void RequestClose()
Setting request flag for engine to exit the game.
proto external int GetLoadTime()
Returns load time in milliseconds for the lastly loaded world.
sealed InputManager GetInputManager()
Definition Game.c:14
proto external IEntity FindEntity(string name)
sealed WorkspaceWidget GetWorkspace()
Definition Game.c:16
void IEntity(IEntitySource src, IEntity parent)
protected script Constructor
proto external EntityEvent SetEventMask(EntityEvent e)
void EOnInit(IEntity owner)
proto external vector GetOrigin()
proto external int AddChild(notnull IEntity child, TNodeId pivot, EAddChildFlags flags=EAddChildFlags.AUTO_TRANSFORM)
Add Entity to hierarchy. Pivot is pivot index, or -1 for center of parent.
proto external IEntity GetChildren()
proto external BaseWorld GetWorld()
proto external EntityFlags SetFlags(EntityFlags flags, bool recursively=false)
proto external string GetName()
proto external IEntity GetSibling()
Definition Math.c:13
Handle to a running process.
Definition System.c:63
float m_timeLastStatsSnapshot
Instance of created debug visualizer.
Definition Shape.c:14
Definition float.c:13
Game g_Game
Game singleton instance.
Definition gameLib.c:13
proto void Print(void var, LogLevel level=LogLevel.NORMAL)
Prints content of variable to console/log.
LogLevel
Enum with severity of the logging message.
Definition LogLevel.c:14
ShapeFlags
Definition ShapeFlags.c:13
SCR_FieldOfViewSettings Attribute
EntityEvent
Various entity events.
Definition EntityEvent.c:14
EntityFlags
Various entity flags.
Definition EntityFlags.c:14
FileMode
Mode for opening file. See FileSystem::Open.
Definition FileMode.c:14
proto native vector Vector(float x, float y, float z)
WidgetFlags
Widget flags. See enf::Widget::SetFlags().
Definition WidgetFlags.c:14
TypeID WidgetType
Definition EnWidgets.c:6
proto int ARGB(int a, int r, int g, int b)