@@ -69,9 +69,8 @@ public override void OnNetworkSpawn()
69
69
SetWinState ( WinState . Invalid ) ;
70
70
71
71
NetworkManager . OnClientDisconnectCallback += OnClientDisconnect ;
72
- NetworkManager . SceneManager . OnSceneEvent += OnClientSceneChanged ;
73
-
74
- DoInitialSpawnIfPossible ( ) ;
72
+ NetworkManager . SceneManager . OnLoadEventCompleted += OnLoadEventCompleted ;
73
+ NetworkManager . SceneManager . OnSynchronizeComplete += OnSynchronizeComplete ;
75
74
76
75
SessionManager < SessionPlayerData > . Instance . OnSessionStarted ( ) ;
77
76
m_Subscription = m_LifeStateChangedEventMessageSubscriber . Subscribe ( OnLifeStateChangedEventMessage ) ;
@@ -83,18 +82,29 @@ public override void OnDestroy()
83
82
m_Subscription ? . Dispose ( ) ;
84
83
}
85
84
86
- private bool DoInitialSpawnIfPossible ( )
85
+ void OnSynchronizeComplete ( ulong clientId )
87
86
{
88
- if ( m_ConnectionManager . AreAllClientsInServerScene ( ) && ! InitialSpawnDone )
87
+ if ( InitialSpawnDone &&
88
+ ! PlayerServerCharacter . GetPlayerServerCharacter ( clientId ) )
89
+ {
90
+ //somebody joined after the initial spawn. This is a Late Join scenario. This player may have issues
91
+ //(either because multiple people are late-joining at once, or because some dynamic entities are
92
+ //getting spawned while joining. But that's not something we can fully address by changes in
93
+ //ServerBossRoomState.
94
+ SpawnPlayer ( clientId , true ) ;
95
+ }
96
+ }
97
+
98
+ void OnLoadEventCompleted ( string sceneName , LoadSceneMode loadSceneMode , List < ulong > clientsCompleted , List < ulong > clientsTimedOut )
99
+ {
100
+ if ( ! InitialSpawnDone && loadSceneMode == LoadSceneMode . Single )
89
101
{
90
102
InitialSpawnDone = true ;
91
103
foreach ( var kvp in NetworkManager . ConnectedClients )
92
104
{
93
105
SpawnPlayer ( kvp . Key , false ) ;
94
106
}
95
- return true ;
96
107
}
97
- return false ;
98
108
}
99
109
100
110
void OnClientDisconnect ( ulong clientId )
@@ -113,37 +123,11 @@ IEnumerator WaitToCheckForGameOver()
113
123
CheckForGameOver ( ) ;
114
124
}
115
125
116
- public void OnClientSceneChanged ( SceneEvent sceneEvent )
117
- {
118
- if ( sceneEvent . SceneEventType != SceneEventType . LoadComplete ) return ;
119
-
120
- var clientId = sceneEvent . ClientId ;
121
- var sceneIndex = SceneManager . GetSceneByName ( sceneEvent . SceneName ) . buildIndex ;
122
- int serverScene = UnityEngine . SceneManagement . SceneManager . GetActiveScene ( ) . buildIndex ;
123
- if ( sceneIndex == serverScene )
124
- {
125
- Debug . Log ( $ "client={ clientId } now in scene { sceneIndex } , server_scene={ serverScene } , all players in server scene={ m_ConnectionManager . AreAllClientsInServerScene ( ) } ") ;
126
-
127
- bool didSpawn = DoInitialSpawnIfPossible ( ) ;
128
-
129
- if ( ! didSpawn && InitialSpawnDone &&
130
- ! PlayerServerCharacter . GetPlayerServerCharacters ( ) . Find (
131
- player => player . OwnerClientId == clientId ) )
132
- {
133
- //somebody joined after the initial spawn. This is a Late Join scenario. This player may have issues
134
- //(either because multiple people are late-joining at once, or because some dynamic entities are
135
- //getting spawned while joining. But that's not something we can fully address by changes in
136
- //ServerBossRoomState.
137
- SpawnPlayer ( clientId , true ) ;
138
- }
139
-
140
- }
141
- }
142
-
143
126
public override void OnNetworkDespawn ( )
144
127
{
145
128
NetworkManager . OnClientDisconnectCallback -= OnClientDisconnect ;
146
- NetworkManager . SceneManager . OnSceneEvent -= OnClientSceneChanged ;
129
+ NetworkManager . SceneManager . OnLoadEventCompleted -= OnLoadEventCompleted ;
130
+ NetworkManager . SceneManager . OnSynchronizeComplete -= OnSynchronizeComplete ;
147
131
m_Subscription ? . Dispose ( ) ;
148
132
}
149
133
0 commit comments