Skip to content

Commit db2d171

Browse files
authored
fix: fix approval flow not being triggered for host (#675)
BREAKING CHANGE: Removes optional parameters in StartHost
1 parent ce477d7 commit db2d171

File tree

1 file changed

+84
-81
lines changed

1 file changed

+84
-81
lines changed

com.unity.multiplayer.mlapi/Runtime/Core/NetworkManager.cs

Lines changed: 84 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -558,7 +558,7 @@ public void StopClient()
558558
/// <summary>
559559
/// Starts a Host
560560
/// </summary>
561-
public SocketTasks StartHost(Vector3? position = null, Quaternion? rotation = null, bool? createPlayerObject = null, ulong? prefabHash = null, Stream payloadStream = null)
561+
public SocketTasks StartHost()
562562
{
563563
if (NetworkLog.CurrentLogLevel <= LogLevel.Developer)
564564
{
@@ -594,24 +594,25 @@ public SocketTasks StartHost(Vector3? position = null, Quaternion? rotation = nu
594594
IsClient = true;
595595
IsListening = true;
596596

597-
ulong hostClientId = NetworkConfig.NetworkTransport.ServerClientId;
598-
599-
ConnectedClients.Add(hostClientId, new NetworkClient()
597+
if (NetworkConfig.ConnectionApproval)
600598
{
601-
ClientId = hostClientId
602-
});
603-
604-
ConnectedClientsList.Add(ConnectedClients[hostClientId]);
599+
InvokeConnectionApproval(NetworkConfig.ConnectionData, ServerClientId, (createPlayerObject, playerPrefabHash, approved, position, rotation) =>
600+
{
601+
// You cannot decline the local server. Force approved to true
602+
if (!approved)
603+
{
604+
if (NetworkLog.CurrentLogLevel <= LogLevel.Normal)
605+
{
606+
NetworkLog.LogWarning("You cannot decline the host connection. The connection was automatically approved.");
607+
}
608+
}
605609

606-
if ((createPlayerObject == null && NetworkConfig.CreatePlayerPrefab) || (createPlayerObject != null && createPlayerObject.Value))
610+
HandleApproval(ServerClientId, createPlayerObject, playerPrefabHash, true, position, rotation);
611+
});
612+
}
613+
else
607614
{
608-
var networkObject = NetworkSpawnManager.CreateLocalNetworkObject(false, 0, prefabHash ?? NetworkConfig.PlayerPrefabHash.Value, null, position, rotation);
609-
NetworkSpawnManager.SpawnNetworkObjectLocally(networkObject, NetworkSpawnManager.GetNetworkObjectId(), false, true, hostClientId, payloadStream, payloadStream != null, payloadStream == null ? 0 : (int)payloadStream.Length, false, false);
610-
611-
if (networkObject.CheckObjectVisibility == null || networkObject.CheckObjectVisibility(hostClientId))
612-
{
613-
networkObject.m_Observers.Add(hostClientId);
614-
}
615+
HandleApproval(ServerClientId, NetworkConfig.CreatePlayerPrefab, null, true, null, null);
615616
}
616617

617618
NetworkSpawnManager.ServerSpawnSceneObjectsOnStartSweep();
@@ -1441,7 +1442,6 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
14411442
// This packet is unreliable, but if it gets through it should provide a much better sync than the potentially huge approval message.
14421443
SyncTime();
14431444

1444-
14451445
if (createPlayerObject)
14461446
{
14471447
var networkObject = NetworkSpawnManager.CreateLocalNetworkObject(false, 0, playerPrefabHash ?? NetworkConfig.PlayerPrefabHash.Value, null, position, rotation);
@@ -1461,97 +1461,100 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
14611461
}
14621462
}
14631463

1464-
using (var buffer = PooledNetworkBuffer.Get())
1465-
using (var writer = PooledNetworkWriter.Get(buffer))
1464+
if (clientId != ServerClientId)
14661465
{
1467-
writer.WriteUInt64Packed(clientId);
1468-
1469-
if (NetworkConfig.EnableSceneManagement)
1470-
{
1471-
writer.WriteUInt32Packed(NetworkSceneManager.CurrentSceneIndex);
1472-
writer.WriteByteArray(NetworkSceneManager.CurrentSceneSwitchProgressGuid.ToByteArray());
1473-
}
1474-
1475-
writer.WriteSinglePacked(Time.realtimeSinceStartup);
1476-
writer.WriteUInt32Packed((uint)m_ObservedObjects.Count);
1477-
1478-
for (int i = 0; i < m_ObservedObjects.Count; i++)
1466+
// Don't send any data over the wire if the host "connected"
1467+
using (var buffer = PooledNetworkBuffer.Get())
1468+
using (var writer = PooledNetworkWriter.Get(buffer))
14791469
{
1480-
var observedObject = m_ObservedObjects[i];
1481-
writer.WriteBool(observedObject.IsPlayerObject);
1482-
writer.WriteUInt64Packed(observedObject.NetworkObjectId);
1483-
writer.WriteUInt64Packed(observedObject.OwnerClientId);
1484-
1485-
NetworkObject parent = null;
1470+
writer.WriteUInt64Packed(clientId);
14861471

1487-
if (!observedObject.AlwaysReplicateAsRoot && observedObject.transform.parent != null)
1472+
if (NetworkConfig.EnableSceneManagement)
14881473
{
1489-
parent = observedObject.transform.parent.GetComponent<NetworkObject>();
1474+
writer.WriteUInt32Packed(NetworkSceneManager.CurrentSceneIndex);
1475+
writer.WriteByteArray(NetworkSceneManager.CurrentSceneSwitchProgressGuid.ToByteArray());
14901476
}
14911477

1492-
if (parent == null)
1493-
{
1494-
writer.WriteBool(false);
1495-
}
1496-
else
1497-
{
1498-
writer.WriteBool(true);
1499-
writer.WriteUInt64Packed(parent.NetworkObjectId);
1500-
}
1478+
writer.WriteSinglePacked(Time.realtimeSinceStartup);
1479+
writer.WriteUInt32Packed((uint)m_ObservedObjects.Count);
15011480

1502-
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
1481+
for (int i = 0; i < m_ObservedObjects.Count; i++)
15031482
{
1504-
writer.WriteUInt64Packed(observedObject.PrefabHash);
1505-
}
1506-
else
1507-
{
1508-
// Is this a scene object that we will soft map
1509-
writer.WriteBool(observedObject.IsSceneObject ?? true);
1483+
var observedObject = m_ObservedObjects[i];
1484+
writer.WriteBool(observedObject.IsPlayerObject);
1485+
writer.WriteUInt64Packed(observedObject.NetworkObjectId);
1486+
writer.WriteUInt64Packed(observedObject.OwnerClientId);
1487+
1488+
NetworkObject parent = null;
15101489

1511-
if (observedObject.IsSceneObject == null || observedObject.IsSceneObject.Value)
1490+
if (!observedObject.AlwaysReplicateAsRoot && observedObject.transform.parent != null)
15121491
{
1513-
writer.WriteUInt64Packed(observedObject.NetworkInstanceId);
1492+
parent = observedObject.transform.parent.GetComponent<NetworkObject>();
1493+
}
1494+
1495+
if (parent == null)
1496+
{
1497+
writer.WriteBool(false);
15141498
}
15151499
else
1500+
{
1501+
writer.WriteBool(true);
1502+
writer.WriteUInt64Packed(parent.NetworkObjectId);
1503+
}
1504+
1505+
if (!NetworkConfig.EnableSceneManagement || NetworkConfig.UsePrefabSync)
15161506
{
15171507
writer.WriteUInt64Packed(observedObject.PrefabHash);
15181508
}
1519-
}
1509+
else
1510+
{
1511+
// Is this a scene object that we will soft map
1512+
writer.WriteBool(observedObject.IsSceneObject ?? true);
15201513

1521-
if (observedObject.IncludeTransformWhenSpawning == null || observedObject.IncludeTransformWhenSpawning(clientId))
1522-
{
1523-
writer.WriteBool(true);
1524-
writer.WriteSinglePacked(observedObject.transform.position.x);
1525-
writer.WriteSinglePacked(observedObject.transform.position.y);
1526-
writer.WriteSinglePacked(observedObject.transform.position.z);
1514+
if (observedObject.IsSceneObject == null || observedObject.IsSceneObject.Value)
1515+
{
1516+
writer.WriteUInt64Packed(observedObject.NetworkInstanceId);
1517+
}
1518+
else
1519+
{
1520+
writer.WriteUInt64Packed(observedObject.PrefabHash);
1521+
}
1522+
}
15271523

1528-
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.x);
1529-
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.y);
1530-
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.z);
1531-
}
1532-
else
1533-
{
1534-
writer.WriteBool(false);
1535-
}
1524+
if (observedObject.IncludeTransformWhenSpawning == null || observedObject.IncludeTransformWhenSpawning(clientId))
1525+
{
1526+
writer.WriteBool(true);
1527+
writer.WriteSinglePacked(observedObject.transform.position.x);
1528+
writer.WriteSinglePacked(observedObject.transform.position.y);
1529+
writer.WriteSinglePacked(observedObject.transform.position.z);
1530+
1531+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.x);
1532+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.y);
1533+
writer.WriteSinglePacked(observedObject.transform.rotation.eulerAngles.z);
1534+
}
1535+
else
1536+
{
1537+
writer.WriteBool(false);
1538+
}
15361539

