private void OnData(DataStreamReader stream) { NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp); stream.ReadBytes(bytes); string recMsg = Encoding.ASCII.GetString(bytes.ToArray()); NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); switch (header.cmd) { case Commands.HANDSHAKE: HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg); Debug.Log("[Notice] Handshake message received!"); break; case Commands.PLAYER_UPDATE: //shouldnt happen Debug.LogError("[Error] Player update message received! Client shouldn't receive messages from clients."); break; case Commands.SERVER_UPDATE: ServerUpdateMsg suMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg); //Debug.Log("[Routine] Server update message received!"); UpdateRemotePlayers(suMsg.players); break; case Commands.PONG: if (bVerboseDebug) { //Debug.Log("[Routine] Pong message received!"); } break; case Commands.SERVER_HANDSHAKE: ServerHandshakeMsg shMsg = JsonUtility.FromJson <ServerHandshakeMsg>(recMsg); Debug.Log("[Notice] Handshake from server received!"); m_clientIDDict.Add(shMsg.clientID, localClientCharacterRef); //Add local character to player dictionary m_thisClientID = shMsg.clientID; //keep a reference to local player ID SpawnRemotePlayers(shMsg.players); //Spawn remote players StartCoroutine(UploadClientDataRoutine(m_clientUpdateInterval)); //Start routinely updating server with local cube character data break; case Commands.NEW_PLAYER: PlayerUpdateMsg puMSg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg); Debug.Log("[Notice] A new player has connected. (" + puMSg.player.clientID + ")"); SpawnRemotePlayer(puMSg.player); break; case Commands.PLAYER_DISCONNECT: PlayerIDMsg pdMSg = JsonUtility.FromJson <PlayerIDMsg>(recMsg); Debug.Log("[Notice] A player has disconnected. (" + pdMSg.clientID + ")"); RemoveRemotePlayer(pdMSg.clientID); break; default: Debug.LogError("[Error] Unrecognized message received!"); break; } }
private void UpdateClientsWithDisconnectedPlayer(ushort subjectClientID) { PlayerIDMsg disconnectedPlayerMsg; Debug.Log("[Notice] Sending disconnected player data to all connected clients..."); disconnectedPlayerMsg = new PlayerIDMsg(Commands.PLAYER_DISCONNECT); disconnectedPlayerMsg.clientID = subjectClientID; foreach (NetworkConnection client in m_Connections) { SendToClient(JsonUtility.ToJson(disconnectedPlayerMsg), client); } }