diff --git a/Content.Server/Disease/DiseaseDiagnosisSystem.cs b/Content.Server/Disease/DiseaseDiagnosisSystem.cs
index 705ac08d2d..36f2dcf678 100644
--- a/Content.Server/Disease/DiseaseDiagnosisSystem.cs
+++ b/Content.Server/Disease/DiseaseDiagnosisSystem.cs
@@ -16,11 +16,13 @@ using Robust.Shared.Player;
using Robust.Shared.Audio;
using Robust.Shared.Utility;
using Content.Shared.Tools.Components;
+using Content.Server.Station.Systems;
namespace Content.Server.Disease
{
+ ///
/// Everything that's about disease diangosis and machines is in here
-
+ ///
public sealed class DiseaseDiagnosisSystem : EntitySystem
{
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
@@ -29,6 +31,8 @@ namespace Content.Server.Disease
[Dependency] private readonly InventorySystem _inventorySystem = default!;
[Dependency] private readonly PaperSystem _paperSystem = default!;
+ [Dependency] private readonly StationSystem _stationSystem = default!;
+
public override void Initialize()
{
base.Initialize();
@@ -36,9 +40,9 @@ namespace Content.Server.Disease
SubscribeLocalEvent(OnExamined);
SubscribeLocalEvent(OnAfterInteractUsing);
SubscribeLocalEvent(OnAfterInteractUsingVaccine);
- /// Visuals
+ // Visuals
SubscribeLocalEvent(OnPowerChanged);
- /// Private Events
+ // Private Events
SubscribeLocalEvent(OnDiagnoserFinished);
SubscribeLocalEvent(OnVaccinatorFinished);
SubscribeLocalEvent(OnTargetSwabSuccessful);
@@ -55,26 +59,29 @@ namespace Content.Server.Disease
public override void Update(float frameTime)
{
foreach (var uid in AddQueue)
+ {
EnsureComp(uid);
+ }
AddQueue.Clear();
foreach (var uid in RemoveQueue)
+ {
RemComp(uid);
+ }
RemoveQueue.Clear();
- foreach (var (runningComp, diseaseMachine) in EntityQuery(false))
+ foreach (var (_, diseaseMachine) in EntityQuery())
{
- if (diseaseMachine.Accumulator < diseaseMachine.Delay)
- {
- diseaseMachine.Accumulator += frameTime;
- return;
- }
+ diseaseMachine.Accumulator += frameTime;
- diseaseMachine.Accumulator = 0;
- var ev = new DiseaseMachineFinishedEvent(diseaseMachine);
- RaiseLocalEvent(diseaseMachine.Owner, ev, false);
- RemoveQueue.Enqueue(diseaseMachine.Owner);
+ while (diseaseMachine.Accumulator < diseaseMachine.Delay)
+ {
+ diseaseMachine.Accumulator -= diseaseMachine.Delay;
+ var ev = new DiseaseMachineFinishedEvent(diseaseMachine);
+ RaiseLocalEvent(diseaseMachine.Owner, ev);
+ RemoveQueue.Enqueue(diseaseMachine.Owner);
+ }
}
}
@@ -245,7 +252,7 @@ namespace Content.Server.Disease
report.AddMarkup(cureResistLine);
report.PushNewline();
- /// Add Cures
+ // Add Cures
if (disease.Cures.Count == 0)
{
report.AddMarkup(Loc.GetString("diagnoser-no-cures"));
@@ -265,6 +272,17 @@ namespace Content.Server.Disease
return report;
}
+
+ public bool ServerHasDisease(DiseaseServerComponent server, DiseasePrototype disease)
+ {
+ bool has = false;
+ foreach (var serverDisease in server.Diseases)
+ {
+ if (serverDisease.ID == disease.ID)
+ has = true;
+ }
+ return has;
+ }
///
/// Appearance stuff
///
@@ -327,18 +345,41 @@ namespace Content.Server.Disease
var isPowered = this.IsPowered(uid, EntityManager);
UpdateAppearance(uid, isPowered, false);
// spawn a piece of paper.
- var printed = EntityManager.SpawnEntity(args.Machine.MachineOutput, Transform(uid).Coordinates);
+ var printed = Spawn(args.Machine.MachineOutput, Transform(uid).Coordinates);
if (!TryComp(printed, out var paper))
return;
- var reportTitle = string.Empty;
+ string reportTitle;
FormattedMessage contents = new();
if (args.Machine.Disease != null)
{
reportTitle = Loc.GetString("diagnoser-disease-report", ("disease", args.Machine.Disease.Name));
contents = AssembleDiseaseReport(args.Machine.Disease);
- } else
+
+ var known = false;
+
+ foreach (var server in EntityQuery(true))
+ {
+ if (_stationSystem.GetOwningStation(server.Owner) != _stationSystem.GetOwningStation(uid))
+ continue;
+
+ if (ServerHasDisease(server, args.Machine.Disease))
+ {
+ known = true;
+ }
+ else
+ {
+ server.Diseases.Add(args.Machine.Disease);
+ }
+ }
+
+ if (!known)
+ {
+ Spawn("ResearchDisk5000", Transform(uid).Coordinates);
+ }
+ }
+ else
{
reportTitle = Loc.GetString("diagnoser-disease-report-none");
contents.AddMarkup(Loc.GetString("diagnoser-disease-report-none-contents"));
@@ -351,13 +392,13 @@ namespace Content.Server.Disease
///
/// Prints a vaccine that will vaccinate
/// against the disease on the inserted swab.
- ///
+ ///
private void OnVaccinatorFinished(EntityUid uid, DiseaseVaccineCreatorComponent component, DiseaseMachineFinishedEvent args)
{
UpdateAppearance(uid, this.IsPowered(uid, EntityManager), false);
// spawn a vaccine
- var vaxx = EntityManager.SpawnEntity(args.Machine.MachineOutput, Transform(uid).Coordinates);
+ var vaxx = Spawn(args.Machine.MachineOutput, Transform(uid).Coordinates);
if (!TryComp(vaxx, out var vaxxComp))
return;
diff --git a/Content.Server/Disease/Server/DiseaseServerComponent.cs b/Content.Server/Disease/Server/DiseaseServerComponent.cs
new file mode 100644
index 0000000000..7735910b5c
--- /dev/null
+++ b/Content.Server/Disease/Server/DiseaseServerComponent.cs
@@ -0,0 +1,15 @@
+using Content.Shared.Disease;
+
+
+namespace Content.Server.Disease.Components
+{
+ [RegisterComponent]
+ public sealed class DiseaseServerComponent : Component
+ {
+ ///
+ /// Which diseases this server has information on.
+ ///
+ [ViewVariables(VVAccess.ReadWrite)]
+ public List Diseases = new();
+ }
+}
diff --git a/Content.Server/Research/Disk/ResearchDiskComponent.cs b/Content.Server/Research/Disk/ResearchDiskComponent.cs
new file mode 100644
index 0000000000..48f96af2e3
--- /dev/null
+++ b/Content.Server/Research/Disk/ResearchDiskComponent.cs
@@ -0,0 +1,9 @@
+namespace Content.Server.Research.Disk
+{
+ [RegisterComponent]
+ public sealed class ResearchDiskComponent : Component
+ {
+ [DataField("points")]
+ public int Points = 1000;
+ }
+}
diff --git a/Content.Server/Research/Disk/ResearchDiskSystem.cs b/Content.Server/Research/Disk/ResearchDiskSystem.cs
new file mode 100644
index 0000000000..35ac5f8670
--- /dev/null
+++ b/Content.Server/Research/Disk/ResearchDiskSystem.cs
@@ -0,0 +1,30 @@
+using Content.Shared.Interaction;
+using Content.Server.Research.Components;
+using Content.Server.Popups;
+using Robust.Shared.Player;
+
+namespace Content.Server.Research.Disk
+{
+ public sealed class ResearchDiskSystem : EntitySystem
+ {
+ [Dependency] private readonly PopupSystem _popupSystem = default!;
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnAfterInteract);
+ }
+
+ private void OnAfterInteract(EntityUid uid, ResearchDiskComponent component, AfterInteractEvent args)
+ {
+ if (!args.CanReach)
+ return;
+
+ if (!TryComp(args.Target, out var server))
+ return;
+
+ server.Points += component.Points;
+ _popupSystem.PopupEntity(Loc.GetString("research-disk-inserted", ("points", component.Points)), args.Target.Value, Filter.Entities(args.User));
+ EntityManager.QueueDeleteEntity(uid);
+ }
+ }
+}
diff --git a/Resources/Locale/en-US/research/components/research-disk.ftl b/Resources/Locale/en-US/research/components/research-disk.ftl
new file mode 100644
index 0000000000..516f48c121
--- /dev/null
+++ b/Resources/Locale/en-US/research/components/research-disk.ftl
@@ -0,0 +1 @@
+research-disk-inserted = You insert the disk, adding {$points} points to the server.
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
index 2620ab2380..5c89172ae1 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/salvage.yml
@@ -40,6 +40,8 @@
prob: 0.1
- id: WelderIndustrialAdvanced
prob: 0.1
+ - id: ResearchDisk
+ prob: 0.1
# - Service
- id: CrayonBox
prob: 0.1
@@ -64,6 +66,8 @@
# - Ammo
- id: MagazineBoxMagnum
prob: 0.01
+ - id: ResearchDisk5000
+ prob: 0.01
# Just no (0.1%)
# - Working guns
- id: WeaponRevolverDeckard
@@ -73,6 +77,8 @@
# - Skub
- id: Skub
prob: 0.001
+ - id: ResearchDisk10000
+ prob: 0.001
- id: ClothingHeadHatCatEars
prob: 0.01
# TRAITOR EQUIPMENT (0.01%)
diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
index 20df4edf75..a221cf0f66 100644
--- a/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
+++ b/Resources/Prototypes/Entities/Markers/Spawners/Random/maintenance.yml
@@ -71,6 +71,7 @@
- WeaponFlareGun
- SheetSteel
- SheetPlastic
+ - ResearchDisk
chance: 0.6
offset: 0.0
diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml
new file mode 100644
index 0000000000..eb35884cba
--- /dev/null
+++ b/Resources/Prototypes/Entities/Objects/Specific/Research/disk.yml
@@ -0,0 +1,28 @@
+- type: entity
+ parent: BaseItem
+ id: ResearchDisk
+ name: research point disk (1000)
+ description: A disk for the R&D server containing 1000 points.
+ components:
+ - type: Sprite
+ sprite: Objects/Specific/Research/researchdisk.rsi
+ state: icon
+ - type: ResearchDisk
+
+- type: entity
+ parent: ResearchDisk
+ id: ResearchDisk5000
+ name: research point disk (5000)
+ description: A disk for the R&D server containing 5000 points.
+ components:
+ - type: ResearchDisk
+ points: 5000
+
+- type: entity
+ parent: ResearchDisk
+ id: ResearchDisk10000
+ name: research point disk (10000)
+ description: A disk for the R&D server containing 10000 points.
+ components:
+ - type: ResearchDisk
+ points: 10000
diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml
index b8f094894c..3bca06eed1 100644
--- a/Resources/Prototypes/Entities/Structures/Machines/research.yml
+++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml
@@ -29,6 +29,7 @@
SheetSteel1:
min: 1
max: 2
+ - type: DiseaseServer
- type: AmbientSound
volume: -9
range: 5
diff --git a/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/icon.png b/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/icon.png
new file mode 100644
index 0000000000..8208de130b
Binary files /dev/null and b/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/icon.png differ
diff --git a/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/meta.json b/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/meta.json
new file mode 100644
index 0000000000..a2fe52e3df
--- /dev/null
+++ b/Resources/Textures/Objects/Specific/Research/researchdisk.rsi/meta.json
@@ -0,0 +1,14 @@
+{
+ "version": 1,
+ "license": "CC-BY-SA-3.0",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/f8f4aeda930fcd0805ca4cc76d9bc9412a5b3428",
+ "size": {
+ "x": 32,
+ "y": 32
+ },
+ "states": [
+ {
+ "name": "icon"
+ }
+ ]
+}