diff options
| author | Sarah Bradley <git@sarahduck.ca> | 2024-04-17 18:38:34 -0700 |
|---|---|---|
| committer | Sarah Bradley <git@sarahduck.ca> | 2024-04-17 18:38:34 -0700 |
| commit | b501bcf91f421579f5f6eeec7c5e9df9a6774b06 (patch) | |
| tree | 2b18120362c3b72311ea3303396cd7d879f3bae5 /Net.cs | |
| parent | a8b7d2cee254b23caf7868577e8859f948343263 (diff) | |
WIP RPC system
Diffstat (limited to 'Net.cs')
| -rw-r--r-- | Net.cs | 60 |
1 files changed, 60 insertions, 0 deletions
@@ -0,0 +1,60 @@ +using System.Buffers.Binary; + +namespace SarahEngine; + +public interface INetworkable<T> +{ + void ToBytes(Span<byte> span); + static abstract T FromBytes(ReadOnlySpan<byte> span); + static int SizeOf {get;} +} + +public struct NetInt(int i) : INetworkable<NetInt> +{ + public int Value = i; + public static int SizeOf => sizeof(int); + public readonly void ToBytes(Span<byte> span) => BinaryPrimitives.WriteInt32LittleEndian(span, Value); + public static NetInt FromBytes(ReadOnlySpan<byte> 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<NetSingle> +{ + public float Value = f; + public static int SizeOf => sizeof(float); + public readonly void ToBytes(Span<byte> span) => BinaryPrimitives.WriteSingleLittleEndian(span, Value); + public static NetSingle FromBytes(ReadOnlySpan<byte> 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<RPCBase> AllRPCs = new(); + protected abstract void FromBytes(Span<byte> span); +} + +public class RPC<T>(Action<T> method) : RPCBase where T : struct, INetworkable<T> +{ + readonly Action<T> Method = method; + + public void SendRPC(T param) + { + //blah blah blah, networking + } + + protected override void FromBytes(Span<byte> span) => Method?.Invoke(T.FromBytes(span)); +} + +public class TestingRPC +{ + static void DoStuff(NetInt testInt) {} + RPC<NetInt> Taco = new(DoStuff); + + public void OtherTest(int blah) { + Taco.SendRPC(blah); + } +}
\ No newline at end of file |
