Replaced ALL usage of BinaryWriter / BinaryReader with BitReader & BitWriter

This commit is contained in:
Albin Corén 2018-04-17 23:23:24 +02:00
parent 39c262e9e0
commit 2acb20e8ea
7 changed files with 679 additions and 847 deletions

View File

@ -7,7 +7,6 @@
{ {
Bool, Bool,
Byte, Byte,
Char,
Double, Double,
Single, Single,
Int, Int,

View File

@ -4,7 +4,6 @@ using UnityEngine;
using System.Reflection; using System.Reflection;
using MLAPI.Attributes; using MLAPI.Attributes;
using System.Linq; using System.Linq;
using System.IO;
using MLAPI.Data; using MLAPI.Data;
using MLAPI.NetworkingManagerComponents.Binary; using MLAPI.NetworkingManagerComponents.Binary;
using MLAPI.NetworkingManagerComponents.Core; using MLAPI.NetworkingManagerComponents.Core;
@ -245,18 +244,6 @@ namespace MLAPI.MonoBehaviours.Core
HookMethod = method HookMethod = method
}); });
} }
else if (sortedFields[i].FieldType == typeof(char))
{
syncedVarFields.Add(new SyncedVarField()
{
Dirty = false,
Target = ((SyncedVar)sortedFields[i].GetCustomAttributes(typeof(SyncedVar), true)[0]).target,
FieldInfo = sortedFields[i],
FieldType = FieldType.Char,
FieldValue = sortedFields[i].GetValue(this),
HookMethod = method
});
}
else if (sortedFields[i].FieldType == typeof(double)) else if (sortedFields[i].FieldType == typeof(double))
{ {
syncedVarFields.Add(new SyncedVarField() syncedVarFields.Add(new SyncedVarField()
@ -450,95 +437,88 @@ namespace MLAPI.MonoBehaviours.Core
if (syncedVarFields.Count == 0) if (syncedVarFields.Count == 0)
return; return;
using (MemoryStream stream = new MemoryStream()) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) //Write all indexes
int syncCount = 0;
for (int i = 0; i < syncedVarFields.Count; i++)
{ {
//Write all indexes if (!syncedVarFields[i].Target)
int syncCount = 0; syncCount++;
for (int i = 0; i < syncedVarFields.Count; i++) else if (syncedVarFields[i].Target && ownerClientId == clientId)
syncCount++;
}
if (syncCount == 0)
return;
writer.WriteByte((byte)syncCount);
writer.WriteUInt(networkId); //NetId
writer.WriteUShort(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++)
{
if (syncedVarFields[i].Target && clientId != ownerClientId)
continue;
writer.WriteByte(i); //FieldIndex
switch (syncedVarFields[i].FieldType)
{ {
if (!syncedVarFields[i].Target) case FieldType.Bool:
syncCount++; writer.WriteBool((bool)syncedVarFields[i].FieldInfo.GetValue(this));
else if (syncedVarFields[i].Target && ownerClientId == clientId) break;
syncCount++; case FieldType.Byte:
} writer.WriteByte((byte)syncedVarFields[i].FieldInfo.GetValue(this));
if (syncCount == 0) break;
return; case FieldType.Double:
writer.Write((byte)syncCount); writer.WriteDouble((double)syncedVarFields[i].FieldInfo.GetValue(this));
writer.Write(networkId); //NetId break;
writer.Write(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex case FieldType.Single:
for (byte i = 0; i < syncedVarFields.Count; i++) writer.WriteFloat((float)syncedVarFields[i].FieldInfo.GetValue(this));
{ break;
if (syncedVarFields[i].Target && clientId != ownerClientId) case FieldType.Int:
continue; writer.WriteInt((int)syncedVarFields[i].FieldInfo.GetValue(this));
writer.Write(i); //FieldIndex break;
switch (syncedVarFields[i].FieldType) case FieldType.Long:
{ writer.WriteLong((long)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Bool: break;
writer.Write((bool)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.SByte:
break; writer.WriteSByte((sbyte)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Byte: break;
writer.Write((byte)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.Short:
break; writer.WriteShort((short)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Char: break;
writer.Write((char)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.UInt:
break; writer.WriteUInt((uint)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Double: break;
writer.Write((double)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.ULong:
break; writer.WriteULong((ulong)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Single: break;
writer.Write((float)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.UShort:
break; writer.WriteUShort((ushort)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Int: break;
writer.Write((int)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.String:
break; writer.WriteString((string)syncedVarFields[i].FieldInfo.GetValue(this));
case FieldType.Long: break;
writer.Write((long)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.Vector3:
break; Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this);
case FieldType.SByte: writer.WriteFloat(vector3.x);
writer.Write((sbyte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat(vector3.y);
break; writer.WriteFloat(vector3.z);
case FieldType.Short: break;
writer.Write((short)syncedVarFields[i].FieldInfo.GetValue(this)); case FieldType.Vector2:
break; Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this);
case FieldType.UInt: writer.WriteFloat(vector2.x);
writer.Write((uint)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat(vector2.y);
break; break;
case FieldType.ULong: case FieldType.Quaternion:
writer.Write((ulong)syncedVarFields[i].FieldInfo.GetValue(this)); Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles;
break; writer.WriteFloat(euler.x);
case FieldType.UShort: writer.WriteFloat(euler.y);
writer.Write((ushort)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat(euler.z);
break; break;
case FieldType.String: case FieldType.ByteArray:
writer.Write((string)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteByteArray((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Vector3:
Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector3.x);
writer.Write(vector3.y);
writer.Write(vector3.z);
break;
case FieldType.Vector2:
Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector2.x);
writer.Write(vector2.y);
break;
case FieldType.Quaternion:
Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles;
writer.Write(euler.x);
writer.Write(euler.y);
writer.Write(euler.z);
break;
case FieldType.ByteArray:
writer.Write((ushort)((byte[])syncedVarFields[i].FieldInfo.GetValue(this)).Length);
writer.Write((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
break;
}
} }
} }
InternalMessageHandler.Send(clientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray()); InternalMessageHandler.Send(clientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", writer.Finalize());
} }
} }
@ -571,177 +551,162 @@ namespace MLAPI.MonoBehaviours.Core
if (dirtyTargets == 0) if (dirtyTargets == 0)
{ {
//It's sync time! //It's sync time!
using (MemoryStream stream = new MemoryStream()) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) //Write all indexes
writer.WriteByte(totalDirtyCount);
writer.WriteUInt(networkId); //NetId
writer.WriteUShort(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++)
{ {
//Write all indexes //Writes all the indexes of the dirty syncvars.
writer.Write(totalDirtyCount); if (syncedVarFields[i].Dirty == true)
writer.Write(networkId); //NetId
writer.Write(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++)
{ {
//Writes all the indexes of the dirty syncvars. writer.WriteByte(i); //FieldIndex
if (syncedVarFields[i].Dirty == true) switch (syncedVarFields[i].FieldType)
{ {
writer.Write(i); //FieldIndex case FieldType.Bool:
switch (syncedVarFields[i].FieldType) writer.WriteBool((bool)syncedVarFields[i].FieldInfo.GetValue(this));
{ break;
case FieldType.Bool: case FieldType.Byte:
writer.Write((bool)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteByte((byte)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Byte: case FieldType.Double:
writer.Write((byte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteDouble((double)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Char: case FieldType.Single:
writer.Write((char)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat((float)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Double: case FieldType.Int:
writer.Write((double)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteInt((int)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Single: case FieldType.Long:
writer.Write((float)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteLong((long)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Int: case FieldType.SByte:
writer.Write((int)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteSByte((sbyte)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Long: case FieldType.Short:
writer.Write((long)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteShort((short)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.SByte: case FieldType.UInt:
writer.Write((sbyte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUInt((uint)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Short: case FieldType.ULong:
writer.Write((short)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteULong((ulong)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UInt: case FieldType.UShort:
writer.Write((uint)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUShort((ushort)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.ULong: case FieldType.String:
writer.Write((ulong)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteString((string)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UShort: case FieldType.Vector3:
writer.Write((ushort)syncedVarFields[i].FieldInfo.GetValue(this)); Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this);
break; writer.WriteFloat(vector3.x);
case FieldType.String: writer.WriteFloat(vector3.y);
writer.Write((string)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat(vector3.z);
break; break;
case FieldType.Vector3: case FieldType.Vector2:
Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this); Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector3.x); writer.WriteFloat(vector2.x);
writer.Write(vector3.y); writer.WriteFloat(vector2.y);
writer.Write(vector3.z); break;
break; case FieldType.Quaternion:
case FieldType.Vector2: Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles;
Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this); writer.WriteFloat(euler.x);
writer.Write(vector2.x); writer.WriteFloat(euler.y);
writer.Write(vector2.y); writer.WriteFloat(euler.z);
break; break;
case FieldType.Quaternion: case FieldType.ByteArray:
Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles; writer.WriteByteArray((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
writer.Write(euler.x); break;
writer.Write(euler.y);
writer.Write(euler.z);
break;
case FieldType.ByteArray:
writer.Write((ushort)((byte[])syncedVarFields[i].FieldInfo.GetValue(this)).Length);
writer.Write((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
break;
}
syncedVarFields[i].FieldValue = syncedVarFields[i].FieldInfo.GetValue(this);
syncedVarFields[i].Dirty = false;
} }
syncedVarFields[i].FieldValue = syncedVarFields[i].FieldInfo.GetValue(this);
syncedVarFields[i].Dirty = false;
} }
} }
InternalMessageHandler.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray()); InternalMessageHandler.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", writer.Finalize());
} }
} }
else else
{ {
//It's sync time. This is the target receivers packet. //It's sync time. This is the target receivers packet.
using (MemoryStream stream = new MemoryStream()) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) //Write all indexes
writer.WriteByte(totalDirtyCount);
writer.WriteUInt(networkId); //NetId
writer.WriteUShort(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++)
{ {
//Write all indexes //Writes all the indexes of the dirty syncvars.
writer.Write(totalDirtyCount); if (syncedVarFields[i].Dirty == true)
writer.Write(networkId); //NetId
writer.Write(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++)
{ {
//Writes all the indexes of the dirty syncvars. writer.WriteByte(i); //FieldIndex
if (syncedVarFields[i].Dirty == true) switch (syncedVarFields[i].FieldType)
{ {
writer.Write(i); //FieldIndex case FieldType.Bool:
switch (syncedVarFields[i].FieldType) writer.WriteBool((bool)syncedVarFields[i].FieldInfo.GetValue(this));
{ break;
case FieldType.Bool: case FieldType.Byte:
writer.Write((bool)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteByte((byte)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Byte: case FieldType.Double:
writer.Write((byte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteDouble((double)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Char: case FieldType.Single:
writer.Write((char)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat((float)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Double: case FieldType.Int:
writer.Write((double)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteInt((int)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Single: case FieldType.Long:
writer.Write((float)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteLong((long)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Int: case FieldType.SByte:
writer.Write((int)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteSByte((sbyte)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Long: case FieldType.Short:
writer.Write((long)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteShort((short)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.SByte: case FieldType.UInt:
writer.Write((sbyte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUInt((uint)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Short: case FieldType.ULong:
writer.Write((short)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteULong((ulong)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UInt: case FieldType.UShort:
writer.Write((uint)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUShort((ushort)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.ULong: case FieldType.String:
writer.Write((ulong)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteString((string)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UShort: case FieldType.Vector3:
writer.Write((ushort)syncedVarFields[i].FieldInfo.GetValue(this)); Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this);
break; writer.WriteFloat(vector3.x);
case FieldType.String: writer.WriteFloat(vector3.y);
writer.Write((string)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat(vector3.z);
break; break;
case FieldType.Vector3: case FieldType.Vector2:
Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this); Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector3.x); writer.WriteFloat(vector2.x);
writer.Write(vector3.y); writer.WriteFloat(vector2.y);
writer.Write(vector3.z); break;
break; case FieldType.Quaternion:
case FieldType.Vector2: Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles;
Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this); writer.WriteFloat(euler.x);
writer.Write(vector2.x); writer.WriteFloat(euler.y);
writer.Write(vector2.y); writer.WriteFloat(euler.z);
break; break;
case FieldType.Quaternion: case FieldType.ByteArray:
Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles; writer.WriteByteArray((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
writer.Write(euler.x); break;
writer.Write(euler.y);
writer.Write(euler.z);
break;
case FieldType.ByteArray:
writer.Write((ushort)((byte[])syncedVarFields[i].FieldInfo.GetValue(this)).Length);
writer.Write((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
break;
}
} }
} }
} }
InternalMessageHandler.Send(ownerClientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray()); //Send only to target InternalMessageHandler.Send(ownerClientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", writer.Finalize()); //Send only to target
} }
if (nonTargetDirtyCount == 0) if (nonTargetDirtyCount == 0)
@ -756,81 +721,75 @@ namespace MLAPI.MonoBehaviours.Core
} }
//It's sync time. This is the NON target receivers packet. //It's sync time. This is the NON target receivers packet.
using (MemoryStream stream = new MemoryStream()) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream))
{
//Write all indexes //Write all indexes
writer.Write(nonTargetDirtyCount); writer.WriteByte(nonTargetDirtyCount);
writer.Write(networkId); //NetId writer.WriteUInt(networkId); //NetId
writer.Write(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex writer.WriteUShort(networkedObject.GetOrderIndex(this)); //Behaviour OrderIndex
for (byte i = 0; i < syncedVarFields.Count; i++) for (byte i = 0; i < syncedVarFields.Count; i++)
{ {
//Writes all the indexes of the dirty syncvars. //Writes all the indexes of the dirty syncvars.
if (syncedVarFields[i].Dirty == true && !syncedVarFields[i].Target) if (syncedVarFields[i].Dirty == true && !syncedVarFields[i].Target)
{ {
writer.Write(i); //FieldIndex writer.WriteByte(i); //FieldIndex
switch (syncedVarFields[i].FieldType) switch (syncedVarFields[i].FieldType)
{ {
case FieldType.Bool: case FieldType.Bool:
writer.Write((bool)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteBool((bool)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Byte: case FieldType.Byte:
writer.Write((byte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteByte((byte)syncedVarFields[i].FieldInfo.GetValue(this));
break;
case FieldType.Char:
writer.Write((char)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Double: case FieldType.Double:
writer.Write((double)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteDouble((double)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Single: case FieldType.Single:
writer.Write((float)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteFloat((float)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Int: case FieldType.Int:
writer.Write((int)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteInt((int)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Long: case FieldType.Long:
writer.Write((long)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteLong((long)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.SByte: case FieldType.SByte:
writer.Write((sbyte)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteSByte((sbyte)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Short: case FieldType.Short:
writer.Write((short)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteShort((short)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UInt: case FieldType.UInt:
writer.Write((uint)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUInt((uint)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.ULong: case FieldType.ULong:
writer.Write((ulong)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteULong((ulong)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.UShort: case FieldType.UShort:
writer.Write((ushort)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteUShort((ushort)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.String: case FieldType.String:
writer.Write((string)syncedVarFields[i].FieldInfo.GetValue(this)); writer.WriteString((string)syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
case FieldType.Vector3: case FieldType.Vector3:
Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this); Vector3 vector3 = (Vector3)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector3.x); writer.WriteFloat(vector3.x);
writer.Write(vector3.y); writer.WriteFloat(vector3.y);
writer.Write(vector3.z); writer.WriteFloat(vector3.z);
break; break;
case FieldType.Vector2: case FieldType.Vector2:
Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this); Vector2 vector2 = (Vector2)syncedVarFields[i].FieldInfo.GetValue(this);
writer.Write(vector2.x); writer.WriteFloat(vector2.x);
writer.Write(vector2.y); writer.WriteFloat(vector2.y);
break; break;
case FieldType.Quaternion: case FieldType.Quaternion:
Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles; Vector3 euler = ((Quaternion)syncedVarFields[i].FieldInfo.GetValue(this)).eulerAngles;
writer.Write(euler.x); writer.WriteFloat(euler.x);
writer.Write(euler.y); writer.WriteFloat(euler.y);
writer.Write(euler.z); writer.WriteFloat(euler.z);
break; break;
case FieldType.ByteArray: case FieldType.ByteArray:
writer.Write((ushort)((byte[])syncedVarFields[i].FieldInfo.GetValue(this)).Length); writer.WriteByteArray((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
writer.Write((byte[])syncedVarFields[i].FieldInfo.GetValue(this));
break; break;
} }
@ -838,8 +797,8 @@ namespace MLAPI.MonoBehaviours.Core
syncedVarFields[i].Dirty = false; syncedVarFields[i].Dirty = false;
} }
} }
}
InternalMessageHandler.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", stream.ToArray(), ownerClientId); // Send to everyone except target. InternalMessageHandler.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_INTERNAL", writer.Finalize(), ownerClientId); // Send to everyone except target.
} }
} }
lastSyncTime = NetworkingManager.singleton.NetworkTime; lastSyncTime = NetworkingManager.singleton.NetworkTime;
@ -866,12 +825,6 @@ namespace MLAPI.MonoBehaviours.Core
else else
syncedVarFields[i].Dirty = false; //Up to date syncedVarFields[i].Dirty = false; //Up to date
break; break;
case FieldType.Char:
if ((char)syncedVarFields[i].FieldInfo.GetValue(this) != (char)syncedVarFields[i].FieldValue)
syncedVarFields[i].Dirty = true; //This fields value is out of sync!
else
syncedVarFields[i].Dirty = false; //Up to date
break;
case FieldType.Double: case FieldType.Double:
if ((double)syncedVarFields[i].FieldInfo.GetValue(this) != (double)syncedVarFields[i].FieldValue) if ((double)syncedVarFields[i].FieldInfo.GetValue(this) != (double)syncedVarFields[i].FieldValue)
syncedVarFields[i].Dirty = true; //This fields value is out of sync! syncedVarFields[i].Dirty = true; //This fields value is out of sync!

View File

@ -2,7 +2,6 @@
using System; using System;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
using System.Linq; using System.Linq;
@ -745,29 +744,17 @@ namespace MLAPI.MonoBehaviours.Core
diffiePublic = clientDiffieHellman.GetPublicKey(); diffiePublic = clientDiffieHellman.GetPublicKey();
} }
int sizeOfStream = 32; using (BitWriter writer = new BitWriter())
if (NetworkConfig.ConnectionApproval)
sizeOfStream += 2 + NetworkConfig.ConnectionData.Length;
if (NetworkConfig.EnableEncryption)
sizeOfStream += 2 + diffiePublic.Length;
using (MemoryStream writeStream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(writeStream)) writer.WriteByteArray(NetworkConfig.GetConfig(), true);
{
writer.Write(NetworkConfig.GetConfig()); if (NetworkConfig.EnableEncryption)
if (NetworkConfig.EnableEncryption) writer.WriteByteArray(diffiePublic);
{
writer.Write((ushort)diffiePublic.Length); if (NetworkConfig.ConnectionApproval)
writer.Write(diffiePublic); writer.WriteByteArray(NetworkConfig.ConnectionData);
}
if (NetworkConfig.ConnectionApproval) InternalMessageHandler.Send(netId.GetClientId(), "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writer.Finalize(), null, null, true);
{
writer.Write((ushort)NetworkConfig.ConnectionData.Length);
writer.Write(NetworkConfig.ConnectionData);
}
}
InternalMessageHandler.Send(netId.GetClientId(), "MLAPI_CONNECTION_REQUEST", "MLAPI_INTERNAL", writeStream.GetBuffer(), null, null, true);
} }
} }
break; break;
@ -1061,32 +1048,25 @@ namespace MLAPI.MonoBehaviours.Core
if (isServer) if (isServer)
{ {
using (MemoryStream stream = new MemoryStream(4)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(clientId);
{ InternalMessageHandler.Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_INTERNAL", writer.Finalize(), clientId);
writer.Write(clientId); }
}
InternalMessageHandler.Send("MLAPI_CLIENT_DISCONNECT", "MLAPI_INTERNAL", stream.GetBuffer(), clientId);
}
} }
} }
private void SyncTime() private void SyncTime()
{ {
using (MemoryStream stream = new MemoryStream(8)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteFloat(NetworkTime);
{ int timestamp = NetworkTransport.GetNetworkTimestamp();
writer.Write(NetworkTime); writer.WriteInt(timestamp);
int timestamp = NetworkTransport.GetNetworkTimestamp();
writer.Write(timestamp);
}
byte[] buffer = writer.Finalize();
foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients) foreach (KeyValuePair<uint, NetworkedClient> pair in connectedClients)
{ InternalMessageHandler.Send("MLAPI_TIME_SYNC", "MLAPI_TIME_SYNC", buffer);
InternalMessageHandler.Send("MLAPI_TIME_SYNC", "MLAPI_TIME_SYNC", stream.GetBuffer());
}
} }
} }
@ -1134,86 +1114,57 @@ namespace MLAPI.MonoBehaviours.Core
GameObject go = SpawnManager.SpawnPlayerObject(clientId, networkId, position, rotation); GameObject go = SpawnManager.SpawnPlayerObject(clientId, networkId, position, rotation);
connectedClients[clientId].PlayerObject = go; connectedClients[clientId].PlayerObject = go;
} }
int sizeOfStream = 17 + ((connectedClients.Count - 1) * 4);
int amountOfObjectsToSend = SpawnManager.spawnedObjects.Values.Count(); int amountOfObjectsToSend = SpawnManager.spawnedObjects.Values.Count();
if (NetworkConfig.HandleObjectSpawning) using (BitWriter writer = new BitWriter())
{ {
sizeOfStream += 4; writer.WriteUInt(clientId);
sizeOfStream += 38 * amountOfObjectsToSend; if (NetworkConfig.EnableSceneSwitching)
} writer.WriteUInt(NetworkSceneManager.CurrentSceneIndex);
if (NetworkConfig.EnableEncryption) if (NetworkConfig.EnableEncryption)
{
sizeOfStream += 2 + publicKey.Length;
if (NetworkConfig.SignKeyExchange)
{ {
sizeOfStream += 2 + publicKeySignature.Length; writer.WriteByteArray(publicKey);
if (NetworkConfig.SignKeyExchange)
writer.WriteByteArray(publicKeySignature);
} }
}
if (NetworkConfig.EnableSceneSwitching) writer.WriteFloat(NetworkTime);
{ writer.WriteInt(NetworkTransport.GetNetworkTimestamp());
sizeOfStream += 4;
}
using (MemoryStream writeStream = new MemoryStream(sizeOfStream)) writer.WriteInt(connectedClients.Count - 1);
{ foreach (KeyValuePair<uint, NetworkedClient> item in connectedClients)
using (BinaryWriter writer = new BinaryWriter(writeStream))
{ {
writer.Write(clientId); //Our own ID. Already added as the first one above
if(NetworkConfig.EnableSceneSwitching) if (item.Key == clientId)
continue;
writer.WriteUInt(item.Key); //ClientId
}
if (NetworkConfig.HandleObjectSpawning)
{
writer.WriteInt(amountOfObjectsToSend);
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{ {
writer.Write(NetworkSceneManager.CurrentSceneIndex); writer.WriteBool(pair.Value.isPlayerObject);
} writer.WriteUInt(pair.Value.NetworkId);
writer.WriteUInt(pair.Value.OwnerClientId);
writer.WriteInt(NetworkConfig.NetworkPrefabIds[pair.Value.NetworkedPrefabName]);
writer.WriteBool(pair.Value.gameObject.activeInHierarchy);
writer.WriteBool(pair.Value.sceneObject == null ? true : pair.Value.sceneObject.Value);
if (NetworkConfig.EnableEncryption) writer.WriteFloat(pair.Value.transform.position.x);
{ writer.WriteFloat(pair.Value.transform.position.y);
writer.Write((ushort)publicKey.Length); writer.WriteFloat(pair.Value.transform.position.z);
writer.Write(publicKey);
if (NetworkConfig.SignKeyExchange)
{
writer.Write((ushort)publicKeySignature.Length);
writer.Write(publicKeySignature);
}
}
writer.Write(NetworkTime); writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.x);
writer.Write(NetworkTransport.GetNetworkTimestamp()); writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.y);
writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.z);
writer.Write(connectedClients.Count - 1);
foreach (KeyValuePair<uint, NetworkedClient> item in connectedClients)
{
//Our own ID. Already added as the first one above
if (item.Key == clientId)
continue;
writer.Write(item.Key); //ClientId
}
if (NetworkConfig.HandleObjectSpawning)
{
writer.Write(amountOfObjectsToSend);
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.spawnedObjects)
{
writer.Write(pair.Value.isPlayerObject);
writer.Write(pair.Value.NetworkId);
writer.Write(pair.Value.OwnerClientId);
writer.Write(NetworkConfig.NetworkPrefabIds[pair.Value.NetworkedPrefabName]);
writer.Write(pair.Value.gameObject.activeInHierarchy);
writer.Write(pair.Value.sceneObject == null ? true : pair.Value.sceneObject.Value);
writer.Write(pair.Value.transform.position.x);
writer.Write(pair.Value.transform.position.y);
writer.Write(pair.Value.transform.position.z);
writer.Write(pair.Value.transform.rotation.eulerAngles.x);
writer.Write(pair.Value.transform.rotation.eulerAngles.y);
writer.Write(pair.Value.transform.rotation.eulerAngles.z);
}
} }
} }
InternalMessageHandler.Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_INTERNAL", writeStream.GetBuffer(), null, null, true);
InternalMessageHandler.Send(clientId, "MLAPI_CONNECTION_APPROVED", "MLAPI_INTERNAL", writer.Finalize(), null, null, true);
if (OnClientConnectedCallback != null) if (OnClientConnectedCallback != null)
OnClientConnectedCallback.Invoke(clientId); OnClientConnectedCallback.Invoke(clientId);
@ -1221,37 +1172,30 @@ namespace MLAPI.MonoBehaviours.Core
//Inform old clients of the new player //Inform old clients of the new player
if(NetworkConfig.HandleObjectSpawning) using (BitWriter writer = new BitWriter())
sizeOfStream = 38;
else
sizeOfStream = 4;
using (MemoryStream stream = new MemoryStream(sizeOfStream))
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) if (NetworkConfig.HandleObjectSpawning)
{ {
if (NetworkConfig.HandleObjectSpawning) writer.WriteBool(true);
{ writer.WriteUInt(connectedClients[clientId].PlayerObject.GetComponent<NetworkedObject>().NetworkId);
writer.Write(true); writer.WriteUInt(clientId);
writer.Write(connectedClients[clientId].PlayerObject.GetComponent<NetworkedObject>().NetworkId); writer.WriteInt(-1);
writer.Write(clientId); writer.WriteBool(false);
writer.Write(-1);
writer.Write(false);
writer.Write(connectedClients[clientId].PlayerObject.transform.position.x); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.position.x);
writer.Write(connectedClients[clientId].PlayerObject.transform.position.y); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.position.y);
writer.Write(connectedClients[clientId].PlayerObject.transform.position.z); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.position.z);
writer.Write(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.x); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.x);
writer.Write(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.y); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.y);
writer.Write(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.z); writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.z);
}
else
{
writer.Write(clientId);
}
} }
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer(), clientId); else
{
writer.WriteUInt(clientId);
}
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", writer.Finalize(), clientId);
} }
//Flush syncvars: //Flush syncvars:
foreach (KeyValuePair<uint, NetworkedObject> networkedObject in SpawnManager.spawnedObjects) foreach (KeyValuePair<uint, NetworkedObject> networkedObject in SpawnManager.spawnedObjects)

View File

@ -1,8 +1,7 @@
using System; using System.Security.Cryptography;
using System.IO;
using System.Security.Cryptography;
using MLAPI.Data; using MLAPI.Data;
using MLAPI.MonoBehaviours.Core; using MLAPI.MonoBehaviours.Core;
using MLAPI.NetworkingManagerComponents.Binary;
using UnityEngine; using UnityEngine;
using UnityEngine.Networking; using UnityEngine.Networking;
@ -12,133 +11,121 @@ namespace MLAPI.NetworkingManagerComponents.Core
{ {
internal static void HandleConnectionRequest(uint clientId, byte[] incommingData, int channelId) internal static void HandleConnectionRequest(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
{
byte[] configHash = messageReader.ReadBytes(32);
if (!netManager.NetworkConfig.CompareConfig(configHash))
{
Debug.LogWarning("MLAPI: NetworkConfiguration missmatch. The configuration between the server and client does not match.");
netManager.DisconnectClient(clientId);
return;
}
byte[] aesKey = new byte[0];
if (netManager.NetworkConfig.EnableEncryption)
{
ushort diffiePublicSize = messageReader.ReadUInt16();
byte[] diffiePublic = messageReader.ReadBytes(diffiePublicSize);
netManager.diffieHellmanPublicKeys.Add(clientId, diffiePublic);
} byte[] configHash = reader.ReadByteArray(32);
if (netManager.NetworkConfig.ConnectionApproval) if (!netManager.NetworkConfig.CompareConfig(configHash))
{ {
ushort bufferSize = messageReader.ReadUInt16(); Debug.LogWarning("MLAPI: NetworkConfiguration missmatch. The configuration between the server and client does not match.");
byte[] connectionBuffer = messageReader.ReadBytes(bufferSize); netManager.DisconnectClient(clientId);
netManager.ConnectionApprovalCallback(connectionBuffer, clientId, netManager.HandleApproval); return;
} }
else
{ if (netManager.NetworkConfig.EnableEncryption)
netManager.HandleApproval(clientId, true, Vector3.zero, Quaternion.identity); {
} byte[] diffiePublic = reader.ReadByteArray();
} netManager.diffieHellmanPublicKeys.Add(clientId, diffiePublic);
}
if (netManager.NetworkConfig.ConnectionApproval)
{
byte[] connectionBuffer = reader.ReadByteArray();
netManager.ConnectionApprovalCallback(connectionBuffer, clientId, netManager.HandleApproval);
}
else
{
netManager.HandleApproval(clientId, true, Vector3.zero, Quaternion.identity);
} }
} }
internal static void HandleConnectionApproved(uint clientId, byte[] incommingData, int channelId) internal static void HandleConnectionApproved(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
netManager.myClientId = reader.ReadUInt();
uint sceneIndex = 0;
if (netManager.NetworkConfig.EnableSceneSwitching)
sceneIndex = reader.ReadUInt();
if (netManager.NetworkConfig.EnableEncryption)
{ {
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) byte[] serverPublicKey = reader.ReadByteArray();
netManager.clientAesKey = netManager.clientDiffieHellman.GetSharedSecret(serverPublicKey);
if (netManager.NetworkConfig.SignKeyExchange)
{ {
netManager.myClientId = messageReader.ReadUInt32(); byte[] publicKeySignature = reader.ReadByteArray();
uint sceneIndex = 0; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
if (netManager.NetworkConfig.EnableSceneSwitching)
{ {
sceneIndex = messageReader.ReadUInt32(); rsa.PersistKeyInCsp = false;
} rsa.FromXmlString(netManager.NetworkConfig.RSAPublicKey);
if (!rsa.VerifyData(serverPublicKey, new SHA512CryptoServiceProvider(), publicKeySignature))
if (netManager.NetworkConfig.EnableEncryption)
{
ushort keyLength = messageReader.ReadUInt16();
byte[] serverPublicKey = messageReader.ReadBytes(keyLength);
netManager.clientAesKey = netManager.clientDiffieHellman.GetSharedSecret(serverPublicKey);
if (netManager.NetworkConfig.SignKeyExchange)
{ {
ushort signatureLength = messageReader.ReadUInt16(); //Man in the middle.
byte[] publicKeySignature = messageReader.ReadBytes(signatureLength); Debug.LogWarning("MLAPI: Signature doesnt match for the key exchange public part. Disconnecting");
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) netManager.StopClient();
{ return;
rsa.PersistKeyInCsp = false;
rsa.FromXmlString(netManager.NetworkConfig.RSAPublicKey);
if (!rsa.VerifyData(serverPublicKey, new SHA512CryptoServiceProvider(), publicKeySignature))
{
//Man in the middle.
Debug.LogWarning("MLAPI: Signature doesnt match for the key exchange public part. Disconnecting");
netManager.StopClient();
return;
}
}
} }
} }
float netTime = messageReader.ReadSingle();
int remoteStamp = messageReader.ReadInt32();
byte error;
NetId netId = new NetId(clientId);
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteStamp, out error);
if ((NetworkError)error != NetworkError.Ok)
msDelay = 0;
netManager.networkTime = netTime + (msDelay / 1000f);
netManager.connectedClients.Add(clientId, new NetworkedClient() { ClientId = clientId });
int clientCount = messageReader.ReadInt32();
for (int i = 0; i < clientCount; i++)
{
uint _clientId = messageReader.ReadUInt32();
netManager.connectedClients.Add(_clientId, new NetworkedClient() { ClientId = _clientId });
}
if (netManager.NetworkConfig.HandleObjectSpawning)
{
SpawnManager.DestroySceneObjects();
int objectCount = messageReader.ReadInt32();
for (int i = 0; i < objectCount; i++)
{
bool isPlayerObject = messageReader.ReadBoolean();
uint networkId = messageReader.ReadUInt32();
uint ownerId = messageReader.ReadUInt32();
int prefabId = messageReader.ReadInt32();
bool isActive = messageReader.ReadBoolean();
bool sceneObject = messageReader.ReadBoolean();
float xPos = messageReader.ReadSingle();
float yPos = messageReader.ReadSingle();
float zPos = messageReader.ReadSingle();
float xRot = messageReader.ReadSingle();
float yRot = messageReader.ReadSingle();
float zRot = messageReader.ReadSingle();
if (isPlayerObject)
{
SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
}
else
{
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
go.SetActive(isActive);
}
}
}
if (netManager.NetworkConfig.EnableSceneSwitching)
{
NetworkSceneManager.OnSceneSwitch(sceneIndex);
}
} }
} }
float netTime = reader.ReadFloat();
int remoteStamp = reader.ReadInt();
byte error;
NetId netId = new NetId(clientId);
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, remoteStamp, out error);
if ((NetworkError)error != NetworkError.Ok)
msDelay = 0;
netManager.networkTime = netTime + (msDelay / 1000f);
netManager.connectedClients.Add(clientId, new NetworkedClient() { ClientId = clientId });
int clientCount = reader.ReadInt();
for (int i = 0; i < clientCount; i++)
{
uint _clientId = reader.ReadUInt();
netManager.connectedClients.Add(_clientId, new NetworkedClient() { ClientId = _clientId });
}
if (netManager.NetworkConfig.HandleObjectSpawning)
{
SpawnManager.DestroySceneObjects();
int objectCount = reader.ReadInt();
for (int i = 0; i < objectCount; i++)
{
bool isPlayerObject = reader.ReadBool();
uint networkId = reader.ReadUInt();
uint ownerId = reader.ReadUInt();
int prefabId = reader.ReadInt();
bool isActive = reader.ReadBool();
bool sceneObject = reader.ReadBool();
float xPos = reader.ReadFloat();
float yPos = reader.ReadFloat();
float zPos = reader.ReadFloat();
float xRot = reader.ReadFloat();
float yRot = reader.ReadFloat();
float zRot = reader.ReadFloat();
if (isPlayerObject)
{
SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
}
else
{
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
go.SetActive(isActive);
}
}
}
if (netManager.NetworkConfig.EnableSceneSwitching)
{
NetworkSceneManager.OnSceneSwitch(sceneIndex);
}
netManager._isClientConnected = true; netManager._isClientConnected = true;
if (netManager.OnClientConnectedCallback != null) if (netManager.OnClientConnectedCallback != null)
netManager.OnClientConnectedCallback.Invoke(clientId); netManager.OnClientConnectedCallback.Invoke(clientId);
@ -146,236 +133,201 @@ namespace MLAPI.NetworkingManagerComponents.Core
internal static void HandleAddObject(uint clientId, byte[] incommingData, int channelId) internal static void HandleAddObject(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
if (netManager.NetworkConfig.HandleObjectSpawning)
{ {
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) bool isPlayerObject = reader.ReadBool();
uint networkId = reader.ReadUInt();
uint ownerId = reader.ReadUInt();
int prefabId = reader.ReadInt();
bool sceneObject = reader.ReadBool();
float xPos = reader.ReadFloat();
float yPos = reader.ReadFloat();
float zPos = reader.ReadFloat();
float xRot = reader.ReadFloat();
float yRot = reader.ReadFloat();
float zRot = reader.ReadFloat();
if (isPlayerObject)
{ {
if (netManager.NetworkConfig.HandleObjectSpawning) netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
{ SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
bool isPlayerObject = messageReader.ReadBoolean();
uint networkId = messageReader.ReadUInt32();
uint ownerId = messageReader.ReadUInt32();
int prefabId = messageReader.ReadInt32();
bool sceneObject = messageReader.ReadBoolean();
float xPos = messageReader.ReadSingle();
float yPos = messageReader.ReadSingle();
float zPos = messageReader.ReadSingle();
float xRot = messageReader.ReadSingle();
float yRot = messageReader.ReadSingle();
float zRot = messageReader.ReadSingle();
if (isPlayerObject)
{
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
}
else
{
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
}
}
else
{
uint ownerId = messageReader.ReadUInt32();
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
}
} }
else
{
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
}
}
else
{
uint ownerId = reader.ReadUInt();
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
} }
} }
internal static void HandleClientDisconnect(uint clientId, byte[] incommingData, int channelId) internal static void HandleClientDisconnect(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) uint disconnectedClientId = reader.ReadUInt();
{ netManager.OnClientDisconnect(disconnectedClientId);
uint disconnectedClientId = messageReader.ReadUInt32();
netManager.OnClientDisconnect(disconnectedClientId);
}
}
} }
internal static void HandleDestroyObject(uint clientId, byte[] incommingData, int channelId) internal static void HandleDestroyObject(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) uint netId = reader.ReadUInt();
{ SpawnManager.OnDestroyObject(netId, true);
uint netId = messageReader.ReadUInt32();
SpawnManager.OnDestroyObject(netId, true);
}
}
} }
internal static void HandleSwitchScene(uint clientId, byte[] incommingData, int channelId) internal static void HandleSwitchScene(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) NetworkSceneManager.OnSceneSwitch(reader.ReadUInt());
{
NetworkSceneManager.OnSceneSwitch(messageReader.ReadUInt32());
}
}
} }
internal static void HandleSpawnPoolObject(uint clientId, byte[] incommingData, int channelId) internal static void HandleSpawnPoolObject(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
{
uint netId = messageReader.ReadUInt32();
float xPos = messageReader.ReadSingle(); uint netId = reader.ReadUInt();
float yPos = messageReader.ReadSingle();
float zPos = messageReader.ReadSingle();
float xRot = messageReader.ReadSingle(); float xPos = reader.ReadFloat();
float yRot = messageReader.ReadSingle(); float yPos = reader.ReadFloat();
float zRot = messageReader.ReadSingle(); float zPos = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].transform.position = new Vector3(xPos, yPos, zPos); float xRot = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].transform.rotation = Quaternion.Euler(xRot, yRot, zRot); float yRot = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].gameObject.SetActive(true); float zRot = reader.ReadFloat();
}
} SpawnManager.spawnedObjects[netId].transform.position = new Vector3(xPos, yPos, zPos);
SpawnManager.spawnedObjects[netId].transform.rotation = Quaternion.Euler(xRot, yRot, zRot);
SpawnManager.spawnedObjects[netId].gameObject.SetActive(true);
} }
internal static void HandleDestroyPoolObject(uint clientId, byte[] incommingData, int channelId) internal static void HandleDestroyPoolObject(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) uint netId = reader.ReadUInt();
{ SpawnManager.spawnedObjects[netId].gameObject.SetActive(false);
uint netId = messageReader.ReadUInt32();
SpawnManager.spawnedObjects[netId].gameObject.SetActive(false);
}
}
} }
internal static void HandleChangeOwner(uint clientId, byte[] incommingData, int channelId) internal static void HandleChangeOwner(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
uint netId = reader.ReadUInt();
uint ownerClientId = reader.ReadUInt();
if (SpawnManager.spawnedObjects[netId].OwnerClientId == netManager.MyClientId)
{ {
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) //We are current owner.
{ SpawnManager.spawnedObjects[netId].InvokeBehaviourOnLostOwnership();
uint netId = messageReader.ReadUInt32();
uint ownerClientId = messageReader.ReadUInt32();
if (SpawnManager.spawnedObjects[netId].OwnerClientId == netManager.MyClientId)
{
//We are current owner.
SpawnManager.spawnedObjects[netId].InvokeBehaviourOnLostOwnership();
}
if (ownerClientId == netManager.MyClientId)
{
//We are new owner.
SpawnManager.spawnedObjects[netId].InvokeBehaviourOnGainedOwnership();
}
SpawnManager.spawnedObjects[netId].ownerClientId = ownerClientId;
}
} }
if (ownerClientId == netManager.MyClientId)
{
//We are new owner.
SpawnManager.spawnedObjects[netId].InvokeBehaviourOnGainedOwnership();
}
SpawnManager.spawnedObjects[netId].ownerClientId = ownerClientId;
} }
internal static void HandleSyncVarUpdate(uint clientId, byte[] incommingData, int channelId) internal static void HandleSyncVarUpdate(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
byte dirtyCount = reader.ReadByte();
uint netId = reader.ReadUInt();
ushort orderIndex = reader.ReadUShort();
if (dirtyCount > 0)
{ {
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) for (int i = 0; i < dirtyCount; i++)
{ {
byte dirtyCount = messageReader.ReadByte(); byte fieldIndex = reader.ReadByte();
uint netId = messageReader.ReadUInt32(); if (!SpawnManager.spawnedObjects.ContainsKey(netId))
ushort orderIndex = messageReader.ReadUInt16();
if (dirtyCount > 0)
{ {
for (int i = 0; i < dirtyCount; i++) Debug.LogWarning("MLAPI: Sync message recieved for a non existant object with id: " + netId);
{ return;
byte fieldIndex = messageReader.ReadByte(); }
if (!SpawnManager.spawnedObjects.ContainsKey(netId)) else if (SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex) == null)
{ {
Debug.LogWarning("MLAPI: Sync message recieved for a non existant object with id: " + netId); Debug.LogWarning("MLAPI: Sync message recieved for a non existant behaviour");
return; return;
}
else if (fieldIndex > (SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).syncedVarFields.Count - 1))
{
Debug.LogWarning("MLAPI: Sync message recieved for field out of bounds");
return;
}
FieldType type = SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).syncedVarFields[fieldIndex].FieldType;
switch (type)
{
case FieldType.Bool:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadBool(), fieldIndex);
break;
case FieldType.Byte:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadByte(), fieldIndex);
break;
case FieldType.Double:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadDouble(), fieldIndex);
break;
case FieldType.Single:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadFloat(), fieldIndex);
break;
case FieldType.Int:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadInt(), fieldIndex);
break;
case FieldType.Long:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadLong(), fieldIndex);
break;
case FieldType.SByte:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadSByte(), fieldIndex);
break;
case FieldType.Short:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadShort(), fieldIndex);
break;
case FieldType.UInt:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadUInt(), fieldIndex);
break;
case FieldType.ULong:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadULong(), fieldIndex);
break;
case FieldType.UShort:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadUShort(), fieldIndex);
break;
case FieldType.String:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(reader.ReadString(), fieldIndex);
break;
case FieldType.Vector3:
{ //Cases aren't their own scope. Therefor we create a scope for them as they share the X,Y,Z local variables otherwise.
float x = reader.ReadFloat();
float y = reader.ReadFloat();
float z = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector3(x, y, z), fieldIndex);
} }
else if (SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex) == null) break;
case FieldType.Vector2:
{ {
Debug.LogWarning("MLAPI: Sync message recieved for a non existant behaviour"); float x = reader.ReadFloat();
return; float y = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector2(x, y), fieldIndex);
} }
else if (fieldIndex > (SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).syncedVarFields.Count - 1)) break;
case FieldType.Quaternion:
{ {
Debug.LogWarning("MLAPI: Sync message recieved for field out of bounds"); float x = reader.ReadFloat();
return; float y = reader.ReadFloat();
float z = reader.ReadFloat();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(Quaternion.Euler(x, y, z), fieldIndex);
} }
FieldType type = SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).syncedVarFields[fieldIndex].FieldType; break;
switch (type)
{
case FieldType.Bool:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadBoolean(), fieldIndex);
break;
case FieldType.Byte:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadByte(), fieldIndex);
break;
case FieldType.Char:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadChar(), fieldIndex);
break;
case FieldType.Double:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadDouble(), fieldIndex);
break;
case FieldType.Single:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadSingle(), fieldIndex);
break;
case FieldType.Int:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadInt32(), fieldIndex);
break;
case FieldType.Long:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadInt64(), fieldIndex);
break;
case FieldType.SByte:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadSByte(), fieldIndex);
break;
case FieldType.Short:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadInt16(), fieldIndex);
break;
case FieldType.UInt:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadUInt32(), fieldIndex);
break;
case FieldType.ULong:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadUInt64(), fieldIndex);
break;
case FieldType.UShort:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadUInt16(), fieldIndex);
break;
case FieldType.String:
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadString(), fieldIndex);
break;
case FieldType.Vector3:
{ //Cases aren't their own scope. Therefor we create a scope for them as they share the X,Y,Z local variables otherwise.
float x = messageReader.ReadSingle();
float y = messageReader.ReadSingle();
float z = messageReader.ReadSingle();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector3(x, y, z), fieldIndex);
}
break;
case FieldType.Vector2:
{
float x = messageReader.ReadSingle();
float y = messageReader.ReadSingle();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector2(x, y), fieldIndex);
}
break;
case FieldType.Quaternion:
{
float x = messageReader.ReadSingle();
float y = messageReader.ReadSingle();
float z = messageReader.ReadSingle();
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(Quaternion.Euler(x, y, z), fieldIndex);
}
break;
}
}
} }
} }
} }
@ -383,41 +335,37 @@ namespace MLAPI.NetworkingManagerComponents.Core
internal static void HandleAddObjects(uint clientId, byte[] incommingData, int channelId) internal static void HandleAddObjects(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
if (netManager.NetworkConfig.HandleObjectSpawning)
{ {
using (BinaryReader messageReader = new BinaryReader(messageReadStream)) ushort objectCount = reader.ReadUShort();
for (int i = 0; i < objectCount; i++)
{ {
if (netManager.NetworkConfig.HandleObjectSpawning) bool isPlayerObject = reader.ReadBool();
uint networkId = reader.ReadUInt();
uint ownerId = reader.ReadUInt();
int prefabId = reader.ReadInt();
bool sceneObject = reader.ReadBool();
float xPos = reader.ReadFloat();
float yPos = reader.ReadFloat();
float zPos = reader.ReadFloat();
float xRot = reader.ReadFloat();
float yRot = reader.ReadFloat();
float zRot = reader.ReadFloat();
if (isPlayerObject)
{ {
ushort objectCount = messageReader.ReadUInt16(); netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
for (int i = 0; i < objectCount; i++) SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
{ }
bool isPlayerObject = messageReader.ReadBoolean(); else
uint networkId = messageReader.ReadUInt32(); {
uint ownerId = messageReader.ReadUInt32(); GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
int prefabId = messageReader.ReadInt32(); new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
bool sceneObject = messageReader.ReadBoolean(); go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
float xPos = messageReader.ReadSingle();
float yPos = messageReader.ReadSingle();
float zPos = messageReader.ReadSingle();
float xRot = messageReader.ReadSingle();
float yRot = messageReader.ReadSingle();
float zRot = messageReader.ReadSingle();
if (isPlayerObject)
{
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
}
else
{
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
}
}
} }
} }
} }
@ -425,21 +373,17 @@ namespace MLAPI.NetworkingManagerComponents.Core
internal static void HandleTimeSync(uint clientId, byte[] incommingData, int channelId) internal static void HandleTimeSync(uint clientId, byte[] incommingData, int channelId)
{ {
using (MemoryStream messageReadStream = new MemoryStream(incommingData)) BitReader reader = new BitReader(incommingData);
{
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
{
float netTime = messageReader.ReadSingle();
int timestamp = messageReader.ReadInt32();
NetId netId = new NetId(clientId); float netTime = reader.ReadFloat();
byte error; int timestamp = reader.ReadInt();
int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, timestamp, out error);
if ((NetworkError)error != NetworkError.Ok) NetId netId = new NetId(clientId);
msDelay = 0; byte error;
netManager.networkTime = netTime + (msDelay / 1000f); int msDelay = NetworkTransport.GetRemoteDelayTimeMS(netId.HostId, netId.ConnectionId, timestamp, out error);
} if ((NetworkError)error != NetworkError.Ok)
} msDelay = 0;
} netManager.networkTime = netTime + (msDelay / 1000f);
}
} }
} }

