public void DealDamage(IDamageReceiver damageReceiver, DamagesParameters damagesParameters)
    {
        damageReceiver.ReceiveDamage(this, damagesParameters, relatedProjectile.GetProjectileSpecialParameters);

        if (relatedProjectile.GetProjectileSpecialParameters.GetPiercingParameters.GetNumberOfPiercing > 0)
        {
            relatedProjectile.GetProjectileSpecialParameters.GetPiercingParameters.DecreamentPiercing();

            FeedbackObject woodProjection = GameManager.gameManager.PoolManager.GetFeedbackObject(FeedbackObjectPoolTag.WoodDestruction, PoolInteractionType.GetFromPool);
            if (woodProjection != null)
            {
                woodProjection.transform.position = transform.position;
                woodProjection.StartFeedback(2, 0.2f, specialSound);
            }
        }
        else if (relatedProjectile.GetProjectileSpecialParameters.GetSkeweringParameters.Skewering)
        {
            FeedbackObject woodProjection = GameManager.gameManager.PoolManager.GetFeedbackObject(FeedbackObjectPoolTag.WoodDestruction, PoolInteractionType.GetFromPool);
            if (woodProjection != null)
            {
                woodProjection.transform.position = transform.position;
                woodProjection.StartFeedback(2, 0.2f, specialSound);
            }
        }
        else
        {
            relatedProjectile.ExplodeOnContact();
        }
    }
 public void Die()
 {
     foreach (Transform pos in particlesPositions)
     {
         FeedbackObject onDestroyFeedbackObject = GameManager.gameManager.PoolManager.GetFeedbackObject(onDestroyParticleType, PoolInteractionType.GetFromPool);
         onDestroyFeedbackObject.gameObject.SetActive(true);
         onDestroyFeedbackObject.transform.position = pos.position;
         onDestroyFeedbackObject.StartFeedback(transform.localScale.x * particlesSize, soundVolume);
     }
     Destroy(gameObject);
 }
Beispiel #3
0
    public void SetRammingKnockback(Collision collision, ICollisionReceiver hitCollisionReceiver)
    {
        #region Calculates Redirection and Knockback
        Vector3 knockbackVector   = relatedShip.GetShipVelocity.normalized;
        Vector3 redirectionVector = hitCollisionReceiver.GetMovementDirection();

        Vector3 hitObjectDirection = Quaternion.Euler(-collision.transform.rotation.eulerAngles) * hitCollisionReceiver.GetMovementDirection();

        Vector3 hitNormal   = new Vector3();
        Vector3 hitPosition = new Vector3();
        Vector3 worldHitPosition;
        int     counter = 0;

        foreach (ContactPoint contact in collision.contacts)
        {
            hitNormal   += contact.normal;
            hitPosition += contact.point;
            counter++;
        }

        #region V1
        Vector3 hitObjectCenter = collision.collider.bounds.center;

        hitNormal /= counter;
        hitNormal  = Quaternion.Euler(-collision.transform.rotation.eulerAngles) * hitNormal;

        hitPosition     /= counter;
        worldHitPosition = hitPosition;
        hitPosition      = Quaternion.Euler(-collision.transform.rotation.eulerAngles) * (hitPosition - hitObjectCenter);

        float semiLenght = collision.collider.bounds.extents.z;
        float semiWidht  = collision.collider.bounds.extents.x;

        if (Mathf.Abs(Vector3.Dot(hitNormal, hitObjectDirection)) < 0.5f)
        {
            //latéral
            if (hitPosition.x > 0)
            {
                //par la droite
                if (hitPosition.z > 0)
                {
                    //à l'avant
                    if (Vector3.Dot(GetMovementDirection(), hitCollisionReceiver.GetMovementDirection()) > -0.45f)
                    {
                        knockbackVector   = -hitCollisionReceiver.GetMovementDirection();
                        redirectionVector = ((-hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("pas exception");
                    }
                    else if (Vector3.Dot(GetMovementDirection(), hitCollisionReceiver.GetMovementDirection()) < 0f)
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("exception");
                    }
                    //Debug.Log("latéral avant droit");
                }
                else
                {
                    //à l'arrière
                    if (Vector3.Dot(GetMovementDirection(), hitCollisionReceiver.GetMovementDirection()) < 0.75f)
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("pas exception");
                    }
                    else
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("exception");
                    }
                    //Debug.Log("latéral arrière droit");
                }
            }
            else
            {
                //par la gauche
                if (hitPosition.z > 0)
                {
                    //à l'avant
                    if (Vector3.Dot(GetMovementDirection(), hitCollisionReceiver.GetMovementDirection()) > -0.45f)
                    {
                        knockbackVector   = -hitCollisionReceiver.GetMovementDirection();
                        redirectionVector = ((-hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("pas exception");
                    }
                    else
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("exception");
                    }
                    //Debug.Log("latéral avant gauche");
                }
                else
                {
                    //à l'arrière
                    if (Vector3.Dot(GetMovementDirection(), hitCollisionReceiver.GetMovementDirection()) < 0.75f)
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("pas exception");
                    }
                    else
                    {
                        knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ();
                        redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                        //Debug.Log("exception");
                    }
                    //Debug.Log("latéral arrière gauche");
                }
            }
        }
        else
        {
            //avant ou arrière
            if (hitPosition.x > 0)
            {
                // sur la droite
                //knockbackVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized;
                redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetLeftOrthogonalVectorXZ().normalized) / 2).normalized;
                //Debug.Log("frontal droite");
            }
            else
            {
                // sur la gauche
                //knockbackVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                knockbackVector   = hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized;
                redirectionVector = ((hitCollisionReceiver.GetMovementDirection().normalized + hitCollisionReceiver.GetMovementDirection().GetRightOrthogonalVectorXZ().normalized) / 2).normalized;
                //Debug.Log("frontal gauche");
            }
        }
        #endregion

        #endregion

        DealKnockback(hitCollisionReceiver, relatedShip.ShipMvt.GetCurrentRammingParameters.GetInflictedKnockbackParameters, knockbackVector, redirectionVector);

        ReceiveKnockback(this, relatedShip.ShipMvt.GetCurrentRammingParameters.GetSustainedKnockbackParametersOnImpact, -relatedShip.GetShipVelocity.normalized, relatedShip.GetShipVelocity.normalized);

        #region Feedback
        if (waitBeforeRammingFeedback)
        {
            return;
        }

        if ((relatedShip as EnemyShip != null && collision.gameObject.GetComponent <PlayerShip>() != null) /* || (relatedShip as PlayerShip != null && collision.gameObject.GetComponent<EnemyShip>() != null)*/)
        {
            GameManager.gameManager.SlwMoManager.SetSlowMo(relatedShip.ShipMvt.GetCurrentRammingParameters.GetSlowMoParameters);
        }

        GameManager.gameManager.ScrshkManager.StartScreenshake(relatedShip.ShipMvt.GetCurrentRammingParameters.GetScreenshakeParameters);

        FeedbackObject woodProjection = GameManager.gameManager.PoolManager.GetFeedbackObject(FeedbackObjectPoolTag.WoodDestruction, PoolInteractionType.GetFromPool);
        if (woodProjection != null)
        {
            woodProjection.transform.position = worldHitPosition;
            woodProjection.StartFeedback(2, 0.2f);
        }
        StartCoroutine(WaitBeforeReplayRammingFeedback());
        #endregion
    }