1537-
if (NetworkConfig.EnableNetworkVariable)
1538-
{
1539-
observedObject.WriteNetworkVariableData(buffer, clientId);
1540+
if (NetworkConfig.EnableNetworkVariable)
1541+
{
1542+
observedObject.WriteNetworkVariableData(buffer, clientId);
1543+
}
15401544
}
1541-
}
15421545

1543-
InternalMessageSender.Send(clientId, NetworkConstants.CONNECTION_APPROVED, NetworkChannel.Internal, buffer);
1544-
1545-
OnClientConnectedCallback?.Invoke(clientId);
1546+
InternalMessageSender.Send(clientId, NetworkConstants.CONNECTION_APPROVED, NetworkChannel.Internal, buffer);
1547+
}
15461548
}
15471549

1550+
OnClientConnectedCallback?.Invoke(clientId);
1551+
15481552
if (!createPlayerObject || (playerPrefabHash == null && NetworkConfig.PlayerPrefabHash == null))
15491553
{
15501554
return;
15511555
}
15521556

1553-
//Inform old clients of the new player
1554-
1557+
// Inform old clients of the new player
15551558
foreach (KeyValuePair<ulong, NetworkClient> clientPair in ConnectedClients)
15561559
{
15571560
if (clientPair.Key == clientId ||

0 commit comments

Comments
 (0)