Replaced ALL usage of BinaryWriter / BinaryReader with BitReader & BitWriter
This commit is contained in:
parent
39c262e9e0
commit
2acb20e8ea
@ -7,7 +7,6 @@
|
|||||||
{
|
{
|
||||||
Bool,
|
Bool,
|
||||||
Byte,
|
Byte,
|
||||||
Char,
|
|
||||||
Double,
|
Double,
|
||||||
Single,
|
Single,
|
||||||
Int,
|
Int,
|
||||||
|
@ -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!
|
||||||
|
@ -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)
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user