Skip to content

Commit aa4b5c6

Browse files
committed
Changed SyncedVars to be flushed on object creation
1 parent cb34b22 commit aa4b5c6

File tree

4 files changed

+55
-14
lines changed

4 files changed

+55
-14
lines changed

MLAPI/MonoBehaviours/Core/NetworkedObject.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,38 @@ internal static void InvokeSyncvarUpdate()
297297
}
298298
}
299299

300+
internal void WriteFormattedSyncedVarData(BitWriter writer)
301+
{
302+
for (int i = 0; i < childNetworkedBehaviours.Count; i++)
303+
{
304+
childNetworkedBehaviours[i].SyncVarInit();
305+
if (childNetworkedBehaviours[i].syncedVarFields.Count == 0)
306+
continue;
307+
writer.WriteUShort(GetOrderIndex(childNetworkedBehaviours[i])); //Write the behaviourId
308+
for (int j = 0; j < childNetworkedBehaviours[i].syncedVarFields.Count; j++)
309+
{
310+
FieldTypeHelper.WriteFieldType(writer, childNetworkedBehaviours[i].syncedVarFields[j].FieldValue,
311+
childNetworkedBehaviours[i].syncedVarFields[j].FieldType);
312+
}
313+
}
314+
}
315+
316+
internal void SetFormattedSyncedVarData(BitReader reader)
317+
{
318+
for (int i = 0; i < childNetworkedBehaviours.Count; i++)
319+
{
320+
childNetworkedBehaviours[i].SyncVarInit();
321+
if (childNetworkedBehaviours[i].syncedVarFields.Count == 0)
322+
continue;
323+
NetworkedBehaviour behaviour = GetBehaviourAtOrderIndex(reader.ReadUShort());
324+
for (int j = 0; j < childNetworkedBehaviours[i].syncedVarFields.Count; j++)
325+
{
326+
childNetworkedBehaviours[i].syncedVarFields[j].FieldInfo.SetValue(behaviour,
327+
FieldTypeHelper.ReadFieldType(reader, childNetworkedBehaviours[i].syncedVarFields[j].FieldType));
328+
}
329+
}
330+
}
331+
300332
//Flushes all syncVars to client
301333
internal void FlushToClient(uint clientId)
302334
{

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,6 +1096,8 @@ internal void HandleApproval(uint clientId, bool approved, Vector3 position, Qua
10961096
writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.x);
10971097
writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.y);
10981098
writer.WriteFloat(pair.Value.transform.rotation.eulerAngles.z);
1099+
1100+
pair.Value.WriteFormattedSyncedVarData(writer);
10991101
}
11001102
}
11011103

