using System; using System.Collections.Generic; using BlockSpace.Worlds; using ExitGames.Client.Photon; using Photon.Pun; using Photon.Realtime; using Photon.VR.Player; using Photon.VR.Saving; using UnityEngine; using UnityEngine.SceneManagement; namespace Photon.VR { public class PhotonVRManager : MonoBehaviourPunCallbacks { [Header("Photon")] public string AppId; public string VoiceAppId; [Tooltip("Please read https://doc.photonengine.com/en-us/pun/current/connection-and-authentication/regions for more information")] public string Region = "eu"; [Header("Player")] public Transform Head; public Transform LeftHand; public Transform RightHand; public Color Colour; [Header("Networking")] public string DefaultQueue = "Default"; public int DefaultRoomLimit = 16; [Header("Other")] [Tooltip("If the user shall connect when this object has awoken")] public bool ConnectOnAwake = true; [Tooltip("If the user shall join a room when they connect")] public bool JoinRoomOnConnect = true; [NonSerialized] public PhotonVRPlayer LocalPlayer; private RoomOptions options; private ConnectionState State; public static PhotonVRManager Manager { get; private set; } public Dictionary Cosmetics { get; private set; } = new Dictionary(); private void Start() { if (Manager == null) { Manager = this; } else { Debug.LogError("There can't be multiple PhotonVRManagers in a scene"); Application.Quit(); } if (GetComponent() == null) { base.gameObject.AddComponent(); } UnityEngine.Object.DontDestroyOnLoad(base.gameObject); if (ConnectOnAwake) { Connect(); } if (!string.IsNullOrEmpty(PlayerPrefs.GetString("Colour"))) { Colour = JsonUtility.FromJson(PlayerPrefs.GetString("Colour")); } if (!string.IsNullOrEmpty(PlayerPrefs.GetString("Cosmetics"))) { Cosmetics = PhotonVRValueSaver.GetDictionary("Cosmetics"); } } public static bool Connect() { if (string.IsNullOrEmpty(Manager.AppId) || string.IsNullOrEmpty(Manager.VoiceAppId)) { Debug.LogError("Please input an app id"); return false; } PhotonNetwork.AuthValues = null; Manager.State = ConnectionState.Connecting; PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime = Manager.AppId; PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice = Manager.VoiceAppId; PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion = Manager.Region; PhotonNetwork.ConnectUsingSettings(); Debug.Log("Connecting - AppId: " + PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime + " VoiceAppId: " + PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice); return true; } public static bool ConnectAuthenticated(string username, string token) { if (string.IsNullOrEmpty(Manager.AppId) || string.IsNullOrEmpty(Manager.VoiceAppId)) { Debug.LogError("Please input an app id"); return false; } AuthenticationValues authenticationValues = new AuthenticationValues(); authenticationValues.AuthType = CustomAuthenticationType.Custom; authenticationValues.AddAuthParameter("username", username); authenticationValues.AddAuthParameter("token", token); PhotonNetwork.AuthValues = authenticationValues; Manager.State = ConnectionState.Connecting; PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime = Manager.AppId; PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice = Manager.VoiceAppId; PhotonNetwork.PhotonServerSettings.AppSettings.FixedRegion = Manager.Region; PhotonNetwork.ConnectUsingSettings(); Debug.Log("Connecting - AppId: " + PhotonNetwork.PhotonServerSettings.AppSettings.AppIdRealtime + " VoiceAppId: " + PhotonNetwork.PhotonServerSettings.AppSettings.AppIdVoice); return true; } public void Disconnect() { PhotonNetwork.Disconnect(); } public static void ChangeServers(string Id, string VoiceId) { PhotonNetwork.Disconnect(); Manager.AppId = Id; Manager.VoiceAppId = VoiceId; Connect(); } public static void ChangeServersAuthenticated(string Id, string VoiceId, string username, string token) { PhotonNetwork.Disconnect(); Manager.AppId = Id; Manager.VoiceAppId = VoiceId; ConnectAuthenticated(username, token); } public static void SetUsername(string Name) { PhotonNetwork.LocalPlayer.NickName = Name; PlayerPrefs.SetString("Username", Name); if (PhotonNetwork.InRoom && Manager.LocalPlayer != null) { Manager.LocalPlayer.RefreshPlayerValues(); } } public static void SetColour(Color PlayerColour) { Manager.Colour = PlayerColour; Hashtable customProperties = PhotonNetwork.LocalPlayer.CustomProperties; customProperties["Colour"] = JsonUtility.ToJson(PlayerColour); PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties); PlayerPrefs.SetString("Colour", JsonUtility.ToJson(PlayerColour)); if (PhotonNetwork.InRoom && Manager.LocalPlayer != null) { Manager.LocalPlayer.RefreshPlayerValues(); } } public static void SetCosmetics(Dictionary PlayerCosmetics) { Manager.Cosmetics = PlayerCosmetics; Hashtable customProperties = PhotonNetwork.LocalPlayer.CustomProperties; customProperties["Cosmetics"] = Manager.Cosmetics; PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties); PhotonVRValueSaver.SaveDictionary("Cosmetics", Manager.Cosmetics); if (PhotonNetwork.InRoom && Manager.LocalPlayer != null) { Manager.LocalPlayer.RefreshPlayerValues(); } } public static void SetCosmetic(string Type, string CosmeticId) { Manager.Cosmetics[Type] = CosmeticId; Hashtable customProperties = PhotonNetwork.LocalPlayer.CustomProperties; customProperties["Cosmetics"] = Manager.Cosmetics; PhotonNetwork.LocalPlayer.SetCustomProperties(customProperties); PhotonVRValueSaver.SaveDictionary("Cosmetics", Manager.Cosmetics); if (PhotonNetwork.InRoom && Manager.LocalPlayer != null) { Manager.LocalPlayer.RefreshPlayerValues(); } } public override void OnConnectedToMaster() { State = ConnectionState.Connected; Debug.Log("Connected"); string text = PlayerPrefs.GetString("BlockSpace.Account.DiscordDisplayName"); string nickName = ((!string.IsNullOrEmpty(text)) ? text : PlayerPrefs.GetString("Username")); PhotonNetwork.LocalPlayer.NickName = nickName; PhotonNetwork.LocalPlayer.CustomProperties["Colour"] = JsonUtility.ToJson(Colour); PhotonNetwork.LocalPlayer.CustomProperties["Cosmetics"] = Cosmetics; if (JoinRoomOnConnect) { JoinRandomRoom(DefaultQueue, DefaultRoomLimit); } } public static ConnectionState GetConnectionState() { return Manager.State; } public static void SwitchScenes(int SceneIndex, int MaxPlayers) { SceneManager.LoadScene(SceneIndex); JoinRandomRoom(SceneIndex.ToString(), MaxPlayers); } public static void SwitchScenes(int SceneIndex) { SceneManager.LoadScene(SceneIndex); JoinRandomRoom(SceneIndex.ToString(), Manager.DefaultRoomLimit); } public static void JoinRandomRoom(string Queue, int MaxPlayers) { _JoinRandomRoom(Queue, MaxPlayers); } public static void JoinRandomRoom(string Queue) { _JoinRandomRoom(Queue, Manager.DefaultRoomLimit); } private static void _JoinRandomRoom(string Queue, int MaxPlayers) { Manager.State = ConnectionState.JoiningRoom; Hashtable hashtable = new Hashtable(); hashtable.Add("queue", Queue); hashtable.Add("version", Application.version); RoomOptions roomOptions = new RoomOptions(); roomOptions.MaxPlayers = (byte)MaxPlayers; roomOptions.IsVisible = true; roomOptions.IsOpen = true; roomOptions.CustomRoomProperties = hashtable; roomOptions.CustomRoomPropertiesForLobby = new string[2] { "queue", "version" }; Manager.options = roomOptions; PhotonNetwork.JoinRandomRoom(hashtable, (byte)roomOptions.MaxPlayers, MatchmakingMode.RandomMatching, null, null); Debug.Log(string.Format("Joining random with type {0}", hashtable["queue"])); } public static void JoinPrivateRoom(string RoomId, int MaxPlayers) { _JoinPrivateRoom(RoomId, MaxPlayers); } public static void JoinPrivateRoom(string RoomId) { _JoinPrivateRoom(RoomId, Manager.DefaultRoomLimit); } public static void _JoinPrivateRoom(string RoomId, int MaxPlayers) { PhotonNetwork.JoinOrCreateRoom(RoomId, new RoomOptions { IsVisible = false, IsOpen = true, MaxPlayers = (byte)MaxPlayers }, null); Debug.Log("Joining a private room: " + RoomId); } public override void OnJoinedRoom() { Debug.Log("Joined a room"); State = ConnectionState.InRoom; } public override void OnDisconnected(DisconnectCause cause) { base.OnDisconnected(cause); State = ConnectionState.Disconnected; Debug.Log("Disconnected from server"); } public override void OnJoinRandomFailed(short returnCode, string message) { HandleJoinError(); } private void HandleJoinError() { Debug.Log("Failed to join room - creating a new one"); string text = CreateRoomCode(); Debug.Log("Joining " + text); PhotonNetwork.CreateRoom(text, options); } public string CreateRoomCode() { return new System.Random().Next(99999).ToString(); } } }