public void TakeDamage(ActorHitInfo data) { if (MetaState.Instance.SessionFlags.Contains("GodMode") || GameState.Instance.PlayerFlags.Contains(PlayerFlags.Invulnerable) || IsDying) { return; } if (!data.HarmFriendly) { string hitFaction = data.OriginatorFaction; if (!string.IsNullOrEmpty(hitFaction)) { FactionRelationStatus relation = FactionModel.GetRelation(hitFaction, PredefinedFaction.Player.ToString()); //this looks backwards but it's because we're checking if the Bullet is-friendly-to the Actor if (relation == FactionRelationStatus.Friendly) { return; //no friendly fire } } } if (DamageHandler != null) { var hitOut = DamageHandler(data); if (hitOut.HasValue) { data = hitOut.Value; } else { return; } } CharacterModel playerModel = GameState.Instance.PlayerRpgState; var(damageToShields, damageToArmor, damageToCharacter) = RpgValues.DamageRatio(data.Damage, data.DamagePierce, playerModel); float oldShields = playerModel.Shields; playerModel.Shields -= damageToShields; if (oldShields > 0 && playerModel.Shields <= 0) { MessageInterface.PushToBus(new QdmsFlagMessage("PlayerShieldsLost")); ShieldComponent.Ref()?.SignalLostShields(); } var(dt, dr) = playerModel.GetDamageThresholdAndResistance(data.DamageType); float damageTaken = RpgValues.DamageTaken(damageToArmor, damageToCharacter, dt, dr); if (data.HitLocation == (int)ActorBodyPart.Head) { damageTaken *= 2.0f; } else if (data.HitLocation == (int)ActorBodyPart.LeftArm || data.HitLocation == (int)ActorBodyPart.LeftLeg || data.HitLocation == (int)ActorBodyPart.RightArm || data.HitLocation == (int)ActorBodyPart.RightLeg) { damageTaken *= 0.75f; } playerModel.Health -= damageTaken; if (damageTaken > PainSoundThreshold) { if (PainSound != null && !PainSound.isPlaying) { PainSound.Play(); } } if (damageToShields > 0 || damageTaken > 0) { ShieldComponent.Ref()?.SignalTookDamage(damageToShields, damageTaken); var damageValues = new Dictionary <string, object>() { { "DamageTaken", damageTaken }, { "DamageToShields", damageToShields }, { "DamageToArmor", damageToArmor }, { "DamageToCharacter", damageToCharacter } }; MessageInterface.PushToBus(new QdmsKeyValueMessage(damageValues, "PlayerTookDamage")); } }