Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_EditorPingInfoDisplay.c
Go to the documentation of this file.
1
3
9class SCR_EditorPingInfoDisplay : SCR_InfoDisplay
10{
11 [Attribute(uiwidget: UIWidgets.ResourceNamePicker, params: "layout")]
13
14 [Attribute(uiwidget: UIWidgets.ResourceNamePicker, params: "layout")]
16
17 protected bool m_bCanUpdate;
22
23 protected void OnEditorPingAction(float value, EActionTrigger reason)
24 {
25 SendPing(false);
26 }
28 {
29 SendPing(true);
30 }
31 protected void SendPing(bool unlimitedOnly)
32 {
33 if (SCR_EditorManagerEntity.IsOpenedInstance()) return;
34
37
38 if (!target || !target.GetPos(position))
39 {
40 //--- Position under cursor
41 WorkspaceWidget workspace = GetGame().GetWorkspace();
42 if (!workspace) return;
43
44 //--- Not reliable, cursor is not hidden in center of the screen on client
45 //int mouseX, mouseY;
46 //WidgetManager.GetMousePos(mouseX, mouseY);
47
48 int screenW = workspace.GetWidth();
49 int screenH = workspace.GetHeight();
50
51 BaseWorld world = GetGame().GetWorld();
52 vector outDir;
53 vector startPos = workspace.ProjScreenToWorld(workspace.DPIUnscale(screenW / 2), workspace.DPIUnscale(screenH / 2), outDir, world);
54 outDir *= 1000; //--- ToDo: Don't hardcode
55
56 autoptr TraceParam trace = new TraceParam();
57 trace.Start = startPos;
58 trace.End = startPos + outDir;
59 trace.Flags = TraceFlags.WORLD | TraceFlags.OCEAN | TraceFlags.ENTS;
60 trace.LayerMask = TRACE_LAYER_CAMERA;
61 float traceDis = world.TraceMove(trace, null);
62
63 target = SCR_EditableEntityComponent.GetEditableEntity(trace.TraceEnt);
64 if (!target && traceDis == 1) return; //--- No intersection
65
66 position = startPos + outDir * traceDis;
67 }
68
69 m_PingManager.SendPing(unlimitedOnly, position, target);
70 }
71 protected void OnPingEntityRegister(int reporterID, SCR_EditableEntityComponent pingEntity)
72 {
73 //--- When outside of the editor, don't create a ping on player
74 if (pingEntity.GetOwner() == SCR_PlayerController.GetLocalControlledEntity()) return;
75
77 if (!m_EntitySlots.Find(pingEntity, slot))
78 {
79 Widget slotWidget = m_Workspace.CreateWidgets(m_SlotWidgetPrefab, m_wRoot);
80 if (!slotWidget) return;
81
83 if (!slot) return;
84
85 slot.InitSlot(pingEntity);
86 m_EntitySlots.Insert(pingEntity, slot);
87 }
88
89 //--- Create ping widget in a slot
90 slot.DeleteWidget(null);
91 Widget entityWidget = slot.CreateWidget(pingEntity, m_WidgetPrefab);
92 m_EntityWidgets.Insert(pingEntity, entityWidget);
93 m_bCanUpdate = true;
94 }
95 protected void OnPingEntityUnregister(int reporterID, SCR_EditableEntityComponent pingEntity)
96 {
97 Widget entityWidget;
98 if (m_EntityWidgets.Find(pingEntity, entityWidget))
99 {
100 m_EntityWidgets.Remove(pingEntity);
101 }
102
104 if (m_EntitySlots.Find(pingEntity, slot))
105 {
106 if (slot)
107 {
108 slot.DeleteWidget(null);
109 slot.DeleteSlot();
110 }
111
112 if (!slot || slot.IsEmpty())
113 {
114 m_EntitySlots.Remove(pingEntity);
115 m_bCanUpdate = !m_EntitySlots.IsEmpty();
116 }
117 }
118 }
119
120 override event void UpdateValues(IEntity owner, float timeSlice)
121 {
122 if (!m_bCanUpdate || !m_Workspace) return;
123
124 int screenW = m_Workspace.GetWidth();
125 int screenH = m_Workspace.GetHeight();
126
127 screenW = m_Workspace.DPIUnscale(screenW);
128 screenH = m_Workspace.DPIUnscale(screenH);
129 vector posCenter = Vector(screenW / 2, screenH / 2, 0);
130
131 vector transformCam[4];
132 GetGame().GetWorld().GetCurrentCamera(transformCam);
133 vector posCam = transformCam[3];
134
136 {
137 entitySlot.UpdateSlot(screenW, screenH, posCenter, posCam);
138 }
139 }
140 override event void OnStartDraw(IEntity owner)
141 {
142 super.OnStartDraw(owner);
143
144 if (!SCR_EditorManagerEntity.GetInstance())
145 {
146 //--- HUD initialized before the editor - wait
148 if (editorManagerCore) editorManagerCore.Event_OnEditorManagerInitOwner.Insert(OnStartDraw);
149 return;
150 }
151 else
152 {
154 if (editorManagerCore) editorManagerCore.Event_OnEditorManagerInitOwner.Remove(OnStartDraw);
155 }
156
158 if (!m_PingManager) return;
159
160 m_PingManager.GetOnPingEntityRegister().Insert(OnPingEntityRegister);
161 m_PingManager.GetOnPingEntityUnregister().Insert(OnPingEntityUnregister);
162
163 m_Workspace = m_wRoot.GetWorkspace();
164
165 InputManager inputManager = GetGame().GetInputManager();
166 if (inputManager)
167 {
168 inputManager.AddActionListener("EditorPing", EActionTrigger.DOWN, OnEditorPingAction);
169 inputManager.AddActionListener("EditorPingUnlimitedOnly", EActionTrigger.DOWN, OnEditorPingUnlimitedOnlyAction);
170 }
171 }
172 override event void OnStopDraw(IEntity owner)
173 {
174 super.OnStopDraw(owner);
175
176 //--- Clear existing ping widgets
177 for (int i = 0, count = m_EntitySlots.Count(); i < count; i++)
178 {
180 }
181
182 if (m_PingManager)
183 {
184 m_PingManager.GetOnPingEntityRegister().Remove(OnPingEntityRegister);
185 m_PingManager.GetOnPingEntityUnregister().Remove(OnPingEntityUnregister);
186 }
187
188 InputManager inputManager = GetGame().GetInputManager();
189 if (inputManager)
190 {
191 inputManager.RemoveActionListener("EditorPing", EActionTrigger.DOWN, OnEditorPingAction);
192 inputManager.RemoveActionListener("EditorPingUnlimitedOnly", EActionTrigger.DOWN, OnEditorPingUnlimitedOnlyAction);
193 }
194 }
195};
const int TRACE_LAYER_CAMERA
Definition Constants.c:14
ArmaReforgerScripted GetGame()
Definition game.c:1398
vector position
void SCR_EditorManagerEntity(IEntitySource src, IEntity parent)
Widget m_wRoot
Input management system for user interactions.
static SCR_EditableEntityComponent GetEditableEntity(IEntity owner)
override void DeleteWidget(SCR_EntitiesEditorUIRule rule)
override void InitSlot(SCR_EditableEntityComponent entity)
Core component to manage SCR_EditorManagerEntity.
override event void OnStopDraw(IEntity owner)
void OnEditorPingUnlimitedOnlyAction(float value, EActionTrigger reason)
ref map< SCR_EditableEntityComponent, SCR_EditableEntitySceneSlotUIComponent > m_EntitySlots
void OnPingEntityRegister(int reporterID, SCR_EditableEntityComponent pingEntity)
override event void OnStartDraw(IEntity owner)
void SendPing(bool unlimitedOnly)
void OnPingEntityUnregister(int reporterID, SCR_EditableEntityComponent pingEntity)
SCR_PingEditorComponent m_PingManager
ref map< SCR_EditableEntityComponent, Widget > m_EntityWidgets
override event void UpdateValues(IEntity owner, float timeSlice)
void OnEditorPingAction(float value, EActionTrigger reason)
static IEntity GetLocalControlledEntity()
Definition Types.c:486
SCR_FieldOfViewSettings Attribute
EActionTrigger
proto native vector Vector(float x, float y, float z)
TraceFlags
Definition TraceFlags.c:13