Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ContentBrowser_ScenarioSubMenu.c
Go to the documentation of this file.
3 MODE_ALL, // Show all scenarios
4 MODE_SAVES, // Downloaded saves item
5 MODE_FAVOURITE, // Show only favourite scenarios
6 MODE_RECENT, // Show only recently played scenarios
7}
8
9class SCR_ContentBrowser_ScenarioSubMenu : SCR_ContentBrowser_ScenarioSubMenuBase
10{
11 // This is quite universal and can work in many modes...
12 [Attribute("0", UIWidgets.ComboBox, "Mode in which this submenu must work.", "", ParamEnumArray.FromEnum(EScenarioSubMenuMode))]
14
15 [Attribute("{723ED8FDA27DD0BB}UI/layouts/Menus/ContentBrowser/ScenariosMenu/ContentBrowser_GMSaveLine.layout", UIWidgets.ResourceNamePicker, ".layout for the scenario lines", params: "layout")]
17
18 // Constants
19 protected const int RECENTLY_PLAYED_MAX_ENTRIES = 10; // How many recently played missions to show in the recently played tab
20
21 // Message tags
22 // Those which end with '2' should be used when no content is found due to filters.
23 protected const string MESSAGE_TAG_NOTHING_FOUND = "nothing_found";
24 protected const string MESSAGE_TAG_NOTHING_FOUND_2 = "nothing_found2";
25 protected const string MESSAGE_TAG_NOTHING_FAVOURITE = "nothing_favourite";
26 protected const string MESSAGE_TAG_NOTHING_FAVOURITE_2 ="nothing_favourite2";
27 protected const string MESSAGE_TAG_NOTHING_RECENT = "nothing_recent";
28 protected const string MESSAGE_TAG_NOTHING_RECENT_2 = "nothing_recent2";
29 protected const string MESSAGE_TAG_NO_SAVE = "no_save";
30 protected const string MESSAGE_TAG_NO_SAVE_FOUND = "no_save_found";
31
32 // Other
34
35 protected int m_iEntriesTotal;
36 protected int m_iEntriesCurrent;
37 protected static bool m_bIsOpened = false;
38
39 //------------------------------------------------------------------------------------------------
40 override void OnMenuHide()
41 {
42 super.OnMenuHide();
43
44 m_bIsOpened = false;
45 }
46
47 //------------------------------------------------------------------------------------------------
48 override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index)
49 {
50 super.OnTabCreate(menuRoot, buttonsLayout, index);
51
52 m_ScenarioDetailsPanel = m_Widgets.m_ScenarioDetailsPanelComponent;
53 m_AddonDetailsPanel = m_Widgets.m_AddonDetailsPanelComponent;
54
55 // Try to restore filters
56 m_Widgets.m_FilterPanelComponent.TryLoad();
57
59 }
60
61 //------------------------------------------------------------------------------------------------
62 override void OnTabShow()
63 {
64 super.OnTabShow();
65
66 // Init workshop API
67 // We do it on tab show becasue this tab and others persists when all other tabs are closed,
68 // But we can switch back to it later, and we must setup the workshop api again
70
71 //SCR_AnalyticsApplication.GetInstance().ScenariosSetTab(m_eMode);
72
73 m_bIsOpened = true;
74 }
75
76 //------------------------------------------------------------------------------------------------
77 override void OnTabHide()
78 {
79 super.OnTabHide();
80
81 // Save configuration of filters
82 m_Widgets.m_FilterPanelComponent.Save();
83 }
84
85 //------------------------------------------------------------------------------------------------
86 override void OnMenuFocusGained()
87 {
88 //Bring back focus to the last selected line after closing a pop-up dialog, in order to always have an element focused
89 Widget target;
90
92 target = m_LastSelectedLine.GetRootWidget();
93 else if (m_Widgets && m_Widgets.m_ScenarioList)
94 target = m_Widgets.m_ScenarioList.GetChildren();
95
96 if (target)
97 GetGame().GetWorkspace().SetFocusedWidget(target);
98
99 super.OnMenuFocusGained();
100 }
101
102 //------------------------------------------------------------------------------------------------
107
108 //------------------------------------------------------------------------------------------------
109 override void InitWidgets()
110 {
111 super.InitWidgets();
112
113 // We provide scenarioSubMenuRoot as root because the widgets of the layours were exported starting from scenarioSubMenuRoot
114 m_Widgets.Init(m_wRoot.FindWidget("scenarioSubMenuRoot"));
115
116 m_Widgets.m_FilterPanelComponent.GetEditBoxSearch().m_OnConfirm.Insert(OnSearchConfirm);
117 m_Widgets.m_SortingHeaderComponent.m_OnChanged.Insert(OnSortingHeaderChange);
118 }
119
120 //------------------------------------------------------------------------------------------------
121 override void UpdateNavigationButtons(bool visible = true)
122 {
123 visible = GetSelectedLine() && GetGame().GetInputManager().GetLastUsedInputDevice() != EInputDeviceType.MOUSE;
124 super.UpdateNavigationButtons(visible);
125 }
126
127 //------------------------------------------------------------------------------------------------
128 override bool Play(MissionWorkshopItem scenario)
129 {
130 if (!super.Play(scenario))
131 return false;
132
133 SCR_MenuLoadingComponent.SaveLastMenu(ChimeraMenuPreset.ScenarioMenu);
134 return true;
135 }
136
137 //------------------------------------------------------------------------------------------------
138 override bool Continue(MissionWorkshopItem scenario)
139 {
140 if (!super.Continue(scenario))
141 return false;
142
143 SCR_MenuLoadingComponent.SaveLastMenu(ChimeraMenuPreset.ScenarioMenu);
144 return true;
145 }
146
147 //------------------------------------------------------------------------------------------------
148 override void OnRestartConfirmed()
149 {
150 super.OnRestartConfirmed();
151 SCR_MenuLoadingComponent.SaveLastMenu(ChimeraMenuPreset.ScenarioMenu);
152 }
153
154 //------------------------------------------------------------------------------------------------
157 {
159 super.OnScenarioStateChanged(comp);
160 }
161
162 //------------------------------------------------------------------------------------------------
163 override protected Widget CreateLine(ResourceName layout, Widget parent, MissionWorkshopItem scenario)
164 {
165 SCR_MissionHeader missionHeader = SCR_MissionHeader.Cast(SCR_MissionHeader.ReadMissionHeader(scenario.Id()));
166 if (missionHeader && !missionHeader.m_bShowInScenarioMenu)
167 return null;
168
169 if (WorldSaveItem.Cast(scenario.GetOwner()))
171
172 Widget w = super.CreateLine(layout, parent, scenario);
173 if (!w)
174 return null;
175
176 WorldSaveItem save = WorldSaveItem.Cast(scenario.GetOwner());
177 if (!save)
178 return w;
179
181 if (!comp)
182 return null;
183
184 comp.SetSaveItem(save);
185
186 return w;
187 }
188
189 // ---- PROTECTED ----
190 //------------------------------------------------------------------------------------------------
192 protected void UpdateScenarioList(bool setNewFocus)
193 {
194 // Get missions from Workshop API
195 array<MissionWorkshopItem> missionItemsAll = {};
196 m_WorkshopApi.GetPageScenarios(missionItemsAll, 0, SCR_WorkshopUiCommon.PAGE_SCENARIOS); // Get all missions at once
197
198 // Remove scenarios from disabled addons
199 for (int i = missionItemsAll.Count() - 1; i >= 0; i--)
200 {
201 MissionWorkshopItem m = missionItemsAll[i];
202 WorkshopItem addon = m.GetOwner();
203
204 if (!addon)
205 continue;
206
207 SCR_WorkshopItem scriptedItem = SCR_AddonManager.GetInstance().GetItem(addon.Id());
208
209 if (scriptedItem && scriptedItem.GetAnyDependencyMissing())
210 missionItemsAll.Remove(i);
211 }
212
213 for (int i = missionItemsAll.Count() - 1; i >= 0; i--)
214 {
215 if (SCR_ScenarioSequenceProgress.IsScenarioLocked(missionItemsAll[i]))
216 missionItemsAll.Remove(i);
217 }
218
219 // Store total number of entries
220 m_iEntriesTotal = missionItemsAll.Count();
221
222 // Filter items according to current tab mode
223 array<MissionWorkshopItem> missionItemsTabFiltered = {};
224 switch (m_eMode)
225 {
226 // Select only fav. missions
227 case EScenarioSubMenuMode.MODE_FAVOURITE:
228 {
229 foreach (MissionWorkshopItem m : missionItemsAll)
230 {
231 if (m.IsFavorite())
232 missionItemsTabFiltered.Insert(m);
233 }
234
235 // Bail if there are no favourite missions
236 if (ScenarioEmptyMessage(missionItemsTabFiltered, MESSAGE_TAG_NOTHING_FAVOURITE))
237 return;
238
239 break;
240 }
241
242 // Select only recently played missions
243 case EScenarioSubMenuMode.MODE_RECENT:
244 {
245 // Sort missions by time since last play, select top latest N entries
246 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionTimeSinceLastPlay>.HeapSort(missionItemsAll, false);
247
248 int i;
249 while (missionItemsTabFiltered.Count() < RECENTLY_PLAYED_MAX_ENTRIES && i < missionItemsAll.Count())
250 {
251 int dt = missionItemsAll[i].GetTimeSinceLastPlay();
252 if (dt != -1)
253 missionItemsTabFiltered.Insert(missionItemsAll[i]);
254 i++;
255 }
256
257 // Bail if no recent missions
258 if (ScenarioEmptyMessage(missionItemsTabFiltered, MESSAGE_TAG_NOTHING_RECENT))
259 return;
260
261 break;
262 }
263
264 // Select only recently played missions
265 case EScenarioSubMenuMode.MODE_SAVES:
266 {
267 foreach (MissionWorkshopItem m : missionItemsAll)
268 {
269 WorkshopItem addon = m.GetOwner();
270 if (!addon)
271 continue;
272
273 SCR_WorkshopItem scriptedItem = SCR_AddonManager.GetInstance().GetItem(addon.Id());
274
275 WorldSaveItem save;
276 if (scriptedItem && scriptedItem.GetWorkshopItem())
277 save = WorldSaveItem.Cast(scriptedItem.GetWorkshopItem());
278
279 if (save)
280 missionItemsTabFiltered.Insert(m);
281 }
282
283 // Bail if no save
284 if (ScenarioEmptyMessage(missionItemsTabFiltered, MESSAGE_TAG_NO_SAVE))
285 return;
286
287 break;
288 }
289
290 // Select all missions
291 default:
292 {
293 if (missionItemsAll.IsEmpty())
294 {
296
299 return;
300 }
301
302 foreach (MissionWorkshopItem m : missionItemsAll)
303 {
304 WorkshopItem addon = m.GetOwner();
305 if (!addon)
306 {
307 missionItemsTabFiltered.Insert(m);
308 continue;
309 }
310
311 SCR_WorkshopItem scriptedItem = SCR_AddonManager.GetInstance().GetItem(addon.Id());
312
313 WorldSaveItem save;
314 if (scriptedItem && scriptedItem.GetWorkshopItem())
315 save = WorldSaveItem.Cast(scriptedItem.GetWorkshopItem());
316
317 if (!scriptedItem || !save)
318 missionItemsTabFiltered.Insert(m);
319 }
320
321 break;
322 }
323 }
324
325 // Filter scenarios based on search string
326 string searchStr = m_Widgets.m_FilterPanelComponent.GetEditBoxSearch().GetValue();
327 array<MissionWorkshopItem> missionItemsSearched = SearchScenarios(missionItemsTabFiltered, searchStr);
328
329 // Bail if based on search there is no content
330 if (missionItemsSearched.IsEmpty())
331 {
333
334 // The message depends on current tab
335 string messageTag;
336 switch (m_eMode)
337 {
338 case EScenarioSubMenuMode.MODE_FAVOURITE:
340 break;
341
342 case EScenarioSubMenuMode.MODE_SAVES:
343 messageTag = MESSAGE_TAG_NO_SAVE_FOUND;
344 break;
345
346 case EScenarioSubMenuMode.MODE_RECENT:
347 messageTag = MESSAGE_TAG_NOTHING_RECENT_2;
348 break;
349
350 default:
351 messageTag = MESSAGE_TAG_NOTHING_FOUND_2;
352 break;
353 }
354
356 SetPanelsMode(false, messageTag);
357 return;
358 }
359
360 // At this point we are sure that there are some missions found
361 // Choose sorting based on selected filter
362 array<MissionWorkshopItem> missionItems = missionItemsSearched;
363 ESortOrder eSortOrder = m_Widgets.m_SortingHeaderComponent.GetSortOrder();
364 string currentSortingItem = m_Widgets.m_SortingHeaderComponent.GetSortElementName();
365
366 bool sortOrder = false;
367 if (eSortOrder == ESortOrder.DESCENDING)
368 sortOrder = true;
369
370 // Apply sorting of headers if required
371 if (currentSortingItem.IsEmpty())
372 {
373 currentSortingItem = "name";
374 sortOrder = false;
375 }
376 switch (currentSortingItem)
377 {
378 case "name":
379 {
380 // Sort save by addon name as it is actial name of save
381 if (m_eMode == EScenarioSubMenuMode.MODE_SAVES)
382 {
383 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionAddonName>.HeapSort(missionItems, sortOrder);
384 break;
385 }
386
387 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionName>.HeapSort(missionItems, sortOrder);
388 break;
389 }
390 case "player_count": // sort by player count
391 {
392 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionPlayerCount>.HeapSort(missionItems, sortOrder);
393 break;
394 }
395 case "favourite":
396 {
397 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionFavourite>.HeapSort(missionItems, sortOrder);
398 break;
399 }
400 case "last_played":
401 {
402 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionTimeSinceLastPlay>.HeapSort(missionItems, sortOrder);
403 break;
404 }
405 case "source":
406 {
407 // Sort save by scenario name as it is used as source indicator
408 if (m_eMode == EScenarioSubMenuMode.MODE_SAVES)
409 {
410 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionName>.HeapSort(missionItems, sortOrder);
411 break;
412 }
413
414 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionAddonName>.HeapSort(missionItems, sortOrder);
415 break;
416 }
417 }
418
419 m_iEntriesCurrent = missionItemsSearched.Count();
420 SetPanelsMode(false);
421 ScenarioList_CreateMissionEntries(missionItems, setNewFocus);
422 }
423
424 //------------------------------------------------------------------------------------------------
425 protected bool ScenarioEmptyMessage(array<MissionWorkshopItem> mission, string messageTag)
426 {
427 if (!mission.IsEmpty())
428 return false;
429
431
433 SetPanelsMode(true, messageTag);
434 return true;
435 }
436
437 //------------------------------------------------------------------------------------------------
438 protected static bool SearchStringLocalized(string str, string searchStrLower)
439 {
440 if (str.StartsWith("#"))
441 {
442 // Check translated lowercased string
443 string strTranslated = WidgetManager.Translate(str);
444 if (!strTranslated.IsEmpty())
445 {
446 string strTranslatedLower = strTranslated;
447 strTranslatedLower.ToLower();
448
449 if (strTranslatedLower.Contains(searchStrLower))
450 return true;
451 }
452 }
453 else
454 {
455 // Check lowercased string
456 string strLower = str;
457 strLower.ToLower();
458
459 if (strLower.Contains(searchStrLower))
460 return true;
461 }
462
463 return false;
464 }
465
466 //------------------------------------------------------------------------------------------------
468 {
469 // Delete previous entries in the list
470 Widget child = m_Widgets.m_ScenarioList.GetChildren();
471 while (child)
472 {
473 Widget nextChild = child.GetSibling();
474 m_Widgets.m_ScenarioList.RemoveChild(child);
475 child = nextChild;
476 }
477 }
478
479 //------------------------------------------------------------------------------------------------
481 protected void ScenarioList_CreateMissionEntries(array<MissionWorkshopItem> scenarios, bool setNewFocus)
482 {
484
485 CreateLines(scenarios, m_Widgets.m_ScenarioList);
486
487 // Set focus on first line
488 Widget firstLine = m_Widgets.m_ScenarioList.GetChildren();
489 if (firstLine && setNewFocus)
490 {
491 // If this is called instantly, it doesn't set new focus when menu is first opened.
492 // Probably because menu opening is handled in event handler of main menu's tile.
493 GetGame().GetCallqueue().CallLater(GetGame().GetWorkspace().SetFocusedWidget, 0, false, firstLine, false);
494 }
495
496 // Reset scroll position
497 m_Widgets.m_ScenarioScroll.SetSliderPos(0, 0);
498 }
499
500 //------------------------------------------------------------------------------------------------
502 protected void OnSearchConfirm(SCR_EditBoxComponent comp, string newValue)
503 {
504 UpdateScenarioList(false);
505
506 //SCR_AnalyticsApplication.GetInstance().ScenariosUseSearch();
507 }
508
509 //------------------------------------------------------------------------------------------------
512 {
513 UpdateScenarioList(false);
514
515 //SCR_AnalyticsApplication.GetInstance().ScenariosSetSorting(sortHeader.GetSortElementName());
516 }
517
518 // ---- PUBLIC ----
519 //------------------------------------------------------------------------------------------------
520 void SetPanelsMode(bool showEmptyPanel, string messagePresetTag = string.Empty)
521 {
522 // Show either main+filter panel or empty panel
523 m_Widgets.m_EmptyPanel.SetVisible(showEmptyPanel);
524 m_Widgets.m_FilterPanel.SetVisible(!showEmptyPanel);
525 m_Widgets.m_LeftPanel.SetVisible(!showEmptyPanel);
526
527 // Show message or hide it
528 m_Widgets.m_EmptyPanelMessage.SetVisible(!messagePresetTag.IsEmpty());
529 m_Widgets.m_MainPanelMessage.SetVisible(!messagePresetTag.IsEmpty());
530
531 // Set message based on tag
532 if (!messagePresetTag.IsEmpty())
533 {
534 if (showEmptyPanel)
535 m_Widgets.m_EmptyPanelMessageComponent.SetContentFromPreset(messagePresetTag);
536 else
537 m_Widgets.m_MainPanelMessageComponent.SetContentFromPreset(messagePresetTag);
538 }
539
540 // Items Found Message
541 m_Widgets.m_FilterPanelComponent.SetItemsFoundMessage(m_iEntriesCurrent, m_iEntriesTotal, m_iEntriesCurrent != m_iEntriesTotal);
542 }
543
544 //------------------------------------------------------------------------------------------------
545 array<MissionWorkshopItem> SearchScenarios(array<MissionWorkshopItem> scenarios, string searchStr)
546 {
547 array<MissionWorkshopItem> scenariosOut = {};
548
549 if (!searchStr.IsEmpty())
550 {
551 string searchStrLower = searchStr;
552 searchStrLower.ToLower();
553 foreach (MissionWorkshopItem scenario : scenarios)
554 {
555 // Name
556 if (SearchStringLocalized(scenario.Name(), searchStrLower))
557 {
558 scenariosOut.Insert(scenario);
559 continue;
560 }
561
562 // Description
563 if (SearchStringLocalized(scenario.Description(), searchStrLower))
564 {
565 scenariosOut.Insert(scenario);
566 continue;
567 }
568 }
569 }
570 else
571 {
572 scenariosOut.Copy(scenarios);
573 }
574
575 return scenariosOut;
576 }
577}
578
579// Classes to compare mission headers
580// Sort by name
581class SCR_CompareMissionName : SCR_SortCompare<MissionWorkshopItem>
582{
583 //------------------------------------------------------------------------------------------------
584 override static int Compare(MissionWorkshopItem left, MissionWorkshopItem right)
585 {
586 string name1 = ResolveName(left.Name());
587 string name2 = ResolveName(right.Name());
588
589 if (name1.Compare(name2) == -1)
590 return 1;
591 else
592 return 0;
593 }
594
595 //------------------------------------------------------------------------------------------------
596 static string ResolveName(string name)
597 {
598 if (name.StartsWith("#"))
599 return WidgetManager.Translate(name);
600 else
601 return name;
602 }
603}
604
605// Sort by name
606class SCR_CompareMissionAddonName : SCR_SortCompare<MissionWorkshopItem>
607{
608 //------------------------------------------------------------------------------------------------
609 override static int Compare(MissionWorkshopItem left, MissionWorkshopItem right)
610 {
611 WorkshopItem ownerItem = left.GetOwner();
612
613 string name1 = ResolveAddonName(left);
614 string name2 = ResolveAddonName(right);
615
616 if (name1.Compare(name2) == -1)
617 return 1;
618 else
619 return 0;
620 }
621
622 //------------------------------------------------------------------------------------------------
623 static string ResolveAddonName(MissionWorkshopItem scenario)
624 {
625 WorkshopItem sourceAddon = scenario.GetOwner();
626 if (!sourceAddon)
627 return WidgetManager.Translate("#AR-Editor_Attribute_OverlayLogo_Reforger");
628 else
629 return sourceAddon.Name();
630 }
631}
632
633// Sort by player count
634class SCR_CompareMissionPlayerCount : SCR_SortCompare<MissionWorkshopItem>
635{
636 //------------------------------------------------------------------------------------------------
637 override static int Compare(MissionWorkshopItem left, MissionWorkshopItem right)
638 {
639 return left.GetPlayerCount() < right.GetPlayerCount();
640 }
641}
642
643// Sort by favouriteness
644class SCR_CompareMissionFavourite : SCR_SortCompare<MissionWorkshopItem>
645{
646 //------------------------------------------------------------------------------------------------
647 override static int Compare(MissionWorkshopItem left, MissionWorkshopItem right)
648 {
649 return right.IsFavorite();
650 }
651}
652
653// Sort by time since last played
654class SCR_CompareMissionTimeSinceLastPlay : SCR_SortCompare<MissionWorkshopItem>
655{
656 //------------------------------------------------------------------------------------------------
657 override static int Compare(MissionWorkshopItem left, MissionWorkshopItem right)
658 {
659 int timeLeft = left.GetTimeSinceLastPlay();
660 if (timeLeft < 0) // Negative value means we have never played this.
661 timeLeft = 0x7FFFFFFF; // We set it to max positive int for sorting purpuse.
662 int timeRight = right.GetTimeSinceLastPlay();
663 if (timeRight < 0)
664 timeRight = 0x7FFFFFFF;
665
666 return timeLeft < timeRight;
667 }
668}
ChimeraMenuPreset
Menu presets.
ArmaReforgerScripted GetGame()
Definition game.c:1398
WorkshopApi m_WorkshopApi
void UpdateNavigationButtons()
const string MESSAGE_TAG_NOTHING_FOUND
void OnSortingHeaderChange(SCR_SortHeaderComponent sortHeader)
Called when sorting header changes.
void SetPanelsMode(bool showEmptyPanel, bool forceFiltersList=false, string messagePresetTag=string.Empty, bool animateFiltersList=false)
ResourceName m_sSaveLineLayout
void OnSearchConfirm(SCR_EditBoxComponent comp, string newValue)
Called when user confirms the value in the seacrh string.
override void OnScenarioStateChanged(SCR_ContentBrowser_ScenarioLineComponent comp)
Called from scenario line component when scenario state changes.
const string MESSAGE_TAG_NOTHING_FOUND_2
const string MESSAGE_TAG_NOTHING_FAVOURITE
const int RECENTLY_PLAYED_MAX_ENTRIES
const string MESSAGE_TAG_NOTHING_FAVOURITE_2
override bool Continue(MissionWorkshopItem scenario)
const string MESSAGE_TAG_NO_SAVE_FOUND
const string MESSAGE_TAG_NO_SAVE
void ScenarioList_CreateMissionEntries(array< MissionWorkshopItem > scenarios, bool setNewFocus)
Creates lines for missions in the scroll view.
void ScenarioList_ClearMissionEntries()
bool ScenarioEmptyMessage(array< MissionWorkshopItem > mission, string messageTag)
const string MESSAGE_TAG_NOTHING_RECENT_2
override void OnRestartConfirmed()
void UpdateScenarioList(bool setNewFocus)
Requests missions from API and shows them in the list.
array< MissionWorkshopItem > SearchScenarios(array< MissionWorkshopItem > scenarios, string searchStr)
override void OnScenariosLoadFailed()
const string MESSAGE_TAG_NOTHING_RECENT
SCR_ContentBrowser_ScenarioLineComponent GetSelectedLine()
SCR_AddonDetailsPanelComponent m_AddonDetailsPanel
SCR_ContentBrowser_ScenarioLineComponent m_LastSelectedLine
SCR_ScenarioDetailsPanelComponent m_ScenarioDetailsPanel
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
void OnMenuFocusGained()
UI layouts Menus CleanSweep CleanSweepAreaSelection layout
Widget m_wRoot
void CreateLine(notnull Widget rootW, bool drawStart=false)
ref SCR_HeaderNavigationWidgets m_Widgets
override void OnMenuHide()
override void OnTabHide()
override void OnTabShow()
override void OnTabCreate(Widget menuRoot, ResourceName buttonsLayout, int index)
void CreateLines(Widget w)
SCR_VONRadialDisplay Compare
EWeaponGroupFireMode m_eMode
SCR_WorkshopItem GetItem(string id)
static SCR_AddonManager GetInstance()
WorkshopItem GetWorkshopItem()
Use these only if absoulutely necessary to intarract with game API.
Workshop Item instance.
bool Play()
Start playing the animation. Call 'Prepare' first if you need to change the setup of a component!
SCR_FieldOfViewSettings Attribute