Skip to content

Commit 5b2c77a

Browse files
committed
Started work on Command & RPC system
1 parent 4e16d9c commit 5b2c77a

File tree

11 files changed

+594
-6
lines changed

11 files changed

+594
-6
lines changed

MLAPI/Attributes/ClientRpc.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace MLAPI.Attributes
4+
{
5+
[AttributeUsage(AttributeTargets.Method)]
6+
public class ClientRpc : Attribute
7+
{
8+
9+
}
10+
}

MLAPI/Attributes/Command.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace MLAPI.Attributes
4+
{
5+
[AttributeUsage(AttributeTargets.Method)]
6+
public class Command : Attribute
7+
{
8+
9+
}
10+
}

MLAPI/Attributes/TargetRpc.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System;
2+
3+
namespace MLAPI.Attributes
4+
{
5+
[AttributeUsage(AttributeTargets.Method)]
6+
public class TargetRpc : Attribute
7+
{
8+
9+
}
10+
}

MLAPI/Data/Cache.cs

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Collections.Generic;
2+
using System.Security.Cryptography;
3+
using System.Text;
4+
5+
namespace MLAPI.Data
6+
{
7+
internal static class Cache
8+
{
9+
internal static Dictionary<string, ulong> messageAttributeHashes = new Dictionary<string, ulong>();
10+
internal static Dictionary<ulong, string> messageAttributeNames = new Dictionary<ulong, string>();
11+
12+
internal static ulong GetMessageAttributeHash(string name)
13+
{
14+
if (messageAttributeHashes.ContainsKey(name))
15+
return messageAttributeHashes[name];
16+
17+
using (SHA256Managed sha = new SHA256Managed())
18+
{
19+
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(name));
20+
ulong value = hash[0] | ((ulong)hash[1] << 8) | ((ulong)hash[2] << 16) | ((ulong)hash[3] << 24) | ((ulong)hash[4] << 32) | ((ulong)hash[5] << 40) | ((ulong)hash[6] << 48) | ((ulong)hash[7] << 56);
21+
//ulong value = hash[0] | ((uint)hash[1] << 8) | ((uint)hash[2] << 16) | ((uint)hash[3] << 24);
22+
messageAttributeHashes.Add(name, value);
23+
messageAttributeNames.Add(value, name);
24+
return value;
25+
}
26+
}
27+
28+
internal static string GetAttributeMethodName(ulong hash)
29+
{
30+
if (messageAttributeNames.ContainsKey(hash))
31+
return messageAttributeNames[hash];
32+
else
33+
return string.Empty;
34+
}
35+
36+
internal static void RegisterMessageAttributeName(string name)
37+
{
38+
if (messageAttributeHashes.ContainsKey(name))
39+
return;
40+
41+
using (SHA256Managed sha = new SHA256Managed())
42+
{
43+
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(name));
44+
ulong value = hash[0] | ((ulong)hash[1] << 8) | ((ulong)hash[2] << 16) | ((ulong)hash[3] << 24) | ((ulong)hash[4] << 32) | ((ulong)hash[5] << 40) | ((ulong)hash[6] << 48) | ((ulong)hash[7] << 56);
45+
//ulong value = hash[0] | ((uint)hash[1] << 8) | ((uint)hash[2] << 16) | ((uint)hash[3] << 24);
46+
messageAttributeHashes.Add(name, value);
47+
messageAttributeNames.Add(value, name);
48+
}
49+
}
50+
}
51+
}

MLAPI/Data/FieldType.cs

Lines changed: 281 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,137 @@ internal enum FieldType
4545

