public virtual void Hurt(GameObject victim, float painDealt, float painTaken, StateMachine.CollisionVelocityResults cvr)
    {
        Owner.Velocity = cvr.Winner;
        Owner.CameraScript.CreateShake(Owner.CameraConsts.GetShakeAmount(painTaken, true));

        //TODO: Create PlayerState; move all the code underneath to that state. Enemies shouldn't become hurt players or play "hurt player" noises.

        //Physical noise.
        WorldConstants.PlayPhysNoises.PlayNoise(PlayerPhysicsNoises.Events.Hurt);

        //Crowd cheering.
        if (Owner.ActorData.Team == victim.GetComponent <IDData>().Team)
        {
            WorldConstants.CrowdCheering.CreateCrowdCheer(CrowdCheers.Events.PlayerTeamHurt);
        }
        else if (painDealt > WorldConstants.HeavyHitPainCutoff)
        {
            WorldConstants.CrowdCheering.CreateCrowdCheer(CrowdCheers.Events.PlayerBadlyHurt);
        }
        else
        {
            WorldConstants.CrowdCheering.CreateCrowdCheer(CrowdCheers.Events.PlayerLightlyHurt);
        }

        //Change state.
        if (!(this is InAirState))
        {
            Owner.ChangeState(ScriptableObject.CreateInstance <InAirState>(), true);
        }
    }
    public virtual void HurtBy(GameObject attacker, float painDealt, float painTaken, StateMachine.CollisionVelocityResults cvr)
    {
        Owner.Velocity = cvr.Loser;
        Owner.CameraScript.CreateShake(Owner.CameraConsts.GetShakeAmount(painTaken, false));

        //TODO: Create PlayerState; move this to that state. Enemies shouldn't become hurt players.
        Owner.ChangeState(ScriptableObject.CreateInstance <HurtState>(), false);
    }