Exemple #1
0
    private IEnumerator WaitForNetworkInit()
    {
        while (rootNetView == null)
        {
            rootNetView = player.GetComponent <Topan.NetworkView>();
            yield return(null);
        }

        FindWeaponToUse(true, 0);
        rootNetView.RPC(Topan.RPCMode.OthersBuffered, "RefreshWeapon", (byte)currentGC.weaponID);
    }
Exemple #2
0
    //Slam the stock into the enemy's face.
    private void QuickMeleeWithWeapon()
    {
        dm.DoMeleeAnimation();

        Transform theCamera = GeneralVariables.mainPlayerCamera.transform;

        if (Physics.Raycast(theCamera.position, theCamera.forward, out melee, 2f, layersToMelee.value))
        {
            BaseStats bs = melee.collider.GetComponent <BaseStats>();
            Limb      lb = melee.collider.GetComponent <Limb>();
            if (bs == null && lb != null)
            {
                bs = lb.rootStats;
            }

            if (bs != null)
            {
                bool showHitMarker = false;
                int  damage        = Random.Range(50, 55 + 1);

                if (bs.curHealth > 0)
                {
                    showHitMarker = true;
                }

                bool canDamage = true;
                bs.headshot = false;

                if (Topan.Network.isConnected)
                {
                    Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();
                    if (damageView != null)
                    {
                        BotVitals hitBot = bs.GetComponent <BotVitals>();

                        if (GeneralVariables.gameModeHasTeams)
                        {
                            byte targetTeam = /*(hitBot) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team : */ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                            if (targetTeam == (byte)Topan.Network.player.GetPlayerData("team", (byte)0))
                            {
                                if (!friendlyFire)
                                {
                                    canDamage = false;
                                }

                                showHitMarker = false;
                            }
                        }
                        else
                        {
                        }

                        if (canDamage)
                        {
                            if (Topan.Network.isServer && (damageView.ownerID == 0 || hitBot))
                            {
                                bs.ApplyDamageNetwork((byte)Mathf.Clamp(damage, 0, 255), (byte)Topan.Network.player.id, (byte)currentGC.weaponID, (byte)4);
                            }
                            else
                            {
                                damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)Mathf.Clamp(damage, 0, 255), (byte)Topan.Network.player.id, (byte)currentGC.weaponID, (byte)4);
                            }
                        }
                    }
                }
                else
                {
                    bs.ApplyDamageMain(damage, false);
                }

                if (showHitMarker)
                {
                    HitTarget(bs.curHealth <= 0);
                }
            }

            Quaternion rot = Quaternion.LookRotation(melee.normal);

            particleMeleeIndex = 0;
            string surfTag = melee.collider.tag;
            if (surfTag == "Dirt")
            {
                particleMeleeIndex = 1;
            }
            else if (surfTag == "Metal")
            {
                particleMeleeIndex = 2;
            }
            else if (surfTag == "Wood")
            {
                particleMeleeIndex = 3;
            }
            else if (surfTag == "Flesh" || surfTag == "Player - Flesh")
            {
                particleMeleeIndex = 4;
            }
            else if (surfTag == "Water")
            {
                particleMeleeIndex = 5;
            }

            PoolManager.Instance.RequestParticleEmit(particleMeleeIndex, melee.point + (melee.normal * 0.06f), rot);
        }
    }
