summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Net.cs60
1 files changed, 60 insertions, 0 deletions
diff --git a/Net.cs b/Net.cs
new file mode 100644
index 0000000..36ff97d
--- /dev/null
+++ b/Net.cs
@@ -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