2class PluginUndergroundTriggerManager :
PluginBase
4 private static PluginUndergroundTriggerManager
m_Instance;
6 private static const float RAYCAST_LENGTH = 1000.0;
7 private static const string DATETIME_FORMAT =
"%1%2%3T%4%5%6Z";
8 private static const float SORT_RESORT_THRESHOLD = 10.0;
9 private static const int MAX_DEBUG_DRAW_COUNT = 100;
10 private static const float MAX_DEBUG_DRAW_DISTANCE = 300.0;
12 private bool m_IsOpen;
14 private vector m_LastSortCameraPosition;
16 private bool m_BreadcrumbEditMode;
17 private int m_BreadcrumbEditOriginalCount;
18 private bool m_BreadcrumbsDirty;
19 private bool m_TriggersDirty;
21 private ref array<UndergroundTriggerHandle> m_TriggerHandles;
22 private ref array<UndergroundBreadcrumbHandle> m_BreadcrumbHandles;
24 private ref ArrayBoxDraw m_TriggerVisuals;
25 private ref BoxDraw m_TriggerVisualsSelected;
27 private ref ArrayBreadcrumbDraw m_BreadcrumbVisuals;
28 private ref BreadcrumbDraw m_BreadcrumbVisualsSelected;
30 private ref ScriptInvoker m_OnUpdateData;
32 private ref ScriptInvoker m_OnSelectTrigger;
33 private ref ScriptInvoker m_OnDeleteTrigger;
35 private ref ScriptInvoker m_OnSelectBreadcrumb;
36 private ref ScriptInvoker m_OnDeleteBreadcrumb;
38 private ref ScriptInvoker m_OnBreadcrumbEditModeChanged;
40 void PluginUndergroundTriggerManager()
48 static PluginUndergroundTriggerManager
GetInstance()
50 return PluginUndergroundTriggerManager.Cast(
GetPlugin(PluginUndergroundTriggerManager));
55 ScriptInvoker Event_OnUpdateData()
58 m_OnUpdateData =
new ScriptInvoker();
60 return m_OnUpdateData;
65 ScriptInvoker Event_OnSelectTrigger()
67 if (!m_OnSelectTrigger)
68 m_OnSelectTrigger =
new ScriptInvoker();
70 return m_OnSelectTrigger;
75 ScriptInvoker Event_OnDeleteTrigger()
77 if (!m_OnDeleteTrigger)
78 m_OnDeleteTrigger =
new ScriptInvoker();
80 return m_OnDeleteTrigger;
85 ScriptInvoker Event_OnSelectBreadcrumb()
87 if (!m_OnSelectBreadcrumb)
88 m_OnSelectBreadcrumb =
new ScriptInvoker();
90 return m_OnSelectBreadcrumb;
95 ScriptInvoker Event_OnDeleteBreadcrumb()
97 if (!m_OnDeleteBreadcrumb)
98 m_OnDeleteBreadcrumb =
new ScriptInvoker();
100 return m_OnDeleteBreadcrumb;
105 ScriptInvoker Event_OnBreadcrumbEditModeChanged()
107 if (!m_OnBreadcrumbEditModeChanged)
108 m_OnBreadcrumbEditModeChanged =
new ScriptInvoker();
110 return m_OnBreadcrumbEditModeChanged;
115 override void OnUpdate(
float delta_time)
119 vector cameraPos = FreeDebugCamera.GetInstance().GetPosition();
121 if (vector.Distance(cameraPos, m_LastSortCameraPosition) > SORT_RESORT_THRESHOLD)
123 m_LastSortCameraPosition = cameraPos;
125 if (m_TriggerVisuals.Count() > 1)
126 SortBoxDrawsByDistance(m_TriggerVisuals);
128 if (m_BreadcrumbVisuals.Count() > 1)
129 SortBreadcrumbDrawsByDistance(m_BreadcrumbVisuals);
132 UpdateTriggers(cameraPos);
133 UpdateBreadcrumbs(cameraPos);
137 private void UpdateTriggers(vector cameraPos)
139 int limit = Math.Min(m_TriggerVisuals.Count(), MAX_DEBUG_DRAW_COUNT);
140 bool selectedWasDrawn =
false;
142 for (
int i = 0; i < limit; ++i)
144 BoxDraw triggerVisual = m_TriggerVisuals.Get(i);
146 if (vector.Distance(cameraPos, triggerVisual.GetCenter()) > MAX_DEBUG_DRAW_DISTANCE)
149 if (triggerVisual == m_TriggerVisualsSelected)
150 selectedWasDrawn =
true;
152 triggerVisual.SetAllowTransform(triggerVisual == m_TriggerVisualsSelected && !m_BreadcrumbEditMode);
153 triggerVisual.Update();
156 if (m_TriggerVisualsSelected && !selectedWasDrawn)
158 m_TriggerVisualsSelected.SetAllowTransform(!m_BreadcrumbEditMode);
159 m_TriggerVisualsSelected.Update();
163 private void UpdateBreadcrumbs(vector cameraPos)
165 int limit = Math.Min(m_BreadcrumbVisuals.Count(), MAX_DEBUG_DRAW_COUNT);
166 bool selectedWasDrawn =
false;
168 for (
int i = 0; i < limit; ++i)
170 BreadcrumbDraw breadCrumbVisual = m_BreadcrumbVisuals.Get(i);
172 if (vector.Distance(cameraPos, breadCrumbVisual.GetCenter()) > MAX_DEBUG_DRAW_DISTANCE)
175 if (breadCrumbVisual == m_BreadcrumbVisualsSelected)
176 selectedWasDrawn =
true;
178 if (m_BreadcrumbEditMode)
179 breadCrumbVisual.SetAllowTransform(breadCrumbVisual == m_BreadcrumbVisualsSelected);
181 breadCrumbVisual.SetAllowTransform(
false);
182 breadCrumbVisual.Update();
185 if (m_BreadcrumbVisualsSelected && !selectedWasDrawn)
187 m_BreadcrumbVisualsSelected.SetAllowTransform(
true);
188 m_BreadcrumbVisualsSelected.Update();
196 m_TriggerHandles =
new array<UndergroundTriggerHandle>();
197 m_BreadcrumbHandles =
new array<UndergroundBreadcrumbHandle>();
198 m_TriggerVisuals =
new ArrayBoxDraw();
199 m_BreadcrumbVisuals =
new ArrayBreadcrumbDraw();
206 void OnMouseWheel(
int wheel)
208 if (!IsMouseInScene())
211 Event_OnUpdateData().Invoke();
216 void OnUIEditorOpened()
221 if (!DeveloperFreeCamera.IsFreeCameraEnabled())
222 DeveloperFreeCamera.EnableFreeCameraSceneEditor(PlayerBase.Cast(
g_Game.GetPlayer()));
224 DiagMenu.SetEngineValue(EDiagMenuGame.ENF_DIAG_GAME_FREECAM_NOCLIP,
true);
225 Event_OnUpdateData().Invoke();
230 void OnUIEditorClosed()
234 DeveloperFreeCamera.FreeCameraToggle(PlayerBase.Cast(
g_Game.GetPlayer()));
235 DiagMenu.SetEngineValue(EDiagMenuGame.ENF_DIAG_GAME_FREECAM_NOCLIP,
false);
236 Event_OnUpdateData().Invoke();
237 m_TriggerVisuals.Update();
238 m_BreadcrumbVisuals.Update();
245 if (!IsMouseInScene() || !m_IsOpen)
248 vector dir =
g_Game.GetPointerDirection();
249 vector from = FreeDebugCamera.GetInstance().GetPosition();
250 vector to = from + (dir * RAYCAST_LENGTH);
252 RaycastRVParams params =
new RaycastRVParams(from, to, null);
253 params.type = ObjIntersectGeom;
255 array<ref RaycastRVResult> results =
new array<ref RaycastRVResult>();
256 array<Object> excluded =
new array<Object>();
257 if (DayZPhysics.RaycastRVProxy(params, results, excluded))
259 if (results.Count() == 0)
262 UndergroundTriggerHandle triggerHandle;
263 UndergroundBreadcrumbHandle breadcrumbHandle;
264 if (Class.CastTo(triggerHandle, results[0].obj))
266 if (!m_BreadcrumbEditMode)
267 SelectTrigger(triggerHandle);
269 else if (Class.CastTo(breadcrumbHandle, results[0].obj))
271 if (m_BreadcrumbEditMode)
272 SelectBreadcrumb(breadcrumbHandle);
276 if (!m_BreadcrumbEditMode)
279 SelectBreadcrumb(null);
283 SelectBreadcrumb(null);
289 if (!m_BreadcrumbEditMode)
292 SelectBreadcrumb(null);
296 SelectBreadcrumb(null);
300 Event_OnUpdateData().Invoke();
305 void Event_OnDoubleClick()
307 if (!IsMouseInScene() || !m_IsOpen)
310 vector dir =
g_Game.GetPointerDirection();
311 vector from = FreeDebugCamera.GetInstance().GetPosition();
312 vector to = from + (dir * RAYCAST_LENGTH);
314 RaycastRVParams params =
new RaycastRVParams(from, to, null);
315 params.type = ObjIntersectGeom;
317 array<ref RaycastRVResult> results =
new array<ref RaycastRVResult>();
318 array<Object> excluded =
new array<Object>();
319 if (DayZPhysics.RaycastRVProxy(params, results, excluded))
321 if (m_BreadcrumbEditMode)
323 AddBreadcrumb(results[0].pos);
327 BoxDraw box =
new BoxDraw(results[0].pos);
328 m_TriggerVisuals.Insert(box);
329 UndergroundTriggerHandle handle = box.GetTriggerHandle();
330 handle.SetHandleName(
string.Format(
"trigger-%1",
g_Game.GetTime()));
331 box.Event_OnTransformChanged().Insert(MarkTriggersDirtyOnTransform);
332 m_TriggerHandles.Insert(handle);
335 SelectTrigger(handle);
339 Event_OnUpdateData().Invoke();
344 array<UndergroundTriggerHandle> GetTriggersList()
346 return m_TriggerHandles;
351 array<UndergroundBreadcrumbHandle> GetBreadcrumbsList()
353 return m_BreadcrumbHandles;
360 if (
g_Game.IsMultiplayer())
364 g_Game.GetUIManager().Back();
368 Event_OnUpdateData().Invoke();
381 bool IsBreadcrumbEditMode()
383 return m_BreadcrumbEditMode;
388 bool IsBreadcrumbsDirty()
390 return m_BreadcrumbsDirty;
395 bool IsTriggersDirty()
397 return m_TriggersDirty;
403 void MarkTriggersDirty()
408 m_TriggersDirty =
true;
409 Event_OnUpdateData().Invoke();
416 void MarkTriggersDirtyOnTransform(vector oldTransform[4], vector newTransform[4])
418 if (IsTransformUnchanged(oldTransform, newTransform))
428 void MarkBreadcrumbsDirtyOnTransform(vector oldTransform[4], vector newTransform[4])
430 if (IsTransformUnchanged(oldTransform, newTransform))
433 MarkBreadcrumbsDirty();
439 void MarkBreadcrumbsDirty()
441 if (!m_BreadcrumbEditMode || m_BreadcrumbsDirty)
444 m_BreadcrumbsDirty =
true;
445 Event_OnUpdateData().Invoke();
450 void EnterBreadcrumbEditMode()
452 UndergroundTriggerHandle triggerHandle = GetSelectedTrigger();
456 if (!triggerHandle.m_Data.Breadcrumbs)
457 triggerHandle.m_Data.Breadcrumbs =
new array<ref JsonUndergroundAreaBreadcrumb>();
459 m_BreadcrumbEditMode =
true;
460 m_BreadcrumbEditOriginalCount = triggerHandle.m_Data.Breadcrumbs.Count();
461 m_BreadcrumbsDirty =
false;
463 Event_OnBreadcrumbEditModeChanged().Invoke(
true);
464 Event_OnUpdateData().Invoke();
469 void SaveBreadcrumbs()
471 UndergroundTriggerHandle triggerHandle = GetSelectedTrigger();
472 if (!triggerHandle || !triggerHandle.m_Data.Breadcrumbs)
476 foreach (
int index, UndergroundBreadcrumbHandle breadcrumbHandle : m_BreadcrumbHandles)
478 if (index >= triggerHandle.m_Data.Breadcrumbs.Count())
481 vector pos = breadcrumbHandle.m_Reference.GetCenter();
482 JsonUndergroundAreaBreadcrumb breadcrumbData = triggerHandle.m_Data.Breadcrumbs[index];
484 breadcrumbData.Position.Insert(pos[0]);
485 breadcrumbData.Position.Insert(pos[1]);
486 breadcrumbData.Position.Insert(pos[2]);
488 breadcrumbData.EyeAccommodation = breadcrumbHandle.m_Data.EyeAccommodation;
489 breadcrumbData.Radius = breadcrumbHandle.m_Data.Radius;
490 breadcrumbData.LightLerp = breadcrumbHandle.m_Data.LightLerp;
491 breadcrumbData.UseRaycast = breadcrumbHandle.m_Data.UseRaycast;
495 m_BreadcrumbEditOriginalCount = triggerHandle.m_Data.Breadcrumbs.Count();
496 m_BreadcrumbsDirty =
false;
497 m_TriggersDirty =
true;
498 Event_OnUpdateData().Invoke();
503 void ExitBreadcrumbEditMode(
bool save)
505 UndergroundTriggerHandle triggerHandle = GetSelectedTrigger();
507 m_BreadcrumbEditMode =
false;
508 m_BreadcrumbsDirty =
false;
510 if (!save && triggerHandle && triggerHandle.m_Data.Breadcrumbs)
513 for (
int i = triggerHandle.m_Data.Breadcrumbs.Count() - 1; i >= m_BreadcrumbEditOriginalCount; i--)
514 triggerHandle.m_Data.Breadcrumbs.Remove(i);
517 SelectTrigger(triggerHandle);
520 if (m_BreadcrumbVisualsSelected)
522 m_BreadcrumbVisualsSelected.SetAllowTransform(
false);
523 m_BreadcrumbVisualsSelected = null;
526 Event_OnBreadcrumbEditModeChanged().Invoke(
false);
527 Event_OnUpdateData().Invoke();
532 void SelectTrigger(UndergroundTriggerHandle handle)
534 if (m_BreadcrumbEditMode)
537 if (m_TriggerVisualsSelected)
539 m_TriggerVisualsSelected.SetAllowTransform(
false);
540 m_TriggerVisualsSelected = null;
541 DeleteAllBreadcrumbs();
550 m_TriggerVisualsSelected = handle.m_Reference;
551 m_TriggerVisualsSelected.SetAllowTransform(
true);
552 m_TriggerVisualsSelected.Select();
554 Event_OnSelectTrigger().Invoke(handle);
555 Event_OnUpdateData().Invoke();
557 if (handle.m_Data.Breadcrumbs && handle.m_Data.Breadcrumbs.Count() > 0)
559 m_BreadcrumbVisuals =
new ArrayBreadcrumbDraw();
560 foreach (
int index, JsonUndergroundAreaBreadcrumb breadcrumbData : handle.m_Data.Breadcrumbs)
562 BreadcrumbDraw breadcrumb =
new BreadcrumbDraw(breadcrumbData.GetPosition());
563 UndergroundBreadcrumbHandle breadcrumbHandle = breadcrumb.GetBreadcrumbHandle();
565 handle.m_Reference.Event_OnTransformChanged().Insert(breadcrumbHandle.m_Reference.ApplyTransformation);
566 breadcrumb.Event_OnTransformChanged().Insert(MarkBreadcrumbsDirtyOnTransform);
568 breadcrumbHandle.m_ParentTrigger = handle;
569 if (!breadcrumbData.Comment)
571 breadcrumbHandle.SetHandleName(
string.Format(
"Breadcrumb #%1", index));
572 m_BreadcrumbHandles.Insert(breadcrumbHandle);
574 breadcrumbHandle.m_Data.EyeAccommodation = breadcrumbData.EyeAccommodation;
575 breadcrumbHandle.m_Data.Radius = breadcrumbData.Radius;
576 breadcrumbHandle.m_Data.LightLerp = breadcrumbData.LightLerp;
577 breadcrumbHandle.m_Data.UseRaycast = breadcrumbData.UseRaycast;
580 m_BreadcrumbVisuals.Insert(breadcrumb);
587 Event_OnSelectTrigger().Invoke(null);
588 Event_OnUpdateData().Invoke();
594 void SelectBreadcrumb(UndergroundBreadcrumbHandle handle)
596 if (m_BreadcrumbVisualsSelected)
598 m_BreadcrumbVisualsSelected.SetAllowTransform(
false);
599 m_BreadcrumbVisualsSelected = null;
608 m_BreadcrumbVisualsSelected = handle.m_Reference;
609 m_BreadcrumbVisualsSelected.SetAllowTransform(
true);
610 m_BreadcrumbVisualsSelected.Select();
612 Event_OnSelectBreadcrumb().Invoke(handle);
613 Event_OnUpdateData().Invoke();
618 Event_OnSelectBreadcrumb().Invoke(null);
619 Event_OnUpdateData().Invoke();
625 UndergroundTriggerHandle GetSelectedTrigger()
627 if (m_TriggerVisualsSelected)
628 return m_TriggerVisualsSelected.GetTriggerHandle();
635 UndergroundBreadcrumbHandle GetSelectedBreadcrumb()
637 if (m_BreadcrumbVisualsSelected)
638 return m_BreadcrumbVisualsSelected.GetBreadcrumbHandle();
647 UndergroundTriggerHandle triggerHandle = GetSelectedTrigger();
648 if (!triggerHandle || !triggerHandle.m_Data)
651 if (!triggerHandle.m_Data.Breadcrumbs)
652 triggerHandle.m_Data.Breadcrumbs =
new array<ref JsonUndergroundAreaBreadcrumb>();
655 JsonUndergroundAreaBreadcrumb breadcrumbData =
new JsonUndergroundAreaBreadcrumb();
657 breadcrumbData.Position.Insert(
position[0]);
658 breadcrumbData.Position.Insert(
position[1]);
659 breadcrumbData.Position.Insert(
position[2]);
660 triggerHandle.m_Data.Breadcrumbs.Insert(breadcrumbData);
663 BreadcrumbDraw breadcrumb =
new BreadcrumbDraw(
position);
664 UndergroundBreadcrumbHandle breadcrumbHandle = breadcrumb.GetBreadcrumbHandle();
666 triggerHandle.m_Reference.Event_OnTransformChanged().Insert(breadcrumbHandle.m_Reference.ApplyTransformation);
667 breadcrumb.Event_OnTransformChanged().Insert(MarkBreadcrumbsDirtyOnTransform);
669 breadcrumbHandle.m_ParentTrigger = triggerHandle;
670 breadcrumbHandle.SetHandleName(
string.Format(
"Breadcrumb #%1", m_BreadcrumbHandles.Count()));
672 m_BreadcrumbHandles.Insert(breadcrumbHandle);
673 m_BreadcrumbVisuals.Insert(breadcrumb);
675 m_BreadcrumbsDirty =
true;
677 SelectBreadcrumb(breadcrumbHandle);
678 Event_OnUpdateData().Invoke();
683 void DeleteBreadcrumb(UndergroundBreadcrumbHandle handle)
685 int index = m_BreadcrumbHandles.Find(handle);
690 UndergroundTriggerHandle triggerHandle = handle.m_ParentTrigger;
691 if (triggerHandle && index < triggerHandle.m_Data.Breadcrumbs.Count())
692 triggerHandle.m_Data.Breadcrumbs.Remove(index);
694 if (m_BreadcrumbVisualsSelected == handle.m_Reference)
696 m_BreadcrumbVisualsSelected.SetAllowTransform(
false);
697 m_BreadcrumbVisualsSelected = null;
700 m_BreadcrumbVisuals.RemoveItem(handle.m_Reference);
701 m_BreadcrumbHandles.Remove(index);
703 if (m_BreadcrumbEditMode)
704 m_BreadcrumbsDirty =
true;
706 Event_OnDeleteBreadcrumb().Invoke(handle);
707 Event_OnUpdateData().Invoke();
720 m_TriggerVisualsSelected = null;
722 m_TriggerVisuals.RemoveItem(handle.m_Reference);
723 m_TriggerHandles.RemoveItem(handle);
725 m_TriggersDirty =
true;
727 Event_OnDeleteTrigger().Invoke(handle);
728 DeleteAllBreadcrumbs();
729 Event_OnUpdateData().Invoke();
736 void DeleteAllTrigers()
738 int count = m_TriggerHandles.Count();
741 m_TriggerVisualsSelected = null;
743 m_TriggerVisuals.Clear();
744 m_TriggerHandles.Clear();
746 DeleteAllBreadcrumbs();
748 Event_OnUpdateData().Invoke();
754 void DeleteAllBreadcrumbs()
756 int count = m_BreadcrumbHandles.Count();
759 m_BreadcrumbVisualsSelected = null;
761 m_BreadcrumbHandles.Clear();
762 m_BreadcrumbVisuals.Clear();
764 Event_OnUpdateData().Invoke();
772 JsonUndergroundTriggers jsonData =
new JsonUndergroundTriggers();
773 jsonData.
Triggers =
new array<ref JsonUndergroundAreaTriggerData>();
775 foreach (UndergroundTriggerHandle triggerHandle : m_TriggerHandles)
777 vector size = triggerHandle.m_Reference.GetSize();
779 triggerHandle.m_Data.Size.Insert(size[0]);
780 triggerHandle.m_Data.Size.Insert(size[1]);
781 triggerHandle.m_Data.Size.Insert(size[2]);
783 vector center = triggerHandle.m_Reference.GetCenter();
785 triggerHandle.m_Data.Position.Insert(center[0]);
786 triggerHandle.m_Data.Position.Insert(center[1]);
787 triggerHandle.m_Data.Position.Insert(center[2]);
789 vector
orientation = triggerHandle.m_Reference.GetOrientation();
790 triggerHandle.m_Data.Orientation =
new TFloatArray();
791 triggerHandle.m_Data.Orientation.Insert(
orientation[0]);
792 triggerHandle.m_Data.Orientation.Insert(
orientation[1]);
793 triggerHandle.m_Data.Orientation.Insert(
orientation[2]);
795 foreach (
int index, UndergroundBreadcrumbHandle breadcrumbHandle : m_BreadcrumbHandles)
797 if (breadcrumbHandle.m_ParentTrigger && triggerHandle != breadcrumbHandle.m_ParentTrigger)
800 vector breadcrumbPosition = breadcrumbHandle.m_Reference.GetCenter();
801 breadcrumbHandle.m_Data.Position =
new TFloatArray();
802 breadcrumbHandle.m_Data.Position.Insert(breadcrumbPosition[0]);
803 breadcrumbHandle.m_Data.Position.Insert(breadcrumbPosition[1]);
804 breadcrumbHandle.m_Data.Position.Insert(breadcrumbPosition[2]);
806 JsonUndergroundAreaBreadcrumb originalBreadcrumb = JsonUndergroundAreaBreadcrumb.Cast(triggerHandle.m_Data.Breadcrumbs[index]);
807 originalBreadcrumb.Position = breadcrumbHandle.m_Data.Position;
808 originalBreadcrumb.EyeAccommodation = breadcrumbHandle.m_Data.EyeAccommodation;
809 originalBreadcrumb.Radius = breadcrumbHandle.m_Data.Radius;
810 originalBreadcrumb.LightLerp = breadcrumbHandle.m_Data.LightLerp;
811 originalBreadcrumb.UseRaycast = breadcrumbHandle.m_Data.UseRaycast;
814 JsonUndergroundAreaTriggerData triggerData =
new JsonUndergroundAreaTriggerData();
815 triggerData = triggerHandle.m_Data;
817 jsonData.
Triggers.Insert(triggerData);
821 if (!JsonFileLoader<JsonUndergroundTriggers>.SaveFile(
"$mission:cfgundergroundtriggers.json", jsonData, errorMessage))
827 m_TriggersDirty =
false;
828 Event_OnUpdateData().Invoke();
837 if (m_TriggerVisualsSelected)
838 FocusCameraOn(m_TriggerVisualsSelected.GetCenter(), m_TriggerVisualsSelected.GetSize());
839 else if (m_BreadcrumbVisualsSelected)
841 FocusCameraOn(m_BreadcrumbVisualsSelected.GetCenter(),
Vector(1, 1, 1), 2.0);
846 private void FocusCameraOn(vector
position, vector size,
float maxDistance = 0)
849 cameraPosition[0] = cameraPosition[0] + size[0] * 2;
850 cameraPosition[1] = cameraPosition[1] + size[1] + 0.5;
851 cameraPosition[2] = cameraPosition[2] + size[2] * 2;
857 vector offset = cameraPosition -
position;
858 if (offset.
Length() > maxDistance)
863 viewTarget[1] = viewTarget[1] + size[1] * 0.5;
865 vector cameraDirection = viewTarget - cameraPosition;
868 FreeDebugCamera.GetInstance().SetPosition(cameraPosition);
869 FreeDebugCamera.GetInstance().SetDirection(cameraDirection);
875 void FreeCameraControlEnable()
877 if (
g_Game.GetUIManager().GetMenu())
878 g_Game.GetUIManager().GetMenu().OnHide();
884 void FreeCameraControlDisable()
886 if (
g_Game.GetUIManager().GetMenu())
887 g_Game.GetUIManager().GetMenu().OnShow();
892 void LoadDataFromFile()
895 JsonUndergroundTriggers jsonData = UndergroundAreaLoader.GetData();
898 foreach (
int index, JsonUndergroundAreaTriggerData data : jsonData.
Triggers)
901 m_TriggerVisuals.Insert(box);
902 UndergroundTriggerHandle handle = box.GetTriggerHandle();
903 handle.m_Data = data;
904 if (!handle.m_Data.Comment)
906 box.Event_OnTransformChanged().
Insert(MarkTriggersDirtyOnTransform);
907 m_TriggerHandles.Insert(handle);
910 m_TriggersDirty =
false;
911 Event_OnUpdateData().Invoke();
915 private void OnExport()
918 int year, month, day, hour, minute, second;
921 string datetimeUTC =
string.Format(DATETIME_FORMAT, year, month.ToStringLen(2), day.ToStringLen(2), hour.ToStringLen(2), minute.ToStringLen(2), second.ToStringLen(2));
922 string backupFilename =
string.Format(
"$mission:cfgundergroundtriggers.json.backup-%1", datetimeUTC);
923 CopyFile(
"$mission:cfgundergroundtriggers.json", backupFilename);
928 private bool IsTransformUnchanged(vector oldTransform[4], vector newTransform[4])
930 const float eps = 0.0001;
931 return vector.Distance(oldTransform[3], newTransform[3]) < eps && vector.Distance(oldTransform[0], newTransform[0]) < eps && vector.Distance(oldTransform[1], newTransform[1]) < eps && vector.Distance(oldTransform[2], newTransform[2]) < eps;
936 private bool IsMouseInScene()
940 if (widgetUnder != null && widgetUnder.GetName() ==
"panel_scene")
948 private void SortBoxDrawsByDistance(ArrayBoxDraw arr)
951 for (
int i = 1; i < n; i++)
953 BoxDraw key = arr.Get(i);
954 float keyDist = vector.Distance(m_LastSortCameraPosition, key.GetCenter());
956 while (j >= 0 && vector.Distance(m_LastSortCameraPosition, arr.Get(j).GetCenter()) > keyDist)
958 arr.Set(j + 1, arr.Get(j));
967 private void SortBreadcrumbDrawsByDistance(ArrayBreadcrumbDraw arr)
970 for (
int i = 1; i < n; i++)
972 BreadcrumbDraw key = arr.Get(i);
973 float keyDist = vector.Distance(m_LastSortCameraPosition, key.GetCenter());
975 while (j >= 0 && vector.Distance(m_LastSortCameraPosition, arr.Get(j).GetCenter()) > keyDist)
977 arr.Set(j + 1, arr.Get(j));
static AnimSoundObjectBuilderBank GetInstance()
proto GizmoApi GetGizmoApi()
PluginBase GetPlugin(typename plugin_type)
ref array< ref JsonUndergroundAreaTriggerData > Triggers
Plugin interface for controlling of agent pool system.
proto vector Normalized()
return normalized vector (keeps orginal vector untouched)
proto native float Length()
Returns length of vector (magnitude)
proto float Normalize()
Normalizes vector. Returns length.
const int INDEX_NOT_FOUND
array< float > TFloatArray
proto native bool CopyFile(string sourceName, string destName)
copy file. destName must be "$profile:" or "$saves:" location
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
void OnInit()
Callback for user defined initialization. Called for all suites during TestHarness....
proto void Insert(int index, string input)
Inserts a string into the n-th index, increasing the string length by the size of the input.
static proto string Format(string fmt, void param1=NULL, void param2=NULL, void param3=NULL, void param4=NULL, void param5=NULL, void param6=NULL, void param7=NULL, void param8=NULL, void param9=NULL)
Gets n-th character from string.
proto void GetYearMonthDayUTC(out int year, out int month, out int day)
Returns UTC system date.
proto void GetHourMinuteSecondUTC(out int hour, out int minute, out int second)
Returns UTC system time.