Пример #1
0
    public void HandleIncomingMessage(Message msg)
    {
        switch (msg.GetNetworkMessageType())
        {
        case NetworkMessageType.Authenticate:
            AuthenticateMessage mA = msg as AuthenticateMessage;
            client.InitClient(mA.ClientId, "This is Client \n Id:" + mA.ClientId);
            break;

        case NetworkMessageType.Transform:

            TransformMessage transformMsg = msg as TransformMessage;
            if (!client.IsClientsCharacterCreated)
            {
                client.CreateClientsCharacter(transformMsg);
            }
            else
            {
                if (transformMsg.AcknowledgmentId != -1)
                {
                    int acknoledgmentIdx = unAcknowledgedInputRequests.
                                           FindIndex(it => it.RequestId == transformMsg.AcknowledgmentId);
                    if (acknoledgmentIdx != -1)
                    {
                        /* Removes this unacknowledged message and all that came before */
                        unAcknowledgedInputRequests.RemoveRange(0, acknoledgmentIdx + 1);

                        /* Peform position prediction based on last acknowledged position */
                        lastAcknowledgedPosition = transformMsg.Position.Vect3;
                        Vector3 newPosBasedOnAck = new Vector3(lastAcknowledgedPosition.x,
                                                               lastAcknowledgedPosition.y, lastAcknowledgedPosition.z);
                        foreach (InputMessage inputMsg in unAcknowledgedInputRequests)
                        {
                            newPosBasedOnAck += client.GetPositionChangeBasedOnInput(inputMsg);
                        }
                        client.SlowlyUpdateCharactersPosition(newPosBasedOnAck);
                    }
                }
                else
                {
                    client.UpdateCharactersTransform(transformMsg);
                }
            }

            break;

        case NetworkMessageType.MultipleTransforms:

            MultipleTranformMessage multipleTransfMsg = msg as MultipleTranformMessage;
            /* Update other player characters */
            otherPlayerCharManager.UpdateOtherCharPosition(multipleTransfMsg);

            break;

        case NetworkMessageType.Disconnect:
            otherPlayerCharManager.DespawnDisconnectedPlayer(msg as DisconnectMessage);
            break;
        }
    }
 public void UpdateOtherCharPosition(MultipleTranformMessage multipleTransfMsg)
 {
     foreach (TransformMessage transformMsg in multipleTransfMsg.AllTransformMessages)
     {
         int keyIndex = allOtherCharacters.FindIndex(it => it.ClientId == transformMsg.ReceiverId);
         if (keyIndex > -1)
         {
             UpdateOtherCharacterPosition(transformMsg);
         }
         else
         {
             CreateOtherPlayerCharacter(transformMsg);
         }
     }
 }
    public void SendClientPosInfoOfAllOtherPlayers(ServerNetworkManager servNetworkManager, int connectionId)
    {
        /* Send client all TransformMessages about all other player characters */

        List <TransformMessage> allCharcterPositions = new List <TransformMessage>();

        foreach (Character playerCharacter in allCharacters)
        {
            if (playerCharacter.ClientId != connectionId)
            {
                TransformMessage msg = new TransformMessage(playerCharacter.ClientId);
                msg.Position.Vect3      = playerCharacter.CharacterObj.transform.position;
                msg.Rotation.Quaternion = playerCharacter.CharacterObj.transform.rotation;
                msg.Scale.Vect3         = playerCharacter.CharacterObj.transform.localScale;
                allCharcterPositions.Add(msg);
            }
        }
        MultipleTranformMessage multipleTransfMsg = new MultipleTranformMessage(allCharcterPositions.ToArray());

        servNetworkManager.SendNetworkReliableMessage(multipleTransfMsg, connectionId);
    }
    public void SendAllPlayersAllOtherPlayerPostions(ServerNetworkManager servNetworkManger)
    {
        foreach (Character character in allCharacters)
        {
            Vector3 playerPos = character.CharacterObj.transform.position;
            character.LastSentPosition = new Vector3(playerPos.x, playerPos.y, playerPos.z);

            /* Send inform this characters client about all other characters positions */
            List <Character>        allOtherCharacters = allCharacters.FindAll(it => it.ClientId != character.ClientId);
            List <TransformMessage> allTranformMsg     = new List <TransformMessage>();
            foreach (Character otherCharacter in allOtherCharacters)
            {
                TransformMessage transfMsg = new TransformMessage(otherCharacter.ClientId);
                transfMsg.Position.Vect3      = otherCharacter.CharacterObj.transform.position;
                transfMsg.Scale.Vect3         = otherCharacter.CharacterObj.transform.localScale;
                transfMsg.Rotation.Quaternion = otherCharacter.CharacterObj.transform.rotation;
                allTranformMsg.Add(transfMsg);
                otherCharacter.LastSentPosition = new Vector3(transfMsg.Position.X, transfMsg.Position.Y, transfMsg.Position.Z);
            }
            MultipleTranformMessage multipleTransfMsg = new MultipleTranformMessage(allTranformMsg.ToArray());
            servNetworkManger.SendNetworkUnreliableMessage(multipleTransfMsg, character.ClientId);
        }
    }