From 50883aea217adfc31df9dc3191967cdc45f6d511 Mon Sep 17 00:00:00 2001 From: Sarah Bradley Date: Sun, 19 May 2024 16:52:35 -0700 Subject: Simplified RPC stuff --- Net.cs | 69 +++++++++++++++++++++++++++++++++--------------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/Net.cs b/Net.cs index 36ff97d..58e829b 100644 --- a/Net.cs +++ b/Net.cs @@ -1,60 +1,59 @@ -using System.Buffers.Binary; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; namespace SarahEngine; -public interface INetworkable +public static class NetExtensions { - 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 T FromBytes(this Span span) where T : unmanaged => MemoryMarshal.Read(span); - public static implicit operator NetSingle(float f) => new(f); - public static implicit operator float(NetSingle f) => f.Value; + public static void ToBytes(this T value, Span span) where T : unmanaged => MemoryMarshal.Write(span, 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 +public class RPC(Action method) : RPCBase where T : unmanaged { readonly Action Method = method; + readonly byte[] bytes = new byte[Unsafe.SizeOf()]; public void SendRPC(T param) { - //blah blah blah, networking + param.ToBytes(bytes); + //Network it, baby } - protected override void FromBytes(Span span) => Method?.Invoke(T.FromBytes(span)); + protected override void FromBytes(Span span) + { + T result = span.FromBytes(); + Method.Invoke(result); + } } -public class TestingRPC +public class RPC(Action method) : RPCBase + where T1 : unmanaged + where T2 : unmanaged { - static void DoStuff(NetInt testInt) {} - RPC Taco = new(DoStuff); + readonly Action Method = method; + readonly byte[] bytes = new byte[Unsafe.SizeOf()+Unsafe.SizeOf()]; + + public void SendRPC(T1 param1, T2 param2) + { + Span span = bytes; + param1.ToBytes(span); + span = span[Unsafe.SizeOf()..]; + param2.ToBytes(span); + //Network it, baby + } - public void OtherTest(int blah) { - Taco.SendRPC(blah); + protected override void FromBytes(Span span) + { + T1 result1 = span.FromBytes(); + span = span[Unsafe.SizeOf()..]; + T2 result2 = span.FromBytes(); + Method.Invoke(result1, result2); } } \ No newline at end of file -- cgit