@@ -558,7 +558,7 @@ public void StopClient()
558
558
/// <summary>
559
559
/// Starts a Host
560
560
/// </summary>
561
- public SocketTasks StartHost ( Vector3 ? position = null , Quaternion ? rotation = null , bool ? createPlayerObject = null , ulong ? prefabHash = null , Stream payloadStream = null )
561
+ public SocketTasks StartHost ( )
562
562
{
563
563
if ( NetworkLog . CurrentLogLevel <= LogLevel . Developer )
564
564
{
@@ -594,24 +594,25 @@ public SocketTasks StartHost(Vector3? position = null, Quaternion? rotation = nu
594
594
IsClient = true ;
595
595
IsListening = true ;
596
596
597
- ulong hostClientId = NetworkConfig . NetworkTransport . ServerClientId ;
598
-
599
- ConnectedClients . Add ( hostClientId , new NetworkClient ( )
597
+ if ( NetworkConfig . ConnectionApproval )
600
598
{
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
+ }
605
609
606
- if ( ( createPlayerObject == null && NetworkConfig . CreatePlayerPrefab ) || ( createPlayerObject != null && createPlayerObject . Value ) )
610
+ HandleApproval ( ServerClientId , createPlayerObject , playerPrefabHash , true , position , rotation ) ;
611
+ } ) ;
612
+ }
613
+ else
607
614
{
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 ) ;
615
616
}
616
617
617
618
NetworkSpawnManager . ServerSpawnSceneObjectsOnStartSweep ( ) ;
@@ -1441,7 +1442,6 @@ internal void HandleApproval(ulong clientId, bool createPlayerObject, ulong? pla
1441
1442
// This packet is unreliable, but if it gets through it should provide a much better sync than the potentially huge approval message.
1442
1443
SyncTime ( ) ;
1443
1444
1444
-
1445
1445
if ( createPlayerObject )
1446
1446
{
1447
1447
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
1461
1461
}
1462
1462
}
1463
1463
1464
- using ( var buffer = PooledNetworkBuffer . Get ( ) )
1465
- using ( var writer = PooledNetworkWriter . Get ( buffer ) )
1464
+ if ( clientId != ServerClientId )
1466
1465
{
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 ) )
1479
1469
{
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 ) ;
1486
1471
1487
- if ( ! observedObject . AlwaysReplicateAsRoot && observedObject . transform . parent != null )
1472
+ if ( NetworkConfig . EnableSceneManagement )
1488
1473
{
1489
- parent = observedObject . transform . parent . GetComponent < NetworkObject > ( ) ;
1474
+ writer . WriteUInt32Packed ( NetworkSceneManager . CurrentSceneIndex ) ;
1475
+ writer . WriteByteArray ( NetworkSceneManager . CurrentSceneSwitchProgressGuid . ToByteArray ( ) ) ;
1490
1476
}
1491
1477
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 ) ;
1501
1480
1502
- if ( ! NetworkConfig . EnableSceneManagement || NetworkConfig . UsePrefabSync )
1481
+ for ( int i = 0 ; i < m_ObservedObjects . Count ; i ++ )
1503
1482
{
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 ;
1510
1489
1511
- if ( observedObject . IsSceneObject == null || observedObject . IsSceneObject . Value )
1490
+ if ( ! observedObject . AlwaysReplicateAsRoot && observedObject . transform . parent != null )
1512
1491
{
1513
- writer . WriteUInt64Packed ( observedObject . NetworkInstanceId ) ;
1492
+ parent = observedObject . transform . parent . GetComponent < NetworkObject > ( ) ;
1493
+ }
1494
+
1495
+ if ( parent == null )
1496
+ {
1497
+ writer . WriteBool ( false ) ;
1514
1498
}
1515
1499
else
1500
+ {
1501
+ writer . WriteBool ( true ) ;
1502
+ writer . WriteUInt64Packed ( parent . NetworkObjectId ) ;
1503
+ }
1504
+
1505
+ if ( ! NetworkConfig . EnableSceneManagement || NetworkConfig . UsePrefabSync )
1516
1506
{
1517
1507
writer . WriteUInt64Packed ( observedObject . PrefabHash ) ;
1518
1508
}
1519
- }
1509
+ else
1510
+ {
1511
+ // Is this a scene object that we will soft map
1512
+ writer . WriteBool ( observedObject . IsSceneObject ?? true ) ;
1520
1513
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
+ }
1527
1523
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
+ }
1536
1539
1537
- if ( NetworkConfig . EnableNetworkVariable )
1538
- {
1539
- observedObject . WriteNetworkVariableData ( buffer , clientId ) ;
1540
+ if ( NetworkConfig . EnableNetworkVariable )
1541
+ {
1542
+ observedObject . WriteNetworkVariableData ( buffer , clientId ) ;
1543
+ }
1540
1544
}
1541
- }
1542
1545
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
+ }
1546
1548
}
1547
1549
1550
+ OnClientConnectedCallback ? . Invoke ( clientId ) ;
1551
+
1548
1552
if ( ! createPlayerObject || ( playerPrefabHash == null && NetworkConfig . PlayerPrefabHash == null ) )
1549
1553
{
1550
1554
return ;
1551
1555
}
1552
1556
1553
- //Inform old clients of the new player
1554
-
1557
+ // Inform old clients of the new player
1555
1558
foreach ( KeyValuePair < ulong , NetworkClient > clientPair in ConnectedClients )
1556
1559
{
1557
1560
if ( clientPair . Key == clientId ||
0 commit comments