Skip to content

Commit 61f06db

Browse files
committed
Added baseline for NetworkedVar Settings
1 parent 2586613 commit 61f06db

File tree

4 files changed

+104
-26
lines changed

4 files changed

+104
-26
lines changed

MLAPI/Data/NetworkedVar.cs

Lines changed: 74 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
using MLAPI.Data;
2-
using MLAPI.NetworkingManagerComponents.Binary;
3-
using MLAPI.NetworkingManagerComponents.Core;
4-
using System;
5-
using System.Collections.Generic;
6-
using UnityEngine;
1+
using MLAPI.NetworkingManagerComponents.Binary;
72
using MLAPI.MonoBehaviours.Core;
83

94
namespace MLAPI.Data
@@ -13,6 +8,10 @@ namespace MLAPI.Data
138
/// </summary>
149
public class NetworkedVar<T> : INetworkedVar
1510
{
11+
public bool IsDirty { get; set; }
12+
public readonly NetworkedVarSettings<T> Settings = new NetworkedVarSettings<T>();
13+
public float LastSyncedTime { get; internal set; }
14+
1615
public delegate void OnValueChangedByRemoteDelegate(T newValue);
1716
public OnValueChangedByRemoteDelegate OnValueChangedByRemote;
1817
private NetworkedBehaviour networkedBehaviour;
@@ -30,41 +29,93 @@ public T Value
3029
}
3130
set
3231
{
33-
if (!EqualityComparer<T>.Default.Equals(InternalValue, value)) // Note: value types of T should implement IEquatable to avoid boxing by default comparer
32+
if (Settings.SendOnChange)
3433
{
35-
using (BitWriter writer = BitWriter.Get())
36-
{
37-
FieldTypeHelper.WriteFieldType(writer, value, InternalValue);
38-
InternalValue = value;
39-
networkedBehaviour.SendNetworkedVar(this, writer);
40-
MonoBehaviour.print("sending networked var to remote");
41-
}
34+
IsDirty = false;
35+
LastSyncedTime = NetworkingManager.singleton.NetworkTime;
36+
InternalValue = value;
37+
//TODO: Send
4238
}
39+
else
40+
{
41+
InternalValue = value;
42+
IsDirty = true;
43+
}
44+
}
45+
}
46+
47+
bool INetworkedVar.NeedsDirtySync()
48+
{
49+
if (!IsDirty && !Settings.SendOnChange && NetworkingManager.singleton.NetworkTime - LastSyncedTime >= Settings.SendDelay)
50+
{
51+
IsDirty = true;
4352
}
53+
return IsDirty;
54+
}
55+
56+
bool INetworkedVar.CanClientRead(uint clientId)
57+
{
58+
switch (Settings.ReadPermission)
59+
{
60+
case NetworkedVarPermission.Everyone:
61+
return true;
62+
case NetworkedVarPermission.ServerOnly:
63+
return false;
64+
case NetworkedVarPermission.OwnerOnly:
65+
return networkedBehaviour.OwnerClientId == clientId;
66+
case NetworkedVarPermission.Custom:
67+
{
68+
if (Settings.ReadPermissionCallback == null) return false;
69+
return Settings.ReadPermissionCallback(clientId);
70+
}
71+
}
72+
return true;
73+
}
74+
75+
bool INetworkedVar.CanClientWrite(uint clientId)
76+
{
77+
switch (Settings.WritePermission)
78+
{
79+
case NetworkedVarPermission.Everyone:
80+
return true;
81+
case NetworkedVarPermission.ServerOnly:
82+
return false;
83+
case NetworkedVarPermission.OwnerOnly:
84+
return networkedBehaviour.OwnerClientId == clientId;
85+
case NetworkedVarPermission.Custom:
86+
{
87+
if (Settings.WritePermissionCallback == null) return false;
88+
return Settings.WritePermissionCallback(clientId);
89+
}
90+
}
91+
92+
return true;
4493
}
4594

4695
void INetworkedVar.SetNetworkedBehaviour(NetworkedBehaviour behaviour)
4796
{
4897
networkedBehaviour = behaviour;
4998
}
5099

