diff options
| author | Sarah Bradley <git@sarahduck.ca> | 2023-12-25 01:50:06 -0800 |
|---|---|---|
| committer | Sarah Bradley <git@sarahduck.ca> | 2023-12-25 01:50:06 -0800 |
| commit | 828672047ffd306f78b93f11c3d9a8dfafa3d653 (patch) | |
| tree | 06cc9c9ef7c4554574ee3855dd681fd88b8b408a | |
| parent | ff3cbc5b49f8618531c5778d69b49c0aa4a9442a (diff) | |
Added spectator mode, and fixed some networking issues
| -rw-r--r-- | Main.cs | 6 | ||||
| -rw-r--r-- | Mouse.cs | 2 | ||||
| -rw-r--r-- | MouseLocal.cs | 7 | ||||
| -rw-r--r-- | NetClient.cs | 34 | ||||
| -rw-r--r-- | NetServer.cs | 11 | ||||
| -rw-r--r-- | OnekoLocal.cs | 2 | ||||
| -rw-r--r-- | OnekoNet.cs | 2 |
7 files changed, 42 insertions, 22 deletions
@@ -16,6 +16,8 @@ static class OnekoOnline public static readonly int WindowScale = Config.GetValue("WindowScale", 2); public static Vector2 Resolution => new(WindowX, WindowY); + public static readonly bool SpectatorMode = Config.GetValue("SpectatorMode", false); + public static Font DefaultFont; const ConfigFlags raylibConfFlags = ConfigFlags.FLAG_VSYNC_HINT; @@ -27,8 +29,8 @@ static class OnekoOnline Raylib.SetTargetFPS(30); Raylib.HideCursor(); - OnekoLocal LocalOneko = new(); MouseLocal LocalMouse = new(); + if (!SpectatorMode) {OnekoLocal LocalOneko = new();} RenderTexture2D RenderTexture = Raylib.LoadRenderTexture(WindowX, WindowY); @@ -41,6 +43,8 @@ static class OnekoOnline } else { Client = new(Config.GetValue("ServerIP", "pond.sarahduck.ca"), port, serverPassword); } + Net.Client.UserConnected += OnekoNet.SpawnNetNeko; + Net.Client.UserConnected += MouseNet.SpawnNetMouse; DefaultFont = Raylib.LoadFont("misc/MPlusBitmap.fnt"); @@ -25,7 +25,7 @@ abstract class Mouse : Drawable if (File.Exists(CursorPath) && new FileInfo(CursorPath).Length < 12*19*3) { Cursor = Bitmap.FromPNGMemory(File.ReadAllBytes(CursorPath)); } else { - Console.WriteLine("Path to cursor png was invalid or the file was too big, using the default."); + Console.WriteLine("The cursor PNG was either mising or too big. Using the default."); Cursor = Bitmap.FromPNGMemory(EmbeddedResources.GetResource("misc.cursor.png")); } } diff --git a/MouseLocal.cs b/MouseLocal.cs index a731ffb..da2db24 100644 --- a/MouseLocal.cs +++ b/MouseLocal.cs @@ -7,11 +7,12 @@ namespace OnekoOnline; class MouseLocal : Mouse { + public static MouseLocal? Instance; + public MouseLocal() : base() { - Client.UserConnected += MouseNet.SpawnNetMouse; - - Name = Client.UserName; + Instance ??= this; + Name = OnekoOnline.Config.GetValue("UserName", "User"); } public override void Update(float delta) diff --git a/NetClient.cs b/NetClient.cs index 804be86..5146a0a 100644 --- a/NetClient.cs +++ b/NetClient.cs @@ -37,11 +37,20 @@ class Client NetDataWriter writer = new(); writer.Put(new PacketInfo(PacketType.UserInfo, Id)); - writer.Put(UserName.LimitLength(40)); - writer.Put(OnekoLocal.Instance!.Name.LimitLength(40)); - writer.PutBytesWithLength(OnekoLocal.Instance!.SpriteSheet.Serialize()); - //TODO: NETWORK THE CURSOR HERE - peer.Send(writer, DeliveryMethod.ReliableUnordered); + writer.Put(UserName, 40); + writer.PutBytesWithLength(MouseLocal.Instance!.Cursor.Serialize()); + writer.Put(OnekoOnline.SpectatorMode); + if (!OnekoOnline.SpectatorMode) { + writer.Put(OnekoLocal.Instance!.Name, 40); + writer.PutBytesWithLength(OnekoLocal.Instance!.SpriteSheet.Serialize()); + } + + if (writer.Length > 50000) { + peer.Disconnect(); + Console.WriteLine("You have too much data to send, try reducing the complexity of your sprites."); + } else { + peer.Send(writer, DeliveryMethod.ReliableUnordered); + } }; Listener.PeerDisconnectedEvent += (peer, info) => { @@ -74,10 +83,16 @@ class Client } else if (info.Type == PacketType.UserInfo) { - from.Username = reader.GetString().LimitLength(40); - from.Nekoname = reader.GetString().LimitLength(40); - from.SpriteSheet = reader.GetBytesWithLength(); - Console.WriteLine($"User {from.Username} joined with {from.Nekoname}!"); + from.Username = reader.GetString(40); + from.CursorSprite = reader.GetBytesWithLength(); + from.SpectatorMode = reader.GetBool(); + if (!from.SpectatorMode) { + from.Nekoname = reader.GetString(40); + from.SpriteSheet = reader.GetBytesWithLength(); + Console.WriteLine($"User {from.Username} joined with {from.Nekoname}!"); + } else { + Console.WriteLine($"User {from.Username} joined as a Spectator!"); + } from.Initialized = true; UserConnected?.Invoke(from); return; @@ -103,6 +118,7 @@ class Client class ClientUser(int id) : User(id) { + public bool SpectatorMode; public byte[]? SpriteSheet; public byte[]? CursorSprite; public string? Username; diff --git a/NetServer.cs b/NetServer.cs index f275164..925567b 100644 --- a/NetServer.cs +++ b/NetServer.cs @@ -45,17 +45,18 @@ class Server ServerUser user = users[fromPeer.Id]; //Size limits for packet types - if (info.Type == PacketType.UserInfo && dataReader.AvailableBytes > 40000) return; + if (info.Type == PacketType.UserInfo && dataReader.AvailableBytes > 50000) return; else if (info.Type != PacketType.UserInfo && dataReader.AvailableBytes > 500) return; NetDataWriter writer = new(); if (info.Type == PacketType.UserInfo) { - user.UserInfo = dataReader.RawData; - new PacketInfo(PacketType.UserInfo, user.Id).Serialize(user.UserInfo); + string Username = dataReader.PeekString(40); - string Username = dataReader.GetString().LimitLength(40); + writer.ResetWithInfo(new PacketInfo(PacketType.UserInfo, user.Id)); + writer.Put(dataReader.GetRemainingBytes()); + user.UserInfo = writer.CopyData(); if (!user.Initialized) { //Send ID @@ -79,7 +80,7 @@ class Server } } - if (info.Type == PacketType.OnekoState || info.Type == PacketType.MouseState) { + else if (info.Type == PacketType.OnekoState || info.Type == PacketType.MouseState) { writer.ResetWithInfo(new PacketInfo(info.Type, fromPeer.Id)); writer.Put(dataReader.GetRemainingBytes()); foreach (ServerUser toSend in users.Values) { diff --git a/OnekoLocal.cs b/OnekoLocal.cs index bbe3c3b..e963740 100644 --- a/OnekoLocal.cs +++ b/OnekoLocal.cs @@ -24,8 +24,6 @@ class OnekoLocal : Oneko { Instance ??= this; - Client.UserConnected += OnekoNet.SpawnNetNeko; - Name = OnekoOnline.Config.GetValue("NekoName", "Oneko"); AIStates = [new BoredState(this), new ChaseMouseState(this), new ItchyState(this)]; diff --git a/OnekoNet.cs b/OnekoNet.cs index ee780c6..6bee562 100644 --- a/OnekoNet.cs +++ b/OnekoNet.cs @@ -43,7 +43,7 @@ class OnekoNet : Oneko public static void SpawnNetNeko(ClientUser user) { - if (!NetNekos.ContainsKey(user.Id)) { + if (!user.SpectatorMode && !NetNekos.ContainsKey(user.Id)) { Bitmap spriteSheet = Bitmap.Deserialize(user.SpriteSheet); NetNekos.Add(user.Id, new OnekoNet(spriteSheet, user)); } |
