diff options
| author | Sarah Bradley <git@sarahduck.ca> | 2023-12-16 19:43:58 -0800 |
|---|---|---|
| committer | Sarah Bradley <git@sarahduck.ca> | 2023-12-16 19:43:58 -0800 |
| commit | dbba03fe210a80f7d89d3ad021ec901a9196a537 (patch) | |
| tree | 836e884541434a39bbbc74e0b645ffc79edd9c7c /NetClient.cs | |
| parent | 2793b94040a473538f01723d5ca5f53c4535e2af (diff) | |
Redid networking with LiteNetLib
Diffstat (limited to 'NetClient.cs')
| -rw-r--r-- | NetClient.cs | 136 |
1 files changed, 69 insertions, 67 deletions
diff --git a/NetClient.cs b/NetClient.cs index 31ea258..65fd484 100644 --- a/NetClient.cs +++ b/NetClient.cs @@ -1,78 +1,80 @@ -using System.Buffers.Binary; -using System.Net.Sockets; -using System.Text; +using System.Collections.ObjectModel; +using LiteNetLib; +using LiteNetLib.Utils; namespace OnekoOnline.Net; -static class Client +class Client { - static readonly TcpClient Tcp = new(); - static readonly UdpClient Udp = new(); + public readonly string UserName = OnekoOnline.Config.GetValue("UserName", "Oneko"); + public int Id {get; private set;} = -1; + public bool Connected => NetClient?.ConnectedPeersCount > 0 && Id != -1; - public static readonly string UserName = OnekoOnline.Config.GetValue("UserName", "Oneko"); - public static int Id {get; private set;} = 0; - public static bool Connected => Tcp.Connected && Id != 0; + readonly EventBasedNetListener Listener; + readonly NetManager NetClient; + public NetPeer ConnectedServer => NetClient.FirstPeer; - public static Dictionary<int, User> Users = []; - static readonly Dictionary<int, User> allUsers = []; + readonly Dictionary<int, User> users = []; + public ReadOnlyDictionary<int, User> Users => users.AsReadOnly(); - public static async void Init(string ServerAddress, int port) + public Client(string ServerAddress, int port, string ServerPassword) { - if (ServerAddress == "") return; - - await Task.WhenAny(Tcp.ConnectAsync(ServerAddress, port), Task.Delay(3000)); - - if (Tcp.Connected) - { - Console.WriteLine("Connected to Server!"); - Udp.Connect(ServerAddress, port); - - CancellationTokenSource tokenSource = new(); - tokenSource.CancelAfter(5000); - - //Send Username - Packet packet = new(PacketType.Username, Encoding.UTF8.GetBytes(UserName), Id); - await NetBase.SendReliableData(packet, Tcp.GetStream(), tokenSource.Token); - //Send Oneko - packet = new(PacketType.OnekoSpritesheet, Oneko.LocalOneko!.SpriteSheet.Serialize(), Id); - await NetBase.SendReliableData(packet, Tcp.GetStream(), tokenSource.Token); - //Get Id - Packet idPacket = await NetBase.GetReliableData(Tcp.GetStream()); - Id = BinaryPrimitives.ReadInt32LittleEndian(idPacket.Data); - Console.WriteLine($"My ID is {Id}! {Connected}"); - - while (Connected) - { - if (Tcp.Available > 0) { - packet = await NetBase.GetReliableData(Tcp.GetStream()); - if (packet.FromId == 0) continue; //From server, ill implement later - - if (!allUsers.ContainsKey(packet.FromId)) { - allUsers.Add(packet.FromId, new User(packet.FromId)); - } - User sentFrom = allUsers[packet.FromId]; - - if (packet.Type == PacketType.OnekoSpritesheet) { - sentFrom.SpriteSheet = packet.Data; - } else if (packet.Type == PacketType.Username) { - sentFrom.Username = Encoding.UTF8.GetString(packet.Data); - } - - if (sentFrom.ExchangedData && !Users.ContainsKey(sentFrom.Id)) Users.Add(sentFrom.Id, sentFrom); - } - - if (Udp.Available > 0) { - } - - await Task.Delay(10); + if (ServerAddress == "") throw new Exception("Server Address invalid!"); + + Listener = new(); + NetClient = new(Listener); + + NetClient.Start(); + NetClient.Connect(ServerAddress, port, ServerPassword); + + Listener.PeerConnectedEvent += peer => { + Console.WriteLine("Connected to the Server!"); + NetDataWriter writer = new(); + + writer.Put(new PacketInfo(PacketType.OnekoSpritesheet, Id)); + writer.Put(Oneko.LocalOneko!.SpriteSheet.Serialize()); + peer.Send(writer, DeliveryMethod.ReliableUnordered); + + writer.ResetWithInfo(new PacketInfo(PacketType.Username, Id)); + writer.Put(UserName); + peer.Send(writer, DeliveryMethod.ReliableUnordered); + }; + + Listener.NetworkReceiveEvent += (fromPeer, reader, channel, DeliveryMethod) => { + if (reader.AvailableBytes < PacketInfo.SizeOf) return; + PacketInfo info = reader.GetPacketInfo(); + + if (info.Type == PacketType.UserId) { + Id = reader.GetInt(); + return; + } + + User? from; + if (!users.TryGetValue(info.FromId, out from)) { + from = new(info.FromId); + users.Add(from.Id, from); + } + + if (info.Type == PacketType.Disconnect) { + if (from.Username != null) Console.WriteLine($"User {from.Username} left."); + users.Remove(info.FromId); + } + + if (info.Type == PacketType.OnekoSpritesheet) from.SpriteSheet = reader.GetRemainingBytes(); + if (info.Type == PacketType.Username) { + from.Username = reader.GetString(); + Console.WriteLine($"User {from.Username} joined!"); } - } - else - { - Console.WriteLine("Connection to server failed."); - } - - Tcp.Dispose(); - Udp.Dispose(); + }; + } + + public void Poll() + { + NetClient.PollEvents(); + } + + public void Disconnect() + { + NetClient.DisconnectAll(); } }
\ No newline at end of file |