Exemple #3
0
    private IEnumerator SelectWeaponCoroutine(int weaponIndex, bool immediate)
    {
        prepareToSwitch = true;

        while (ac.aimTransition > 0.05f)
        {
            yield return(0);
        }

        prepareToSwitch = false;

        if (currentGC != null && currentGC.reloading)
        {
            currentGC.CancelReload();
        }

        int prevWeaponNum = curWeaponNum;

        if (Topan.Network.isConnected && rootNetView != null)
        {
            if (weaponIndex == 0 || weaponIndex == 1)
            {
                rootNetView.RPC(Topan.RPCMode.OthersBuffered, "RefreshWeapon", (byte)heldWeapons[weaponIndex].weaponID);

                if (heldWeapons[weaponIndex].gunVisuals != null && heldWeapons[weaponIndex].gunVisuals.flashlight != null)
                {
                    rootNetView.RPC(Topan.RPCMode.OthersBuffered, "SetFlashlight", heldWeapons[weaponIndex].flashlightOn);
                }
            }
            else
            {
                if (weaponIndex <= -1)
                {
                    rootNetView.RPC(Topan.RPCMode.OthersBuffered, "SetSpecialActive", (byte)0); //Hands
                }
                else if (weaponIndex == 2)
                {
                    rootNetView.RPC(Topan.RPCMode.OthersBuffered, "SetSpecialActive", (byte)1); //Melee
                }
                else if (weaponIndex == 3)
                {
                    grenadeManager.OnSelect(true);
                }
            }
        }

        if (!immediate)
        {
            if (!isQuickThrowState)
            {
                curAmmoDisplay.text  = "--";
                ammoLeftDisplay.text = "---";
            }

            float weightFactorTime = 0f;
            if (weaponIndex == 0 || weaponIndex == 1)
            {
                if (ignoreWeightDelayOnce)
                {
                    ignoreWeightDelayOnce = false;
                }
                else
                {
                    weightFactorTime = (heldWeapons[weaponIndex].weaponWeight * 0.05f);
                }
            }

            dm.Draw(drawTime + weightFactorTime);
            switching          = true;
            pv.jumpRattleEquip = true;

            float waitPeriod       = 0f;
            bool  cyclingGrenades  = false;
            bool  ignoreFirstPress = true;
            while (waitPeriod < drawTime + weightFactorTime)
            {
                if (weaponIndex == 3 && Input.GetKeyDown(KeyCode.Alpha4) && grenadeManager.availableGrenades.Count > 1)
                {
                    if (!ignoreFirstPress)
                    {
                        cyclingGrenades = true;

                        if (grenadeManager.grenadeIndex == 0 && gam.typeTwoGrenades > 0)
                        {
                            grenadeManager.grenadeIndex = 1;
                        }
                        else if (grenadeManager.grenadeIndex == 1 && gam.typeOneGrenades > 0)
                        {
                            grenadeManager.grenadeIndex = 0;
                        }

                        grenadeSelection.alpha     = grenadeSelection.defaultAlpha;
                        grenadeSelectionLabel.text = grenadeManager.grenadeInventory[grenadeManager.grenadeIndex].grenadeName;

                        dm.ExtendDrawTime(waitPeriod);
                        waitPeriod = 0f;
                    }
                    else
                    {
                        grenadeSelectionLabel.alpha = 0.4f;
                    }

                    ignoreFirstPress = false;
                }

                if (cyclingGrenades)
                {
                    grenadeSelectionLabel.alpha = Mathf.Lerp(grenadeSelectionLabel.alpha, 0.8f, Time.deltaTime * 18f);
                }

                waitPeriod += Time.deltaTime;
                yield return(null);
            }

            switching = false;
        }

        bool          sameWeapon = false;
        GunController gc1        = null;
        GunController gc2        = null;

        if (prevWeaponNum > -1 && prevWeaponNum >= 0 && prevWeaponNum <= 1 && weaponIndex >= 0 && weaponIndex <= 1)
        {
            gc1 = heldWeapons[prevWeaponNum];
            gc2 = heldWeapons[weaponIndex];

            if (gc1 != null && gc2 != null && gc1.weaponID == gc2.weaponID)
            {
                sameWeapon = true;
            }
        }

        if (weaponIndex > -2)
        {
            pv.jumpRattleEquip = true;
            GetComponent <AudioSource>().PlayOneShot(drawSound, 0.2f);
        }

        if (currentWeaponTransform == grenadeManager.transform)
        {
            grenadeManager.OnDeselect();
        }

        DeselectAll();

        curWeaponNum  = weaponIndex;
        curWeaponMode = (curWeaponNum == 0 || curWeaponNum == 1) ? CurrentWeaponMode.GenericWeapon : CurrentWeaponMode.AlternateWeapon;

        if (curWeaponMode == CurrentWeaponMode.GenericWeapon)
        {
            currentGC.gameObject.SetActive(true);
            currentGC.OnWeaponDraw();
            currentWeaponTransform = currentGC.transform;

            if (queuedAmmo > -1)
            {
                AntiHackSystem.ProtectInt("currentAmmo", queuedAmmo);
                queuedAmmo = -1;
            }

            if (queuedReserve > -1)
            {
                AntiHackSystem.ProtectInt("ammoLeft", queuedReserve);
                queuedReserve = -1;
            }

            currentGC.bulletInChamber = queuedChamber;
            queuedChamber             = false;

            curWepName = currentGC.gunName;

            if (!pe.hasEMP)
            {
                weaponIcon.mainTexture             = currentGC.iconTexture;
                weaponIcon.transform.localPosition = defaultIconPos + new Vector3(currentGC.iconOffset.x, currentGC.iconOffset.y, 0f);
                weaponIcon.SetDimensions((int)currentGC.iconScale.x, (int)currentGC.iconScale.y);
            }
        }
        else
        {
            if (curWeaponNum == 3)
            {
                grenadeManager.gameObject.SetActive(true);
                grenadeManager.OnSelect(false);

                if (pressedQuickThrow)
                {
                    grenadeManager.QuickThrow(prevWeaponNum);
                }

                currentWeaponTransform = grenadeManager.transform;
                pressedQuickThrow      = false;
            }
            else if (curWeaponNum == 2)
            {
                meleeController.gameObject.SetActive(true);
                currentWeaponTransform = meleeController.transform;

                weaponIcon.mainTexture             = meleeController.iconTexture;
                weaponIcon.transform.localPosition = defaultIconPos + new Vector3(meleeController.iconOffset.x, meleeController.iconOffset.y, 0f);
                weaponIcon.SetDimensions((int)meleeController.iconSize.x, (int)meleeController.iconSize.y);
            }
            else if (curWeaponNum <= -1)
            {
                if (curWeaponNum == -1)
                {
                    hands.SetActive(true);
                    currentWeaponTransform = hands.transform;
                }
                else
                {
                    currentWeaponTransform = null;
                }

                curWepName             = "Hands";
                weaponIcon.mainTexture = null;
                weaponIcon.SetDimensions(100, 50);

                curAmmoDisplay.color = Color.white;
                curAmmoDisplay.text  = "---";
                ammoLeftDisplay.text = "---";

                ammoBar.value = 1f;
            }
        }

        StartCoroutine(WeaponNameTransition());

        ReflectionUpdateGroup foundRUG = currentWeaponTransform.GetComponent <ReflectionUpdateGroup>();

        if (foundRUG != null)
        {
            foreach (Renderer r in foundRUG.allRenderers)
            {
                UpdateReflection(r);
            }
        }

        if (sameWeapon)
        {
            gc2.ammoLeft = gc1.ammoLeft;
            AntiHackSystem.ProtectInt("ammoLeft", gc1.ammoLeft);
        }

        if (curWeaponNum < 3 && curWeaponNum != -2)
        {
            dm.sao = currentWeaponTransform.GetComponent <SprintAnimOverride>();
        }

        grenadeSelectionLabel.alpha = 0.2f;
    }
