Skip to content

Commit cd58b2f

Browse files
pkaminskiTwoTenPvP
authored andcommitted
feat(core): let user omit transforms from spawned object contents. (#250)
1 parent 89faf12 commit cd58b2f

File tree

5 files changed

+74
-32
lines changed

5 files changed

+74
-32
lines changed

MLAPI/Core/NetworkedObject.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,17 @@ internal set
158158
/// </summary>
159159
public VisibilityDelegate CheckObjectVisibility = null;
160160

161+
/// <summary>
162+
/// Delegate type for checking spawn options
163+
/// </summary>
164+
/// <param name="clientId">The clientId to check spawn options for</param>
165+
public delegate bool SpawnDelegate(ulong clientId);
166+
167+
/// <summary>
168+
/// Delegate invoked when the MLAPI needs to know if it should include the transform when spawning the object, if null it will assume true
169+
/// </summary>
170+
public SpawnDelegate IncludeTransformWhenSpawning = null;
171+
161172
/// <summary>
162173
/// Whether or not to destroy this object if it's owner is destroyed.
163174
/// If false, the objects ownership will be given to the server.

MLAPI/Core/NetworkingManager.cs

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1082,15 +1082,16 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V
10821082

10831083
for (int i = 0; i < _observedObjects.Count; i++)
10841084
{
1085-
writer.WriteBool(_observedObjects[i].IsPlayerObject);
1086-
writer.WriteUInt64Packed(_observedObjects[i].NetworkId);
1087-
writer.WriteUInt64Packed(_observedObjects[i].OwnerClientId);
1085+
NetworkedObject observedObject = _observedObjects[i];
1086+
writer.WriteBool(observedObject.IsPlayerObject);
1087+
writer.WriteUInt64Packed(observedObject.NetworkId);
1088+
writer.WriteUInt64Packed(observedObject.OwnerClientId);
10881089

10891090
NetworkedObject parent = null;
10901091

1091-
if (!_observedObjects[i].AlwaysReplicateAsRoot && _observedObjects[i].transform.parent != null)
1092+
if (!observedObject.AlwaysReplicateAsRoot && observedObject.transform.parent != null)
10921093
{
1093-
parent = _observedObjects[i].transform.parent.GetComponent<NetworkedObject>();
1094+
parent = observedObject.transform.parent.GetComponent<NetworkedObject>();
10941095
}
10951096

10961097
if (parent == null)
@@ -1105,34 +1106,42 @@ internal void HandleApproval(ulong clientId, ulong? prefabHash, bool approved, V
11051106

11061107
if (NetworkConfig.UsePrefabSync)
11071108
{
1108-
writer.WriteUInt64Packed(_observedObjects[i].PrefabHash);
1109+
writer.WriteUInt64Packed(observedObject.PrefabHash);
11091110
}
11101111
else
11111112
{
11121113
// Is this a scene object that we will soft map
1113-
writer.WriteBool(_observedObjects[i].IsSceneObject == null ? true : _observedObjects[i].IsSceneObject.Value);
1114+
writer.WriteBool(observedObject.IsSceneObject == null ? true : observedObject.IsSceneObject.Value);
11141115

1115-
if (_observedObjects[i].IsSceneObject == null || _observedObjects[i].IsSceneObject.Value == true)
1116+
if (observedObject.IsSceneObject == null || observedObject.IsSceneObject.Value == true)
11161117
{
1117-
writer.WriteUInt64Packed(_observedObjects[i].NetworkedInstanceId);
1118+
writer.WriteUInt64Packed(observedObject.NetworkedInstanceId);
11181119
}
11191120
else
11201121
{
1121-
writer.WriteUInt64Packed(_observedObjects[i].PrefabHash);
1122+
writer.WriteUInt64Packed(observedObject.PrefabHash);
11221123
}
11231124
}
11241125

1125-
writer.WriteSinglePacked(_observedObjects[i].transform.position.x);
1126-
writer.WriteSinglePacked(_observedObjects[i].transform.position.y);
1127-
writer.WriteSinglePacked(_observedObjects[i].transform.position.z);
1126+
if (observedObject.IncludeTransformWhenSpawning == null || observedObject.IncludeTransformWhenSpawning(clientId))
1127+
{
1128+
writer.WriteBool(true);
1129+
writer.WriteSinglePacked(observedObject.transform.position.x);
1130+
writer.WriteSinglePacked(observedObject.transform.position.y);
1131+
writer.WriteSinglePacked(observedObject.transform.position.z);
11281132

1129-
writer.WriteSinglePacked(_observedObjects[i].transform.rotation.eulerAngles.x);
1130-
writer.WriteSinglePacked(_observedObjects[i].transform.rotation.eulerAngles.y);
1131-
writer.WriteSinglePacked(_observedObjects[i].transform.rotation.eulerAngles.z);
1133+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.x);
1134+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.y);
1135+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.z);
1136+
}
1137+
else
1138+
{
1139+
writer.WriteBool(false);
1140+
}
11321141

