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 ;
7
2
using MLAPI . MonoBehaviours . Core ;
8
3
9
4
namespace MLAPI . Data
@@ -13,6 +8,10 @@ namespace MLAPI.Data
13
8
/// </summary>
14
9
public class NetworkedVar < T > : INetworkedVar
15
10
{
11
+ public bool IsDirty { get ; set ; }
12
+ public readonly NetworkedVarSettings < T > Settings = new NetworkedVarSettings < T > ( ) ;
13
+ public float LastSyncedTime { get ; internal set ; }
14
+
16
15
public delegate void OnValueChangedByRemoteDelegate ( T newValue ) ;
17
16
public OnValueChangedByRemoteDelegate OnValueChangedByRemote ;
18
17
private NetworkedBehaviour networkedBehaviour ;
@@ -30,41 +29,93 @@ public T Value
30
29
}
31
30
set
32
31
{
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 )
34
33
{
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
42
38
}
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 ;
43
52
}
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 ;
44
93
}
45
94
46
95
void INetworkedVar . SetNetworkedBehaviour ( NetworkedBehaviour behaviour )
47
96
{
48
97
networkedBehaviour = behaviour ;
49
98
}
50
99
51
- void INetworkedVar . HandleValueChangedByRemote ( BitReader reader )
100
+ void INetworkedVar . SetFieldFromReader ( BitReader reader )
52
101
{
53
102
// TODO TwoTen - Boxing sucks
54
103
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
62
109
}
63
110
}
64
111
65
112
internal interface INetworkedVar
66
113
{
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 ) ;
68
119
void SetNetworkedBehaviour ( NetworkedBehaviour behaviour ) ;
69
120
}
70
121
}
0 commit comments