Example #1
0
    void OnData(DataStreamReader stream)
    {
        NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp);

        stream.ReadBytes(bytes);                                             //Get bytes
        string        recMsg = Encoding.ASCII.GetString(bytes.ToArray());    //convert bytes to JSON string
        NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); //convert JSON to c# class

        switch (header.cmd)
        {
        case Commands.HANDSHAKE:
            HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg);
            Debug.Log("Handshake message received!");
            break;

        case Commands.PLAYER_INTERNALID:
            PlayerUpdateMsg internalId = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("Got internalId from server");
            playerInfo.player.id      = internalId.player.id;
            playerInternalIdText.text = playerInfo.player.id;
            break;

        case Commands.PLAYER_UPDATE:
            PlayerUpdateMsg puMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            //Debug.Log("Player update message received!");
            Debug.Log("Got data from server, player Pos: " + puMsg.player.pos);
            break;

        case Commands.SERVER_UPDATE:
            ServerUpdateMsg suMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("Server update message received!");
            UpdateClientsInfo(suMsg);
            break;

        //To spawn existed players
        case Commands.SPAWN_EXISTED_PLAYERS:
            ServerUpdateMsg existedPlayerInfo = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("existed player info received!");
            SpawnExistedPlayer(existedPlayerInfo);
            break;

        //Spawn new player
        case Commands.SPAWN_NEW_PLAYER:
            PlayerUpdateMsg newPlayerInfo = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("new client info received!");
            SpawnNewPlayer(newPlayerInfo);
            break;

        //handle disconnected player
        case Commands.DISCONNECTED_PLAYER:
            DisconnectedPlayersMsg dpm = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg);
            Debug.Log("Disconnected player info recieved!");
            DeleteDisconnectPlayer(dpm);
            break;

        default:
            Debug.Log("Unrecognized message received!");
            break;
        }
    }
Example #2
0
    void OnData(DataStreamReader stream)
    {
        NativeArray <byte> bytes = new NativeArray <byte>(stream.Length, Allocator.Temp);

        stream.ReadBytes(bytes);                                             //Get bytes
        string        recMsg = Encoding.ASCII.GetString(bytes.ToArray());    //convert bytes to JSON string
        NetworkHeader header = JsonUtility.FromJson <NetworkHeader>(recMsg); //convert JSON to c# class

        switch (header.cmd)
        {
        case Commands.HANDSHAKE:
            HandshakeMsg hsMsg = JsonUtility.FromJson <HandshakeMsg>(recMsg);
            Debug.Log("Handshake message received!");
            break;

        case Commands.PLAYER_WHOAMI:
            PlayerUpdateMsg internalId = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("Got internalId from server");
            playerInfo.player.id = internalId.player.id;
            playerIDText.SetText(playerInfo.player.id);
            myIDLabel.SetText(playerInfo.player.id);
            break;

        case Commands.PLAYER_UPDATE:
            PlayerUpdateMsg puMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("Got data from server, player Pos: " + puMsg.player.pos);
            break;

        case Commands.SERVER_UPDATE:
            ServerUpdateMsg suMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("Server update message received!");
            UpdateClientsInfo(suMsg);
            break;

        case Commands.ALREADY_HERE_PLAYERS:
            ServerUpdateMsg alreadyHerePlayerInfo = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("existed player info received!");
            SpawnPlayersAlreadyHere(alreadyHerePlayerInfo);
            break;

        case Commands.SPAWN_NEW_PLAYER:
            PlayerUpdateMsg newPlayerMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("new client info received!");
            SpawnNewPlayer(newPlayerMsg);
            break;

        case Commands.DISCONNECTED_PLAYER:
            DisconnectedPlayersMsg dpMsg = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg);
            Debug.Log("Player disconnected :(");
            DeleteDisconnectPlayer(dpMsg);
            break;

        default:
            Debug.Log("Unrecognized message received!");
            break;
        }
    }
Example #3
0
 void DeleteDisconnectPlayer(DisconnectedPlayersMsg dcMsg)
 {
     for (int i = 0; i < dcMsg.disconnectedPlayers.Count; ++i)
     {
         if (connectedClientsDict.ContainsKey(dcMsg.disconnectedPlayers[i]))
         {
             Destroy(connectedClientsDict[dcMsg.disconnectedPlayers[i]]);
             connectedClientsDict.Remove(dcMsg.disconnectedPlayers[i]);
         }
     }
 }
