117 lines
3.5 KiB
C#
117 lines
3.5 KiB
C#
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<byte>());
|
|
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<byte>();
|
|
return false;
|
|
}
|
|
|
|
bytes = reader.ReadBytes(length);
|
|
return true;
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
reader?.Dispose();
|
|
stream?.Dispose();
|
|
}
|
|
}
|
|
}
|