Esempio n. 1
0
    void APAmmoOnHit()
    {
        RaycastHit hit;

        if (IsHitted)
        {
            return;
        }

        if (RayHitDetect(out hit))
        {
            float Degree = Vector3.Angle(transform.forward * -1, hit.normal * 1);
            //Normalize
            Degree = Mathf.Clamp(Degree, 0, Degree - shellNormalizationAngle - (float)Caliber / 100);

            int Penetration = 0;
            switch (bulletType)
            {
            case BulletType.ApAmmo:
                Penetration        = APPenetration;
                PenetrationDamper *= 1.2f;
                break;

            case BulletType.APCRAmmo:
                Penetration        = ApcrPenration;
                PenetrationDamper *= 2;
                break;
            }

            float Distance = Vector3.Distance(transform.position, P0);

            Penetration = Mathf.RoundToInt(Random.Range(0.95f, 1.05f) * Penetration * EnergyDamper - Distance * 0.1f * PenetrationDamper);

            int Damage = Mathf.RoundToInt(Random.Range(0.95f, 1.05f) * APDamage * EnergyDamper);

            if (hit.collider.gameObject.layer == LayerMask.NameToLayer("HitBox"))
            {
                HitBox _hitBox = hit.collider.GetComponent <HitBox>();
                if (_hitBox == null)
                {
                    return;
                }

                if (Degree > 65)
                {
                    transform.position = hit.point;
                    transform.LookAt(Vector3.Reflect(transform.forward * 1, hit.normal) + hit.point);
                    EnergyDamper *= 0.4f;
                    _hitBox.ApplyRicochet(fireOwner);
                    Debug.DrawRay(transform.position, hit.normal);
                    if (!GameDataManager.OfflineMode)
                    {
                        CreateFireExplosionHitOnArmor(hit.point, transform.forward, "BulletReflectionEffect");
                    }
                    return;
                }


                _hitBox.ApplyDamage(Penetration, Damage, Degree, fireOwner, bulletType, fireStartPosition, hit.point, Caliber);

                CreateFireExplosionHitOnArmor(hit.point, hit.normal, FireExplosionHitOnArmor);
            }
            else if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Terrian"))
            {
                CreateFireExplosionHitOnArmor(hit.point, hit.normal, FireExplosionHitOnGround);
                if (!isMachineAmmo)
                {
                    hit.collider.GetComponent <TerrainManager>().DestroyTerrain(hit.point, 2);
                }
            }
            else
            {
                CreateFireExplosionHitOnArmor(hit.point, hit.normal, FireExplosionHitOnGround);

                if (hit.collider.transform.GetComponentInParent <Building>() != null)
                {
                    hit.collider.transform.GetComponentInParent <Building>().ApplyAmmoHit(APDamage);
                }
            }
            IsHitted = true;

            if (!isMachineAmmo)
            {
                PoolManagerSpawnModule.CreateObject(ammoAudio.ammoExplAudio.ToString(), transform.position, transform.eulerAngles);
            }

            Explode();
        }
    }