mapmenu.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503
  1. class 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. protected bool m_WasChanged;
  7. protected bool m_HasCompass
  8. protected bool m_HasGPS
  9. protected bool m_IsOpenning;
  10. protected float m_ToolScaleCellSizeCanvasWidth;
  11. protected float m_ToolsContainerPos0[2];
  12. protected ref IngameHud m_Hud ;
  13. protected ref MapHandler m_MapMenuHandler;
  14. protected ref MapWidget m_MapWidgetInstance;
  15. protected ref SizeToChild m_LegendResizer;
  16. protected Widget m_MapToolsContainer;
  17. protected ImageWidget m_Images;
  18. protected Widget m_GPSMarker;
  19. protected ImageWidget m_GPSMarkerArrow;
  20. protected Widget m_UpperLegendContainer;
  21. protected Widget m_ToolsCompassBase;
  22. protected ImageWidget m_ToolsCompassArrow;
  23. protected TextWidget m_ToolsCompassAzimuth;
  24. protected TextWidget m_ToolsScaleContourText;
  25. protected TextWidget m_ToolsGPSElevationText;
  26. protected TextWidget m_ToolsGPSXText;
  27. protected TextWidget m_ToolsGPSYText;
  28. protected TextWidget m_ToolsScaleCellSizeText;
  29. protected CanvasWidget m_ToolsScaleCellSizeCanvas;
  30. protected ItemMap m_Map;
  31. protected Widget m_ToolbarPanel;
  32. //int m_MarkerCount;
  33. protected ref MapNavigationBehaviour m_MapNavigationBehaviour;
  34. void ~MapMenu()
  35. {
  36. if (GetGame() && GetGame().GetMission())
  37. {
  38. GetGame().GetMission().GetOnInputPresetChanged().Remove(OnInputPresetChanged);
  39. GetGame().GetMission().GetOnInputDeviceChanged().Remove(OnInputDeviceChanged);
  40. }
  41. }
  42. override Widget Init()
  43. {
  44. layoutRoot = GetGame().GetWorkspace().CreateWidgets("gui/layouts/day_z_map.layout");
  45. m_Hud = IngameHud.Cast(GetGame().GetMission().GetHud());
  46. m_IsOpenning = true;
  47. /*MapWidget m = MapWidget.Cast(layoutRoot.FindAnyWidget("Map"));
  48. if (m)
  49. {
  50. m.AddUserMark("2681 4.7 1751", "Lalal", ARGB(255,255,0,0), "\\dz\\gear\\navigation\\data\\map_tree_ca.paa");
  51. m.AddUserMark("2683 4.7 1851", "Lala2", ARGB(255,0,255,0), "\\dz\\gear\\navigation\\data\\map_bunker_ca.paa");
  52. m.AddUserMark("2670 4.7 1651", "Lala3", ARGB(255,0,0,255), "\\dz\\gear\\navigation\\data\\map_busstop_ca.paa");
  53. }*/
  54. m_MapToolsContainer = layoutRoot.FindAnyWidget("Map_Tools_Container");
  55. m_MapToolsContainer.GetScript(m_LegendResizer);
  56. m_MapWidgetInstance = MapWidget.Cast(layoutRoot.FindAnyWidget("Map"));
  57. m_GPSMarker = layoutRoot.FindAnyWidget("GPSMarkerCircle");
  58. m_GPSMarkerArrow = ImageWidget.Cast(layoutRoot.FindAnyWidget("GPSMarkerArrow"));
  59. m_UpperLegendContainer = layoutRoot.FindAnyWidget("Tools_Extra");
  60. layoutRoot.Update();
  61. m_ToolsCompassBase = layoutRoot.FindAnyWidget("Tools_Compass_Base");
  62. m_ToolsCompassArrow = ImageWidget.Cast(layoutRoot.FindAnyWidget("Tools_Compass_Arrow"));
  63. m_ToolsCompassAzimuth = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Compass_Azimuth"));
  64. m_ToolsGPSXText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_X_Value"));
  65. m_ToolsGPSYText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_Y_Value"));
  66. m_ToolsGPSElevationText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_GPS_Elevation_Value"));
  67. m_ToolsScaleContourText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_Contour_Value"));
  68. m_ToolsScaleCellSizeText = TextWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_CellSize_Value"));
  69. m_ToolsScaleCellSizeCanvas = CanvasWidget.Cast(layoutRoot.FindAnyWidget("Tools_Scale_CellSize_Canvas"));
  70. m_ToolbarPanel = layoutRoot.FindAnyWidget("toolbar_bg");
  71. float canvasHeight = 0;
  72. m_ToolsScaleCellSizeCanvas.GetSize(m_ToolScaleCellSizeCanvasWidth, canvasHeight);
  73. if (m_MapWidgetInstance)
  74. {
  75. float scale;
  76. vector mapPosition;
  77. PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
  78. if (player && !player.GetLastMapInfo(scale, mapPosition))
  79. {
  80. vector tempPosition = GetGame().ConfigGetVector(string.Format("CfgWorlds %1 centerPosition", GetGame().GetWorldName()));
  81. scale = 0.33;
  82. mapPosition = Vector(tempPosition[0], tempPosition[1], tempPosition[2]);
  83. }
  84. m_MapWidgetInstance.SetScale(scale);
  85. m_MapWidgetInstance.SetMapPos(mapPosition);
  86. m_HasCompass = false;
  87. m_HasGPS = false;
  88. SetGPSMarkerVisibility(false);
  89. SetGPSDirectionVisibility(false);
  90. SetCompassUIVisibility(false);
  91. SetUpperLegendVisibility(true);
  92. if (player)
  93. {
  94. m_MapNavigationBehaviour = player.GetMapNavigationBehaviour();
  95. if (m_MapNavigationBehaviour)
  96. {
  97. m_HasGPS = (m_MapNavigationBehaviour.GetNavigationType() & EMapNavigationType.GPS|EMapNavigationType.ALL == 0);
  98. m_HasCompass = (m_MapNavigationBehaviour.GetNavigationType() & EMapNavigationType.COMPASS|EMapNavigationType.ALL == 0);
  99. //! gameplay cfg json overrides handling
  100. m_HasGPS = CfgGameplayHandler.GetMapIgnoreNavItemsOwnership() || m_HasGPS;
  101. m_HasCompass = CfgGameplayHandler.GetMapIgnoreNavItemsOwnership() || m_HasCompass;
  102. if (m_HasGPS)
  103. {
  104. SetUpperLegendVisibility(true);
  105. if (m_HasGPS && CfgGameplayHandler.GetMapDisplayPlayerPosition())
  106. {
  107. SetGPSMarkerVisibility(true);
  108. m_MapWidgetInstance.SetMapPos(m_MapNavigationBehaviour.GetPositionReal());
  109. }
  110. }
  111. if (m_HasCompass)
  112. {
  113. SetCompassUIVisibility(true);
  114. SetUpperLegendVisibility(true);
  115. if (m_HasGPS && CfgGameplayHandler.GetMapDisplayPlayerPosition())
  116. {
  117. SetGPSDirectionVisibility(true);
  118. }
  119. }
  120. //! override the CfgGameplayHandler.GetMapIgnoreNavItemsOwnership()
  121. if ((!m_HasGPS && !m_HasCompass) || !CfgGameplayHandler.GetMapDisplayNavigationInfo())
  122. {
  123. SetUpperLegendVisibility(false);
  124. }
  125. }
  126. }
  127. m_MapMenuHandler = new MapHandler(m_MapWidgetInstance);
  128. if (m_Hud)
  129. {
  130. m_Hud.ShowHudUI(false);
  131. m_Hud.ShowQuickbarUI(false);
  132. }
  133. }
  134. float x,y;
  135. m_MapToolsContainer.GetScreenPos(x,y);
  136. m_ToolsContainerPos0[0] = x;
  137. m_ToolsContainerPos0[1] = y;
  138. GetGame().GetMission().GetOnInputPresetChanged().Insert(OnInputPresetChanged);
  139. GetGame().GetMission().GetOnInputDeviceChanged().Insert(OnInputDeviceChanged);
  140. return layoutRoot;
  141. }
  142. override void InitMapItem(EntityAI item)
  143. {
  144. super.InitMapItem(item);
  145. m_Map = ItemMap.Cast(item);
  146. //m_Map.SyncMapMarkers();
  147. //m_MarkerCount = m_Map.GetMarkerArray().Count();
  148. }
  149. override void OnShow()
  150. {
  151. super.OnShow();
  152. UpdateControlsElements();
  153. UpdateControlsElementVisibility();
  154. }
  155. override bool OnClick(Widget w, int x, int y, int button)
  156. {
  157. super.OnClick(w, x, y, button);
  158. switch (w.GetUserID())
  159. {
  160. case IDC_CANCEL:
  161. CloseMapMenu();
  162. return true;
  163. }
  164. return false;
  165. }
  166. override bool OnKeyPress(Widget w, int x, int y, int key)
  167. {
  168. super.OnKeyPress(w, x, y, key);
  169. return false;
  170. }
  171. protected void OnInputPresetChanged()
  172. {
  173. #ifdef PLATFORM_CONSOLE
  174. UpdateControlsElements();
  175. #endif
  176. }
  177. protected void OnInputDeviceChanged(EInputDeviceType pInputDeviceType)
  178. {
  179. UpdateControlsElements();
  180. UpdateControlsElementVisibility();
  181. }
  182. override void Update(float timeslice)
  183. {
  184. super.Update(timeslice);
  185. m_ToolsScaleCellSizeCanvas.Clear();
  186. PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
  187. if (m_MapWidgetInstance)
  188. {
  189. if (m_Images)
  190. {
  191. m_MapWidgetInstance.RemoveChild(m_Images);
  192. }
  193. if (player)
  194. {
  195. m_ToolsScaleContourText.SetText(string.Format("%1 m", m_MapWidgetInstance.GetContourInterval()));
  196. RenderScaleRuler();
  197. float rulerMaxDistance;
  198. string rulerUnits;
  199. ProcessDistanceAndUnits(m_MapWidgetInstance.GetCellSize(m_ToolScaleCellSizeCanvasWidth), rulerMaxDistance, rulerUnits);
  200. m_ToolsScaleCellSizeText.SetText(string.Format("%1%2", rulerMaxDistance, rulerUnits));
  201. if (m_MapNavigationBehaviour)
  202. {
  203. vector mapPos = m_MapWidgetInstance.MapToScreen(m_MapNavigationBehaviour.GetPositionReal());
  204. float scale = 1 - m_MapWidgetInstance.GetScale();
  205. if (m_HasCompass)
  206. {
  207. vector rot = player.GetYawPitchRoll();
  208. float angle = Math.Round(rot[0]);
  209. if (angle < 0)
  210. {
  211. angle = 360 + angle;
  212. }
  213. m_GPSMarkerArrow.SetRotation(0, 0, angle);
  214. m_ToolsCompassArrow.SetRotation(0, 0, angle);
  215. m_ToolsCompassAzimuth.SetText(string.Format("%1°", angle));
  216. }
  217. array<int> coords = MapNavigationBehaviour.OrderedPositionNumbersFromGridCoords(player);
  218. if (m_HasGPS || CfgGameplayHandler.GetMapIgnoreNavItemsOwnership())
  219. {
  220. m_GPSMarker.SetSize(scale * 100, scale * 100);
  221. m_GPSMarkerArrow.SetSize(scale * 100, scale * 100);
  222. float sizeX, sizeY;
  223. m_GPSMarker.GetSize(sizeX, sizeY);
  224. sizeX = Math.Round(sizeX);
  225. sizeY = Math.Round(sizeY);
  226. m_GPSMarker.SetPos(mapPos[0] - sizeX/2, mapPos[1] - sizeY/2);
  227. m_GPSMarkerArrow.SetPos(mapPos[0] - sizeX/2, mapPos[1] - sizeY/2);
  228. if (coords.Count() == m_MapNavigationBehaviour.DISPLAY_GRID_POS_MAX_CHARS_COUNT * 2 && coords[0] >= 0)
  229. {
  230. m_ToolsGPSXText.SetText(string.Format(COORD_FORMAT, coords[0], coords[1], coords[2]));
  231. m_ToolsGPSYText.SetText(string.Format(COORD_FORMAT, coords[3], coords[4], coords[5]));
  232. }
  233. else
  234. {
  235. m_ToolsGPSXText.SetText("-.--");
  236. m_ToolsGPSYText.SetText("-.--");
  237. }
  238. m_ToolsGPSElevationText.SetText(string.Format("%1m", Math.Round(player.GetPosition()[1])));
  239. }
  240. else
  241. {
  242. m_ToolsGPSXText.SetText("-.--");
  243. m_ToolsGPSYText.SetText("-.--");
  244. m_ToolsGPSElevationText.SetText("----m");
  245. }
  246. }
  247. }
  248. bool isClosedWithShortcut = CfgGameplayHandler.GetMapIgnoreMapOwnership() && GetUApi().GetInputByID(UAMapToggle).LocalPress();
  249. if (!m_IsOpenning && (GetUApi().GetInputByID(UAUIBack).LocalPress() || isClosedWithShortcut))
  250. {
  251. if (player)
  252. {
  253. player.SetLastMapInfo(m_MapWidgetInstance.GetScale(), m_MapWidgetInstance.GetMapPos());
  254. }
  255. CloseMapMenu();
  256. }
  257. m_IsOpenning = false;
  258. }
  259. }
  260. void AddMarker(vector pos, int color, int icon = 0)
  261. {
  262. m_Map.InsertMarker(pos,"",color,icon);
  263. m_MapWidgetInstance.AddUserMark(pos, "", color, MapMarkerTypes.GetMarkerTypeFromID(icon));
  264. m_WasChanged = true;
  265. }
  266. void RemoveMarker()
  267. {
  268. m_WasChanged = true;
  269. }
  270. override void LoadMapMarkers()
  271. {
  272. MapMarker marker;
  273. for (int i = 0; i < m_Map.GetMarkerArray().Count(); i++)
  274. {
  275. marker = m_Map.GetMarkerArray().Get(i);
  276. m_MapWidgetInstance.AddUserMark(marker.GetMarkerPos(),marker.GetMarkerText(),marker.GetMarkerColor(),MapMarkerTypes.GetMarkerTypeFromID(marker.GetMarkerIcon())/*"\\dz\\gear\\navigation\\data\\map_tree_ca.paa"*/);
  277. }
  278. }
  279. void CloseMapMenu()
  280. {
  281. if (m_WasChanged)
  282. {
  283. m_Map.SyncMapMarkers();
  284. m_WasChanged = false;
  285. }
  286. PlayerBase player = PlayerBase.Cast(g_Game.GetPlayer());
  287. if (player)
  288. {
  289. player.SetMapClosingSyncSet(false); //map is closing, server needs to be notified - once
  290. }
  291. if (m_Hud)
  292. {
  293. m_Hud.ShowHudUI(true);
  294. m_Hud.ShowQuickbarUI(true);
  295. }
  296. if (CfgGameplayHandler.GetMapIgnoreMapOwnership())
  297. {
  298. if (!CfgGameplayHandler.GetUse3DMap())
  299. {
  300. GetGame().GetMission().RemoveActiveInputExcludes({"map"});
  301. }
  302. else
  303. {
  304. GetGame().GetMission().RemoveActiveInputExcludes({"loopedactions"});
  305. }
  306. GetGame().GetMission().RemoveActiveInputRestriction(EInputRestrictors.MAP);
  307. }
  308. Close();
  309. }
  310. protected void SetCompassUIVisibility(bool pState)
  311. {
  312. if (m_ToolsCompassArrow)
  313. {
  314. m_ToolsCompassArrow.Show(pState);
  315. }
  316. if (m_ToolsCompassAzimuth)
  317. {
  318. m_ToolsCompassAzimuth.Show(pState);
  319. }
  320. }
  321. protected void SetGPSMarkerVisibility(bool pState)
  322. {
  323. if (m_GPSMarker)
  324. {
  325. m_GPSMarker.Show(pState);
  326. }
  327. }
  328. protected void SetGPSDirectionVisibility(bool pState)
  329. {
  330. if (m_GPSMarkerArrow)
  331. {
  332. m_GPSMarkerArrow.Show(pState);
  333. }
  334. }
  335. protected void SetUpperLegendVisibility(bool pState)
  336. {
  337. if (m_UpperLegendContainer)
  338. {
  339. m_UpperLegendContainer.Show(pState);
  340. }
  341. if (m_LegendResizer)
  342. {
  343. m_LegendResizer.ResizeParentToChild();
  344. }
  345. }
  346. protected void RenderScaleRuler()
  347. {
  348. float sizeYShift = 8;
  349. float segmentLength = m_ToolScaleCellSizeCanvasWidth / SCALE_RULER_NUM_SEGMENTS;
  350. int lineColor = FadeColors.BLACK;
  351. for (int i = 1; i <= SCALE_RULER_NUM_SEGMENTS; i++)
  352. {
  353. lineColor = FadeColors.BLACK;
  354. if (i % 2 == 0)
  355. {
  356. lineColor = FadeColors.LIGHT_GREY;
  357. }
  358. if (i == 1) //! 1st segment
  359. {
  360. m_ToolsScaleCellSizeCanvas.DrawLine(0, sizeYShift, segmentLength, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
  361. }
  362. else if (i == SCALE_RULER_NUM_SEGMENTS) //! last segment
  363. {
  364. m_ToolsScaleCellSizeCanvas.DrawLine(segmentLength * (SCALE_RULER_NUM_SEGMENTS - 1), sizeYShift, segmentLength * SCALE_RULER_NUM_SEGMENTS, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
  365. }
  366. else
  367. {
  368. m_ToolsScaleCellSizeCanvas.DrawLine(segmentLength * (i - 1), sizeYShift, segmentLength * i, sizeYShift, SCALE_RULER_LINE_WIDTH, lineColor);
  369. }
  370. }
  371. }
  372. protected void ProcessDistanceAndUnits(float num, out float dist, out string units)
  373. {
  374. if (num >= 901)
  375. {
  376. num *= 0.001;
  377. num = Math.Round(num * 10) * 0.1;
  378. dist = num;
  379. units = "km";
  380. }
  381. else if (num >= 100 && num <= 900)
  382. {
  383. num = Math.Ceil(num * 0.1) * 10;
  384. dist = num;
  385. units = "m";
  386. }
  387. else if (num >= 1)
  388. {
  389. num = Math.Floor(num);
  390. dist = num;
  391. units = "m";
  392. }
  393. else
  394. {
  395. num = Math.Ceil(num * 10);
  396. dist = num;
  397. units = "cm";
  398. }
  399. }
  400. protected void UpdateControlsElements()
  401. {
  402. RichTextWidget toolbarText = RichTextWidget.Cast(layoutRoot.FindAnyWidget("ContextToolbarText"));
  403. string text = string.Empty;
  404. text += string.Format(" <image set=\"xbox_buttons\" name=\"LS\" scale=\"%1\" /> %2 ", InputUtils.ICON_SCALE_TOOLBAR, "#layout_map_navigate");
  405. text += string.Format(" <image set=\"xbox_buttons\" name=\"RS\" scale=\"%1\" /> %2 ", InputUtils.ICON_SCALE_TOOLBAR, "#STR_Controls_Zoom");
  406. text += string.Format(" %1", InputUtils.GetRichtextButtonIconFromInputAction("UAUIBack", "#close", EUAINPUT_DEVICE_CONTROLLER, InputUtils.ICON_SCALE_TOOLBAR));
  407. toolbarText.SetText(text);
  408. }
  409. protected void UpdateControlsElementVisibility()
  410. {
  411. bool toolbarShow = false;
  412. #ifdef PLATFORM_CONSOLE
  413. toolbarShow = !GetGame().GetInput().IsEnabledMouseAndKeyboard() || GetGame().GetInput().GetCurrentInputDevice() == EInputDeviceType.CONTROLLER;
  414. #endif
  415. m_ToolbarPanel.Show(toolbarShow);
  416. ShiftMapToolsContainer();
  417. }
  418. protected void ShiftMapToolsContainer()
  419. {
  420. if (m_ToolbarPanel.IsVisible())
  421. {
  422. float sizeX,sizeY;
  423. m_ToolbarPanel.GetScreenSize(sizeX,sizeY);
  424. m_MapToolsContainer.SetScreenPos(m_ToolsContainerPos0[0],m_ToolsContainerPos0[1] - sizeY);
  425. }
  426. else
  427. m_MapToolsContainer.SetScreenPos(m_ToolsContainerPos0[0],m_ToolsContainerPos0[1]);
  428. }
  429. }