示例#1
0
    private List <Commands> DeserializeCommands(BitBuffer buffer)
    {
        var commandsList = new List <Commands>();

        try
        {
            var playerId           = buffer.GetInt();
            var storedCommandLists = buffer.GetInt();
            var clientData         = clients[playerId];
            for (var i = 0; i < storedCommandLists; i++)
            {
                var seq = buffer.GetInt();

                var commands = new Commands(
                    seq,
                    buffer.GetByte() > 0,
                    buffer.GetByte() > 0,
                    buffer.GetByte() > 0,
                    buffer.GetByte() > 0,
                    buffer.GetFloat());

                if (clientData.RecvCommandSeq < seq)
                {
                    commandsList.Add(commands);
                    clientData.RecvCommandSeq = seq;
                }
            }
        }
        catch (Exception ex)
        {
            Debug.Log("ERROR " + ex.StackTrace);
        }

        return(commandsList);
    }
示例#2
0
    public static PlayerInfo FromBytes(BitBuffer bitBuffer)
    {
        int          id           = bitBuffer.GetByte();
        int          health       = bitBuffer.GetByte();
        PositionInfo positionInfo = PositionInfo.FromBytes(bitBuffer);

        return(new PlayerInfo(id, health, positionInfo));
    }
示例#3
0
    public static AbilityResponse FromBytes(BitBuffer bitBuffer)
    {
        int          id            = bitBuffer.GetByte();
        AbilityType  type          = (AbilityType)bitBuffer.GetByte();
        PositionInfo startPosition = null;

        if (type == AbilityType.AUTOATTACK)
        {
            startPosition = PositionInfo.FromBytes(bitBuffer);
        }
        return(new AbilityResponse(id, type, startPosition, PositionInfo.FromBytes(bitBuffer)));
    }
示例#4
0
    public static PlayerInfoBroadcast FromBytes(BitBuffer bitBuffer)
    {
        int id    = bitBuffer.GetByte();
        int count = bitBuffer.GetByte();
        List <PlayerInfo> list = new List <PlayerInfo> ();

        for (int i = 0; i < count; i++)
        {
            PlayerInfo playerInfo = PlayerInfo.FromBytes(bitBuffer);
            list.Add(playerInfo);
        }
        return(new PlayerInfoBroadcast(id, list));
    }
示例#5
0
    private void SaveConnectedPlayersAttributes(BitBuffer buffer)
    {
        var connectedPlayerCount = buffer.GetByte();

        PlayerPrefs.SetInt("ConnectedPlayerCount", connectedPlayerCount);

        for (var i = 1; i <= connectedPlayerCount; i++)
        {
            var otherClientId   = buffer.GetInt();
            var otherClientName = buffer.GetString();
            var position        = new Vector3();
            var rotation        = new Quaternion();

            position.x = buffer.GetFloat();
            position.y = buffer.GetFloat();
            position.z = buffer.GetFloat();
            rotation.w = buffer.GetFloat();
            rotation.x = buffer.GetFloat();
            rotation.y = buffer.GetFloat();
            rotation.z = buffer.GetFloat();

            PlayerPrefs.SetInt($"ConnectedPlayer{i}Id", otherClientId);
            PlayerPrefs.SetString($"ConnectedPlayer{i}Name", otherClientName);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}PosX", position.x);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}PosY", position.y);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}PosZ", position.z);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}RotW", rotation.w);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}RotX", rotation.x);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}RotY", rotation.y);
            PlayerPrefs.SetFloat($"ConnectedPlayer{i}RotZ", rotation.z);
        }
    }
示例#6
0
    public static PacketType ServerDeserializeInput(BitBuffer buffer, List <Commands> commandsList,
                                                    List <Shot> shotsList, ShotBroadcast shotBroadcast, PlayerJoined p, out int playerDisconnect)
    {
        var messageType = buffer.GetByte();

        playerDisconnect = -1;
        if (messageType == (byte)PacketType.PLAYER_JOINED_ACK)
        {
            DeserializePlayerJoinedAck(p, buffer);
            return(PacketType.PLAYER_JOINED_ACK);
        }
        if (messageType == (byte)PacketType.COMMANDS)
        {
            DeserializeCommands(commandsList, buffer);
            return(PacketType.COMMANDS);
        }
        if (messageType == (byte)PacketType.PLAYER_SHOT)
        {
            DeserializeShot(shotsList, buffer);
            return(PacketType.PLAYER_SHOT);
        }
        if (messageType == (byte)PacketType.SHOT_BROADCAST_ACK)
        {
            DeserializeShotBroadcast(buffer, shotBroadcast); // SAME AS SHOTBROADCAST; BUT ITS AN ACK
            return(PacketType.SHOT_BROADCAST_ACK);
        }
        if (messageType == (byte)PacketType.PLAYER_DISCONNECT)
        {
            playerDisconnect = PlayerDisconnectDeserialize(buffer);
        }
        return(PacketType.PLAYER_DISCONNECT);
    }
