summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Main.cs6
-rw-r--r--Mouse.cs2
-rw-r--r--MouseLocal.cs7
-rw-r--r--NetClient.cs34
-rw-r--r--NetServer.cs11
-rw-r--r--OnekoLocal.cs2
-rw-r--r--OnekoNet.cs2
7 files changed, 42 insertions, 22 deletions
diff --git a/Main.cs b/Main.cs
index 79db391..54b3511 100644
--- a/Main.cs
+++ b/Main.cs
@@ -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");
diff --git a/Mouse.cs b/Mouse.cs
index fad056e..544344e 100644
--- a/Mouse.cs
+++ b/Mouse.cs
@@ -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));
}