Skip to content

Commit 3540c9f

Browse files
committed
Added NetworkedList layout
1 parent f3c95f3 commit 3540c9f

File tree

4 files changed

+243
-16
lines changed

4 files changed

+243
-16
lines changed
Lines changed: 221 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
using System.Collections;
2+
using System.Collections.Generic;
3+
using MLAPI.MonoBehaviours.Core;
4+
using MLAPI.NetworkingManagerComponents.Binary;
5+
6+
namespace MLAPI.Data.NetworkedCollections
7+
{
8+
public class NetworkedList<T> : IList<T>, INetworkedVar
9+
{
10+
internal struct NetworkedListEvent<T>
11+
{
12+
internal enum NetworkedListEventType
13+
{
14+
Add,
15+
Insert,
16+
Remove,
17+
RemoveAt,
18+
Value,
19+
Clear
20+
}
21+
22+
internal NetworkedListEventType eventType;
23+
internal T value;
24+
internal int index;
25+
}
26+
27+
private readonly IList<T> list = new List<T>();
28+
private List<NetworkedListEvent<T>> dirtyEvents = new List<NetworkedListEvent<T>>();
29+
private NetworkedBehaviour networkedBehaviour;
30+
public NetworkedVarSettings Settings = new NetworkedVarSettings();
31+
32+
public void OnSynced()
33+
{
34+
dirtyEvents.Clear();
35+
}
36+
37+
public bool IsDirty()
38+
{
39+
return dirtyEvents.Count > 0;
40+
}
41+
42+
public bool CanClientWrite(uint clientId)
43+
{
44+
switch (Settings.WritePermission)
45+
{
46+
case NetworkedVarPermission.Everyone:
47+
return true;
48+
case NetworkedVarPermission.ServerOnly:
49+
return false;
50+
case NetworkedVarPermission.OwnerOnly:
51+
return networkedBehaviour.OwnerClientId == clientId;
52+
case NetworkedVarPermission.Custom:
53+
{
54+
if (Settings.WritePermissionCallback == null) return false;
55+
return Settings.WritePermissionCallback(clientId);
56+
}
57+
}
58+
59+
return true;
60+
}
61+
62+
public bool CanClientRead(uint clientId)
63+
{
64+
switch (Settings.ReadPermission)
65+
{
66+
case NetworkedVarPermission.Everyone:
67+
return true;
68+
case NetworkedVarPermission.ServerOnly:
69+
return false;
70+
case NetworkedVarPermission.OwnerOnly:
71+
return networkedBehaviour.OwnerClientId == clientId;
72+
case NetworkedVarPermission.Custom:
73+
{
74+
if (Settings.ReadPermissionCallback == null) return false;
75+
return Settings.ReadPermissionCallback(clientId);
76+
}
77+
}
78+
return true;
79+
}
80+
81+
public void WriteDeltaToWriter(BitWriter writer)
82+
{
83+
for (int i = 0; i < dirtyEvents.Count; i++)
84+
{
85+
//TODO: Write event
86+
}
87+
}
88+
89+
public void WriteFieldToWriter(BitWriter writer)
90+
{
91+
for (int i = 0; i < list.Count; i++)
92+
{
93+
//TODO: Write the field
94+
}
95+
}
96+
97+
public void SetFieldFromReader(BitReader reader)
98+
{
99+
ushort count = reader.ReadUShort();
100+
for (int i = 0; i < count; i++)
101+
{
102+
//TODO: Read element
103+
}
104+
}
105+
106+
public void SetDeltaFromReader(BitReader reader)
107+
{
108+
ushort deltaCount = reader.ReadUShort();
109+
for (int i = 0; i < deltaCount; i++)
110+
{
111+
//TODO: Read the NetworkedListEvent and apply the instruction
112+
}
113+
}
114+
115+
public void SetNetworkedBehaviour(NetworkedBehaviour behaviour)
116+
{
117+
networkedBehaviour = behaviour;
118+
}
119+
120+
public IEnumerator<T> GetEnumerator()
121+
{
122+
return list.GetEnumerator();
123+
}
124+
125+
IEnumerator IEnumerable.GetEnumerator()
126+
{
127+
return ((IEnumerable) list).GetEnumerator();
128+
}
129+
130+
public void Add(T item)
131+
{
132+
list.Add(item);
133+
dirtyEvents.Add(new NetworkedListEvent<T>()
134+
{
135+
eventType = NetworkedListEvent<T>.NetworkedListEventType.Add,
136+
value = item
137+
});
138+
}
139+
140+
public void Clear()
141+
{
142+
list.Clear();
143+
dirtyEvents.Add(new NetworkedListEvent<T>()
144+
{
145+
eventType = NetworkedListEvent<T>.NetworkedListEventType.Clear
146+
});
147+
}
148+
149+
public bool Contains(T item)
150+
{
151+
return list.Contains(item);
152+
}
153+
154+
public void CopyTo(T[] array, int arrayIndex)
155+
{
156+
list.CopyTo(array, arrayIndex);
157+
}
158+
159+
public bool Remove(T item)
160+
{
161+
bool state = list.Remove(item);
162+
if (state)
163+
{
164+
dirtyEvents.Add(new NetworkedListEvent<T>()
165+
{
166+
eventType = NetworkedListEvent<T>.NetworkedListEventType.Remove,
167+
value = item
168+
});
169+
}
170+
return state;
171+
}
172+
173+
public int Count => list.Count;
174+
175+
public bool IsReadOnly => list.IsReadOnly;
176+
177+
public int IndexOf(T item)
178+
{
179+
return list.IndexOf(item);
180+
}
181+
182+
public void Insert(int index, T item)
183+
{
184+
list.Insert(index, item);
185+
dirtyEvents.Add(new NetworkedListEvent<T>()
186+
{
187+
eventType = NetworkedListEvent<T>.NetworkedListEventType.Insert,
188+
index = index,
189+
value = item
190+
});
191+
}
192+
193+
public void RemoveAt(int index)
194+
{
195+
list.RemoveAt(index);
196+
dirtyEvents.Add(new NetworkedListEvent<T>()
197+
{
198+
eventType = NetworkedListEvent<T>.NetworkedListEventType.RemoveAt,
199+
index = index
200+
});
201+
}
202+
203+
public T this[int index]
204+
{
205+
get
206+
{
207+
return list[index];
208+
}
209+
set
210+
{
211+
list[index] = value;
212+
dirtyEvents.Add(new NetworkedListEvent<T>()
213+
{
214+
eventType = NetworkedListEvent<T>.NetworkedListEventType.Value,
215+
index = index,
216+
value = value
217+
});
218+
}
219+
}
220+
}
221+
}

