enum DisconnectSessionFlags { NONE = 0, JOIN_ERROR_ENABLED = 1, JOIN_ERROR_CHECK = 2, DISCONNECT_ERROR_ENABLED = 4, SELECT_USER = 8, CLOSE_MENUS = 16, IGNORE_WHEN_IN_GAME = 32, ALWAYS_FORCE = 64, } const int DISCONNECT_SESSION_FLAGS_FORCE = int.MAX & ~DisconnectSessionFlags.IGNORE_WHEN_IN_GAME; const int DISCONNECT_SESSION_FLAGS_JOIN = int.MAX & ~DisconnectSessionFlags.JOIN_ERROR_CHECK; const int DISCONNECT_SESSION_FLAGS_ALL = int.MAX; class ProjectileStoppedInfo : Managed { proto native Object GetSource(); proto native vector GetPos(); proto native vector GetInVelocity(); proto native string GetAmmoType(); proto native float GetProjectileDamage(); } class CollisionInfoBase: ProjectileStoppedInfo { proto native vector GetSurfNormal(); } class ObjectCollisionInfo: CollisionInfoBase { proto native Object GetHitObj(); proto native vector GetHitObjPos(); proto native vector GetHitObjRot(); proto native int GetComponentIndex(); } class TerrainCollisionInfo: CollisionInfoBase { proto native bool GetIsWater(); } class CrashSoundSets { static ref map m_Mappings = new map; static void RegisterSoundSet(string sound_set) { m_Mappings.Set(sound_set.Hash(), sound_set); } static string GetSoundSetByHash(int hash) { string sound_set; if (m_Mappings) m_Mappings.Find(hash,sound_set); return sound_set; } }; class LoginScreenBase extends UIScriptedMenu { protected ref UiHintPanelLoading m_HintPanel; protected bool m_IsStatic; protected float m_HintTimeAccu; override void Update(float timeslice) { if (m_HintPanel) { m_HintTimeAccu += timeslice; if (CanChangeHintPage(m_HintTimeAccu)) { m_HintPanel.ShowRandomPage(); m_HintTimeAccu = 0; } } if (GetUApi().GetInputByID(UAUIBack).LocalPress()) { Leave(); } } protected void Leave() { g_Game.SetGameState(DayZGameState.MAIN_MENU); g_Game.SetLoadState(DayZLoadState.MAIN_MENU_START); g_Game.GetCallQueue(CALL_CATEGORY_SYSTEM).Call(GetGame().DisconnectSessionForce); Close(); } protected bool CanChangeHintPage(float timeAccu); bool IsStatic() { return m_IsStatic; } override bool IsHandlingPlayerDeathEvent() { return false; } } class LoginQueueBase extends LoginScreenBase { protected TextWidget m_txtPosition; protected TextWidget m_txtNote; protected ButtonWidget m_btnLeave; protected int m_iPosition = -1; void LoginQueueBase() { g_Game.SetKeyboardHandle(this); } void ~LoginQueueBase() { g_Game.SetKeyboardHandle(NULL); } override Widget Init() { layoutRoot = GetGame().GetWorkspace().CreateWidgets("gui/layouts/dialog_queue_position.layout"); m_HintPanel = new UiHintPanelLoading(layoutRoot.FindAnyWidget("hint_frame0")); m_txtPosition = TextWidget.Cast(layoutRoot.FindAnyWidget("txtPosition")); m_txtNote = TextWidget.Cast(layoutRoot.FindAnyWidget("txtNote")); m_btnLeave = ButtonWidget.Cast(layoutRoot.FindAnyWidget("btnLeave")); m_txtNote.Show(true); layoutRoot.FindAnyWidget("notification_root").Show(false); #ifdef PLATFORM_CONSOLE layoutRoot.FindAnyWidget("toolbar_bg").Show(true); RichTextWidget toolbar_b = RichTextWidget.Cast(layoutRoot.FindAnyWidget("BackIcon")); toolbar_b.SetText(InputUtils.GetRichtextButtonIconFromInputAction("UAUIBack", "", EUAINPUT_DEVICE_CONTROLLER, InputUtils.ICON_SCALE_TOOLBAR)); #ifdef PLATFORM_XBOX #ifdef BUILD_EXPERIMENTAL layoutRoot.FindAnyWidget("notification_root").Show(true); #endif #endif #endif return layoutRoot; } override bool OnClick(Widget w, int x, int y, int button) { super.OnClick(w, x, y, button); if (w == m_btnLeave) { Leave(); return true; } return false; } void Show() { if (layoutRoot) { layoutRoot.Show(true); } } void Hide() { if (layoutRoot) layoutRoot.Show(false); m_HintPanel = null; } void SetPosition(int position) { if (position != m_iPosition) { m_iPosition = position; m_txtPosition.SetText(position.ToString()); } } override protected bool CanChangeHintPage(float timeAccu) { return timeAccu >= GameConstants.LOADING_SCREEN_HINT_INTERVAL; } }; //! LoginQueue position when using -connect since mission is not created yet class LoginQueueStatic extends LoginQueueBase { void LoginQueueStatic() { Init(); m_IsStatic = true; } }; class LoginTimeBase extends LoginScreenBase { protected TextWidget m_txtDescription; protected TextWidget m_txtLabel; protected ButtonWidget m_btnLeave; protected bool m_IsRespawn; private ref FullTimeData m_FullTime; void LoginTimeBase() { g_Game.SetKeyboardHandle(this); m_IsRespawn = false; m_FullTime = new FullTimeData(); } void ~LoginTimeBase() { if (g_Game) g_Game.SetKeyboardHandle(null); m_FullTime = null; } override Widget Init() { layoutRoot = GetGame().GetWorkspace().CreateWidgets("gui/layouts/dialog_login_time.layout"); m_txtDescription = TextWidget.Cast(layoutRoot.FindAnyWidget("txtDescription")); m_txtLabel = TextWidget.Cast(layoutRoot.FindAnyWidget("txtLabel")); m_btnLeave = ButtonWidget.Cast(layoutRoot.FindAnyWidget("btnLeave")); m_txtDescription.Show(true); layoutRoot.FindAnyWidget("notification_root").Show(false); #ifdef PLATFORM_CONSOLE layoutRoot.FindAnyWidget("toolbar_bg").Show(true); RichTextWidget toolbar_b = RichTextWidget.Cast(layoutRoot.FindAnyWidget("BackIcon")); toolbar_b.SetText(InputUtils.GetRichtextButtonIconFromInputAction("UAUIBack", "", EUAINPUT_DEVICE_CONTROLLER, InputUtils.ICON_SCALE_TOOLBAR)); #ifdef PLATFORM_XBOX #ifdef BUILD_EXPERIMENTAL layoutRoot.FindAnyWidget("notification_root").Show(true); #endif #endif #endif return layoutRoot; } override bool OnClick(Widget w, int x, int y, int button) { super.OnClick(w, x, y, button); if (w == m_btnLeave) { Leave(); return true; } return false; } void Show() { if (layoutRoot) { layoutRoot.Show(true); m_HintPanel = new UiHintPanelLoading(layoutRoot.FindAnyWidget("hint_frame0")); } } void Hide() { if (layoutRoot) layoutRoot.Show(false); m_HintPanel = null; } void SetTime(int time) { string text = ""; TimeConversions.ConvertSecondsToFullTime(time, m_FullTime); if (!m_IsRespawn) text = "#menu_loading_in_"; else text = "#dayz_game_spawning_in_"; if (m_FullTime.m_Days > 0) text += "dhms"; else if (m_FullTime.m_Hours > 0) text += "hms"; else if (m_FullTime.m_Minutes > 0) text += "ms"; else text += "s"; text = Widget.TranslateString(text); text = string.Format(text, m_FullTime.m_Seconds, m_FullTime.m_Minutes, m_FullTime.m_Hours, m_FullTime.m_Days); m_txtLabel.SetText(text); if (m_IsRespawn && time <= 1) GetGame().SetLoginTimerFinished(); } void SetStatus(string status) { m_txtDescription.SetText(status); } void SetRespawn(bool value) { m_IsRespawn = value; } bool IsRespawn() { return m_IsRespawn; } override protected bool CanChangeHintPage(float timeAccu) { return timeAccu >= GameConstants.LOADING_SCREEN_HINT_INTERVAL && m_FullTime.m_Seconds >= GameConstants.LOADING_SCREEN_HINT_INTERVAL_MIN; } }; //! LoginTime when using -connect since mission is not created yet class LoginTimeStatic extends LoginTimeBase { void LoginTimeStatic() { Init(); m_IsStatic = true; } void ~LoginTimeStatic() { } }; class ConnectionLost { private ref Widget m_WidgetRoot; private TextWidget m_TextWidgetTitle; private float m_duration; void ConnectionLost(DayZGame game) { m_WidgetRoot = game.GetWorkspace().CreateWidgets("gui/layouts/day_z_connection_lost.layout"); m_WidgetRoot.Show(false); Class.CastTo(m_TextWidgetTitle, m_WidgetRoot.FindAnyWidget("TextWidget")); m_duration = 0.0; } void Show() { if (!m_WidgetRoot.IsVisible()) { if (g_Game.GetUIManager().IsDialogVisible()) { g_Game.GetUIManager().HideDialog(); } m_WidgetRoot.Show(true); m_TextWidgetTitle.SetText(""); } } void Hide() { if (m_WidgetRoot.IsVisible()) { m_WidgetRoot.Show(false); } } void SetText(string text) { m_TextWidgetTitle.SetText(text); } float GetDuration() { return m_duration; } void SetDuration(float duration) { m_duration = duration; } }; typedef Param3 DayZProfilesOption; typedef DayZProfilesOption DayZProfilesOptionBool; typedef Param3 DayZProfilesOptionInt; typedef Param3 DayZProfilesOptionFloat; class DayZProfilesOptions { private ref map m_DayZProfilesOptionsBool; private ref map m_DayZProfilesOptionsInt; private ref map m_DayZProfilesOptionsFloat; static ref ScriptInvoker m_OnIntOptionChanged = new ScriptInvoker(); static ref ScriptInvoker m_OnBoolOptionChanged = new ScriptInvoker(); static ref ScriptInvoker m_OnFloatOptionChanged = new ScriptInvoker(); void DayZProfilesOptions() { m_DayZProfilesOptionsBool = new map(); m_DayZProfilesOptionsInt = new map(); m_DayZProfilesOptionsFloat = new map(); } void RegisterProfileOption(EDayZProfilesOptions option, string profileOptionName, bool def = true) { if (!m_DayZProfilesOptionsBool.Contains(option)) { //! init of DayZProfilesOption - profileOptionName, value from Profiles files, or use default value bool profileVal = GetProfileValueBool(profileOptionName, def); m_DayZProfilesOptionsBool.Set(option, new DayZProfilesOptionBool(profileOptionName, profileVal, def)); SetProfileOptionBool(option, profileVal); } } void RegisterProfileOptionBool(EDayZProfilesOptions option, string profileOptionName, bool defaultValue = true) { RegisterProfileOption(option, profileOptionName, defaultValue); } void RegisterProfileOptionInt(EDayZProfilesOptions option, string profileOptionName, int defaultValue = 0) { if (!m_DayZProfilesOptionsInt.Contains(option)) { //! init of DayZProfilesOption - profileOptionName, value from Profiles files, or use default value string outValue; GetGame().GetProfileString(profileOptionName, outValue); int value = outValue.ToInt(); m_DayZProfilesOptionsInt.Set(option, new DayZProfilesOptionInt(profileOptionName, value, defaultValue)); SetProfileOptionInt(option, value); } } void RegisterProfileOptionFloat(EDayZProfilesOptions option, string profileOptionName, float defaultValue = 0.0) { if (!m_DayZProfilesOptionsFloat.Contains(option)) { //! init of DayZProfilesOption - profileOptionName, value from Profiles files, or use default value string outValue; GetGame().GetProfileString(profileOptionName, outValue); float value = outValue.ToFloat(); m_DayZProfilesOptionsFloat.Set(option, new DayZProfilesOptionFloat(profileOptionName, value, defaultValue)); SetProfileOptionFloat(option, value); } } void ResetOptionsBool() { if (!m_DayZProfilesOptionsBool) { m_DayZProfilesOptionsBool = new map(); } foreach (EDayZProfilesOptions e_opt, DayZProfilesOptionBool r_opt : m_DayZProfilesOptionsBool) { bool profileVal = GetProfileValueBool(r_opt.param1, r_opt.param3); SetProfileOptionBool(e_opt, profileVal); } } void ResetOptions() { ResetOptionsBool(); } void ResetOptionsInt() { if (!m_DayZProfilesOptionsInt) { m_DayZProfilesOptionsInt = new map(); } foreach (EDayZProfilesOptions e_opt, DayZProfilesOptionInt r_opt : m_DayZProfilesOptionsInt) { string outValue; GetGame().GetProfileString(r_opt.param1, outValue); int value = outValue.ToInt(); SetProfileOptionInt(e_opt, value); } } void ResetOptionsFloat() { if (!m_DayZProfilesOptionsFloat) { m_DayZProfilesOptionsFloat = new map(); } foreach (EDayZProfilesOptions e_opt, DayZProfilesOptionFloat r_opt : m_DayZProfilesOptionsFloat) { string outValue; GetGame().GetProfileString(r_opt.param1, outValue); float value = outValue.ToFloat(); SetProfileOptionFloat(e_opt, value); } } void SetProfileOption(EDayZProfilesOptions option, bool value) { if (m_DayZProfilesOptionsBool && m_DayZProfilesOptionsBool.Contains(option)) { DayZProfilesOptionBool po = m_DayZProfilesOptionsBool.Get(option); po.param2 = value; GetGame().SetProfileString(po.param1, value.ToString()); GetGame().SaveProfile(); m_OnBoolOptionChanged.Invoke(po.param1, value); } } void SetProfileOptionBool(EDayZProfilesOptions option, bool value) { SetProfileOption(option, value); } void SetProfileOptionInt(EDayZProfilesOptions option, int value) { if (m_DayZProfilesOptionsInt && m_DayZProfilesOptionsInt.Contains(option)) { DayZProfilesOptionInt po = m_DayZProfilesOptionsInt.Get(option); po.param2 = value; GetGame().SetProfileString(po.param1, value.ToString()); GetGame().SaveProfile(); m_OnIntOptionChanged.Invoke(option, value); } } void SetProfileOptionFloat(EDayZProfilesOptions option, float value) { if (m_DayZProfilesOptionsFloat && m_DayZProfilesOptionsFloat.Contains(option)) { DayZProfilesOptionFloat po = m_DayZProfilesOptionsFloat.Get(option); po.param2 = value; GetGame().SetProfileString(po.param1, value.ToString()); GetGame().SaveProfile(); m_OnFloatOptionChanged.Invoke(po.param1, value); } } bool GetProfileOption(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsBool && m_DayZProfilesOptionsBool.Contains(option)) { DayZProfilesOptionBool po = m_DayZProfilesOptionsBool.Get(option); return po.param2; } return true; } bool GetProfileOptionBool(EDayZProfilesOptions option) { return GetProfileOption(option); } int GetProfileOptionInt(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsInt && m_DayZProfilesOptionsInt.Contains(option)) { DayZProfilesOptionInt po = m_DayZProfilesOptionsInt.Get(option); return po.param2; } return 0; } float GetProfileOptionFloat(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsFloat && m_DayZProfilesOptionsFloat.Contains(option)) { DayZProfilesOptionFloat po = m_DayZProfilesOptionsFloat.Get(option); return po.param2; } return 0.0; } bool GetProfileOptionDefault(EDayZProfilesOptions option) { return GetProfileOptionDefaultBool(option); } bool GetProfileOptionDefaultBool(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsBool && m_DayZProfilesOptionsBool.Contains(option)) { DayZProfilesOptionBool po = m_DayZProfilesOptionsBool.Get(option); return po.param3; } ErrorEx("Invalid profile option id! Returning 'true'.", ErrorExSeverity.WARNING); return true; } int GetProfileOptionDefaultInt(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsInt && m_DayZProfilesOptionsInt.Contains(option)) { DayZProfilesOptionInt po = m_DayZProfilesOptionsInt.Get(option); return po.param3; } ErrorEx("Invalid profile option id! Returning '0'.", ErrorExSeverity.WARNING); return 0; } float GetProfileOptionDefaultFloat(EDayZProfilesOptions option) { if (m_DayZProfilesOptionsFloat && m_DayZProfilesOptionsFloat.Contains(option)) { DayZProfilesOptionFloat po = m_DayZProfilesOptionsFloat.Get(option); return po.param3; } ErrorEx("Invalid profile option id! Returning '0.0'.", ErrorExSeverity.WARNING); return 0.0; } map GetProfileOptionMap() { if (m_DayZProfilesOptions) return m_DayZProfilesOptions; return null; } //! //! DEPRECATED private ref map m_DayZProfilesOptions; private DayZGame m_Game; } enum DayZGameState { UNDEFINED, MAIN_MENU, JOIN, PARTY, CONNECT, CONNECTING, IN_GAME } enum DayZLoadState { UNDEFINED, MAIN_MENU_START, MAIN_MENU_CONTROLLER_SELECT, MAIN_MENU_USER_SELECT, JOIN_START, JOIN_CONTROLLER_SELECT, JOIN_USER_SELECT, PARTY_START, PARTY_CONTROLLER_SELECT, PARTY_USER_SELECT, CONNECT_START, CONNECT_USER_SELECT, CONNECT_CONTROLLER_SELECT, MISSION_START, MISSION_USER_SELECT, MISSION_CONTROLLER_SELECT } class LoadingScreen { ref Widget m_WidgetRoot; TextWidget m_TextWidgetTitle; TextWidget m_TextWidgetStatus; TextWidget m_ModdedWarning; ImageWidget m_ImageWidgetBackground; DayZGame m_DayZGame; float m_LastProgressUpdate; ImageWidget m_ImageLogoMid; ImageWidget m_ImageLogoCorner; ImageWidget m_ImageLoadingIcon; ImageWidget m_ImageBackground; ProgressBarWidget m_ProgressLoading; float m_ImageLoadingIconRotation; TextWidget m_ProgressText; int m_Counter; ref Timer m_Timer; ref UiHintPanelLoading m_HintPanel; void LoadingScreen(DayZGame game) { m_DayZGame = game; m_WidgetRoot = game.GetLoadingWorkspace().CreateWidgets("gui/layouts/loading.layout"); Class.CastTo(m_ImageLogoMid, m_WidgetRoot.FindAnyWidget("ImageLogoMid")); Class.CastTo(m_ImageLogoCorner, m_WidgetRoot.FindAnyWidget("ImageLogoCorner")); Class.CastTo(m_TextWidgetTitle, m_WidgetRoot.FindAnyWidget("TextWidget")); Class.CastTo(m_TextWidgetStatus, m_WidgetRoot.FindAnyWidget("StatusText")); Class.CastTo(m_ImageWidgetBackground, m_WidgetRoot.FindAnyWidget("ImageBackground")); Class.CastTo(m_ImageLoadingIcon, m_WidgetRoot.FindAnyWidget("ImageLoadingIcon")); Class.CastTo(m_ModdedWarning, m_WidgetRoot.FindAnyWidget("ModdedWarning")); m_ImageBackground = ImageWidget.Cast(m_WidgetRoot.FindAnyWidget("ImageBackground")); m_ProgressLoading = ProgressBarWidget.Cast(m_WidgetRoot.FindAnyWidget("LoadingBar")); string tmp; m_ProgressText = TextWidget.Cast(m_WidgetRoot.FindAnyWidget("ProgressText")); if (GetGame()) { m_ProgressText.Show(GetGame().CommandlineGetParam("loadingTest", tmp)); } m_WidgetRoot.FindAnyWidget("notification_root").Show(false); #ifdef PLATFORM_CONSOLE #ifdef PLATFORM_XBOX #ifdef BUILD_EXPERIMENTAL Widget expNotification = m_WidgetRoot.FindAnyWidget("notification_root"); if (expNotification) { expNotification.Show(true); } #endif #endif #endif m_ModdedWarning.Show(g_Game.ReportModded()); m_ImageLogoMid.Show(true); m_ImageLogoCorner.Show(false); m_ImageWidgetBackground.Show(true); m_Counter = 0; // lighten up your desktop game.GetBacklit().LoadingAnim(); ProgressAsync.SetProgressData(m_ProgressLoading); ProgressAsync.SetUserData(m_ImageBackground); } //! DEPRECATED void OnTimer(); void Inc() { m_LastProgressUpdate = m_DayZGame.GetTickTime(); m_Counter++; if (m_Counter == 1) { Show(); } } void Dec() { m_Counter = m_Counter - 1; if (m_Counter <= 0) { m_Counter = 0; EndLoading(); m_HintPanel = null; } } void EndLoading() { ProgressAsync.SetProgressData(null); ProgressAsync.SetUserData(null); m_WidgetRoot.Show(false); GetGame().GetCallQueue(CALL_CATEGORY_SYSTEM).Call(g_Game.CheckDialogs); } bool IsLoading() { return m_WidgetRoot.IsVisible(); } void SetTitle(string title) { m_TextWidgetTitle.SetText(title); } void SetStatus(string status) { m_TextWidgetStatus.SetText(status); } void SetProgress(float val) { float time_delta = m_DayZGame.GetTickTime() - m_LastProgressUpdate; m_LastProgressUpdate = m_DayZGame.GetTickTime(); } void OnUpdate(float timeslice) { } void ShowEx(DayZGame game) { if (!m_HintPanel) { m_HintPanel = new UiHintPanelLoading(m_WidgetRoot.FindAnyWidget("hint_frame")); m_HintPanel.Init(game); } Show(); } void Show() { Widget lIcon = m_ImageBackground; Widget pText = m_ProgressLoading; m_ProgressText.SetText(""); m_ProgressLoading.SetCurrent(0.0); m_ImageBackground.SetMaskProgress(0.0); if (!m_WidgetRoot.IsVisible()) { if (m_DayZGame.GetUIManager().IsDialogVisible()) { m_DayZGame.GetUIManager().HideDialog(); } if (m_DayZGame.GetMissionState() == DayZGame.MISSION_STATE_MAINMENU) { m_ImageLogoMid.Show(false); m_ImageLogoCorner.Show(false); m_ImageWidgetBackground.Show(true); m_TextWidgetStatus.Show(true); } else { m_ImageLogoMid.Show(true); m_ImageLogoCorner.Show(false); m_ImageWidgetBackground.Show(true); m_TextWidgetStatus.Show(false); } m_WidgetRoot.Show(true); m_TextWidgetTitle.SetText(""); m_TextWidgetStatus.SetText(""); } ProgressAsync.SetProgressData(pText); ProgressAsync.SetUserData(lIcon); } void Hide(bool force) { if (force) { while (m_Counter > 0) { Dec(); } } if (m_Counter <= 0) { m_WidgetRoot.Show(false); ProgressAsync.SetUserData(null); ProgressAsync.SetProgressData(null); m_HintPanel = null; } } }; class DayZGame extends CGame { protected ref BillboardSetHandler m_BillboardSetHandler; const int MISSION_STATE_MAINMENU = 0; const int MISSION_STATE_GAME = 1; const int MISSION_STATE_FINNISH = 2; private const int STATS_COUNT = EConnectivityStatType.COUNT; private EConnectivityStatLevel m_ConnectivityStatsStates[STATS_COUNT]; private int m_MissionState; //HK stuff protected DayZGameState m_GameState; protected DayZLoadState m_LoadState; protected ref NotificationUI m_Notifications; protected bool m_FirstConnect = true; //End HK stuff ref LoadingScreen m_loading; private ref LoginTimeBase m_LoginTimeScreen; private ref LoginQueueBase m_LoginQueue; private int m_LoginTime; private ref ConnectionLost m_connectionLost; private ref TimerQueue m_timerQueue[CALL_CATEGORY_COUNT]; private ref ScriptCallQueue m_callQueue[CALL_CATEGORY_COUNT]; private ref ScriptInvoker m_updateQueue[CALL_CATEGORY_COUNT]; private ref ScriptInvoker m_postUpdateQueue[CALL_CATEGORY_COUNT]; private ref DragQueue m_dragQueue; private ref ScriptInvoker m_YieldDataInitInvoker; private ref DayZProfilesOptions m_DayZProfileOptions; private bool m_early_access_dialog_accepted; private UIScriptedMenu m_keyboard_handler; private ScriptModule m_mission_module; private string m_MissionPath; private string m_MissionFolderPath; private bool m_IsCtrlHolding; private bool m_IsWinHolding; private bool m_IsLeftAltHolding; private bool m_IsRightAltHolding; private bool m_IsWorldWetTempUpdateEnabled = true; private bool m_IsFoodDecayEnabled = true; private float m_FoodDecayModifier; static bool m_ReportModded; private bool m_IsStressTest; private bool m_AimLoggingEnabled; int m_OriginalCharactersCount; private string m_PlayerName; private bool m_IsNewCharacter; private bool m_IsConnecting; private bool m_ConnectFromJoin; private bool m_ShouldShowControllerDisconnect; private bool m_CursorDesiredVisibilityScript = true; private int m_PreviousGamepad; private float m_UserFOV; private float m_DeltaTime; float m_volume_sound; float m_volume_speechEX; float m_volume_music; float m_volume_VOIP; float m_volume_radio; float m_PreviousEVValue; float m_EVValue = 0; #ifdef DIAG_DEVELOPER private static ref ServerFpsStatsUpdatedEventParams m_ServerFpsStatsParams; #endif static ref AmmoCamParams m_AmmoShakeParams = new AmmoCamParams();//TODO: make static, reuse static ref ScriptInvoker Event_OnRPC = new ScriptInvoker(); private ref Backlit m_Backlit; private ref array m_CharClassNames = new array(); private ref array m_ConnectedInputDeviceList; //has to be owned here, 'Input' is a native class //Used for helicrash sound private ref EffectSound m_CrashSound; //Used for Artillery sound private ref EffectSound m_ArtySound; private const int MIN_ARTY_SOUND_RANGE = 300; // The distance under which sound is no longer heard static ref NoiseParams m_NoiseParams = new NoiseParams(); static ref TemperatureAccessManager m_TAManager = new TemperatureAccessManager(); #ifdef DEVELOPER static bool m_IsPreviewSpawn;//! we set this to 'true' when spawning item through Script Console only for item preview purposes #endif #ifdef DIAG_DEVELOPER ref CameraToolsMenuServer m_CameraToolsMenuServer; #endif // CGame override functions void DayZGame() { PPEManagerStatic.CreateManagerStatic(); #ifdef PLATFORM_CONSOLE SetMainMenuWorld("MainMenuSceneXbox"); #endif m_MissionState = MISSION_STATE_GAME; m_keyboard_handler = null; #ifdef DEVELOPER m_early_access_dialog_accepted = true; #endif for (int i = 0; i < CALL_CATEGORY_COUNT; i++) { m_callQueue[i] = new ScriptCallQueue(); m_updateQueue[i] = new ScriptInvoker(); m_timerQueue[i] = new TimerQueue(); m_postUpdateQueue[i] = new ScriptInvoker(); } m_dragQueue = new DragQueue; m_LoginTime = 0; string tmp; if (CommandlineGetParam("stresstest", tmp)) { m_IsStressTest = true; } if (CommandlineGetParam("doAimLogs", tmp)) { m_AimLoggingEnabled = true; } // initialize backlit effects m_Backlit = new Backlit(); m_Backlit.OnInit(this); m_ReportModded = GetModToBeReported(); #ifndef NO_GUI if (m_loading == null) { m_loading = new LoadingScreen(this); } if (m_loading) { m_loading.ShowEx(this); } RefreshMouseCursorVisibility(); #endif Debug.Init(); Component.Init(); CachedObjectsParams.Init(); CachedObjectsArrays.Init(); BleedChanceData.InitBleedChanceData(); GetUApi().PresetSelect(GetUApi().PresetCurrent()); m_DayZProfileOptions = new DayZProfilesOptions(); GetCallQueue(CALL_CATEGORY_GUI).Call(DeferredInit); GetCallQueue(CALL_CATEGORY_GAMEPLAY).Call(GlobalsInit); string path = "cfgVehicles"; string child_name = ""; int count = ConfigGetChildrenCount(path); for (int p = 0; p < count; ++p) { ConfigGetChildName(path, p, child_name); if (ConfigGetInt(path + " " + child_name + " scope") == 2 && IsKindOf(child_name, "SurvivorBase")) m_CharClassNames.Insert(child_name); } m_IsConnecting = false; m_ConnectFromJoin = false; } // ------------------------------------------------------------ private void ~DayZGame() { PPEManagerStatic.DestroyManagerStatic(); BleedChanceData.Cleanup(); NotificationSystem.CleanupInstance(); g_Game = null; SetDispatcher(null); Print("~DayZGame()"); } // ------------------------------------------------------------ void DeferredInit() { GameOptions opt = new GameOptions(); opt.Initialize(); GetInput().UpdateConnectedInputDeviceList(); m_UserFOV = GetUserFOVFromConfig(); m_volume_sound = GetSoundScene().GetSoundVolume(); m_volume_speechEX = GetSoundScene().GetSpeechExVolume(); m_volume_music = GetSoundScene().GetMusicVolume(); m_volume_VOIP = GetSoundScene().GetVOIPVolume(); m_volume_radio = GetSoundScene().GetRadioVolume(); PPEManagerStatic.GetPPEManager().Init(); GetMenuDefaultCharacterData(); } // ------------------------------------------------------------ void GlobalsInit() { if (GetCEApi()) { m_IsWorldWetTempUpdateEnabled = (GetCEApi().GetCEGlobalInt("WorldWetTempUpdate") == 1); m_FoodDecayModifier = GetCEApi().GetCEGlobalFloat("FoodDecay"); //check for legacy INT format, if value == float.MIN when read as FLOAT, it is of type INT, so we read it as such below if (m_FoodDecayModifier == float.MIN) { m_FoodDecayModifier = GetCEApi().GetCEGlobalInt("FoodDecay"); } } //we need to perform the load here as some objects behaving correctly after spawn is dependent on CE being initialized before spawning them ObjectSpawnerHandler.OnGameplayDataHandlerLoad(); } // ------------------------------------------------------------ void RegisterProfilesOptions() { m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.CROSSHAIR, SHOW_CROSSHAIR); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.HUD, SHOW_HUD); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.HUD_VEHICLE, SHOW_HUD_VEHICLE); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.QUICKBAR, SHOW_QUICKBAR); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.SERVER_MESSAGES, SYSTEM_CHAT_MSG); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.USERS_CHAT, DIRECT_CHAT_MSG); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.RADIO_CHAT, RADIO_CHAT_MSG); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.GAME_MESSAGES, GAME_CHAT_MSG, false); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.ADMIN_MESSAGES, ADMIN_CHAT_MSG, false); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.PLAYER_MESSAGES, PLAYER_CHAT_MSG, false); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.SERVERINFO_DISPLAY, SHOW_SERVERINFO, true); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.BLEEDINGINDICATION, ENABLE_BLEEDINGINDICATION, true); m_DayZProfileOptions.RegisterProfileOptionBool(EDayZProfilesOptions.CONNECTIVITY_INFO, SHOW_CONNECTIVITYINFO, true); m_DayZProfileOptions.RegisterProfileOptionFloat(EDayZProfilesOptions.HUD_BRIGHTNESS, HUD_BRIGHTNESS, 0.0); m_DayZProfileOptions.RegisterProfileOptionInt(EDayZProfilesOptions.AMBIENT_MUSIC_MODE, OPTIONS_SOUND_AMBIENT_SOUND_MODE, 0); } void ResetProfileOptions() { m_DayZProfileOptions.ResetOptionsBool(); m_DayZProfileOptions.ResetOptionsInt(); m_DayZProfileOptions.ResetOptionsFloat(); } //! Called from C++ void SetMissionPath(string path) { m_MissionPath = path; int pos_end = 0; int pos_cur = 0; while (pos_cur != -1) { pos_end = pos_cur; pos_cur = path.IndexOfFrom(pos_cur + 1 , "\\"); } m_MissionFolderPath = path.Substring(0, pos_end); } string GetMissionPath() { return m_MissionPath; } string GetMissionFolderPath() { return m_MissionFolderPath; } override ScriptCallQueue GetCallQueue(int call_category) { return m_callQueue[call_category]; } override ScriptInvoker GetUpdateQueue(int call_category) { return m_updateQueue[call_category]; } override ScriptInvoker GetPostUpdateQueue(int call_category) { return m_postUpdateQueue[call_category]; } ScriptInvoker GetYieldDataInitInvoker() { if (!m_YieldDataInitInvoker) m_YieldDataInitInvoker = new ScriptInvoker(); return m_YieldDataInitInvoker; } override TimerQueue GetTimerQueue(int call_category) { return m_timerQueue[call_category]; } override DragQueue GetDragQueue() { return m_dragQueue; } // ------------------------------------------------------------ void OnGameplayDataHandlerLoad() { } // ------------------------------------------------------------ int GetMissionState() { return m_MissionState; } // ------------------------------------------------------------ void SetMissionState(int state) { m_MissionState = state; } // ------------------------------------------------------------ bool GetProfileOption(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOption(option); } bool GetProfileOptionBool(EDayZProfilesOptions option) { return GetProfileOption(option); } int GetProfileOptionInt(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOptionInt(option); } float GetProfileOptionFloat(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOptionFloat(option); } bool GetProfileOptionDefault(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOptionDefaultBool(option); } bool GetProfileOptionDefaultBool(EDayZProfilesOptions option) { return GetProfileOptionDefault(option); } int GetProfileOptionDefaultInt(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOptionDefaultInt(option); } float GetProfileOptionDefaultFloat(EDayZProfilesOptions option) { return m_DayZProfileOptions.GetProfileOptionDefaultFloat(option); } void SetProfileOption(EDayZProfilesOptions option, bool value) { m_DayZProfileOptions.SetProfileOptionBool(option, value); } void SetProfileOptionBool(EDayZProfilesOptions option, bool value) { SetProfileOption(option, value); } void SetProfileOptionInt(EDayZProfilesOptions option, int value) { m_DayZProfileOptions.SetProfileOptionInt(option, value); } void SetProfileOptionFloat(EDayZProfilesOptions option, float value) { m_DayZProfileOptions.SetProfileOptionFloat(option, value); } map GetProfileOptionMap() { return m_DayZProfileOptions.GetProfileOptionMap(); } bool IsStressTest() { return m_IsStressTest; } bool IsAimLogEnabled() { return m_AimLoggingEnabled; } void SetGameState(DayZGameState state) { m_GameState = state; } DayZGameState GetGameState() { return m_GameState; } void SetLoadState(DayZLoadState state) { m_LoadState = state; } DayZLoadState GetLoadState() { return m_LoadState; } static bool ReportModded() { return m_ReportModded; } Backlit GetBacklit() { return m_Backlit; } // ------------------------------------------------------------ override bool IsInventoryOpen() { #ifndef NO_GUI if (GetUIManager().FindMenu(MENU_INVENTORY) != NULL) { return true; } #endif return false; } // ------------------------------------------------------------ void EarlyAccessDialog(UIScriptedMenu parent) { if (!m_early_access_dialog_accepted) { g_Game.GetUIManager().EnterScriptedMenu(MENU_EARLYACCESS, parent); m_early_access_dialog_accepted = true; } } // ------------------------------------------------------------ //! create custom main menu part (submenu) override UIScriptedMenu CreateScriptedMenu(int id) { #ifndef NO_GUI Mission mission = GetMission(); if (mission) { return mission.CreateScriptedMenu(id); } #endif return NULL; } // ------------------------------------------------------------ void ReloadMission() { #ifdef ENABLE_LOGGING Print("Reloading mission module!"); CreateMission(m_MissionPath); #endif } // ------------------------------------------------------------ void CancelLoginQueue() { if (m_LoginQueue) { if (m_LoginQueue.IsStatic()) { m_LoginQueue.Hide(); delete m_LoginQueue; } else { m_LoginQueue.Close(); } } } // ------------------------------------------------------------ void CancelLoginTimeCountdown() { GetCallQueue(CALL_CATEGORY_SYSTEM).Remove(this.LoginTimeCountdown); if (m_LoginTimeScreen) { if (m_LoginTimeScreen.IsStatic()) { m_LoginTimeScreen.Hide(); delete m_LoginTimeScreen; } else { m_LoginTimeScreen.Close(); } } } // ------------------------------------------------------------ private void ClearConnectivityStates() { for (int i = 0; i < STATS_COUNT; i++) m_ConnectivityStatsStates[i] = 0; } // ------------------------------------------------------------ override void OnEvent(EventType eventTypeId, Param params) { string address; int port; int high, low; switch (eventTypeId) { case StartupEventTypeID: { #ifndef SERVER // Just call it, to create the global instance if it doesn't exist yet ParticleManager.GetInstance(); #endif break; } case MPSessionStartEventTypeID: { #ifndef SERVER ClearConnectivityStates(); #endif m_FirstConnect = true; ClientData.ResetClientData(); break; } case MPSessionEndEventTypeID: { LoadingHide(); CancelLoginTimeCountdown(); SetConnecting(false); SetGameState(DayZGameState.MAIN_MENU); m_FirstConnect = true; #ifdef PLATFORM_CONSOLE if (GetUserManager().GetSelectedUser()) { OnlineServices.LeaveGameplaySession(); OnlineServices.ClearCurrentServerInfo(); if (GetGameState() == DayZGameState.IN_GAME) { SetLoadState(DayZLoadState.MAIN_MENU_START); } } m_Notifications.ClearVoiceNotifications(); #endif // analytics - disconnected player StatsEventDisconnectedData discData = new StatsEventDisconnectedData(); discData.m_CharacterId = g_Game.GetDatabaseID(); discData.m_Reason = "quit"; Analytics.PlayerDisconnected(discData); break; } case MPSessionFailEventTypeID: { CancelLoginQueue(); LoadingHide(true); SetConnecting(false); ProgressAsync.DestroyAllPendingProgresses(); if (GetGameState() == DayZGameState.CONNECTING) { SetGameState(DayZGameState.MAIN_MENU); } break; } case MPSessionPlayerReadyEventTypeID: { LoadingHide(true); ProgressAsync.DestroyAllPendingProgresses(); SetGameState(DayZGameState.IN_GAME); // analytics - spawned StatsEventSpawnedData spawnData = new StatsEventSpawnedData(); spawnData.m_CharacterId = g_Game.GetDatabaseID(); spawnData.m_Lifetime = 0; spawnData.m_Position = vector.Zero; if (GetPlayer()) { spawnData.m_Position = GetPlayer().GetPosition(); } spawnData.m_DaytimeHour = 0; spawnData.m_Population = 0; Analytics.PlayerSpawned(spawnData); #ifdef PLATFORM_CONSOLE m_Notifications.ClearVoiceNotifications(); OnlineServices.SetMultiplayState(true); #endif if (m_FirstConnect) { m_FirstConnect = false; if (GetHostAddress(address, port)) { AddVisitedServer(address, port); } #ifdef PLATFORM_CONSOLE #ifndef PLATFORM_WINDOWS // if app is not on Windows with -XBOX parameter if (null != GetUserManager().GetSelectedUser()) { OnlineServices.EnterGameplaySession(); OnlineServices.LoadVoicePrivilege(); } #endif #endif } UpdateInputDeviceDisconnectWarning(); break; } case MPConnectionLostEventTypeID: { MPConnectionLostEventParams conLost_params; if (Class.CastTo(conLost_params, params)) { int duration = conLost_params.param1; OnMPConnectionLostEvent(duration); } break; } case WorldCleaupEventTypeID: { LoadingShow(); break; } case DialogQueuedEventTypeID: { GetCallQueue(CALL_CATEGORY_SYSTEM).Call(g_Game.CheckDialogs); break; } case ChatMessageEventTypeID: { ChatMessageEventParams chat_params; if (Class.CastTo(chat_params, params)) { } break; } case ProgressEventTypeID: { ProgressEventParams prog_params; if (Class.CastTo(prog_params, params)) LoadProgressUpdate(prog_params.param1, prog_params.param2, prog_params.param3); break; } case LoginTimeEventTypeID: { LoginTimeEventParams loginTimeParams; if (Class.CastTo(loginTimeParams, params)) { OnLoginTimeEvent(loginTimeParams.param1); } break; } case RespawnEventTypeID: { RespawnEventParams respawnParams; if (Class.CastTo(respawnParams, params)) { OnRespawnEvent(respawnParams.param1); } break; } case PreloadEventTypeID: { PreloadEventParams preloadParams; if (Class.CastTo(preloadParams, params)) { OnPreloadEvent(preloadParams.param1); } break; } case LogoutEventTypeID: { LogoutEventParams logoutParams; if (Class.CastTo(logoutParams, params)) { GetCallQueue(CALL_CATEGORY_GUI).Call(GetMission().StartLogoutMenu, logoutParams.param1); } break; } case SelectedUserChangedEventTypeID: { OnlineServices.Init(); break; } case LoginStatusEventTypeID: { LoginStatusEventParams loginStatusParams; Class.CastTo(loginStatusParams, params); string msg1 = loginStatusParams.param1; string msg2 = loginStatusParams.param2; string finalMsg; // write either to login time screen or loading screen if (m_LoginTimeScreen) { finalMsg = msg1; // login time screen supports two lines if (msg2.Length() > 0) finalMsg += "\n" + msg2; m_LoginTimeScreen.SetStatus(finalMsg); } else if (m_loading) { // loading only one line, but it's a long one finalMsg = msg1 + " " + msg2; m_loading.SetStatus(finalMsg); } break; } case ConnectingStartEventTypeID: { g_Game.SetGameState(DayZGameState.CONNECTING); SetConnecting(true); break; } case ConnectingAbortEventTypeID: { g_Game.SetGameState(DayZGameState.MAIN_MENU); SetConnecting(false); if (m_ConnectFromJoin) { m_ConnectFromJoin = false; AbortMission(); } break; } case DLCOwnerShipFailedEventTypeID: { DLCOwnerShipFailedParams dlcParams; if (Class.CastTo(dlcParams, params)) { Print("### DLC Ownership failed !!! Map: " + dlcParams.param1); } break; } case ConnectivityStatsUpdatedEventTypeID: { ConnectivityStatsUpdatedEventParams connectivityStatsParams; if (Class.CastTo(connectivityStatsParams, params)) { PlayerIdentity playerIdentity = connectivityStatsParams.param1; int pingAvg = playerIdentity.GetPingAvg(); if (pingAvg < GetWorld().GetPingWarningThreshold()) { SetConnectivityStatState(EConnectivityStatType.PING, EConnectivityStatLevel.OFF); } else if (pingAvg < GetWorld().GetPingCriticalThreshold()) { SetConnectivityStatState(EConnectivityStatType.PING, EConnectivityStatLevel.LEVEL1); } else { SetConnectivityStatState(EConnectivityStatType.PING, EConnectivityStatLevel.LEVEL2); } } break; } case ServerFpsStatsUpdatedEventTypeID: { ServerFpsStatsUpdatedEventParams serverFpsStatsParams; if (Class.CastTo(serverFpsStatsParams, params)) { #ifdef DIAG_DEVELOPER m_ServerFpsStatsParams = serverFpsStatsParams; #endif float fps = serverFpsStatsParams.param1; if (fps > GetWorld().GetServerFpsWarningThreshold()) { SetConnectivityStatState(EConnectivityStatType.SERVER_PERF, EConnectivityStatLevel.OFF); } else if (fps > GetWorld().GetServerFpsCriticalThreshold()) { SetConnectivityStatState(EConnectivityStatType.SERVER_PERF, EConnectivityStatLevel.LEVEL1); } else { SetConnectivityStatState(EConnectivityStatType.SERVER_PERF, EConnectivityStatLevel.LEVEL2); } } break; } } VONManager.GetInstance().OnEvent(eventTypeId, params); Mission mission = GetMission(); if (mission) { mission.OnEvent(eventTypeId, params); } ErrorModuleHandler emh = ErrorModuleHandler.GetInstance(); if (emh) emh.OnEvent(eventTypeId, params); } protected void SetConnectivityStatState(EConnectivityStatType type, EConnectivityStatLevel level) { if (level != m_ConnectivityStatsStates[type]) { if (OnConnectivityStatChange(type, level, m_ConnectivityStatsStates[type]))//before setting the prev. level to be the current level, we need to make sure we successfully set the icon { m_ConnectivityStatsStates[type] = level; } } } protected bool OnConnectivityStatChange(EConnectivityStatType type, EConnectivityStatLevel newLevel, EConnectivityStatLevel oldLevel) { if (!GetGame() || !GetGame().GetMission()) return false; Hud hud = GetGame().GetMission().GetHud(); if (!hud) return false; hud.SetConnectivityStatIcon(type, newLevel); return true; } #ifdef DIAG_DEVELOPER private void DrawPerformanceStats(float pingAct, float pingAvg, float throttleInput, float throttleOutput) { DbgUI.Begin("Performance Stats", 720, 10); DbgUI.Text("pingAct:" + pingAct ); int color = COLOR_WHITE; if ( pingAvg >= GetWorld().GetPingCriticalThreshold()) color = COLOR_RED; else if ( pingAvg >= GetWorld().GetPingWarningThreshold()) color = COLOR_YELLOW; DbgUI.ColoredText(color, "pingAvg:" + pingAvg); DbgUI.Text("Ping Warning Threshold:" + GetWorld().GetPingWarningThreshold()); DbgUI.Text("Ping Critical Threshold:" + GetWorld().GetPingCriticalThreshold()); DbgUI.PlotLive("pingAvg history:", 300, 125, pingAvg, 100, 100 ); DbgUI.Text("Server Fps Warning Threshold:" + GetWorld().GetServerFpsWarningThreshold()); DbgUI.Text("Server Fps Critical Threshold:" + GetWorld().GetServerFpsCriticalThreshold()); if (m_ServerFpsStatsParams)// SERVER FPS { color = COLOR_WHITE; if ( m_ServerFpsStatsParams.param1 <= GetWorld().GetServerFpsCriticalThreshold()) color = COLOR_RED; else if ( m_ServerFpsStatsParams.param1 <= GetWorld().GetServerFpsWarningThreshold()) color = COLOR_YELLOW; DbgUI.ColoredText(color, "serverFPS:" + m_ServerFpsStatsParams.param1.ToString() ); DbgUI.PlotLive("serverFPS history:", 300, 125, m_ServerFpsStatsParams.param1, 100, 100 ); color = COLOR_WHITE; DbgUI.ColoredText(COLOR_WHITE, "serverFrameTime:" + m_ServerFpsStatsParams.param2.ToString() ); DbgUI.PlotLive("serverFrameTime history:", 300, 75, m_ServerFpsStatsParams.param2, 100, 100 ); color = COLOR_WHITE; if (m_ServerFpsStatsParams.param3 > 0) color = COLOR_RED; DbgUI.ColoredText(color, "physStepsSkippedServer:" + m_ServerFpsStatsParams.param3.ToString() ); DbgUI.PlotLive("physStepsSkippedServer history:", 300, 75, m_ServerFpsStatsParams.param3, 100, 100 ); color = COLOR_WHITE; if (m_ServerFpsStatsParams.param4 > 0) color = COLOR_RED; DbgUI.ColoredText(color, "physStepsSkippedClient:" + m_ServerFpsStatsParams.param4.ToString() ); DbgUI.PlotLive("physStepsSkippedClient history:", 300, 75, m_ServerFpsStatsParams.param4, 100, 100 ); } DbgUI.Text("throttleInput:" + throttleInput); DbgUI.PlotLive("throttleInput history:", 300, 75, throttleInput, 100, 50 ); DbgUI.Text("throttleOutput:" + throttleOutput); DbgUI.PlotLive("throttleOutput history:", 300, 75, throttleOutput, 100, 50 ); DbgUI.End(); } #endif void AddVoiceNotification(VONStopSpeakingEventParams vonStartParams) { m_Notifications.AddVoiceNotification(vonStartParams.param2, vonStartParams.param1); } void RemoveVoiceNotification(VONStopSpeakingEventParams vonStopParams) { m_Notifications.RemoveVoiceNotification(vonStopParams.param2); } // ------------------------------------------------------------ void UpdateLoginQueue(float timeslice) { int pos = GetUIManager().GetLoginQueuePosition(); //! Display login queue position dialog if (!m_LoginQueue && pos > 0) { GetUIManager().CloseAll(); if (GetMission()) { UIScriptedMenu parent = GetUIManager().GetMenu(); EnterLoginQueue(parent); } else { m_LoginQueue = new LoginQueueStatic(); GetUIManager().ShowScriptedMenu(m_LoginQueue, null); } } if (m_LoginQueue) { m_LoginQueue.SetPosition(pos); //! manually update static login queue dialog LoginQueueStatic loginQueue; if (LoginQueueBase.CastTo(loginQueue, m_LoginQueue)) { loginQueue.Update(timeslice); } } } // ------------------------------------------------------------ void OnLoginTimeEvent(int loginTime) { #ifndef NO_GUI // remove login queue if exits CancelLoginQueue(); GetUserManager().GetUserDatabaseIdAsync(); m_LoginTime = loginTime; // timer for login if (m_LoginTime > 0) { if (!m_LoginTimeScreen) { GetUIManager().CloseAll(); if (GetMission()) { UIScriptedMenu parent = GetUIManager().GetMenu(); EnterLoginTime(parent); } else { m_LoginTimeScreen = new LoginTimeStatic(); GetUIManager().ShowScriptedMenu(m_LoginTimeScreen, null); } } m_LoginTimeScreen.SetTime(m_LoginTime); m_LoginTimeScreen.Show(); GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(this.LoginTimeCountdown, 1000, true); } #endif } // ------------------------------------------------------------ void LoginTimeCountdown() { if (m_LoginTime > 0) { if (m_LoginTimeScreen) m_LoginTimeScreen.SetTime(m_LoginTime); m_LoginTime--; } else { // stop the call loop CancelLoginTimeCountdown(); } } // ------------------------------------------------------------ void OnRespawnEvent(int time) { // use login time screen for respawn timer if (time >= 0) { m_LoginTime = time; if (!m_LoginTimeScreen) { GetUIManager().CloseAll(); UIScriptedMenu parent = GetUIManager().GetMenu(); EnterLoginTime(parent); } m_LoginTimeScreen.SetRespawn(true); m_LoginTimeScreen.SetTime(m_LoginTime); m_LoginTimeScreen.Show(); GetCallQueue(CALL_CATEGORY_SYSTEM).CallLater(this.LoginTimeCountdown, 1000, true); } if (GetPlayer()) GetPlayer().StopDeathDarkeningEffect(); PPERequesterBank.GetRequester(PPERequester_DeathDarkening).Start(new Param1(1.0)); } // ------------------------------------------------------------ void OnPreloadEvent(vector pos) { // cancel only login time (respawn time is parallel with preload, but login time is not) if (m_LoginTimeScreen && !m_LoginTimeScreen.IsRespawn()) CancelLoginTimeCountdown(); // tell game to continue StoreLoginDataPrepare(); } // ------------------------------------------------------------ // Serialize and send default character information to server (must be called) void StoreLoginDataPrepare() { ScriptReadWriteContext ctx = new ScriptReadWriteContext; //GetMenuData().RequestGetDefaultCharacterData(); GetMenuDefaultCharacterData().SerializeCharacterData(ctx.GetWriteContext()); StoreLoginData(ctx.GetWriteContext()); } // ------------------------------------------------------------ void EnterLoginQueue(UIMenuPanel parent) { m_LoginQueue = LoginQueueBase.Cast(GetUIManager().EnterScriptedMenu(MENU_LOGIN_QUEUE, parent)); } // ------------------------------------------------------------ void EnterLoginTime(UIMenuPanel parent) { m_LoginTimeScreen = LoginTimeBase.Cast(GetUIManager().EnterScriptedMenu(MENU_LOGIN_TIME, parent)); } // ------------------------------------------------------------ void OnMPConnectionLostEvent(int duration) { if (duration >= 0)//(-1 means conn. reestablished) SetConnectivityStatState(EConnectivityStatType.CONN_LOST, EConnectivityStatLevel.LEVEL1); else SetConnectivityStatState(EConnectivityStatType.CONN_LOST, EConnectivityStatLevel.OFF); #ifdef PLATFORM_PS4 //PSN Set multiplay state if (duration < 0 && GetGameState() == DayZGameState.IN_GAME) { OnlineServices.SetMultiplayState(true); } else { OnlineServices.SetMultiplayState(false); } #endif } // ------------------------------------------------------------ void LoadProgressUpdate(int progressState, float progress, string title) { #ifndef NO_GUI switch (progressState) { case PROGRESS_START: { #ifndef NO_GUI // get out of the black screen immediately GetUIManager().ScreenFadeOut(0); #endif m_loading.Inc(); m_loading.SetTitle(title); if (m_loading.m_HintPanel) m_loading.m_HintPanel.ShowRandomPage(); } break; case PROGRESS_FINISH: { m_loading.Dec(); } break; case PROGRESS_PROGRESS: { m_loading.SetProgress(progress); } break; case PROGRESS_UPDATE: { m_loading.SetProgress(0); } break; } #endif } // ------------------------------------------------------------ override void OnAfterCreate() { Math.Randomize(-1); } // ------------------------------------------------------------ override void OnActivateMessage() { RefreshMouseCursorVisibility(); } // ------------------------------------------------------------ override void OnDeactivateMessage() { RefreshMouseCursorVisibility(); } // ------------------------------------------------------------ override bool OnInitialize() { ParticleList.PreloadParticles(); RegisterProfilesOptions(); SetHudBrightness(GetHUDBrightnessSetting()); InitNotifications(); m_Visited = new TStringArray; GetProfileStringList("SB_Visited", m_Visited); if (GetLoadState() == DayZLoadState.UNDEFINED) { string param; if (GetCLIParam("join", param)) { JoinLaunch(); #ifndef PLATFORM_PS4 CreateTitleScreen(); #endif } else if (GetCLIParam("connect", param)) { ConnectLaunch(); } else if (GetCLIParam("mission", param)) { MissionLaunch(); } else if (GetCLIParam("party", param)) { PartyLaunch(); } else { MainMenuLaunch(); } return true; } return false; } void InitNotifications() { NotificationSystem.InitInstance(); m_Notifications = new NotificationUI(); } protected ref Widget m_IntroMenu; protected ref Widget m_GamepadDisconnectMenu; //DEPRECATED protected int m_PrevBlur; protected string m_DatabaseID; protected string m_ConnectAddress; protected int m_ConnectPort; protected int m_ConnectSteamQueryPort; protected string m_ConnectPassword; protected const int MAX_VISITED = 50; protected ref TStringArray m_Visited; string GetDatabaseID() { return m_DatabaseID; } void SetDatabaseID(string id) { m_DatabaseID = id; if (GetUIManager().GetMenu()) { GetUIManager().GetMenu().Refresh(); } } void CreateTitleScreen() { DeleteTitleScreen(); m_IntroMenu = GetWorkspace().CreateWidgets("gui/layouts/xbox/day_z_title_screen.layout"); RichTextWidget text_widget = RichTextWidget.Cast(m_IntroMenu.FindAnyWidget("InputPromptText")); m_IntroMenu.FindAnyWidget("notification_root").Show(false); if (text_widget) { string text = Widget.TranslateString("#console_start_game"); #ifdef PLATFORM_XBOX BiosUserManager user_manager = GetGame().GetUserManager(); if (user_manager && user_manager.GetSelectedUser()) text_widget.SetText(string.Format(text, "")); else text_widget.SetText(string.Format(text, "")); #endif #ifdef PLATFORM_PS4 string confirm = "cross"; if (GetGame().GetInput().GetEnterButton() == GamepadButton.A) { confirm = "cross"; } else { confirm = "circle"; } text_widget.SetText(string.Format(text, "")); #endif } #ifdef PLATFORM_CONSOLE #ifdef PLATFORM_XBOX #ifdef BUILD_EXPERIMENTAL m_IntroMenu.FindAnyWidget("notification_root").Show(true); #endif #endif #endif } void DeleteTitleScreen() { if (m_IntroMenu) { delete m_IntroMenu; } } bool ShouldShowControllerDisconnect() { return m_ShouldShowControllerDisconnect; } void UpdateInputDeviceDisconnectWarning() { #ifdef PLATFORM_CONSOLE if (!GetUIManager().IsMenuOpen(MENU_WARNING_INPUTDEVICE_DISCONNECT)) { m_ShouldShowControllerDisconnect = !GetInput().AreAllAllowedInputDevicesActive(); if (m_ShouldShowControllerDisconnect) { GetCallQueue(CALL_CATEGORY_GUI).Call(GetUIManager().EnterScriptedMenu,MENU_WARNING_INPUTDEVICE_DISCONNECT,GetUIManager().GetMenu()); } } #endif } void JoinLaunch() { SetGameState(DayZGameState.JOIN); SetLoadState(DayZLoadState.JOIN_START); #ifdef PLATFORM_CONSOLE string join_param; if (GetCLIParam("join", join_param)) { BiosUserManager user_manager = GetUserManager(); user_manager.ParseJoinAsync(join_param); } #endif } void ConnectLaunch() { BiosUserManager user_manager = GetUserManager(); if (user_manager.GetTitleInitiator()) { user_manager.SelectUserEx(user_manager.GetTitleInitiator()); } SetGameState(DayZGameState.CONNECT); SetLoadState(DayZLoadState.CONNECT_START); #ifndef PLATFORM_WINDOWS #ifdef PLATFORM_CONSOLE CreateTitleScreen(); GamepadCheck(); #endif #else ConnectFromCLI(); #endif } void PartyLaunch() { SetGameState(DayZGameState.PARTY); SetLoadState(DayZLoadState.PARTY_START); BiosUserManager user_manager = GetGame().GetUserManager(); string param; if (GetCLIParam("party", param)) { user_manager.ParsePartyAsync(param); StartRandomCutscene(GetMainMenuWorld()); } } void MainMenuLaunch() { #ifdef PLATFORM_WINDOWS BiosUserManager user_manager = GetUserManager(); if (user_manager) { if (user_manager.GetTitleInitiator()) { user_manager.SelectUserEx(user_manager.GetTitleInitiator()); } } #endif SetGameState(DayZGameState.MAIN_MENU); SetLoadState(DayZLoadState.MAIN_MENU_START); StartRandomCutscene(GetMainMenuWorld()); DeleteTitleScreen(); } void MissionLaunch() { BiosUserManager user_manager = GetUserManager(); if (user_manager) { if (user_manager.GetTitleInitiator()) { user_manager.SelectUserEx(user_manager.GetTitleInitiator()); } } SetGameState(DayZGameState.IN_GAME); SetLoadState(DayZLoadState.MISSION_START); #ifndef PLATFORM_WINDOWS #ifdef PLATFORM_CONSOLE #ifndef DEVELOPER CreateTitleScreen(); GamepadCheck(); return; #endif #endif #endif string mission; GetCLIParam("mission", mission); PlayMission(mission); } void SelectUser(int gamepad = -1) { BiosUserManager user_manager = GetUserManager(); if (user_manager) { BiosUser selected_user; if (gamepad > -1) { GetInput().GetGamepadUser(gamepad, selected_user); #ifdef PLATFORM_PS4 if (selected_user) #endif { if (user_manager.SelectUserEx(selected_user)) { GetGame().GetInput().IdentifyGamepad(GamepadButton.BUTTON_NONE); GetInput().SelectActiveGamepad(gamepad); } else { selected_user = user_manager.GetSelectedUser(); } #ifdef PLATFORM_PS4 if (!selected_user.IsOnline()) { user_manager.LogOnUserAsync(selected_user); return; } #endif } #ifdef PLATFORM_PS4 else { GetInput().ResetActiveGamepad(); GamepadCheck(); } #endif } if (!selected_user) selected_user = user_manager.GetSelectedUser(); if (!selected_user) { user_manager.PickUserAsync(); return; } user_manager.SelectUserEx(selected_user); switch (GetLoadState()) { case DayZLoadState.JOIN_START: { SetLoadState(DayZLoadState.JOIN_USER_SELECT); break; } case DayZLoadState.PARTY_START: { SetLoadState(DayZLoadState.PARTY_USER_SELECT); break; } case DayZLoadState.MAIN_MENU_START: { SetLoadState(DayZLoadState.MAIN_MENU_USER_SELECT); break; } case DayZLoadState.CONNECT_START: { SetLoadState(DayZLoadState.CONNECT_USER_SELECT); break; } case DayZLoadState.MISSION_START: { SetLoadState(DayZLoadState.MISSION_USER_SELECT); break; } default: break; } SelectGamepad(); g_Game.SetHudBrightness(g_Game.GetHUDBrightnessSetting()); } } void SetPreviousGamepad(int gamepad) { m_PreviousGamepad = gamepad; } int GetPreviousGamepad() { return m_PreviousGamepad; } void GamepadCheck() { #ifndef AUTOTEST if (GetInput().IsActiveGamepadSelected()) { #endif DeleteTitleScreen(); SelectUser(); #ifndef AUTOTEST } else { #ifdef PLATFORM_CONSOLE #ifndef PLATFORM_WINDOWS #ifdef PLATFORM_PS4 if (GetUserManager().GetSelectedUser()) { int gamepad = GetInput().GetUserGamepad(GetUserManager().GetSelectedUser()); if (gamepad > -1) { SelectUser(gamepad); } else { if (!m_IntroMenu && !(GetGame().GetUIManager().GetMenu() && GetGame().GetUIManager().GetMenu().GetID() == MENU_TITLE_SCREEN)) CreateTitleScreen(); GetGame().GetInput().IdentifyGamepad(GetGame().GetInput().GetEnterButton()); } } else #endif { if (!m_IntroMenu && !(GetUIManager().GetMenu() && GetUIManager().GetMenu().GetID() == MENU_TITLE_SCREEN)) CreateTitleScreen(); GetInput().IdentifyGamepad(GetInput().GetEnterButton()); } #endif #endif } #endif } void SelectGamepad() { ResetProfileOptions(); BiosUserManager user_manager = GetUserManager(); if (user_manager) { BiosUser selected_user = user_manager.GetSelectedUser(); if (selected_user) { OnlineServices.SetBiosUser(selected_user); SetPlayerName(selected_user.GetName()); SetUserFOV(GetUserFOVFromConfig()); #ifdef PLATFORM_CONSOLE SetPlayerGameName(selected_user.GetName()); user_manager.GetUserDatabaseIdAsync(); #endif } if (GetUIManager().GetMenu()) { GetUIManager().GetMenu().Refresh(); } } switch (GetLoadState()) { case DayZLoadState.JOIN_USER_SELECT: { SetLoadState(DayZLoadState.JOIN_CONTROLLER_SELECT); OnlineServices.LoadMPPrivilege(); break; } case DayZLoadState.PARTY_USER_SELECT: { SetLoadState(DayZLoadState.PARTY_CONTROLLER_SELECT); DeleteTitleScreen(); GetUIManager().EnterScriptedMenu(MENU_SERVER_BROWSER, GetUIManager().GetMenu()); break; } case DayZLoadState.CONNECT_USER_SELECT: { SetLoadState(DayZLoadState.CONNECT_CONTROLLER_SELECT); OnlineServices.LoadMPPrivilege(); break; } case DayZLoadState.MAIN_MENU_USER_SELECT: { SetLoadState(DayZLoadState.MAIN_MENU_CONTROLLER_SELECT); DeleteTitleScreen(); GetUIManager().EnterScriptedMenu(MENU_MAIN, GetUIManager().GetMenu()); break; } case DayZLoadState.MISSION_USER_SELECT: { SetLoadState(DayZLoadState.MISSION_CONTROLLER_SELECT); DeleteTitleScreen(); string mission; GetCLIParam("mission", mission); PlayMission(mission); break; } } } void TryConnect() { if (GetLoadState() == DayZLoadState.JOIN_CONTROLLER_SELECT) { SetGameState(DayZGameState.CONNECTING); OnlineServices.GetSession(); } else { if (GetGameState() != DayZGameState.CONNECTING) { switch (GetLoadState()) { case DayZLoadState.CONNECT_CONTROLLER_SELECT: { SetGameState(DayZGameState.CONNECTING); ConnectFromCLI(); break; } case DayZLoadState.PARTY_CONTROLLER_SELECT: { SetGameState(DayZGameState.CONNECTING); Connect(); break; } case DayZLoadState.MAIN_MENU_CONTROLLER_SELECT: { SetGameState(DayZGameState.CONNECTING); Connect(); break; } } } else { string address; int port; if (GetHostAddress(address, port)) { if (m_ConnectAddress == address && m_ConnectPort == port) ErrorModuleHandler.ThrowError(ErrorCategory.ConnectErrorScript, EConnectErrorScript.ALREADY_CONNECTING_THIS); else ErrorModuleHandler.ThrowError(ErrorCategory.ConnectErrorScript, EConnectErrorScript.ALREADY_CONNECTING, string.Format("%1:%2", address, port)); } else { DisconnectSessionForce(); DisconnectSessionScript(); TryConnect(); } } } } bool GetLastVisitedServer(out string ip, out int port) { if (m_Visited) { if (m_Visited.Count() > 0) { string uid = m_Visited.Get(m_Visited.Count() - 1); TStringArray output = new TStringArray; uid.Split(":", output); ip = output[0]; port = output[1].ToInt(); return true; } } return false; } void AddVisitedServer(string ip, int port) { string uid = ip + ":" + port; if (m_Visited) { int pos = m_Visited.Find(uid); if (pos < 0) { if (m_Visited.Count() == MAX_VISITED) m_Visited.Remove(0); m_Visited.Insert(uid); } else { // if item is not saved as last server, move it if (pos != (m_Visited.Count() - 1)) { m_Visited.Remove(pos); m_Visited.Insert(uid); } } SetProfileStringList("SB_Visited", m_Visited); SaveProfile(); } } bool IsVisited(string ip, int port) { string uid = ip + ":" + port; int index = m_Visited.Find(uid); return (index >= 0); } void RefreshCurrentServerInfo() { string addr; int port; if (GetHostAddress(addr, port)) { m_ConnectAddress = addr; m_ConnectPort = port; } OnlineServices.GetCurrentServerInfo(m_ConnectAddress, m_ConnectPort); } void Connect() { SetConnecting(true); DeleteTitleScreen(); string addr; int port; if (GetHostAddress(addr, port)) { if (m_ConnectAddress == addr && m_ConnectPort == port) return; } string connectAddress = m_ConnectAddress; if (m_ConnectSteamQueryPort) connectAddress = string.Format("%1:%2:%3", m_ConnectAddress, m_ConnectPort, m_ConnectSteamQueryPort); if (Connect(GetUIManager().GetMenu(), connectAddress, m_ConnectPort, m_ConnectPassword) != 0) DisconnectSessionScript(true); } void DisconnectSessionScript(bool displayJoinError = false) { DisconnectSessionFlags flags = DisconnectSessionFlags.SELECT_USER | DisconnectSessionFlags.IGNORE_WHEN_IN_GAME; if (displayJoinError) { flags |= DisconnectSessionFlags.JOIN_ERROR_ENABLED; flags |= DisconnectSessionFlags.JOIN_ERROR_CHECK; } DisconnectSessionEx(flags); } void DisconnectSessionEx(DisconnectSessionFlags flags) { if (flags & DisconnectSessionFlags.SELECT_USER && OnlineServices.GetBiosUser()) { GetGame().GetUserManager().SelectUserEx(OnlineServices.GetBiosUser()); } if (flags & DisconnectSessionFlags.JOIN_ERROR_ENABLED) { if (!(flags & DisconnectSessionFlags.JOIN_ERROR_CHECK) || GetGameState() == DayZGameState.JOIN) { NotificationSystem.AddNotification(NotificationType.JOIN_FAIL_GET_SESSION, NotificationSystem.DEFAULT_TIME_DISPLAYED); } } if (flags & DisconnectSessionFlags.IGNORE_WHEN_IN_GAME && GetGameState() == DayZGameState.IN_GAME) { return; } if (flags & DisconnectSessionFlags.CLOSE_MENUS && GetGame().GetUIManager()) { GetGame().GetUIManager().CloseAllSubmenus(); if ( GetGame().GetUIManager().IsDialogVisible() ) { GetGame().GetUIManager().CloseDialog(); } } if (flags & DisconnectSessionFlags.ALWAYS_FORCE) { DisconnectSessionForce(); } if (GetGame().GetMission()) { if (g_Game.GetGameState() != DayZGameState.MAIN_MENU) { if (flags & DisconnectSessionFlags.DISCONNECT_ERROR_ENABLED) { NotificationSystem.AddNotification(NotificationType.DISCONNECTED, NotificationSystem.DEFAULT_TIME_DISPLAYED); } GetGame().GetMission().AbortMission(); SetGameState(DayZGameState.MAIN_MENU); SetLoadState(DayZLoadState.MAIN_MENU_CONTROLLER_SELECT); GamepadCheck(); } } else { MainMenuLaunch(); } } void ConnectFromServerBrowser(string ip, int port, string password = "") { m_ConnectAddress = ip; m_ConnectPort = port; m_ConnectPassword = password; m_ConnectFromJoin = false; OnlineServices.LoadMPPrivilege(); } void ConnectFromServerBrowserEx(string ip, int port, int steamQueryPort, string password = "") { m_ConnectSteamQueryPort = steamQueryPort; ConnectFromServerBrowser(ip, port, password); } void ConnectFromJoin(string ip, int port) { m_ConnectAddress = ip; m_ConnectPort = port; m_ConnectFromJoin = true; Connect(); } void ConnectFromCLI() { string port; if (GetCLIParam("connect", m_ConnectAddress)) { GetCLIParam("port", port); m_ConnectPort = port.ToInt(); GetCLIParam("password", m_ConnectPassword); m_ConnectFromJoin = false; Connect(); } } bool IsLeftCtrlDown() { return m_IsCtrlHolding; } // ------------------------------------------------------------ override void OnKeyPress(int key) { if (key == KeyCode.KC_LCONTROL) { m_IsCtrlHolding = true; } if (key == KeyCode.KC_LMENU) { m_IsLeftAltHolding = true; } if (key == KeyCode.KC_RMENU) { m_IsRightAltHolding = true; } if (m_keyboard_handler) { m_keyboard_handler.OnKeyDown(NULL, 0, 0, key); } Mission mission = GetMission(); if (mission) { mission.OnKeyPress(key); } #ifdef DEVELOPER if ((m_IsLeftAltHolding || m_IsLeftAltHolding) && key == KeyCode.KC_F4) { RequestExit(0); } #endif } // ------------------------------------------------------------ override void OnKeyRelease(int key) { if (key == KeyCode.KC_LCONTROL) { m_IsCtrlHolding = false; } if (key == KeyCode.KC_LWIN) { m_IsWinHolding = false; } if (key == KeyCode.KC_LMENU || key == KeyCode.KC_RMENU) { m_IsLeftAltHolding = false; } if (key == KeyCode.KC_RMENU) { m_IsRightAltHolding = false; } if (m_keyboard_handler) { m_keyboard_handler.OnKeyUp(NULL, 0, 0, key); } Mission mission = GetMission(); if (mission) { mission.OnKeyRelease(key); } } // ------------------------------------------------------------ override void OnMouseButtonPress(int button) { Mission mission = GetMission(); if (mission) { mission.OnMouseButtonPress(button); } } // ------------------------------------------------------------ override void OnMouseButtonRelease(int button) { Mission mission = GetMission(); if (mission) { mission.OnMouseButtonRelease(button); } } // ------------------------------------------------------------ override void OnDeviceReset() { m_IsCtrlHolding = false; m_IsWinHolding = false; m_IsLeftAltHolding = false; m_IsRightAltHolding = false; } // ------------------------------------------------------------ float GetDeltaT() { return m_DeltaTime; } // ------------------------------------------------------------ override void OnUpdate(bool doSim, float timeslice) { m_DeltaTime = timeslice; Mission mission = GetMission(); bool gameIsRunning = false; if (doSim && mission && !mission.IsPaused()) { gameIsRunning = true; } if (doSim && mission) { mission.OnUpdate(timeslice); // update local weather effects if ( IsClient() || !IsMultiplayer() ) { WorldData worldData = mission.GetWorldData(); if ( worldData ) worldData.UpdateWeatherEffects( GetWeather(), timeslice ); } } SEffectManager.OnUpdate(timeslice); // queues and timers update GetCallQueue(CALL_CATEGORY_SYSTEM).Tick(timeslice); GetUpdateQueue(CALL_CATEGORY_SYSTEM).Invoke(timeslice); GetTimerQueue(CALL_CATEGORY_SYSTEM).Tick(timeslice); #ifndef NO_GUI if (m_IsConnecting) UpdateLoginQueue(timeslice); if (m_loading && m_loading.IsLoading()) { m_loading.OnUpdate(timeslice); } else if (m_LoginTimeScreen && m_LoginTimeScreen.IsStatic()) { m_LoginTimeScreen.Update(timeslice); } else { GetCallQueue(CALL_CATEGORY_GUI).Tick(timeslice); GetUpdateQueue(CALL_CATEGORY_GUI).Invoke(timeslice); GetTimerQueue(CALL_CATEGORY_GUI).Tick(timeslice); GetDragQueue().Tick(); } NotificationSystem.Update(timeslice); if (m_Notifications) { m_Notifications.Update(timeslice); } #ifndef SERVER #ifdef DIAG_DEVELOPER if (GetGame().IsMultiplayer() && GetPlayer() && DiagMenu.GetBool(DiagMenuIDs.MISC_CONNECTION_STATS)) { PlayerIdentity playerIdentity = GetPlayer().GetIdentity(); if (playerIdentity) { int pingAct = playerIdentity.GetPingAct(); int pingAvg = playerIdentity.GetPingAvg(); float throttleInput = playerIdentity.GetInputThrottle(); float throttleOutput = playerIdentity.GetOutputThrottle(); DrawPerformanceStats(pingAct, pingAvg, throttleInput, throttleOutput); } } #endif #endif #endif if (gameIsRunning) { GetCallQueue(CALL_CATEGORY_GAMEPLAY).Tick(timeslice); GetUpdateQueue(CALL_CATEGORY_GAMEPLAY).Invoke(timeslice); GetTimerQueue(CALL_CATEGORY_GAMEPLAY).Tick(timeslice); } } // ------------------------------------------------------------ override void OnPostUpdate(bool doSim, float timeslice) { Mission mission = GetMission(); bool gameIsRunning = false; if (doSim && mission && !mission.IsPaused()) { gameIsRunning = true; } GetPostUpdateQueue(CALL_CATEGORY_SYSTEM).Invoke(timeslice); #ifndef NO_GUI if (m_loading && m_loading.IsLoading()) { } else if (m_LoginTimeScreen && m_LoginTimeScreen.IsStatic()) { } else { GetPostUpdateQueue(CALL_CATEGORY_GUI).Invoke(timeslice); } #endif if (gameIsRunning) { GetPostUpdateQueue(CALL_CATEGORY_GAMEPLAY).Invoke(timeslice); } } // ------------------------------------------------------------ override void OnRPC(PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx) { super.OnRPC(sender, target, rpc_type, ctx); Event_OnRPC.Invoke(sender, target, rpc_type, ctx); //Print("["+ GetGame().GetTime().ToString() +"] => DayZGame::OnRPC = "+ EnumTools.EnumToString(ERPCs,rpc_type)); if (target) { // call rpc on target target.OnRPC(sender, rpc_type, ctx); } else { switch (rpc_type) { #ifndef SERVER #ifndef NO_GUI case ERPCs.RPC_CFG_GAMEPLAY_SYNC: { CfgGameplayHandler.OnRPC(null, ctx); break; } case ERPCs.RPC_UNDERGROUND_SYNC: { UndergroundAreaLoader.OnRPC(ctx); break; } case ERPCs.RPC_PLAYERRESTRICTEDAREAS_SYNC: { CfgPlayerRestrictedAreaHandler.OnRPC(ctx); break; } case ERPCs.RPC_SEND_NOTIFICATION: { NotificationType type; float show_time; string detail_text; ctx.Read(type); ctx.Read(show_time); ctx.Read(detail_text); NotificationSystem.AddNotification(type, show_time, detail_text); break; } case ERPCs.RPC_SEND_NOTIFICATION_EXTENDED: { float show_time_ext; string title_text_ext; string detail_text_ext; string icon_ext; ctx.Read(show_time_ext); ctx.Read(title_text_ext); ctx.Read(detail_text_ext); ctx.Read(icon_ext); NotificationSystem.AddNotificationExtended(show_time_ext, title_text_ext, detail_text_ext, icon_ext); break; } case ERPCs.RPC_SOUND_HELICRASH: { bool playSound; vector pos; string sound_set; //Helicrash is a world event, we want anyone to be able to hear it Param3 playCrashSound = new Param3(false, "0 0 0",0); if (ctx.Read(playCrashSound)) { playSound = playCrashSound.param1; pos = playCrashSound.param2; sound_set = CrashSoundSets.GetSoundSetByHash(playCrashSound.param3); } if (playSound) { m_CrashSound = SEffectManager.PlaySound(sound_set, pos, 0.1, 0.1); m_CrashSound.SetAutodestroy(true); } break; } //Random off map artillery barrage case ERPCs.RPC_SOUND_ARTILLERY: { vector position; Param1 playArtySound = new Param1(vector.Zero); if (ctx.Read(playArtySound)) { position = playArtySound.param1; if (position == vector.Zero) break; } else break; if (!GetGame().GetPlayer()) break; if (vector.DistanceSq(GetGame().GetPlayer().GetPosition(), position) <= (MIN_ARTY_SOUND_RANGE * MIN_ARTY_SOUND_RANGE)) break; m_ArtySound = SEffectManager.PlaySound("Artillery_Distant_Barrage_SoundSet", position, 0.1, 0.1); m_ArtySound.SetAutodestroy(true); break; } case ERPCs.RPC_SOUND_CONTAMINATION: { vector soundPos; Param1 playContaminatedSound = new Param1(vector.Zero); if (ctx.Read(playContaminatedSound)) { soundPos = playContaminatedSound.param1; if (soundPos == vector.Zero) break; } else break; if (!GetGame().GetPlayer()) break; EffectSound closeArtySound = SEffectManager.PlaySound("Artillery_Close_SoundSet", soundPos); closeArtySound.SetAutodestroy(true); // We add camera shake upon shell detonation float distance_to_player = vector.DistanceSq(soundPos, GetGame().GetPlayer().GetPosition()); if (distance_to_player <= GameConstants.CAMERA_SHAKE_ARTILLERY_DISTANCE2) { float strength_factor = Math.InverseLerp(GameConstants.CAMERA_SHAKE_ARTILLERY_DISTANCE, 0, Math.Sqrt(distance_to_player)); DayZPlayerCamera camera = GetGame().GetPlayer().GetCurrentCamera(); if (camera) camera.SpawnCameraShake(strength_factor * 4); } ParticleManager.GetInstance().PlayInWorld(ParticleList.CONTAMINATED_AREA_GAS_SHELL, soundPos); break; } // Single artillery shot to announce dynamic contaminated area case ERPCs.RPC_SOUND_ARTILLERY_SINGLE: { vector soundPosition; vector delayedSoundPos; float soundDelay; Param3 playArtyShotSound = new Param3(vector.Zero, vector.Zero, 0); if (ctx.Read(playArtyShotSound)) { soundPosition = playArtyShotSound.param1; delayedSoundPos = playArtyShotSound.param2; soundDelay = playArtyShotSound.param3; if (soundPosition == vector.Zero) break; } else break; if (!GetGame().GetPlayer()) break; m_ArtySound = SEffectManager.PlaySound("Artillery_Distant_SoundSet", soundPosition, 0.1, 0.1); m_ArtySound.SetAutodestroy(true); // We remove the amount of time the incoming sound lasts soundDelay -= 5; // We convert to milliseconds soundDelay *= 1000; GetCallQueue(CALL_CATEGORY_GAMEPLAY).CallLater(DelayedMidAirDetonation, soundDelay, false, delayedSoundPos[0], delayedSoundPos[1], delayedSoundPos[2]); break; } case ERPCs.RPC_SET_BILLBOARDS: { if (!m_BillboardSetHandler) m_BillboardSetHandler = new BillboardSetHandler(); Param1 indexP = new Param1(-1); if (ctx.Read(indexP)) { int index = indexP.param1; m_BillboardSetHandler.OnRPCIndex(index); } break; } #endif #endif case ERPCs.RPC_USER_SYNC_PERMISSIONS: { map mute_list; if (ctx.Read(mute_list)) { for (int i = 0; i < mute_list.Count(); i++) { string uid = mute_list.GetKey(i); bool mute = mute_list.GetElement(i); MutePlayer(uid, sender.GetPlainId(), mute); } } break; } /* case ERPCs.RPC_SERVER_RESPAWN_MODE: { int mode; if (ctx.Read(mode) && !IsServer()) { GetMission().SetRespawnModeClient(mode); } } */ #ifdef DEVELOPER case ERPCs.DEV_SET_WEATHER: { Param1 p1data = new Param1(null); if ( ctx.Read(p1data) ) { DebugWeatherRPCData data = p1data.param1; if (data.m_FogValue >= 0) GetGame().GetWeather().GetFog().Set(data.m_FogValue, data.m_FogInterpolation, data.m_FogDuration); if (data.m_OvercastValue >= 0) GetGame().GetWeather().GetOvercast().Set(data.m_OvercastValue, data.m_OvercastInterpolation, data.m_OvercastDuration); if (data.m_RainValue >= 0) GetGame().GetWeather().GetRain().Set(data.m_RainValue, data.m_RainInterpolation, data.m_RainDuration); if (data.m_SnowfallValue >= 0) GetGame().GetWeather().GetSnowfall().Set(data.m_SnowfallValue, data.m_SnowfallInterpolation, data.m_SnowfallDuration); } else { ErrorEx("Failed to read weather debug data"); } break; } #endif #ifdef DIAG_DEVELOPER #ifdef SERVER case ERPCs.DIAG_CAMERATOOLS_CAM_DATA: { if (!m_CameraToolsMenuServer) { m_CameraToolsMenuServer = new CameraToolsMenuServer; } m_CameraToolsMenuServer.OnRPC(rpc_type, ctx); break; } case ERPCs.DIAG_CAMERATOOLS_CAM_SUBSCRIBE: { if (!m_CameraToolsMenuServer) { m_CameraToolsMenuServer = new CameraToolsMenuServer; } m_CameraToolsMenuServer.OnRPC(rpc_type, ctx); break; } #endif #endif } // global rpc's handling } } void DelayedMidAirDetonation(float x, float y, float z) { EffectSound artilleryFallSound = SEffectManager.PlaySound("Artillery_Fall_SoundSet", Vector(x, y, z)); artilleryFallSound.SetAutodestroy(true); } // ------------------------------------------------------------ void CheckDialogs() { #ifndef NO_GUI Mission mission = GetMission(); if (mission && !m_loading.IsLoading() && GetUIManager().IsDialogQueued()) { mission.Pause(); GetUIManager().ShowQueuedDialog(); } #endif } //! Returns true when connecting to server void SetConnecting(bool value) { m_IsConnecting = value; } bool IsConnecting() { return m_IsConnecting; } // ------------------------------------------------------------ bool IsLoading() { return m_loading && m_loading.IsLoading(); } // ------------------------------------------------------------ void SetKeyboardHandle(UIScriptedMenu handler) { m_keyboard_handler = handler; } // ------------------------------------------------------------ void LoadingShow() { #ifndef NO_GUI m_loading.ShowEx(this); #endif } // ------------------------------------------------------------ void LoadingHide(bool force = false) { #ifndef NO_GUI m_loading.Hide(force); // turn the lights back on PPEManagerStatic.GetPPEManager().StopAllEffects(); #ifdef PLATFORM_CONSOLE if (!IsLoading()) { if (m_LoadState != DayZLoadState.MAIN_MENU_START && m_LoadState != DayZLoadState.MAIN_MENU_USER_SELECT) { UpdateInputDeviceDisconnectWarning(); } } #endif #endif } // ------------------------------------------------------------ override string CreateDefaultPlayer() { if (m_CharClassNames.Count() > 0) return m_CharClassNames[0]; return ""; } // ------------------------------------------------------------ override string CreateRandomPlayer() { return m_CharClassNames.GetRandomElement(); } // ------------------------------------------------------------ override TStringArray ListAvailableCharacters() { return m_CharClassNames; } // ------------------------------------------------------------ void ExplosionEffectsEx(Object source, Object directHit, int componentIndex, float energyFactor, float explosionFactor, HitInfo hitInfo) { vector pos = hitInfo.GetPosition(); string ammoType = hitInfo.GetAmmoType(); // Call legacy method ExplosionEffects(source, directHit, componentIndex, hitInfo.GetSurface(), pos, hitInfo.GetSurfaceNormal(), energyFactor, explosionFactor, hitInfo.IsWater(), ammoType); // add explosion noise if (IsServer()) { //NoiseParams npar = new NoiseParams(); m_NoiseParams.LoadFromPath(string.Format("cfgAmmo %1 NoiseExplosion", ammoType)); float multiplier = hitInfo.GetSurfaceNoiseMultiplier(); if (multiplier == 0) multiplier = 1; GetNoiseSystem().AddNoiseTarget(pos, 21, m_NoiseParams, multiplier * GetGame().GetWeather().GetNoiseReductionByWeather()); } } // ------------------------------------------------------------ void ExplosionEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, float energyFactor, float explosionFactor, bool isWater, string ammoType) { #ifndef SERVER if (source) { source.OnExplosionEffects(source, directHit, componentIndex, surface, pos, surfNormal, energyFactor, explosionFactor, isWater, ammoType); if (source.ShootsExplosiveAmmo() && ammoType == "Explosion_40mm_Ammo") ParticleManager.GetInstance().PlayInWorld(ParticleList.EXPLOSION_LANDMINE, pos); float distance_to_player = vector.Distance(pos, GetGame().GetPlayer().GetPosition()); m_AmmoShakeParams.Load(ammoType); if (distance_to_player < m_AmmoShakeParams.m_Radius) { float dist01 = Math.InverseLerp(0, m_AmmoShakeParams.m_Radius, distance_to_player); float modifier = Math.Lerp(m_AmmoShakeParams.m_ModifierClose, m_AmmoShakeParams.m_ModifierFar,dist01); GetGame().GetPlayer().GetCurrentCamera().SpawnCameraShake(modifier * m_AmmoShakeParams.m_Strength); } } #endif } // ------------------------------------------------------------ void OnProjectileStopped(ProjectileStoppedInfo info) { string simulation; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " simulation", simulation); if (simulation == "shotArrow") { string pile; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " spawnPileType", pile); EntityAI arrow = EntityAI.Cast(GetGame().CreateObjectEx(pile, info.GetPos(), ECE_DYNAMIC_PERSISTENCY)); arrow.PlaceOnSurface(); arrow.SetFromProjectile(info); } } const float ARROW_PIERCE_DEPTH = 0.05; // ------------------------------------------------------------ void OnProjectileStoppedInTerrain(TerrainCollisionInfo info) { string simulation; if (info.GetIsWater()) return; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " simulation", simulation); if (simulation == "shotArrow") { string pile; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " spawnPileType", pile); vector pos = info.GetPos(); vector dir = -info.GetInVelocity(); dir.Normalize(); pos -= dir * ARROW_PIERCE_DEPTH; EntityAI arrow = EntityAI.Cast(GetGame().CreateObjectEx(pile, pos, ECE_KEEPHEIGHT|ECE_DYNAMIC_PERSISTENCY)); arrow.SetDirection(dir); arrow.SetFromProjectile(info); } } // ------------------------------------------------------------ void OnProjectileStoppedInObject(ObjectCollisionInfo info) { string simulation; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " simulation", simulation); if (simulation == "shotArrow") { string pile; GetGame().ConfigGetText("cfgAmmo " + info.GetAmmoType() + " spawnPileType", pile); EntityAI arrow = null; EntityAI ent = EntityAI.Cast(info.GetHitObj()); if (ent) { EntityAI parent = ent.GetHierarchyParent(); if (parent && parent.IsPlayer()) { arrow = EntityAI.Cast(GetGame().CreateObjectEx(pile, parent.GetPosition(), ECE_DYNAMIC_PERSISTENCY)); arrow.PlaceOnSurface(); arrow.SetFromProjectile(info); return; } } vector pos = info.GetPos(); vector dir = -info.GetInVelocity(); dir.Normalize(); pos -= dir * ARROW_PIERCE_DEPTH; arrow = EntityAI.Cast(GetGame().CreateObjectEx(pile, pos, ECE_KEEPHEIGHT|ECE_DYNAMIC_PERSISTENCY)); arrow.SetDirection(dir); arrow.SetFromProjectile(info); info.GetHitObj().AddArrow(arrow, info.GetComponentIndex(), info.GetHitObjPos(), info.GetHitObjRot()); } } // ------------------------------------------------------------ void FirearmEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, vector exitPos, vector inSpeed, vector outSpeed, bool isWater, bool deflected, string ammoType) { #ifndef SERVER ImpactEffectsData impactEffectsData = new ImpactEffectsData(); impactEffectsData.m_DirectHit = directHit; impactEffectsData.m_ComponentIndex = componentIndex; impactEffectsData.m_Surface = surface; impactEffectsData.m_Position = pos; impactEffectsData.m_ImpactType = ImpactTypes.UNKNOWN; impactEffectsData.m_SurfaceNormal = surfNormal; impactEffectsData.m_ExitPosition = exitPos; impactEffectsData.m_InSpeed = inSpeed; impactEffectsData.m_OutSpeed = outSpeed; impactEffectsData.m_IsDeflected = deflected; impactEffectsData.m_AmmoType = ammoType; impactEffectsData.m_IsWater = isWater; if (directHit) { directHit.OnReceivedHit(impactEffectsData); } ImpactMaterials.EvaluateImpactEffectEx(impactEffectsData); #endif if (IsServer()) { if (source && source.ShootsExplosiveAmmo() && !deflected && outSpeed == vector.Zero) { if (ammoType == "Bullet_40mm_ChemGas") { GetGame().CreateObject("ContaminatedArea_Local", pos); } else if (ammoType == "Bullet_40mm_Explosive") { DamageSystem.ExplosionDamage(EntityAI.Cast(source), null, "Explosion_40mm_Ammo", pos, DamageType.EXPLOSION); } } // add hit noise m_NoiseParams.LoadFromPath("cfgAmmo " + ammoType + " NoiseHit"); float surfaceCoef = SurfaceGetNoiseMultiplier(directHit, pos, componentIndex); float coefAdjusted = surfaceCoef * inSpeed.Length() / ConfigGetFloat("cfgAmmo " + ammoType + " initSpeed"); if (coefAdjusted == 0) coefAdjusted = 1; GetNoiseSystem().AddNoiseTarget(pos, 10, m_NoiseParams, coefAdjusted * GetGame().GetWeather().GetNoiseReductionByWeather()); // Leave a ping for 5 seconds } } // ------------------------------------------------------------ void CloseCombatEffects(Object source, Object directHit, int componentIndex, string surface, vector pos, vector surfNormal, bool isWater, string ammoType) { #ifndef SERVER ImpactEffectsData impactEffectsData = new ImpactEffectsData(); impactEffectsData.m_DirectHit = directHit; impactEffectsData.m_ComponentIndex = componentIndex; impactEffectsData.m_Surface = surface; impactEffectsData.m_Position = pos; impactEffectsData.m_ImpactType = ImpactTypes.MELEE; impactEffectsData.m_SurfaceNormal = Vector(Math.RandomFloat(-1,1), Math.RandomFloat(-1,1), Math.RandomFloat(-1,1)); impactEffectsData.m_ExitPosition = "0 0 0"; impactEffectsData.m_InSpeed = "0 0 0"; impactEffectsData.m_OutSpeed = "0 0 0"; impactEffectsData.m_IsDeflected = false; impactEffectsData.m_AmmoType = ammoType; impactEffectsData.m_IsWater = isWater; if (directHit) directHit.OnReceivedHit(impactEffectsData); ImpactMaterials.EvaluateImpactEffectEx(impactEffectsData); #endif // add hit noise if (IsServer()) { m_NoiseParams.LoadFromPath("cfgAmmo " + ammoType + " NoiseHit"); float surfaceCoef = SurfaceGetNoiseMultiplier(directHit, pos, componentIndex); if (surfaceCoef == 0) surfaceCoef = 1; GetNoiseSystem().AddNoisePos(EntityAI.Cast(source), pos, m_NoiseParams, surfaceCoef * GetGame().GetWeather().GetNoiseReductionByWeather()); } } void UpdateVoiceLevel(int level) { GetMission().UpdateVoiceLevelWidgets(level); } void InitCharacterMenuDataInfo(int menudata_count) { m_OriginalCharactersCount = menudata_count; } void SetPlayerGameName(string name) { m_PlayerName = name; } string GetPlayerGameName() { return m_PlayerName; } void SetNewCharacter(bool state) { m_IsNewCharacter = state; } bool IsNewCharacter() { return m_IsNewCharacter; } void SetUserFOV(float pFov) { if (pFov < OPTIONS_FIELD_OF_VIEW_MIN) pFov = OPTIONS_FIELD_OF_VIEW_MIN; if (pFov > OPTIONS_FIELD_OF_VIEW_MAX) pFov = OPTIONS_FIELD_OF_VIEW_MAX; m_UserFOV = pFov; } float GetUserFOV() { return m_UserFOV; } static float GetUserFOVFromConfig() { GameOptions gameOptions = new GameOptions; NumericOptionsAccess noa; if (gameOptions && Class.CastTo(noa,gameOptions.GetOptionByType(OptionAccessType.AT_OPTIONS_FIELD_OF_VIEW))) { return noa.ReadValue(); } return 1.0; } float GetFOVByZoomType(ECameraZoomType type) { switch (type) { case ECameraZoomType.NONE: return GetUserFOV(); case ECameraZoomType.NORMAL: return Math.Min(GetUserFOV(), GameConstants.DZPLAYER_CAMERA_FOV_EYEZOOM); case ECameraZoomType.SHALLOW: return Math.Min(GetUserFOV(),GameConstants.DZPLAYER_CAMERA_FOV_EYEZOOM_SHALLOW); default: return GetUserFOV(); } return GetUserFOV(); } void SetHudBrightness(float value) { Widget.SetLV(value); Widget.SetTextLV(value); } float GetHUDBrightnessSetting() { return g_Game.GetProfileOptionFloat(EDayZProfilesOptions.HUD_BRIGHTNESS); } // Check if ammo is compatible with a weapon in hands static bool CheckAmmoCompability(EntityAI weaponInHand, EntityAI ammo) { TStringArray ammo_names = new TStringArray; // Array of ammo types (their name) that can be used with weapon in hand string cfg_path = "CfgWeapons " + weaponInHand.GetType() + " chamberableFrom"; // Create config path GetGame().ConfigGetTextArray(cfg_path, ammo_names); // Get ammo types foreach (string ammo_name : ammo_names) // for every ammo in ammo string compare passed ammo { if (ammo.GetType() == ammo_name) { return true; } } // if no ammo from the array matches with ammo passed, return false return false; } void SetEVValue(float value) { m_PreviousEVValue = m_EVValue; SetEVUser(value); m_EVValue = value; } float GetCurrentEVValue() { return m_EVValue; } float GetPreviousEVValue() { return m_PreviousEVValue; } int GetCurrentDisplayLanguageIdx() { ListOptionsAccess language_option; GameOptions options = new GameOptions(); language_option = ListOptionsAccess.Cast(options.GetOptionByType(OptionAccessType.AT_OPTIONS_LANGUAGE)); int idx = -1; if (language_option) { idx = language_option.GetIndex(); } return idx; } bool IsWorldWetTempUpdateEnabled() { return m_IsWorldWetTempUpdateEnabled; } bool IsFoodDecayEnabled() { return (GetFoodDecayModifier() != 0); } float GetFoodDecayModifier() { #ifdef DIAG_DEVELOPER if (FeatureTimeAccel.GetFeatureTimeAccelEnabled(ETimeAccelCategories.FOOD_DECAY)) { return m_FoodDecayModifier * FeatureTimeAccel.GetFeatureTimeAccelValue(); } #endif return m_FoodDecayModifier; } array GetConnectedInputDeviceList() { if (!m_ConnectedInputDeviceList) { m_ConnectedInputDeviceList = new array; } return m_ConnectedInputDeviceList; } void SetMouseCursorDesiredVisibility(bool visible) { m_CursorDesiredVisibilityScript = visible; RefreshMouseCursorVisibility(); } bool GetMouseCursorDesiredVisibility() { return m_CursorDesiredVisibilityScript; } //! extend as needed, only game focus and M&K setting (consoles only!) are checked natively bool CanDisplayMouseCursor() { //! Only checking on console because while loading on PC, the mouse might not be detected #ifdef PLATFORM_CONSOLE if (GetInput()) { return GetInput().IsMouseConnected(); } #endif //! Platform defaults #ifdef PLATFORM_CONSOLE return false; #else return true; #endif } void RefreshMouseCursorVisibility() { #ifndef NO_GUI #ifdef FEATURE_CURSOR if (!IsAppActive()) { ShowCursorWidget(true); } else #endif { bool showCursor = m_CursorDesiredVisibilityScript && CanDisplayMouseCursor(); UIManager ui = GetUIManager(); if (ui) { //! Handles app active-ness ui.ShowCursor(showCursor); } else { //! Fallback, just in-case ShowCursorWidget(showCursor); } } #endif } BillboardSetHandler GetBillboardHandler() { return m_BillboardSetHandler; } /////////////// //DEPRECATED// ////////////// void CreateGamepadDisconnectMenu(); void DeleteGamepadDisconnectMenu(); }; DayZGame g_Game; DayZGame GetDayZGame() { return g_Game; }