Arma Reforger Explorer 1.7.0.54
Arma Reforger Code Explorer by Zeroy - Thanks to MisterOutofTime
Loading...
Searching...
No Matches
SCR_AnalyticsApplication.c
Go to the documentation of this file.
3{
4 HORIZONTAL, // weapons, quick slots
5 VERTICAL, // helmet, vest, bag, t-shirt, trausers, etc.
6 CHARACTER_STORAGE, // actual items in vests, trausers, etc.
7 VICINITY, // loot
9}
10
11/*
12[EnumLinear()]
13enum SCR_EAnalyticsWorkshopTab
14{
15 MODS,
16 MAKE_ARMA_NOT_WAR,
17 GAME_SAVES,
18 DOWNLOADED,
19 MOD_MANAGER
20}
21
22[EnumBitFlag()]
23enum SCR_EAnalyticsApplicationLoggingFlags
24{
25 CONSOLE,
26 FILE,
27 API
28}
29
30[EnumLinear()]
31enum SCR_EAnalyticsDataTable
32{
33 APPLICATION,
34 PLAYER,
35 SESSION,
36 MOD
37}
38
39enum SCR_EAnalyticsCourseEndReason : SCR_ETutorialBreakType
40{
41 COMPLETED
42}
43
44class SCR_AnalyticsApplication : WorldSystem
45{
47 protected static const string ANALYTICAL_EVENT_SETTINGS_CLOSED = "settingsClosed";
48 protected ref SCR_SettingsTimeSpentData m_SettingsData = new SCR_SettingsTimeSpentData();
49 protected ref SCR_AnalyticsSettings m_SettingsInteractions = new SCR_AnalyticsSettings();
50
52 protected static const string ANALYTICAL_EVENT_SCENARIOS_MENU_CLOSE = "scenariosMenuClosed";
53 protected ref SCR_MenuInteractedData m_ScenariosData = new SCR_MenuInteractedData();
54 protected ref SCR_AnalyticsInteractions m_ScenariosInteractions = new SCR_AnalyticsInteractions();
55
57 protected static const string ANALYTICAL_EVENT_WORKSHOP_CLOSED = "workshopMenuClosed";
58 protected ref SCR_MenuInteractedData m_WorkshopData = new SCR_MenuInteractedData();
59 protected ref SCR_AnalyticsInteractions m_WorkshopInteractions = new SCR_AnalyticsInteractions();
60
61 // Mod Details
62 protected static const string ANALYTICAL_EVENT_MOD_CLOSED = "modMenuClosed";
63 protected ref SCR_MenuInteractedData m_ModData = new SCR_MenuInteractedData();
64 protected ref SCR_AnalyticsInteractions m_ModInteractions = new SCR_AnalyticsInteractions();
65
67 protected static const string ANALYTICAL_EVENT_PLAY_MENU_CLOSED = "playMenuClosed";
68 protected ref SCR_AnalyticsInteractions m_PlayMenuInteractions = new SCR_AnalyticsInteractions();
69 protected ref SCR_MenuTimeSpentData m_PlayMenuData = new SCR_MenuTimeSpentData();
70
72 protected static const string ANALYTICAL_EVENT_MULTIPLAYER_MENU_CLOSED = "multiplayerMenuClosed";
73 protected ref SCR_MenuInteractedData m_MultiplayerMenuData = new SCR_MenuInteractedData();
74 protected ref SCR_AnalyticsInteractions m_MultiplayerMenuInteractions = new SCR_AnalyticsInteractions();
75
77 protected static const string MANUAL_LOCATION_GAME = "Game";
78 protected static const string MANUAL_LOCATION_MAIN_MENU = "Main Menu";
79 protected static const string ANALYTICAL_EVENT_FIELD_MANUAL_CLOSED = "manualClosed";
80 protected ref SCR_AnalyticsInteractions m_FieldManualInteractions = new SCR_AnalyticsInteractions();
81 protected ref SCR_FieldManualTimeSpentData m_FieldManualData = new SCR_FieldManualTimeSpentData();
82
84 protected static const string ANALYTICAL_EVENT_INVENTORY_CLOSED = "inventoryClosed";
85 protected ref SCR_AnalyticsInventory m_Inventory = new SCR_AnalyticsInventory();
86 protected ref SCR_InventoryData m_InventoryData = new SCR_InventoryData();
87 protected SCR_EAnalyticalItemSlotType m_eLastInteractedStorage = SCR_EAnalyticalItemSlotType.OTHER;
88 protected int m_iLastInteractedSlotId = 0;
89 protected ResourceName m_sLastInteractedResource = "";
90 protected static const ref array<EMenuAction> MOVING_MENU_ACTIONS
91 = { EMenuAction.ACTION_MOVEBETWEEN, EMenuAction.ACTION_DRAGGED, EMenuAction.ACTION_DROPPED, EMenuAction.ACTION_MOVEINSIDE };
92
94 protected static const string ANALYTICAL_EVENT_VOTE_ENDS = "voteEnd";
95 protected ref SCR_VotingResultData m_VotingData = new SCR_VotingResultData();
96
97 // MOB Selections
98 protected ref SCR_MOBSelectedData m_MOBData = new SCR_MOBSelectedData();
99 protected static const string ANALYTICAL_EVENT_MOB_SELECTED = "MOBsSelected";
100
102 protected static const string ANALYTICAL_EVENT_COURSE_ENDS = "courseEnd";
103 protected ref SCR_CourseEndData m_CourseData = new SCR_CourseEndData();
104 protected ref SCR_AnalyticsTimer m_CourseTimer = new SCR_AnalyticsTimer();
105 protected SCR_ETutorialCourses m_StartedCourse = 0;
106
108 protected SCR_EAnalyticsApplicationLoggingFlags m_Logging
109 = SCR_EAnalyticsApplicationLoggingFlags.CONSOLE
110 | SCR_EAnalyticsApplicationLoggingFlags.API;
111
114 protected static const int LOCAL_PLAYER_ID = 8888;
115
117
118 //------------------------------------------------------------------------------------------------
122 void OpenPlayMenu()
123 {
124 m_PlayMenuInteractions.Start();
125 }
126
127 //------------------------------------------------------------------------------------------------
130 void ClosePlayMenu()
131 {
132 m_PlayMenuInteractions.Close();
133 }
134
136
137 //------------------------------------------------------------------------------------------------
141 void OpenFieldManual()
142 {
143 m_FieldManualInteractions.Start();
144 }
145
146 //------------------------------------------------------------------------------------------------
149 void CloseFieldManual()
150 {
151 m_FieldManualInteractions.Close();
152 }
153
155
156 //------------------------------------------------------------------------------------------------
160 void OpenSettings()
161 {
162 m_SettingsInteractions.Start();
163 }
164
165 //------------------------------------------------------------------------------------------------
168 void CloseSettings()
169 {
170 m_SettingsData.amt_time_spent = m_SettingsInteractions.GetTimeSpent();
171 m_SettingsData.array_settings_changed = m_SettingsInteractions.GetSettingsChanged();
172 SendAnalyticalEvent(m_SettingsData, ANALYTICAL_EVENT_SETTINGS_CLOSED, SCR_EAnalyticsDataTable.APPLICATION);
173 }
174
175 //------------------------------------------------------------------------------------------------
179 void SetQualityPresetSetting(int index)
180 {
181 m_SettingsInteractions.SetQualityPreset(index);
182 }
183
184 //------------------------------------------------------------------------------------------------
188 void SetHudVisibilitySetting(int index)
189 {
190 m_SettingsInteractions.SetHudVisibility(index);
191 }
192
193 //------------------------------------------------------------------------------------------------
198 void ChangeSetting(string category, string action)
199 {
200 m_SettingsInteractions.ChangeSetting(category, action);
201 }
202
203 //------------------------------------------------------------------------------------------------
207 void ChangeKeybind(string action, string preset)
208 {
209 m_SettingsInteractions.ChangeSetting("Controls", string.Format("%1_%2", action, preset));
210 }
211
212 //------------------------------------------------------------------------------------------------
215 void ResetAllKeybinds()
216 {
217 m_SettingsInteractions.UseResetAllButton();
218 }
219
221
222 //------------------------------------------------------------------------------------------------
226 void OpenMultiplayerMenu()
227 {
228 m_MultiplayerMenuInteractions.Start();
229 }
230
231 //------------------------------------------------------------------------------------------------
234 void CloseMultiplayerMenu()
235 {
236 m_MultiplayerMenuInteractions.Close();
237 }
238
239 //------------------------------------------------------------------------------------------------
243 void MultiplayerMenuSetTab(SCR_EServerBrowserTabs tab)
244 {
245 m_MultiplayerMenuInteractions.SetTab(typename.EnumToString(SCR_EServerBrowserTabs, tab));
246 }
247
248 //------------------------------------------------------------------------------------------------
252 void MultiplayerMenuSetSorting(string sorting)
253 {
254 m_MultiplayerMenuInteractions.SetSorting(sorting);
255 }
256
257 //------------------------------------------------------------------------------------------------
262 void MultiplayerMenuSetFilter(string filterCategory, string filterName)
263 {
264 m_MultiplayerMenuInteractions.SetFilter(filterCategory, filterName);
265 }
266
267 //------------------------------------------------------------------------------------------------
270 void MultiplayerMenuUseSearch()
271 {
272 m_MultiplayerMenuInteractions.UseSearch();
273 }
274
275 //------------------------------------------------------------------------------------------------
278 void MultiplayerMenuUseFavorite()
279 {
280 m_MultiplayerMenuInteractions.UseFavorite();
281 }
282
283 //------------------------------------------------------------------------------------------------
286 void MultiplayerMenuUseFilterOn()
287 {
288 m_MultiplayerMenuInteractions.UseFilterOn();
289 }
290
292
293 //------------------------------------------------------------------------------------------------
297 void OpenWorkshop()
298 {
299 m_WorkshopInteractions.Start();
300 }
301
302 //------------------------------------------------------------------------------------------------
305 void CloseWorkshop()
306 {
307 m_WorkshopInteractions.Close();
308 }
309
310 //------------------------------------------------------------------------------------------------
314 void WorkshopSetTab(SCR_EAnalyticsWorkshopTab tab)
315 {
316 m_WorkshopInteractions.SetTab(typename.EnumToString(SCR_EAnalyticsWorkshopTab, tab));
317 }
318
319 //------------------------------------------------------------------------------------------------
323 void WorkshopSetSorting(string sorting)
324 {
325 m_WorkshopInteractions.SetSorting(sorting);
326 }
327
328 //------------------------------------------------------------------------------------------------
333 void WorkshopSetFilter(string filterCategory, string filterName)
334 {
335 m_WorkshopInteractions.SetFilter(filterCategory, filterName);
336 }
337
338 //------------------------------------------------------------------------------------------------
341 void WorkshopUseSearch()
342 {
343 m_WorkshopInteractions.UseSearch();
344 }
345
346 //------------------------------------------------------------------------------------------------
349 void WorkshopUseFilterOn()
350 {
351 m_WorkshopInteractions.UseFilterOn();
352 }
353
355
356 //------------------------------------------------------------------------------------------------
360 void OpenModDetails()
361 {
362 m_ModInteractions.Start();
363 }
364
365 //------------------------------------------------------------------------------------------------
368 void CloseModDetails()
369 {
370 m_ModInteractions.Close();
371 }
372
373 //------------------------------------------------------------------------------------------------
377 void ModDetailsSetTab(SCR_EModDetailsMenuTabs tab)
378 {
379 m_ModInteractions.SetTab(typename.EnumToString(SCR_EModDetailsMenuTabs, tab));
380 }
381
383
384 //------------------------------------------------------------------------------------------------
388 void OpenScenarios()
389 {
390 m_ScenariosInteractions.Start();
391 }
392
393 //------------------------------------------------------------------------------------------------
396 void CloseScenarios()
397 {
398 m_ScenariosInteractions.Close();
399 }
400
401 //------------------------------------------------------------------------------------------------
405 void ScenariosSetTab(EScenarioSubMenuMode tab)
406 {
407 m_ScenariosInteractions.SetTab(typename.EnumToString(EScenarioSubMenuMode, tab));
408 }
409
410 //------------------------------------------------------------------------------------------------
414 void ScenariosSetSorting(string sorting)
415 {
416 m_ScenariosInteractions.SetSorting(sorting);
417 }
418
419 //------------------------------------------------------------------------------------------------
422 void ScenariosUseSearch()
423 {
424 m_ScenariosInteractions.UseSearch();
425 }
426
428
429 //------------------------------------------------------------------------------------------------
433 void OpenInventory(float currentWeight)
434 {
435 m_Inventory.OpenInventory(currentWeight);
436 }
437
438 //------------------------------------------------------------------------------------------------
442 void CloseInventory(float currentWeight)
443 {
444 m_Inventory.CloseInventory(currentWeight);
445 }
446
447 //------------------------------------------------------------------------------------------------
450 void InteractWithItem(SCR_InventorySlotUI focusedItem, SCR_InventorySlotUI selectedItem, EMenuAction action, bool isUsingGamepad)
451 {
452 // interaction is any move action or item selection on controller
453 bool isInteraction = MOVING_MENU_ACTIONS.Contains(action) || (action == EMenuAction.ACTION_SELECT && isUsingGamepad);
454 if ((!focusedItem && !selectedItem) || !isInteraction)
455 return;
456
457 SCR_InventorySlotUI currentItem;
458 if (focusedItem)
459 currentItem = focusedItem;
460 else
461 currentItem = selectedItem;
462
463 // prevent spamming interactions with the same items
464 if (m_eLastInteractedStorage == currentItem.GetAnalyticalItemSlotType()
465 && m_iLastInteractedSlotId == currentItem.GetStorageUI().GetSlotId(currentItem)
466 && m_sLastInteractedResource == currentItem.GetItemResource())
467 return;
468
469 m_eLastInteractedStorage = currentItem.GetAnalyticalItemSlotType();
470 m_iLastInteractedSlotId = currentItem.GetStorageUI().GetSlotId(currentItem);
471 m_sLastInteractedResource = currentItem.GetItemResource();
472
473 m_Inventory.InteractWithItem(m_eLastInteractedStorage);
474 }
475
476 //------------------------------------------------------------------------------------------------
479 void UseHealingFromInventory()
480 {
481 m_Inventory.UseHealing();
482 }
483
484 //------------------------------------------------------------------------------------------------
487 void UseExaminationFromInventory()
488 {
489 m_Inventory.UseExamination();
490 }
491
493
494 //------------------------------------------------------------------------------------------------
496 void VoteToKickResult(EVotingType voteType, string author_id, string vote_winner_id, bool result)
497 {
498 m_VotingData.vote_type = typename.EnumToString(EVotingType, voteType);
499 m_VotingData.vote_author_id = author_id;
500 m_VotingData.vote_winner_id = vote_winner_id;
501 m_VotingData.flag_vote_success = result;
502 SendAnalyticalEvent(m_VotingData, ANALYTICAL_EVENT_VOTE_ENDS, SCR_EAnalyticsDataTable.SESSION);
503 }
504
505 //------------------------------------------------------------------------------------------------
507 void OnMOBSelected(array<SCR_CampaignMilitaryBaseComponent> selectedHQs)
508 {
509 m_MOBData.MOB_names = "[";
510 m_MOBData.MOB_factions = "[";
511 m_MOBData.MOB_xs = "[";
512 m_MOBData.MOB_ys = "[";
513 m_MOBData.MOB_zs = "[";
514
515 foreach(int i, SCR_CampaignMilitaryBaseComponent selectedHQ : selectedHQs)
516 {
517
518 if(i != 0)
519 {
520 m_MOBData.MOB_names += ", ";
521 m_MOBData.MOB_factions += ", ";
522 m_MOBData.MOB_xs += ", ";
523 m_MOBData.MOB_ys += ", ";
524 m_MOBData.MOB_zs += ", ";
525 }
526
527 m_MOBData.MOB_names += selectedHQ.GetBaseNameUpperCase();
528 m_MOBData.MOB_factions += selectedHQ.GetFaction().GetFactionName();
529 m_MOBData.MOB_xs += selectedHQ.GetOwner().GetOrigin()[0].ToString();
530 m_MOBData.MOB_ys += selectedHQ.GetOwner().GetOrigin()[1].ToString();
531 m_MOBData.MOB_zs += selectedHQ.GetOwner().GetOrigin()[2].ToString();
532
533 PrintString(selectedHQ.GetBaseNameUpperCase());
534 }
535
536 m_MOBData.MOB_names += "]";
537 m_MOBData.MOB_factions += "]";
538 m_MOBData.MOB_xs += "]";
539 m_MOBData.MOB_ys += "]";
540 m_MOBData.MOB_zs += "]";
541
542 // We call this with a delay because the initialization is too early for the server to start
543 GetGame().GetCallqueue().CallLater(SendMOBSessionEvent, 60000, false, m_MOBData); // a minute
544 }
545
546 //------------------------------------------------------------------------------------------------
548 void SendMOBSessionEvent(SCR_MOBSelectedData mobData)
549 {
550 SendAnalyticalEvent(mobData, ANALYTICAL_EVENT_MOB_SELECTED, SCR_EAnalyticsDataTable.SESSION);
551 }
552
554
555 //------------------------------------------------------------------------------------------------
557 void TutorialCourseStarts(SCR_ETutorialCourses course)
558 {
559 m_StartedCourse = course;
560 m_CourseTimer.Start();
561 }
562
563 //------------------------------------------------------------------------------------------------
567 void TutorialCourseEnds(SCR_ETutorialCourses course, SCR_EAnalyticsCourseEndReason reason)
568 {
569 if (course != m_StartedCourse)
570 {
571 Debug.Error(
572 string.Format("Can't send course end to analytics, as course which ended (%1) is not equal to course that was started (%2)!", course, m_StartedCourse)
573 );
574 return;
575 }
576
577 m_StartedCourse = 0; // reset to prevent multiple same sends
578 m_CourseData.amt_time_spent = m_CourseTimer.GetTimeSpent();
579 m_CourseData.amt_course_name = typename.EnumToString(SCR_ETutorialCourses, course);
580 m_CourseData.amt_course_end_reason = typename.EnumToString(SCR_EAnalyticsCourseEndReason, reason);
581 SendAnalyticalEvent(m_CourseData, ANALYTICAL_EVENT_COURSE_ENDS, SCR_EAnalyticsDataTable.PLAYER);
582 }
583
585
586 //------------------------------------------------------------------------------------------------
589 void SetLogging(SCR_EAnalyticsApplicationLoggingFlags logging)
590 {
591 m_Logging = logging;
592 }
593
594 //------------------------------------------------------------------------------------------------
597 SCR_EAnalyticsApplicationLoggingFlags GetLogging()
598 {
599 return m_Logging;
600 }
601
603
604 //------------------------------------------------------------------------------------------------
608 static SCR_AnalyticsApplication GetInstance()
609 {
610 World world = GetGame().GetWorld();
611 if (!world)
612 return null;
613
614 return SCR_AnalyticsApplication.Cast(world.FindSystem(SCR_AnalyticsApplication));
615 }
616
617 //------------------------------------------------------------------------------------------------
619 override static void InitInfo(WorldSystemInfo outInfo)
620 {
621 outInfo.SetAbstract(false);
622 outInfo.SetLocation(WorldSystemLocation.Both);
623 outInfo.AddPoint(WorldSystemPoint.Frame);
624 }
625
626 //------------------------------------------------------------------------------------------------
628 override void OnUpdatePoint(WorldUpdatePointArgs args)
629 {
630 super.OnUpdatePoint(args);
631
632 float deltaSeconds = args.GetTimeSliceSeconds();
633 UpdateData(m_ScenariosInteractions, m_ScenariosData, ANALYTICAL_EVENT_SCENARIOS_MENU_CLOSE, deltaSeconds);
634 UpdateData(m_WorkshopInteractions, m_WorkshopData, ANALYTICAL_EVENT_WORKSHOP_CLOSED, deltaSeconds);
635 UpdateData(m_MultiplayerMenuInteractions, m_MultiplayerMenuData, ANALYTICAL_EVENT_MULTIPLAYER_MENU_CLOSED, deltaSeconds);
636 UpdateData(m_ModInteractions, m_ModData, ANALYTICAL_EVENT_MOD_CLOSED, deltaSeconds);
637 UpdateInventory(deltaSeconds);
638 UpdatePlayMenu(deltaSeconds);
639 UpdateFieldManual(deltaSeconds);
640 }
641
643
644 //------------------------------------------------------------------------------------------------
646 protected void UpdateData(SCR_AnalyticsInteractions interactions, SCR_MenuInteractedData data, string analytical_event, float deltaSeconds)
647 {
648 interactions.Update(deltaSeconds);
649 if (interactions.IsReadyToSend())
650 {
651 data.amt_time_spent = interactions.GetTimeSpent();
652 data.array_menu_interactions = interactions.GetInteractions();
653 data.cnt_menu_reopen = interactions.GetReopenTimes();
654 SendAnalyticalEvent(data, analytical_event, SCR_EAnalyticsDataTable.APPLICATION);
655 interactions.ResetReadyToSend();
656 }
657 }
658
659 //------------------------------------------------------------------------------------------------
661 protected void UpdateInventory(float deltaSeconds)
662 {
663 m_Inventory.Update(deltaSeconds);
664 if (m_Inventory.IsReadyToSend())
665 {
666 m_InventoryData = m_Inventory.GetClonedData();
667 SendAnalyticalEvent(m_InventoryData, ANALYTICAL_EVENT_INVENTORY_CLOSED, SCR_EAnalyticsDataTable.PLAYER);
668 m_Inventory.ResetReadyToSend();
669 }
670 }
671
672 //------------------------------------------------------------------------------------------------
674 protected void UpdatePlayMenu(float deltaSeconds)
675 {
676 m_PlayMenuInteractions.Update(deltaSeconds);
677 if (m_PlayMenuInteractions.IsReadyToSend())
678 {
679 m_PlayMenuData.amt_time_spent = m_PlayMenuInteractions.GetTimeSpent();
680 m_PlayMenuData.cnt_menu_reopen = m_PlayMenuInteractions.GetReopenTimes();
681 SendAnalyticalEvent(m_PlayMenuData, ANALYTICAL_EVENT_PLAY_MENU_CLOSED, SCR_EAnalyticsDataTable.APPLICATION);
682 m_PlayMenuInteractions.ResetReadyToSend();
683 }
684 }
685
686 //------------------------------------------------------------------------------------------------
688 protected void UpdateFieldManual(float deltaSeconds)
689 {
690 m_FieldManualInteractions.Update(deltaSeconds);
691 if (m_FieldManualInteractions.IsReadyToSend())
692 {
693 m_FieldManualData.amt_time_spent = m_FieldManualInteractions.GetTimeSpent();
694 m_FieldManualData.cnt_menu_reopen = m_FieldManualInteractions.GetReopenTimes();
695 if (GetGame().m_bIsMainMenuOpen)
696 m_FieldManualData.amt_name_location = MANUAL_LOCATION_MAIN_MENU;
697 else
698 m_FieldManualData.amt_name_location = MANUAL_LOCATION_GAME;
699 SendAnalyticalEvent(m_FieldManualData, ANALYTICAL_EVENT_FIELD_MANUAL_CLOSED, SCR_EAnalyticsDataTable.APPLICATION);
700 m_FieldManualInteractions.ResetReadyToSend();
701 }
702 }
703
704 //------------------------------------------------------------------------------------------------
707 protected void SendAnalyticalEvent(SCR_AnalyticsData object, string eventName, SCR_EAnalyticsDataTable dataTable)
708 {
709 string logString = string.Format("%1 %2: %3", SCR_DateTimeHelper.GetDateTimeUTC(), eventName, object.ToPrettyString());
710
711 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.CONSOLE))
712 PrintFormat("%1", logString);
713
714 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.FILE))
715 {
716 // Open file for every write separately. If we would open it only once, then we would lose it after a crash or a hard kill.
717 FileHandle analyticsFile = FileIO.OpenFile("$profile:analytics_uniform.txt", FileMode.APPEND);
718 if (analyticsFile)
719 {
720 analyticsFile.WriteLine(logString);
721 analyticsFile.Close();
722 }
723 }
724
725 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.API))
726 {
727 switch (dataTable)
728 {
729 case SCR_EAnalyticsDataTable.APPLICATION:
730 GetGame().GetStatsApi().CreateApplicationEvent(object, eventName);
731 break;
732
733 case SCR_EAnalyticsDataTable.PLAYER:
734 GetGame().GetStatsApi().CreatePlayerEvent(LOCAL_PLAYER_ID, object, eventName, false);
735 break;
736
737 case SCR_EAnalyticsDataTable.SESSION:
738 GetGame().GetStatsApi().CreateSessionEvent(object, eventName);
739 break;
740
741 case SCR_EAnalyticsDataTable.MOD:
742 GetGame().GetStatsApi().CreateModEvent(object, eventName);
743 break;
744
745 default:
746 Debug.Error(string.Format("Unrecognised SCR_EAnalyticsDataTable.%1! Please include it in 'SendAnalyticalEvent()'.", typename.EnumToString(SCR_EAnalyticsDataTable, dataTable)));
747 break;
748 }
749 }
750 }
751}
752
753*/
SCR_EAnalyticalItemSlotType
@ CHARACTER_STORAGE
SCR_CampaignSeizingComponent SCR_SeizingComponent EnumLinear()] enum SCR_EBaseCaptureState