evershade/Assets/Scripts/UI/NetworkUIController.cs

155 lines
4.8 KiB
C#

using FishNet.Managing;
using FishNet.Transporting;
using Managers;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public class NetworkUIController : MonoBehaviour
{
// [SerializeField] private GameObject serverIndicator;
// [SerializeField] private GameObject clientIndicator;
// [SerializeField] private GameObject hostIndicator;
[SerializeField] private GameObject hostNewButton;
[SerializeField] private GameObject hostSaveButton;
[SerializeField] private GameObject connectButton;
[SerializeField] private SpriteRenderer serverIndicator;
[SerializeField] private SpriteRenderer clientIndicator;
private LocalConnectionState _clientState = LocalConnectionState.Stopped;
private EventSystem _eventSystem;
private NetworkManager _networkManager;
private LocalConnectionState _serverState = LocalConnectionState.Stopped;
private void Start()
{
_networkManager = FindObjectOfType<NetworkManager>();
if (_networkManager == null)
{
Debug.LogError("NetworkManager not found, HUD will not function.");
}
else
{
UpdateColor(LocalConnectionState.Stopped, ref serverIndicator);
UpdateColor(LocalConnectionState.Stopped, ref clientIndicator);
_networkManager.ServerManager.OnServerConnectionState += OnServerConnectionState;
_networkManager.ClientManager.OnClientConnectionState += OnClientConnectionState;
}
// host.GetComponent<Button>().onClick.AddListener(OnClick_Client);
// serverButton.GetComponent<Button>().onClick.AddListener(OnClick_Server);
hostNewButton.GetComponent<Button>().onClick.AddListener(OnClick_HostNew);
hostSaveButton.GetComponent<Button>().onClick.AddListener(OnClick_HostSave);
connectButton.GetComponent<Button>().onClick.AddListener(OnClick_ConnectClient);
}
private void OnDestroy()
{
if (_networkManager == null)
return;
_networkManager.ServerManager.OnServerConnectionState -= OnServerConnectionState;
_networkManager.ClientManager.OnClientConnectionState -= OnClientConnectionState;
}
private void OnServerConnectionState(ServerConnectionStateArgs obj)
{
_serverState = obj.ConnectionState;
UpdateColor(obj.ConnectionState, ref serverIndicator);
}
private void UpdateColor(LocalConnectionState state, ref SpriteRenderer img)
{
Color c;
if (state == LocalConnectionState.Started)
c = Color.green;
else if (state == LocalConnectionState.Stopped)
c = Color.red;
else
c = Color.yellow;
img.color = c;
}
private void OnClientConnectionState(ClientConnectionStateArgs obj)
{
_clientState = obj.ConnectionState;
UpdateColor(obj.ConnectionState, ref clientIndicator);
}
public void OnClick_HostNew()
{
Debug.Log("Clicked host new");
if (_networkManager == null)
return;
// wait for scene to load before starting server
OnClick_Server();
SaveManager.Instance.NewGame();
OnClick_Client();
PlayerManager.Instance.LoadPlayerData(SaveManager.Instance.gameState.playerData);
// TODO: Go to NewGamePanel, and flag for MP.
}
public void OnClick_HostSave()
{
Debug.Log("Clicked host save");
if (_networkManager == null)
return;
OnClick_Server();
OnClick_Client();
// TODO: Don't start reroute to SavePanel to pick a save file, flag for MP.
}
public void OnClick_Server()
{
Debug.Log("Clicked server");
if (_networkManager == null)
return;
if (_serverState != LocalConnectionState.Stopped)
_networkManager.ServerManager.StopConnection(true);
else
_networkManager.ServerManager.StartConnection();
DeselectButtons();
}
public void OnClick_Client()
{
Debug.Log("Clicked server");
if (_networkManager == null)
return;
if (_clientState != LocalConnectionState.Stopped)
_networkManager.ClientManager.StopConnection();
else
_networkManager.ClientManager.StartConnection();
DeselectButtons();
}
public void OnClick_ConnectClient()
{
OnClick_Client();
_networkManager.ClientManager.StartConnection("127.0.0.1", 7777);
}
private void SetEventSystem()
{
if (_eventSystem != null)
return;
_eventSystem = FindObjectOfType<EventSystem>();
if (_eventSystem == null)
_eventSystem = gameObject.AddComponent<EventSystem>();
}
private void DeselectButtons()
{
SetEventSystem();
_eventSystem?.SetSelectedGameObject(null);
}
}