summaryrefslogtreecommitdiff
path: root/GameCode/NetworkConnectionHandler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'GameCode/NetworkConnectionHandler.cs')
-rw-r--r--GameCode/NetworkConnectionHandler.cs450
1 files changed, 450 insertions, 0 deletions
diff --git a/GameCode/NetworkConnectionHandler.cs b/GameCode/NetworkConnectionHandler.cs
new file mode 100644
index 0000000..b55d8bc
--- /dev/null
+++ b/GameCode/NetworkConnectionHandler.cs
@@ -0,0 +1,450 @@
+using System;
+using System.Collections;
+using ExitGames.Client.Photon;
+using Landfall.Network;
+using Photon.Pun;
+using Photon.Realtime;
+using SoundImplementation;
+using Steamworks;
+using UnityEngine;
+
+public class NetworkConnectionHandler : MonoBehaviourPunCallbacks
+{
+ public static readonly string TWITCH_PLAYER_SCORE_KEY = "TwitchScore";
+
+ public static readonly string TWITCH_ROOM_AUDIENCE_RATING_KEY = "C0";
+
+ public static NetworkConnectionHandler instance;
+
+ private static ClientSteamLobby m_SteamLobby;
+
+ private bool m_SearchingQuickMatch;
+
+ private bool m_SearchingTwitch;
+
+ private int currentViewers = 100;
+
+ private TypedLobby sqlLobby = new TypedLobby("customSqlLobby", LobbyType.SqlLobby);
+
+ public bool hasRegionSelect;
+
+ private bool m_ForceRegion;
+
+ private bool isConnectedToMaster;
+
+ private float untilTryOtherRegionCounter;
+
+ private void Start()
+ {
+ instance = this;
+ PhotonNetwork.ServerPortOverrides = PhotonPortDefinition.AlternativeUdpPorts;
+ PhotonNetwork.CrcCheckEnabled = true;
+ PhotonNetwork.NetworkingClient.LoadBalancingPeer.DisconnectTimeout = 30000;
+ if (m_SteamLobby == null)
+ {
+ m_SteamLobby = new ClientSteamLobby();
+ }
+ else
+ {
+ m_SteamLobby.LeaveLobby();
+ }
+ }
+
+ private void Update()
+ {
+ if (m_SearchingQuickMatch && PhotonNetwork.InRoom && !PhotonNetwork.OfflineMode && !GM_ArmsRace.instance)
+ {
+ untilTryOtherRegionCounter -= Time.deltaTime;
+ if (untilTryOtherRegionCounter < 0f)
+ {
+ StartCoroutine(PlayOnBestActiveRegion());
+ }
+ }
+ }
+
+ public void QuickMatch()
+ {
+ m_SearchingQuickMatch = true;
+ m_SearchingTwitch = false;
+ TimeHandler.instance.gameStartTime = 1f;
+ LoadingScreen.instance?.StartLoading();
+ StartCoroutine(DoActionWhenConnected(JoinRandomRoom));
+ }
+
+ public void TwitchJoin(int score)
+ {
+ currentViewers = Mathf.Clamp(score, 1, score);
+ m_SearchingQuickMatch = false;
+ m_SearchingTwitch = true;
+ ExitGames.Client.Photon.Hashtable customProperties = PhotonNetwork.LocalPlayer.CustomProperties;
+ if (customProperties.ContainsKey(TWITCH_PLAYER_SCORE_KEY))
+ {
+ customProperties[TWITCH_PLAYER_SCORE_KEY] = score;
+ }
+ else
+ {
+ customProperties.Add(TWITCH_PLAYER_SCORE_KEY, score);
+ }
+ PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties);
+ TimeHandler.instance.gameStartTime = 1f;
+ LoadingScreen.instance?.StartLoading();
+ StartCoroutine(DoActionWhenConnected(JoinSpecificTWITCHRoom));
+ }
+
+ public void HostPrivateAndInviteFriend()
+ {
+ m_SearchingQuickMatch = false;
+ m_SearchingTwitch = false;
+ TimeHandler.instance.gameStartTime = 1f;
+ LoadingScreen.instance?.StartLoading(privateGame: true);
+ RoomOptions options = new RoomOptions();
+ options.MaxPlayers = 2;
+ options.IsOpen = true;
+ options.IsVisible = false;
+ m_SteamLobby.ShowInviteScreenWhenConnected();
+ StartCoroutine(DoActionWhenConnected(delegate
+ {
+ CreateRoom(options);
+ }));
+ }
+
+ private void JoinRandomRoom()
+ {
+ Debug.Log("Joining random room");
+ PhotonNetwork.JoinRandomRoom();
+ }
+
+ private void CreateSpecificTWITCHRoom()
+ {
+ Debug.Log("Creating SPECIFIC TWITCH ROOM!");
+ RoomOptions roomOptions = new RoomOptions();
+ roomOptions.CustomRoomProperties = new ExitGames.Client.Photon.Hashtable { { TWITCH_ROOM_AUDIENCE_RATING_KEY, currentViewers } };
+ roomOptions.CustomRoomPropertiesForLobby = new string[1] { TWITCH_ROOM_AUDIENCE_RATING_KEY };
+ PhotonNetwork.CreateRoom(null, roomOptions, sqlLobby);
+ }
+
+ private void JoinSpecificTWITCHRoom()
+ {
+ Debug.Log("JOINING SPECIFIC TWITCH ROOM!");
+ int num = 5;
+ int num2 = currentViewers * num;
+ int num3 = currentViewers / num;
+ int num4 = 10;
+ int num5 = currentViewers * num4;
+ int num6 = currentViewers / num4;
+ int num7 = 10000000;
+ int num8 = currentViewers * num7;
+ int num9 = currentViewers / num7;
+ string text = "";
+ text = text + "C0 BETWEEN " + num3 + " AND " + num2 + ";";
+ text = text + "C0 BETWEEN " + num6 + " AND " + num5 + ";";
+ text = text + "C0 BETWEEN " + num9 + " AND " + num8;
+ PhotonNetwork.JoinRandomRoom(null, 0, MatchmakingMode.FillRoom, sqlLobby, text);
+ }
+
+ public override void OnJoinRoomFailed(short returnCode, string message)
+ {
+ Debug.Log("JOINED RANDOM ROOM FAILED!");
+ if (!m_SearchingTwitch)
+ {
+ JoinRandomRoom();
+ }
+ else
+ {
+ CreateSpecificTWITCHRoom();
+ }
+ }
+
+ private IEnumerator DoActionWhenConnected(Action action)
+ {
+ yield return WaitForConnect();
+ action();
+ }
+
+ private IEnumerator PlayOnBestActiveRegion()
+ {
+ if (PhotonNetwork.InRoom)
+ {
+ PhotonNetwork.LeaveRoom();
+ while (PhotonNetwork.InRoom)
+ {
+ yield return null;
+ }
+ }
+ string[] regionsToTry = new string[13]
+ {
+ "usw", "eu", "us", "au", "ru", "za", "asia", "cae", "in", "jp",
+ "rue", "sa", "kr"
+ };
+ float bestRegionScore = 0f;
+ string bestRegion = "";
+ for (int i = 0; i < regionsToTry.Length; i++)
+ {
+ isConnectedToMaster = false;
+ PhotonNetwork.Disconnect();
+ while (PhotonNetwork.IsConnected)
+ {
+ yield return null;
+ }
+ PhotonNetwork.ConnectToRegion(regionsToTry[i]);
+ Debug.Log("connectToRegion " + regionsToTry[i]);
+ isConnectedToMaster = false;
+ while (!isConnectedToMaster)
+ {
+ yield return null;
+ }
+ int countOfPlayersInRooms = PhotonNetwork.CountOfPlayersInRooms;
+ int ping = PhotonNetwork.GetPing();
+ float num = (float)Mathf.Clamp(countOfPlayersInRooms, 0, 50) / Mathf.Clamp(ping, 10f, 1E+11f);
+ Debug.Log("Ping: " + Mathf.Clamp(PhotonNetwork.GetPing(), 10f, 1E+11f));
+ Debug.Log(regionsToTry[i] + ": " + PhotonNetwork.CountOfPlayersInRooms);
+ if (num > bestRegionScore)
+ {
+ bestRegion = regionsToTry[i];
+ bestRegionScore = num;
+ if (ping < 50 && countOfPlayersInRooms > 50)
+ {
+ break;
+ }
+ }
+ }
+ isConnectedToMaster = false;
+ PhotonNetwork.Disconnect();
+ PhotonNetwork.LocalPlayer.NickName = "PlayerName";
+ if (bestRegion == "")
+ {
+ PhotonNetwork.ConnectToBestCloudServer();
+ }
+ else
+ {
+ Debug.Log("Connecting to " + bestRegion);
+ PhotonNetwork.ConnectToRegion(bestRegion);
+ }
+ while (!isConnectedToMaster)
+ {
+ yield return null;
+ }
+ JoinRandomRoom();
+ }
+
+ private IEnumerator WaitForConnect()
+ {
+ if (!PhotonNetwork.IsConnectedAndReady)
+ {
+ PhotonNetwork.LocalPlayer.NickName = "PlayerName";
+ PhotonNetwork.ConnectUsingSettings();
+ if (hasRegionSelect || m_ForceRegion)
+ {
+ PhotonNetwork.ConnectToRegion(RegionSelector.region);
+ }
+ else
+ {
+ PhotonNetwork.ConnectToBestCloudServer();
+ }
+ }
+ while (!isConnectedToMaster)
+ {
+ Debug.Log("Trying to connect to photon");
+ yield return null;
+ }
+ Debug.Log("Is connected");
+ }
+
+ public void ForceRegionJoin(string region, string room)
+ {
+ Debug.Log("CREEASDSSD");
+ if (PhotonNetwork.InRoom)
+ {
+ PhotonNetwork.Disconnect();
+ }
+ CharacterCreatorHandler.instance.CloseMenus();
+ MainMenuHandler.instance.Close();
+ RegionSelector.region = region;
+ TimeHandler.instance.gameStartTime = 1f;
+ LoadingScreen.instance?.StartLoading();
+ m_ForceRegion = true;
+ StartCoroutine(DoActionWhenConnected(delegate
+ {
+ JoinSpecificRoom(room);
+ }));
+ }
+
+ private void JoinSpecificRoom(string room)
+ {
+ PhotonNetwork.JoinRoom(room);
+ m_ForceRegion = false;
+ }
+
+ public override void OnEnable()
+ {
+ base.OnEnable();
+ Debug.Log("Add me!");
+ PhotonNetwork.AddCallbackTarget(this);
+ }
+
+ public override void OnDisable()
+ {
+ base.OnDisable();
+ Debug.Log("Remove me!");
+ PhotonNetwork.RemoveCallbackTarget(this);
+ }
+
+ public override void OnConnectedToMaster()
+ {
+ isConnectedToMaster = true;
+ }
+
+ public override void OnJoinRandomFailed(short returnCode, string message)
+ {
+ Debug.Log("JOINED RANDOM ROOM FAILED!");
+ if (m_SearchingTwitch)
+ {
+ CreateSpecificTWITCHRoom();
+ return;
+ }
+ RoomOptions roomOptions = new RoomOptions();
+ roomOptions.MaxPlayers = 2;
+ roomOptions.IsOpen = true;
+ roomOptions.IsVisible = true;
+ if (!SteamManager.Initialized)
+ {
+ Debug.LogError("SteamManager is not initialized!");
+ }
+ else
+ {
+ CreateRoom(roomOptions);
+ }
+ }
+
+ private void CreateRoom(RoomOptions roomOptions)
+ {
+ m_SteamLobby.CreateLobby(roomOptions.MaxPlayers, delegate(string RoomName)
+ {
+ PhotonNetwork.CreateRoom(RoomName, roomOptions);
+ });
+ }
+
+ public override void OnJoinedRoom()
+ {
+ if (!PhotonNetwork.OfflineMode)
+ {
+ isConnectedToMaster = false;
+ Debug.Log("Room joined successfully");
+ Debug.Log(PhotonNetwork.CloudRegion);
+ untilTryOtherRegionCounter = 15f;
+ PhotonNetwork.LocalPlayer.NickName = (m_SearchingTwitch ? TwitchUIHandler.TWITCH_NAME_KEY : SteamFriends.GetPersonaName());
+ }
+ }
+
+ public override void OnPlayerEnteredRoom(Photon.Realtime.Player newPlayer)
+ {
+ SoundPlayerStatic.Instance.PlayPlayerAdded();
+ if (PhotonNetwork.PlayerList.Length == 2)
+ {
+ if (PhotonNetwork.IsMasterClient)
+ {
+ GetComponent<PhotonView>().RPC("RPCA_FoundGame", RpcTarget.All);
+ }
+ if (m_SteamLobby != null)
+ {
+ m_SteamLobby.HideLobby();
+ }
+ }
+ Debug.Log("PlayerJoined");
+ base.OnPlayerEnteredRoom(newPlayer);
+ }
+
+ [PunRPC]
+ private void RPCA_FoundGame()
+ {
+ LoadingScreen.instance?.StopLoading();
+ }
+
+ public override void OnLeftRoom()
+ {
+ isConnectedToMaster = false;
+ }
+
+ public override void OnPlayerLeftRoom(Photon.Realtime.Player otherPlayer)
+ {
+ _ = GM_ArmsRace.instance == null;
+ StartCoroutine(DoDisconnect("DISCONNECTED", "Other player left"));
+ base.OnPlayerLeftRoom(otherPlayer);
+ }
+
+ public override void OnDisconnected(DisconnectCause cause)
+ {
+ if (cause != 0 && cause != DisconnectCause.DisconnectByClientLogic)
+ {
+ StartCoroutine(DoDisconnect("DISCONNECTED", cause.ToString()));
+ isConnectedToMaster = false;
+ }
+ }
+
+ private IEnumerator DoRetry()
+ {
+ LoadingScreen.instance.StartLoading();
+ if (PhotonNetwork.InRoom)
+ {
+ PhotonNetwork.LeaveRoom();
+ while (PhotonNetwork.InRoom)
+ {
+ yield return null;
+ }
+ }
+ JoinRandomRoom();
+ }
+
+ private IEnumerator DoDisconnect(string context, string reason)
+ {
+ ErrorHandler.instance.ShowError(context, reason);
+ yield return new WaitForSecondsRealtime(2f);
+ ErrorHandler.instance.HideError();
+ NetworkRestart();
+ }
+
+ public override void OnRegionListReceived(RegionHandler regionHandler)
+ {
+ Debug.Log(regionHandler);
+ }
+
+ public void NetworkRestart()
+ {
+ isConnectedToMaster = false;
+ if (PhotonNetwork.OfflineMode)
+ {
+ Application.LoadLevel(Application.loadedLevel);
+ }
+ else
+ {
+ StartCoroutine(WaitForRestart());
+ }
+ }
+
+ private IEnumerator WaitForRestart()
+ {
+ if (m_SteamLobby != null)
+ {
+ m_SteamLobby.LeaveLobby();
+ }
+ if (PhotonNetwork.InRoom)
+ {
+ PhotonNetwork.LeaveRoom();
+ while (PhotonNetwork.InRoom)
+ {
+ yield return null;
+ }
+ }
+ if (PhotonNetwork.IsConnected)
+ {
+ PhotonNetwork.Disconnect();
+ while (PhotonNetwork.IsConnected)
+ {
+ yield return null;
+ }
+ }
+ EscapeMenuHandler.isEscMenu = false;
+ DevConsole.isTyping = false;
+ Application.LoadLevel(Application.loadedLevel);
+ }
+}