4646
internal static class FieldTypeHelper
4747
{
48+
internal static void WriteFieldType(BitWriter writer, object value, FieldType fieldType)
49+
{
50+
switch (fieldType)
51+
{
52+
case FieldType.Bool:
53+
writer.WriteBool((bool)value);
54+
break;
55+
case FieldType.Byte:
56+
writer.WriteByte((byte)value);
57+
break;
58+
case FieldType.Double:
59+
writer.WriteDouble((double)value);
60+
break;
61+
case FieldType.Single:
62+
writer.WriteFloat((float)value);
63+
break;
64+
case FieldType.Int:
65+
writer.WriteInt((int)value);
66+
break;
67+
case FieldType.Long:
68+
writer.WriteLong((long)value);
69+
break;
70+
case FieldType.SByte:
71+
writer.WriteSByte((sbyte)value);
72+
break;
73+
case FieldType.Short:
74+
writer.WriteShort((short)value);
75+
break;
76+
case FieldType.UInt:
77+
writer.WriteUInt((uint)value);
78+
break;
79+
case FieldType.ULong:
80+
writer.WriteULong((ulong)value);
81+
break;
82+
case FieldType.UShort:
83+
writer.WriteUShort((ushort)value);
84+
break;
85+
case FieldType.String:
86+
writer.WriteString((string)value);
87+
break;
88+
case FieldType.Vector3:
89+
Vector3 vector3 = (Vector3)value;
90+
writer.WriteFloat(vector3.x);
91+
writer.WriteFloat(vector3.y);
92+
writer.WriteFloat(vector3.z);
93+
break;
94+
case FieldType.Vector2:
95+
Vector2 vector2 = (Vector2)value;
96+
writer.WriteFloat(vector2.x);
97+
writer.WriteFloat(vector2.y);
98+
break;
99+
case FieldType.Quaternion:
100+
Vector3 euler = ((Quaternion)value).eulerAngles;
101+
writer.WriteFloat(euler.x);
102+
writer.WriteFloat(euler.y);
103+
writer.WriteFloat(euler.z);
104+
break;
105+
case FieldType.BoolArray:
106+
bool[] bools = (bool[])value;
107+
writer.WriteUShort((ushort)bools.Length);
108+
for (int j = 0; j < bools.Length; j++)
109+
writer.WriteBool(bools[j]);
110+
break;
111+
case FieldType.ByteArray:
112+
writer.WriteByteArray((byte[])value);
113+
break;
114+
case FieldType.DoubleArray:
115+
writer.WriteDoubleArray((double[])value);
116+
break;
117+
case FieldType.SingleArray:
118+
writer.WriteFloatArray((float[])value);
119+
break;
120+
case FieldType.IntArray:
121+
writer.WriteIntArray((int[])value);
122+
break;
123+
case FieldType.LongArray:
124+
writer.WriteLongArray((long[])value);
125+
break;
126+
case FieldType.SByteArray:
127+
writer.WriteSByteArray((sbyte[])value);
128+
break;
129+
case FieldType.ShortArray:
130+
writer.WriteShortArray((short[])value);
131+
break;
132+
case FieldType.UIntArray:
133+
writer.WriteUIntArray((uint[])value);
134+
break;
135+
case FieldType.ULongArray:
136+
writer.WriteULongArray((ulong[])value);
137+
break;
138+
case FieldType.UShortArray:
139+
writer.WriteUShortArray((ushort[])value);
140+
break;
141+
case FieldType.StringArray:
142+
string[] strings = (string[])value;
143+
writer.WriteUShort((ushort)strings.Length);
144+
for (int j = 0; j < strings.Length; j++)
145+
writer.WriteString(strings[j]);
146+
break;
147+
case FieldType.Vector3Array:
148+
Vector3[] vector3s = (Vector3[])value;
149+
writer.WriteUShort((ushort)vector3s.Length);
150+
for (int j = 0; j < vector3s.Length; j++)
151+
{
152+
writer.WriteFloat(vector3s[j].x);
153+
writer.WriteFloat(vector3s[j].y);
154+
writer.WriteFloat(vector3s[j].z);
155+
}
156+
break;
157+
case FieldType.Vector2Array:
158+
Vector2[] vector2s = (Vector2[])value;
159+
writer.WriteUShort((ushort)vector2s.Length);
160+
for (int j = 0; j < vector2s.Length; j++)
161+
{
162+
writer.WriteFloat(vector2s[j].x);
163+
writer.WriteFloat(vector2s[j].y);
164+
}
165+
break;
166+
case FieldType.QuaternionArray:
167+
Quaternion[] quaternions = (Quaternion[])value;
168+
writer.WriteUShort((ushort)quaternions.Length);
169+
for (int j = 0; j < quaternions.Length; j++)
170+
{
171+
writer.WriteFloat(quaternions[j].eulerAngles.x);
172+
writer.WriteFloat(quaternions[j].eulerAngles.y);
173+
writer.WriteFloat(quaternions[j].eulerAngles.z);
174+
}
175+
break;
176+
}
177+
}
178+
48179
internal static void WriteFieldType(BitWriter writer, FieldInfo field, object fieldInstance, FieldType fieldType)
49180
{
50181
switch (fieldType)
@@ -241,5 +372,155 @@ internal static FieldType GetFieldType(Type type)
241372
else
242373
return FieldType.Invalid;
243374
}
375+
376+
internal static object[] ReadObjects(BitReader reader, byte paramCount)
377+
{
378+
object[] returnVal = new object[paramCount];
379+
for (int i = 0; i < paramCount; i++)
380+
{
381+
//FieldType fieldType = (FieldType)reader.ReadBits(5);
382+
FieldType fieldType = (FieldType)reader.ReadByte();
383+
switch (fieldType)
384+
{
385+
case FieldType.Bool:
386+
returnVal[i] = reader.ReadBool();
387+
break;
388+
case FieldType.Byte:
389+
returnVal[i] = reader.ReadByte();
390+
break;
391+
case FieldType.Double:
392+
returnVal[i] = reader.ReadDouble();
393+
break;
394+
case FieldType.Single:
395+
returnVal[i] = reader.ReadFloat();
396+
break;
397+
case FieldType.Int:
398+
returnVal[i] = reader.ReadInt();
399+
break;
400+
case FieldType.Long:
401+
returnVal[i] = reader.ReadLong();
402+
break;
403+
case FieldType.SByte:
404+
returnVal[i] = reader.ReadSByte();
405+
break;
406+
case FieldType.Short:
407+
returnVal[i] = reader.ReadShort();
408+
break;
409+
case FieldType.UInt:
410+
returnVal[i] = reader.ReadUInt();
411+
break;
412+
case FieldType.ULong:
413+
returnVal[i] = reader.ReadULong();
414+
break;
415+
case FieldType.UShort:
416+
returnVal[i] = reader.ReadUShort();
417+
break;
418+
case FieldType.String:
419+
returnVal[i] = reader.ReadString();
420+
break;
421+
case FieldType.Vector3:
422+
Vector3 vector3 = Vector3.zero;
423+
vector3.x = reader.ReadFloat();
424+
vector3.y = reader.ReadFloat();
425+
vector3.z = reader.ReadFloat();
426+
returnVal[i] = vector3;
427+
break;
428+
case FieldType.Vector2:
429+
Vector2 vector2 = Vector2.zero;
430+
vector2.x = reader.ReadFloat();
431+
vector2.y = reader.ReadFloat();
432+
returnVal[i] = vector2;
433+
break;
434+
case FieldType.Quaternion:
435+
Vector3 eulerAngle = Vector3.zero;
436+
eulerAngle.x = reader.ReadFloat();
437+
eulerAngle.y = reader.ReadFloat();
438+
eulerAngle.z = reader.ReadFloat();
439+
returnVal[i] = Quaternion.Euler(eulerAngle);
440+
break;
441+
case FieldType.BoolArray:
442+
ushort boolCount = reader.ReadUShort();
443+
for (int j = 0; j < boolCount; j++)
444+
returnVal[i] = reader.ReadBool();
445+
break;
446+
case FieldType.ByteArray:
447+
returnVal[i] = reader.ReadByteArray();
448+
break;
449+
case FieldType.DoubleArray:
450+
returnVal[i] = reader.ReadDoubleArray();
451+
break;
452+
case FieldType.SingleArray:
453+
returnVal[i] = reader.ReadFloatArray();
454+
break;
455+
case FieldType.IntArray:
456+
returnVal[i] = reader.ReadIntArray();
457+
break;
458+
case FieldType.LongArray:
459+
returnVal[i] = reader.ReadLongArray();
460+
break;
461+
case FieldType.SByteArray:
462+
returnVal[i] = reader.ReadSByteArray();
463+
break;
464+
case FieldType.ShortArray:
465+
returnVal[i] = reader.ReadShortArray();
466+
break;
467+
case FieldType.UIntArray:
468+
returnVal[i] = reader.ReadUIntArray();
469+
break;
470+
case FieldType.ULongArray:
471+
returnVal[i] = reader.ReadULongArray();
472+
break;
473+
case FieldType.UShortArray:
474+
returnVal[i] = reader.ReadUShortArray();
475+
break;
476+
case FieldType.StringArray:
477+
ushort stringCount = reader.ReadUShort();
478+
string[] strings = new string[stringCount];
479+
for (int j = 0; j < stringCount; j++)
480+
strings[j] = reader.ReadString();
481+
returnVal[i] = strings;
482+
break;
483+
case FieldType.Vector3Array:
484+
ushort vector3Count = reader.ReadUShort();
485+
Vector3[] vector3s = new Vector3[vector3Count];
486+
for (int j = 0; j < vector3Count; j++)
487+
{
488+
Vector3 vec3 = Vector3.zero;
489+
vec3.x = reader.ReadFloat();
490+
vec3.y = reader.ReadFloat();
491+
vec3.z = reader.ReadFloat();
492+
vector3s[j] = vec3;
493+
}
494+
returnVal[i] = vector3s;
495+
break;
496+
case FieldType.Vector2Array:
497+
ushort vector2Count = reader.ReadUShort();
498+
Vector2[] vector2s = new Vector2[vector2Count];
499+
for (int j = 0; j < vector2Count; j++)
500+
{
501+
Vector2 vec2 = Vector2.zero;
502+
vec2.x = reader.ReadFloat();
503+
vec2.y = reader.ReadFloat();
504+
vector2s[j] = vec2;
505+
}
506+
returnVal[i] = vector2s;
507+
break;
508+
case FieldType.QuaternionArray:
509+
ushort quaternionCount = reader.ReadUShort();
510+
Quaternion[] quaternions = new Quaternion[quaternionCount];
511+
for (int j = 0; j < quaternionCount; j++)
512+
{
513+
Vector3 vec3 = Vector3.zero;
514+
vec3.x = reader.ReadFloat();
515+
vec3.y = reader.ReadFloat();
516+
vec3.z = reader.ReadFloat();
517+
quaternions[j] = Quaternion.Euler(vec3);
518+
}
519+
returnVal[i] = quaternions;
520+
break;
521+
}
522+
}
523+
return returnVal;
524+
}
244525
}
245526
}

MLAPI/MLAPI.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,10 @@
6767
</ItemGroup>
6868
<ItemGroup>
6969
<Compile Include="Attributes\BinaryIgnore.cs" />
70+
<Compile Include="Attributes\ClientRpc.cs" />
71+
<Compile Include="Attributes\Command.cs" />
72+
<Compile Include="Attributes\TargetRpc.cs" />
73+
<Compile Include="Data\Cache.cs" />
7074
<Compile Include="Data\Channel.cs" />
7175
<Compile Include="Data\FieldType.cs" />
7276
<Compile Include="Attributes\SyncedVar.cs" />

0 commit comments

Comments
 (0)