Exemple #4
0
    private void ApplyDamageStat(BaseStats bs, int dmg, float dist, float rad)
    {
        if (dmg <= 0 && !isEMP)
        {
            return;
        }

        PlayerVitals playerPV = bs.GetComponent <PlayerVitals>();

        if (bs.isLocalPlayer && playerPV != null)
        {
            playerPV.HitIndicator(transform.position);

            if (isEMP)
            {
                playerPV.pe.StartPhase_EMP();
            }
            else if (explosionCameraEffect)
            {
                playerPV.pe.ExplosionVisualEffect(1.05f - Mathf.Clamp01((dist * 1.35f) / rad));
            }
        }

        bool showHitMarker = false;

        if (isPlayer && !bs.isLocalPlayer && wManager != null && bs.curHealth > 0)
        {
            showHitMarker = true;
        }

        if (Topan.Network.isConnected)
        {
            Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();

            if (damageView != null && !(isPlayer && bs.isLocalPlayer))
            {
                bool      canDamage  = true;
                BotVitals hitBot     = bs.GetComponent <BotVitals>();
                byte      ownerTeam  = (isPlayer || botIndex <= -1) ? (byte)Topan.Network.player.GetPlayerData("team", (byte)0) : BotManager.allBotPlayers[botIndex].team;
                byte      targetTeam = /*(hitBot != null) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team :*/ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                if (GeneralVariables.gameModeHasTeams)
                {
                    if (targetTeam == ownerTeam)
                    {
                        canDamage     = friendlyFire;
                        showHitMarker = false;
                    }
                }
                else
                {
                }

                /*
                 * if((hitBot != null && botIndex > -1 && hitBot.bm.myIndex == botIndex)) {
                 *  canDamage = true;
                 * }*/

                if (canDamage)
                {
                    damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)dmg, (botIndex > -1) ? (byte)(botIndex + 64) : (byte)Topan.Network.player.id, GetTrueID(), (grenIndex > -1) ? (byte)255 : (byte)4);
                }

                if (isEMP && !hitBot)
                {
                    damageView.RPC(Topan.RPCMode.Owner, "NetworkEMP");
                }
            }
            else
            {
                bs.headshot = false;
                bs.ApplyDamageMain(dmg, true);
            }
        }
        else
        {
            bs.headshot = false;
            bs.ApplyDamageMain(dmg, true);
        }

        if (showHitMarker)
        {
            wManager.HitTarget(bs.curHealth <= 0);
        }
    }
