Esempio n. 1
0
    private void ApplyDamage(int damage, int senderID, bool showBlood, Limb.LimbType bodyPart, int weaponID = -1)
    {
        if (dead || damage <= 0)
        {
            return;
        }

        if (Topan.Network.isConnected && (!Topan.Network.HasServerInfo("sm") || !((bool)Topan.Network.GetServerInfo("sm"))))
        {
            return;
        }

        if (GeneralVariables.gameModeHasTeams && senderID > -1)
        {
            byte teamNum = (senderID >= 64) ? BotManager.allBotPlayers[senderID - 64].team : (byte)Topan.Network.GetPlayerByID(senderID).GetPlayerData("team", (byte)0);

            if (teamNum != (byte)Topan.Network.player.GetPlayerData("team", (byte)0))
            {
                if (!damageIDs.Contains((byte)senderID))
                {
                    damageIDs.Add((byte)senderID);
                    damageInflicted.Add(Mathf.Clamp(damage, 0, curHealth));
                }
                else
                {
                    int theIndex = GetDamageIndex(senderID);
                    if (theIndex >= 0)
                    {
                        damageInflicted[theIndex] += Mathf.Clamp(damage, 0, curHealth);
                    }
                }
            }
        }

        float fltDamage = (float)damage;

        if (playerLook != null)
        {
            playerLook.Flinch(fltDamage);
        }

        int damageToHealth = Mathf.Clamp(damage - curShield, 0, curHealth);

        if (damageToHealth > 0)
        {
            base.headshot = (bodyPart == Limb.LimbType.Head);
            shieldAlpha  += Mathf.Clamp(damageToHealth, 0, 15) * 0.006f;

            if (showBlood)
            {
                fallDamageSource.GetComponent <TimeScaleSound>().pitchMod = Random.Range(0.75f, 1f);
                fallDamageSource.PlayOneShot(healthDamage, 0.15f + (0.006f * Mathf.Clamp(damageToHealth, 0f, 15f)));
            }
        }

        int damageToShield = Mathf.Clamp(damage, 0, curShield);

        if (damageToShield > 0)
        {
            Color hurtColor = shieldTexture.defaultColor;
            hurtColor          *= 0.8f;
            hurtColor.r        *= 1.6f;
            hurtColor.b        /= 1.6f;
            shieldTexture.color = hurtColor;
            shieldAlpha        += 0.021f + (Mathf.Clamp(damageToShield, 0, 10) * 0.039f);
        }

        if (damage > curShield)
        {
            int temp = damage - curShield;

            if (curShield > 0)
            {
                fallDamageSource.GetComponent <TimeScaleSound>().pitchMod = Random.Range(0.8f, 0.85f);
                fallDamageSource.PlayOneShot(shieldDamage, 0.08f);
                fallDamageSource.PlayOneShot(shieldFailure, 0.35f);
            }

            curShield = 0;

            healthText.color = new Color(1f, 0.2f, 0f, 1f);
            curHealth       -= temp * ((godmode) ? -1 : 1);

            uic.gManager.damageBlur += Mathf.Clamp(fltDamage * 0.032f, 0f, 0.37f);
            uic.gManager.damageBlur  = Mathf.Clamp01(uic.gManager.damageBlur);
            damageBreathBoost        = Mathf.Clamp(fltDamage * 0.04f, 0f, 0.22f);

            if (showBlood)
            {
                bloodEffect += 0.003f + (temp * 0.028f);
            }
            if (Time.time - painTimer >= 0.5f)
            {
                fallDamageSource.GetComponent <TimeScaleSound>().pitchMod = Random.Range(0.8f, 1f);
                fallDamageSource.PlayOneShot(painSounds[Random.Range(0, painSounds.Length)], (1f - Mathf.Clamp01(curHealth / (maxHealth * 0.5f))) * 0.18f);
                painTimer = Time.time;
            }

            recovering         = false;
            startRecoveryTimer = true;
            rTimer             = 0f;
        }
        else
        {
            curShield -= damage;
            uic.gManager.damageBlur += Mathf.Clamp(fltDamage * 0.01f, 0f, 0.11f);
            uic.gManager.damageBlur  = Mathf.Clamp01(uic.gManager.damageBlur);
            shieldText.color         = new Color(1f, 0.2f, 0f, 1f);

            if (damageToShield > 0)
            {
                fallDamageSource.GetComponent <TimeScaleSound>().pitchMod = Random.Range(0.77f, 0.84f);
                fallDamageSource.PlayOneShot(shieldDamage, 0.03f + (0.009f * Mathf.Clamp(damageToShield, 0, 15)));
            }
        }

        lastDe               = Time.time;
        damageEffect        += fltDamage * 0.5f;
        lastDamage           = lastDe;
        shRecovering         = false;
        shTimer              = 0f;
        startShRecoveryTimer = true;

        if (shrTimer > 0f)
        {
            shrTimer = 0f;
        }

        if (curHealth <= 0)
        {
            if (!damageIDs.Contains((byte)senderID))
            {
                damageIDs.Add((byte)senderID);
                damageInflicted.Add(9);
            }

            lastWeaponID = weaponID;
            killerID     = senderID;
            headID       = (base.headshot) ? senderID : -1;
            Die();
        }
    }