DayZ Scripts
v1.21.156300 · Jun 20, 2023
 
Loading...
Searching...
No Matches
MapMenu.c
Go to the documentation of this file.
1class MapMenu extends UIScriptedMenu
2{
3 protected const string COORD_FORMAT = "%1.%2%3";
4 protected const int SCALE_RULER_LINE_WIDTH = 8;
5 protected const int SCALE_RULER_NUM_SEGMENTS = 10;
6
7 protected bool m_WasChanged;
8 protected bool m_HasCompass
9 protected bool m_HasGPS
10 protected bool m_IsOpenning;
11
13
14 protected ref IngameHud m_Hud ;
17 protected ref SizeToChild m_LegendResizer;
18
19 protected ImageWidget m_Images;
21 protected ImageWidget m_GPSMarkerArrow;
24 protected ImageWidget m_ToolsCompassArrow;
31 protected CanvasWidget m_ToolsScaleCellSizeCanvas;
32 protected ItemMap m_Map;
33 //int m_MarkerCount;
34
36
37 override Widget Init()
38 {
39 layoutRoot = GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_map.layout");
40 m_Hud = IngameHud.Cast(GetGame().GetMission().GetHud());
41 m_IsOpenning = true;
42
43 /*MapWidget m = MapWidget.Cast(layoutRoot.FindAnyWidget("Map"));
44 if (m)
45 {
46 m.AddUserMark("2681 4.7 1751", "Lalal", ARGB(255,255,0,0), "\\dz\\gear\\navigation\\data\\map_tree_ca.paa");
47 m.AddUserMark("2683 4.7 1851", "Lala2", ARGB(255,0,255,0), "\\dz\\gear\\navigation\\data\\map_bunker_ca.paa");
48 m.AddUserMark("2670 4.7 1651", "Lala3", ARGB(255,0,0,255), "\\dz\\gear\\navigation\\data\\map_busstop_ca.paa");
49 }*/
50
51 Widget mapToolsContainer = layoutRoot.FindAnyWidget("Map_Tools_Container");
52 mapToolsContainer.GetScript(m_LegendResizer);
53
54 m_MapWidgetInstance = MapWidget.Cast(layoutRoot.FindAnyWidget("Map"));
55 m_GPSMarker = layoutRoot.FindAnyWidget("GPSMarkerCircle");
56 m_GPSMarkerArrow = ImageWidget.Cast(layoutRoot.FindAnyWidget("GPSMarkerArrow"));
57 m_UpperLegendContainer = layoutRoot.FindAnyWidget("Tools_Extra");
58 layoutRoot.Update();
59 m_ToolsCompassBase = layoutRoot.FindAnyWidget("Tools_Compass_Base");
60 m_ToolsCompassArrow = ImageWidget.Cast(layoutRoot.FindAnyWidget("Tools_Compass_Arrow"));
61 m_ToolsCompassAzimuth = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Compass_Azimuth"));
62 m_ToolsGPSXText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_X_Value"));
63 m_ToolsGPSYText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_Y_Value"));
64 m_ToolsGPSElevationText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_Elevation_Value"));
65 m_ToolsScaleContourText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_Contour_Value"));
66 m_ToolsScaleCellSizeText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_CellSize_Value"));
67 m_ToolsScaleCellSizeCanvas = CanvasWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_CellSize_Canvas"));
68
69 float canvasHeight = 0;
70 m_ToolsScaleCellSizeCanvas.GetSize(m_ToolScaleCellSizeCanvasWidth, canvasHeight);
71
72 if (m_MapWidgetInstance)
73 {
74 float scale;
75 vector mapPosition;
76 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
77 if (player && !player.GetLastMapInfo(scale, mapPosition))
78 {
79 vector tempPosition = GetGame().ConfigGetVector(string.Format("CfgWorlds %1 centerPosition", GetGame().GetWorldName()));
80 scale = 0.33;
81 mapPosition = Vector(tempPosition[0], tempPosition[1], tempPosition[2]);
82 }
83
84 m_MapWidgetInstance.SetScale(scale);
85 m_MapWidgetInstance.SetMapPos(mapPosition);
86
87 m_HasCompass = false;
88 m_HasGPS = false;
89
94
95 if (player)
96 {
97 m_MapNavigationBehaviour = player.GetMapNavigationBehaviour();
98 if (m_MapNavigationBehaviour)
99 {
100 m_HasGPS = (m_MapNavigationBehaviour.GetNavigationType() & EMapNavigationType.GPS|EMapNavigationType.ALL == 0);
101 m_HasCompass = (m_MapNavigationBehaviour.GetNavigationType() & EMapNavigationType.COMPASS|EMapNavigationType.ALL == 0);
102
104 m_HasGPS = CfgGameplayHandler.GetMapIgnoreNavItemsOwnership() || m_HasGPS;
105 m_HasCompass = CfgGameplayHandler.GetMapIgnoreNavItemsOwnership() || m_HasCompass;
106
107 if (m_HasGPS)
108 {
111 {
113 m_MapWidgetInstance.SetMapPos(m_MapNavigationBehaviour.GetPositionReal());
114 }
115 }
116
117 if (m_HasCompass)
118 {
122 {
124 }
125 }
126
128 if ((!m_HasGPS && !m_HasCompass) || !CfgGameplayHandler.GetMapDisplayNavigationInfo())
129 {
131 }
132 }
133 }
134
135 m_MapMenuHandler = new MapHandler(m_MapWidgetInstance);
136
137 if (m_Hud)
138 {
139 m_Hud.ShowHudUI(false);
140 m_Hud.ShowQuickbarUI(false);
141 }
142 }
143
144 return layoutRoot;
145 }
146
147 override void InitMapItem(EntityAI item)
148 {
149 super.InitMapItem(item);
150
151 m_Map = ItemMap.Cast(item);
152 //m_Map.SyncMapMarkers();
153 //m_MarkerCount = m_Map.GetMarkerArray().Count();
154 }
155
156 override bool OnClick(Widget w, int x, int y, int button)
157 {
158 super.OnClick(w, x, y, button);
159
160 switch (w.GetUserID())
161 {
162 case IDC_CANCEL:
163 CloseMapMenu();
164 return true;
165 }
166
167 return false;
168 }
169
170 override bool OnKeyPress(Widget w, int x, int y, int key)
171 {
172 super.OnKeyPress(w, x, y, key);
173
174 Print(key);
175
176 return false;
177 }
178
179 //TODO if it does not work well enough, attach some ScriptedWidgetEventHandler to the MapWidget
180 /*override bool OnDoubleClick(Widget w, int x, int y, int button)
181 {
182 super.OnDoubleClick(w, x, y, button);
183
184 MapWidget m = MapWidget.Cast(layoutRoot.FindAnyWidget("Map"));
185 if (w == m)
186 {
187 vector screen_to_map = m.ScreenToMap(Vector(x,y,0));
188
189 AddMarker(w,screen_to_map,
190
191 //m.AddUserMark(screen_to_map, "marker", ARGB(255,0,0,255), "\\dz\\gear\\navigation\\data\\map_tree_ca.paa");
192
193 return true;
194 }
195
196 return false;
197 }*/
198
199 override void Update(float timeslice)
200 {
201 super.Update(timeslice);
202 m_ToolsScaleCellSizeCanvas.Clear();
203
204 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
205
206 if (m_MapWidgetInstance)
207 {
208 if (m_Images)
209 {
210 m_MapWidgetInstance.RemoveChild(m_Images);
211 }
212
213 if (player)
214 {
215 m_ToolsScaleContourText.SetText(string.Format("%1 m", m_MapWidgetInstance.GetContourInterval()));
217 float rulerMaxDistance;
218 string rulerUnits;
219 ProcessDistanceAndUnits(m_MapWidgetInstance.GetCellSize(m_ToolScaleCellSizeCanvasWidth), rulerMaxDistance, rulerUnits);
220 m_ToolsScaleCellSizeText.SetText(string.Format("%1%2", rulerMaxDistance, rulerUnits));
221
222 if (m_MapNavigationBehaviour)
223 {
224 vector mapPos = m_MapWidgetInstance.MapToScreen(m_MapNavigationBehaviour.GetPositionReal());
225 float scale = 1 - m_MapWidgetInstance.GetScale();
226
227 if (m_HasCompass)
228 {
229 vector rot = player.GetYawPitchRoll();
230 float angle = Math.Round(rot[0]);
231 if (angle < 0)
232 {
233 angle = 360 + angle;
234 }
235
236 m_GPSMarkerArrow.SetRotation(0, 0, angle);
237 m_ToolsCompassArrow.SetRotation(0, 0, angle);
238 m_ToolsCompassAzimuth.SetText(string.Format("%1°", angle));
239 }
240
241 array<int> coords = MapNavigationBehaviour.OrderedPositionNumbersFromGridCoords(player);
243 {
244 m_GPSMarker.SetSize(scale * 100, scale * 100);
245 m_GPSMarkerArrow.SetSize(scale * 100, scale * 100);
246 float sizeX, sizeY;
247 m_GPSMarker.GetSize(sizeX, sizeY);
248 sizeX = Math.Round(sizeX);
249 sizeY = Math.Round(sizeY);
250 m_GPSMarker.SetPos(mapPos[0] - sizeX/2, mapPos[1] - sizeY/2);
251 m_GPSMarkerArrow.SetPos(mapPos[0] - sizeX/2, mapPos[1] - sizeY/2);
252
253 if (coords.Count() == m_MapNavigationBehaviour.DISPLAY_GRID_POS_MAX_CHARS_COUNT * 2 && coords[0] >= 0)
254 {
255 m_ToolsGPSXText.SetText(string.Format(COORD_FORMAT, coords[0], coords[1], coords[2]));
256 m_ToolsGPSYText.SetText(string.Format(COORD_FORMAT, coords[3], coords[4], coords[5]));
257 }
258 else
259 {
260 m_ToolsGPSXText.SetText("-.--");
261 m_ToolsGPSYText.SetText("-.--");
262 }
263
264 m_ToolsGPSElevationText.SetText(string.Format("%1m", Math.Round(player.GetPosition()[1])));
265 }
266 else
267 {
268 m_ToolsGPSXText.SetText("-.--");
269 m_ToolsGPSYText.SetText("-.--");
270 m_ToolsGPSElevationText.SetText("----m");
271 }
272 }
273 }
274
275 bool isClosedWithShortcut = CfgGameplayHandler.GetMapIgnoreMapOwnership() && GetUApi().GetInputByID(UAMapToggle).LocalPress();
276 if (!m_IsOpenning && (GetUApi().GetInputByID(UAUIBack).LocalPress() || isClosedWithShortcut))
277 {
278 if (player)
279 {
280 player.SetLastMapInfo(m_MapWidgetInstance.GetScale(), m_MapWidgetInstance.GetMapPos());
281 }
282
283 CloseMapMenu();
284 }
285
286 m_IsOpenning = false;
287 }
288 }
289
290 void AddMarker(vector pos, int color, int icon = 0)
291 {
292 m_Map.InsertMarker(pos,"",color,icon);
293 m_MapWidgetInstance.AddUserMark(pos, "", color, MapMarkerTypes.GetMarkerTypeFromID(icon));
294 m_WasChanged = true;
295 }
296
298 {
299 m_WasChanged = true;
300 }
301
302 override void LoadMapMarkers()
303 {
304 MapMarker marker;
305 for (int i = 0; i < m_Map.GetMarkerArray().Count(); i++)
306 {
307 marker = m_Map.GetMarkerArray().Get(i);
308 m_MapWidgetInstance.AddUserMark(marker.GetMarkerPos(),marker.GetMarkerText(),marker.GetMarkerColor(),MapMarkerTypes.GetMarkerTypeFromID(marker.GetMarkerIcon())/*"\\dz\\gear\\navigation\\data\\map_tree_ca.paa"*/);
309 }
310 }
311
313 {
314 if (m_WasChanged)
315 {
316 m_Map.SyncMapMarkers();
317 m_WasChanged = false;
318 }
319
320 PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
321 if (player)
322 {
323 player.SetMapClosingSyncSet(false); //map is closing, server needs to be notified - once
324 }
325
326 if (m_Hud)
327 {
328 m_Hud.ShowHudUI(true);
329 m_Hud.ShowQuickbarUI(true);
330 }
331
333 {
335 {
337 }
338 else
339 {
340 GetGame().GetMission().RemoveActiveInputExcludes({"loopedactions"});
341 }
342
343 GetGame().GetMission().RemoveActiveInputRestriction(EInputRestrictors.MAP);
344 }
345
346 Close();
347 }
348
349 protected void SetCompassUIVisibility(bool pState)
350 {
351 if (m_ToolsCompassArrow)
352 {
353 m_ToolsCompassArrow.Show(pState);
354 }
355
356 if (m_ToolsCompassAzimuth)
357 {
358 m_ToolsCompassAzimuth.Show(pState);
359 }
360 }
361
362 protected void SetGPSMarkerVisibility(bool pState)
363 {
364 if (m_GPSMarker)
365 {
366 m_GPSMarker.Show(pState);
367 }
368 }
369
370 protected void SetGPSDirectionVisibility(bool pState)
371 {
372 if (m_GPSMarkerArrow)
373 {
374 m_GPSMarkerArrow.Show(pState);
375 }
376 }
377
378 protected void SetUpperLegendVisibility(bool pState)
379 {
380 if (m_UpperLegendContainer)
381 {
382 m_UpperLegendContainer.Show(pState);
383 }
384
385 if (m_LegendResizer)
386 {
387 m_LegendResizer.ResizeParentToChild();
388 }
389 }
390
391 protected void RenderScaleRuler()
392 {
393 float sizeYShift = 8;
394 float segmentLength = m_ToolScaleCellSizeCanvasWidth / SCALE_RULER_NUM_SEGMENTS;
395 int lineColor = FadeColors.BLACK;
396
397 for (int i = 1; i <= SCALE_RULER_NUM_SEGMENTS; i++)
398 {
399 lineColor = FadeColors.BLACK;
400 if (i % 2 == 0)
401 {
402 lineColor = FadeColors.LIGHT_GREY;
403 }
404
405 if (i == 1)
406 {
407 m_ToolsScaleCellSizeCanvas.DrawLine(0, sizeYShift, segmentLength, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
408 }
409 else if (i == SCALE_RULER_NUM_SEGMENTS)
410 {
411 m_ToolsScaleCellSizeCanvas.DrawLine(segmentLength * (SCALE_RULER_NUM_SEGMENTS - 1), sizeYShift, segmentLength * SCALE_RULER_NUM_SEGMENTS, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
412 }
413 else
414 {
415 m_ToolsScaleCellSizeCanvas.DrawLine(segmentLength * (i - 1), sizeYShift, segmentLength * i, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
416 }
417 }
418 }
419
420 protected void ProcessDistanceAndUnits(float num, out float dist, out string units)
421 {
422 if (num >= 901)
423 {
424 num *= 0.001;
425 num = Math.Round(num * 10) * 0.1;
426 dist = num;
427 units = "km";
428 }
429 else if (num >= 100 && num <= 900)
430 {
431 num = Math.Ceil(num * 0.1) * 10;
432 dist = num;
433 units = "m";
434 }
435 else if (num >= 1)
436 {
437 num = Math.Floor(num);
438 dist = num;
439 units = "m";
440 }
441 else
442 {
443 num = Math.Ceil(num * 10);
444 dist = num;
445 units = "cm";
446 }
447 }
448}
DayZGame g_Game
Definition DayZGame.c:3654
Hud m_Hud
Icon x
Icon y
void Close()
void MapNavigationBehaviour(PlayerBase pPlayer, EMapNavigationType pNavigationType=EMapNavigationType.BASIC)
proto native UAInputAPI GetUApi()
proto native vector ConfigGetVector(string path)
Get vector value from config on path.
proto native Mission GetMission()
proto native WorkspaceWidget GetWorkspace()
static bool GetMapDisplayNavigationInfo()
static bool GetMapIgnoreMapOwnership()
static bool GetMapIgnoreNavItemsOwnership()
static bool GetMapDisplayPlayerPosition()
void ShowHudUI(bool show)
void ShowQuickbarUI(bool show)
string GetMarkerText()
int GetMarkerColor()
int GetMarkerIcon()
vector GetMarkerPos()
static string GetMarkerTypeFromID(int id)
Definition EnMath.c:7
void RemoveActiveInputRestriction(int restrictor)
void RemoveActiveInputExcludes(array< string > excludes, bool bForceSupress=false)
deprecated
proto native UAInput GetInputByID(int iID)
returns list of all bindable (i.e. visible) inputs from the active group ('core' by default)
proto native bool LocalPress()
protected ImageWidget m_ToolsCompassArrow
Definition MapMenu.c:24
protected Widget m_ToolsCompassBase
Definition MapMenu.c:23
void CloseMapMenu()
Definition MapMenu.c:312
protected ref SizeToChild m_LegendResizer
Definition MapMenu.c:17
protected TextWidget m_ToolsGPSYText
Definition MapMenu.c:29
protected TextWidget m_ToolsGPSElevationText
Definition MapMenu.c:27
override void Update(float timeslice)
Definition MapMenu.c:199
protected TextWidget m_ToolsGPSXText
Definition MapMenu.c:28
protected TextWidget m_ToolsScaleCellSizeText
Definition MapMenu.c:30
override void LoadMapMarkers()
Definition MapMenu.c:302
protected void SetGPSDirectionVisibility(bool pState)
Definition MapMenu.c:370
protected Widget m_UpperLegendContainer
Definition MapMenu.c:22
protected ItemMap m_Map
Definition MapMenu.c:32
protected void RenderScaleRuler()
Definition MapMenu.c:391
protected ref MapHandler m_MapMenuHandler
Definition MapMenu.c:15
protected const int SCALE_RULER_NUM_SEGMENTS
Definition MapMenu.c:5
protected CanvasWidget m_ToolsScaleCellSizeCanvas
Definition MapMenu.c:31
void RemoveMarker()
Definition MapMenu.c:297
override bool OnKeyPress(Widget w, int x, int y, int key)
Definition MapMenu.c:170
protected Widget m_GPSMarker
Definition MapMenu.c:20
protected ref MapNavigationBehaviour m_MapNavigationBehaviour
Definition MapMenu.c:35
protected void SetGPSMarkerVisibility(bool pState)
Definition MapMenu.c:362
protected ImageWidget m_Images
Definition MapMenu.c:19
protected TextWidget m_ToolsScaleContourText
Definition MapMenu.c:26
void AddMarker(vector pos, int color, int icon=0)
Definition MapMenu.c:290
override void InitMapItem(EntityAI item)
Definition MapMenu.c:147
protected void ProcessDistanceAndUnits(float num, out float dist, out string units)
Definition MapMenu.c:420
protected ref MapWidget m_MapWidgetInstance
Definition MapMenu.c:16
protected ImageWidget m_GPSMarkerArrow
Definition MapMenu.c:21
protected void SetUpperLegendVisibility(bool pState)
Definition MapMenu.c:378
protected bool m_HasCompass protected bool m_HasGPS protected bool m_IsOpenning
Definition MapMenu.c:10
override Widget Init()
Definition MapMenu.c:37
protected void SetCompassUIVisibility(bool pState)
Definition MapMenu.c:349
protected TextWidget m_ToolsCompassAzimuth
Definition MapMenu.c:25
protected bool m_WasChanged
Definition MapMenu.c:7
override bool OnClick(Widget w, int x, int y, int button)
Definition MapMenu.c:156
protected ref IngameHud m_Hud
Definition MapMenu.c:14
protected float m_ToolScaleCellSizeCanvasWidth
Definition MapMenu.c:12
Result for an object found in CGame.IsBoxCollidingGeometryProxy.
proto native CGame GetGame()
proto void Print(void var)
Prints content of variable to console/log.
proto native vector Vector(float x, float y, float z)
Vector constructor from components.
static proto float Round(float f)
Returns mathematical round of value.
static proto float Ceil(float f)
Returns ceil of value.
static proto float Floor(float f)
Returns floor of value.
const int IDC_CANCEL
Definition constants.c:116
proto native external Widget CreateWidgets(string layout, Widget parentWidget=NULL, bool immedUpdate=true)
Create widgets from *.layout file.