Exemple #5
0
    private IEnumerator MeleeAction()
    {
        isMeleeState = true;
        yield return(new WaitForSeconds(meleeDelay));

        if (Physics.Raycast(camTr.position, camTr.forward, out hit, meleeRange, layersToMelee.value))
        {
            BaseStats bs = hit.collider.GetComponent <BaseStats>();
            Limb      lb = hit.collider.GetComponent <Limb>();

            if (bs != null)
            {
                bool showHitMarker = false;
                if (wm != null && bs.curHealth > 0)
                {
                    showHitMarker = true;
                }

                bool canDamage = true;
                bs.headshot = false;

                if (Topan.Network.isConnected)
                {
                    Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();
                    if (damageView != null)
                    {
                        BotVitals hitBot = bs.GetComponent <BotVitals>();

                        if (GeneralVariables.gameModeHasTeams)
                        {
                            byte targetTeam = /*(hitBot) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team : */ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                            if (targetTeam == (byte)Topan.Network.player.GetPlayerData("team", (byte)0))
                            {
                                if (!friendlyFire)
                                {
                                    canDamage = false;
                                }

                                showHitMarker = false;
                            }
                        }
                        else
                        {
                        }

                        if (canDamage)
                        {
                            if (Topan.Network.isServer && (damageView.ownerID == 0 || hitBot))
                            {
                                bs.ApplyDamageNetwork((byte)Mathf.Clamp(Random.Range(meleeMinDamage, meleeMaxDamage + 1), 0, 255), (byte)Topan.Network.player.id, (byte)0, (byte)4);
                            }
                            else
                            {
                                damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)Mathf.Clamp(Random.Range(meleeMinDamage, meleeMaxDamage + 1), 0, 255), (byte)Topan.Network.player.id, (byte)0, (byte)4);
                            }
                        }
                    }
                }
                else
                {
                    bs.headshot = false;
                    bs.ApplyDamageMain(Random.Range(meleeMinDamage, meleeMaxDamage + 1), true);
                }

                if (showHitMarker)
                {
                    wm.HitTarget(bs.curHealth <= 0);
                }
            }
            else if (lb != null && lb.rootStats != null)
            {
                bs = lb.rootStats;
                int finalDmg = Mathf.RoundToInt(Random.Range(meleeMinDamage, meleeMaxDamage + 1) * Mathf.Clamp01(lb.realDmgMult));

                bool showHitMarker = false;
                if (wm != null && bs.curHealth > 0)
                {
                    showHitMarker = true;
                }

                bool canDamage = true;

                if (Topan.Network.isConnected)
                {
                    Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();
                    if (damageView != null)
                    {
                        BotVitals hitBot = bs.GetComponent <BotVitals>();

                        if (GeneralVariables.gameModeHasTeams)
                        {
                            byte targetTeam = /* (hitBot) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team : */ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                            if (targetTeam == (byte)Topan.Network.player.GetPlayerData("team", (byte)0))
                            {
                                if (!friendlyFire)
                                {
                                    canDamage = false;
                                }

                                showHitMarker = false;
                            }
                        }
                        else
                        {
                        }

                        if (canDamage)
                        {
                            if (Topan.Network.isServer && (damageView.ownerID == 0 || hitBot))
                            {
                                bs.ApplyDamageNetwork((byte)Mathf.Clamp(finalDmg, 0, 255), (byte)Topan.Network.player.id, (byte)0, (byte)lb.limbType);
                            }
                            else
                            {
                                damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)Mathf.Clamp(finalDmg, 0, 255), (byte)Topan.Network.player.id, (byte)0, (byte)lb.limbType);
                            }
                        }
                    }
                }
                else
                {
                    bs.headshot = false;
                    bs.ApplyDamageMain(finalDmg, true);
                }

                if (showHitMarker)
                {
                    wm.HitTarget(bs.curHealth <= 0);
                }
            }

            Rigidbody rigid = hit.rigidbody;
            if (rigid != null && !rigid.isKinematic)
            {
                rigid.AddForce(camTr.forward * meleeForce, ForceMode.Impulse);
            }

            int    particleIndex = 0;
            string surfTag       = hit.collider.tag;
            if (surfTag == "Dirt")
            {
                particleIndex = 1;
            }
            else if (surfTag == "Metal")
            {
                particleIndex = 2;
            }
            else if (surfTag == "Wood")
            {
                particleIndex = 3;
            }
            else if (surfTag == "Flesh" || surfTag == "Player - Flesh")
            {
                particleIndex = 4;
            }
            else if (surfTag == "Water")
            {
                particleIndex = 5;
            }

            PoolManager.Instance.RequestParticleEmit(particleIndex, hit.point + (hit.normal * 0.06f), Quaternion.LookRotation(hit.normal));
        }

        yield return(new WaitForSeconds(meleeCooldown));

        isMeleeState = false;
    }
