Skip to content

Commit

Permalink
feat: adding OnPlayerSceneReady event
Browse files Browse the repository at this point in the history
Adding event that is called when a client replies with Scene Ready
  • Loading branch information
James-Frowen committed Sep 8, 2021
1 parent 5dade34 commit e59c93c
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 20 deletions.
7 changes: 7 additions & 0 deletions Assets/Mirage/Runtime/INetworkSceneManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ public enum SceneOperation : byte
/// </summary>
[Serializable] public class SceneChangeEvent : UnityEvent<string, SceneOperation> { }

[Serializable] public class PlayerSceneChangeEvent : UnityEvent<INetworkPlayer> { }

public interface INetworkSceneManager
{
/// <summary>
Expand All @@ -41,6 +43,11 @@ public interface INetworkSceneManager
/// </summary>
SceneChangeEvent OnServerFinishedSceneChange { get; }

/// <summary>
/// Event fires On the server, after Client sends <see cref="ReadyMessage"/> to the server
/// </summary>
PlayerSceneChangeEvent OnPlayerSceneReady { get; }

/// <summary>
/// Allows server to fully load in a new scene and override current active scene.
/// </summary>
Expand Down
32 changes: 32 additions & 0 deletions Assets/Mirage/Runtime/NetworkSceneManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@ public class NetworkSceneManager : MonoBehaviour, INetworkSceneManager
[FormerlySerializedAs("ServerSceneChanged")]
[SerializeField] SceneChangeEvent _onServerFinishedSceneChange = new SceneChangeEvent();

[SerializeField] PlayerSceneChangeEvent _onPlayerSceneReady = new PlayerSceneChangeEvent();

/// <summary>
/// Event fires when the Client starts changing scene.
/// </summary>
Expand All @@ -104,6 +106,11 @@ public class NetworkSceneManager : MonoBehaviour, INetworkSceneManager
/// </summary>
public SceneChangeEvent OnServerFinishedSceneChange => _onServerFinishedSceneChange;

/// <summary>
/// Event fires On the server, after Client sends <see cref="ReadyMessage"/> to the server
/// </summary>
public PlayerSceneChangeEvent OnPlayerSceneReady => _onPlayerSceneReady;

#endregion

#region Unity Methods
Expand All @@ -118,6 +125,7 @@ public virtual void Start()

if (Server != null)
{
Server.Started.AddListener(RegisterServerMessages);
Server.Authenticated.AddListener(OnServerAuthenticated);
Server.Disconnected.AddListener(OnServerPlayerDisconnected);
}
Expand All @@ -129,7 +137,11 @@ public virtual void OnDestroy()
Client.Started.RemoveListener(RegisterClientMessages);

if (Server != null)
{
Server.Started.RemoveListener(RegisterServerMessages);
Server.Authenticated.RemoveListener(OnServerAuthenticated);
Server.Disconnected.RemoveListener(OnServerPlayerDisconnected);
}
}

#endregion
Expand Down Expand Up @@ -319,6 +331,14 @@ public void SetSceneIsReady()

#region Server Side

/// <summary>
/// Register incoming client messages.
/// </summary>
private void RegisterServerMessages()
{
Server.MessageHandler.RegisterHandler<SceneReadyMessage>(HandlePlayerSceneReady);
}

/// <summary>
/// Allows server to fully load new scene or additive load in another scene.
/// </summary>
Expand Down Expand Up @@ -497,6 +517,18 @@ protected internal virtual void OnServerPlayerDisconnected(INetworkPlayer discon
}
}

/// <summary>
/// default ready handler.
/// </summary>
/// <param name="player"></param>
/// <param name="msg"></param>
void HandlePlayerSceneReady(INetworkPlayer player, SceneReadyMessage msg)
{
if (logger.LogEnabled()) logger.Log("Default handler for ready message from " + player);
player.SceneIsReady = true;
OnPlayerSceneReady.Invoke(player);
}

/// <summary>
/// Marks all connected clients as no longer ready.
/// <para>
Expand Down
25 changes: 5 additions & 20 deletions Assets/Mirage/Runtime/ServerObjectManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,13 @@ public void Start()
if (NetworkSceneManager != null)
{
NetworkSceneManager.OnServerFinishedSceneChange.AddListener(OnFinishedSceneChange);
NetworkSceneManager.OnPlayerSceneReady.AddListener(SpawnVisibleObjects);
}
}
}

internal void RegisterMessageHandlers()
{
Server.MessageHandler.RegisterHandler<SceneReadyMessage>(OnClientReadyMessage);
Server.MessageHandler.RegisterHandler<ServerRpcMessage>(OnServerRpcMessage);
}

Expand Down Expand Up @@ -200,7 +200,7 @@ public void ReplaceCharacter(INetworkPlayer player, NetworkIdentity identity, bo
// controller.
//
// IMPORTANT: do this in AddCharacter & ReplaceCharacter!
SpawnObserversForConnection(player);
SpawnVisibleObjectForPlayer(player);

if (logger.LogEnabled()) logger.Log($"Replacing playerGameObject object netId: {identity.NetId} asset ID {identity.AssetId}");

Expand All @@ -210,7 +210,7 @@ public void ReplaceCharacter(INetworkPlayer player, NetworkIdentity identity, bo
previousPlayer.RemoveClientAuthority();
}

void SpawnObserversForConnection(INetworkPlayer player)
void SpawnVisibleObjectForPlayer(INetworkPlayer player)
{
if (logger.LogEnabled()) logger.Log($"Checking Observers on {Server.World.SpawnedIdentities.Count} objects for player: {player}");

Expand Down Expand Up @@ -297,7 +297,7 @@ public void AddCharacter(INetworkPlayer player, NetworkIdentity identity)
Server.LocalClient.Player.Identity = identity;
}

// set ready if not set yet
// spawn any new visible scene objects
SpawnVisibleObjects(player);

if (logger.LogEnabled()) logger.Log("Adding new playerGameObject object netId: " + identity.NetId + " asset ID " + identity.AssetId);
Expand Down Expand Up @@ -660,24 +660,9 @@ public void SpawnVisibleObjects(INetworkPlayer player)
{
if (logger.LogEnabled()) logger.Log("SetClientReadyInternal for conn:" + player);

// set ready
player.SceneIsReady = true;

// client is ready to start spawning objects
if (player.Identity != null)
SpawnObserversForConnection(player);
}


/// <summary>
/// default ready handler.
/// </summary>
/// <param name="player"></param>
/// <param name="msg"></param>
void OnClientReadyMessage(INetworkPlayer player, SceneReadyMessage msg)
{
if (logger.LogEnabled()) logger.Log("Default handler for ready message from " + player);
SpawnVisibleObjects(player);
SpawnVisibleObjectForPlayer(player);
}
}
}

0 comments on commit e59c93c

Please sign in to comment.