227 lines
6.2 KiB
C#
227 lines
6.2 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Diagnostics;
|
|
using ExitGames.Client.Photon;
|
|
using UnityEngine;
|
|
|
|
internal class PhotonHandler : MonoBehaviour
|
|
{
|
|
public static PhotonHandler SP;
|
|
|
|
public int updateInterval;
|
|
|
|
public int updateIntervalOnSerialize;
|
|
|
|
private int nextSendTickCount;
|
|
|
|
private int nextSendTickCountOnSerialize;
|
|
|
|
private static bool sendThreadShouldRun;
|
|
|
|
private static Stopwatch timerToStopConnectionInBackground;
|
|
|
|
protected internal static bool AppQuits;
|
|
|
|
protected internal static Type PingImplementation;
|
|
|
|
private const string PlayerPrefsKey = "PUNCloudBestRegion";
|
|
|
|
internal static CloudRegionCode BestRegionCodeInPreferences
|
|
{
|
|
get
|
|
{
|
|
string text = PlayerPrefs.GetString("PUNCloudBestRegion", string.Empty);
|
|
if (!string.IsNullOrEmpty(text))
|
|
{
|
|
return Region.Parse(text);
|
|
}
|
|
return CloudRegionCode.none;
|
|
}
|
|
set
|
|
{
|
|
if (value == CloudRegionCode.none)
|
|
{
|
|
PlayerPrefs.DeleteKey("PUNCloudBestRegion");
|
|
}
|
|
else
|
|
{
|
|
PlayerPrefs.SetString("PUNCloudBestRegion", value.ToString());
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void Awake()
|
|
{
|
|
if (SP != null && SP != this && SP.gameObject != null)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(SP.gameObject);
|
|
}
|
|
SP = this;
|
|
UnityEngine.Object.DontDestroyOnLoad(base.gameObject);
|
|
updateInterval = 1000 / PhotonNetwork.sendRate;
|
|
updateIntervalOnSerialize = 1000 / PhotonNetwork.sendRateOnSerialize;
|
|
StartFallbackSendAckThread();
|
|
}
|
|
|
|
protected void OnLevelWasLoaded(int level)
|
|
{
|
|
PhotonNetwork.networkingPeer.NewSceneLoaded();
|
|
PhotonNetwork.networkingPeer.SetLevelInPropsIfSynced(SceneManagerHelper.ActiveSceneName);
|
|
}
|
|
|
|
protected void OnApplicationQuit()
|
|
{
|
|
AppQuits = true;
|
|
StopFallbackSendAckThread();
|
|
PhotonNetwork.Disconnect();
|
|
}
|
|
|
|
protected void OnApplicationPause(bool pause)
|
|
{
|
|
if (PhotonNetwork.BackgroundTimeout > 0.1f)
|
|
{
|
|
if (timerToStopConnectionInBackground == null)
|
|
{
|
|
timerToStopConnectionInBackground = new Stopwatch();
|
|
}
|
|
timerToStopConnectionInBackground.Reset();
|
|
if (pause)
|
|
{
|
|
timerToStopConnectionInBackground.Start();
|
|
}
|
|
else
|
|
{
|
|
timerToStopConnectionInBackground.Stop();
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void OnDestroy()
|
|
{
|
|
StopFallbackSendAckThread();
|
|
}
|
|
|
|
protected void Update()
|
|
{
|
|
if (PhotonNetwork.networkingPeer == null)
|
|
{
|
|
UnityEngine.Debug.LogError("NetworkPeer broke!");
|
|
}
|
|
else
|
|
{
|
|
if (PhotonNetwork.connectionStateDetailed == ClientState.PeerCreated || PhotonNetwork.connectionStateDetailed == ClientState.Disconnected || PhotonNetwork.offlineMode || !PhotonNetwork.isMessageQueueRunning)
|
|
{
|
|
return;
|
|
}
|
|
bool flag = true;
|
|
while (PhotonNetwork.isMessageQueueRunning && flag)
|
|
{
|
|
flag = PhotonNetwork.networkingPeer.DispatchIncomingCommands();
|
|
}
|
|
int num = (int)(Time.realtimeSinceStartup * 1000f);
|
|
if (PhotonNetwork.isMessageQueueRunning && num > nextSendTickCountOnSerialize)
|
|
{
|
|
PhotonNetwork.networkingPeer.RunViewUpdate();
|
|
nextSendTickCountOnSerialize = num + updateIntervalOnSerialize;
|
|
nextSendTickCount = 0;
|
|
}
|
|
num = (int)(Time.realtimeSinceStartup * 1000f);
|
|
if (num > nextSendTickCount)
|
|
{
|
|
bool flag2 = true;
|
|
while (PhotonNetwork.isMessageQueueRunning && flag2)
|
|
{
|
|
flag2 = PhotonNetwork.networkingPeer.SendOutgoingCommands();
|
|
}
|
|
nextSendTickCount = num + updateInterval;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected void OnJoinedRoom()
|
|
{
|
|
PhotonNetwork.networkingPeer.LoadLevelIfSynced();
|
|
}
|
|
|
|
protected void OnCreatedRoom()
|
|
{
|
|
PhotonNetwork.networkingPeer.SetLevelInPropsIfSynced(SceneManagerHelper.ActiveSceneName);
|
|
}
|
|
|
|
public static void StartFallbackSendAckThread()
|
|
{
|
|
if (!sendThreadShouldRun)
|
|
{
|
|
sendThreadShouldRun = true;
|
|
SupportClass.StartBackgroundCalls(FallbackSendAckThread, 100, string.Empty);
|
|
}
|
|
}
|
|
|
|
public static void StopFallbackSendAckThread()
|
|
{
|
|
sendThreadShouldRun = false;
|
|
}
|
|
|
|
public static bool FallbackSendAckThread()
|
|
{
|
|
if (sendThreadShouldRun && !PhotonNetwork.offlineMode && PhotonNetwork.networkingPeer != null)
|
|
{
|
|
if (timerToStopConnectionInBackground != null && PhotonNetwork.BackgroundTimeout > 0.1f && (float)timerToStopConnectionInBackground.ElapsedMilliseconds > PhotonNetwork.BackgroundTimeout * 1000f)
|
|
{
|
|
if (PhotonNetwork.connected)
|
|
{
|
|
PhotonNetwork.Disconnect();
|
|
}
|
|
timerToStopConnectionInBackground.Stop();
|
|
timerToStopConnectionInBackground.Reset();
|
|
return sendThreadShouldRun;
|
|
}
|
|
if (PhotonNetwork.networkingPeer.ConnectionTime - PhotonNetwork.networkingPeer.LastSendOutgoingTime > 200)
|
|
{
|
|
PhotonNetwork.networkingPeer.SendAcksOnly();
|
|
}
|
|
}
|
|
return sendThreadShouldRun;
|
|
}
|
|
|
|
protected internal static void PingAvailableRegionsAndConnectToBest()
|
|
{
|
|
SP.StartCoroutine(SP.PingAvailableRegionsCoroutine(true));
|
|
}
|
|
|
|
internal IEnumerator PingAvailableRegionsCoroutine(bool connectToBest)
|
|
{
|
|
while (PhotonNetwork.networkingPeer.AvailableRegions == null)
|
|
{
|
|
if (PhotonNetwork.connectionStateDetailed != ClientState.ConnectingToNameServer && PhotonNetwork.connectionStateDetailed != ClientState.ConnectedToNameServer)
|
|
{
|
|
UnityEngine.Debug.LogError("Call ConnectToNameServer to ping available regions.");
|
|
yield break;
|
|
}
|
|
UnityEngine.Debug.Log(string.Concat("Waiting for AvailableRegions. State: ", PhotonNetwork.connectionStateDetailed, " Server: ", PhotonNetwork.Server, " PhotonNetwork.networkingPeer.AvailableRegions ", PhotonNetwork.networkingPeer.AvailableRegions != null));
|
|
yield return new WaitForSeconds(0.25f);
|
|
}
|
|
if (PhotonNetwork.networkingPeer.AvailableRegions == null || PhotonNetwork.networkingPeer.AvailableRegions.Count == 0)
|
|
{
|
|
UnityEngine.Debug.LogError("No regions available. Are you sure your appid is valid and setup?");
|
|
yield break;
|
|
}
|
|
PhotonPingManager pingManager = new PhotonPingManager();
|
|
foreach (Region availableRegion in PhotonNetwork.networkingPeer.AvailableRegions)
|
|
{
|
|
SP.StartCoroutine(pingManager.PingSocket(availableRegion));
|
|
}
|
|
while (!pingManager.Done)
|
|
{
|
|
yield return new WaitForSeconds(0.1f);
|
|
}
|
|
Region best = pingManager.BestRegion;
|
|
BestRegionCodeInPreferences = best.Code;
|
|
UnityEngine.Debug.Log(string.Concat("Found best region: '", best.Code, "' ping: ", best.Ping, ". Calling ConnectToRegionMaster() is: ", connectToBest));
|
|
if (connectToBest)
|
|
{
|
|
PhotonNetwork.networkingPeer.ConnectToRegionMaster(best.Code);
|
|
}
|
|
}
|
|
}
|