diff --git a/Content.Server/Disease/DiseaseSystem.cs b/Content.Server/Disease/DiseaseSystem.cs index 2933e7471e..360bbe334d 100644 --- a/Content.Server/Disease/DiseaseSystem.cs +++ b/Content.Server/Disease/DiseaseSystem.cs @@ -185,9 +185,7 @@ namespace Content.Server.Disease /// private void OnInteractDiseasedHand(EntityUid uid, DiseasedComponent component, InteractHandEvent args) { - if (!_interactionSystem.InRangeUnobstructed(args.User, args.Target)) - return; - InteractWithDiseased (args.Target, args.User); + InteractWithDiseased(args.Target, args.User); } /// @@ -266,14 +264,15 @@ namespace Content.Server.Disease /// Tries to infect anyone that /// interacts with a diseased person or body /// - private void InteractWithDiseased(EntityUid diseased, EntityUid target) + private void InteractWithDiseased(EntityUid diseased, EntityUid target, DiseaseCarrierComponent? diseasedCarrier = null) { - if (!TryComp(target, out var carrier)) + if (!Resolve(diseased, ref diseasedCarrier, false) || + diseasedCarrier.Diseases.Count == 0 || + !TryComp(target, out var carrier)) return; - var disease = _random.Pick(Comp(diseased).Diseases); - if (disease != null) - TryInfect(carrier, disease, 0.4f); + var disease = _random.Pick(diseasedCarrier.Diseases); + TryInfect(carrier, disease, 0.4f); } /// @@ -283,25 +282,22 @@ namespace Content.Server.Disease /// to not be guaranteed you are looking /// for TryInfect. /// - public void TryAddDisease(DiseaseCarrierComponent? target, DiseasePrototype? addedDisease, string? diseaseName = null, EntityUid host = default!) + public void TryAddDisease(DiseaseCarrierComponent? target, DiseasePrototype? addedDisease, string? diseaseName = null, EntityUid? host = null) { if (diseaseName != null && _prototypeManager.TryIndex(diseaseName, out DiseasePrototype? diseaseProto)) addedDisease = diseaseProto; - if (host != default!) - target = Comp(host); + if (!TryComp(host, out target)) + return; - if (target != null) + foreach (var disease in target.AllDiseases) { - foreach (var disease in target.AllDiseases) - { - if (disease.ID == addedDisease?.ID) //ID because of the way protoypes work - return; - } - var freshDisease = _serializationManager.CreateCopy(addedDisease) ?? default!; - target.Diseases.Add(freshDisease); - AddQueue.Enqueue(target.Owner); + if (disease.ID == addedDisease?.ID) //ID because of the way protoypes work + return; } + var freshDisease = _serializationManager.CreateCopy(addedDisease) ?? default!; + target.Diseases.Add(freshDisease); + AddQueue.Enqueue(target.Owner); } /// @@ -312,7 +308,7 @@ namespace Content.Server.Disease /// public void TryInfect(DiseaseCarrierComponent carrier, DiseasePrototype? disease, float chance = 0.7f) { - if(disease == null || !disease.Infectious) + if(disease is not { Infectious: true }) return; var infectionChance = chance - carrier.DiseaseResist; if (infectionChance <= 0) @@ -326,13 +322,14 @@ namespace Content.Server.Disease /// and then tries to infect anyone in range /// if the snougher is not wearing a mask. /// - public void SneezeCough(EntityUid uid, DiseasePrototype? disease, string snoughMessage, bool airTransmit = true, float infectionChance = 0.3f) + public void SneezeCough(EntityUid uid, DiseasePrototype? disease, string snoughMessage, bool airTransmit = true, TransformComponent? xform = null) { - var xform = Comp(uid); - if (snoughMessage != string.Empty) + if (!Resolve(uid, ref xform)) return; + + if (!string.IsNullOrEmpty(snoughMessage)) _popupSystem.PopupEntity(Loc.GetString(snoughMessage, ("person", uid)), uid, Filter.Pvs(uid)); - if (disease == null || !disease.Infectious || airTransmit == false) + if (disease is not { Infectious: true } || !airTransmit) return; if (_inventorySystem.TryGetSlotEntity(uid, "mask", out var maskUid) && @@ -340,13 +337,14 @@ namespace Content.Server.Disease blocker.Enabled) return; + var carrierQuery = GetEntityQuery(); + foreach (var entity in _lookup.GetEntitiesInRange(xform.MapID, xform.WorldPosition, 2f)) { - if (!_interactionSystem.InRangeUnobstructed(uid, entity)) - continue; + if (!carrierQuery.TryGetComponent(entity, out var carrier) || + !_interactionSystem.InRangeUnobstructed(uid, entity)) continue; - if (TryComp(entity, out var carrier)) - TryInfect(carrier, disease, 0.3f); + TryInfect(carrier, disease, 0.3f); } } @@ -354,14 +352,14 @@ namespace Content.Server.Disease /// Adds a disease to the carrier's /// past diseases to give them immunity /// IF they don't already have the disease. - /// + /// public void Vaccinate(DiseaseCarrierComponent carrier, DiseasePrototype disease) { foreach (var currentDisease in carrier.Diseases) - { - if (currentDisease.ID == disease.ID) //ID because of the way protoypes work - return; - } + { + if (currentDisease.ID == disease.ID) //ID because of the way protoypes work + return; + } carrier.PastDiseases.Add(disease); } diff --git a/Content.Server/Disease/Effects/DiseaseSnough.cs b/Content.Server/Disease/Effects/DiseaseSnough.cs index ce4d4099be..e9c2691e37 100644 --- a/Content.Server/Disease/Effects/DiseaseSnough.cs +++ b/Content.Server/Disease/Effects/DiseaseSnough.cs @@ -3,12 +3,11 @@ using JetBrains.Annotations; namespace Content.Server.Disease { - [UsedImplicitly] - /// /// Makes the diseased sneeze or cough /// or neither. /// + [UsedImplicitly] public sealed class DiseaseSnough : DiseaseEffect { ///