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(); } }