using System; using System.IO; using UnityEngine; namespace MegaKoop.Game.Networking { public sealed class NetworkWriter : IDisposable { private readonly MemoryStream stream; private readonly BinaryWriter writer; public NetworkWriter(int capacity = 128) { stream = new MemoryStream(capacity); writer = new BinaryWriter(stream); } public void Write(byte value) => writer.Write(value); public void Write(int value) => writer.Write(value); public void Write(uint value) => writer.Write(value); public void Write(short value) => writer.Write(value); public void Write(ushort value) => writer.Write(value); public void Write(long value) => writer.Write(value); public void Write(ulong value) => writer.Write(value); public void Write(float value) => writer.Write(value); public void Write(bool value) => writer.Write(value); public void Write(Vector3 value) { writer.Write(value.x); writer.Write(value.y); writer.Write(value.z); } public void Write(Quaternion value) { writer.Write(value.x); writer.Write(value.y); writer.Write(value.z); writer.Write(value.w); } public void Write(string value) => writer.Write(value ?? string.Empty); public byte[] ToArray() { writer.Flush(); return stream.ToArray(); } public void Dispose() { writer?.Dispose(); stream?.Dispose(); } } public sealed class NetworkReader : IDisposable { private readonly MemoryStream stream; private readonly BinaryReader reader; public NetworkReader(byte[] buffer) { stream = new MemoryStream(buffer ?? Array.Empty()); reader = new BinaryReader(stream); } public byte ReadByte() => reader.ReadByte(); public bool ReadBool() => reader.ReadBoolean(); public int ReadInt() => reader.ReadInt32(); public uint ReadUInt() => reader.ReadUInt32(); public short ReadShort() => reader.ReadInt16(); public ushort ReadUShort() => reader.ReadUInt16(); public long ReadLong() => reader.ReadInt64(); public ulong ReadULong() => reader.ReadUInt64(); public float ReadFloat() => reader.ReadSingle(); public Vector3 ReadVector3() { float x = reader.ReadSingle(); float y = reader.ReadSingle(); float z = reader.ReadSingle(); return new Vector3(x, y, z); } public Quaternion ReadQuaternion() { float x = reader.ReadSingle(); float y = reader.ReadSingle(); float z = reader.ReadSingle(); float w = reader.ReadSingle(); return new Quaternion(x, y, z, w); } public string ReadString() => reader.ReadString(); public bool TryReadBytes(int length, out byte[] bytes) { if (length <= 0 || reader.BaseStream.Position + length > reader.BaseStream.Length) { bytes = Array.Empty(); return false; } bytes = reader.ReadBytes(length); return true; } public void Dispose() { reader?.Dispose(); stream?.Dispose(); } } }