From 514c68d2e9ec52d6aeb0e4bd73b0b322f38768b6 Mon Sep 17 00:00:00 2001 From: Sanae Date: Tue, 15 Feb 2022 18:35:38 -0600 Subject: [PATCH] Lycel go flippy flippy --- Server/Client.cs | 2 +- Server/Program.cs | 30 ++++++++++++++++++++++++++---- Server/Server.cs | 12 ++++++------ TestClient/Program.cs | 38 +++++++++++++++++++------------------- 4 files changed, 52 insertions(+), 30 deletions(-) diff --git a/Server/Client.cs b/Server/Client.cs index 60a0753..ff8578e 100644 --- a/Server/Client.cs +++ b/Server/Client.cs @@ -31,7 +31,7 @@ public class Client : IDisposable { Socket.Disconnect(false); } - public async Task Send(T packet, Client? sender = null) where T : unmanaged, IPacket { + public async Task Send(T packet, Client? sender = null) where T : struct, IPacket { IMemoryOwner memory = MemoryPool.Shared.Rent(Constants.MaxPacketSize); PacketHeader header = new PacketHeader { diff --git a/Server/Program.cs b/Server/Program.cs index 703205f..4b9d8d6 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -1,4 +1,5 @@ using System.Collections.Concurrent; +using System.Numerics; using Server; using Shared.Packet.Packets; using Timer = System.Timers.Timer; @@ -32,24 +33,45 @@ timer.Elapsed += (_, _) => { SyncShineBag(); }; timer.Start(); +bool piss = false; -server.PacketHandler += async (c, p) => { +// Guid lycel = Guid.Parse("d5feae62-2e71-1000-88fd-597ea147ae88"); +Guid lycel = Guid.Parse("5e1f9db4-1c27-1000-a421-4701972e443e"); + +server.PacketHandler = (c, p) => { switch (p) { case CostumePacket: - await ClientSyncShineBag(c); + ClientSyncShineBag(c); c.Metadata["loadedSave"] = true; break; case ShinePacket shinePacket: { - if (c.Metadata["loadedSave"] is false) return; + if (c.Metadata["loadedSave"] is false) break; ConcurrentBag playerBag = (ConcurrentBag) c.Metadata["shineSync"]; shineBag.Add(shinePacket.ShineId); - if (playerBag.Contains(shinePacket.ShineId)) return; + if (playerBag.Contains(shinePacket.ShineId)) break; c.Logger.Info($"Got shine {shinePacket.ShineId}"); playerBag.Add(shinePacket.ShineId); SyncShineBag(); break; } + case PlayerPacket playerPacket: { + if (!piss || c.Id != lycel) break; + playerPacket.Position += Vector3.UnitY * 160; + playerPacket.Rotation *= Quaternion.CreateFromRotationMatrix(Matrix4x4.CreateRotationX(MathF.PI)); + server.Broadcast(playerPacket, c); + return false; + } } + + return true; }; +Task.Run(() => { + while (true) { + Console.ReadLine(); + piss = !piss; + server.Logger.Warn($"Lycel flipped to {piss}"); + } +}); + await server.Listen(1027); \ No newline at end of file diff --git a/Server/Server.cs b/Server/Server.cs index 0f61a10..6179761 100644 --- a/Server/Server.cs +++ b/Server/Server.cs @@ -12,7 +12,7 @@ public class Server { public readonly List Clients = new List(); public readonly Logger Logger = new Logger("Server"); private readonly MemoryPool memoryPool = MemoryPool.Shared; - public event Action PacketHandler = null!; + public Func? PacketHandler = null!; public event Action ClientJoined = null!; public async Task Listen(ushort port) { @@ -42,7 +42,7 @@ public class Server { } } - public static void FillPacket(PacketHeader header, T packet, Memory memory) where T : unmanaged, IPacket { + public static void FillPacket(PacketHeader header, T packet, Memory memory) where T : struct, IPacket { Span data = memory.Span; MemoryMarshal.Write(data, ref header); @@ -50,7 +50,7 @@ public class Server { } // broadcast packets to all clients - public async Task Broadcast(T packet, Client sender) where T : unmanaged, IPacket { + public async Task Broadcast(T packet, Client sender) where T : struct, IPacket { IMemoryOwner memory = memoryPool.Rent(Constants.MaxPacketSize); PacketHeader header = new PacketHeader { @@ -198,9 +198,9 @@ public class Server { // if (header.Type is not PacketType.Cap and not PacketType.Player) client.Logger.Warn($"lol {header.Type}"); IPacket packet = (IPacket) Activator.CreateInstance(Constants.PacketIdMap[header.Type])!; packet.Deserialize(memory.Memory.Span[Constants.HeaderSize..]); - PacketHandler?.Invoke(client, packet); - } catch { - // ignore failed packet deserialization! + if (PacketHandler?.Invoke(client, packet) is false) continue; + } catch (Exception e){ + client.Logger.Error($"Packet handler warning: {e}"); } Broadcast(memory, client); diff --git a/TestClient/Program.cs b/TestClient/Program.cs index 16ef433..b4a1be3 100644 --- a/TestClient/Program.cs +++ b/TestClient/Program.cs @@ -31,25 +31,25 @@ async Task S() { PacketHeader header = MemoryMarshal.Read(owner.Memory.Span); PacketType type = header.Type; if (header.Id != otherId) continue; - if (type is PacketType.Player) { - CapPacket cap = new CapPacket(); - PlayerPacket playerPacket = new PlayerPacket(); - playerPacket.Deserialize(owner.Memory.Span[Constants.HeaderSize..]); - cap.Position = playerPacket.Position + Vector3.UnitY * 500f; - // cap.Rotation = Quaternion.CreateFromYawPitchRoll(0,0,0); - cap.CapAnim = "StayR"; - playerPacket.Position = new Vector3(1000000f); - playerPacket.ThrowingCap = true; - header.Id = ownId; - MemoryMarshal.Write(owner.Memory.Span, ref header); - playerPacket.Serialize(owner.Memory.Span[Constants.HeaderSize..]); - await stream.WriteAsync(owner.Memory[..Constants.MaxPacketSize]); - header.Type = PacketType.Cap; - MemoryMarshal.Write(owner.Memory.Span, ref header); - cap.Serialize(owner.Memory.Span[Constants.HeaderSize..]); - await stream.WriteAsync(owner.Memory[..Constants.MaxPacketSize]); - continue; - } + // if (type is PacketType.Player) { + // CapPacket cap = new CapPacket(); + // PlayerPacket playerPacket = new PlayerPacket(); + // playerPacket.Deserialize(owner.Memory.Span[Constants.HeaderSize..]); + // cap.Position = playerPacket.Position + Vector3.UnitY * 500f; + // // cap.Rotation = Quaternion.CreateFromYawPitchRoll(0,0,0); + // cap.CapAnim = "StayR"; + // playerPacket.Position = new Vector3(1000000f); + // playerPacket.ThrowingCap = true; + // header.Id = ownId; + // MemoryMarshal.Write(owner.Memory.Span, ref header); + // playerPacket.Serialize(owner.Memory.Span[Constants.HeaderSize..]); + // await stream.WriteAsync(owner.Memory[..Constants.MaxPacketSize]); + // header.Type = PacketType.Cap; + // MemoryMarshal.Write(owner.Memory.Span, ref header); + // cap.Serialize(owner.Memory.Span[Constants.HeaderSize..]); + // await stream.WriteAsync(owner.Memory[..Constants.MaxPacketSize]); + // continue; + // } if (reboundPackets.All(x => x != type)) continue; header.Id = ownId; MemoryMarshal.Write(owner.Memory.Span, ref header);