using System; using System.Collections.Generic; using System.Linq; using System.Net; using Global; using Networking.Architecture; using Networking.PacketTypes; using Networking.UI; using UnityEngine; using UnityEngine.SceneManagement; namespace Networking { public class Client : PersistentSingleton { public delegate void PacketHandler(Packet packet); public static Dictionary> PacketHandlers; public string ip; public int port; public List colors; public Color ColorFromId(int id) { return colors[id]; } public Room GameRoom { get; set; } public Dictionary GameProperties { get; set; } private bool _isConnected; public TcpManager Tcp; public UdpManager Udp; public int Id { get; private set; } public string Name { get; private set; } private void Start() { SceneManager.sceneLoaded += (scene, mode) => { Debug.Log($"Loaded Scene {scene} with mode {mode}."); }; } private void Update() { ThreadManager.UpdateMain(); } private void OnApplicationQuit() { Disconnect(); } public void ConnectToServer() { UIManager.Instance.startMenu.ConnectToServer(); Tcp = new TcpManager(); Udp = new UdpManager(); InitializeClientData(); Tcp.Connect(); } public void OnConnected(int clientId, string message) { _isConnected = true; Id = clientId; Name = UIManager.Instance.startMenu.usernameField.text; Udp.Connect(((IPEndPoint)Tcp.Socket.Client.LocalEndPoint).Port); ClientSend.WelcomeReceived(); RoomSend.List(); UIManager.Instance.OnConnectSuccess(); UIManager.Instance.roomListCreateMenu.OnRoomListRequest(); Debug.Log("Connected successfully to " + $"{Instance.Tcp.Socket.Client.RemoteEndPoint} : " + $"{message}" ); } private static void InitializeClientData() { PacketHandlers = new Dictionary> { {(int)PacketType.Default, new Dictionary { {(int)ServerDefaultPacket.Welcome, ClientHandle.Welcome} }}, {(int)PacketType.Room, new Dictionary { {(int)ServerRoomPacket.RList, RoomHandle.List}, {(int)ServerRoomPacket.RCreated, RoomHandle.Created}, {(int)ServerRoomPacket.RJoined, RoomHandle.Joined}, {(int)ServerRoomPacket.RLeft, RoomHandle.Left}, {(int)ServerRoomPacket.RCreateFailed, ClientHandle.CreateFailed}, {(int)ServerRoomPacket.RJoinFailed, ClientHandle.JoinFailed}, {(int)ServerRoomPacket.RLeaveFailed, ClientHandle.LeaveFailed}, {(int)ServerRoomPacket.RKickFailed, ClientHandle.KickFailed}, {(int)ServerRoomPacket.RStart, RoomHandle.Start}, {(int)ServerRoomPacket.RProperties, RoomHandle.Properties}, }} }; } public void Disconnect() { if (!_isConnected) return; _isConnected = false; ThreadManager.ExecuteOnMainThread(UIManager.Instance.OnDisconnect); Tcp.Socket.Close(); Udp.Socket.Close(); Debug.Log("Disconnected from server."); } } }