MLAPI/Data/NetworkedVar.cs

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ namespace MLAPI.Data
88
/// </summary>
99
public class NetworkedVar<T> : INetworkedVar
1010
{
11-
public bool IsDirty { get; set; }
12-
public readonly NetworkedVarSettings<T> Settings = new NetworkedVarSettings<T>();
11+
public bool isDirty { get; set; }
12+
public readonly NetworkedVarSettings Settings = new NetworkedVarSettings();
1313
public float LastSyncedTime { get; internal set; }
1414

1515
public delegate void OnValueChangedByRemoteDelegate(T newValue);
@@ -29,26 +29,26 @@ public T Value
2929
}
3030
set
3131
{
32-
IsDirty = true;
32+
isDirty = true;
3333
InternalValue = value;
3434
}
3535
}
3636

37-
void INetworkedVar.OnSynced()
37+
public void OnSynced()
3838
{
39-
IsDirty = false;
39+
isDirty = false;
4040
LastSyncedTime = NetworkingManager.singleton.NetworkTime;
4141
}
4242

43-
bool INetworkedVar.IsDirty()
43+
public bool IsDirty()
4444
{
45-
if (!IsDirty) return false;
45+
if (!isDirty) return false;
4646
if (Settings.SendOnChange) return true;
4747
if (NetworkingManager.singleton.NetworkTime - LastSyncedTime >= Settings.SendDelay) return true;
48-
return IsDirty;
48+
return isDirty;
4949
}
5050

