Skip to content

Instantly share code, notes, and snippets.

@glitchersgames
Last active June 29, 2016 15:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save glitchersgames/918dedbbb77c90d3afca16b2e1df2129 to your computer and use it in GitHub Desktop.
Save glitchersgames/918dedbbb77c90d3afca16b2e1df2129 to your computer and use it in GitHub Desktop.
public class LobbyPlayer : NetworkLobbyPlayer
{
[SyncVar(hook="OnHasPlayerDefUpdated")]
public bool m_HasPlayerDef = false;
#endregion
private PlayerDef m_PlayerDef;
public static LobbyPlayer LocalPlayer { get; private set; }
#region Lifecycle
public override void OnStartServer()
{
base.OnStartServer();
NetworkServer.RegisterHandler( MessageType.ServerReceivePlayerDef, OnServerReceivePlayerDef );
NetworkServer.RegisterHandler( MessageType.ClientRequestPlayerDef, OnClientRequestPlayerDef );
}
public override void OnStartClient ()
{
base.OnStartClient ();
NetworkClient.allClients[0].RegisterHandler( MessageType.ClientReceivePlayerDef, OnClientReceivePlayerDef );
// if this client exists on the server already then hasPlayerDef could be true, so request their data
if( m_HasPlayerDef )
{
RequestPlayerDef();
}
}
public override void OnStartLocalPlayer ()
{
base.OnStartLocalPlayer ();
LocalPlayer = this;
SendCachedPlayerDefRequests(); // send any requests before we had a local player
SendPlayerDef( localPlayerDef );
}
#endregion
#region Request
// this must be static so we can access it from our local lobby player instance.
private static List<NetworkInstanceId> s_CachedRequestNetIds;
[Client]
private void RequestPlayerDef()
{
// host doesn't need to request. if the host doesn't have it, it'll come from the player once they have setup.
if( isServer == false )
{
if( LobbyPlayer.LocalPlayer == null )
{
// if we don't know our localNetId, keep hold of this request and send when we do know it.
if( s_CachedRequestNetIds == null )
{
s_CachedRequestNetIds = new List<NetworkInstanceId>();
}
s_CachedRequestNetIds.Add( netId );
}
else
{
SendPlayerDefRequestForNetId( netId );
}
}
}
private void SendCachedPlayerDefRequests()
{
if( s_CachedRequestNetIds != null )
{
foreach( NetworkInstanceId reqNetId in s_CachedRequestNetIds )
{
SendPlayerDefRequestForNetId( reqNetId );
}
s_CachedRequestNetIds.Clear();
}
}
private void SendPlayerDefRequestForNetId( NetworkInstanceId reqNetId )
{
NetworkClient.allClients[0].Send( MessageType.ClientRequestPlayerDef, new PlayerRequestPlayerDataMessage( LobbyPlayer.LocalPlayer.netId, reqNetId ) );
}
#endregion
#region Send
private void SendPlayerDef( PlayerDef playerDef )
{
NetworkClient.allClients[0].Send( MessageType.ServerReceivePlayerDef, new PlayerDefMessage( netId, playerDef ) );
}
private void OnServerReceivePlayerDef( NetworkMessage netMsg )
{
PlayerDefMessage playerDefMsg = netMsg.ReadMessage<PlayerDefMessage>();
GameObject sendingPlayerObject = NetworkServer.FindLocalObject( playerDefMsg.m_PlayerNetId );
LobbyPlayer sendingPlayer = sendingPlayerObject.GetComponent<LobbyPlayer>();
sendingPlayer.m_HasPlayerDef = true;
sendingPlayer.m_PlayerDef = playerDefMsg.CreatePlayerDef();;
}
private void OnClientRequestPlayerDef( NetworkMessage netMsg )
{
PlayerRequestPlayerDataMessage reqMsg = netMsg.ReadMessage<PlayerRequestPlayerDataMessage>();
NetworkInstanceId senderNetId = reqMsg.m_SenderNetId;
NetworkInstanceId subjectNetId = reqMsg.m_SubjectNetId;
GameObject subjectPlayerObject = NetworkServer.FindLocalObject( subjectNetId );
LobbyPlayer subjectPlayer = subjectPlayerObject.GetComponent<LobbyPlayer>();
NetworkUtil.SendToClientWithNetId( senderNetId, MessageType.ClientReceivePlayerDef, new PlayerDefMessage( subjectNetId, subjectPlayer.m_PlayerDef ) );
}
private void OnClientReceivePlayerDef( NetworkMessage netMsg )
{
PlayerDefMessage playerDefMsg = netMsg.ReadMessage<PlayerDefMessage>();
GameObject targetPlayerObject = ClientScene.FindLocalObject( playerDefMsg.m_PlayerNetId );
LobbyPlayer targetPlayer = targetPlayerObject.GetComponent<LobbyPlayer>();
targetPlayer.m_PlayerDef = playerDefMsg.CreatePlayerDef();
}
private void OnHasPlayerDefUpdated( bool hasDef )
{
m_HasPlayerDef = hasDef;
if( hasDef && isLocalPlayer == false )
{
RequestPlayerDef();
}
}
#endregion
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment