From a3ab734c919e9d31bd393457ca4f7f0f6fe8b773 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Fri, 21 Jun 2024 17:52:19 -0400 Subject: [PATCH 01/11] IT BUILT --- Content.Server/Atmos/Rotting/RottingSystem.cs | 107 +------------ .../Atmos/Rotting/SharedRottingSystem.cs | 141 +++++++++++++++++- 2 files changed, 136 insertions(+), 112 deletions(-) diff --git a/Content.Server/Atmos/Rotting/RottingSystem.cs b/Content.Server/Atmos/Rotting/RottingSystem.cs index 47bac84e0ca..5070b3f197f 100644 --- a/Content.Server/Atmos/Rotting/RottingSystem.cs +++ b/Content.Server/Atmos/Rotting/RottingSystem.cs @@ -1,15 +1,9 @@ -using Content.Shared.Damage; -using Content.Shared.Atmos; using Content.Server.Atmos.EntitySystems; using Content.Server.Body.Components; using Content.Server.Temperature.Components; +using Content.Shared.Atmos; using Content.Shared.Atmos.Rotting; -using Content.Shared.Examine; -using Content.Shared.IdentityManagement; -using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; -using Content.Shared.Mobs.Systems; -using Content.Shared.Rejuvenate; +using Content.Shared.Damage; using Robust.Server.Containers; using Robust.Shared.Physics.Components; using Robust.Shared.Timing; @@ -22,83 +16,16 @@ public sealed class RottingSystem : SharedRottingSystem [Dependency] private readonly AtmosphereSystem _atmosphere = default!; [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly DamageableSystem _damageable = default!; - [Dependency] private readonly MobStateSystem _mobState = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnPerishableMapInit); - SubscribeLocalEvent(OnMobStateChanged); - SubscribeLocalEvent(OnPerishableExamined); - - SubscribeLocalEvent(OnShutdown); - SubscribeLocalEvent(OnRottingMobStateChanged); SubscribeLocalEvent(OnGibbed); - SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnTempIsRotting); } - private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) - { - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) - { - if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) - return; - - if (HasComp(uid)) - return; - - component.RotAccumulator = TimeSpan.Zero; - component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; - } - - private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) - { - if (TryComp(uid, out var perishable)) - { - perishable.RotNextUpdate = TimeSpan.Zero; - } - } - - private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) - { - if (args.NewMobState == MobState.Dead) - return; - RemCompDeferred(uid, component); - } - - public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) - { - // things don't perish by default. - if (!Resolve(uid, ref perishable, false)) - return false; - - // only dead things or inanimate objects can rot - if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) - return false; - - if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && - HasComp(container.Owner)) - { - return false; - } - - var ev = new IsRottingEvent(); - RaiseLocalEvent(uid, ref ev); - - return !ev.Handled; - } - - public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) - { - return Resolve(uid, ref rotting, false); - } - private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEvent args) { if (!TryComp(uid, out var physics)) @@ -112,36 +39,6 @@ private void OnGibbed(EntityUid uid, RottingComponent component, BeingGibbedEven tileMix?.AdjustMoles(Gas.Ammonia, molsToDump); } - private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) - { - int stage = PerishStage(perishable, MaxStages); - if (stage < 1 || stage > MaxStages) - { - // We dont push an examined string if it hasen't started "perishing" or it's already rotting - return; - } - - var isMob = HasComp(perishable); - var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); - args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); - } - - /// - /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to - /// generate examine messages for items that are starting to rot. - /// - public int PerishStage(Entity perishable, int maxStages) - { - if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) - return 0; - return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); - } - - private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) - { - RemCompDeferred(uid); - } - private void OnTempIsRotting(EntityUid uid, TemperatureComponent component, ref IsRottingEvent args) { if (args.Handled) diff --git a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs index 5e1758203a8..840818dee59 100644 --- a/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs +++ b/Content.Shared/Atmos/Rotting/SharedRottingSystem.cs @@ -1,29 +1,85 @@ using Content.Shared.Examine; using Content.Shared.IdentityManagement; +using Content.Shared.Mobs; using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Rejuvenate; +using Robust.Shared.Containers; +using Robust.Shared.Timing; namespace Content.Shared.Atmos.Rotting; public abstract class SharedRottingSystem : EntitySystem { + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + public const int MaxStages = 3; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnPerishableMapInit); + SubscribeLocalEvent(OnMobStateChanged); + SubscribeLocalEvent(OnPerishableExamined); + + SubscribeLocalEvent(OnShutdown); + SubscribeLocalEvent(OnRottingMobStateChanged); + SubscribeLocalEvent(OnRejuvenate); SubscribeLocalEvent(OnExamined); } - /// - /// Return the rot stage, usually from 0 to 2 inclusive. - /// - public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + private void OnPerishableMapInit(EntityUid uid, PerishableComponent component, MapInitEvent args) { - if (!Resolve(uid, ref comp, ref perishable)) - return 0; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } - return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + private void OnMobStateChanged(EntityUid uid, PerishableComponent component, MobStateChangedEvent args) + { + if (args.NewMobState != MobState.Dead && args.OldMobState != MobState.Dead) + return; + + if (HasComp(uid)) + return; + + component.RotAccumulator = TimeSpan.Zero; + component.RotNextUpdate = _timing.CurTime + component.PerishUpdateRate; + } + + private void OnPerishableExamined(Entity perishable, ref ExaminedEvent args) + { + int stage = PerishStage(perishable, MaxStages); + if (stage < 1 || stage > MaxStages) + { + // We dont push an examined string if it hasen't started "perishing" or it's already rotting + return; + } + + var isMob = HasComp(perishable); + var description = "perishable-" + stage + (!isMob ? "-nonmob" : string.Empty); + args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(perishable, EntityManager)))); + } + + private void OnShutdown(EntityUid uid, RottingComponent component, ComponentShutdown args) + { + if (TryComp(uid, out var perishable)) + { + perishable.RotNextUpdate = TimeSpan.Zero; + } + } + + private void OnRottingMobStateChanged(EntityUid uid, RottingComponent component, MobStateChangedEvent args) + { + if (args.NewMobState == MobState.Dead) + return; + RemCompDeferred(uid, component); + } + + private void OnRejuvenate(EntityUid uid, RottingComponent component, RejuvenateEvent args) + { + RemCompDeferred(uid); } private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args) @@ -41,4 +97,75 @@ private void OnExamined(EntityUid uid, RottingComponent component, ExaminedEvent args.PushMarkup(Loc.GetString(description, ("target", Identity.Entity(uid, EntityManager)))); } + + /// + /// Return an integer from 0 to maxStage representing how close to rotting an entity is. Used to + /// generate examine messages for items that are starting to rot. + /// + public int PerishStage(Entity perishable, int maxStages) + { + if (perishable.Comp.RotAfter.TotalSeconds == 0 || perishable.Comp.RotAccumulator.TotalSeconds == 0) + return 0; + return (int)(1 + maxStages * perishable.Comp.RotAccumulator.TotalSeconds / perishable.Comp.RotAfter.TotalSeconds); + } + + public bool IsRotProgressing(EntityUid uid, PerishableComponent? perishable) + { + // things don't perish by default. + if (!Resolve(uid, ref perishable, false)) + return false; + + // only dead things or inanimate objects can rot + if (TryComp(uid, out var mobState) && !_mobState.IsDead(uid, mobState)) + return false; + + if (_container.TryGetOuterContainer(uid, Transform(uid), out var container) && + HasComp(container.Owner)) + { + return false; + } + + var ev = new IsRottingEvent(); + RaiseLocalEvent(uid, ref ev); + + return !ev.Handled; + } + + public bool IsRotten(EntityUid uid, RottingComponent? rotting = null) + { + return Resolve(uid, ref rotting, false); + } + + public void ReduceAccumulator(EntityUid uid, TimeSpan time) + { + if (!TryComp(uid, out var perishable)) + return; + + if (!TryComp(uid, out var rotting)) + { + perishable.RotAccumulator -= time; + return; + } + var total = (rotting.TotalRotTime + perishable.RotAccumulator) - time; + + if (total < perishable.RotAfter) + { + RemCompDeferred(uid, rotting); + perishable.RotAccumulator = total; + } + + else + rotting.TotalRotTime = total - perishable.RotAfter; + } + + /// + /// Return the rot stage, usually from 0 to 2 inclusive. + /// + public int RotStage(EntityUid uid, RottingComponent? comp = null, PerishableComponent? perishable = null) + { + if (!Resolve(uid, ref comp, ref perishable)) + return 0; + + return (int) (comp.TotalRotTime.TotalSeconds / perishable.RotAfter.TotalSeconds); + } } From 64687a1b421ce74f290d2d25a050badb508c0a80 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Sun, 23 Jun 2024 01:06:49 -0400 Subject: [PATCH 02/11] Start of CPR --- Content.Shared/CCVar/CCVars.cs | 46 +++++++ .../CPR/Components/CPRTrainingComponent.cs | 32 +++++ .../Medical/CPR/Systems/CPRSystem.CVars.cs | 27 ++++ .../Medical/CPR/Systems/CPRSystem.cs | 122 ++++++++++++++++++ 4 files changed, 227 insertions(+) create mode 100644 Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs create mode 100644 Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs create mode 100644 Content.Shared/Medical/CPR/Systems/CPRSystem.cs diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index ab36977efbd..abde38eaa1d 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2138,5 +2138,51 @@ public static readonly CVarDef /// public static readonly CVarDef StationGoalsChance = CVarDef.Create("game.station_goals_chance", 0.1f, CVar.SERVERONLY); + + // REGION: CPR System + /// + /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too + /// if you are wishing to permanently disable the system on your server. + /// + public static readonly CVarDef DoCPRSystem = + CVarDef.Create("cpr.do_cpr_system", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) + /// + public static readonly CVarDef CPRReducesRot = + CVarDef.Create("cpr.reduces_rot", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR heals airloss, included for completeness sake. I'm not going to stop you if your intention is to make CPR do nothing. + /// I guess it might be funny to troll your players with? I won't judge. + /// + public static readonly CVarDef CPRHealsAirloss = + CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// Toggles whether or not CPR has a (small) chance to revive a dead person if they are otherwise healthy enough for a defib to work. + /// This isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// + public static readonly CVarDef CPRResuscitate = + CVarDef.Create("cpr.do_resuscitate", true, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount + /// of rot reduction. Set it to 2 for if you want 3 seconds of CPR to reduce 6 seconds of rot. + /// + /// + /// If you're wondering why there isn't a CVar for setting the duration of the doafter, that's because it's not actually possible to have a timespan in cvar form + /// Curiously, it's also not possible for **shared** systems to set variable timespans. Which is where this system lives. + /// + public static readonly CVarDef CPRRotReductionMultiplier = + CVarDef.Create("cpr.rot_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); + + /// + /// By default, CPR heals airloss by 1 point for every second spent performing CPR. Just like above, this directly multiplies the healing amount. + /// Set it to 2 to get 6 points of airloss healing for every 3 seconds of CPR. + /// + public static readonly CVarDef CPRAirlossReductionMultiplier = + CVarDef.Create("cpr.airloss_reduction_multiplier", 1f, CVar.REPLICATED | CVar.SERVER); } } diff --git a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs new file mode 100644 index 00000000000..596fbc0c1d6 --- /dev/null +++ b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs @@ -0,0 +1,32 @@ +using Robust.Shared.GameStates; +using Content.Shared.DoAfter; +using Robust.Shared.Audio; +using Robust.Shared.Serialization; + +namespace Content.Shared.Medical.CPR +{ + [RegisterComponent, NetworkedComponent] + public sealed partial class CPRTrainingComponent : Component + { + [DataField] + public SoundSpecifier? CPRSound = new SoundPathSpecifier("/Audio/Items/Defib/defib_safety_on.ogg"); + + /// + /// How long the doafter for CPR takes + /// + [DataField] + public TimeSpan DoAfterDuration = TimeSpan.FromSeconds(3); + + [DataField] + public int AirlossHeal = 6; + + [DataField] + public float CrackRibsModifier = 1f; + } + + [Serializable, NetSerializable] + public sealed partial class CPRDoAfterEvent : SimpleDoAfterEvent + { + + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs new file mode 100644 index 00000000000..904026b1dc5 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs @@ -0,0 +1,27 @@ +using Content.Shared.CCVar; +using Robust.Shared.Configuration; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem + { + [Dependency] private readonly IConfigurationManager _cfg = default!; + + public bool DoCPRSystem { get; private set; } + public bool CPRHealsAirloss { get; private set; } + public bool CPRReducesRot { get; private set; } + public bool CPRResuscitate { get; private set; } + public float CPRRotReductionMultiplier { get; private set; } + public float CPRAirlossReductionMultiplier { get; private set; } + + private void InitializeCVars() + { + Subs.CVar(_cfg, CCVars.DoCPRSystem, value => DoCPRSystem = value, true); + Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => CPRHealsAirloss = value, true); + Subs.CVar(_cfg, CCVars.CPRReducesRot, value => CPRReducesRot = value, true); + Subs.CVar(_cfg, CCVars.CPRResuscitate, value => CPRResuscitate = value, true); + Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => CPRRotReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => CPRAirlossReductionMultiplier = value, true); + } + } +} diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs new file mode 100644 index 00000000000..964913f4f75 --- /dev/null +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -0,0 +1,122 @@ +using Content.Shared.Popups; +using Content.Shared.Atmos.Rotting; +using Content.Shared.Damage; +using Content.Shared.DoAfter; +using Content.Shared.Inventory; +using Content.Shared.Mobs; +using Content.Shared.Mobs.Components; +using Content.Shared.Mobs.Systems; +using Content.Shared.Verbs; +using Robust.Shared.Utility; +using Robust.Shared.Random; + +namespace Content.Shared.Medical.CPR +{ + public sealed partial class CPRSystem : EntitySystem + { + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly MobStateSystem _mobStateSystem = default!; + [Dependency] private readonly DamageableSystem _damageable = default!; + [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; + [Dependency] private readonly IRobustRandom _robustRandom = default!; + [Dependency] private readonly SharedRottingSystem _rottingSystem = default!; + [Dependency] private readonly InventorySystem _inventory = default!; + public override void Initialize() + { + base.Initialize(); + InitializeCVars(); + SubscribeLocalEvent>(AddCPRVerb); + SubscribeLocalEvent(OnCPRDoAfter); + } + + private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsEvent args) + { + if (!DoCPRSystem || !args.CanInteract || !args.CanAccess + || !TryComp(args.Target, out var targetState) + || targetState.CurrentState == MobState.Alive) + return; + + InnateVerb verb = new() + { + Act = () => + { + StartCPR(uid, args.Target, targetState, component); + }, + Text = Loc.GetString("cpr-verb"), + Icon = new SpriteSpecifier.Rsi(new("Interface/Alerts/human_alive.rsi"), "health4"), + Priority = 2 + }; + args.Verbs.Add(verb); + } + + private void StartCPR(EntityUid performer, EntityUid target, MobStateComponent targetState, CPRTrainingComponent cprComponent) + { + if (HasComp(target)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-target-rotting", ("entity", target)), performer, performer); + return; + } + + if (_inventory.TryGetSlotEntity(target, "outerClothing", out var outer)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", outer)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(target, "mask", out var mask)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove", ("clothing", mask)), performer, performer, PopupType.MediumCaution); + return; + } + + if (_inventory.TryGetSlotEntity(target, "mask", out var maskSelf)) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove-own-mask", ("clothing", maskSelf)), performer, performer, PopupType.MediumCaution); + return; + } + + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), target) + { + BreakOnTargetMove = true, + BreakOnUserMove = true, + NeedHand = true, + BlockDuplicate = true + }); + } + + private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, CPRDoAfterEvent args) + { + // There is PROBABLY a better way to do this, by all means let me know + DamageSpecifier healing = new() + { + DamageDict = new() + { + { "Airloss", -component.AirlossHeal * CPRAirlossReductionMultiplier} + } + }; + + if (args.Target == null) + return; + + if (CPRHealsAirloss) + _damageable.TryChangeDamage(args.Target, healing, true, origin: performer); + + if (CPRReducesRot) + _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * CPRRotReductionMultiplier); + + if (CPRResuscitate && _robustRandom.Prob(0.01f) + && _mobThreshold.TryGetThresholdForState((EntityUid) args.Target, MobState.Dead, out var threshold) + && TryComp(args.Target, out var damageableComponent) + && TryComp(args.Target, out var state) + && damageableComponent.TotalDamage < threshold) + { + _mobStateSystem.ChangeMobState((EntityUid) args.Target, MobState.Critical, state, performer); + } + + } + } +} From 993e91fa55708bdb3de1b15acfee612df32ae7e0 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 24 Jun 2024 15:55:56 -0400 Subject: [PATCH 03/11] Finishing CPR --- Content.Server/Medical/DefibrillatorSystem.cs | 18 +++---- Content.Shared/CCVar/CCVars.cs | 12 ++--- .../CPR/Components/CPRTrainingComponent.cs | 3 +- .../Medical/CPR/Systems/CPRSystem.CVars.cs | 24 ++++----- .../Medical/CPR/Systems/CPRSystem.cs | 50 +++++++++++------- Resources/Audio/Effects/CPR.ogg | Bin 0 -> 68840 bytes .../components/cpr-training-component.ftl | 5 ++ Resources/Locale/en-US/traits/traits.ftl | 4 ++ .../Prototypes/Roles/Jobs/Medical/chemist.yml | 4 ++ .../Jobs/Medical/chief_medical_officer.yml | 1 + .../Roles/Jobs/Medical/medical_doctor.yml | 4 ++ .../Roles/Jobs/Medical/medical_intern.yml | 4 ++ .../Roles/Jobs/Medical/paramedic.yml | 4 ++ .../Roles/Jobs/Medical/senior_physician.yml | 4 ++ Resources/Prototypes/Traits/skills.yml | 15 ++++++ 15 files changed, 104 insertions(+), 48 deletions(-) create mode 100644 Resources/Audio/Effects/CPR.ogg create mode 100644 Resources/Locale/en-US/medical/components/cpr-training-component.ftl create mode 100644 Resources/Prototypes/Traits/skills.yml diff --git a/Content.Server/Medical/DefibrillatorSystem.cs b/Content.Server/Medical/DefibrillatorSystem.cs index bf2f8805326..5fd9d670460 100644 --- a/Content.Server/Medical/DefibrillatorSystem.cs +++ b/Content.Server/Medical/DefibrillatorSystem.cs @@ -214,16 +214,16 @@ public void Zap(EntityUid uid, EntityUid target, EntityUid user, DefibrillatorCo } else { - if (_mobState.IsDead(target, mob)) - _damageable.TryChangeDamage(target, component.ZapHeal, true, origin: uid); + if (_mobState.IsDead(target, mob)) + _damageable.TryChangeDamage(target, component.ZapHeal, true, origin: uid); - if (_mobThreshold.TryGetThresholdForState(target, MobState.Dead, out var threshold) && - TryComp(target, out var damageableComponent) && - damageableComponent.TotalDamage < threshold) - { - _mobState.ChangeMobState(target, MobState.Critical, mob, uid); - dead = false; - } + if (_mobThreshold.TryGetThresholdForState(target, MobState.Dead, out var threshold) && + TryComp(target, out var damageableComponent) && + damageableComponent.TotalDamage < threshold) + { + _mobState.ChangeMobState(target, MobState.Critical, mob, uid); + dead = false; + } if (_mind.TryGetMind(target, out _, out var mind) && mind.Session is { } playerSession) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index abde38eaa1d..f9c608a8105 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2144,8 +2144,8 @@ public static readonly CVarDef /// Controls whether the entire CPR system runs. When false, nobody can perform CPR. You should probably remove the trait too /// if you are wishing to permanently disable the system on your server. /// - public static readonly CVarDef DoCPRSystem = - CVarDef.Create("cpr.do_cpr_system", true, CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef EnableCPR = + CVarDef.Create("cpr.enable", true, CVar.REPLICATED | CVar.SERVER); /// /// Toggles whether or not CPR reduces rot timers(As an abstraction of delaying brain death, the IRL actual purpose of CPR) @@ -2161,11 +2161,11 @@ public static readonly CVarDef CVarDef.Create("cpr.heals_airloss", true, CVar.REPLICATED | CVar.SERVER); /// - /// Toggles whether or not CPR has a (small) chance to revive a dead person if they are otherwise healthy enough for a defib to work. - /// This isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. + /// The chance for a patient to be resuscitated when CPR is successfully performed. + /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. /// - public static readonly CVarDef CPRResuscitate = - CVarDef.Create("cpr.do_resuscitate", true, CVar.REPLICATED | CVar.SERVER); + public static readonly CVarDef CPRResuscitationChance = + CVarDef.Create("cpr.resuscitation_chance", 0.01f, CVar.REPLICATED | CVar.SERVER); /// /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount diff --git a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs index 596fbc0c1d6..e01250858a1 100644 --- a/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs +++ b/Content.Shared/Medical/CPR/Components/CPRTrainingComponent.cs @@ -9,7 +9,7 @@ namespace Content.Shared.Medical.CPR public sealed partial class CPRTrainingComponent : Component { [DataField] - public SoundSpecifier? CPRSound = new SoundPathSpecifier("/Audio/Items/Defib/defib_safety_on.ogg"); + public SoundSpecifier CPRSound = new SoundPathSpecifier("/Audio/Effects/CPR.ogg"); /// /// How long the doafter for CPR takes @@ -22,6 +22,7 @@ public sealed partial class CPRTrainingComponent : Component [DataField] public float CrackRibsModifier = 1f; + public EntityUid? CPRPlayingStream; } [Serializable, NetSerializable] diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs index 904026b1dc5..9840b8ffbd4 100644 --- a/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.CVars.cs @@ -7,21 +7,21 @@ public sealed partial class CPRSystem { [Dependency] private readonly IConfigurationManager _cfg = default!; - public bool DoCPRSystem { get; private set; } - public bool CPRHealsAirloss { get; private set; } - public bool CPRReducesRot { get; private set; } - public bool CPRResuscitate { get; private set; } - public float CPRRotReductionMultiplier { get; private set; } - public float CPRAirlossReductionMultiplier { get; private set; } + public bool EnableCPR { get; private set; } + public bool HealsAirloss { get; private set; } + public bool ReducesRot { get; private set; } + public float ResuscitationChance { get; private set; } + public float RotReductionMultiplier { get; private set; } + public float AirlossReductionMultiplier { get; private set; } private void InitializeCVars() { - Subs.CVar(_cfg, CCVars.DoCPRSystem, value => DoCPRSystem = value, true); - Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => CPRHealsAirloss = value, true); - Subs.CVar(_cfg, CCVars.CPRReducesRot, value => CPRReducesRot = value, true); - Subs.CVar(_cfg, CCVars.CPRResuscitate, value => CPRResuscitate = value, true); - Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => CPRRotReductionMultiplier = value, true); - Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => CPRAirlossReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.EnableCPR, value => EnableCPR = value, true); + Subs.CVar(_cfg, CCVars.CPRHealsAirloss, value => HealsAirloss = value, true); + Subs.CVar(_cfg, CCVars.CPRReducesRot, value => ReducesRot = value, true); + Subs.CVar(_cfg, CCVars.CPRResuscitationChance, value => ResuscitationChance = value, true); + Subs.CVar(_cfg, CCVars.CPRRotReductionMultiplier, value => RotReductionMultiplier = value, true); + Subs.CVar(_cfg, CCVars.CPRAirlossReductionMultiplier, value => AirlossReductionMultiplier = value, true); } } } diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs index 964913f4f75..a41c8653ea6 100644 --- a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -7,8 +7,10 @@ using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Verbs; +using Robust.Shared.Network; using Robust.Shared.Utility; using Robust.Shared.Random; +using Robust.Shared.Audio.Systems; namespace Content.Shared.Medical.CPR { @@ -22,6 +24,8 @@ public sealed partial class CPRSystem : EntitySystem [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly SharedRottingSystem _rottingSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; + [Dependency] private readonly INetManager _net = default!; public override void Initialize() { base.Initialize(); @@ -32,7 +36,7 @@ public override void Initialize() private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsEvent args) { - if (!DoCPRSystem || !args.CanInteract || !args.CanAccess + if (!EnableCPR || !args.CanInteract || !args.CanAccess || !TryComp(args.Target, out var targetState) || targetState.CurrentState == MobState.Alive) return; @@ -41,7 +45,7 @@ private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsE { Act = () => { - StartCPR(uid, args.Target, targetState, component); + StartCPR(uid, args.Target, component); }, Text = Loc.GetString("cpr-verb"), Icon = new SpriteSpecifier.Rsi(new("Interface/Alerts/human_alive.rsi"), "health4"), @@ -50,7 +54,7 @@ private void AddCPRVerb(EntityUid uid, CPRTrainingComponent component, GetVerbsE args.Verbs.Add(verb); } - private void StartCPR(EntityUid performer, EntityUid target, MobStateComponent targetState, CPRTrainingComponent cprComponent) + private void StartCPR(EntityUid performer, EntityUid target, CPRTrainingComponent cprComponent) { if (HasComp(target)) { @@ -70,16 +74,20 @@ private void StartCPR(EntityUid performer, EntityUid target, MobStateComponent t return; } - if (_inventory.TryGetSlotEntity(target, "mask", out var maskSelf)) + if (_inventory.TryGetSlotEntity(performer, "mask", out var maskSelf)) { _popupSystem.PopupEntity(Loc.GetString("cpr-must-remove-own-mask", ("clothing", maskSelf)), performer, performer, PopupType.MediumCaution); return; } - _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); - _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + if (_net.IsServer) + { + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person", ("target", target)), target, performer, PopupType.Medium); + _popupSystem.PopupEntity(Loc.GetString("cpr-start-second-person-patient", ("user", performer)), target, target, PopupType.Medium); + cprComponent.CPRPlayingStream = _audio.PlayPvs(cprComponent.CPRSound, performer).Value.Entity; + } - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), target) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, performer, cprComponent.DoAfterDuration, new CPRDoAfterEvent(), performer, target, performer) { BreakOnTargetMove = true, BreakOnUserMove = true, @@ -90,25 +98,28 @@ private void StartCPR(EntityUid performer, EntityUid target, MobStateComponent t private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, CPRDoAfterEvent args) { - // There is PROBABLY a better way to do this, by all means let me know - DamageSpecifier healing = new() - { - DamageDict = new() - { - { "Airloss", -component.AirlossHeal * CPRAirlossReductionMultiplier} - } - }; + component.CPRPlayingStream = _audio.Stop(component.CPRPlayingStream); if (args.Target == null) return; - if (CPRHealsAirloss) + if (HealsAirloss) + { + // There is PROBABLY a better way to do this, by all means let me know + var healing = new DamageSpecifier() + { + DamageDict = new() + { + { "Asphyxiation", -component.AirlossHeal * AirlossReductionMultiplier} + } + }; _damageable.TryChangeDamage(args.Target, healing, true, origin: performer); + } - if (CPRReducesRot) - _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * CPRRotReductionMultiplier); + if (ReducesRot) + _rottingSystem.ReduceAccumulator((EntityUid) args.Target, component.DoAfterDuration * RotReductionMultiplier); - if (CPRResuscitate && _robustRandom.Prob(0.01f) + if (_robustRandom.Prob(ResuscitationChance) && _mobThreshold.TryGetThresholdForState((EntityUid) args.Target, MobState.Dead, out var threshold) && TryComp(args.Target, out var damageableComponent) && TryComp(args.Target, out var state) @@ -116,7 +127,6 @@ private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, C { _mobStateSystem.ChangeMobState((EntityUid) args.Target, MobState.Critical, state, performer); } - } } } diff --git a/Resources/Audio/Effects/CPR.ogg b/Resources/Audio/Effects/CPR.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2c7cedd2033c906029dcd1a8d90ab45b68bb0eba GIT binary patch literal 68840 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.mL>w?>>sa5J>hq2ux0H{*l6BSYS#*3Iz* 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

UUXQ{C-_~qG0dZv#l zCq_`E1x}SXgE`LQ zbrkgM_!ki11;k1qn1qlZ>3gGrlgiLc#;m7K+btJxRUTw*KY!M+G`4Gt zL!o!!t=q2pemc#DBobXk8@LecZ1vX+_U7cn-s3Nuw@%JLOx~W!vzwR2bO^gmY#ziR zUK28rv(w!%)+>qaP>q0wG|pQ;ayN|XGy)-K(|n*6JhSMK^}`F;Gat8djN-&9FH=U! zsK3F?$t=T;b=4`y+%#7bn0I?kP%P>~@yAbAJQn=iG=p{a8IT`UnE>*YwrMn$s#oO5 z6iX+$Om%$BuDNgi;4^=+4O`#AosL~gZ`25mst4u!QO5{fn{Aw>=I2~KYu4*$`>aF< zbDaIJ<%@4cdef;_BOB-{)ka=X;=rvhAHaElEJ}-Cge??rQT1Bep`4 z!1bNMLnhXf^IT+eXG*#(G(xB&sGsoAVnit6VgDJan8Bk4j?{f?<(_{#p~^jeN+mmo zGjPAi%Fd`+hRUKI1anaj?b928=EI88MEdokw_o2lKr4qJXd)+7R^F?3vf9ZSx|Q)G%#oW)tK_F)G}i&WSGGgV`sud z@r&}eb`%(1F&@sw@a0-a7d_o{$3&06>Ph{Bc)?bOqvA$`en>yJUJO-l^t=q%U1`WL z&qmmLx9pS}1!N15KFR3mckDlFz1VA(*~nVgEZvv#^SJ1MKUePm&`;*)_Q5%%&-gK(#xusMm618_PK{3@q~EU~XZe$M&vt;f`H3MH)H${hE|8*v&w7%IHE zPrkO={i3yfl-3lldHS4xJjzgBp&%7|R^q$$kp%K$)Rj6lJJX{zYT7qr)bh~8*I|OQ z&L4bMQ=tOvb)D@n{%fE!#gpQp$R{n7&enr!dSA4fthW9_%PR7IG)munD@O8?ip}58 zca0nu96BFafheG3^VgdK=Q%hmS(?upPCSZIhtCMT-uYi{(qMOW6`rGjAR;NjPF{u*AI~i89u%rBwDN`}Qeqk4b3f(A;2d zDH3A|Ri0Lh6oH_qWe4p=I3}vleR@IH16MxdA)A{vzv6*shF6v7j2rEF`SBaE10h|Z*(!2 ze~QwpJ)Sy=2YaX)ZgcPMDT`6<@f zg%_l-DW-TWxzD}PFlbg;_7oJW+6ek9H{b>|QHofMuIW6{&+GnW`RMH3^SKbY_2tkO zvn}aqp|=Vr5&S0k2&RTn(u?#vW(9ou0$4mYcreMDiSf8$7q1eJx^zT5us!&vy;(f?OFBw;9M`vdbK zK{?81CVms{)hG|uU0UO)g_fji5c8?fnu0Eh| zkLwv}W6It$n=sDMD!>=$$m#9M2_s61?#A{)7m9y1`eG&pEwWz&ak0>}+{#72V%ud; zjgxJpME!VWj%M=@>MwT-tb^P>tC6n8JduY^!cRcVGkeb`U?!F%0DR4#*wG66TX&!Z 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 literal 0 HcmV?d00001 diff --git a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl new file mode 100644 index 00000000000..d1967665618 --- /dev/null +++ b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl @@ -0,0 +1,5 @@ +cpr-start-second-person = You start performing CPR on {CAPITALIZE($target)}. +cpr-start-second-person-patient = {CAPITALIZE(THE($user))} starts performing CPR on you. +cpr-must-remove = You must remove {THE($clothing)} from the patient. +cpr-must-remove-own-mask = You must remove your {THE($clothing)}. +cpr-target-rotting = {CAPITALIZE($entity)} is too far gone... diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index e9163bdb548..ef5ee5da834 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -31,3 +31,7 @@ trait-description-SocialAnxiety = You are anxious when you speak and stutter. trait-name-Snoring = Snoring trait-description-Snoring = You will snore while sleeping. + +trait-name-CPRTraining = CPR Training +trait-description-CPRTraining = At some point in your life, you have received training in how to perform CPR. + This trait is automatically given for free to medical doctors, and is intended for non-medical characters diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml index d57fe982c57..874ffda5705 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chemist.yml @@ -14,6 +14,10 @@ - Medical - Chemistry - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ChemistGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml index aac50c526c9..76a4c131c0d 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/chief_medical_officer.yml @@ -44,6 +44,7 @@ components: - type: PsionicBonusChance #Nyano - Summary: makes it more likely to become psionic. flatBonus: 0.025 + - type: CPRTraining - type: startingGear id: CMOGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml index fbc6116f46b..02878883249 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_doctor.yml @@ -16,6 +16,10 @@ extendedAccess: - Chemistry - Paramedic # DeltaV - Add Paramedic access + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: DoctorGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml index 0166a3dfadb..003eab22d25 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/medical_intern.yml @@ -15,6 +15,10 @@ access: - Medical - Maintenance + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: MedicalInternGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml index e4ae7a7dd50..2fa617efbd5 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/paramedic.yml @@ -23,6 +23,10 @@ - Paramedic # DeltaV - Add Paramedic access extendedAccess: - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: ParamedicGear diff --git a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml index 03473cc7cbc..9532fe5f534 100644 --- a/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml +++ b/Resources/Prototypes/Roles/Jobs/Medical/senior_physician.yml @@ -21,6 +21,10 @@ - Medical - Maintenance - Chemistry + special: + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: SeniorPhysicianGear diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml new file mode 100644 index 00000000000..fa06198c6f4 --- /dev/null +++ b/Resources/Prototypes/Traits/skills.yml @@ -0,0 +1,15 @@ +- type: trait + id: CPRTraining + category: Uncategorized + points: -2 + components: + - type: CPRTraining + requirements: + - !type:CharacterJobRequirement + inverted: true + jobs: + - MedicalDoctor + - Chemist + - MedicalIntern + - Paramedic + - ChiefMedicalOfficer From eb4ecaf9b168254ed7ca42deca49e4faebe59224 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 2 Jul 2024 14:06:12 -0400 Subject: [PATCH 04/11] Update CCVars.cs --- Content.Shared/CCVar/CCVars.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index e5d30e11c1d..aef67326443 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -2204,7 +2204,7 @@ public static readonly CVarDef /// Setting this above 0 isn't very realistic, but people who see CPR in movies and TV will expect CPR to work this way. ///

public static readonly CVarDef CPRResuscitationChance = - CVarDef.Create("cpr.resuscitation_chance", 0.01f, CVar.REPLICATED | CVar.SERVER); + CVarDef.Create("cpr.resuscitation_chance", 0.05f, CVar.REPLICATED | CVar.SERVER); /// /// By default, CPR reduces rot timers by an amount of seconds equal to the time spent performing CPR. This is an optional multiplier that can increase or decrease the amount From 8f483093c21b8ca4b90cd3abc112eebc4087d093 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 16 Jul 2024 13:53:38 -0400 Subject: [PATCH 05/11] Update cpr-training-component.ftl --- .../Locale/en-US/medical/components/cpr-training-component.ftl | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl index d1967665618..7ed824a369f 100644 --- a/Resources/Locale/en-US/medical/components/cpr-training-component.ftl +++ b/Resources/Locale/en-US/medical/components/cpr-training-component.ftl @@ -3,3 +3,4 @@ cpr-start-second-person-patient = {CAPITALIZE(THE($user))} starts performing CPR cpr-must-remove = You must remove {THE($clothing)} from the patient. cpr-must-remove-own-mask = You must remove your {THE($clothing)}. cpr-target-rotting = {CAPITALIZE($entity)} is too far gone... +cpr-verb = Perform CPR From 41ddee4a4aef46df6404e33d5594a628f4fb3411 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 16 Jul 2024 14:11:15 -0400 Subject: [PATCH 06/11] Update skills.yml --- Resources/Prototypes/Traits/skills.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index b79a854cc6f..3acb30eb837 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -24,13 +24,14 @@ requirements: - !type:CharacterJobRequirement inverted: true + jobs: - Borg - MedicalBorg - !type:CharacterTraitRequirement inverted: true traits: - LightweightDrunk - + - type: trait id: Thieving category: Physical From 2fc7725c94ea1e08277174f4fb3cd25d2c7f80e3 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 22 Jul 2024 16:40:25 -0400 Subject: [PATCH 07/11] Update CPRSystem.cs --- Content.Shared/Medical/CPR/Systems/CPRSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs index a41c8653ea6..799c0664a66 100644 --- a/Content.Shared/Medical/CPR/Systems/CPRSystem.cs +++ b/Content.Shared/Medical/CPR/Systems/CPRSystem.cs @@ -125,7 +125,7 @@ private void OnCPRDoAfter(EntityUid performer, CPRTrainingComponent component, C && TryComp(args.Target, out var state) && damageableComponent.TotalDamage < threshold) { - _mobStateSystem.ChangeMobState((EntityUid) args.Target, MobState.Critical, state, performer); + _mobStateSystem.ChangeMobState(args.Target.Value, MobState.Critical, state, performer); } } } From ae4c6a463b898549ecd9e79fb4c92977625d6648 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Mon, 22 Jul 2024 16:41:16 -0400 Subject: [PATCH 08/11] Update DefibrillatorSystem.cs --- Content.Server/Medical/DefibrillatorSystem.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Content.Server/Medical/DefibrillatorSystem.cs b/Content.Server/Medical/DefibrillatorSystem.cs index 5fd9d670460..bf2f8805326 100644 --- a/Content.Server/Medical/DefibrillatorSystem.cs +++ b/Content.Server/Medical/DefibrillatorSystem.cs @@ -214,16 +214,16 @@ public void Zap(EntityUid uid, EntityUid target, EntityUid user, DefibrillatorCo } else { - if (_mobState.IsDead(target, mob)) - _damageable.TryChangeDamage(target, component.ZapHeal, true, origin: uid); + if (_mobState.IsDead(target, mob)) + _damageable.TryChangeDamage(target, component.ZapHeal, true, origin: uid); - if (_mobThreshold.TryGetThresholdForState(target, MobState.Dead, out var threshold) && - TryComp(target, out var damageableComponent) && - damageableComponent.TotalDamage < threshold) - { - _mobState.ChangeMobState(target, MobState.Critical, mob, uid); - dead = false; - } + if (_mobThreshold.TryGetThresholdForState(target, MobState.Dead, out var threshold) && + TryComp(target, out var damageableComponent) && + damageableComponent.TotalDamage < threshold) + { + _mobState.ChangeMobState(target, MobState.Critical, mob, uid); + dead = false; + } if (_mind.TryGetMind(target, out _, out var mind) && mind.Session is { } playerSession) From be5f3e7adcd6669ebbe3dc05bd8286b83f804456 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 00:54:01 -0400 Subject: [PATCH 09/11] Update skills.yml --- Resources/Prototypes/Traits/skills.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 358803dd4b8..252356e906c 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -18,9 +18,6 @@ id: HeavyweightDrunk category: Physical points: -2 - components: - - type: LightweightDrunk - boozeStrengthMultiplier: 0.5 requirements: - !type:CharacterJobRequirement inverted: true From 3e17d11d7083c94050e4c8ae16b65217bdf26819 Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 00:55:27 -0400 Subject: [PATCH 10/11] Moving it to Mental category(It's something you KNOW) --- Resources/Prototypes/Traits/skills.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index 252356e906c..d39527ebd51 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -1,6 +1,6 @@ - type: trait id: CPRTraining - category: Physical + category: Mental points: -2 components: - type: CPRTraining From 0f27c379df2a87919e0a63cd8ac197d76133472a Mon Sep 17 00:00:00 2001 From: VMSolidus Date: Tue, 6 Aug 2024 00:56:34 -0400 Subject: [PATCH 11/11] CPR on brigmed by default --- Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml | 3 +++ Resources/Prototypes/Traits/skills.yml | 1 + 2 files changed, 4 insertions(+) diff --git a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml index daf7f1195c0..f4b2fe95e14 100644 --- a/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml +++ b/Resources/Prototypes/DeltaV/Roles/Jobs/Security/brigmedic.yml @@ -26,6 +26,9 @@ special: - !type:AddImplantSpecial implants: [ MindShieldImplant ] + - !type:AddComponentSpecial + components: + - type: CPRTraining - type: startingGear id: CorpsmanGear # see Prototypes/Roles/Jobs/Fun/misc_startinggear.yml for "BrigmedicGear" diff --git a/Resources/Prototypes/Traits/skills.yml b/Resources/Prototypes/Traits/skills.yml index d39527ebd51..b23e0216224 100644 --- a/Resources/Prototypes/Traits/skills.yml +++ b/Resources/Prototypes/Traits/skills.yml @@ -13,6 +13,7 @@ - MedicalIntern - Paramedic - ChiefMedicalOfficer + - Brigmedic - type: trait id: HeavyweightDrunk