51-
bool INetworkedVar.CanClientRead(uint clientId)
51+
public bool CanClientRead(uint clientId)
5252
{
5353
switch (Settings.ReadPermission)
5454
{
@@ -66,8 +66,10 @@ bool INetworkedVar.CanClientRead(uint clientId)
6666
}
6767
return true;
6868
}
69-
70-
bool INetworkedVar.CanClientWrite(uint clientId)
69+
70+
public void WriteDeltaToWriter(BitWriter writer) => WriteFieldToWriter(writer); //The NetworkedVar is built for simple data types and has no delta.
71+
72+
public bool CanClientWrite(uint clientId)
7173
{
7274
switch (Settings.WritePermission)
7375
{
@@ -87,18 +89,20 @@ bool INetworkedVar.CanClientWrite(uint clientId)
8789
return true;
8890
}
8991

90-
void INetworkedVar.SetNetworkedBehaviour(NetworkedBehaviour behaviour)
92+
public void SetDeltaFromReader(BitReader reader) => SetFieldFromReader(reader); //The NetworkedVar is built for simple data types and has no delta.
93+
94+
public void SetNetworkedBehaviour(NetworkedBehaviour behaviour)
9195
{
9296
networkedBehaviour = behaviour;
9397
}
9498

95-
void INetworkedVar.SetFieldFromReader(BitReader reader)
99+
public void SetFieldFromReader(BitReader reader)
96100
{
97101
// TODO TwoTen - Boxing sucks
98102
InternalValue = (T)FieldTypeHelper.ReadFieldType(reader, typeof(T), (object)InternalValue);
99103
}
100104

101-
void INetworkedVar.WriteFieldToWriter(BitWriter writer)
105+
public void WriteFieldToWriter(BitWriter writer)
102106
{
103107
//TODO: Write field
104108
}
@@ -110,8 +114,10 @@ public interface INetworkedVar
110114
bool IsDirty();
111115
bool CanClientWrite(uint clientId);
112116
bool CanClientRead(uint clientId);
117+
void WriteDeltaToWriter(BitWriter writer);
113118
void WriteFieldToWriter(BitWriter writer);
114119
void SetFieldFromReader(BitReader reader);
120+
void SetDeltaFromReader(BitReader reader);
115121
void SetNetworkedBehaviour(NetworkedBehaviour behaviour);
116122
}
117123
}

MLAPI/Data/NetworkedVarMeta.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
namespace MLAPI.Data
22
{
3-
public class NetworkedVarSettings<T>
3+
public class NetworkedVarSettings
44
{
55
public NetworkedVarPermission WritePermission = NetworkedVarPermission.ServerOnly;
66
public NetworkedVarPermission ReadPermission = NetworkedVarPermission.Everyone;

MLAPI/MLAPI.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@
9090
<Compile Include="Attributes\TargetRpc.cs" />
9191
<Compile Include="Data\Channel.cs" />
9292
<Compile Include="Data\AttributeMessageMode.cs" />
93+
<Compile Include="Data\NetworkedCollections\NetworkedList.cs" />
9394
<Compile Include="Data\NetworkedVar.cs" />
9495
<Compile Include="Data\NetworkedVarMeta.cs" />
9596
<Compile Include="Data\Transports\ChannelType.cs" />
@@ -147,6 +148,5 @@
147148
<ItemGroup>
148149
<None Include="packages.config" />
149150
</ItemGroup>
150-
<ItemGroup />
151151
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
152152
</Project>

0 commit comments

Comments
 (0)