11331142
if (NetworkConfig.EnableNetworkedVar)
11341143
{
1135-
_observedObjects[i].WriteNetworkedVarData(stream, clientId);
1144+
observedObject.WriteNetworkedVarData(stream, clientId);
11361145
}
11371146
}
11381147

MLAPI/Messaging/InternalMessageHandler.cs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -265,8 +265,13 @@ void DelayedSpawnAction(Stream continuationStream)
265265
}
266266
}
267267

268-
Vector3 pos = new Vector3(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
269-
Quaternion rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
268+
Vector3? pos = null;
269+
Quaternion? rot = null;
270+
if (continuationReader.ReadBool())
271+
{
272+
pos = new Vector3(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
273+
rot = Quaternion.Euler(continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked(), continuationReader.ReadSinglePacked());
274+
}
270275

271276
NetworkedObject netObject = SpawnManager.CreateLocalNetworkedObject(softSync, instanceId, prefabHash, parentNetworkId, pos, rot);
272277
SpawnManager.SpawnNetworkedObjectLocally(netObject, networkId, softSync, isPlayerObject, ownerId, continuationStream, false, 0, true, false);
@@ -320,11 +325,11 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
320325
{
321326
parentNetworkId = reader.ReadUInt64Packed();
322327
}
323-
328+
324329
ulong prefabHash;
325330
ulong instanceId;
326331
bool softSync;
327-
332+
328333
if (NetworkingManager.Singleton.NetworkConfig.UsePrefabSync)
329334
{
330335
softSync = false;
@@ -347,8 +352,13 @@ internal static void HandleAddObject(ulong clientId, Stream stream)
347352
}
348353
}
349354

350-
Vector3 pos = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
351-
Quaternion rot = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
355+
Vector3? pos = null;
356+
Quaternion? rot = null;
357+
if (reader.ReadBool())
358+
{
359+
pos = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
360+
rot = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
361+
}
352362

353363
bool hasPayload = reader.ReadBool();
354364
int payLoadLength = hasPayload ? reader.ReadInt32Packed() : 0;

MLAPI/SceneManagement/NetworkSceneManager.cs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,13 @@ private static void OnSceneUnloadClient(Guid switchSceneGuid, Stream objectStrea
335335

336336
ulong prefabHash = reader.ReadUInt64Packed();
337337

338-
Vector3 position = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
339-
Quaternion rotation = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
338+
Vector3? position = null;
339+
Quaternion? rotation = null;
340+
if (reader.ReadBool())
341+
{
342+
position = new Vector3(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
343+
rotation = Quaternion.Euler(reader.ReadSinglePacked(), reader.ReadSinglePacked(), reader.ReadSinglePacked());
344+
}
340345

341346
NetworkedObject networkedObject = SpawnManager.CreateLocalNetworkedObject(false, 0, prefabHash, parentNetworkId, position, rotation);
342347
SpawnManager.SpawnNetworkedObjectLocally(networkedObject, networkId, true, isPlayerObject, owner, objectStream, false, 0, true, false);

MLAPI/Spawning/SpawnManager.cs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -437,13 +437,20 @@ internal static void WriteSpawnCallForObject(Serialization.BitStream stream, ulo
437437
}
438438
}
439439

440-
writer.WriteSinglePacked(netObject.transform.position.x);
441-
writer.WriteSinglePacked(netObject.transform.position.y);
442-
writer.WriteSinglePacked(netObject.transform.position.z);
443-
444-
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.x);
445-
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.y);
446-
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.z);
440+
if (netObject.IncludeTransformWhenSpawning == null || netObject.IncludeTransformWhenSpawning(clientId))
441+
{
442+
writer.WriteBool(true);
443+
writer.WriteSinglePacked(netObject.transform.position.x);
444+
writer.WriteSinglePacked(netObject.transform.position.y);
445+
writer.WriteSinglePacked(netObject.transform.position.z);
446+
447+
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.x);
448+
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.y);
449+
writer.WriteSinglePacked(netObject.transform.rotation.eulerAngles.z);
450+
} else
451+
{
452+
writer.WriteBool(false);
453+
}
447454

448455
writer.WriteBool(payload != null);
449456

0 commit comments

Comments
 (0)