using System.Buffers.Binary; namespace SarahEngine; public interface INetworkable { void ToBytes(Span span); static abstract T FromBytes(ReadOnlySpan span); static int SizeOf {get;} } public struct NetInt(int i) : INetworkable { public int Value = i; public static int SizeOf => sizeof(int); public readonly void ToBytes(Span span) => BinaryPrimitives.WriteInt32LittleEndian(span, Value); public static NetInt FromBytes(ReadOnlySpan span) => BinaryPrimitives.ReadInt32LittleEndian(span); public static implicit operator NetInt(int i) => new(i); public static implicit operator int(NetInt i) => i.Value; } public struct NetSingle(float f) : INetworkable { public float Value = f; public static int SizeOf => sizeof(float); public readonly void ToBytes(Span span) => BinaryPrimitives.WriteSingleLittleEndian(span, Value); public static NetSingle FromBytes(ReadOnlySpan span) => new(BinaryPrimitives.ReadSingleLittleEndian(span)); public static implicit operator NetSingle(float f) => new(f); public static implicit operator float(NetSingle f) => f.Value; } public abstract class RPCBase { static readonly List AllRPCs = new(); protected abstract void FromBytes(Span span); } public class RPC(Action method) : RPCBase where T : struct, INetworkable { readonly Action Method = method; public void SendRPC(T param) { //blah blah blah, networking } protected override void FromBytes(Span span) => Method?.Invoke(T.FromBytes(span)); } public class TestingRPC { static void DoStuff(NetInt testInt) {} RPC Taco = new(DoStuff); public void OtherTest(int blah) { Taco.SendRPC(blah); } }