51-
void INetworkedVar.HandleValueChangedByRemote(BitReader reader)
100+
void INetworkedVar.SetFieldFromReader(BitReader reader)
52101
{
53102
// TODO TwoTen - Boxing sucks
54103
T newValue = (T)FieldTypeHelper.ReadFieldType(reader, typeof(T), (object)InternalValue);
55-
if (!EqualityComparer<T>.Default.Equals(InternalValue, newValue)) // Note: value types of T should implement IEquatable to avoid boxing by default comparer
56-
// Could allow a non default comparer to be specified by the user for this case?
57-
{
58-
InternalValue = newValue;
59-
OnValueChangedByRemote(Value);
60-
}
61-
MonoBehaviour.print("value received from remote");
104+
}
105+
106+
void INetworkedVar.WriteFieldToWriter(BitWriter writer)
107+
{
108+
//TODO: Write field
62109
}
63110
}
64111

65112
internal interface INetworkedVar
66113
{
67-
void HandleValueChangedByRemote(BitReader reader);
114+
bool NeedsDirtySync();
115+
bool CanClientWrite(uint clientId);
116+
bool CanClientRead(uint clientId);
117+
void WriteFieldToWriter(BitWriter writer);
118+
void SetFieldFromReader(BitReader reader);
68119
void SetNetworkedBehaviour(NetworkedBehaviour behaviour);
69120
}
70121
}

MLAPI/Data/NetworkedVarMeta.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
namespace MLAPI.Data
2+
{
3+
public class NetworkedVarSettings<T>
4+
{
5+
public NetworkedVarPermission WritePermission = NetworkedVarPermission.ServerOnly;
6+
public NetworkedVarPermission ReadPermission = NetworkedVarPermission.Everyone;
7+
public NetworkedVarPermissionsDelegate WritePermissionCallback = null;
8+
public NetworkedVarPermissionsDelegate ReadPermissionCallback = null;
9+
public bool SendOnChange = false;
10+
public float SendDelay = 0.1f;
11+
12+
internal NetworkedVarSettings()
13+
{
14+
15+
}
16+
}
17+
18+
public delegate bool NetworkedVarPermissionsDelegate(uint clientId);
19+
20+
public enum NetworkedVarPermission
21+
{
22+
Everyone,
23+
ServerOnly,
24+
OwnerOnly,
25+
Custom
26+
}
27+
}

MLAPI/MLAPI.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@
9191
<Compile Include="Data\Channel.cs" />
9292
<Compile Include="Data\AttributeMessageMode.cs" />
9393
<Compile Include="Data\NetworkedVar.cs" />
94+
<Compile Include="Data\NetworkedVarMeta.cs" />
9495
<Compile Include="Data\Transports\ChannelType.cs" />
9596
<Compile Include="Data\FieldType.cs" />
9697
<Compile Include="Attributes\SyncedVar.cs" />

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,6 @@ private bool SetDirtyness()
928928
#region NetworkedVar
929929

930930
bool networkedVarInit = false;
931-
const string networkedVarTypeName = "NetworkedVar`1";
932931
List<INetworkedVar> networkedVarFields = new List<INetworkedVar>();
933932
internal void NetworkedVarInit()
934933
{
@@ -940,7 +939,7 @@ internal void NetworkedVarInit()
940939
for (int i = 0; i < sortedFields.Length; i++)
941940
{
942941
Type fieldType = sortedFields[i].FieldType;
943-
if (fieldType.Name == networkedVarTypeName)
942+
if (fieldType == typeof(NetworkedVar<>))
944943
{
945944
Type genericTypeDefinition = typeof(NetworkedVar<>);
946945
Type genericType = genericTypeDefinition.MakeGenericType(fieldType.GetGenericArguments());
@@ -963,7 +962,7 @@ internal void HandleNetworkedVarChangedByRemote(BitReader reader)
963962
return;
964963
}
965964

966-
networkedVarFields[index].HandleValueChangedByRemote(reader);
965+
networkedVarFields[index].SetFieldFromReader(reader);
967966
}
968967

969968
internal void SendNetworkedVar(INetworkedVar networkedVar, BitWriter varWriter)

0 commit comments

Comments
 (0)