Skip to content

Commit 0d47c69

Browse files
committed
Added support for Vector3,Vector2 and Quaternion's in SyncVars
1 parent 7b9d2d1 commit 0d47c69

File tree

3 files changed

+98
-1
lines changed

3 files changed

+98
-1
lines changed

MLAPI/Attributes/FieldType.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ internal enum FieldType
1414
UInt,
1515
ULong,
1616
UShort,
17-
String
17+
String,
18+
Vector3,
19+
Vector2,
20+
Quaternion
1821
}
1922
}

MLAPI/MonoBehaviours/Core/NetworkedBehaviour.cs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,6 +222,24 @@ internal void SyncVarInit()
222222
syncedFieldValues.Add(sortedFields[i].GetValue(this));
223223
syncedFieldTypes.Add(FieldType.String);
224224
}
225+
else if(sortedFields[i].FieldType == typeof(Vector3))
226+
{
227+
syncedFields.Add(sortedFields[i]);
228+
syncedFieldValues.Add(sortedFields[i].GetValue(this));
229+
syncedFieldTypes.Add(FieldType.Vector3);
230+
}
231+
else if(sortedFields[i].FieldType == typeof(Vector2))
232+
{
233+
syncedFields.Add(sortedFields[i]);
234+
syncedFieldValues.Add(sortedFields[i].GetValue(this));
235+
syncedFieldTypes.Add(FieldType.Vector2);
236+
}
237+
else if (sortedFields[i].FieldType == typeof(Quaternion))
238+
{
239+
syncedFields.Add(sortedFields[i]);
240+
syncedFieldValues.Add(sortedFields[i].GetValue(this));
241+
syncedFieldTypes.Add(FieldType.Quaternion);
242+
}
225243
else
226244
{
227245
Debug.LogError("MLAPI: The type " + sortedFields[i].FieldType.ToString() + " can not be used as a syncvar");
@@ -299,6 +317,23 @@ internal void FlushToClient(int clientId)
299317
case FieldType.String:
300318
writer.Write((string)syncedFields[i].GetValue(this));
301319
break;
320+
case FieldType.Vector3:
321+
Vector3 vector3 = (Vector3)syncedFields[i].GetValue(this);
322+
writer.Write(vector3.x);
323+
writer.Write(vector3.y);
324+
writer.Write(vector3.z);
325+
break;
326+
case FieldType.Vector2:
327+
Vector2 vector2 = (Vector2)syncedFields[i].GetValue(this);
328+
writer.Write(vector2.x);
329+
writer.Write(vector2.y);
330+
break;
331+
case FieldType.Quaternion:
332+
Vector3 euler = ((Quaternion)syncedFields[i].GetValue(this)).eulerAngles;
333+
writer.Write(euler.x);
334+
writer.Write(euler.y);
335+
writer.Write(euler.z);
336+
break;
302337
}
303338
}
304339
NetworkingManager.singleton.Send(clientId, "MLAPI_SYNC_VAR_UPDATE", "MLAPI_RELIABLE_FRAGMENTED_SEQUENCED", stream.ToArray());
@@ -372,6 +407,24 @@ internal void SyncVarUpdate()
372407
case FieldType.String:
373408
writer.Write((string)syncedFields[i].GetValue(this));
374409
break;
410+
case FieldType.Vector3:
411+
Vector3 vector3 = (Vector3)syncedFields[i].GetValue(this);
412+
writer.Write(vector3.x);
413+
writer.Write(vector3.y);
414+
writer.Write(vector3.z);
415+
break;
416+
case FieldType.Vector2:
417+
Vector2 vector2 = (Vector2)syncedFields[i].GetValue(this);
418+
writer.Write(vector2.x);
419+
writer.Write(vector2.y);
420+
break;
421+
case FieldType.Quaternion:
422+
Vector3 euler = ((Quaternion)syncedFields[i].GetValue(this)).eulerAngles;
423+
writer.Write(euler.x);
424+
writer.Write(euler.y);
425+
writer.Write(euler.z);
426+
break;
427+
375428
}
376429
syncedFieldValues[i] = syncedFields[i].GetValue(this);
377430
dirtyFields[i] = false;
@@ -470,6 +523,24 @@ private void SetDirtyness()
470523
else
471524
dirtyFields[i] = false; //Up to date
472525
break;
526+
case FieldType.Vector3:
527+
if ((Vector3)syncedFields[i].GetValue(this) != (Vector3)syncedFieldValues[i])
528+
dirtyFields[i] = true; //This fields value is out of sync!
529+
else
530+
dirtyFields[i] = false; //Up to date
531+
break;
532+
case FieldType.Vector2:
533+
if ((Vector2)syncedFields[i].GetValue(this) != (Vector2)syncedFieldValues[i])
534+
dirtyFields[i] = true; //This fields value is out of sync!
535+
else
536+
dirtyFields[i] = false; //Up to date
537+
break;
538+
case FieldType.Quaternion:
539+
if ((Quaternion)syncedFields[i].GetValue(this) != (Quaternion)syncedFieldValues[i])
540+
dirtyFields[i] = true; //This fields value is out of sync!
541+
else
542+
dirtyFields[i] = false; //Up to date
543+
break;
473544
}
474545
}
475546
}

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -741,6 +741,29 @@ private void HandleIncomingData(int clientId, byte[] data, int channelId)
741741
case FieldType.String:
742742
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(messageReader.ReadString(), fieldIndex);
743743
break;
744+
case FieldType.Vector3:
745+
{ //Cases aren't their own scope. Therefor we create a scope for them as they share the X,Y,Z local variables otherwise.
746+
float x = messageReader.ReadSingle();
747+
float y = messageReader.ReadSingle();
748+
float z = messageReader.ReadSingle();
749+
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector3(x, y, z), fieldIndex);
750+
}
751+
break;
752+
case FieldType.Vector2:
753+
{
754+
float x = messageReader.ReadSingle();
755+
float y = messageReader.ReadSingle();
756+
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(new Vector2(x, y), fieldIndex);
757+
}
758+
break;
759+
case FieldType.Quaternion:
760+
{
761+
float x = messageReader.ReadSingle();
762+
float y = messageReader.ReadSingle();
763+
float z = messageReader.ReadSingle();
764+
SpawnManager.spawnedObjects[netId].GetBehaviourAtOrderIndex(orderIndex).OnSyncVarUpdate(Quaternion.Euler(x, y, z), fieldIndex);
765+
}
766+
break;
744767
}
745768
}
746769
}

0 commit comments

Comments
 (0)