using System.Buffers.Binary; 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 enum PacketType : byte { MousePosition, OnekoState, OnekoSpritesheet, Username, UserId, Disconnect, Invalid } public struct PacketInfo { public readonly PacketType Type; public readonly int FromId; public const int SizeOf = sizeof(int) + 1; public readonly bool IsValid => Type != PacketType.Invalid; public static readonly PacketInfo InvalidPacket = new(PacketType.Invalid, -1); public PacketInfo(PacketType type, int id) { Type = type; FromId = id; } 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); } } class User(int id) { public readonly int Id = id; //Oneko Stuff public byte[]? SpriteSheet; public string? Username; public bool ExchangedData => SpriteSheet != null && Username != null; }