예제 #1
0
    public bool HeavyDamage(int damage, Vector3 origin)
    {
        if (status.Invincible())
        {
            return(false);
        }

        if (StateCompare(MarioStates.Knockback) || StateCompare(MarioStates.KnockbackForwards) || StateCompare(MarioStates.TeleportIn) || StateCompare(MarioStates.TeleportOut))
        {
            return(false);
        }

        Vector3 direction = Math3d.ProjectVectorOnPlane(controller.up, origin - transform.position).normalized;

        if (direction == Vector3.zero)
        {
            direction = lookDirection;
        }

        bool forward = Vector3.Angle(direction, lookDirection) < 90;

        if (Airborn())
        {
            if (forward)
            {
                moveSpeed    = -3.0f;
                currentState = MarioStates.AirKnockback;
            }
            else
            {
                moveSpeed    = 3.0f;
                currentState = MarioStates.AirKnockbackForwards;
            }
        }
        else
        {
            if (forward)
            {
                currentState = MarioStates.Knockback;
                moveSpeed    = -3.0f;
            }
            else
            {
                currentState = MarioStates.KnockbackForwards;
                moveSpeed    = 3.0f;
            }
        }

        lookDirection = forward ? direction : -direction;

        SmartCamera.Shake(1.6f, 25.0f, 0.5f);

        sound.PlayTakeDamage();

        Instantiate(TakeDamageEffect, transform.position + controller.up * controller.height * 0.6f, Quaternion.identity);

        status.TakeDamage(damage);

        return(true);
    }
예제 #2
0
    public bool GroundDamageLight(int damage, Vector3 origin, float pushbackSpeed, bool canHurtInAir = true)
    {
        if (status.Invincible())
        {
            return(false);
        }

        if (StateCompare(MarioStates.Stagger) || StateCompare(MarioStates.TeleportIn) || StateCompare(MarioStates.TeleportOut))
        {
            return(false);
        }

        if (!canHurtInAir && Airborn())
        {
            return(false);
        }

        if (StateCompare(MarioStates.Slide))
        {
            if (Mathf.Abs(moveSpeed) > 3.0f)
            {
                return(false);
            }
        }

        status.TakeDamage(damage);

        Vector3 direction = Math3d.ProjectVectorOnPlane(controller.up, origin - transform.position).normalized;

        if (direction == Vector3.zero)
        {
            direction = lookDirection;
        }

        staggerForward = Vector3.Angle(direction, lookDirection) < 90;

        if (Airborn())
        {
            if (staggerForward)
            {
                moveSpeed    = -3.0f;
                currentState = MarioStates.AirKnockback;
            }
            else
            {
                moveSpeed    = 3.0f;
                currentState = MarioStates.AirKnockbackForwards;
            }
        }
        else
        {
            if (status.CurrentHealth == 0)
            {
                if (staggerForward)
                {
                    currentState = MarioStates.Knockback;
                    moveSpeed    = -3.0f;
                }
                else
                {
                    currentState = MarioStates.KnockbackForwards;
                    moveSpeed    = 3.0f;
                }
            }
            else
            {
                currentState = MarioStates.Stagger;

                moveSpeed = staggerForward ? -pushbackSpeed : pushbackSpeed;
            }
        }

        Instantiate(TakeDamageEffect, transform.position + controller.up * controller.height * 0.6f, Quaternion.identity);

        sound.PlayTakeDamage();

        lookDirection = staggerForward ? direction : -direction;

        SmartCamera.Shake(0.85f, 15.0f, 0.5f);

        return(true);
    }