View File

@ -1,5 +1,6 @@
using MLAPI.Data; using MLAPI.Data;
using MLAPI.MonoBehaviours.Core; using MLAPI.MonoBehaviours.Core;
using MLAPI.NetworkingManagerComponents.Binary;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using UnityEngine; using UnityEngine;
@ -66,19 +67,19 @@ namespace MLAPI.NetworkingManagerComponents.Core
return null; return null;
} }
GameObject go = Pools[PoolNamesToIndexes[poolName]].SpawnObject(position, rotation); GameObject go = Pools[PoolNamesToIndexes[poolName]].SpawnObject(position, rotation);
using (MemoryStream stream = new MemoryStream(28)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(go.GetComponent<NetworkedObject>().NetworkId);
{
writer.Write(go.GetComponent<NetworkedObject>().NetworkId); writer.WriteFloat(position.x);
writer.Write(position.x); writer.WriteFloat(position.y);
writer.Write(position.y); writer.WriteFloat(position.z);
writer.Write(position.z);
writer.Write(rotation.eulerAngles.x); writer.WriteFloat(rotation.eulerAngles.x);
writer.Write(rotation.eulerAngles.y); writer.WriteFloat(rotation.eulerAngles.y);
writer.Write(rotation.eulerAngles.z); writer.WriteFloat(rotation.eulerAngles.z);
}
InternalMessageHandler.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer()); InternalMessageHandler.Send("MLAPI_SPAWN_POOL_OBJECT", "MLAPI_INTERNAL", writer.Finalize());
} }
return go; return go;
} }
@ -95,13 +96,11 @@ namespace MLAPI.NetworkingManagerComponents.Core
return; return;
} }
netObject.gameObject.SetActive(false); netObject.gameObject.SetActive(false);
using (MemoryStream stream = new MemoryStream(4)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(netObject.NetworkId);
{
writer.Write(netObject.NetworkId); InternalMessageHandler.Send("MLAPI_DESTROY_POOL_OBJECT", "MLAPI_INTERNAL", writer.Finalize());
}
InternalMessageHandler.Send("MLAPI_DESTROY_POOL_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
} }
} }
} }

