Ejemplo n.º 1
0
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            panelsManager.ShowMenuPanel();
        }

        if (Input.GetKeyDown(KeyCode.Space))
        {
            StartShooting();
        }

        if (Input.GetKeyUp(KeyCode.Space))
        {
            StopShooting();
        }

        switch (state)
        {
        case GameState.STOP:

            // Debug.LogError("Send Start Server from client");
            ClientNewPlayerMessage newPlayerMessage = new ClientNewPlayerMessage();
            if (c.Connected())
            {
                c.ClientSend(newPlayerMessage);
                state = GameState.START;
            }
            break;

        case GameState.START:



            break;

        case GameState.GAME:

            speed = joystick.InputVector * Time.deltaTime * 12;
            player.animator.SetBool("Walking", false);
            if (speed.magnitude > 0 && !player.died)
            {
                //player.transform.position += speed;
                Rigidbody2D playerRb2D = player.GetComponent <Rigidbody2D>();
                playerRb2D.MovePosition(playerRb2D.position + speed);
                player.SetRotation(joystick.InputVector);
                player.animator.SetBool("Walking", true);
            }

            movementElapsed += Time.deltaTime;
            shootingElapsed += Time.deltaTime;

            // Shooting
            if (player.shooting)
            {
                player.AnimateShooting(shootingElapsed);
                if (shootingElapsed >= player.frequency)
                {
                    shootingElapsed = shootingElapsed % player.frequency;
                    ClientShoot(playerId);
                }
            }

            // Movement
            if (movementElapsed >= GameManager.FREQUENCY)
            {
                movementElapsed = movementElapsed % GameManager.FREQUENCY;
                dungeonGeneration.HighlightRoom(player);
                if (sharingMovements)
                {
                    SendPosition(player.gameObject);
                }
                else
                {
                    sharingMovements = true;
                }
            }


            // Lerp server shared movements
            for (int i = 0; i < nbOfPlayers; i++)
            {
                Player  playerIndex        = players[i].GetComponent <Player>();
                Vector2 startServerPos     = startPlayersPositions[i];
                Vector2 endServerPos       = endPlayersPositions[i];
                float   startServerRot     = startPlayersRotations[i];
                float   endServerRot       = endPlayersRotations[i];
                float   timeStartedLerping = timesStartedLerping[i];

                if (i != playerId)
                {
                    float lerpPercentage = (Time.time - timeStartedLerping) / GameManager.FREQUENCY;
                    // Position
                    playerIndex.transform.position = Vector3.Lerp(startServerPos, endServerPos, lerpPercentage);
                    // Rotation of the visor
                    float lerpedRotation = Mathf.LerpAngle(startServerRot, endServerRot, lerpPercentage);
                    playerIndex.SetRotation(lerpedRotation);

                    // If we havent moved then we are not walking
                    if (Vector2.Distance(startServerPos, endServerPos) < 0.1f)
                    {
                        playerIndex.animator.SetBool("Walking", false);
                    }
                    else
                    {
                        playerIndex.animator.SetBool("Walking", true);
                    }

                    // Shooting
                    if (playerIndex.shooting)
                    {
                        playerIndex.AnimateShooting(shootingElapsed);
                        if (shootingElapsed >= playerIndex.frequency)
                        {
                            shootingElapsed = shootingElapsed % playerIndex.frequency;
                            ClientShoot(i);
                        }
                    }
                    else
                    {
                        playerIndex.StopShooting();
                    }
                }
            }

            // Lerp server shared monsters movement
            if (monstersTimesStartedLerping != null && monstersTimesStartedLerping.Length > 0)
            {
                for (int i = 0; i < startMonstersPositions.Length; i++)
                {
                    //Debug.Log("What do I have inside monsters ? " + spawner.monsters.transform.GetChild(i).gameObject.name);
                    if (spawner.monsters[i] != null)
                    {
                        GameObject monster            = spawner.monsters[i].gameObject;
                        Vector2    startServerPos     = startMonstersPositions[i];
                        Vector2    endServerPos       = endMonstersPositions[i];
                        float      timeStartedLerping = monstersTimesStartedLerping[i];

                        float lerpPercentage = (Time.time - timeStartedLerping) / GameManager.FREQUENCY;
                        //Position
                        monster.transform.position = Vector3.Lerp(startServerPos, endServerPos, lerpPercentage);
                    }
                }
            }

            break;
        }


        // Client read received messages
        //Debug.Log(c.received.type);
        switch (c.received.type)
        {
        case MessageType.NONE:
            break;

        case MessageType.SERVER_START_GAME:
        {
            panelsManager.ShowGamePanel();

            // Define player and camera only once at the start of the game
            player = players[playerId].GetComponent <Player>();

            player.client = this;

            // Set camera as a child of the player
            Camera.main.transform.parent = player.transform;

            player.isPlayed = true;

            // Set the healthbar of the client player
            player.healthBar       = healthBar;
            player.healthBar.value = player.health;

            state = GameState.GAME;
        }
        break;

        case MessageType.SERVER_SHARE_PLAYERS:
        {
            ServerSharePlayersMessage sharePlayersMessage = (ServerSharePlayersMessage)c.received;

            // The first message sets the player number
            if (!setPlayerId)
            {
                playerId    = sharePlayersMessage.playerId;
                setPlayerId = true;
                seed        = sharePlayersMessage.seed;
                dungeonGeneration.SetClient(this);
                dungeonGeneration.Generate(seed);
                spawner.seed = seed;
                spawner.SetClient(this);
                spawner.ClearMonsters();
                spawner.rooms = dungeonGeneration.rooms;
            }


            // Destroy old players
            for (int i = 0; i < nbOfPlayers; i++)
            {
                Destroy(players[i]);
                players[i] = null;
            }

            // Add new players
            nbOfPlayers = sharePlayersMessage.x.Length;

            for (int i = 0; i < nbOfPlayers; i++)
            {
                players[i] = Instantiate(playerPrefab, new Vector2(sharePlayersMessage.x[i], sharePlayersMessage.y[i]), Quaternion.identity);
                // Lobby
                playerPanels[i].SetActivePlayer(true);
            }
        }
        break;

        case MessageType.SERVER_SHARE_MOVEMENT:
        {
            ServerShareMovementMessage shareMovementsMessage = (ServerShareMovementMessage)c.received;

            for (int i = 0; i < shareMovementsMessage.x.Length; i++)
            {
                if (i != playerId)
                {
                    startPlayersPositions[i] = players[i].transform.position;
                    startPlayersRotations[i] = players[i].GetComponent <Player>().visorRotation;
                    endPlayersRotations[i]   = shareMovementsMessage.visorRotation[i];
                    endPlayersPositions[i]   = new Vector2(shareMovementsMessage.x[i], shareMovementsMessage.y[i]);
                    players[i].GetComponent <Player>().shooting = shareMovementsMessage.shooting[i];
                    timesStartedLerping[i] = Time.time;
                }
            }

            startMonstersPositions      = new Vector2[GameManager.MAX_MONSTERS];
            endMonstersPositions        = new Vector2[GameManager.MAX_MONSTERS];
            monstersTimesStartedLerping = new float[GameManager.MAX_MONSTERS];

            for (int i = 0; i < GameManager.MAX_MONSTERS; i++)
            {
                // If the monster exists set health and position from server
                if (spawner.monsters[i] != null)
                {
                    startMonstersPositions[i]      = spawner.monsters[i].transform.position;
                    endMonstersPositions[i]        = new Vector3(shareMovementsMessage.mx[i], shareMovementsMessage.my[i]);
                    spawner.monsters[i].health     = shareMovementsMessage.health[i];
                    monstersTimesStartedLerping[i] = Time.time;
                }
            }
        }
        break;

        case MessageType.SERVER_GO_TO_NEXT_ROOM:
        {
            //Debug.Log("Server go to next room");
            ServerGoToNextRoomMessage ssm = (ServerGoToNextRoomMessage)c.received;
            for (int i = 0; i < ssm.x.Length; i++)
            {
                players[i].transform.position = new Vector3(ssm.x[i], ssm.y[i], 0);
            }

            spawner.ClearMonsters();
            dungeonGeneration.Clear();
            dungeonGeneration.Generate(ssm.seed);
        }
        break;

        case MessageType.SERVER_SHARE_MONSTERS_SPAWN:
        {
            ServerShareMonstersSpawnMessage ssmsm = (ServerShareMonstersSpawnMessage)c.received;
            // If I'm not the one that has sent the request to spawn monsters
            if (ssmsm.playerId != playerId)
            {
                //spawner.SpawnMonsters(ssmsm.roomId, ssmsm.seed);
                if (ssmsm.teleport)
                {
                    Player  player           = players[ssmsm.playerId].GetComponent <Player>();
                    Vector2 teleportPosition = dungeonGeneration.GetPositionByPlayerDirection(playerId, ssmsm.roomId, player.GetVisorDirection());
                    players[playerId].transform.position = teleportPosition;
                }
            }
        }
        break;

        case MessageType.SERVER_DIE:
        {
            ServerDieMessage sdm = (ServerDieMessage)c.received;

            if (sdm.playerId != playerId)
            {
                players[sdm.playerId].GetComponent <Player>().SetDied();
            }
        }
        break;
        }
        c.received.OnRead();
    }