Exemple #6
0
    private void OnHit(RaycastHit hit)
    {
        ricochetValue++;
        float limbForceMult = 1f;

        travelDist += hit.distance;
        bool ignoreBulletHole = false;

        if (!isVisuals)
        {
            bs = hit.collider.GetComponent <BaseStats>();
            lb = hit.collider.GetComponent <Limb>();

            damage = Mathf.RoundToInt(damage * dmgCurve.Evaluate(travelDist));

            if (damage > 0)
            {
                if (bs != null)
                {
                    bool hitMarkerEnabled = false;
                    if (player && wManager != null && bs.curHealth > 0 && bs.hitIndication)
                    {
                        hitMarkerEnabled = true;
                    }

                    bool canDamage = true;
                    bs.headshot = false;

                    if (Topan.Network.isConnected)
                    {
                        Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();
                        if (damageView != null && damage > 0)
                        {
                            BotVitals hitBot = bs.GetComponent <BotVitals>();

                            if (GeneralVariables.gameModeHasTeams)
                            {
                                byte ownerTeam  = (player) ? (byte)Topan.Network.player.GetPlayerData("team", (byte)0) : BotManager.allBotPlayers[botIndex].team;
                                byte targetTeam = /* (hitBot) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team : */ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                                if (targetTeam == ownerTeam)
                                {
                                    if (!friendlyFire)
                                    {
                                        canDamage = false;
                                    }

                                    hitMarkerEnabled = false;
                                }
                            }
                            else
                            {
                            }

                            if (canDamage)
                            {
                                if (isServer && (damageView.ownerID == 0 || hitBot))
                                {
                                    bs.ApplyDamageNetwork((byte)Mathf.Clamp(damage, 0, 255), (botIndex > -1) ? (byte)(botIndex + 64) : (byte)Topan.Network.player.id, (byte)thisGunIndex, (byte)4);
                                }
                                else
                                {
                                    damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)Mathf.Clamp(damage, 0, 255), (botIndex > -1) ? (byte)(botIndex + 64) : (byte)Topan.Network.player.id, (byte)thisGunIndex, (byte)4);
                                }
                            }
                        }
                        else
                        {
                            bs.ApplyDamageMain(damage, true);
                        }
                    }
                    else
                    {
                        bs.ApplyDamageMain(damage, true);
                    }

                    if (hitMarkerEnabled)
                    {
                        wManager.HitTarget(bs.curHealth <= 0);
                    }

                    if (canDamage)
                    {
                        PlayerVitals playerPV = bs.GetComponent <PlayerVitals>();
                        if (bs.isLocalPlayer && playerPV != null)
                        {
                            playerPV.HitIndicator(startPos);
                        }
                    }
                }
                else if (lb != null && lb.rootStats != null)
                {
                    bs = lb.rootStats;
                    lb.ragdollVelocity = tr.forward * force * limbForceMult;
                    damage             = Mathf.RoundToInt(damage * lb.realDmgMult);

                    bool hitMarkerEnabled = false;
                    if (player && wManager != null && bs.curHealth > 0 && bs.hitIndication)
                    {
                        hitMarkerEnabled = true;
                    }

                    bs.headshot = (lb.limbType == Limb.LimbType.Head);

                    if (Topan.Network.isConnected)
                    {
                        Topan.NetworkView damageView = bs.GetComponent <Topan.NetworkView>();
                        if (damageView != null)
                        {
                            BotVitals hitBot    = bs.GetComponent <BotVitals>();
                            bool      canDamage = true;

                            if (GeneralVariables.gameModeHasTeams)
                            {
                                byte ownerTeam  = (player || botIndex <= -1) ? (byte)Topan.Network.player.GetPlayerData("team", (byte)0) : BotManager.allBotPlayers[botIndex].team;
                                byte targetTeam = /*(hitBot) ? BotManager.allBotPlayers[hitBot.bm.myIndex].team : */ (byte)damageView.owner.GetPlayerData("team", (byte)0);

                                if (targetTeam == ownerTeam)
                                {
                                    if (!friendlyFire)
                                    {
                                        canDamage = false;
                                    }

                                    hitMarkerEnabled = false;
                                }
                            }
                            else
                            {
                            }

                            if (canDamage)
                            {
                                if (isServer && (damageView.ownerID == 0 || hitBot))
                                {
                                    bs.ApplyDamageNetwork((byte)Mathf.Clamp(damage, 0, 255), (botIndex > -1) ? (byte)(botIndex + 64) : (byte)Topan.Network.player.id, (byte)thisGunIndex, (byte)lb.limbType);
                                }
                                else
                                {
                                    damageView.RPC(Topan.RPCMode.Owner, "ApplyDamageNetwork", (byte)Mathf.Clamp(damage, 0, 255), (botIndex > -1) ? (byte)(botIndex + 64) : (byte)Topan.Network.player.id, (byte)thisGunIndex, (byte)lb.limbType);
                                }
                            }
                        }
                        else
                        {
                            bs.ApplyDamageMain(damage, true);
                        }
                    }
                    else
                    {
                        bs.ApplyDamageMain(damage, true);
                    }

                    limbForceMult = 3f;

                    if (hitMarkerEnabled)
                    {
                        wManager.HitTarget(bs.curHealth <= 0);
                    }
                }
            }
        }

        bulletHoleIndex = 0;
        hitEffectIndex  = 0;
        string hitTag = hit.collider.tag;

        if (hitTag == "Dirt")
        {
            hitEffectIndex = 1;
        }
        else if (hitTag == "Metal")
        {
            hitEffectIndex = 2;
        }
        else if (hitTag == "Wood")
        {
            hitEffectIndex = 3;
        }
        else if (hitTag == "Flesh" || hitTag == "Player - Flesh")
        {
            bulletHoleIndex = -1;
            hitEffectIndex  = 4;
        }
        else if (hitTag == "Water")
        {
            bulletHoleIndex = -1;
            hitEffectIndex  = 5;
        }

        Quaternion rot = Quaternion.LookRotation(hit.normal);

        if (bulletHoleIndex >= 0 && !ignoreBulletHole)
        {
            Transform hole = PoolManager.Instance.RequestInstantiate(bulletHoles[bulletHoleIndex], hit.point + (hit.normal * 0.01f), rot).transform;

            if (!hit.collider.gameObject.isStatic && hit.rigidbody)
            {
                hole.KeepUniformScale(hit.transform);
            }

            float randomSize = Random.Range(bulletDecalSize.x, bulletDecalSize.y);
            hole.localScale = new Vector3(randomSize, randomSize, 1f);

            Vector3 euler = hole.localEulerAngles;
            euler.z = Random.value * 360f;
            hole.localEulerAngles = euler;

            DecalObject dObj = hole.GetChild(0).GetComponent <DecalObject>();
            dObj.targetObject = hit.collider.gameObject;
            dObj.UpdateDecalMesh();
        }

        PoolManager.Instance.RequestParticleEmit(hitEffectIndex, hit.point + (hit.normal * 0.06f), rot);

        Rigidbody rigid = hit.rigidbody;

        if ((lb == null || (lb != null && (lb.rootStats == null || lb.rootStats.curHealth <= 0))) && rigid != null && !rigid.isKinematic)
        {
            rigid.AddForce(tr.forward * force * limbForceMult, ForceMode.Impulse);
        }

        if (ricochetAmount > 0 && ricochetValue <= ricochetAmount)
        {
            if (Vector3.Angle(dir, hit.normal) - 90f <= ricochetAngle)
            {
                tr.rotation    = Quaternion.LookRotation(Vector3.Reflect(dir, hit.normal));
                speed         *= 0.75f;
                damage         = Mathf.RoundToInt(damage * Random.Range(0.5f, 0.6f));
                gravityVector *= 0.5f;
                tr.position   += tr.forward * speed * Time.deltaTime;
                newPos         = tr.position;
            }
            else
            {
                AddToPool();
            }
        }

        if (smokeInstance != null)
        {
            smokeInstance.SetPosition(1, hit.point);
            smokeInstance = null;
        }

        if (currentWhiz != null)
        {
            currentWhiz.transform.parent   = null;
            currentWhiz.transform.position = hit.point;
            currentWhiz = null;
            noWhizSound = false;
        }

        tracer.SetActive(false);
        glow.SetActive(false);
        AddToPool();
    }