private void StartHammering()
 {
     hammerDirection = slamDirection;
     propelTimer     = Utility.StartTimer(timeBeforePropelling);
     hammerState     = HammerSteps.GOING;
     SoundManager._instance.PlaySound(SoundManager.SoundList.HAND_MOVEMENT);
     CmdStartHammering(slamDirection);
 }
 private void RpcStartHammering(Vector2 argSlamDirection)
 {
     if (!isLocalPlayer)
     {
         hammerDirection  = argSlamDirection;
         oldSlamDirection = argSlamDirection;
         propelTimer      = Utility.StartTimer(timeBeforePropelling);
         hammerState      = HammerSteps.GOING;
     }
 }
    public void SetupStart()
    {
        hammerState = HammerSteps.IDLE;
        jump        = false;

        rigid  = GetComponent <Rigidbody2D>();
        sprite = GetComponent <SpriteRenderer>();
        UpdateSpawnPosition();

        if (isLocalPlayer)
        {
            Camera.main.GetComponent <CameraBehavior>().player = gameObject;
            GameManager._instance.localPlayer = this;
        }

        flag = null;

        OnChangeName(playerName);
        OnChangeTeam(playerTeam);
        OnChangeSkin(playerSkin);
    }
    private void HammerSlam()
    {
        switch (hammerState)
        {
        case HammerSteps.GOING:
            if (Utility.IsOver(propelTimer))
            {
                hammerState = HammerSteps.SLAMMING;
            }
            else
            {
                float dist = hammerCurve.Evaluate(1 - (Utility.GetTimerRemainingTime(propelTimer) / timeBeforePropelling));
                propellingObj.transform.localPosition = hammerDirection * dist;
            }
            break;

        case HammerSteps.SLAMMING:
            hammerState = HammerSteps.RETURNING;
            if (isServer)
            {
                List <GameObject> players = propellingObj.GetComponent <PropellingBehavior>().GetTouchingPlayers();

                // To propell the player a bit in height.
                if (Mathf.Approximately(hammerDirection.y, 0.0f))
                {
                    hammerDirection.y = 0.3f;
                }

                // Propell all the players touched
                foreach (GameObject player in players)
                {
                    player.GetComponent <LocalPlayerController>().CmdGetHit(hammerDirection * force);
                }
            }
            propelTimer = Utility.StartTimer(timeBeforePropelling);
            break;

        case HammerSteps.RETURNING:
            if (Utility.IsOver(propelTimer))
            {
                hammerState = HammerSteps.IDLE;
            }
            else
            {
                float dist = hammerCurve.Evaluate(Utility.GetTimerRemainingTime(propelTimer) / timeBeforePropelling);
                propellingObj.transform.localPosition = hammerDirection * dist;
            }
            break;

        case HammerSteps.IDLE:
            propellingObj.transform.localPosition = new Vector2(0.0f, 0.0f);
            break;
        }

        if (isLocalPlayer && hammerState != HammerSteps.IDLE)
        {
            if (oldSlamDirection != slamDirection)
            {
                CmdUpdateHammerSlam(slamDirection);
                oldSlamDirection = slamDirection;
            }
        }
    }