Skip to content

Commit 80fe462

Browse files
committed
simplifying initial spawn logic
* Removed use of clientSceneMap * Replaced with OnLoadEventCompleted and OnSynchronizeComplete callbacks
1 parent e30c8f9 commit 80fe462

File tree

2 files changed

+19
-73
lines changed

2 files changed

+19
-73
lines changed

Assets/BossRoom/Scripts/Gameplay/ConnectionManagement/ConnectionManager.cs

Lines changed: 0 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -75,18 +75,6 @@ public class ConnectionManager : MonoBehaviour
7575
LocalLobby m_LocalLobby;
7676
IPublisher<ConnectionEventMessage> m_ConnectionEventPublisher;
7777

78-
79-
/// <summary>
80-
/// Keeps a list of what clients are in what scenes.
81-
/// </summary>
82-
Dictionary<ulong, int> m_ClientSceneMap = new Dictionary<ulong, int>();
83-
84-
/// <summary>
85-
/// The active server scene index.
86-
/// </summary>
87-
static int ServerScene => SceneManager.GetActiveScene().buildIndex;
88-
89-
9078
[Inject]
9179
void InjectDependencies(ProfileManager profileManager, LobbyServiceFacade lobbyServiceFacade, LocalLobby localLobby, IPublisher<ConnectionEventMessage> connectionEventPublisher)
9280
{
@@ -127,21 +115,6 @@ void OnDestroy()
127115

128116
}
129117

130-
public void OnClientSceneChanged(ulong clientId, int sceneIndex)
131-
{
132-
m_ClientSceneMap[clientId] = sceneIndex;
133-
}
134-
135-
public bool AreAllClientsInServerScene()
136-
{
137-
foreach (var kvp in m_ClientSceneMap)
138-
{
139-
if (kvp.Value != ServerScene) { return false; }
140-
}
141-
142-
return true;
143-
}
144-
145118
public void ChangeState(ConnectionStateType newState)
146119
{
147120
Debug.Log(newState);
@@ -160,16 +133,6 @@ void OnServerStarted()
160133
//The "BossRoom" server always advances to CharSelect immediately on start. Different games
161134
//may do this differently.
162135
SceneLoaderWrapper.Instance.LoadScene("CharSelect", useNetworkSceneManager: true);
163-
164-
NetworkManager.SceneManager.OnSceneEvent += SceneManagerOnOnSceneEvent;
165-
}
166-
167-
void SceneManagerOnOnSceneEvent(SceneEvent sceneEvent)
168-
{
169-
// only processing single player finishing loading events
170-
if (sceneEvent.SceneEventType != SceneEventType.LoadComplete) return;
171-
172-
OnClientSceneChanged(sceneEvent.ClientId, SceneManager.GetSceneByName(sceneEvent.SceneName).buildIndex);
173136
}
174137

175138
void OnClientDisconnectCallback(ulong clientId)
@@ -225,7 +188,6 @@ public bool StartHostIp(string playerName, string ipaddress, int port)
225188
public void RequestShutdown()
226189
{
227190
m_Logics[m_CurrentState].OnUserRequestedShutdown();
228-
m_ClientSceneMap.Clear();
229191
}
230192

231193
public void OnServerShutdown()

Assets/BossRoom/Scripts/Gameplay/Server/State/ServerBossRoomState.cs

Lines changed: 19 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,8 @@ public override void OnNetworkSpawn()
6969
SetWinState(WinState.Invalid);
7070

7171
NetworkManager.OnClientDisconnectCallback += OnClientDisconnect;
72-
NetworkManager.SceneManager.OnSceneEvent += OnClientSceneChanged;
73-
74-
DoInitialSpawnIfPossible();
72+
NetworkManager.SceneManager.OnLoadEventCompleted += OnLoadEventCompleted;
73+
NetworkManager.SceneManager.OnSynchronizeComplete += OnSynchronizeComplete;
7574

7675
SessionManager<SessionPlayerData>.Instance.OnSessionStarted();
7776
m_Subscription = m_LifeStateChangedEventMessageSubscriber.Subscribe(OnLifeStateChangedEventMessage);
@@ -83,18 +82,29 @@ public override void OnDestroy()
8382
m_Subscription?.Dispose();
8483
}
8584

86-
private bool DoInitialSpawnIfPossible()
85+
void OnSynchronizeComplete(ulong clientId)
8786
{
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)
89101
{
90102
InitialSpawnDone = true;
91103
foreach (var kvp in NetworkManager.ConnectedClients)
92104
{
93105
SpawnPlayer(kvp.Key, false);
94106
}
95-
return true;
96107
}
97-
return false;
98108
}
99109

100110
void OnClientDisconnect(ulong clientId)
@@ -113,37 +123,11 @@ IEnumerator WaitToCheckForGameOver()
113123
CheckForGameOver();
114124
}
115125

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-
143126
public override void OnNetworkDespawn()
144127
{
145128
NetworkManager.OnClientDisconnectCallback -= OnClientDisconnect;
146-
NetworkManager.SceneManager.OnSceneEvent -= OnClientSceneChanged;
129+
NetworkManager.SceneManager.OnLoadEventCompleted -= OnLoadEventCompleted;
130+
NetworkManager.SceneManager.OnSynchronizeComplete -= OnSynchronizeComplete;
147131
m_Subscription?.Dispose();
148132
}
149133

0 commit comments

Comments
 (0)