summaryrefslogtreecommitdiff
path: root/NetClient.cs
diff options
context:
space:
mode:
Diffstat (limited to 'NetClient.cs')
-rw-r--r--NetClient.cs29
1 files changed, 25 insertions, 4 deletions
diff --git a/NetClient.cs b/NetClient.cs
index 65fd484..f7d14a1 100644
--- a/NetClient.cs
+++ b/NetClient.cs
@@ -17,6 +17,11 @@ class Client
readonly Dictionary<int, User> users = [];
public ReadOnlyDictionary<int, User> Users => users.AsReadOnly();
+ static public Action<User>? UserConnected;
+ static public Action<User>? UserDisconnected;
+ static public Action<NetDataReader, User, PacketType>? PacketRecived;
+ static public Action? ServerDisconnected;
+
public Client(string ServerAddress, int port, string ServerPassword)
{
if (ServerAddress == "") throw new Exception("Server Address invalid!");
@@ -32,7 +37,7 @@ class Client
NetDataWriter writer = new();
writer.Put(new PacketInfo(PacketType.OnekoSpritesheet, Id));
- writer.Put(Oneko.LocalOneko!.SpriteSheet.Serialize());
+ writer.Put(OnekoLocal.Instance!.SpriteSheet.Serialize());
peer.Send(writer, DeliveryMethod.ReliableUnordered);
writer.ResetWithInfo(new PacketInfo(PacketType.Username, Id));
@@ -40,6 +45,12 @@ class Client
peer.Send(writer, DeliveryMethod.ReliableUnordered);
};
+ Listener.PeerDisconnectedEvent += (peer, info) => {
+ ServerDisconnected?.Invoke();
+ users.Clear();
+ Console.WriteLine("Server Disconnected! You're offline!");
+ };
+
Listener.NetworkReceiveEvent += (fromPeer, reader, channel, DeliveryMethod) => {
if (reader.AvailableBytes < PacketInfo.SizeOf) return;
PacketInfo info = reader.GetPacketInfo();
@@ -56,15 +67,25 @@ class Client
}
if (info.Type == PacketType.Disconnect) {
+ //Disconnect user that has disconnected
if (from.Username != null) Console.WriteLine($"User {from.Username} left.");
users.Remove(info.FromId);
+ UserDisconnected?.Invoke(from);
+ return;
}
- if (info.Type == PacketType.OnekoSpritesheet) from.SpriteSheet = reader.GetRemainingBytes();
- if (info.Type == PacketType.Username) {
- from.Username = reader.GetString();
+ else if (info.Type == PacketType.OnekoSpritesheet) from.SpriteSheet = reader.GetRemainingBytes();
+ else if (info.Type == PacketType.Username) from.Username = reader.GetString();
+
+ if (from.ExchangedData && !from.Initialized) {
+ //Announce user connection
Console.WriteLine($"User {from.Username} joined!");
+ from.Initialized = true;
+ UserConnected?.Invoke(from);
}
+
+ NetDataReader newReader = new(reader.GetRemainingBytes());
+ PacketRecived?.Invoke(newReader, from, info.Type);
};
}