public void PlayerHitByExplosion(ExplosionDamageInfo _expDmg)
    {
        ExplosionDamageInfo expDmg = _expDmg;

        DamageInfo dmg = expDmg.damageInfo;

        float exCoef = expDmg.playerDamageSheddat;

        if (bulHit_StateY == BulletHitCameraRotState.None)
        {
            InitBulRotY(dmg, exCoef);
        }

        if (bulHit_StateZ == BulletHitCameraRotState.None)
        {
            InitBulRotZ(dmg, exCoef);
        }
    }
Exemple #2
0
    public void Explode()
    {
        explosionPos = transform.position;

        DamageInfo dmg = new DamageInfo();

        if (isItPlayerGrenade && PlayerCharacterNew.Instance != null)
        {
            dmg.damageSource = PlayerCharacterNew.Instance.gameObject;
            //dmg.damageSourcePosition = PlayerCharacterNew.Instance.gameObject.transform.position;
            dmg.damageSourcePosition = transform.position;
        }
        else
        {
            dmg.damageSource         = this.gameObject;
            dmg.damageSourcePosition = transform.position;
        }

        dmg.damageType = DamageType.Explosion;

        //

        Collider[] colliders = Physics.OverlapSphere(explosionPos, Radius, ExplosionLayer);
        foreach (Collider hit in colliders)
        {
            Vector3 closestPoint = hit.ClosestPointOnBounds(explosionPos);

            if ((hit.transform.root.tag.ToLower() == GeneralStats.allyTagName_ToLower) || (hit.transform.root.tag.ToLower() == GeneralStats.enemyTagName_ToLower))
            {
                closestPoint = hit.transform.root.position;
            }

            float distance = Vector3.Distance(closestPoint, explosionPos);

            float hitRatio = Mathf.Clamp01(damageCurve.Evaluate(1 - Mathf.Clamp01(distance / Radius)));
            dmg.damageAmount = hitRatio * DamageAmount;

            if ((hit.transform.root.tag.ToLower() == GeneralStats.allyTagName_ToLower) || (hit.transform.root.tag.ToLower() == GeneralStats.enemyTagName_ToLower))
            {
                bool isSoldAddedBefore = false;

                foreach (ExplosionHittedSold ehs in hittedSolds)
                {
                    if (ehs.datSold == hit.transform.root.gameObject)
                    {
                        isSoldAddedBefore = true;

                        if (ehs.dmgAmount < dmg.damageAmount)
                        {
                            ehs.dmgAmount = dmg.damageAmount;
                        }
                    }
                }

                if (!isSoldAddedBefore)
                {
                    ExplosionHittedSold ehs = new ExplosionHittedSold();
                    ehs.datSold   = hit.transform.root.gameObject;
                    ehs.dmgAmount = dmg.damageAmount;

                    hittedSolds.Add(ehs);
                }
            }
            else
            {
                hit.SendMessageUpwards("ApplyDamage", dmg, SendMessageOptions.DontRequireReceiver);
            }
        }

        foreach (ExplosionHittedSold ehs in hittedSolds)
        {
            if (ehs != null)
            {
                dmg.damageAmount = ehs.dmgAmount;
                if (ehs.datSold != null)
                {
                    ehs.datSold.SendMessage("ApplyDamage", dmg, SendMessageOptions.DontRequireReceiver);
                }
            }
        }

        //

        colliders = Physics.OverlapSphere(explosionPos, Radius, ExplosionLayer);
        foreach (Collider hit in colliders)
        {
            if (hit.rigidbody && hit.gameObject.layer.ToString() != "Player")
            {
                hit.rigidbody.AddExplosionForce(ForcePower, explosionPos, Radius);
            }
        }

        //

        if (PlayerCharacterNew.Instance != null)
        {
            PlayerCharacterNew player = PlayerCharacterNew.Instance;

            float playerDist = (player.transform.position - explosionPos).magnitude;

            float playerCameraShakeRange = Radius * PlayerCamShakeRadiusCoef;

            float playerCameraShake_MinDistToDoMaxShakeEee = playerCameraShakeRange * playerMinDistToDoMaxShakeCoefOfRadius;


            float sourat = playerCameraShakeRange - playerDist;

            float makhraj = playerCameraShakeRange - playerCameraShake_MinDistToDoMaxShakeEee;

            float result = Mathf.Clamp01(sourat / makhraj);

            ExplosionDamageInfo expDmgInf = new ExplosionDamageInfo();
            expDmgInf.damageInfo          = dmg;
            expDmgInf.playerDamageSheddat = result;

            player.SetExplosionEffectIsNeeded(expDmgInf, true);
        }
    }