Beispiel #4
0
    public void Die()
    {
        OnDeath?.Invoke(this);

        ArenaManager arenaManager = ArenaManager.arenaManager;

        EnemyLootCrate lootCrate = lootManager.GenerateEnemyLootCrate();

        if (lootCrate != null)
        {
            lootCrate.transform.position = transform.position;
            lootCrate.SetUpFloatingMove();

            if (arenaManager != null)
            {
                arenaManager.DropManager.AddDropCrate(lootCrate);
            }
        }


        if (objectCollider != null)
        {
            objectCollider.enabled = false;
        }
        else if (GetComponent <Collider>() != null)
        {
            GetComponent <Collider>().enabled = false;
        }


        if (particlesToPlay != null)
        {
            particlesToPlay.Play();
        }

        foreach (Transform tr in woodProjectionPositions)
        {
            FeedbackObject woodProjection = GameManager.gameManager.PoolManager.GetFeedbackObject(FeedbackObjectPoolTag.WoodDestruction, PoolInteractionType.GetFromPool);
            if (woodProjection != null)
            {
                woodProjection.transform.position = tr.position;
                woodProjection.StartFeedback(2, 0.2f);
            }
        }

        if (particlesToPlay == null && woodProjectionPositions.Length == 0)
        {
            FeedbackObject woodProjection = GameManager.gameManager.PoolManager.GetFeedbackObject(FeedbackObjectPoolTag.WoodDestruction, PoolInteractionType.GetFromPool);
            if (woodProjection != null)
            {
                woodProjection.transform.position = transform.position;
                woodProjection.StartFeedback(2, 0.2f);
            }
        }


        if (targetAudioSource != null)
        {
            targetAudioSource.PlaySound(soundToPlayOnDestroy);
        }


        if (objectRenderer != null)
        {
            objectRenderer.enabled = false;
        }

        foreach (GameObject obj in objectRenderers)
        {
            obj.SetActive(false);
        }

        if (objectRenderer == null && objectRenderers.Length == 0)
        {
            Destroy(gameObject);
        }
    }