mirror of
https://github.com/space-wizards/space-station-14.git
synced 2026-02-15 03:31:30 +01:00
* Disease system first pass * Renamed HealthChange * First working version of diseases (wtf???) * Fix the cursed yaml initialization * Pop-Up effect * Generic status effect * Create copy of prototype * CureDiseaseEffect * Disease resistance * Spaceacillin * Nerf spaceacillin now that we know it works * Sneezing, Coughing, Snoughing * Fix queuing, prevent future issues * Disease protection * Disease outbreak event * Disease Reagent Cure * Chem cause disease effect * Disease artifacts * Try infect when interacting with diseased * Diseases don't have to be infectious * Talking without a mask does a snough * Temperature cure * Bedrest * DiseaseAdjustReagent * Tweak how disease statuses work to be a bit less shit * A few more diseases * Natural immunity (can't get the same disease twice) * Polished up some diseases, touched up spaceacillin production * Rebalanced transmission * Edit a few diseases, make disease cures support a minimum value * Nitrile gloves, more disease protection sources * Health scanner shows diseased status * Clean up disease system * Traitor item * Mouth swabs * Disease diagnoser machine * Support for clean samples * Vaccines + fixes * Pass on disease resistant clothes * More work on non-infectious diseases & vaccines * Handle dead bodies * Added the relatively CBT visualizer * Pass over diseases and their populators * Comment stuff * Readability cleanup * Add printing sound to diagnoser, fix printing bug * vaccinator sound, seal up some classes * Make disease protection equip detection not shit (thanks whoever wrote addaccentcomponent) * Mirror review * More review stuff * More mirror review stuff * Refactor snoughing * Redid report creator * Fix snough messages, new vaccinator sound * Mirror review naming * Woops, forgot the artifact * Add recipes and fills * Rebalance space cold and robovirus * Give lizarb disease interaction stuff * Tweak some stuff and move things around * Add diseases to mice (since animal vectors are interesting and can be used to make vaccines) * Remove unused reagent
141 lines
5.3 KiB
C#
141 lines
5.3 KiB
C#
using System.Threading;
|
|
using Content.Server.DoAfter;
|
|
using Content.Server.Medical.Components;
|
|
using Content.Server.Disease;
|
|
using Content.Server.Popups;
|
|
using Content.Shared.Damage;
|
|
using Content.Shared.Interaction;
|
|
using Content.Shared.MobState.Components;
|
|
using Robust.Server.GameObjects;
|
|
using Robust.Shared.Player;
|
|
using static Content.Shared.MedicalScanner.SharedHealthAnalyzerComponent;
|
|
|
|
namespace Content.Server.Medical
|
|
{
|
|
public sealed class HealthAnalyzerSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
|
|
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
SubscribeLocalEvent<HealthAnalyzerComponent, ActivateInWorldEvent>(HandleActivateInWorld);
|
|
SubscribeLocalEvent<HealthAnalyzerComponent, AfterInteractEvent>(OnAfterInteract);
|
|
SubscribeLocalEvent<TargetScanSuccessfulEvent>(OnTargetScanSuccessful);
|
|
SubscribeLocalEvent<ScanCancelledEvent>(OnScanCancelled);
|
|
}
|
|
|
|
private void HandleActivateInWorld(EntityUid uid, HealthAnalyzerComponent healthAnalyzer, ActivateInWorldEvent args)
|
|
{
|
|
OpenUserInterface(args.User, healthAnalyzer);
|
|
}
|
|
|
|
private void OnAfterInteract(EntityUid uid, HealthAnalyzerComponent healthAnalyzer, AfterInteractEvent args)
|
|
{
|
|
if (healthAnalyzer.CancelToken != null)
|
|
{
|
|
healthAnalyzer.CancelToken.Cancel();
|
|
healthAnalyzer.CancelToken = null;
|
|
return;
|
|
}
|
|
|
|
if (args.Target == null)
|
|
return;
|
|
|
|
if (!args.CanReach)
|
|
return;
|
|
|
|
if (healthAnalyzer.CancelToken != null)
|
|
return;
|
|
|
|
if (!HasComp<MobStateComponent>(args.Target))
|
|
return;
|
|
|
|
healthAnalyzer.CancelToken = new CancellationTokenSource();
|
|
_doAfterSystem.DoAfter(new DoAfterEventArgs(args.User, healthAnalyzer.ScanDelay, healthAnalyzer.CancelToken.Token, target: args.Target)
|
|
{
|
|
BroadcastFinishedEvent = new TargetScanSuccessfulEvent(args.User, args.Target, healthAnalyzer),
|
|
BroadcastCancelledEvent = new ScanCancelledEvent(healthAnalyzer),
|
|
BreakOnTargetMove = true,
|
|
BreakOnUserMove = true,
|
|
BreakOnStun = true,
|
|
NeedHand = true
|
|
});
|
|
}
|
|
|
|
private void OnTargetScanSuccessful(TargetScanSuccessfulEvent args)
|
|
{
|
|
args.Component.CancelToken = null;
|
|
UpdateScannedUser(args.Component.Owner, args.User, args.Target, args.Component);
|
|
/// Below is for the traitor item
|
|
/// Piggybacking off another component's doafter is complete CBT so I gave up
|
|
/// and put it on the same component
|
|
if (!args.Component.Fake || args.Component.Disease == string.Empty || args.Target == null)
|
|
return;
|
|
|
|
EntitySystem.Get<DiseaseSystem>().TryAddDisease(null, null, args.Component.Disease, args.Target.Value);
|
|
|
|
if (args.User == args.Target)
|
|
{
|
|
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-self", ("disease", args.Component.Disease)),
|
|
args.User, Filter.Entities(args.User));
|
|
return;
|
|
}
|
|
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-other", ("target", args.Target), ("disease", args.Component.Disease)),
|
|
args.User, Filter.Entities(args.User));
|
|
}
|
|
|
|
private void OpenUserInterface(EntityUid user, HealthAnalyzerComponent healthAnalyzer)
|
|
{
|
|
if (!TryComp<ActorComponent>(user, out var actor))
|
|
return;
|
|
|
|
healthAnalyzer.UserInterface?.Open(actor.PlayerSession);
|
|
}
|
|
|
|
public void UpdateScannedUser(EntityUid uid, EntityUid user, EntityUid? target, HealthAnalyzerComponent? healthAnalyzer)
|
|
{
|
|
if (!Resolve(uid, ref healthAnalyzer))
|
|
return;
|
|
|
|
if (target == null || healthAnalyzer.UserInterface == null)
|
|
return;
|
|
|
|
if (!HasComp<DamageableComponent>(target))
|
|
return;
|
|
|
|
OpenUserInterface(user, healthAnalyzer);
|
|
healthAnalyzer.UserInterface?.SendMessage(new HealthAnalyzerScannedUserMessage(target));
|
|
}
|
|
|
|
private static void OnScanCancelled(ScanCancelledEvent args)
|
|
{
|
|
args.HealthAnalyzer.CancelToken = null;
|
|
}
|
|
|
|
private sealed class ScanCancelledEvent : EntityEventArgs
|
|
{
|
|
public readonly HealthAnalyzerComponent HealthAnalyzer;
|
|
public ScanCancelledEvent(HealthAnalyzerComponent healthAnalyzer)
|
|
{
|
|
HealthAnalyzer = healthAnalyzer;
|
|
}
|
|
}
|
|
|
|
private sealed class TargetScanSuccessfulEvent : EntityEventArgs
|
|
{
|
|
public EntityUid User { get; }
|
|
public EntityUid? Target { get; }
|
|
public HealthAnalyzerComponent Component { get; }
|
|
|
|
public TargetScanSuccessfulEvent(EntityUid user, EntityUid? target, HealthAnalyzerComponent component)
|
|
{
|
|
User = user;
|
|
Target = target;
|
|
Component = component;
|
|
}
|
|
}
|
|
}
|
|
}
|