| using System; |
| using System; |
| using System.Collections; |
| using System.Collections; |
| using System.Runtime.CompilerServices; |
| using System.Runtime.CompilerServices; |
| using PlayFab; |
| using PlayFab; |
| using PlayFab.ClientModels; |
| using PlayFab.ClientModels; |
| using PlayFab.Party; |
| using PlayFab.Party; |
| using UnityEngine; |
| using UnityEngine; |
| |
| |
| public class PlayFabManager : MonoBehaviour |
| public class PlayFabManager : MonoBehaviour |
| { |
| { |
| public static bool IsLoggedIn |
| public static bool IsLoggedIn |
| { |
| { |
| get |
| get |
| { |
| { |
| return !(PlayFabManager.instance == null) && PlayFabManager.instance.m_loginState == LoginState.LoggedIn; |
| return !(PlayFabManager.instance == null) && PlayFabManager.instance.m_loginState == LoginState.LoggedIn; |
| } |
| } |
| } |
| } |
| |
| |
| public static LoginState CurrentLoginState |
| public static LoginState CurrentLoginState |
| { |
| { |
| get |
| get |
| { |
| { |
| if (PlayFabManager.instance == null) |
| if (PlayFabManager.instance == null) |
| { |
| { |
| return LoginState.NotLoggedIn; |
| return LoginState.NotLoggedIn; |
| } |
| } |
| return PlayFabManager.instance.m_loginState; |
| return PlayFabManager.instance.m_loginState; |
| } |
| } |
| } |
| } |
| |
| |
| public static DateTime NextRetryUtc { get; private set; } = DateTime.MinValue; |
| public static DateTime NextRetryUtc { get; private set; } = DateTime.MinValue; |
| |
| |
| public EntityKey Entity { get; private set; } |
| public EntityKey Entity { get; private set; } |
| |
| |
| public event LoginFinishedCallback LoginFinished; |
| public event LoginFinishedCallback LoginFinished; |
| |
| |
| public static PlayFabManager instance { get; private set; } |
| public static PlayFabManager instance { get; private set; } |
| |
| |
| public static void SetCustomId(PrivilegeManager.Platform platform, string id) |
| public static void SetCustomId(PrivilegeManager.Platform platform, string id) |
| { |
| { |
| PlayFabManager.m_customId = PrivilegeManager.GetPlatformPrefix(platform) + id; |
| PlayFabManager.m_customId = PrivilegeManager.GetPlatformPrefix(platform) + id; |
| ZLog.Log(string.Format("PlayFab custom ID set to \"{0}\"", PlayFabManager.m_customId)); |
| ZLog.Log(string.Format("PlayFab custom ID set to \"{0}\"", PlayFabManager.m_customId)); |
| if (PlayFabManager.instance != null && PlayFabManager.CurrentLoginState == LoginState.NotLoggedIn) |
| if (PlayFabManager.instance != null && PlayFabManager.CurrentLoginState == LoginState.NotLoggedIn) |
| { |
| { |
| PlayFabManager.instance.Login(); |
| PlayFabManager.instance.Login(); |
| } |
| } |
| } |
| } |
| |
| |
| public static void Initialize() |
| public static void Initialize() |
| { |
| { |
| if (PlayFabManager.instance == null) |
| if (PlayFabManager.instance == null) |
| { |
| { |
| Application.logMessageReceived += PlayFabManager.HandleLog; |
| Application.logMessageReceived += PlayFabManager.HandleLog; |
| new GameObject("PlayFabManager").AddComponent<PlayFabManager>(); |
| new GameObject("PlayFabManager").AddComponent<PlayFabManager>(); |
| new GameObject("PlayFabMultiplayerManager").AddComponent<PlayFabMultiplayerManager>(); |
| new GameObject("PlayFabMultiplayerManager").AddComponent<PlayFabMultiplayerManager>(); |
| } |
| } |
| } |
| } |
| |
| |
| public void Start() |
| public void Start() |
| { |
| { |
| if (PlayFabManager.instance != null) |
| if (PlayFabManager.instance != null) |
| { |
| { |
| ZLog.LogError("Tried to create another PlayFabManager when one already exists! Ignoring and destroying the new one."); |
| ZLog.LogError("Tried to create another PlayFabManager when one already exists! Ignoring and destroying the new one."); |
| UnityEngine.Object.Destroy(this); |
| UnityEngine.Object.Destroy(this); |
| return; |
| return; |
| } |
| } |
| PlayFabManager.instance = this; |
| PlayFabManager.instance = this; |
| UnityEngine.Object.DontDestroyOnLoad(base.gameObject); |
| UnityEngine.Object.DontDestroyOnLoad(base.gameObject); |
| this.Login(); |
| this.Login(); |
| base.Invoke("StopListeningToLogMsgs", 5f); |
| base.Invoke("StopListeningToLogMsgs", 5f); |
| } |
| } |
| |
| |
| private void Login() |
| private void Login() |
| { |
| { |
| this.m_loginAttempts++; |
| this.m_loginAttempts++; |
| ZLog.Log(string.Format("Sending PlayFab login request (attempt {0})", this.m_loginAttempts)); |
| ZLog.Log(string.Format("Sending PlayFab login request (attempt {0})", this.m_loginAttempts)); |
| if (PlayFabManager.m_customId != null) |
| if (PlayFabManager.m_customId != null) |
| { |
| { |
| this.LoginWithCustomId(); |
| this.LoginWithCustomId(); |
| return; |
| return; |
| } |
| } |
| ZLog.Log("Login postponed until ID has been set."); |
| ZLog.Log("Login postponed until ID has been set."); |
| } |
| } |
| |
| |
| private void LoginWithCustomId() |
| private void LoginWithCustomId() |
| { |
| { |
| if (this.m_loginState == LoginState.NotLoggedIn || this.m_loginState == LoginState.WaitingForRetry) |
| if (this.m_loginState == LoginState.NotLoggedIn || this.m_loginState == LoginState.WaitingForRetry) |
| { |
| { |
| this.m_loginState = LoginState.AttemptingLogin; |
| this.m_loginState = LoginState.AttemptingLogin; |
| PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest |
| PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest |
| { |
| { |
| CustomId = PlayFabManager.m_customId, |
| CustomId = PlayFabManager.m_customId, |
| CreateAccount = new bool?(true) |
| CreateAccount = new bool?(true) |
| }, new Action<LoginResult>(this.OnLoginSuccess), new Action<PlayFabError>(this.OnLoginFailure), null, null); |
| }, new Action<LoginResult>(this.OnLoginSuccess), new Action<PlayFabError>(this.OnLoginFailure), null, null); |
| return; |
| return; |
| } |
| } |
| ZLog.LogError(string.Concat(new string[] |
| ZLog.LogError(string.Concat(new string[] |
| { |
| { |
| "Tried to log in while in the ", |
| "Tried to log in while in the ", |
| this.m_loginState.ToString(), |
| this.m_loginState.ToString(), |
| " state! Can only log in when in the ", |
| " state! Can only log in when in the ", |
| LoginState.NotLoggedIn.ToString(), |
| LoginState.NotLoggedIn.ToString(), |
| " or ", |
| " or ", |
| LoginState.WaitingForRetry.ToString(), |
| LoginState.WaitingForRetry.ToString(), |
| " state!" |
| " state!" |
| })); |
| })); |
| } |
| } |
| |
| |
| public void OnLoginSuccess(LoginResult result) |
| public void OnLoginSuccess(LoginResult result) |
| { |
| { |
| if (PlayFabManager.<OnLoginSuccess>g__IsPlayFab|36_0(PlayFabManager.m_customId) && !PlayFabManager.IsLoggedIn) |
| if (PlayFabManager.<OnLoginSuccess>g__IsPlayFab|36_0(PlayFabManager.m_customId) && !PlayFabManager.IsLoggedIn) |
| { |
| { |
| PrivilegeData privilegeData = default(PrivilegeData); |
| PrivilegeData privilegeData = default(PrivilegeData); |
| privilegeData.platformCanAccess = delegate(PrivilegeManager.Permission permission, PrivilegeManager.User targetSteamId, CanAccessResult canAccessCb) |
| privilegeData.platformCanAccess = delegate(PrivilegeManager.Permission permission, PrivilegeManager.User targetSteamId, CanAccessResult canAccessCb) |
| { |
| { |
| canAccessCb(PrivilegeManager.Result.Allowed); |
| canAccessCb(PrivilegeManager.Result.Allowed); |
| }; |
| }; |
| privilegeData.platformUserId = Convert.ToUInt64(result.EntityToken.Entity.Id, 16); |
| privilegeData.platformUserId = Convert.ToUInt64(result.EntityToken.Entity.Id, 16); |
| privilegeData.canAccessOnlineMultiplayer = true; |
| privilegeData.canAccessOnlineMultiplayer = true; |
| privilegeData.canViewUserGeneratedContentAll = true; |
| privilegeData.canViewUserGeneratedContentAll = true; |
| privilegeData.canCrossplay = true; |
| privilegeData.canCrossplay = true; |
| PrivilegeManager.SetPrivilegeData(privilegeData); |
| PrivilegeManager.SetPrivilegeData(privilegeData); |
| } |
| } |
| this.Entity = result.EntityToken.Entity; |
| this.Entity = result.EntityToken.Entity; |
| this.m_entityToken = result.EntityToken.EntityToken; |
| this.m_entityToken = result.EntityToken.EntityToken; |
| this.m_tokenExpiration = result.EntityToken.TokenExpiration; |
| this.m_tokenExpiration = result.EntityToken.TokenExpiration; |
| if (this.m_tokenExpiration == null) |
| if (this.m_tokenExpiration == null) |
| { |
| { |
| ZLog.LogError("Token expiration time was null!"); |
| ZLog.LogError("Token expiration time was null!"); |
| this.m_loginState = LoginState.LoggedIn; |
| this.m_loginState = LoginState.LoggedIn; |
| return; |
| return; |
| } |
| } |
| this.m_refreshThresh = (float)(this.m_tokenExpiration.Value - DateTime.UtcNow).TotalSeconds / 2f; |
| this.m_refreshThresh = (float)(this.m_tokenExpiration.Value - DateTime.UtcNow).TotalSeconds / 2f; |
| if (PlayFabManager.IsLoggedIn) |
| if (PlayFabManager.IsLoggedIn) |
| { |
| { |
| ZLog.Log(string.Format("PlayFab local entity ID {0} lifetime extended ", this.Entity.Id)); |
| ZLog.Log(string.Format("PlayFab local entity ID {0} lifetime extended ", this.Entity.Id)); |
| LoginFinishedCallback loginFinished = this.LoginFinished; |
| LoginFinishedCallback loginFinished = this.LoginFinished; |
| if (loginFinished != null) |
| if (loginFinished != null) |
| { |
| { |
| loginFinished(LoginType.Refresh); |
| loginFinished(LoginType.Refresh); |
| } |
| } |
| } |
| } |
| else |
| else |
| { |
| { |
| if (PlayFabManager.m_customId != null) |
| if (PlayFabManager.m_customId != null) |
| { |
| { |
| ZLog.Log(string.Format("PlayFab logged in as \"{0}\"", PlayFabManager.m_customId)); |
| ZLog.Log(string.Format("PlayFab logged in as \"{0}\"", PlayFabManager.m_customId)); |
| } |
| } |
| ZLog.Log("PlayFab local entity ID is " + this.Entity.Id); |
| ZLog.Log("PlayFab local entity ID is " + this.Entity.Id); |
| this.m_loginState = LoginState.LoggedIn; |
| this.m_loginState = LoginState.LoggedIn; |
| LoginFinishedCallback loginFinished2 = this.LoginFinished; |
| LoginFinishedCallback loginFinished2 = this.LoginFinished; |
| if (loginFinished2 != null) |
| if (loginFinished2 != null) |
| { |
| { |
| loginFinished2(LoginType.Success); |
| loginFinished2(LoginType.Success); |
| } |
| } |
| } |
| } |
| if (this.m_updateEntityTokenCoroutine == null) |
| if (this.m_updateEntityTokenCoroutine == null) |
| { |
| { |
| this.m_updateEntityTokenCoroutine = base.StartCoroutine(this.UpdateEntityTokenCoroutine()); |
| this.m_updateEntityTokenCoroutine = base.StartCoroutine(this.UpdateEntityTokenCoroutine()); |
| } |
| } |
| ZPlayFabMatchmaking.OnLogin(); |
| ZPlayFabMatchmaking.OnLogin(); |
| } |
| } |
| |
| |
| public void OnLoginFailure(PlayFabError error) |
| public void OnLoginFailure(PlayFabError error) |
| { |
| { |
| ZLog.LogError(error.GenerateErrorReport()); |
| ZLog.LogError(error.GenerateErrorReport()); |
| this.RetryLoginAfterDelay(this.GetRetryDelay(this.m_loginAttempts)); |
| this.RetryLoginAfterDelay(this.GetRetryDelay(this.m_loginAttempts)); |
| } |
| } |
| |
| |
| private float GetRetryDelay(int attemptCount) |
| private float GetRetryDelay(int attemptCount) |
| { |
| { |
| return Mathf.Min(1f * Mathf.Pow(2f, (float)(attemptCount - 1)), 30f) * UnityEngine.Random.Range(0.875f, 1.125f); |
| return Mathf.Min(1f * Mathf.Pow(2f, (float)(attemptCount - 1)), 30f) * UnityEngine.Random.Range(0.875f, 1.125f); |
| } |
| } |
| |
| |
| private void RetryLoginAfterDelay(float delay) |
| private void RetryLoginAfterDelay(float delay) |
| { |
| { |
| this.m_loginState = LoginState.WaitingForRetry; |
| this.m_loginState = LoginState.WaitingForRetry; |
| ZLog.Log(string.Format("Retrying login in {0}s", delay)); |
| ZLog.Log(string.Format("Retrying login in {0}s", delay)); |
| base.StartCoroutine(this.<RetryLoginAfterDelay>g__DelayThenLoginCoroutine|39_0(delay)); |
| base.StartCoroutine(this.<RetryLoginAfterDelay>g__DelayThenLoginCoroutine|39_0(delay)); |
| } |
| } |
| |
| |
| private IEnumerator UpdateEntityTokenCoroutine() |
| private IEnumerator UpdateEntityTokenCoroutine() |
| { |
| { |
| for (;;) |
| for (;;) |
| { |
| { |
| yield return new WaitForSecondsRealtime(420f); |
| yield return new WaitForSecondsRealtime(420f); |
| ZLog.Log("Update PlayFab entity token"); |
| ZLog.Log("Update PlayFab entity token"); |
| PlayFabMultiplayerManager.Get().UpdateEntityToken(this.m_entityToken); |
| PlayFabMultiplayerManager.Get().UpdateEntityToken(this.m_entityToken); |
| if (this.m_tokenExpiration == null) |
| if (this.m_tokenExpiration == null) |
| { |
| { |
| break; |
| break; |
| } |
| } |
| if ((float)(this.m_tokenExpiration.Value - DateTime.UtcNow).TotalSeconds <= this.m_refreshThresh) |
| if ((float)(this.m_tokenExpiration.Value - DateTime.UtcNow).TotalSeconds <= this.m_refreshThresh) |
| { |
| { |
| ZLog.Log("Renew PlayFab entity token"); |
| ZLog.Log("Renew PlayFab entity token"); |
| this.m_refreshThresh /= 1.5f; |
| this.m_refreshThresh /= 1.5f; |
| if (PlayFabManager.m_customId != null) |
| if (PlayFabManager.m_customId != null) |
| { |
| { |
| PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest |
| PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest |
| { |
| { |
| CustomId = PlayFabManager.m_customId |
| CustomId = PlayFabManager.m_customId |
| }, new Action<LoginResult>(this.OnLoginSuccess), new Action<PlayFabError>(this.OnLoginFailure), null, null); |
| }, new Action<LoginResult>(this.OnLoginSuccess), new Action<PlayFabError>(this.OnLoginFailure), null, null); |
| } |
| } |
| } |
| } |
| yield return new WaitForSecondsRealtime(UnityEngine.Random.Range(420f, 840f)); |
| yield return new WaitForSecondsRealtime(UnityEngine.Random.Range(420f, 840f)); |
| } |
| } |
| ZLog.LogError("Token expiration time was null!"); |
| ZLog.LogError("Token expiration time was null!"); |
| this.m_updateEntityTokenCoroutine = null; |
| this.m_updateEntityTokenCoroutine = null; |
| yield break; |
| yield break; |
| yield break; |
| yield break; |
| } |
| } |
| |
| |
| private static void HandleLog(string logString, string stackTrace, LogType type) |
| private static void HandleLog(string logString, string stackTrace, LogType type) |
| { |
| { |
| if (type == LogType.Exception && logString.ToLower().Contains("DllNotFoundException: Party", StringComparison.InvariantCultureIgnoreCase)) |
| if (type == LogType.Exception && logString.ToLower().Contains("DllNotFoundException: Party", StringComparison.InvariantCultureIgnoreCase)) |
| { |
| { |
| . | ZLog.LogError("DLL Not Found: This error usually occurs when you do not have the Microsoft Visual C++ Redistributables installed. Please install them from here: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist, and restart the game."); |
| ZLog.LogError("DLL Not Found: This error usually occurs when you do not have the correct dependencies installed, and will prevent crossplay from working. The dependencies are different depending on which platform you play on.\n For windows: You need VC++ Redistributables. https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170Linux: You need Pulse Audio. https://learn.microsoft.com/it-it/gaming/playfab/features/multiplayer/networking/linux-specific-requirementsSteam deck: Try using Proton Compatability Layer.Other platforms: If the issue persists, please report it as a bug."); |
| UnityEngine.Object.FindObjectOfType<PlayFabManager>().WaitForPopupEnabled(); |
| UnityEngine.Object.FindObjectOfType<PlayFabManager>().WaitForPopupEnabled(); |
| } |
| } |
| } |
| } |
| |
| |
| private void StopListeningToLogMsgs() |
| private void StopListeningToLogMsgs() |
| { |
| { |
| Application.logMessageReceived -= PlayFabManager.HandleLog; |
| Application.logMessageReceived -= PlayFabManager.HandleLog; |
| } |
| } |
| |
| |
| private void WaitForPopupEnabled() |
| private void WaitForPopupEnabled() |
| { |
| { |
| if (UnifiedPopup.IsAvailable()) |
| if (UnifiedPopup.IsAvailable()) |
| { |
| { |
| this.DelayedVCRedistWarningPopup(); |
| this.DelayedVCRedistWarningPopup(); |
| return; |
| return; |
| } |
| } |
| UnifiedPopup.OnPopupEnabled += this.DelayedVCRedistWarningPopup; |
| UnifiedPopup.OnPopupEnabled += this.DelayedVCRedistWarningPopup; |
| } |
| } |
| |
| |
| private void DelayedVCRedistWarningPopup() |
| private void DelayedVCRedistWarningPopup() |
| { |
| { |
| . | UnifiedPopup.Push(new WarningPopup("$playfab_couldnotloadplayfabparty_header", "$playfab_couldnotloadplayfabparty_text", delegate |
| string playFabErrorBodyText = this.GetPlayFabErrorBodyText(); |
| |
| UnifiedPopup.Push(new WarningPopup("$playfab_couldnotloadplayfabparty_header", playFabErrorBodyText, delegate |
| { |
| { |
| UnifiedPopup.Pop(); |
| UnifiedPopup.Pop(); |
| }, true)); |
| }, true)); |
| UnifiedPopup.OnPopupEnabled -= this.DelayedVCRedistWarningPopup; |
| UnifiedPopup.OnPopupEnabled -= this.DelayedVCRedistWarningPopup; |
| Application.logMessageReceived -= PlayFabManager.HandleLog; |
| Application.logMessageReceived -= PlayFabManager.HandleLog; |
| . | |
| } |
| |
| |
| |
| private string GetPlayFabErrorBodyText() |
| |
| { |
| |
| string text; |
| |
| if (Settings.IsSteamRunningOnSteamDeck()) |
| |
| { |
| |
| text = "$playfab_couldnotloadplayfabparty_text_linux_steamdeck"; |
| |
| } |
| |
| else if (!Settings.IsSteamRunningOnSteamDeck() && (Application.platform == RuntimePlatform.LinuxPlayer || Application.platform == RuntimePlatform.WindowsServer || Application.platform == RuntimePlatform.WindowsEditor)) |
| |
| { |
| |
| text = "$playfab_couldnotloadplayfabparty_text_linux"; |
| |
| } |
| |
| else if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsServer || Application.platform == RuntimePlatform.WindowsEditor) |
| |
| { |
| |
| text = "$playfab_couldnotloadplayfabparty_text_windows"; |
| |
| } |
| |
| else |
| |
| { |
| |
| text = "$playfab_couldnotloadplayfabparty_text_otherplatforms"; |
| |
| } |
| |
| return text; |
| } |
| } |
| |
| |
| public void LoginFailed() |
| public void LoginFailed() |
| { |
| { |
| this.RetryLoginAfterDelay(this.GetRetryDelay(this.m_loginAttempts)); |
| this.RetryLoginAfterDelay(this.GetRetryDelay(this.m_loginAttempts)); |
| } |
| } |
| |
| |
| private void Update() |
| private void Update() |
| { |
| { |
| ZPlayFabMatchmaking instance = ZPlayFabMatchmaking.instance; |
| ZPlayFabMatchmaking instance = ZPlayFabMatchmaking.instance; |
| if (instance == null) |
| if (instance == null) |
| { |
| { |
| return; |
| return; |
| } |
| } |
| instance.Update(Time.unscaledDeltaTime); |
| instance.Update(Time.unscaledDeltaTime); |
| } |
| } |
| |
| |
| [CompilerGenerated] |
| [CompilerGenerated] |
| internal static bool <OnLoginSuccess>g__IsPlayFab|36_0(string id) |
| internal static bool <OnLoginSuccess>g__IsPlayFab|36_0(string id) |
| { |
| { |
| return PlayFabManager.m_customId != null && id.StartsWith(PrivilegeManager.GetPlatformPrefix(PrivilegeManager.Platform.PlayFab)); |
| return PlayFabManager.m_customId != null && id.StartsWith(PrivilegeManager.GetPlatformPrefix(PrivilegeManager.Platform.PlayFab)); |
| } |
| } |
| |
| |
| [CompilerGenerated] |
| [CompilerGenerated] |
| private IEnumerator <RetryLoginAfterDelay>g__DelayThenLoginCoroutine|39_0(float delay) |
| private IEnumerator <RetryLoginAfterDelay>g__DelayThenLoginCoroutine|39_0(float delay) |
| { |
| { |
| ZLog.Log(string.Format("PlayFab login failed! Retrying in {0}s, total attempts: {1}", delay, this.m_loginAttempts)); |
| ZLog.Log(string.Format("PlayFab login failed! Retrying in {0}s, total attempts: {1}", delay, this.m_loginAttempts)); |
| PlayFabManager.NextRetryUtc = DateTime.UtcNow + TimeSpan.FromSeconds((double)delay); |
| PlayFabManager.NextRetryUtc = DateTime.UtcNow + TimeSpan.FromSeconds((double)delay); |
| while (DateTime.UtcNow < PlayFabManager.NextRetryUtc) |
| while (DateTime.UtcNow < PlayFabManager.NextRetryUtc) |
| { |
| { |
| yield return null; |
| yield return null; |
| } |
| } |
| this.Login(); |
| this.Login(); |
| yield break; |
| yield break; |
| } |
| } |
| |
| |
| public const string TitleId = "6E223"; |
| public const string TitleId = "6E223"; |
| |
| |
| private LoginState m_loginState; |
| private LoginState m_loginState; |
| |
| |
| private string m_entityToken; |
| private string m_entityToken; |
| |
| |
| private DateTime? m_tokenExpiration; |
| private DateTime? m_tokenExpiration; |
| |
| |
| private float m_refreshThresh; |
| private float m_refreshThresh; |
| |
| |
| private int m_loginAttempts; |
| private int m_loginAttempts; |
| |
| |
| private const float EntityTokenUpdateDurationMin = 420f; |
| private const float EntityTokenUpdateDurationMin = 420f; |
| |
| |
| private const float EntityTokenUpdateDurationMax = 840f; |
| private const float EntityTokenUpdateDurationMax = 840f; |
| |
| |
| private const float LoginRetryDelay = 1f; |
| private const float LoginRetryDelay = 1f; |
| |
| |
| private const float LoginRetryDelayMax = 30f; |
| private const float LoginRetryDelayMax = 30f; |
| |
| |
| private const float LoginRetryJitterFactor = 0.125f; |
| private const float LoginRetryJitterFactor = 0.125f; |
| |
| |
| private static string m_customId; |
| private static string m_customId; |
| |
| |
| private Coroutine m_updateEntityTokenCoroutine; |
| private Coroutine m_updateEntityTokenCoroutine; |
| } |
| } |
| |
| |