You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
7.8 KiB
C#

3 weeks ago
3 weeks ago
using Fusion;
using System;
using UnityEngine;
using Fusion.Sockets;
3 weeks ago
using HGR.Core.Singletons;
3 weeks ago
using Sirenix.OdinInspector;
using DedicatedServer.Utils;
using System.Threading.Tasks;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
using ReadOnly = Sirenix.OdinInspector.ReadOnlyAttribute;
using Random = UnityEngine.Random;
public class GameManager : Singleton<GameManager>
{
//===================================================
// FIELDS
//===================================================
[Title("GAME MANAGER", titleAlignment: TitleAlignments.Centered)]
[DisplayAsString]
[SerializeField] string _sessionName = "SESSION_NAME";
[ReadOnly]
[SerializeField] UserData _userData;
[Space]
[SerializeField] NetworkRunner _runnerPrefab = null;
[ReadOnly]
[SerializeField] NetworkRunner _networkRunner = null;
[ReadOnly]
[SerializeField] NetworkSceneManagerDefault _sceneManager = null;
[HideInInspector]
public List<TWS_AppliedCustomizationsData> currentAppliedCustomizations;
//===================================================
// PROPERTIES
//===================================================
public string SessionName => _sessionName;
public string UserName{get => _userData.UserName; set => _userData.UserName = value;}
public Gender Gender {get => _userData.Gender; set => _userData.Gender = value;}
//===================================================
// METHODS
//===================================================
internal override void Init()
{
base.Init();
if(InstanceNotSelf)
return;
FadeSystem.Instance.Splash();
QualitySettings.vSyncCount = 0;
Application.targetFrameRate = 60;
if(GameData.Instance.DebugConsole)
{
GameObject obj = Resources.Load<GameObject>("IngameDebugConsole");
if(obj)
GameObject.Instantiate(obj);
}//if end
Splash();
}//Init() end
public void Splash()
{
AudioManager.Instance.StartGame();
UI_Manager.Instance.OpenPanel<Panel_Splash>();
FadeSystem.Instance.FadeOut();
}//Splash() end
public async void CreateUser(string userName)
{
SaveData.Instance.UserData.UserName = userName;
SaveData.Instance.UserData.Gender = Gender;
SaveSystem.SaveProgress();
InitRunner();
// switch(await SaveSystem.CreateUserRequest())
// {
// case CreateUserStatus.EmptyUserName:
// GameLog.ShowMessage("UserName Empty!");
// break;
// case CreateUserStatus.Success:
// InitRunner();
// break;
// case CreateUserStatus.Exists:
// GameLog.ShowMessage("Username already exists!");
// break;
// case CreateUserStatus.RequestFailed:
// GameLog.ShowWarning("Request Failed to Create New User!");
// break;
// }//switch end
}//CreateUser() end
public async void InitRunner()
{
_networkRunner = Instantiate(_runnerPrefab);
_sceneManager = _networkRunner.GetComponent<NetworkSceneManagerDefault>();
StartGameResult result = await _networkRunner.JoinSessionLobby(SessionLobby.ClientServer);
if(result.Ok)
{
// FadeSystem.Instance.Fade(()=>UI_Manager.Instance.OpenPanel<Panel_CharacterCreationMale>());
StartSession("Zone", SaveData.Instance.UserData.UserName);
// if(SaveData.Instance.HasID is false)
// else
// {
// // switch(await SaveSystem.GetUserRequest())
// // {
// // case GetUserStatus.Exists:
// // StartSession("Zone", SaveData.Instance.UserData.UserName);
// // break;
// // case GetUserStatus.NotExists:
// // GameLog.ShowMessage("Currently saved user does not exist on server!");
// // break;
// // case GetUserStatus.RequestFailed:
// // GameLog.ShowWarning("Request Failed to Get User!");
// // break;
// // }//switch end
// }//else end
}//if end
}//InitRunner() end
private void StartSession(string sessionName, string userName)
{
UserName = userName;
_sessionName = sessionName;
Gender = SaveData.Instance.UserData.Gender;
FadeSystem.Instance.FadeIn(StartGame);
}//StartSession() end
private async void StartGame()
{
_networkRunner.ProvideInput = true;
// Create the NetworkSceneInfo from the current scene
SceneRef sceneRef = SceneRef.FromIndex(SceneManager.GetActiveScene().buildIndex);
NetworkSceneInfo sceneInfo = new();
if (sceneRef.IsValid)
sceneInfo.AddSceneRef(sceneRef, LoadSceneMode.Additive);
StartGameArgs startGameArgs = new()
{
SessionName = _sessionName,
GameMode = GameMode.Client,
Address = NetAddress.Any(),
PlayerCount = 5,
OnGameStarted = OnGameStarted(),
Scene = sceneRef.IsValid ? sceneRef : null,
SceneManager = _sceneManager,
// CustomPhotonAppSettings = appSettings,
};
StartGameResult result = await _networkRunner.StartGame(startGameArgs);
if(result.Ok)
{
GameLog.ShowMessage($"Game started successfully. Requesting server to spawn Local Player.");
if(_networkRunner.IsRunning)
{
PlayerData playerData = new()
{
gender = SaveData.Instance.UserData.Gender,
position = new Vector3(Random.Range(-8, 8), 0f, Random.Range(-8, 8)),
rotation = Quaternion.Euler(0f, 90f, 0f),
};
var key = ReliableKey.FromInts(95, 0, 0, 0);
_networkRunner.SendReliableDataToServer(key, playerData.Serialize());
await Task.Delay(1000);
FadeSystem.Instance.FadeOut();
// GameLog.ShowMessage(PhotonAppSettings.Global.AppSettings.BestRegionSummaryFromStorage);
}//if end
}//if end
}//InitializeNetworkRunner() end
// private Action<NetworkRunner> RunnerInitialized()
Action<NetworkRunner> OnGameStarted()
{
GameLog.ShowMessage($"Starting Client NetworkRunner on Session: {_sessionName}");
return null;
}//RunnerInitialized() end
// public static string GetRandomName()
// {
// int playerNumber = UnityEngine.Random.Range(0, 1000);
// return $"Player {playerNumber.ToString("0000")}";
// }//GetRandomName() end
public void Shutdown()
{
_networkRunner.Shutdown();
FadeSystem.Instance.FadeIn(async ()=>
{
SceneManager.LoadScene((int)SceneDefs.MENU, LoadSceneMode.Single);
await Task.Delay(100);
Splash();
});
}//Shutdown() end
public void GoOffline()
{
_networkRunner.Shutdown();
FadeSystem.Instance.FadeIn(async ()=>
{
SceneManager.LoadScene((int)SceneDefs.OFFLINE, LoadSceneMode.Single);
await Task.Delay(3000);
FadeSystem.Instance.FadeOut();
});
}//GoOffline() end
public void GoOnline()
{
FadeSystem.Instance.FadeIn(async ()=>
{
SceneManager.LoadScene((int)SceneDefs.MENU, LoadSceneMode.Single);
await Task.Delay(1000);
InitRunner();
FadeSystem.Instance.FadeOut();
});
}//GoOnline() end
}//class end