Added Reflection based SyncVar system
This commit is contained in:
parent
352c827b5d
commit
dc6afc1331
19
MLAPI/Attributes/FieldType.cs
Normal file
19
MLAPI/Attributes/FieldType.cs
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
namespace MLAPI.Attributes
|
||||||
|
{
|
||||||
|
internal enum FieldType
|
||||||
|
{
|
||||||
|
Bool,
|
||||||
|
Byte,
|
||||||
|
Char,
|
||||||
|
Double,
|
||||||
|
Single,
|
||||||
|
Int,
|
||||||
|
Long,
|
||||||
|
SByte,
|
||||||
|
Short,
|
||||||
|
UInt,
|
||||||
|
ULong,
|
||||||
|
UShort,
|
||||||
|
String
|
||||||
|
}
|
||||||
|
}
|
10
MLAPI/Attributes/SyncedVar.cs
Normal file
10
MLAPI/Attributes/SyncedVar.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
namespace MLAPI.Attributes
|
||||||
|
{
|
||||||
|
[AttributeUsage(AttributeTargets.Field)]
|
||||||
|
public class SyncedVar : Attribute
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -41,7 +41,7 @@
|
|||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
<ErrorReport>prompt</ErrorReport>
|
<ErrorReport>prompt</ErrorReport>
|
||||||
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
<CodeAnalysisRuleSet>MinimumRecommendedRules.ruleset</CodeAnalysisRuleSet>
|
||||||
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
|
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Reference Include="System" />
|
<Reference Include="System" />
|
||||||
@ -56,6 +56,8 @@
|
|||||||
</Reference>
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Compile Include="Attributes\FieldType.cs" />
|
||||||
|
<Compile Include="Attributes\SyncedVar.cs" />
|
||||||
<Compile Include="Data\NetworkPool.cs" />
|
<Compile Include="Data\NetworkPool.cs" />
|
||||||
<Compile Include="Data\TrackedPointData.cs" />
|
<Compile Include="Data\TrackedPointData.cs" />
|
||||||
<Compile Include="MonoBehaviours\Prototyping\NetworkedAnimator.cs" />
|
<Compile Include="MonoBehaviours\Prototyping\NetworkedAnimator.cs" />
|
||||||
@ -71,6 +73,7 @@
|
|||||||
<Compile Include="NetworkingManagerComponents\NetworkPoolManager.cs" />
|
<Compile Include="NetworkingManagerComponents\NetworkPoolManager.cs" />
|
||||||
<Compile Include="NetworkingManagerComponents\NetworkSceneManager.cs" />
|
<Compile Include="NetworkingManagerComponents\NetworkSceneManager.cs" />
|
||||||
<Compile Include="NetworkingManagerComponents\SpawnManager.cs" />
|
<Compile Include="NetworkingManagerComponents\SpawnManager.cs" />
|
||||||
|
<Compile Include="NetworkingManagerComponents\SyncedVarManager.cs" />
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
@ -2,11 +2,16 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using MLAPI.NetworkingManagerComponents;
|
using MLAPI.NetworkingManagerComponents;
|
||||||
|
using System.Reflection;
|
||||||
|
using MLAPI.Attributes;
|
||||||
|
using System.Linq;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
namespace MLAPI
|
namespace MLAPI
|
||||||
{
|
{
|
||||||
public abstract class NetworkedBehaviour : MonoBehaviour
|
public abstract class NetworkedBehaviour : MonoBehaviour
|
||||||
{
|
{
|
||||||
|
public float SyncVarSyncDelay = 0.1f;
|
||||||
public bool isLocalPlayer
|
public bool isLocalPlayer
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
@ -79,6 +84,7 @@ namespace MLAPI
|
|||||||
{
|
{
|
||||||
_networkedObject = GetComponentInParent<NetworkedObject>();
|
_networkedObject = GetComponentInParent<NetworkedObject>();
|
||||||
}
|
}
|
||||||
|
NetworkedObject.networkedBehaviours.Add(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal bool networkedStartInvoked = false;
|
internal bool networkedStartInvoked = false;
|
||||||
@ -109,6 +115,11 @@ namespace MLAPI
|
|||||||
MessageManager.RemoveIncomingMessageHandler(name, counter, networkId);
|
MessageManager.RemoveIncomingMessageHandler(name, counter, networkId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void OnDisable()
|
||||||
|
{
|
||||||
|
NetworkedObject.networkedBehaviours.Remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
private void OnDestroy()
|
private void OnDestroy()
|
||||||
{
|
{
|
||||||
foreach (KeyValuePair<string, int> pair in registeredMessageHandlers)
|
foreach (KeyValuePair<string, int> pair in registeredMessageHandlers)
|
||||||
@ -117,6 +128,291 @@ namespace MLAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#region SYNC_VAR
|
||||||
|
private List<FieldInfo> syncedFields = new List<FieldInfo>();
|
||||||
|
internal List<FieldType> syncedFieldTypes = new List<FieldType>();
|
||||||
|
private List<object> syncedFieldValues = new List<object>();
|
||||||
|
//A dirty field is a field that's not synced.
|
||||||
|
public bool[] dirtyFields;
|
||||||
|
protected static ushort networkedBehaviourId;
|
||||||
|
//This is just for the unity editor. if you turn the editor to DEBUG mode you can see what the networkedBehaviourId is.
|
||||||
|
private ushort _networkedBehaviourId = networkedBehaviourId;
|
||||||
|
internal void SyncVarInit()
|
||||||
|
{
|
||||||
|
FieldInfo[] sortedFields = GetType().GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.Instance).OrderBy(x => x.Name).ToArray();
|
||||||
|
for (byte i = 0; i < sortedFields.Length; i++)
|
||||||
|
{
|
||||||
|
if(sortedFields[i].IsDefined(typeof(SyncedVar), true))
|
||||||
|
{
|
||||||
|
if (sortedFields[i].FieldType == typeof(bool))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Bool);
|
||||||
|
}
|
||||||
|
else if(sortedFields[i].FieldType == typeof(byte))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Byte);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(char))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Char);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(double))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Double);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(float))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Single);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(int))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Int);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(long))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Long);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(sbyte))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.SByte);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(short))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.Short);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(uint))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.UInt);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(ulong))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.ULong);
|
||||||
|
}
|
||||||
|
else if (sortedFields[i].FieldType == typeof(ushort))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.UShort);
|
||||||
|
}
|
||||||
|
else if(sortedFields[i].FieldType == typeof(string))
|
||||||
|
{
|
||||||
|
syncedFields.Add(sortedFields[i]);
|
||||||
|
syncedFieldValues.Add(sortedFields[i].GetValue(this));
|
||||||
|
syncedFieldTypes.Add(FieldType.String);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Debug.LogError("MLAPI: The type " + sortedFields[i].FieldType.ToString() + " can not be used as a syncvar");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(dirtyFields.Length > 255)
|
||||||
|
{
|
||||||
|
Debug.LogError("MLAPI: You can not have more than 255 SyncVar's per NetworkedBehaviour!");
|
||||||
|
}
|
||||||
|
dirtyFields = new bool[syncedFields.Count];
|
||||||
|
}
|
||||||
|
|
||||||
|
internal void OnSyncVarUpdate(object value, byte fieldIndex)
|
||||||
|
{
|
||||||
|
if (isServer)
|
||||||
|
return;
|
||||||
|
syncedFields[fieldIndex].SetValue(this, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
private float lastSyncTime = 0f;
|
||||||
|
internal void SyncvarUpdate()
|
||||||
|
{
|
||||||
|
if (!isServer)
|
||||||
|
return;
|
||||||
|
SetDirtyness();
|
||||||
|
if(Time.time - lastSyncTime >= SyncVarSyncDelay)
|
||||||
|
{
|
||||||
|
byte dirtyCount = (byte)dirtyFields.Count(x => x == true);
|
||||||
|
if (dirtyCount == 0)
|
||||||
|
return; //All up to date!
|
||||||
|
//It's sync time!
|
||||||
|
using (MemoryStream stream = new MemoryStream())
|
||||||
|
{
|
||||||
|
using(BinaryWriter writer = new BinaryWriter(stream))
|
||||||
|
{
|
||||||
|
//Write all indexes
|
||||||
|
writer.Write(dirtyCount);
|
||||||
|
for (byte i = 0; i < dirtyFields.Length; i++)
|
||||||
|
{
|
||||||
|
//Writes all the indexes of the dirty syncvars.
|
||||||
|
if (dirtyFields[i] == true)
|
||||||
|
{
|
||||||
|
writer.Write(networkId);
|
||||||
|
writer.Write(networkedObject.GetOrderIndex(this));
|
||||||
|
writer.Write(networkedBehaviourId);
|
||||||
|
writer.Write(i); //Index
|
||||||
|
switch (syncedFieldTypes[i])
|
||||||
|
{
|
||||||
|
case FieldType.Bool:
|
||||||
|
writer.Write((bool)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Byte:
|
||||||
|
writer.Write((byte)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Char:
|
||||||
|
writer.Write((char)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Double:
|
||||||
|
writer.Write((double)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Single:
|
||||||
|
writer.Write((float)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Int:
|
||||||
|
writer.Write((int)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Long:
|
||||||
|
writer.Write((long)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.SByte:
|
||||||
|
writer.Write((sbyte)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.Short:
|
||||||
|
writer.Write((short)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.UInt:
|
||||||
|
writer.Write((uint)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.ULong:
|
||||||
|
writer.Write((ulong)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.UShort:
|
||||||
|
writer.Write((ushort)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
case FieldType.String:
|
||||||
|
writer.Write((string)syncedFields[i].GetValue(this));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
syncedFieldValues[i] = syncedFields[i].GetValue(this);
|
||||||
|
dirtyFields[i] = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
NetworkingManager.singleton.Send("MLAPI_SYNC_VAR_UPDATE", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.ToArray(), ownerClientId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
lastSyncTime = Time.time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SetDirtyness()
|
||||||
|
{
|
||||||
|
if (!isServer)
|
||||||
|
return;
|
||||||
|
for (int i = 0; i < syncedFields.Count; i++)
|
||||||
|
{
|
||||||
|
switch (syncedFieldTypes[i])
|
||||||
|
{
|
||||||
|
case FieldType.Bool:
|
||||||
|
if ((bool)syncedFields[i].GetValue(this) != (bool)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Byte:
|
||||||
|
if ((byte)syncedFields[i].GetValue(this) != (byte)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Char:
|
||||||
|
if ((char)syncedFields[i].GetValue(this) != (char)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Double:
|
||||||
|
if ((double)syncedFields[i].GetValue(this) != (double)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Single:
|
||||||
|
if ((float)syncedFields[i].GetValue(this) != (float)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Int:
|
||||||
|
if ((int)syncedFields[i].GetValue(this) != (int)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Long:
|
||||||
|
if ((long)syncedFields[i].GetValue(this) != (long)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.SByte:
|
||||||
|
if ((sbyte)syncedFields[i].GetValue(this) != (sbyte)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.Short:
|
||||||
|
if ((short)syncedFields[i].GetValue(this) != (short)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.UInt:
|
||||||
|
if ((uint)syncedFields[i].GetValue(this) != (uint)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.ULong:
|
||||||
|
if ((ulong)syncedFields[i].GetValue(this) != (ulong)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.UShort:
|
||||||
|
if ((ushort)syncedFields[i].GetValue(this) != (ushort)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
case FieldType.String:
|
||||||
|
if ((string)syncedFields[i].GetValue(this) != (string)syncedFieldValues[i])
|
||||||
|
dirtyFields[i] = true; //This fields value is out of sync!
|
||||||
|
else
|
||||||
|
dirtyFields[i] = false; //Up to date
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endregion
|
||||||
|
|
||||||
protected void SendToServer(string messageType, string channelName, byte[] data)
|
protected void SendToServer(string messageType, string channelName, byte[] data)
|
||||||
{
|
{
|
||||||
if(MessageManager.messageTypes[messageType] < 32)
|
if(MessageManager.messageTypes[messageType] < 32)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using MLAPI.NetworkingManagerComponents;
|
using MLAPI.NetworkingManagerComponents;
|
||||||
|
using System.Collections.Generic;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
namespace MLAPI
|
namespace MLAPI
|
||||||
@ -96,8 +97,35 @@ namespace MLAPI
|
|||||||
if(netBehaviours[i].networkedObject == this && !netBehaviours[i].networkedStartInvoked)
|
if(netBehaviours[i].networkedObject == this && !netBehaviours[i].networkedStartInvoked)
|
||||||
{
|
{
|
||||||
netBehaviours[i].NetworkStart();
|
netBehaviours[i].NetworkStart();
|
||||||
|
netBehaviours[i].SyncVarInit();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal static List<NetworkedBehaviour> networkedBehaviours = new List<NetworkedBehaviour>();
|
||||||
|
internal static void InvokeSyncvarUpdate()
|
||||||
|
{
|
||||||
|
for (int i = 0; i < networkedBehaviours.Count; i++)
|
||||||
|
{
|
||||||
|
networkedBehaviours[i].SyncvarUpdate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal ushort GetOrderIndex(NetworkedBehaviour instance)
|
||||||
|
{
|
||||||
|
NetworkedBehaviour[] behaviours = GetComponentsInChildren<NetworkedBehaviour>();
|
||||||
|
for (ushort i = 0; i < behaviours.Length; i++)
|
||||||
|
{
|
||||||
|
if (behaviours[i].networkedObject == this && behaviours[i] == instance)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal NetworkedBehaviour GetBehaviourAtOrderIndex(ushort index)
|
||||||
|
{
|
||||||
|
NetworkedBehaviour[] behaviours = GetComponentsInChildren<NetworkedBehaviour>();
|
||||||
|
return behaviours[index];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using MLAPI.NetworkingManagerComponents;
|
using MLAPI.Attributes;
|
||||||
|
using MLAPI.NetworkingManagerComponents;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@ -73,6 +74,7 @@ namespace MLAPI
|
|||||||
{
|
{
|
||||||
NetworkConfig = netConfig;
|
NetworkConfig = netConfig;
|
||||||
|
|
||||||
|
SyncedVarManager.Init();
|
||||||
pendingClients = new HashSet<int>();
|
pendingClients = new HashSet<int>();
|
||||||
connectedClients = new Dictionary<int, NetworkedClient>();
|
connectedClients = new Dictionary<int, NetworkedClient>();
|
||||||
messageBuffer = new byte[NetworkConfig.MessageBufferSize];
|
messageBuffer = new byte[NetworkConfig.MessageBufferSize];
|
||||||
@ -117,6 +119,7 @@ namespace MLAPI
|
|||||||
MessageManager.messageTypes.Add("MLAPI_SPAWN_POOL_OBJECT", 6);
|
MessageManager.messageTypes.Add("MLAPI_SPAWN_POOL_OBJECT", 6);
|
||||||
MessageManager.messageTypes.Add("MLAPI_DESTROY_POOL_OBJECT", 7);
|
MessageManager.messageTypes.Add("MLAPI_DESTROY_POOL_OBJECT", 7);
|
||||||
MessageManager.messageTypes.Add("MLAPI_CHANGE_OWNER", 8);
|
MessageManager.messageTypes.Add("MLAPI_CHANGE_OWNER", 8);
|
||||||
|
MessageManager.messageTypes.Add("MLAPI_SYNC_VAR_UPDATE", 9);
|
||||||
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromClient");
|
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromClient");
|
||||||
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromServer");
|
NetworkConfig.MessageTypes.Add("MLAPI_OnRecieveTransformFromServer");
|
||||||
NetworkConfig.MessageTypes.Add("MLAPI_HandleAnimationMessage");
|
NetworkConfig.MessageTypes.Add("MLAPI_HandleAnimationMessage");
|
||||||
@ -361,6 +364,8 @@ namespace MLAPI
|
|||||||
}
|
}
|
||||||
if (isServer)
|
if (isServer)
|
||||||
LagCompensationManager.AddFrames();
|
LagCompensationManager.AddFrames();
|
||||||
|
|
||||||
|
NetworkedObject.InvokeSyncvarUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerator ApprovalTimeout(int clientId)
|
private IEnumerator ApprovalTimeout(int clientId)
|
||||||
@ -677,6 +682,71 @@ namespace MLAPI
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 9:
|
||||||
|
if (isClient)
|
||||||
|
{
|
||||||
|
using (MemoryStream messageReadStream = new MemoryStream(incommingData))
|
||||||
|
{
|
||||||
|
using (BinaryReader messageReader = new BinaryReader(messageReadStream))
|
||||||
|
{
|
||||||
|
byte dirtyCount = messageReader.ReadByte();
|
||||||
|
if(dirtyCount > 0)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < dirtyCount; i++)
|
||||||
|
{
|
||||||
|
uint netId = messageReader.ReadUInt32(); //NetId the syncvar is from
|
||||||
|
ushort orderIndex = messageReader.ReadUInt16();
|
||||||
|
ushort networkBehaviourId = messageReader.ReadUInt16();
|
||||||
|
byte fieldIndex = messageReader.ReadByte();
|
||||||
|
FieldType type = SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).syncedFieldTypes[fieldIndex];
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
35
MLAPI/NetworkingManagerComponents/SyncedVarManager.cs
Normal file
35
MLAPI/NetworkingManagerComponents/SyncedVarManager.cs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
using MLAPI.Attributes;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using UnityEngine;
|
||||||
|
|
||||||
|
namespace MLAPI.NetworkingManagerComponents
|
||||||
|
{
|
||||||
|
internal static class SyncedVarManager
|
||||||
|
{
|
||||||
|
internal static void Init()
|
||||||
|
{
|
||||||
|
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
|
||||||
|
Assembly assembly = Assembly.GetExecutingAssembly();
|
||||||
|
for (int i = 0; i < assemblies.Length; i++)
|
||||||
|
{
|
||||||
|
if (assemblies[i].FullName == "Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null")
|
||||||
|
{
|
||||||
|
assembly = assemblies[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
IEnumerable<Type> types = from t in assembly.GetTypes()
|
||||||
|
where t.IsClass && t.IsSubclassOf(typeof(NetworkedBehaviour))
|
||||||
|
select t;
|
||||||
|
List<Type> behaviourTypes = types.OrderBy(x => x.FullName).ToList();
|
||||||
|
for (ushort i = 0; i < behaviourTypes.Count; i++)
|
||||||
|
{
|
||||||
|
FieldInfo networkedBehaviourId = behaviourTypes[i].GetField("networkedBehaviourId", BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.FlattenHierarchy);
|
||||||
|
networkedBehaviourId.SetValue(null, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user