Files
UltimateFishing/Assets/Scripts/Assembly-CSharp/PhotonHandler.cs
2026-02-21 16:45:37 +08:00

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);
}
}
}