using System; using System.Collections; using System.Collections.Generic; using System.Net; using BITKit; using Cysharp.Threading.Tasks; using UnityEngine; namespace BITKit.Net { [Serializable] public sealed class GameNet : INetClient,INetServer,INetProvider { private static INetClient _netClientImplementation=>GameNetProvider.NetClient; private static INetProvider _netProviderImplementation=>GameNetProvider.NetProvider; private static INetServer _netServerImplementation1=>GameNetProvider.NetServer; object INetClient.Source => _netClientImplementation.Source; object INetServer.Source => _netServerImplementation1.Source; public event Action OnStartConnect { add => _netClientImplementation.OnStartConnect += value; remove => _netClientImplementation.OnStartConnect -= value; } public event Action OnConnected { add => _netClientImplementation.OnConnected += value; remove => _netClientImplementation.OnConnected -= value; } public event Action OnDisconnected { add => _netClientImplementation.OnDisconnected += value; remove => _netClientImplementation.OnDisconnected -= value; } public event Action OnConnectedFailed { add => _netClientImplementation.OnConnectedFailed += value; remove => _netClientImplementation.OnConnectedFailed -= value; } public bool IsConnected => _netClientImplementation.IsConnected; bool INetServer.ManualTick { get => _netServerImplementation1.ManualTick; set => _netServerImplementation1.ManualTick = value; } bool INetClient.ManualTick { get => _netClientImplementation.ManualTick; set => _netClientImplementation.ManualTick = value; } public int Ping => _netClientImplementation.Ping; public int Id => _netClientImplementation.Id; public void Disconnect() { _netClientImplementation.Disconnect(); } public UniTask Connect(string address = "localhost", ushort port = 27014) { return _netClientImplementation.Connect(address, port); } public void SendServerMessage(string message) { _netClientImplementation.SendServerMessage(message); } public void ServerCommand(T command = default) { _netProviderImplementation.ServerCommand(command); } public void AllClientCommand(T command = default) { _netProviderImplementation.AllClientCommand(command); } public void ClientCommand(int id, T command) { _netProviderImplementation.ClientCommand(id, command); } public UniTask GetFromServer(string path=default,params object[] pars)=>_netProviderImplementation.GetFromServer(path,pars); public UniTask GetFromClient(int id,string path=default, params object[] pars)=>_netProviderImplementation.GetFromClient(id,path, pars); public void AddRpcHandle(object rpcHandle) { _netProviderImplementation.AddRpcHandle(rpcHandle); } public void AddCommandListener(Action handle) { _netProviderImplementation.AddCommandListener(handle); } public void RemoveCommandListener(Action handle) { _netProviderImplementation.RemoveCommandListener(handle); } public void AddCommandListener(Func> func) { _netProviderImplementation.AddCommandListener(func); } public void RemoveCommandListener(Func> func) { _netProviderImplementation.RemoveCommandListener(func); } public void SendRT(string rpcName, params object[] pars) { _netProviderImplementation.SendRT(rpcName, pars); } public void SendTargetRT(int id, string rpcName, params object[] pars) { _netProviderImplementation.SendTargetRT(id, rpcName, pars); } public void SendAllRT(string rpcName, params object[] pars) { _netProviderImplementation.SendAllRT(rpcName, pars); } public void Tick() { _netProviderImplementation.Tick(); } public void HandShake() { _netProviderImplementation.HandShake(); } public event Action OnClientConnected { add => _netServerImplementation1.OnClientConnected += value; remove => _netServerImplementation1.OnClientConnected -= value; } public event Action OnClientDisconnected { add => _netServerImplementation1.OnClientDisconnected += value; remove => _netServerImplementation1.OnClientDisconnected -= value; } public event Action OnStartServer { add => _netServerImplementation1.OnStartServer += value; remove => _netServerImplementation1.OnStartServer -= value; } public event Action OnStopServer { add => _netServerImplementation1.OnStopServer += value; remove => _netServerImplementation1.OnStopServer -= value; } public void StartServer(ushort port = 27014) { _netServerImplementation1.StartServer(port); } public void StopServer(bool dispose = false) { _netServerImplementation1.StopServer(dispose); } public bool IsRunningServer => _netServerImplementation1 is { IsRunningServer: true }; public void SendMessageToClient(int id, string message) { _netServerImplementation1.SendMessageToClient(id, message); } public void SendMessageToAll(string message) { _netServerImplementation1.SendMessageToAll(message); } public IDictionary Connections => _netServerImplementation1.Connections; public void AddCommandListenerWithId(Action handle) { _netServerImplementation1.AddCommandListenerWithId(handle); } public void KickClient(int id) { _netServerImplementation1.KickClient(id); } } public class GameNetProvider : MonoBehaviour { public static INetClient NetClient { get; private set; } public static INetServer NetServer { get; private set; } public static INetProvider NetProvider => (NetClient, NetServer) switch { (not null,null)=>NetClient as INetProvider, (null,not null)=>NetServer as INetProvider, (not null, { IsRunningServer: true }) =>NetServer as INetProvider, ({ IsConnected: true },not null) =>NetClient as INetProvider, _ => null }; [SerializeField] private MonoBehaviour netClient; [SerializeField] private MonoBehaviour netServer; private void Awake() { NetClient = netClient as INetClient; NetServer = netServer as INetServer; } } }