Last active
June 29, 2016 15:26
-
-
Save glitchersgames/918dedbbb77c90d3afca16b2e1df2129 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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