View File

@ -1,6 +1,6 @@
using MLAPI.MonoBehaviours.Core; using MLAPI.MonoBehaviours.Core;
using MLAPI.NetworkingManagerComponents.Binary;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO;
using System.Linq; using System.Linq;
using UnityEngine; using UnityEngine;
using UnityEngine.SceneManagement; using UnityEngine.SceneManagement;
@ -58,13 +58,11 @@ namespace MLAPI.NetworkingManagerComponents.Core
AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); AsyncOperation sceneLoad = SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);
sceneLoad.completed += OnSceneLoaded; sceneLoad.completed += OnSceneLoaded;
using(MemoryStream stream = new MemoryStream(4)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(sceneNameToIndex[sceneName]);
{
writer.Write(sceneNameToIndex[sceneName]); InternalMessageHandler.Send("MLAPI_SWITCH_SCENE", "MLAPI_INTERNAL", writer.Finalize());
}
InternalMessageHandler.Send("MLAPI_SWITCH_SCENE", "MLAPI_INTERNAL", stream.GetBuffer());
} }
} }

View File

@ -1,5 +1,6 @@
using MLAPI.Data; using MLAPI.Data;
using MLAPI.MonoBehaviours.Core; using MLAPI.MonoBehaviours.Core;
using MLAPI.NetworkingManagerComponents.Binary;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
@ -38,14 +39,13 @@ namespace MLAPI.NetworkingManagerComponents.Core
NetworkedObject netObject = SpawnManager.spawnedObjects[netId]; NetworkedObject netObject = SpawnManager.spawnedObjects[netId];
NetworkingManager.singleton.connectedClients[netObject.OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == netId); NetworkingManager.singleton.connectedClients[netObject.OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == netId);
netObject.ownerClientId = new NetId(0, 0, false, true).GetClientId(); netObject.ownerClientId = new NetId(0, 0, false, true).GetClientId();
using (MemoryStream stream = new MemoryStream(8))
using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(netId);
{ writer.WriteUInt(netObject.ownerClientId);
writer.Write(netId);
writer.Write(netObject.ownerClientId); InternalMessageHandler.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", writer.Finalize());
}
InternalMessageHandler.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", stream.GetBuffer());
} }
} }
@ -55,14 +55,13 @@ namespace MLAPI.NetworkingManagerComponents.Core
NetworkingManager.singleton.connectedClients[netObject.OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == netId); NetworkingManager.singleton.connectedClients[netObject.OwnerClientId].OwnedObjects.RemoveAll(x => x.NetworkId == netId);
NetworkingManager.singleton.connectedClients[clientId].OwnedObjects.Add(netObject); NetworkingManager.singleton.connectedClients[clientId].OwnedObjects.Add(netObject);
netObject.ownerClientId = clientId; netObject.ownerClientId = clientId;
using (MemoryStream stream = new MemoryStream(8))
using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(netId);
{ writer.WriteUInt(clientId);
writer.Write(netId);
writer.Write(clientId); InternalMessageHandler.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", writer.Finalize());
}
InternalMessageHandler.Send("MLAPI_CHANGE_OWNER", "MLAPI_INTERNAL", stream.GetBuffer());
} }
} }
@ -109,29 +108,28 @@ namespace MLAPI.NetworkingManagerComponents.Core
if (pair.Value.sceneObject == null || pair.Value.sceneObject == true) if (pair.Value.sceneObject == null || pair.Value.sceneObject == true)
sceneObjectsToSync.Add(pair.Value); sceneObjectsToSync.Add(pair.Value);
} }
int sizeOfStream = 2 + (38 * sceneObjectsToSync.Count); //The two is the base size, it's a ushort containing the amount of objects. Each object takes 38 bytes
using (MemoryStream stream = new MemoryStream(sizeOfStream)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUShort((ushort)sceneObjectsToSync.Count);
for (int i = 0; i < sceneObjectsToSync.Count; i++)
{ {
writer.Write((ushort)sceneObjectsToSync.Count); writer.WriteBool(false); //isLocalPlayer
for (int i = 0; i < sceneObjectsToSync.Count; i++) writer.WriteUInt(sceneObjectsToSync[i].NetworkId);
{ writer.WriteUInt(sceneObjectsToSync[i].OwnerClientId);
writer.Write(false); //isLocalPlayer writer.WriteInt(NetworkingManager.singleton.NetworkConfig.NetworkPrefabIds[sceneObjectsToSync[i].NetworkedPrefabName]);
writer.Write(sceneObjectsToSync[i].NetworkId); writer.WriteBool(sceneObjectsToSync[i].sceneObject == null ? true : sceneObjectsToSync[i].sceneObject.Value);
writer.Write(sceneObjectsToSync[i].OwnerClientId);
writer.Write(NetworkingManager.singleton.NetworkConfig.NetworkPrefabIds[sceneObjectsToSync[i].NetworkedPrefabName]);
writer.Write(sceneObjectsToSync[i].transform.position.x); writer.WriteFloat(sceneObjectsToSync[i].transform.position.x);
writer.Write(sceneObjectsToSync[i].transform.position.y); writer.WriteFloat(sceneObjectsToSync[i].transform.position.y);
writer.Write(sceneObjectsToSync[i].transform.position.z); writer.WriteFloat(sceneObjectsToSync[i].transform.position.z);
writer.Write(sceneObjectsToSync[i].transform.rotation.eulerAngles.x); writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.x);
writer.Write(sceneObjectsToSync[i].transform.rotation.eulerAngles.y); writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.y);
writer.Write(sceneObjectsToSync[i].transform.rotation.eulerAngles.z); writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.z);
}
} }
InternalMessageHandler.Send("MLAPI_ADD_OBJECTS", "MLAPI_INTERNAL", stream.GetBuffer());
InternalMessageHandler.Send("MLAPI_ADD_OBJECTS", "MLAPI_INTERNAL", writer.Finalize());
} }
} }
@ -195,25 +193,24 @@ namespace MLAPI.NetworkingManagerComponents.Core
netObject.ownerClientId = clientOwnerId.Value; netObject.ownerClientId = clientOwnerId.Value;
NetworkingManager.singleton.connectedClients[clientOwnerId.Value].OwnedObjects.Add(netObject); NetworkingManager.singleton.connectedClients[clientOwnerId.Value].OwnedObjects.Add(netObject);
} }
using (MemoryStream stream = new MemoryStream(37)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteBool(false);
{ writer.WriteUInt(netObject.NetworkId);
writer.Write(false); writer.WriteUInt(netObject.OwnerClientId);
writer.Write(netObject.NetworkId); writer.WriteInt(netManager.NetworkConfig.NetworkPrefabIds[netObject.NetworkedPrefabName]);
writer.Write(netObject.OwnerClientId); writer.WriteBool(netObject.sceneObject == null ? true : netObject.sceneObject.Value);
writer.Write(netManager.NetworkConfig.NetworkPrefabIds[netObject.NetworkedPrefabName]);
writer.Write(netObject.transform.position.x); writer.WriteFloat(netObject.transform.position.x);
writer.Write(netObject.transform.position.y); writer.WriteFloat(netObject.transform.position.y);
writer.Write(netObject.transform.position.z); writer.WriteFloat(netObject.transform.position.z);
writer.Write(netObject.transform.rotation.eulerAngles.x); writer.WriteFloat(netObject.transform.rotation.eulerAngles.x);
writer.Write(netObject.transform.rotation.eulerAngles.y); writer.WriteFloat(netObject.transform.rotation.eulerAngles.y);
writer.Write(netObject.transform.rotation.eulerAngles.z); writer.WriteFloat(netObject.transform.rotation.eulerAngles.z);
}
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", writer.Finalize());
} }
} }
@ -263,13 +260,11 @@ namespace MLAPI.NetworkingManagerComponents.Core
releasedNetworkObjectIds.Push(networkId); releasedNetworkObjectIds.Push(networkId);
if (spawnedObjects[networkId] != null) if (spawnedObjects[networkId] != null)
{ {
using (MemoryStream stream = new MemoryStream(4)) using (BitWriter writer = new BitWriter())
{ {
using (BinaryWriter writer = new BinaryWriter(stream)) writer.WriteUInt(networkId);
{
writer.Write(networkId); InternalMessageHandler.Send("MLAPI_DESTROY_OBJECT", "MLAPI_INTERNAL", writer.Finalize());
}
InternalMessageHandler.Send("MLAPI_DESTROY_OBJECT", "MLAPI_INTERNAL", stream.GetBuffer());
} }
} }
} }