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();
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();
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();
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();
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();
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();
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();
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 };
94 protected static const string ANALYTICAL_EVENT_VOTE_ENDS = "voteEnd";
95 protected ref SCR_VotingResultData m_VotingData = new SCR_VotingResultData();
98 protected ref SCR_MOBSelectedData m_MOBData = new SCR_MOBSelectedData();
99 protected static const string ANALYTICAL_EVENT_MOB_SELECTED = "MOBsSelected";
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;
108 protected SCR_EAnalyticsApplicationLoggingFlags m_Logging
109 = SCR_EAnalyticsApplicationLoggingFlags.CONSOLE
110 | SCR_EAnalyticsApplicationLoggingFlags.API;
114 protected static const int LOCAL_PLAYER_ID = 8888;
118 //------------------------------------------------------------------------------------------------
124 m_PlayMenuInteractions.Start();
127 //------------------------------------------------------------------------------------------------
132 m_PlayMenuInteractions.Close();
137 //------------------------------------------------------------------------------------------------
141 void OpenFieldManual()
143 m_FieldManualInteractions.Start();
146 //------------------------------------------------------------------------------------------------
149 void CloseFieldManual()
151 m_FieldManualInteractions.Close();
156 //------------------------------------------------------------------------------------------------
162 m_SettingsInteractions.Start();
165 //------------------------------------------------------------------------------------------------
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);
175 //------------------------------------------------------------------------------------------------
179 void SetQualityPresetSetting(int index)
181 m_SettingsInteractions.SetQualityPreset(index);
184 //------------------------------------------------------------------------------------------------
188 void SetHudVisibilitySetting(int index)
190 m_SettingsInteractions.SetHudVisibility(index);
193 //------------------------------------------------------------------------------------------------
198 void ChangeSetting(string category, string action)
200 m_SettingsInteractions.ChangeSetting(category, action);
203 //------------------------------------------------------------------------------------------------
207 void ChangeKeybind(string action, string preset)
209 m_SettingsInteractions.ChangeSetting("Controls", string.Format("%1_%2", action, preset));
212 //------------------------------------------------------------------------------------------------
215 void ResetAllKeybinds()
217 m_SettingsInteractions.UseResetAllButton();
222 //------------------------------------------------------------------------------------------------
226 void OpenMultiplayerMenu()
228 m_MultiplayerMenuInteractions.Start();
231 //------------------------------------------------------------------------------------------------
234 void CloseMultiplayerMenu()
236 m_MultiplayerMenuInteractions.Close();
239 //------------------------------------------------------------------------------------------------
243 void MultiplayerMenuSetTab(SCR_EServerBrowserTabs tab)
245 m_MultiplayerMenuInteractions.SetTab(typename.EnumToString(SCR_EServerBrowserTabs, tab));
248 //------------------------------------------------------------------------------------------------
252 void MultiplayerMenuSetSorting(string sorting)
254 m_MultiplayerMenuInteractions.SetSorting(sorting);
257 //------------------------------------------------------------------------------------------------
262 void MultiplayerMenuSetFilter(string filterCategory, string filterName)
264 m_MultiplayerMenuInteractions.SetFilter(filterCategory, filterName);
267 //------------------------------------------------------------------------------------------------
270 void MultiplayerMenuUseSearch()
272 m_MultiplayerMenuInteractions.UseSearch();
275 //------------------------------------------------------------------------------------------------
278 void MultiplayerMenuUseFavorite()
280 m_MultiplayerMenuInteractions.UseFavorite();
283 //------------------------------------------------------------------------------------------------
286 void MultiplayerMenuUseFilterOn()
288 m_MultiplayerMenuInteractions.UseFilterOn();
293 //------------------------------------------------------------------------------------------------
299 m_WorkshopInteractions.Start();
302 //------------------------------------------------------------------------------------------------
307 m_WorkshopInteractions.Close();
310 //------------------------------------------------------------------------------------------------
314 void WorkshopSetTab(SCR_EAnalyticsWorkshopTab tab)
316 m_WorkshopInteractions.SetTab(typename.EnumToString(SCR_EAnalyticsWorkshopTab, tab));
319 //------------------------------------------------------------------------------------------------
323 void WorkshopSetSorting(string sorting)
325 m_WorkshopInteractions.SetSorting(sorting);
328 //------------------------------------------------------------------------------------------------
333 void WorkshopSetFilter(string filterCategory, string filterName)
335 m_WorkshopInteractions.SetFilter(filterCategory, filterName);
338 //------------------------------------------------------------------------------------------------
341 void WorkshopUseSearch()
343 m_WorkshopInteractions.UseSearch();
346 //------------------------------------------------------------------------------------------------
349 void WorkshopUseFilterOn()
351 m_WorkshopInteractions.UseFilterOn();
356 //------------------------------------------------------------------------------------------------
360 void OpenModDetails()
362 m_ModInteractions.Start();
365 //------------------------------------------------------------------------------------------------
368 void CloseModDetails()
370 m_ModInteractions.Close();
373 //------------------------------------------------------------------------------------------------
377 void ModDetailsSetTab(SCR_EModDetailsMenuTabs tab)
379 m_ModInteractions.SetTab(typename.EnumToString(SCR_EModDetailsMenuTabs, tab));
384 //------------------------------------------------------------------------------------------------
390 m_ScenariosInteractions.Start();
393 //------------------------------------------------------------------------------------------------
396 void CloseScenarios()
398 m_ScenariosInteractions.Close();
401 //------------------------------------------------------------------------------------------------
405 void ScenariosSetTab(EScenarioSubMenuMode tab)
407 m_ScenariosInteractions.SetTab(typename.EnumToString(EScenarioSubMenuMode, tab));
410 //------------------------------------------------------------------------------------------------
414 void ScenariosSetSorting(string sorting)
416 m_ScenariosInteractions.SetSorting(sorting);
419 //------------------------------------------------------------------------------------------------
422 void ScenariosUseSearch()
424 m_ScenariosInteractions.UseSearch();
429 //------------------------------------------------------------------------------------------------
433 void OpenInventory(float currentWeight)
435 m_Inventory.OpenInventory(currentWeight);
438 //------------------------------------------------------------------------------------------------
442 void CloseInventory(float currentWeight)
444 m_Inventory.CloseInventory(currentWeight);
447 //------------------------------------------------------------------------------------------------
450 void InteractWithItem(SCR_InventorySlotUI focusedItem, SCR_InventorySlotUI selectedItem, EMenuAction action, bool isUsingGamepad)
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)
457 SCR_InventorySlotUI currentItem;
459 currentItem = focusedItem;
461 currentItem = selectedItem;
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())
469 m_eLastInteractedStorage = currentItem.GetAnalyticalItemSlotType();
470 m_iLastInteractedSlotId = currentItem.GetStorageUI().GetSlotId(currentItem);
471 m_sLastInteractedResource = currentItem.GetItemResource();
473 m_Inventory.InteractWithItem(m_eLastInteractedStorage);
476 //------------------------------------------------------------------------------------------------
479 void UseHealingFromInventory()
481 m_Inventory.UseHealing();
484 //------------------------------------------------------------------------------------------------
487 void UseExaminationFromInventory()
489 m_Inventory.UseExamination();
494 //------------------------------------------------------------------------------------------------
496 void VoteToKickResult(EVotingType voteType, string author_id, string vote_winner_id, bool result)
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);
505 //------------------------------------------------------------------------------------------------
507 void OnMOBSelected(array<SCR_CampaignMilitaryBaseComponent> selectedHQs)
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 = "[";
515 foreach(int i, SCR_CampaignMilitaryBaseComponent selectedHQ : selectedHQs)
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 += ", ";
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();
533 PrintString(selectedHQ.GetBaseNameUpperCase());
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 += "]";
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
546 //------------------------------------------------------------------------------------------------
548 void SendMOBSessionEvent(SCR_MOBSelectedData mobData)
550 SendAnalyticalEvent(mobData, ANALYTICAL_EVENT_MOB_SELECTED, SCR_EAnalyticsDataTable.SESSION);
555 //------------------------------------------------------------------------------------------------
557 void TutorialCourseStarts(SCR_ETutorialCourses course)
559 m_StartedCourse = course;
560 m_CourseTimer.Start();
563 //------------------------------------------------------------------------------------------------
567 void TutorialCourseEnds(SCR_ETutorialCourses course, SCR_EAnalyticsCourseEndReason reason)
569 if (course != m_StartedCourse)
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)
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);
586 //------------------------------------------------------------------------------------------------
589 void SetLogging(SCR_EAnalyticsApplicationLoggingFlags logging)
594 //------------------------------------------------------------------------------------------------
597 SCR_EAnalyticsApplicationLoggingFlags GetLogging()
604 //------------------------------------------------------------------------------------------------
608 static SCR_AnalyticsApplication GetInstance()
610 World world = GetGame().GetWorld();
614 return SCR_AnalyticsApplication.Cast(world.FindSystem(SCR_AnalyticsApplication));
617 //------------------------------------------------------------------------------------------------
619 override static void InitInfo(WorldSystemInfo outInfo)
621 outInfo.SetAbstract(false);
622 outInfo.SetLocation(WorldSystemLocation.Both);
623 outInfo.AddPoint(WorldSystemPoint.Frame);
626 //------------------------------------------------------------------------------------------------
628 override void OnUpdatePoint(WorldUpdatePointArgs args)
630 super.OnUpdatePoint(args);
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);
644 //------------------------------------------------------------------------------------------------
646 protected void UpdateData(SCR_AnalyticsInteractions interactions, SCR_MenuInteractedData data, string analytical_event, float deltaSeconds)
648 interactions.Update(deltaSeconds);
649 if (interactions.IsReadyToSend())
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();
659 //------------------------------------------------------------------------------------------------
661 protected void UpdateInventory(float deltaSeconds)
663 m_Inventory.Update(deltaSeconds);
664 if (m_Inventory.IsReadyToSend())
666 m_InventoryData = m_Inventory.GetClonedData();
667 SendAnalyticalEvent(m_InventoryData, ANALYTICAL_EVENT_INVENTORY_CLOSED, SCR_EAnalyticsDataTable.PLAYER);
668 m_Inventory.ResetReadyToSend();
672 //------------------------------------------------------------------------------------------------
674 protected void UpdatePlayMenu(float deltaSeconds)
676 m_PlayMenuInteractions.Update(deltaSeconds);
677 if (m_PlayMenuInteractions.IsReadyToSend())
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();
686 //------------------------------------------------------------------------------------------------
688 protected void UpdateFieldManual(float deltaSeconds)
690 m_FieldManualInteractions.Update(deltaSeconds);
691 if (m_FieldManualInteractions.IsReadyToSend())
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;
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();
704 //------------------------------------------------------------------------------------------------
707 protected void SendAnalyticalEvent(SCR_AnalyticsData object, string eventName, SCR_EAnalyticsDataTable dataTable)
709 string logString = string.Format("%1 %2: %3", SCR_DateTimeHelper.GetDateTimeUTC(), eventName, object.ToPrettyString());
711 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.CONSOLE))
712 PrintFormat("%1", logString);
714 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.FILE))
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);
720 analyticsFile.WriteLine(logString);
721 analyticsFile.Close();
725 if (SCR_Enum.HasFlag(m_Logging, SCR_EAnalyticsApplicationLoggingFlags.API))
729 case SCR_EAnalyticsDataTable.APPLICATION:
730 GetGame().GetStatsApi().CreateApplicationEvent(object, eventName);
733 case SCR_EAnalyticsDataTable.PLAYER:
734 GetGame().GetStatsApi().CreatePlayerEvent(LOCAL_PLAYER_ID, object, eventName, false);
737 case SCR_EAnalyticsDataTable.SESSION:
738 GetGame().GetStatsApi().CreateSessionEvent(object, eventName);
741 case SCR_EAnalyticsDataTable.MOD:
742 GetGame().GetStatsApi().CreateModEvent(object, eventName);
746 Debug.Error(string.Format("Unrecognised SCR_EAnalyticsDataTable.%1! Please include it in 'SendAnalyticalEvent()'.", typename.EnumToString(SCR_EAnalyticsDataTable, dataTable)));
SCR_EAnalyticalItemSlotType
SCR_CampaignSeizingComponent SCR_SeizingComponent EnumLinear()] enum SCR_EBaseCaptureState