@@ -1125,6 +1127,8 @@ internal void HandleApproval(uint clientId, bool approved, Vector3 position, Qua
11251127
writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.x);
11261128
writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.y);
11271129
writer.WriteFloat(connectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.z);
1130+
1131+
connectedClients[clientId].PlayerObject.GetComponent<NetworkedObject>().WriteFormattedSyncedVarData(writer);
11281132
}
11291133
else
11301134
{
@@ -1133,11 +1137,6 @@ internal void HandleApproval(uint clientId, bool approved, Vector3 position, Qua
11331137

11341138
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", writer.Finalize(), clientId, null);
11351139
}
1136-
//Flush syncvars:
1137-
foreach (KeyValuePair<uint, NetworkedObject> networkedObject in SpawnManager.spawnedObjects)
1138-
{
1139-
networkedObject.Value.FlushToClient(clientId);
1140-
}
11411140
}
11421141
else
11431142
{

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Receive.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -106,13 +106,13 @@ internal static void HandleConnectionApproved(uint clientId, byte[] incommingDat
106106

107107
if (isPlayerObject)
108108
{
109-
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
109+
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
110110
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
111111
}
112112
else
113113
{
114114
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
115-
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
115+
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
116116

117117
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
118118
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
@@ -155,13 +155,13 @@ internal static void HandleAddObject(uint clientId, byte[] incommingData, int ch
155155
if (isPlayerObject)
156156
{
157157
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
158-
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
158+
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
159159
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
160160
}
161161
else
162162
{
163163
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
164-
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
164+
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
165165

166166
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
167167
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;
@@ -364,14 +364,14 @@ internal static void HandleAddObjects(uint clientId, byte[] incommingData, int c
364364
if (isPlayerObject)
365365
{
366366
netManager.connectedClients.Add(ownerId, new NetworkedClient() { ClientId = ownerId });
367-
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
367+
GameObject go = SpawnManager.SpawnPlayerObject(ownerId, networkId, new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
368368

369369
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
370370
}
371371
else
372372
{
373373
GameObject go = SpawnManager.SpawnPrefabIndexClient(prefabId, networkId, ownerId,
374-
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot));
374+
new Vector3(xPos, yPos, zPos), Quaternion.Euler(xRot, yRot, zRot), reader);
375375

376376
go.GetComponent<NetworkedObject>().SetLocalVisibility(visible);
377377
go.GetComponent<NetworkedObject>().sceneObject = sceneObject;

MLAPI/NetworkingManagerComponents/Core/SpawnManager.cs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ internal static void FlushSceneObjects()
113113
using (BitWriter writer = new BitWriter())
114114
{
115115
writer.WriteUShort((ushort)sceneObjectsToSync.Count);
116+
116117
for (int i = 0; i < sceneObjectsToSync.Count; i++)
117118
{
118119
writer.WriteBool(false); //isLocalPlayer
@@ -128,13 +129,14 @@ internal static void FlushSceneObjects()
128129
writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.x);
129130
writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.y);
130131
writer.WriteFloat(sceneObjectsToSync[i].transform.rotation.eulerAngles.z);
131-
}
132132

133+
sceneObjectsToSync[i].WriteFormattedSyncedVarData(writer);
134+
}
133135
InternalMessageHandler.Send("MLAPI_ADD_OBJECTS", "MLAPI_INTERNAL", writer.Finalize(), null);
134136
}
135137
}
136138

137-
internal static GameObject SpawnPrefabIndexClient(int networkedPrefabId, uint networkId, uint owner, Vector3 position, Quaternion rotation)
139+
internal static GameObject SpawnPrefabIndexClient(int networkedPrefabId, uint networkId, uint owner, Vector3 position, Quaternion rotation, BitReader reader = null)
138140
{
139141
if (!netManager.NetworkConfig.NetworkPrefabNames.ContainsKey(networkedPrefabId))
140142
{
@@ -149,6 +151,10 @@ internal static GameObject SpawnPrefabIndexClient(int networkedPrefabId, uint ne
149151
Debug.LogWarning("MLAPI: Please add a NetworkedObject component to the root of all spawnable objects");
150152
netObject = go.AddComponent<NetworkedObject>();
151153
}
154+
155+
if (reader != null)
156+
netObject.SetFormattedSyncedVarData(reader);
157+
152158
netObject.NetworkedPrefabName = netManager.NetworkConfig.NetworkPrefabNames[networkedPrefabId];
153159
netObject._isSpawned = true;
154160
netObject._isPooledObject = false;
@@ -210,12 +216,13 @@ internal static void SpawnPrefabIndexServer(NetworkedObject netObject, uint? cli
210216
writer.WriteFloat(netObject.transform.rotation.eulerAngles.y);
211217
writer.WriteFloat(netObject.transform.rotation.eulerAngles.z);
212218

219+
netObject.WriteFormattedSyncedVarData(writer);
213220

214221
InternalMessageHandler.Send("MLAPI_ADD_OBJECT", "MLAPI_INTERNAL", writer.Finalize(), null);
215222
}
216223
}
217224

218-
internal static GameObject SpawnPlayerObject(uint clientId, uint networkId, Vector3 position, Quaternion rotation)
225+
internal static GameObject SpawnPlayerObject(uint clientId, uint networkId, Vector3 position, Quaternion rotation, BitReader reader = null)
219226
{
220227
if (string.IsNullOrEmpty(netManager.NetworkConfig.PlayerPrefabName) || !netManager.NetworkConfig.NetworkPrefabIds.ContainsKey(netManager.NetworkConfig.PlayerPrefabName))
221228
{
@@ -235,6 +242,9 @@ internal static GameObject SpawnPlayerObject(uint clientId, uint networkId, Vect
235242
else
236243
netObject.networkId = networkId;
237244

245+
if (reader != null)
246+
netObject.SetFormattedSyncedVarData(reader);
247+
238248
netObject._isPooledObject = false;
239249
netObject.ownerClientId = clientId;
240250
netObject._isPlayerObject = true;

0 commit comments

Comments
 (0)