Skip to content

Commit 2d2ef26

Browse files
committed
Fixed issue where NetworkedVars whould be sent even if empty
1 parent 05cf6bd commit 2d2ef26

File tree

1 file changed

+38
-6
lines changed

1 file changed

+38
-6
lines changed

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -258,13 +258,21 @@ internal void NetworkedVarInit()
258258
channelMappedVarIndexes[firstLevelIndex[channel]].Add(i);
259259
}
260260
}
261-
261+
262+
private readonly List<int> networkedVarIndexesToReset = new List<int>();
263+
private readonly HashSet<int> networkedVarIndexesToResetSet = new HashSet<int>();
262264
internal void NetworkedVarUpdate()
263265
{
264266
if (!networkedVarInit)
265267
NetworkedVarInit();
266268
//TODO: Do this efficiently.
267269

270+
if (!CouldHaveDirtyVars())
271+
return;
272+
273+
networkedVarIndexesToReset.Clear();
274+
networkedVarIndexesToResetSet.Clear();
275+
268276
for (int i = 0; i < NetworkingManager.singleton.ConnectedClientsList.Count; i++)
269277
{
270278
//This iterates over every "channel group".
@@ -278,6 +286,7 @@ internal void NetworkedVarUpdate()
278286
writer.WriteUInt16Packed(networkedObject.GetOrderIndex(this));
279287

280288
uint clientId = NetworkingManager.singleton.ConnectedClientsList[i].ClientId;
289+
bool writtenAny = false;
281290
for (int k = 0; k < networkedVarFields.Count; k++)
282291
{
283292
if (!channelMappedVarIndexes[j].Contains(k))
@@ -291,19 +300,42 @@ internal void NetworkedVarUpdate()
291300
writer.WriteBool(isDirty);
292301
if (isDirty && (!isServer || networkedVarFields[k].CanClientRead(clientId)))
293302
{
303+
writtenAny = true;
294304
networkedVarFields[k].WriteDelta(stream);
295-
networkedVarFields[k].ResetDirty();
305+
if (!networkedVarIndexesToResetSet.Contains(k))
306+
{
307+
networkedVarIndexesToResetSet.Add(k);
308+
networkedVarIndexesToReset.Add(k);
309+
}
296310
}
297311
}
298312

299-
if (isServer)
300-
InternalMessageHandler.Send(clientId, MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA, channelsForVarGroups[j], stream);
301-
else
302-
InternalMessageHandler.Send(NetworkingManager.singleton.ServerClientId, MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA, channelsForVarGroups[j], stream);
313+
if (writtenAny)
314+
{
315+
if (isServer)
316+
InternalMessageHandler.Send(clientId, MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA, channelsForVarGroups[j], stream);
317+
else
318+
InternalMessageHandler.Send(NetworkingManager.singleton.ServerClientId, MLAPIConstants.MLAPI_NETWORKED_VAR_DELTA, channelsForVarGroups[j], stream);
319+
}
303320
}
304321
}
305322
}
306323
}
324+
325+
for (int i = 0; i < networkedVarIndexesToReset.Count; i++)
326+
{
327+
networkedVarFields[networkedVarIndexesToReset[i]].ResetDirty();
328+
}
329+
}
330+
331+
private bool CouldHaveDirtyVars()
332+
{
333+
for (int i = 0; i < networkedVarFields.Count; i++)
334+
{
335+
if (networkedVarFields[i].IsDirty())
336+
return true;
337+
}
338+
return false;
307339
}
308340

309341
internal void HandleNetworkedVarDeltas(Stream stream, uint clientId)

0 commit comments

Comments
 (0)