示例#7
0
    private void DeserializeClientMessage(BitBuffer buffer, int clientId)
    {
        try
        {
            var messageType = (PacketType)buffer.GetByte();

            switch (messageType)
            {
            case PacketType.Commands:
                var commandsList = DeserializeCommands(buffer);
                ProcessReceivedCommands(commandsList, clientId);
                break;

            case PacketType.PlayerJoinedAck:
                DeserializePlayerJoinedAck(buffer);
                break;

            case PacketType.PlayerShot:
                var shotsList = DeserializePlayerShot(buffer);
                ProcessReceivedShots(shotsList, clientId);
                break;

            case PacketType.PlayerDisconnect:
                ProcessPlayerDisconnect(clientId);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        } catch (Exception ex)
        {
            Debug.Log("ERROR " + ex.StackTrace);
        }
    }
示例#8
0
 public static int[] PlayerConnectResponseDeserialize(BitBuffer buffer)
 {
     int[] resp = new int[2];
     buffer.GetByte();          // PlayerConnect
     resp[0] = buffer.GetInt(); // userID
     resp[1] = buffer.GetInt(); // srvPort
     return(resp);
 }
示例#9
0
    public static PlayerInput fromBytes(BitBuffer bitBuffer)
    {
        int       id   = bitBuffer.GetByte();
        InputType type = (InputType)bitBuffer.GetByte();

        switch (type)
        {
        case InputType.MOVEMENT:
            return(MovementInput.FromBytes(id, bitBuffer));

        case InputType.ABILITY:
            return(AbilityInput.FromBytes(id, bitBuffer));

        case InputType.START_GAME:
            return(GameStartInput.FromBytes(id, bitBuffer));
        }
        return(null);
    }
示例#10
0
    public static ResponsesContainer FromBytes(BitBuffer bitBuffer)
    {
        int size = bitBuffer.GetAvailableByteCount() - 1;

        byte[] bytes = new byte[size];
        for (int i = 0; i < bytes.Length; i++)
        {
            bytes[i] = bitBuffer.GetByte();
        }
        return(new ResponsesContainer(bytes));
    }
示例#11
0
        public void TestBitsInLastByte()
        {
            var b = new BitBuffer(new byte[1], 7);

            b.GetBool();
            for (int i = 0; i < 8; i++)
            {
                b = new BitBuffer(new byte[1], i);
                b.GetByte(8 - i);
            }
        }
示例#12
0
    public static PacketType ClientDeserialize(List <Snapshot> interpolationBuffer, PlayerJoined playerJoined, BitBuffer buffer,
                                               int displaySeq, CommandsList clientCommands, int cmdSeq, List <Shot> shots, int shotSeq,
                                               ShotBroadcast shotBroadcast, out int commandSnapshotAck, out int playerDisconnect)
    {
        commandSnapshotAck = -1;
        var messageType = buffer.GetByte();

        playerDisconnect = -1;
        if (messageType == (byte)PacketType.UPDATE_MESSAGE)
        {
            ClientDeserializeUpdate(interpolationBuffer, buffer, displaySeq, clientCommands, out commandSnapshotAck);
            return(PacketType.UPDATE_MESSAGE);
        }
        if (messageType == (byte)PacketType.PLAYER_JOINED)
        {
            PlayerJoinedDeserialize(playerJoined, buffer);
            return(PacketType.PLAYER_JOINED);
        }
        if (messageType == (byte)PacketType.COMMANDS_ACK_MESSAGE)
        {
            int receivedAckSequence = ClientDeserializeAck(buffer);
            clientCommands.Ack(receivedAckSequence);
            return(PacketType.COMMANDS_ACK_MESSAGE);
        }
        if (messageType == (byte)PacketType.SHOT_ACK)
        {
            int receivedShotAckSeq = ClientDeserializeShotAck(buffer);
            int count = 0;
            foreach (var shot in shots)
            {
                if (shot.Seq <= receivedShotAckSeq)
                {
                    count++;
                }
            }
            shots.RemoveRange(0, count);
            return(PacketType.SHOT_ACK);
        }

        if (messageType == (byte)PacketType.SHOT_BROADCAST)
        {
            DeserializeShotBroadcast(buffer, shotBroadcast);
            return(PacketType.SHOT_BROADCAST);
        }

        if (messageType == (byte)PacketType.PLAYER_DISCONNECT)
        {
            playerDisconnect = PlayerDisconnectDeserialize(buffer);
        }
        return(PacketType.PLAYER_DISCONNECT);
    }
示例#13
0
    private void Deserialize(BitBuffer buffer)
    {
        var messageType = (PacketType)buffer.GetByte();

        if (messageType == PacketType.PlayerJoinedResponse)
        {
            var recvClientId = buffer.GetInt();
            if (recvClientId == clientId)
            {
                SavePlayerAttributes(buffer);
                channel.Disconnect();
                SceneManager.LoadScene("Client Game");
            }
        }
    }
示例#14
0
    private ClientData DeserializeJoin(BitBuffer buffer)
    {
        PacketType messageType = (PacketType)buffer.GetByte();

        if (messageType != PacketType.Join)
        {
            throw new ArgumentException("Unknown message type received from client manager.");
        }

        var newClientData = new ClientData();

        newClientData.PlayerId   = buffer.GetInt();
        newClientData.PlayerName = buffer.GetString();

        return(newClientData);
    }
示例#15
0
    private void SavePlayerAttributes(BitBuffer buffer)
    {
        var clientPort     = buffer.GetInt();
        var serverPort     = buffer.GetInt();
        var clientTime     = buffer.GetFloat();
        var displaySeq     = buffer.GetInt();
        var minBufferElems = buffer.GetByte();
        var position       = new Vector3();
        var rotation       = new Quaternion();

        position.x = buffer.GetFloat();
        position.y = buffer.GetFloat();
        position.z = buffer.GetFloat();
        rotation.w = buffer.GetFloat();
        rotation.x = buffer.GetFloat();
        rotation.y = buffer.GetFloat();
        rotation.z = buffer.GetFloat();

        var health  = buffer.GetInt();
        var speed   = buffer.GetFloat();
        var gravity = buffer.GetFloat();

        PlayerPrefs.SetInt("ClientId", clientId);
        PlayerPrefs.SetInt("ClientPort", clientPort);
        PlayerPrefs.SetInt("ServerPort", serverPort);
        PlayerPrefs.SetFloat("ClientTime", clientTime);
        PlayerPrefs.SetInt("DisplaySequence", displaySeq);
        PlayerPrefs.SetInt("MinInterpolationBufferElements", minBufferElems);
        PlayerPrefs.SetFloat("ClientPosX", position.x);
        PlayerPrefs.SetFloat("ClientPosY", position.y);
        PlayerPrefs.SetFloat("ClientPosZ", position.z);
        PlayerPrefs.SetFloat("ClientRotW", rotation.w);
        PlayerPrefs.SetFloat("ClientRotX", rotation.x);
        PlayerPrefs.SetFloat("ClientRotY", rotation.y);
        PlayerPrefs.SetFloat("ClientRotZ", rotation.z);
        PlayerPrefs.SetInt("ClientHealth", health);
        PlayerPrefs.SetFloat("PlayerSpeed", speed);
        PlayerPrefs.SetFloat("Gravity", gravity);

        SaveConnectedPlayersAttributes(buffer);

        PlayerPrefs.Save();
    }
示例#16
0
    private void DeserializeSnapshot(BitBuffer buffer)
    {
        var recvFrameSeq = buffer.GetInt();

        if (recvFrameSeq < displaySeq)
        {
            return;                            // Check if received snapshot is old
        }
        var time        = buffer.GetFloat();
        var recvCmdSeq  = buffer.GetInt();
        var recvVelY    = buffer.GetFloat();
        var playerCount = buffer.GetByte();

        var positions = new Dictionary <int, Vector3>();
        var rotations = new Dictionary <int, Quaternion>();

        for (int i = 0; i < playerCount; i++)
        {
            var position = new Vector3();
            var rotation = new Quaternion();

            var playerId = buffer.GetInt();
            position.x = buffer.GetFloat();
            position.y = buffer.GetFloat();
            position.z = buffer.GetFloat();
            rotation.w = buffer.GetFloat();
            rotation.x = buffer.GetFloat();
            rotation.y = buffer.GetFloat();
            rotation.z = buffer.GetFloat();

            positions.Add(playerId, position);
            rotations.Add(playerId, rotation);

            if (playerId == clientId)
            {
                Conciliate(recvCmdSeq, position, recvVelY);
            }
        }

        var snapshot = new Snapshot(recvFrameSeq, time, positions, rotations);

        StoreSnapshot(snapshot, recvFrameSeq);
    }
示例#17
0
    private void DeserializeBuffer(BitBuffer buffer)
    {
        var messageType = (PacketType)buffer.GetByte();

        switch (messageType)
        {
        case PacketType.Snapshot:
            DeserializeSnapshot(buffer);
            break;

        case PacketType.CommandsAck:
        {
            var receivedAckSequence = DeserializeCommandAck(buffer);
            RemoveAckedCommands(receivedAckSequence);
            break;
        }

        case PacketType.PlayerJoined:
            DeserializePlayerJoined(buffer);
            break;

        case PacketType.PlayerShotAck:
            var rcvdShotSequence = DeserializeShotAck(buffer);
            RemoveAckedShots(rcvdShotSequence);
            break;

        case PacketType.PlayerShotBroadcast:
            DeserializeShotBroadcast(buffer);
            break;

        case PacketType.PlayerRespawn:
            DeserializePlayerRespawn(buffer);
            break;

        case PacketType.PlayerDisconnectBroadcast:
            DeserializePlayerDisconnectBroadcast(buffer);
            break;

        default:
            throw new ArgumentOutOfRangeException();
        }
    }
示例#18
0
    public static ServerResponse fromBytes(BitBuffer bitBuffer)
    {
        ResponseType type = (ResponseType)bitBuffer.GetByte();

        switch (type)
        {
        case ResponseType.PLAYER_UPDATE:
            return(PlayerInfoUpdate.FromBytes(bitBuffer));

        case ResponseType.ABILITY:
            return(AbilityResponse.FromBytes(bitBuffer));

        case ResponseType.NEW_PLAYER:
            return(NewPlayerEvent.FromBytes(bitBuffer));

        case ResponseType.PLAYER_INFO_BROADCAST:
            return(PlayerInfoBroadcast.FromBytes(bitBuffer));

        case ResponseType.RESPONSES_CONTAINER:
            return(ResponsesContainer.FromBytes(bitBuffer));
        }

        return(null);
    }
示例#19
0
 public static int PlayerConnectDeserialize(BitBuffer buffer)
 {
     buffer.GetByte(); // PlayerConnect
     return(buffer.GetInt());
 }
示例#20
0
 public static AbilityInput FromBytes(int id, BitBuffer bitBuffer)
 {
     return(new AbilityInput(id, (AbilityType)bitBuffer.GetByte(), PositionInfo.FromBytes(bitBuffer)));
 }
示例#21
0
    private void ProcessResponse(BitBuffer bitBuffer)
    {
        ServerResponse response = ServerResponse.fromBytes(bitBuffer);

        switch (response.GetResponseType())
        {
        case ResponseType.PLAYER_UPDATE: {
            PlayerInfoUpdate playerUpdate = (PlayerInfoUpdate)response;
            PlayerInfo       playerInfo   = playerUpdate.GetPlayerInfo();
            if (_players.ContainsKey(playerInfo.GetId()))
            {
                _players [playerInfo.GetId()].SetTargetPosition(playerInfo.GetPosition());
                _players [playerInfo.GetId()].SetHealth(playerInfo.GetHealth());
            }
            break;
        }

        case ResponseType.ABILITY: {
            AbilityResponse auto = (AbilityResponse)response;
            switch (auto.GetAbilityType())
            {
            case AbilityType.AUTOATTACK:
                SpawnAutoAttack(auto.GetId(), auto.GetStartPosition(), auto.GetPosition());
                break;

            case AbilityType.FREEZE:
                _players[auto.GetId()].SpawnFreeze(auto.GetPosition());
                break;

            case AbilityType.FLASH:
                _players[auto.GetId()].MoveTo(auto.GetPosition());
                _players[auto.GetId()].CancelMovement();
                break;

            case AbilityType.EXPLOSION:
                CreateExplosion(auto.GetPosition());
                break;
            }
            break;
        }

        case ResponseType.NEW_PLAYER: {
            NewPlayerEvent newPlayerEvent = (NewPlayerEvent)response;
            PlayerInfo     playerInfo     = newPlayerEvent.GetPlayerInfo();
            Player         player         = CreatePlayer(playerInfo);
            _players.Add(playerInfo.GetId(), player);
            break;
        }

        case ResponseType.PLAYER_INFO_BROADCAST: {
            PlayerInfoBroadcast playerInfoBroadcast = (PlayerInfoBroadcast)response;
            _localId = playerInfoBroadcast.GetId();
            foreach (PlayerInfo playerInfo in playerInfoBroadcast.getPlayersInfo())
            {
                Player player = CreatePlayer(playerInfo);
                _players.Add(playerInfo.GetId(), player);
            }
            break;
        }

        case ResponseType.RESPONSES_CONTAINER: {
            byte[]    responses       = ((ResponsesContainer)response).GetData();
            BitBuffer containerBuffer = new BitBuffer();
            containerBuffer.PutBytes(responses);
            containerBuffer.Flip();
            int totalResponses = containerBuffer.GetByte();
            for (int i = 0; i < totalResponses; i++)
            {
                ProcessResponse(containerBuffer);
            }
            break;
        }
        }
    }