Example #4
0
 void DeleteDisconnectPlayer(DisconnectedPlayersMsg data)
 {
     for (int i = 0; i < data.disconnectedPlayers.Count; ++i)
     {
         if (listOfClients.ContainsKey(data.disconnectedPlayers[i]))
         {
             Destroy(listOfClients[data.disconnectedPlayers[i]]);
             listOfClients.Remove(data.disconnectedPlayers[i]);
         }
     }
 }
    void AssertHeartbeatTime()
    {
        //Check for heartbeat time, if its > 10 seconds delete the client:

        //Create a new list for the deleted clients
        List <string> DroppedClientList = new List <string>();

        //loop through our heartbeat objects and compare the time in heartbeat
        //with the current time, if its > 10 seconds:
        foreach (KeyValuePair <string, float> item in heartbeat)
        {
            if (Time.time - item.Value >= 10f)
            {
                //Add the client to the list for deletion
                DroppedClientList.Add(item.Key);
            }
        }

        //If we have clients to be deleted:
        if (DroppedClientList.Count != 0)
        {
            //Remove the client from both our connected players and heartbeat
            //If you do not do this you will crash the server...
            for (int i = 0; i < DroppedClientList.Count; ++i)
            {
                PlayersConnected.Remove(DroppedClientList[i]);
                heartbeat.Remove(DroppedClientList[i]);
            }


            DisconnectedPlayersMsg DCMSG = new DisconnectedPlayersMsg();
            DCMSG.DROPPEDPLAYERLIST = DroppedClientList;

            // Send message to all clients
            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (DroppedClientList.Contains(m_Connections[i].InternalId.ToString()) == true)
                {
                    continue;
                }
                Assert.IsTrue(m_Connections[i].IsCreated);
                SendToClient(JsonUtility.ToJson(DCMSG), m_Connections[i]);
            }
        }
    }
    void HeartBeatCheck()
    {
        //Check heartBeat
        List <string> deleteList = new List <string>();

        foreach (KeyValuePair <string, float> element in clientsHeartBeat)
        {
            //If client does not send msg over 5seconds...
            if (Time.time - element.Value >= 5f)
            {
                Debug.Log(element.Key.ToString() + "heatbeat disconnected");
                deleteList.Add(element.Key);
            }
        }

        if (deleteList.Count != 0)
        {
            //Delete disconnected client from list
            for (int i = 0; i < deleteList.Count; ++i)
            {
                listOfClients.Remove(deleteList[i]);
                clientsHeartBeat.Remove(deleteList[i]);
            }

            DisconnectedPlayersMsg dpm = new DisconnectedPlayersMsg();
            dpm.disconnectedPlayers = deleteList;


            //Send message to all client
            for (int i = 0; i < m_Connections.Length; i++)
            {
                //If disconnected connection.. continue
                if (deleteList.Contains(m_Connections[i].InternalId.ToString()) == true)
                {
                    continue;
                }

                Assert.IsTrue(m_Connections[i].IsCreated); //only when it's true

                SendToClient(JsonUtility.ToJson(dpm), m_Connections[i]);
            }
        }
    }
    void checkForUpdate()
    {
        List <string> deleteList = new List <string>();

        foreach (KeyValuePair <string, float> element in heartbeat)
        {
            // If the client is gone for longer than 5 seconds
            if (Time.time - element.Value >= 5f)
            {
                Debug.Log(element.Key.ToString() + "stopped sending updates!");
                deleteList.Add(element.Key); // add them to a list of clients to delete from the list
            }
        }

        if (deleteList.Count != 0)
        {
            //Delete disconnected client from list
            for (int i = 0; i < deleteList.Count; ++i)
            {
                connectedClientsDict.Remove(deleteList[i]);
                heartbeat.Remove(deleteList[i]);
            }

            DisconnectedPlayersMsg dpMsg = new DisconnectedPlayersMsg();
            dpMsg.disconnectedPlayers = deleteList;

            // Send message to all clients
            for (int i = 0; i < m_Connections.Length; i++)
            {
                if (deleteList.Contains(m_Connections[i].InternalId.ToString()) == true)
                {
                    continue;
                }
                Assert.IsTrue(m_Connections[i].IsCreated);
                SendToClient(JsonUtility.ToJson(dpMsg), m_Connections[i]);
            }
        }
    }
    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("Handshake message received!");
            break;

        case Commands.GETMYID:
            PlayerUpdateMsg MyIdMessage = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("Got My ID");
            MyPlayerInformation.player.id = MyIdMessage.player.id;
            myID = MyPlayerInformation.player.id;
            break;

        case Commands.PLAYER_UPDATE:
            PlayerUpdateMsg IncomingMessage = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("Client Updated By Server");
            break;

        case Commands.SERVER_UPDATE:
            ServerUpdateMsg ServerUpdateMessage = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("Sent Server my Update");
            //Loop through players in the server update mssg
            for (int i = 0; i < ServerUpdateMessage.players.Count; ++i)
            {
                //if the player has an id matching i
                if (AllConnectedPlayers.ContainsKey(ServerUpdateMessage.players[i].id))
                {
                    //Change MY version of that players position and color to match the server
                    AllConnectedPlayers[ServerUpdateMessage.players[i].id].transform.position = ServerUpdateMessage.players[i].pos;
                    AllConnectedPlayers[ServerUpdateMessage.players[i].id].GetComponent <Renderer>().material.color = ServerUpdateMessage.players[i].color;

                    //if the player is flagged as dropped on the server, flag it as dropped for me.
                    if (ServerUpdateMessage.players[i].isDropped)
                    {
                        AllConnectedPlayers[ServerUpdateMessage.players[i].id].GetComponent <PlayerController>().isDropped = true;
                    }
                }            //However if the id matches my current client id
                else if (MyPlayerInformation.player.id == ServerUpdateMessage.players[i].id)
                {
                    //do the same stuff for just me.  ignore position as we do that on client side with input.
                    PlayerTransform.GetComponent <Renderer>().material.color = ServerUpdateMessage.players[i].color;
                    MyPlayerInformation.player.color = ServerUpdateMessage.players[i].color;
                }
            }
            break;

        case Commands.GETEXISITNGPLAYERS:
            ServerUpdateMsg ExistingPlayersMsg = JsonUtility.FromJson <ServerUpdateMsg>(recMsg);
            Debug.Log("existed player info received!");
            //Loop through the existing player list f rom the server
            for (int i = 0; i < ExistingPlayersMsg.players.Count; ++i)
            {
                //instantiate a cube for each entry
                GameObject ExistingPlayerCube = Instantiate(PlayerPrefab);
                //Set their id's in our list
                AllConnectedPlayers[ExistingPlayersMsg.players[i].id] = ExistingPlayerCube;
                //Set their position in our list as well.
                ExistingPlayerCube.transform.position = ExistingPlayersMsg.players[i].pos;
            }
            break;

        case Commands.ADDPLAYER:
            PlayerUpdateMsg newPlayerMsg = JsonUtility.FromJson <PlayerUpdateMsg>(recMsg);
            Debug.Log("new client info received!");
            //Instantiate a new cube
            GameObject NewPlayerCube = Instantiate(PlayerPrefab);
            //Add it to our list
            AllConnectedPlayers[newPlayerMsg.player.id] = NewPlayerCube;
            //Make sure to tag it as not being us.
            NewPlayerCube.GetComponent <PlayerController>().IsClient = false;
            break;

        case Commands.PLAYERDROPPED:
            DisconnectedPlayersMsg DroppedMessage = JsonUtility.FromJson <DisconnectedPlayersMsg>(recMsg);
            Debug.Log("Dropped Client");
            //Loop through the list of dropped clients
            for (int i = 0; i < DroppedMessage.DROPPEDPLAYERLIST.Count; ++i)
            {
                //If any of our players contains the id in the dropped list from server
                if (AllConnectedPlayers.ContainsKey(DroppedMessage.DROPPEDPLAYERLIST[i]))
                {
                    //Destroy that specific one on client.
                    Destroy(AllConnectedPlayers[DroppedMessage.DROPPEDPLAYERLIST[i]]);
                    //And Remove it from the our list on client.
                    AllConnectedPlayers.Remove(DroppedMessage.DROPPEDPLAYERLIST[i]);
                }
            }
            break;

        default:
            Debug.Log("Unrecognized message received!");
            break;
        }
    }