using System.Buffers.Binary; using System.Numerics; using LiteNetLib.Utils; namespace OnekoOnline.Net; public static class NetExtensions { public static void Put(this NetDataWriter writer, PacketInfo info) { writer.Put(info.Serialize()); } public static PacketInfo GetPacketInfo(this NetDataReader reader) { return PacketInfo.Deserialize(reader.GetBytesSegment(PacketInfo.SizeOf)); } public static PacketInfo PeekPacketInfo(this NetDataReader reader) { if (reader.AvailableBytes < PacketInfo.SizeOf) return PacketInfo.InvalidPacket; return PacketInfo.Deserialize(reader.RawData.AsSpan(0, PacketInfo.SizeOf)); } public static void ResetWithInfo(this NetDataWriter writer, PacketInfo info) { writer.Reset(); writer.Put(info); } public static void ResetWithInfo(this NetDataWriter writer, PacketInfo info, int size) { writer.Reset(size+PacketInfo.SizeOf); writer.Put(info); } public static void Put(this NetDataWriter writer, Vector2 vec2) { writer.Put(vec2.X); writer.Put(vec2.Y); } public static Vector2 GetVector2(this NetDataReader reader) { float X = reader.GetFloat(); float Y = reader.GetFloat(); return new Vector2(X, Y); } } public enum PacketType : byte { MouseState, OnekoState, UserInfo, UserId, Disconnect, Invalid } public struct PacketInfo(PacketType type, int id) { public readonly PacketType Type = type; public readonly int FromId = id; public const int SizeOf = sizeof(int) + 1; public readonly bool IsValid => Type != PacketType.Invalid; public static readonly PacketInfo InvalidPacket = new(PacketType.Invalid, -1); public readonly void Serialize(Span span) { span[0] = (byte)Type; BinaryPrimitives.WriteInt32LittleEndian(span[1..], FromId); } public readonly byte[] Serialize() { byte[] bytes = new byte[SizeOf]; Serialize(bytes); return bytes; } public static PacketInfo Deserialize(ReadOnlySpan span) { PacketType type = (PacketType)span[0]; int id = BinaryPrimitives.ReadInt32LittleEndian(span[1..]); return new PacketInfo(type, id); } } abstract class User(int id) { public readonly int Id = id; public bool Initialized = false; }