Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_ServerConfigListComponent.c
Go to the documentation of this file.
1
4
6{
7 protected const string NAME_ENTRY = "name";
8 protected const string FILE_NAME_ENTRY = "fileName";
9 protected const string SCENARIO_SELECTION_ENTRY = "scenarioId";
10 protected const string SCENARIO_MOD_SELECTION_ENTRY = "scenarioModId";
11 protected const string PLAYER_LIMIT_ENTRY = "maxPlayers";
12 protected const string JOIN_QUEUE_MAX_SIZE = "joinQueueMaxSize";
13 protected const string BATTLEYE = "battlEye";
14 protected const string CROSSPLAY = "crossPlatform";
15 protected const string SIMPLE_PORT = "publicPortSimple";
16
17 // Properties content
18 protected const string SERVER_NAME_BASE = "%1 %2";
19 protected const string FILE_NAME_BASE = "Config_%1";
20
21 protected const string CHAR_BLACK_LIST = "<>:\/\|?*.";
22
29
30 protected SCR_WidgetListEntrySlider m_PlayerListSlider;
31 protected SCR_WidgetListEntrySlider m_JoinQueueSizeSlider;
32
33 protected bool m_bNameEdited;
34 protected bool m_bFileNameEdited;
35
36 // Mod + scenarios that mod is overriding
37 protected ref array<ref SCR_ScenarioSources> m_aScenarioSources = {};
38
39 // Invokers
42
43 //------------------------------------------------------------------------------------------------
51
52 //------------------------------------------------------------------------------------------------
60
61 //-------------------------------------------------------------------------------------------
62 // Overridden widget API
63 //-------------------------------------------------------------------------------------------
64
65 //-------------------------------------------------------------------------------------------
66 override void HandlerAttached(Widget w)
67 {
68 super.HandlerAttached(w);
69
70 if (GetGame().InPlayMode())
72
74 }
75
76 //-------------------------------------------------------------------------------------------
77 // Protected
78 //-------------------------------------------------------------------------------------------
79
80 //-------------------------------------------------------------------------------------------
82 protected void FillScenarios()
83 {
84 // Find widgets
86
88
90
92
93 m_PlayerListSlider = SCR_WidgetListEntrySlider.Cast(FindEntry(PLAYER_LIMIT_ENTRY));
94 m_JoinQueueSizeSlider = SCR_WidgetListEntrySlider.Cast(FindEntry(JOIN_QUEUE_MAX_SIZE));
95
97
99
100 // Setup names
101 if (m_NameEdit)
102 m_NameEdit.GetEditBoxComponent().m_OnChanged.Insert(OnNameChanged);
103
104 // Simple port
106 m_SimplePortEdit.GetEditBoxComponent().m_OnWriteModeLeave.Insert(OnSimplePortChanged);
107
108 // Scenarios
109 if (!m_ScenarioSelect)
110 return;
111
112 // Fill scenario sources
114
115 // Fill scenario options
116 array<ref SCR_LocalizedProperty> options = {};
117
118 foreach (SCR_ScenarioSources source : m_aScenarioSources)
119 {
120 MissionWorkshopItem scenario = source.m_Scenario;
121 if (!scenario)
122 return;
123
124 SCR_LocalizedProperty scenarioOption = new SCR_LocalizedProperty(scenario.Name(), scenario.Id());
125 options.Insert(scenarioOption);
126 }
127
128 m_ScenarioSelect.SetOptions(options);
129
130 // Callback
131 m_ScenarioSelect.GetSelectionComponent().m_OnChanged.Insert(OnSelectScenario);
132
133 // Select default scenario
135
136 // Platform specific setup
137 ConsoleSetup();
138 }
139
140 //-------------------------------------------------------------------------------------------
141 protected void FillScenarioSources()
142 {
143 // Add scenarios and sources to map
144 foreach (MissionWorkshopItem mission : GetDefaultScenarios())
145 {
146 InsertScenarioToMap(mission, mission.GetOwner());
147 }
148
149 foreach (MissionWorkshopItem mission : GetModdedScenarios())
150 {
151 InsertScenarioToMap(mission, mission.GetOwner());
152 }
153 }
154
155 //------------------------------------------------------------------------------------------------
158 protected void InsertScenarioToMap(MissionWorkshopItem scenario, WorkshopItem modOwner)
159 {
160 // Scenario id is in map - there stil could be repeating names
161 int scenarioIndex = -1;
162
163 foreach (int i, SCR_ScenarioSources source : m_aScenarioSources)
164 {
165 MissionWorkshopItem mission = source.m_Scenario;
166
167 // Scenario structure - label: name, propertyName: id
168 if (mission && scenario.Id() == mission.Id())
169 {
170 scenarioIndex = i;
171 break;
172 }
173 }
174
175 // Scenario is in map
176 if (scenarioIndex != -1) // Add source to existing scenario
177 m_aScenarioSources[scenarioIndex].m_aMods.Insert(modOwner);
178 else // Add new
179 m_aScenarioSources.Insert(new SCR_ScenarioSources(scenario, {modOwner}));
180 }
181
182 //-------------------------------------------------------------------------------------------
183 protected int GetScenarioIndexById(string scenarioId)
184 {
185 array<ref SCR_LocalizedProperty> entries = {};
186 m_ScenarioSelect.GetOptions(entries);
187
188 foreach (int i, SCR_LocalizedProperty entry : entries)
189 {
190 // Property name = scenario id
191 if (entry.m_sPropertyName == scenarioId)
192 return i;
193 }
194
195 // Fallback
196 return 0;
197 }
198
199 //-------------------------------------------------------------------------------------------
201 protected void ConsoleSetup()
202 {
203 // Check platform
205 return;
206
207 // Default values
208 m_BattleyeSelect.SetValue("0");
209 m_CrossplaySelect.SetValue("1");
210
211 // Hide limited on consoles
212 m_BattleyeSelect.GetEntryRoot().SetVisible(false);
213 m_CrossplaySelect.GetEntryRoot().SetVisible(false);
214 }
215
216 //-------------------------------------------------------------------------------------------
217 // Public
218 //-------------------------------------------------------------------------------------------
220 {
221 if (!m_ScenarioSelect)
222 return;
223
224 array<MissionWorkshopItem> defaultMissions = GetDefaultScenarios();
225 if (!defaultMissions.IsEmpty())
226 SelectScenario(defaultMissions[0]);
227 }
228
229 //-------------------------------------------------------------------------------------------
230 void SelectScenario(notnull MissionWorkshopItem scenario)
231 {
232 if (!m_ScenarioSelect)
233 return;
234
235 int selected = GetScenarioIndexById(scenario.Id());
236
237 m_ScenarioSelect.SelectOption(selected);
238 OnSelectScenario(SCR_ComboBoxComponent.Cast(m_ScenarioSelect.GetSelectionComponent()), selected);
239 }
240
241 //-------------------------------------------------------------------------------------------
243 {
244 if (!m_ScenarioSelect)
245 return null;
246
247 array<MissionWorkshopItem> missionItemsAll = {};
248 GetGame().GetBackendApi().GetWorkshop().GetPageScenarios(missionItemsAll, 0, SCR_WorkshopUiCommon.PAGE_SCENARIOS);
249
250 foreach (MissionWorkshopItem scenario : missionItemsAll)
251 {
252 SCR_LocalizedProperty selected = m_ScenarioSelect.GetSelectedOption();
253 string name = selected.m_sPropertyName;
254
255 if (scenario.Id() == name)
256 return scenario;
257 }
258
259 return null;
260 }
261
262 //-------------------------------------------------------------------------------------------
265 {
266 if (!m_ScenarioSelect)
267 return null;
268
269 array<MissionWorkshopItem> missionItemsAll = {};
270 GetGame().GetBackendApi().GetWorkshop().GetPageScenarios(missionItemsAll, 0, SCR_WorkshopUiCommon.PAGE_SCENARIOS);
271
272 // Check current selection
273 SCR_LocalizedProperty property = m_ScenarioModSelect.GetSelectedOption();
274
275 if (!property)
276 return null;
277
278 // Select owner mod
279 foreach (MissionWorkshopItem scenario : missionItemsAll)
280 {
281 WorkshopItem ownerItem = scenario.GetOwner();
282 if (!ownerItem)
283 continue;
284
285 if (ownerItem.Id() == property.m_sPropertyName)
286 return ownerItem;
287 }
288
289 return null;
290 }
291
292 //-------------------------------------------------------------------------------------------
293 // Default Reforger scenarios lack a owner mod
294 array<MissionWorkshopItem> GetDefaultScenarios()
295 {
296 array<MissionWorkshopItem> allMissions = {};
297 GetGame().GetBackendApi().GetWorkshop().GetPageScenarios(allMissions, 0, SCR_WorkshopUiCommon.PAGE_SCENARIOS);
298
299 array<MissionWorkshopItem> defaultMissions = {};
300 foreach (MissionWorkshopItem mission : allMissions)
301 {
302 if (!mission.GetOwner() && SCR_ScenarioUICommon.IsMultiplayer(mission))
303 defaultMissions.Insert(mission);
304 }
305
306 // Order scenarios alphabetically
307 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionName>.HeapSort(defaultMissions);
308 return defaultMissions;
309 }
310
311 //-------------------------------------------------------------------------------------------
312 array<MissionWorkshopItem> GetModdedScenarios()
313 {
314 // Get all scenarios
315 array<MissionWorkshopItem> allMissions = {};
316 GetGame().GetBackendApi().GetWorkshop().GetPageScenarios(allMissions, 0, SCR_WorkshopUiCommon.PAGE_SCENARIOS);
317
318 // Filter scenarios
319 array<MissionWorkshopItem> missions = {};
320
321 foreach (MissionWorkshopItem mission : allMissions)
322 {
323 // Exclude default and single player scenarios
324 if (!mission.GetOwner() || !SCR_ScenarioUICommon.IsMultiplayer(mission))
325 continue;
326
327 // Exclude scenarios coming from incompatible addon
328 if (SCR_AddonManager.ItemAvailability(mission.GetOwner()) != SCR_ERevisionAvailability.ERA_AVAILABLE)
329 continue;
330
331 // Exclude unhostable scenarios (hacky, as it includes connection issues unrelated to the scenario)
332 if (!SCR_ScenarioUICommon.CanHost(mission))
333 continue;
334
335 // Exclude broken mod scenarios
336 SCR_WorkshopItem item = SCR_AddonManager.GetInstance().Register(mission.GetOwner());
337 if (item && item.GetAnyDependencyMissing() || item.GetCorrupted())
338 continue;
339
340 missions.Insert(mission);
341 }
342
343 // Order scenarios alphabetically
344 SCR_Sorting<MissionWorkshopItem, SCR_CompareMissionName>.HeapSort(missions);
345 return missions;
346 }
347
348 //-------------------------------------------------------------------------------------------
350 void FillFromDSConfig(notnull SCR_DSConfig config)
351 {
352 // Game
353 FindEntry("name").SetValue(config.game.name);
354 FindEntry("maxPlayers").SetValue(config.game.maxPlayers.ToString());
355 FindEntry("password").SetValue(config.game.password);
356 FindEntry("passwordAdmin").SetValue(config.game.passwordAdmin);
357 FindEntry("visible").SetValue(SCR_JsonApiStructHandler.BoolToString(config.game.visible));
358 FindEntry("crossPlatform").SetValue(SCR_JsonApiStructHandler.BoolToString(config.game.crossPlatform));
359
360 // Game properties
361 SCR_DSGameProperties gamePropertiesSCr = SCR_DSGameProperties.Cast(config.game.gameProperties);
362
363 if (gamePropertiesSCr)
364 {
365 FindEntry("battlEye").SetValue(SCR_JsonApiStructHandler.BoolToString(gamePropertiesSCr.battlEye));
366 FindEntry("disableThirdPerson").SetValue(SCR_JsonApiStructHandler.BoolToString(gamePropertiesSCr.disableThirdPerson));
367 FindEntry("VONDisableUI").SetValue(SCR_JsonApiStructHandler.BoolToString(gamePropertiesSCr.VONDisableUI));
368 FindEntry("VONDisableDirectSpeechUI").SetValue(SCR_JsonApiStructHandler.BoolToString(gamePropertiesSCr.VONDisableDirectSpeechUI));
369 FindEntry("VONCanTransmitCrossFaction").SetValue(SCR_JsonApiStructHandler.BoolToString(gamePropertiesSCr.VONCanTransmitCrossFaction));
370 FindEntry("serverMaxViewDistance").SetValue(gamePropertiesSCr.serverMaxViewDistance.ToString());
371 FindEntry("networkViewDistance").SetValue(gamePropertiesSCr.networkViewDistance.ToString());
372 FindEntry("serverMinGrassDistance").SetValue(gamePropertiesSCr.serverMinGrassDistance.ToString());
373 }
374
375 // Scenario
376 int index = GetScenarioIndexById(config.game.scenarioId);
377
378 m_ScenarioSelect.SelectOption(index);
379 OnSelectScenario(SCR_ComboBoxComponent.Cast(m_ScenarioSelect.GetSelectionComponent()), index);
380 }
381
382 //-------------------------------------------------------------------------------------------
384 void ScrollToTheEntry(notnull Widget w)
385 {
386 // Entry position
387 float entryX, entryY;
388 w.GetScreenPos(entryX, entryY);
389
390 // Vertical list size
391 float listW, listH;
392 m_wList.GetScreenSize(listW, listH);
393
394 // Vertical list size
395 float listX, listY;
396 m_wList.GetScreenPos(listX, listY);
397
398 // Scroll (view) size
399 float scrollW, scrollH;
400 m_wScrollWidget.GetScreenSize(scrollW, scrollH);
401
402 // Scroll to entry
403 float outView = listH - scrollH; // What size can't be seen
404 float relPos = entryY - listY;
405
406 float pos = 1 - (outView - relPos) / outView;
407 m_wScrollWidget.SetSliderPos(0, pos);
408 }
409
410 //------------------------------------------------------------------------------------------------
411 void SetPort(string port)
412 {
413 m_SimplePortEdit.SetValue(port);
414 }
415
416 //-------------------------------------------------------------------------------------------
417 // Callbacks
418 //-------------------------------------------------------------------------------------------
419
420 //-------------------------------------------------------------------------------------------
421 protected void OnNameChanged(SCR_EditBoxComponent edit, string text)
422 {
423 m_bNameEdited = !text.IsEmpty();
424 }
425
426 //-------------------------------------------------------------------------------------------
427 protected void OnSimplePortChanged(string text)
428 {
429 if (m_OnPortChanged)
430 m_OnPortChanged.Invoke(m_SimplePortEdit.ValueAsString());
431 }
432
433 //-------------------------------------------------------------------------------------------
434 protected void OnFileNameChanged(SCR_EditBoxComponent edit, string text)
435 {
436 m_bFileNameEdited = !text.IsEmpty();
437 }
438
439 //-------------------------------------------------------------------------------------------
440 protected void OnSelectScenario(SCR_ComboBoxComponent comboBox, int selected)
441 {
443 return;
444
445 array<ref SCR_LocalizedProperty> ownerMods = {};
446
447 int count = 0;
448
449 if (m_aScenarioSources[selected].m_aMods)
450 count = m_aScenarioSources[selected].m_aMods.Count();
451
452 for (int i = 0; i < count; i++)
453 {
454 WorkshopItem mod = m_aScenarioSources[selected].m_aMods[i];
455 if (!mod)
456 continue;
457
458 string name = m_aScenarioSources[selected].m_aMods[i].Name();
459 string id = m_aScenarioSources[selected].m_aMods[i].Id();
460
461 ownerMods.Insert(new SCR_LocalizedProperty(name, id));
462 }
463
464 // Is vanilla?
465 if (!ownerMods || ownerMods.IsEmpty() || ownerMods[0] == null)
466 {
467 // Display source mod as Arma Reforger
468 ownerMods.Clear();
469 ownerMods.Insert(new SCR_LocalizedProperty("#AR-Editor_Attribute_OverlayLogo_Reforger", ""));
470 }
471
472 m_ScenarioModSelect.SetOptions(ownerMods);
473 m_ScenarioModSelect.SelectOption(0);
474
475 // Enable selection interactivity only if scenario has multiple sources
476 m_ScenarioModSelect.SetInteractive(ownerMods.Count() > 1);
477
478 // Update properties
480
481 if (!m_bNameEdited)
482 GenerateName(scenario);
483
485 GenerateFileName(scenario);
486
487 SetupPlayerLimit(scenario.GetPlayerCount());
488
490 m_OnScenarioSelected.Invoke(scenario);
491 }
492
493 //-------------------------------------------------------------------------------------------
495 protected void GenerateName(notnull MissionWorkshopItem scenario)
496 {
497 if (!m_NameEdit)
498 return;
499
500 string name = string.Format(SERVER_NAME_BASE, SCR_Global.GetProfileName(), scenario.Name());
501
502 m_NameEdit.SetValue(name);
503 m_NameEdit.ClearInvalidInput();
504 }
505
506 //-------------------------------------------------------------------------------------------
508 string GenerateFileName(notnull MissionWorkshopItem scenario)
509 {
510 string scenarioTranslation = WidgetManager.Translate(scenario.Name());
511 string fileName = string.Format(FILE_NAME_BASE, scenarioTranslation);
512 fileName.Replace(" ", "");
513
514 // Remove special characters
515 for (int i = 0, count = CHAR_BLACK_LIST.Length(); i < count; i++)
516 {
517 fileName.Replace(CHAR_BLACK_LIST[i], "");
518 }
519
520 return fileName;
521 }
522
523 //-------------------------------------------------------------------------------------------
524 protected void SetupPlayerLimit(int limit)
525 {
527 return;
528
529 m_PlayerListSlider.SetRange(1, limit);
530
531 // Set value
532 int value = m_PlayerListSlider.ValueAsString().ToInt();
533
534 if (value > limit)
535 m_PlayerListSlider.SetValue(limit.ToString());
536 }
537}
538
540//-------------------------------------------------------------------------------------------
542{
544
545 ref array<WorkshopItem> m_aMods;
546
547 void SCR_ScenarioSources(MissionWorkshopItem scenario, array<WorkshopItem> mods)
548 {
549 m_Scenario = scenario;
550 m_aMods = mods;
551 }
552}
553
SCR_ExitGameWhileDownloadingDialog m_Scenario
bool IsPlatformGameConsole()
Definition game.c:1357
ArmaReforgerScripted GetGame()
Definition game.c:1398
void SCR_DSGameProperties()
SCR_DestructionSynchronizationComponentClass ScriptComponentClass int index
ScriptInvokerBase< ScriptInvokerStringMethod > ScriptInvokerString
void SCR_ScenarioSources(MissionWorkshopItem scenario, array< WorkshopItem > mods)
ref array< WorkshopItem > m_aMods
ScriptInvokerBase< ScriptInvokerMissionWorkshopItemMethod > ScriptInvokerMissionWorkshopItem
SCR_WorkshopItem Register(WorkshopItem item)
Returns a SCR_WorkshopItem. If it's not registered, creates a new one and registers it.
static SCR_ERevisionAvailability ItemAvailability(notnull WorkshopItem item)
static SCR_AddonManager GetInstance()
SCR_WidgetListEntry FindEntry(string propertyName, string groupTag="")
Find variable of given property name and group tag - no group tag find any variable of given property...
Handler for json api struct values.
static string BoolToString(bool boolean)
Variable that is using localized label.
static bool IsMultiplayer(MissionWorkshopItem mission)
static bool CanHost(MissionWorkshopItem mission)
ref array< ref SCR_ScenarioSources > m_aScenarioSources
array< MissionWorkshopItem > GetModdedScenarios()
void FillScenarios()
Fill scenario selection with list of available scenarios.
ScriptInvokerMissionWorkshopItem GetOnScenarioSelected()
void OnSelectScenario(SCR_ComboBoxComponent comboBox, int selected)
void SelectScenario(notnull MissionWorkshopItem scenario)
void OnNameChanged(SCR_EditBoxComponent edit, string text)
SCR_WidgetListEntrySelection m_ScenarioModSelect
void FillFromDSConfig(notnull SCR_DSConfig config)
Fill all entries with values from given DS config.
SCR_WidgetListEntrySelection m_BattleyeSelect
string GenerateFileName(notnull MissionWorkshopItem scenario)
Generate server name to the name editbox in case name wasn't edited.
void OnFileNameChanged(SCR_EditBoxComponent edit, string text)
SCR_WidgetListEntryEditBox m_SimplePortEdit
WorkshopItem GetScenarioOwnerMod()
Return currently selected scenario owner mod as workshop item.
void GenerateName(notnull MissionWorkshopItem scenario)
Generate server name to the name editbox in case name wasn't edited.
SCR_WidgetListEntrySelection m_CrossplaySelect
void ScrollToTheEntry(notnull Widget w)
Scroll to the selected entry.
void ConsoleSetup()
Apply console specific properties.
SCR_WidgetListEntrySlider m_JoinQueueSizeSlider
void InsertScenarioToMap(MissionWorkshopItem scenario, WorkshopItem modOwner)
SCR_WidgetListEntrySelection m_ScenarioSelect
array< MissionWorkshopItem > GetDefaultScenarios()
ref ScriptInvokerMissionWorkshopItem m_OnScenarioSelected
Configurable widget list entry for various value that can be typed - numbers, strings,...
void SetValue(string str)
Configurable widget list entry list selection.
Workshop Item instance.