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
W%U+LcTAqGCfXt1pjA{)$6aELUJEiLY
diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw.png
deleted file mode 100644
index cab28e89b0c0c89e00ef818bd938c9ad45fe44a4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 6390
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
diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw_r.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_started_cw_r.png
deleted file mode 100644
index ce21cbb30ffc25f25009859c0263c12d228d8a4a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3197
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
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped.png
new file mode 100644
index 0000000000000000000000000000000000000000..39ceef68cdd9be1776a38b54d59f11ddcbd17b3b
GIT binary patch
literal 1078
zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!7>k44ofy`glX(f`u%tWsIx;Y9
z?C1WI$O`0}1^9%xs_R*}_(q%Cd09F6)iW^Y8r!zEwnoJ#R#sLfCMGJV={dN20o5*L
zU`S(N@KIy%@$mt2t23=u11X`BAiv=M=z!tT{{2EgSL5h);
zff2|8IYb)D26X6s4hbT1CVUnZiBEbR~R<{
z)irs#IEF;H-wnN3^jLxCNz$AveQ!T(qmI3&&SUnq~u
zv{kw3S7YJ@#tF}EF@&CQ(q-&c5~yaJDA;!WYO&Cv>c-eE*8~P3)4q%&5^YKa?hO?w
zQVPi|cT(*tzTQ8^?!ejjLFC7)r9V_ZYunr15MzC)X)x1&1IOeu_5PnVDo)gB*i5pW
z{GI8mb)hAZg-)z~;ctFp!=*Z2_@lADI`xOqH+E8F)
z|7P!8AIrsU>%N&XwTLQ6fe5`*4a$BBd**HsX0T$iJap^iABAS=7_~(=7_5#(@4EGH
z!;*bm`sfSp^i)%)7kJ@3N8Z4`W}ou#$~O
z)sm(K$?W>wSxo^c0uTSnKUyBX
U_ohUT0w`sAy85}Sb4q9e0N00>%m4rY
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_ccw.png b/Resources/Textures/Structures/conveyor.rsi/conveyor_stopped_ccw.png
deleted file mode 100644
index 05c488f1f4b716715332f9bc26281f653bd9c4cb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 2381
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
diff --git a/Resources/Textures/Structures/conveyor.rsi/meta.json b/Resources/Textures/Structures/conveyor.rsi/meta.json
index 3bb9efe797..3845e5a433 100644
--- a/Resources/Textures/Structures/conveyor.rsi/meta.json
+++ b/Resources/Textures/Structures/conveyor.rsi/meta.json
@@ -1,7 +1,7 @@
{
- "version": 1,
+ "version": 2,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/c6e3401f2e7e1e55c57060cdf956a98ef1fefc24 and modified by Swept, switch-fwd and switch-rev modified by RedBookcase (Github)",
+ "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/8e33113cfe8b5da0e64d74c842bec0e6059d992d and modified by Swept and Peperos, switch-fwd and switch-rev modified by RedBookcase (Github)",
"size": {
"x": 32,
"y": 32
@@ -11,228 +11,106 @@
"name": "conveyor_loose"
},
{
- "name": "conveyor_started_ccw",
- "directions": 8,
+ "name": "conveyor_loose_2"
+ },
+ {
+ "name": "conveyor_loose_3"
+ },
+ {
+ "name": "conveyor_started",
+ "directions": 4,
"delays": [
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
]
]
},
{
- "name": "conveyor_started_ccw_r",
- "directions": 8,
+ "name": "conveyor_started_r",
+ "directions": 4,
"delays": [
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
],
[
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032,
+ 0.032
]
]
},
{
- "name": "conveyor_started_cw",
- "directions": 8,
- "delays": [
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ]
- ]
- },
- {
- "name": "conveyor_started_cw_r",
- "directions": 8,
- "delays": [
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ],
- [
- 0.1,
- 0.1,
- 0.1,
- 0.1
- ]
- ]
- },
- {
- "name": "conveyor_stopped_ccw",
- "directions": 8
- },
- {
- "name": "conveyor_stopped_cw",
- "directions": 8
+ "name": "conveyor_stopped",
+ "directions": 4
},
{
"name": "switch"
From adc4943628c0e11d280cb5d40af82af34cfe9932 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sat, 16 May 2026 20:11:21 +0000
Subject: [PATCH 11/52] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 16 +++++++++-------
1 file changed, 9 insertions(+), 7 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index f8bc1218a7..25fd387c80 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,11 +1,4 @@
Entries:
-- author: Jrpl
- changes:
- - message: Chameleon clothing made of Cloth can now be eaten by Moths.
- type: Tweak
- id: 9180
- time: '2025-11-01T13:37:05.0000000+00:00'
- url: https://github.com/space-wizards/space-station-14/pull/41232
- author: SlamBamActionman
changes:
- message: Fixed the G.O.R.I.L.L.A gauntlet being able to unanchor walls, doors
@@ -4080,3 +4073,12 @@
id: 9691
time: '2026-05-16T18:18:37.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/43804
+- author: ProPeperos
+ changes:
+ - message: Conveyor Belts now have a new directional sprite!
+ type: Add
+ - message: Conveyor Belts now stack to 3, but are 2 times bigger in inventory
+ type: Tweak
+ id: 9692
+ time: '2026-05-16T20:10:12.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/43599
From 7e8cdd7f277bc4188239c5319372bba1e148c02e Mon Sep 17 00:00:00 2001
From: Tayrtahn
Date: Sat, 16 May 2026 15:56:00 -0400
Subject: [PATCH 12/52] Add xmldocs to NUnit constraint extensions (#43887)
---
.../Constraints/CompConstraintExtensions.cs | 42 ++++++++++
.../NUnit/Constraints/LifeStageConstraint.cs | 78 +++++++++++++++++++
2 files changed, 120 insertions(+)
diff --git a/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs b/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs
index 1586c52e03..34cbe6f682 100644
--- a/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs
+++ b/Content.IntegrationTests/NUnit/Constraints/CompConstraintExtensions.cs
@@ -20,12 +20,14 @@ public static class CompConstraintExtensions
{
extension(Has)
{
+ ///
public static ResolvableConstraintExpression Comp(IIntegrationInstance instance)
where T : IComponent
{
return new ConstraintExpression().Comp(instance);
}
+ ///
public static ResolvableConstraintExpression Comp(Type t, IIntegrationInstance instance)
{
return new ConstraintExpression().Comp(t, instance);
@@ -34,12 +36,52 @@ public static class CompConstraintExtensions
extension(ConstraintExpression expr)
{
+ ///
+ /// Returns a new constraint which will either test for the existence of a
+ /// on the entity being tested or apply any following constraint to that component.
+ ///
+ /// The component Type to check for.
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity has an ItemComponent on the server.
+ /// Assert.That(myEntity, Has.Comp<ItemComponent>(Server));
+ ///
+ /// // Assert that the server-sided entity myEntity has an ItemComponent with a Size field equal to "Small"
+ /// Assert.That(myEntity,
+ /// Has
+ /// .Comp<ItemComponent>(Server)
+ /// .Property(nameof(ItemComponent.Size))
+ /// .EqualTo("Small")
+ /// );
+ ///
+ ///
public ResolvableConstraintExpression Comp(IIntegrationInstance instance)
where T : IComponent
{
return expr.Append(new CompOperator(typeof(T), instance));
}
+ ///
+ /// Returns a new constraint which will either test for the existence of a component of the specified type
+ /// on the entity being tested or apply any following constraint to that component.
+ ///
+ /// The Type of the component to check for.
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity has an ItemComponent on the server.
+ /// Assert.That(myEntity, Has.Comp(typeof(ItemComponent), Server));
+ ///
+ /// // Assert that the server-sided entity myEntity has an ItemComponent with a Size field equal to "Small"
+ /// Assert.That(myEntity,
+ /// Has
+ /// .Comp(typeof(ItemComponent), Server)
+ /// .Property(nameof(ItemComponent.Size))
+ /// .EqualTo("Small")
+ /// );
+ ///
+ ///
public ResolvableConstraintExpression Comp(Type t, IIntegrationInstance instance)
{
return expr.Append(new CompOperator(t, instance));
diff --git a/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs b/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs
index 0539a6b54e..be6c68da58 100644
--- a/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs
+++ b/Content.IntegrationTests/NUnit/Constraints/LifeStageConstraint.cs
@@ -56,36 +56,43 @@ public static class LifeStageConstraintExtensions
{
extension(Is)
{
+ ///
public static LifeStageConstraint LifeStage(EntityLifeStage stage, IIntegrationInstance instance)
{
return new LifeStageConstraint(stage, instance);
}
+ ///
public static LifeStageConstraint PreInit(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.PreInit, instance);
}
+ ///
public static LifeStageConstraint Initializing(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.Initializing, instance);
}
+ ///
public static LifeStageConstraint Initialized(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.Initialized, instance);
}
+ ///
public static LifeStageConstraint MapInitialized(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.MapInitialized, instance);
}
+ ///
public static LifeStageConstraint Terminating(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.Terminating, instance);
}
+ ///
public static LifeStageConstraint Deleted(IIntegrationInstance instance)
{
return Is.LifeStage(EntityLifeStage.Deleted, instance);
@@ -94,6 +101,17 @@ public static class LifeStageConstraintExtensions
extension(ConstraintExpression expr)
{
+ ///
+ /// Returns a new constraint that checks if the entity is in the given lifestage.
+ ///
+ /// The to check for.
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is MapInitialized.
+ /// Assert.That(myEntity, Is.LifeStage(EntityLifeStage.MapInitialized, Server));
+ ///
+ ///
public LifeStageConstraint LifeStage(EntityLifeStage stage, IIntegrationInstance instance)
{
var c = new LifeStageConstraint(stage, instance);
@@ -103,31 +121,91 @@ public static class LifeStageConstraintExtensions
return c;
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the PreInit lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity has not yet been initialized.
+ /// Assert.That(myEntity, Is.PreInit(Server));
+ ///
+ ///
public LifeStageConstraint PreInit(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.PreInit, instance);
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the Intializing lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is Initializing.
+ /// Assert.That(myEntity, Is.Initializing(Server));
+ ///
+ ///
public LifeStageConstraint Initializing(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.Initializing, instance);
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the Initialized lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is Initialized.
+ /// Assert.That(myEntity, Is.Initialized(Server));
+ ///
+ ///
public LifeStageConstraint Initialized(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.Initialized, instance);
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the MapInitialized lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is MapInitialized.
+ /// Assert.That(myEntity, Is.MapInitialized(Server));
+ ///
+ ///
public LifeStageConstraint MapInitialized(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.MapInitialized, instance);
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the Terminating lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is Terminating.
+ /// Assert.That(myEntity, Is.Terminating(Server));
+ ///
+ ///
public LifeStageConstraint Terminating(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.Terminating, instance);
}
+ ///
+ /// Returns a new constraint that checks if the entity is in the Deleted lifestage.
+ ///
+ /// The (i.e. Server or Client) on which to perform the test.
+ ///
+ ///
+ /// // Assert that the server-sided entity myEntity is Deleted.
+ /// Assert.That(myEntity, Is.Deleted(Server));
+ ///
+ ///
public LifeStageConstraint Deleted(IIntegrationInstance instance)
{
return expr.LifeStage(EntityLifeStage.Deleted, instance);
From 988010c4667ca1a69897ebeda547412df45a681b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C4=81da?=
Date: Sat, 16 May 2026 17:12:22 -0500
Subject: [PATCH 13/52] Buyable + destructible desk bell, desk bell variants
(#36701)
* .rsi
* .yml
* buzzer
* desk horn and cleanup
* changes
* necro post
* fixed
* tiny shrink
* tabs...
* indentation
* injurable
---------
Co-authored-by: iaada
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
---
.../Catalog/Fills/Crates/service.yml | 1 +
.../Entities/Objects/Misc/desk_bell.yml | 230 +++++++++++++++---
.../Construction/Graphs/tools/bell.yml | 57 +++++
.../Prototypes/SoundCollections/bike_horn.yml | 5 +
.../{normal.png => icon-bell.png} | Bin
.../Misc/desk_bell.rsi/icon-buzzer.png | Bin 0 -> 260 bytes
.../Objects/Misc/desk_bell.rsi/icon-empty.png | Bin 0 -> 185 bytes
.../Objects/Misc/desk_bell.rsi/meta.json | 10 +-
8 files changed, 265 insertions(+), 38 deletions(-)
create mode 100644 Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml
rename Resources/Textures/Objects/Misc/desk_bell.rsi/{normal.png => icon-bell.png} (100%)
create mode 100644 Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png
create mode 100644 Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png
diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml
index 1f1432e709..b9c6168dae 100644
--- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml
+++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml
@@ -199,6 +199,7 @@
- id: NewtonCradle
- id: BoxEnvelope
- id: BrbSign
+ - id: DeskBell
- type: entity
parent: CrateGenericSteel
diff --git a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml
index f170aa899e..413a3fa63f 100644
--- a/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml
+++ b/Resources/Prototypes/Entities/Objects/Misc/desk_bell.yml
@@ -1,50 +1,208 @@
- type: entity
parent: BaseItem
+ id: EmptyDeskBell
+ name: unfinished desk bell
+ description: An empty bell missing its noise maker.
+ components:
+ - type: Sprite
+ sprite: Objects/Misc/desk_bell.rsi
+ state: icon-empty
+ - type: Construction
+ graph: &BellGraph BellGraph
+ node: start
+ - type: Damageable
+ - type: Injurable
+ damageContainer: Inorganic
+ - type: Destructible
+ thresholds:
+ - trigger: &DamageTrigger50
+ !type:DamageTrigger
+ damage: 50
+ behaviors: &OverkillBehavior
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - trigger: &DamageTrigger20
+ !type:DamageTrigger
+ damage: 20
+ behaviors:
+ - !type:PlaySoundBehavior
+ sound:
+ collection: MetalBreak
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ SheetSteel1:
+ min: 0
+ max: 1
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - type: MeleeWeapon
+ wideAnimationRotation: 180
+ soundHit: &BellSound
+ collection: DeskBell
+ params: &SoundParams
+ variation: 0.03
+ volume: 3
+ damage:
+ types:
+ Blunt: 4
+ # Sound
+ - type: MeleeSound
+ soundGroups:
+ Brute: *BellSound
+ - type: EmitSoundOnLand
+ sound: *BellSound
+ - type: EmitSoundOnCollide
+ sound: *BellSound
+
+- type: entity
+ parent: EmptyDeskBell
id: DeskBell
name: desk bell
description: The cornerstone of any customer service job. You feel an unending urge to ring it.
components:
- type: Sprite
- sprite: Objects/Misc/desk_bell.rsi
- state: "normal"
+ state: icon-bell
- type: Tag
- tags:
- - Payload
+ tags: &PayloadTag
+ - Payload
+ - type: Construction
+ graph: *BellGraph
+ node: deskBellNode
+ - type: Destructible
+ thresholds:
+ - trigger: *DamageTrigger50
+ behaviors: *OverkillBehavior
+ - trigger: *DamageTrigger20
+ behaviors:
+ - !type:PlaySoundBehavior
+ sound:
+ collection: MetalBreak
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ PartRodMetal1:
+ min: 0
+ max: 1
+ - !type:ChangeConstructionNodeBehavior
+ node: start
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
- type: InteractionPopup
successChance: 1
- interactSuccessSound:
- collection: DeskBell
- params:
- variation: 0.03
- volume: 3
onActivate: true
- - type: EmitSoundOnUse
- sound:
- collection: DeskBell
- params:
- variation: 0.03
- volume: 3
- - type: EmitSoundOnTrigger
- sound:
- collection: DeskBell
- params:
- variation: 0.03
- volume: 3
- - type: EmitSoundOnLand
- sound:
- collection: DeskBell
- params:
- variation: 0.03
- volume: 3
+ interactSuccessSound: *BellSound
- type: UseDelay
delay: 0.5
+ # Sound
+ - type: EmitSoundOnUse
+ sound: *BellSound
+ - type: EmitSoundOnTrigger
+ sound: *BellSound
+
+- type: entity
+ parent: EmptyDeskBell
+ id: DeskBuzzer
+ name: desk buzzer
+ description: An advanced customer service tool. You feel an unending urge to buzz it.
+ components:
+ - type: Sprite
+ state: icon-buzzer
+ - type: Tag
+ tags: *PayloadTag
+ - type: Construction
+ graph: *BellGraph
+ node: deskBuzzerNode
+ - type: Destructible
+ thresholds:
+ - trigger: *DamageTrigger50
+ behaviors: *OverkillBehavior
+ - trigger: *DamageTrigger20
+ behaviors:
+ - !type:PlaySoundBehavior
+ sound:
+ collection: MetalBreak
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ CableApcStack1:
+ min: 0
+ max: 2
+ - !type:ChangeConstructionNodeBehavior
+ node: start
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - type: StationAiWhitelist
+ - type: InteractionPopup
+ successChance: 1
+ onActivate: true
+ interactSuccessSound: &BuzzerSound
+ collection: DeskBuzzer
+ params: *SoundParams
+ - type: UseDelay
+ delay: 0.5
+ # Sound
+ - type: EmitSoundOnUse
+ sound: *BuzzerSound
+ - type: EmitSoundOnTrigger
+ sound: *BuzzerSound
+ - type: MeleeSound
+ soundGroups:
+ Brute: *BuzzerSound
- type: MeleeWeapon
- wideAnimationRotation: 180
- soundHit:
- collection: DeskBell
- params:
- variation: 0.03
- volume: 3
- damage:
- types:
- Blunt: 4
+ soundHit: *BuzzerSound
+ - type: EmitSoundOnLand
+ sound: *BuzzerSound
+ - type: EmitSoundOnCollide
+ sound: *BuzzerSound
+
+- type: entity
+ parent: EmptyDeskBell
+ id: DeskHorn
+ name: desk horn
+ description: The cornerstone of any clown business. You feel an unending urge to honk it.
+ components:
+ - type: Sprite
+ state: icon-buzzer
+ - type: Tag
+ tags: *PayloadTag
+ - type: Construction
+ graph: *BellGraph
+ node: deskHornNode
+ - type: Destructible
+ thresholds:
+ - trigger: *DamageTrigger50
+ behaviors: *OverkillBehavior
+ - trigger: *DamageTrigger20
+ behaviors:
+ - !type:PlaySoundBehavior
+ sound:
+ collection: MetalBreak
+ - !type:SpawnEntitiesBehavior
+ spawn:
+ BikeHorn:
+ min: 1
+ max: 1
+ - !type:ChangeConstructionNodeBehavior
+ node: start
+ - !type:DoActsBehavior
+ acts: ["Destruction"]
+ - type: InteractionPopup
+ successChance: 1
+ onActivate: true
+ interactSuccessSound: &HornSound
+ collection: BikeHorn
+ params: *SoundParams
+ - type: UseDelay
+ delay: 0.5
+ # Sound
+ - type: EmitSoundOnUse
+ sound: *HornSound
+ - type: EmitSoundOnTrigger
+ sound: *HornSound
+ - type: MeleeSound
+ soundGroups:
+ Brute: *HornSound
+ - type: MeleeWeapon
+ soundHit: *HornSound
+ - type: EmitSoundOnLand
+ sound: *HornSound
+ - type: EmitSoundOnCollide
+ sound: *HornSound
diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml b/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml
new file mode 100644
index 0000000000..d9877900b6
--- /dev/null
+++ b/Resources/Prototypes/Recipes/Construction/Graphs/tools/bell.yml
@@ -0,0 +1,57 @@
+- type: constructionGraph
+ id: BellGraph
+ start: start
+ graph:
+ - node: start
+ entity: EmptyDeskBell
+ edges:
+ - to: deskBellNode
+ steps:
+ - material: MetalRod
+ amount: 1
+ doAfter: 1
+ - to: deskBuzzerNode
+ steps:
+ - material: Cable
+ amount: 2
+ doAfter: 1
+ - to: deskHornNode
+ steps:
+ - tag: BikeHorn
+ name: construction-graph-tag-clown-bike-horn
+ icon:
+ sprite: Objects/Fun/bikehorn.rsi
+ state: icon
+ doAfter: 1
+
+ - node: deskBellNode
+ entity: DeskBell
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: PartRodMetal1
+ amount: 1
+ steps: &UnscrewStep
+ - tool: Screwing
+ doAfter: 1
+
+ - node: deskBuzzerNode
+ entity: DeskBuzzer
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: CableApcStack1
+ amount: 2
+ steps: *UnscrewStep
+
+ - node: deskHornNode
+ entity: DeskHorn
+ edges:
+ - to: start
+ completed:
+ - !type:SpawnPrototype
+ prototype: BikeHorn
+ amount: 1
+ steps: *UnscrewStep
diff --git a/Resources/Prototypes/SoundCollections/bike_horn.yml b/Resources/Prototypes/SoundCollections/bike_horn.yml
index aeb3ec18f5..7045de3569 100644
--- a/Resources/Prototypes/SoundCollections/bike_horn.yml
+++ b/Resources/Prototypes/SoundCollections/bike_horn.yml
@@ -18,6 +18,11 @@
files:
- /Audio/Items/desk_bell_ring.ogg
+- type: soundCollection
+ id: DeskBuzzer
+ files:
+ - /Audio/Items/ring.ogg
+
- type: soundCollection
id: BoxingBell
files:
diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/normal.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-bell.png
similarity index 100%
rename from Resources/Textures/Objects/Misc/desk_bell.rsi/normal.png
rename to Resources/Textures/Objects/Misc/desk_bell.rsi/icon-bell.png
diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-buzzer.png
new file mode 100644
index 0000000000000000000000000000000000000000..12334b69cc2afd43234c7c2835cbfa008e1d4807
GIT binary patch
literal 260
zcmV+f0sH=mP)YXY~bLY#XW
z7b!o+UlBY7{obhV#__|R|Cr(&r{m#!Q_z%XuDwubb45`U1>g=k`a%fodnU600000<
KMNUMnLSTaSeQdA*
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png b/Resources/Textures/Objects/Misc/desk_bell.rsi/icon-empty.png
new file mode 100644
index 0000000000000000000000000000000000000000..ed687409eb18cc3a00414782e84f4fa84fd7bc6b
GIT binary patch
literal 185
zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyq5(c3t_KbrFtuzopr03Sy~;s5{u
literal 0
HcmV?d00001
diff --git a/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json b/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json
index 2202fd0650..adcec14635 100644
--- a/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json
+++ b/Resources/Textures/Objects/Misc/desk_bell.rsi/meta.json
@@ -1,14 +1,20 @@
{
"version": 1,
"license": "CC-BY-SA-3.0",
- "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/22e6ce8a6bed9356e312fabe5e7552f81b9bf19f/icons/obj/bureaucracy.dmi",
+ "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/blob/22e6ce8a6bed9356e312fabe5e7552f81b9bf19f/icons/obj/bureaucracy.dmi, icon-empty and icon-buzzer edit by iaada (GitHub)",
"size": {
"x": 32,
"y": 32
},
"states": [
{
- "name": "normal"
+ "name": "icon-bell"
+ },
+ {
+ "name": "icon-empty"
+ },
+ {
+ "name": "icon-buzzer"
}
]
}
From 18d60a35c7c2a73d0ebccc6f0587330faf2151b2 Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sat, 16 May 2026 22:30:28 +0000
Subject: [PATCH 14/52] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 18 ++++++++++--------
1 file changed, 10 insertions(+), 8 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 25fd387c80..4aa85b61d0 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,12 +1,4 @@
Entries:
-- author: SlamBamActionman
- changes:
- - message: Fixed the G.O.R.I.L.L.A gauntlet being able to unanchor walls, doors
- etc.
- type: Fix
- id: 9181
- time: '2025-11-01T15:28:19.0000000+00:00'
- url: https://github.com/space-wizards/space-station-14/pull/41219
- author: Hitlinemoss
changes:
- message: Towels in the trinkets loadout menu are now sorted by hue.
@@ -4082,3 +4074,13 @@
id: 9692
time: '2026-05-16T20:10:12.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/43599
+- author: aada
+ changes:
+ - message: A desk bell is now included in the bureaucracy crate.
+ type: Add
+ - message: Variants can be crafted by adding 2 lv cable or a bike horn after screwdrivering
+ a desk bell.
+ type: Add
+ id: 9693
+ time: '2026-05-16T22:29:20.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/36701
From 6b215d64e614b340d75455fcf6bf9773121af800 Mon Sep 17 00:00:00 2001
From: Jessica M
Date: Sat, 16 May 2026 15:55:09 -0700
Subject: [PATCH 15/52] make Ninja doorjack objective use counter condition
(#43813)
* doorjack to counter condition
* howd i do that
* partial
* enumrate the
* cleanup
---------
Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
---
.../Ninja/Systems/SpaceNinjaSystem.cs | 18 --------
.../Components/DoorjackConditionComponent.cs | 10 ++---
.../DoorJackObjectiveConditionSystem.cs | 44 +++++++++++++++++++
.../Systems/MailFraudObjectiveSystem.cs | 9 ++--
.../Systems/NinjaConditionsSystem.cs | 18 --------
Content.Shared/Mind/SharedMindSystem.cs | 32 ++++++++++++++
.../Prototypes/Objectives/base_objectives.yml | 3 +-
Resources/Prototypes/Objectives/ninja.yml | 2 +-
8 files changed, 84 insertions(+), 52 deletions(-)
create mode 100644 Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs
diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs
index a4d90eddc9..a130dd6e90 100644
--- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs
+++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs
@@ -33,7 +33,6 @@ public sealed partial class SpaceNinjaSystem : SharedSpaceNinjaSystem
{
base.Initialize();
- SubscribeLocalEvent(OnDoorjack);
SubscribeLocalEvent(OnResearchStolen);
SubscribeLocalEvent(OnThreatCalledIn);
SubscribeLocalEvent(OnCriminalRecordsHacked);
@@ -113,23 +112,6 @@ public sealed partial class SpaceNinjaSystem : SharedSpaceNinjaSystem
return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge((uid.Value, battery), charge);
}
- ///
- /// Increment greentext when emagging a door.
- ///
- private void OnDoorjack(EntityUid uid, SpaceNinjaComponent comp, ref EmaggedSomethingEvent args)
- {
- // incase someone lets ninja emag non-doors double check it here
- if (!HasComp(args.Target))
- return;
-
- // this popup is serverside since door emag logic is serverside (power funnies)
- Popup.PopupEntity(Loc.GetString("ninja-doorjack-success", ("target", Identity.Entity(args.Target, EntityManager))), uid, uid, PopupType.Medium);
-
- // handle greentext
- if (_mind.TryGetObjectiveComp(uid, out var obj))
- obj.DoorsJacked++;
- }
-
///
/// Add to greentext when stealing technologies.
///
diff --git a/Content.Server/Objectives/Components/DoorjackConditionComponent.cs b/Content.Server/Objectives/Components/DoorjackConditionComponent.cs
index 470680ae6d..8780a0720e 100644
--- a/Content.Server/Objectives/Components/DoorjackConditionComponent.cs
+++ b/Content.Server/Objectives/Components/DoorjackConditionComponent.cs
@@ -5,11 +5,7 @@ namespace Content.Server.Objectives.Components;
///
/// Objective condition that requires the player to be a ninja and have doorjacked at least a random number of airlocks.
-/// Requires to function.
+/// Requires and to function.
///
-[RegisterComponent, Access(typeof(NinjaConditionsSystem), typeof(SharedSpaceNinjaSystem))]
-public sealed partial class DoorjackConditionComponent : Component
-{
- [DataField("doorsJacked"), ViewVariables(VVAccess.ReadWrite)]
- public int DoorsJacked;
-}
+[RegisterComponent]
+public sealed partial class DoorjackConditionComponent : Component;
diff --git a/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs b/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs
new file mode 100644
index 0000000000..5c9741e70b
--- /dev/null
+++ b/Content.Server/Objectives/Systems/DoorJackObjectiveConditionSystem.cs
@@ -0,0 +1,44 @@
+using Content.Server.Objectives.Components;
+using Content.Shared.Doors.Components;
+using Content.Shared.IdentityManagement;
+using Content.Shared.Mind;
+using Content.Shared.Ninja.Components;
+using Content.Shared.Ninja.Systems;
+using Content.Shared.Popups;
+
+namespace Content.Server.Objectives.Systems;
+
+public sealed partial class DoorJackObjectiveConditionSystem : EntitySystem
+{
+ [Dependency] private SharedPopupSystem _popupSystem = default!;
+ [Dependency] private SharedMindSystem _mind = default!;
+ [Dependency] private CounterConditionSystem _counterCondition = default!;
+
+ public override void Initialize()
+ {
+ base.Initialize();
+ SubscribeLocalEvent(OnDoorjack);
+ }
+
+ private void OnDoorjack(EntityUid uid, SpaceNinjaComponent comp, ref EmaggedSomethingEvent args)
+ {
+ // incase someone lets ninja emag non-doors double check it here
+ if (!HasComp(args.Target))
+ return;
+
+ if (!_mind.TryGetMind(uid, out var mindUid, out var mind))
+ return;
+
+ // this popup is serverside since door emag logic is serverside (power funnies)
+ _popupSystem.PopupEntity(
+ Loc.GetString("ninja-doorjack-success", ("target", Identity.Entity(args.Target, EntityManager))),
+ uid,
+ uid,
+ PopupType.Medium);
+
+ foreach (var obj in _mind.EnumerateObjectives((mindUid, mind)))
+ {
+ _counterCondition.IncreaseCount(obj);
+ }
+ }
+}
diff --git a/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs b/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs
index 0fa4bea603..f93b404b34 100644
--- a/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs
+++ b/Content.Server/Objectives/Systems/MailFraudObjectiveSystem.cs
@@ -24,15 +24,12 @@ public sealed partial class MailFraudObjectiveSystem : EntitySystem
if (_fingerprintReader.IsAllowed(ent.Owner, args.User, out var _, showPopup: false, checkGloves: false))
return; //cutting open your own letter
- if (!_mind.TryGetMind(args.User, out _, out var mind))
+ if (!_mind.TryGetMind(args.User, out var mindUid, out var mind))
return;
- foreach (var obj in mind.Objectives)
+ foreach (var obj in _mind.EnumerateObjectives((mindUid, mind)))
{
- if (HasComp(obj))
- {
- _counterCondition.IncreaseCount(obj);
- }
+ _counterCondition.IncreaseCount(obj);
}
}
}
diff --git a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs
index d261867add..477bc03445 100644
--- a/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs
+++ b/Content.Server/Objectives/Systems/NinjaConditionsSystem.cs
@@ -22,30 +22,12 @@ public sealed partial class NinjaConditionsSystem : EntitySystem
public override void Initialize()
{
- SubscribeLocalEvent(OnDoorjackGetProgress);
-
SubscribeLocalEvent(OnSpiderChargeRequirementCheck);
SubscribeLocalEvent(OnSpiderChargeAfterAssign);
SubscribeLocalEvent(OnStealResearchGetProgress);
}
- // doorjack
-
- private void OnDoorjackGetProgress(EntityUid uid, DoorjackConditionComponent comp, ref ObjectiveGetProgressEvent args)
- {
- args.Progress = DoorjackProgress(comp, _number.GetTarget(uid));
- }
-
- private float DoorjackProgress(DoorjackConditionComponent comp, int target)
- {
- // prevent divide-by-zero
- if (target == 0)
- return 1f;
-
- return MathF.Min(comp.DoorsJacked / (float) target, 1f);
- }
-
// spider charge
private void OnSpiderChargeRequirementCheck(EntityUid uid, SpiderChargeConditionComponent comp, ref RequirementCheckEvent args)
{
diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs
index fe21618fa3..08152ab42c 100644
--- a/Content.Shared/Mind/SharedMindSystem.cs
+++ b/Content.Shared/Mind/SharedMindSystem.cs
@@ -1,3 +1,4 @@
+using System.Collections;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
using Content.Shared.Administration.Logs;
@@ -469,6 +470,37 @@ public abstract partial class SharedMindSystem : EntitySystem
return false;
}
+ ///
+ /// Returns an enumerator of the input minds objectives
+ ///
+ public IEnumerable EnumerateObjectives(Entity mind)
+ {
+ if (!Resolve(mind, ref mind.Comp))
+ yield break;
+
+ foreach (var obj in mind.Comp.Objectives)
+ {
+ yield return obj;
+ }
+ }
+
+ ///
+ /// Returns an enumerator of objectives with the specified component.
+ ///
+ public IEnumerable EnumerateObjectives(Entity mind) where T : IComponent
+ {
+ if (!Resolve(mind, ref mind.Comp))
+ yield break;
+
+ foreach (var obj in mind.Comp.Objectives)
+ {
+ if (!HasComp(obj))
+ continue;
+
+ yield return obj;
+ }
+ }
+
///
/// Gets a mind from uid and/or MindContainerComponent. Used for null checks.
///
diff --git a/Resources/Prototypes/Objectives/base_objectives.yml b/Resources/Prototypes/Objectives/base_objectives.yml
index 12204153c2..5f011cd3ce 100644
--- a/Resources/Prototypes/Objectives/base_objectives.yml
+++ b/Resources/Prototypes/Objectives/base_objectives.yml
@@ -125,7 +125,6 @@
abstract: true
parent: BaseObjective
id: BaseCounterObjective
- description: We're interested in Nanotrasen's correspondence. Letter opener not provided.
components:
- type: CounterCondition
- - type: NumberObjective # min and max to be set in the inheritor
\ No newline at end of file
+ - type: NumberObjective # min and max to be set in the inheritor
diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml
index f015dd8f72..03980f7b31 100644
--- a/Resources/Prototypes/Objectives/ninja.yml
+++ b/Resources/Prototypes/Objectives/ninja.yml
@@ -12,7 +12,7 @@
- NinjaRole
- type: entity
- parent: BaseNinjaObjective
+ parent: [BaseNinjaObjective, BaseCounterObjective]
id: DoorjackObjective
components:
- type: Objective
From a55e610c215cb03dfb3738a0ff140a18aa4b93aa Mon Sep 17 00:00:00 2001
From: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
Date: Sun, 17 May 2026 03:06:05 +0200
Subject: [PATCH 16/52] Add EntProtoId overloads to EntityWhitelists (#40807)
* prototype whitelists
* review
* fix
---
.../Tests/Utility/EntityWhitelistTest.cs | 76 +++++---
.../EntityWhitelistSystem.Prototype.cs | 166 ++++++++++++++++++
.../Whitelist/EntityWhitelistSystem.cs | 58 +++---
3 files changed, 257 insertions(+), 43 deletions(-)
create mode 100644 Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs
diff --git a/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs b/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs
index d7e1239603..724560d4ab 100644
--- a/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs
+++ b/Content.IntegrationTests/Tests/Utility/EntityWhitelistTest.cs
@@ -2,55 +2,61 @@ using System.Linq;
using Content.IntegrationTests.Fixtures;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Whitelist;
-using Robust.Shared.GameObjects;
+using Robust.Shared.Prototypes;
namespace Content.IntegrationTests.Tests.Utility
{
- [TestFixture]
[TestOf(typeof(EntityWhitelist))]
public sealed class EntityWhitelistTest : GameTest
{
private const string InvalidComponent = "Sprite";
private const string ValidComponent = "Physics";
+ private const string WhitelistProtoId = "WhitelistDummy";
+ private const string ValidComponentProtoId = "ValidComponentDummy";
+ private const string WhitelistTestValidTagProtoId = "WhitelistTestValidTagDummy";
+ private const string InvalidComponentProtoId = "InvalidComponentDummy";
+ private const string WhitelistTestInvalidTagProtoId = "WhitelistTestInvalidTagDummy";
+
[TestPrototypes]
private const string Prototypes = $@"
- type: Tag
id: WhitelistTestValidTag
+
- type: Tag
id: WhitelistTestInvalidTag
- type: entity
- id: WhitelistDummy
+ id: {WhitelistProtoId}
components:
- type: ItemSlots
slots:
slotName:
whitelist:
- prototypes:
- - ValidPrototypeDummy
components:
- {ValidComponent}
tags:
- WhitelistTestValidTag
- type: entity
- id: InvalidComponentDummy
+ id: {InvalidComponentProtoId}
components:
- type: {InvalidComponent}
+
- type: entity
- id: WhitelistTestInvalidTagDummy
+ id: {WhitelistTestInvalidTagProtoId}
components:
- type: Tag
tags:
- WhitelistTestInvalidTag
- type: entity
- id: ValidComponentDummy
+ id: {ValidComponentProtoId}
components:
- type: {ValidComponent}
+
- type: entity
- id: WhitelistTestValidTagDummy
+ id: {WhitelistTestValidTagProtoId}
components:
- type: Tag
tags:
@@ -70,11 +76,17 @@ namespace Content.IntegrationTests.Tests.Utility
await server.WaitAssertion(() =>
{
- var validComponent = sEntities.SpawnEntity("ValidComponentDummy", mapCoordinates);
- var WhitelistTestValidTag = sEntities.SpawnEntity("WhitelistTestValidTagDummy", mapCoordinates);
+ var prototypeManager = server.ResolveDependency();
- var invalidComponent = sEntities.SpawnEntity("InvalidComponentDummy", mapCoordinates);
- var WhitelistTestInvalidTag = sEntities.SpawnEntity("WhitelistTestInvalidTagDummy", mapCoordinates);
+ var validComponentProto = prototypeManager.Index(ValidComponentProtoId);
+ var whitelistTestValidTagProto = prototypeManager.Index(WhitelistTestValidTagProtoId);
+ var invalidComponentProto = prototypeManager.Index(InvalidComponentProtoId);
+ var whitelistTestInvalidTagProto = prototypeManager.Index(WhitelistTestInvalidTagProtoId);
+
+ var validComponentUid = sEntities.SpawnEntity(ValidComponentProtoId, mapCoordinates);
+ var whitelistTestValidTagUid = sEntities.SpawnEntity(WhitelistTestValidTagProtoId, mapCoordinates);
+ var invalidComponentUid = sEntities.SpawnEntity(InvalidComponentProtoId, mapCoordinates);
+ var whitelistTestInvalidTagUid = sEntities.SpawnEntity(WhitelistTestInvalidTagProtoId, mapCoordinates);
// Test instantiated on its own
var whitelistInst = new EntityWhitelist
@@ -85,15 +97,25 @@ namespace Content.IntegrationTests.Tests.Utility
Assert.Multiple(() =>
{
- Assert.That(sys.IsValid(whitelistInst, validComponent), Is.True);
- Assert.That(sys.IsValid(whitelistInst, WhitelistTestValidTag), Is.True);
+ Assert.That(sys.IsValid(whitelistInst, validComponentUid), Is.True);
+ Assert.That(sys.IsValid(whitelistInst, validComponentProto), Is.True);
+ Assert.That(sys.IsValid(whitelistInst, ValidComponentProtoId), Is.True);
- Assert.That(sys.IsValid(whitelistInst, invalidComponent), Is.False);
- Assert.That(sys.IsValid(whitelistInst, WhitelistTestInvalidTag), Is.False);
+ Assert.That(sys.IsValid(whitelistInst, whitelistTestValidTagUid), Is.True);
+ Assert.That(sys.IsValid(whitelistInst, whitelistTestValidTagProto), Is.True);
+ Assert.That(sys.IsValid(whitelistInst, WhitelistTestValidTagProtoId), Is.True);
+
+ Assert.That(sys.IsValid(whitelistInst, invalidComponentUid), Is.False);
+ Assert.That(sys.IsValid(whitelistInst, invalidComponentProto), Is.False);
+ Assert.That(sys.IsValid(whitelistInst, InvalidComponentProtoId), Is.False);
+
+ Assert.That(sys.IsValid(whitelistInst, whitelistTestInvalidTagUid), Is.False);
+ Assert.That(sys.IsValid(whitelistInst, whitelistTestInvalidTagProto), Is.False);
+ Assert.That(sys.IsValid(whitelistInst, WhitelistTestInvalidTagProtoId), Is.False);
});
// Test from serialized
- var dummy = sEntities.SpawnEntity("WhitelistDummy", mapCoordinates);
+ var dummy = sEntities.SpawnEntity(WhitelistProtoId, mapCoordinates);
var whitelistSer = sEntities.GetComponent(dummy).Slots.Values.First().Whitelist;
Assert.That(whitelistSer, Is.Not.Null);
@@ -105,11 +127,21 @@ namespace Content.IntegrationTests.Tests.Utility
Assert.Multiple(() =>
{
- Assert.That(sys.IsValid(whitelistSer, validComponent), Is.True);
- Assert.That(sys.IsValid(whitelistSer, WhitelistTestValidTag), Is.True);
+ Assert.That(sys.IsValid(whitelistSer, validComponentUid), Is.True);
+ Assert.That(sys.IsValid(whitelistSer, validComponentProto), Is.True);
+ Assert.That(sys.IsValid(whitelistSer, ValidComponentProtoId), Is.True);
- Assert.That(sys.IsValid(whitelistSer, invalidComponent), Is.False);
- Assert.That(sys.IsValid(whitelistSer, WhitelistTestInvalidTag), Is.False);
+ Assert.That(sys.IsValid(whitelistSer, whitelistTestValidTagUid), Is.True);
+ Assert.That(sys.IsValid(whitelistSer, whitelistTestValidTagProto), Is.True);
+ Assert.That(sys.IsValid(whitelistSer, WhitelistTestValidTagProtoId), Is.True);
+
+ Assert.That(sys.IsValid(whitelistSer, invalidComponentUid), Is.False);
+ Assert.That(sys.IsValid(whitelistSer, invalidComponentProto), Is.False);
+ Assert.That(sys.IsValid(whitelistSer, InvalidComponentProtoId), Is.False);
+
+ Assert.That(sys.IsValid(whitelistSer, whitelistTestInvalidTagUid), Is.False);
+ Assert.That(sys.IsValid(whitelistSer, whitelistTestInvalidTagProto), Is.False);
+ Assert.That(sys.IsValid(whitelistSer, WhitelistTestInvalidTagProtoId), Is.False);
});
});
}
diff --git a/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs b/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs
new file mode 100644
index 0000000000..1526ae6e44
--- /dev/null
+++ b/Content.Shared/Whitelist/EntityWhitelistSystem.Prototype.cs
@@ -0,0 +1,166 @@
+using Content.Shared.Item;
+using Content.Shared.Tag;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Whitelist;
+
+public sealed partial class EntityWhitelistSystem
+{
+ ///
+ /// Checks whether a given EntProtoId satisfies a whitelist.
+ ///
+ public bool IsValid(EntityWhitelist list, [ForbidLiteral] EntProtoId protoId)
+ {
+ return IsValid(list, _proto.Index(protoId));
+ }
+
+ ///
+ /// Checks whether a given EntityPrototype satisfies a whitelist.
+ ///
+ public bool IsValid(EntityWhitelist list, EntityPrototype prototype)
+ {
+ list.Registrations ??= StringsToRegs(list.Components);
+
+ if (list.Registrations != null)
+ {
+ foreach (var reg in list.Registrations)
+ {
+ if (prototype.Components.ContainsKey(reg.Name))
+ {
+ if (!list.RequireAll)
+ return true;
+ }
+ else if (list.RequireAll)
+ return false;
+ }
+ }
+
+ if (list.Sizes != null && prototype.TryGetComponent(_itemComponentName, out ItemComponent? itemComp))
+ {
+ if (list.Sizes.Contains(itemComp.Size))
+ return true;
+ }
+
+ if (list.Tags != null && prototype.TryGetComponent(_tagComponentName, out TagComponent? tagComp))
+ {
+ return list.RequireAll
+ ? _tag.HasAllTags(tagComp, list.Tags)
+ : _tag.HasAnyTag(tagComp, list.Tags);
+ }
+
+ return list.RequireAll;
+ }
+
+ ///
+ /// Checks whether a given EntProtoId is allowed by a whitelist and not blocked by a blacklist.
+ /// If a blacklist is provided and it matches then this returns false.
+ /// If a whitelist is provided and it does not match then this returns false.
+ /// If either list is null it does not get checked.
+ ///
+ public bool CheckBoth([ForbidLiteral] EntProtoId protoId, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null)
+ {
+ return CheckBoth(_proto.Index(protoId), blacklist, whitelist);
+ }
+
+ ///
+ /// Checks whether a given EntityPrototype is allowed by a whitelist and not blocked by a blacklist.
+ /// If a blacklist is provided and it matches then this returns false.
+ /// If a whitelist is provided and it does not match then this returns false.
+ /// If either list is null it does not get checked.
+ ///
+ public bool CheckBoth(EntityPrototype prototype, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null)
+ {
+ if (blacklist != null && IsValid(blacklist, prototype))
+ return false;
+
+ return whitelist == null || IsValid(whitelist, prototype);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is not null and the EntProtoId is on the list.
+ ///
+ public bool IsWhitelistPass(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId)
+ {
+ if (whitelist == null)
+ return false;
+
+ return IsValid(whitelist, protoId);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is not null and the EntityPrototype is on the list.
+ ///
+ public bool IsWhitelistPass(EntityWhitelist? whitelist, EntityPrototype prototype)
+ {
+ if (whitelist == null)
+ return false;
+
+ return IsValid(whitelist, prototype);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is not null and the EntProtoId is not on the list.
+ ///
+ public bool IsWhitelistFail(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId)
+ {
+ if (whitelist == null)
+ return false;
+
+ return !IsValid(whitelist, protoId);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is not null and the EntityPrototype is not on the list.
+ ///
+ public bool IsWhitelistFail(EntityWhitelist? whitelist, EntityPrototype prototype)
+ {
+ if (whitelist == null)
+ return false;
+
+ return !IsValid(whitelist, prototype);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is either null or the EntProtoId is on the list.
+ ///
+ public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId)
+ {
+ if (whitelist == null)
+ return true;
+
+ return IsValid(whitelist, protoId);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is either null or the EntityPrototype is on the list.
+ ///
+ public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, EntityPrototype prototype)
+ {
+ if (whitelist == null)
+ return true;
+
+ return IsValid(whitelist, prototype);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is either null or the EntProtoId is not on the list.
+ ///
+ public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, [ForbidLiteral] EntProtoId protoId)
+ {
+ if (whitelist == null)
+ return true;
+
+ return !IsValid(whitelist, protoId);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is either null or the EntityPrototype is not on the list.
+ ///
+ public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, EntityPrototype prototype)
+ {
+ if (whitelist == null)
+ return true;
+
+ return !IsValid(whitelist, prototype);
+ }
+}
diff --git a/Content.Shared/Whitelist/EntityWhitelistSystem.cs b/Content.Shared/Whitelist/EntityWhitelistSystem.cs
index 85b7d62b83..a9218d5257 100644
--- a/Content.Shared/Whitelist/EntityWhitelistSystem.cs
+++ b/Content.Shared/Whitelist/EntityWhitelistSystem.cs
@@ -1,37 +1,35 @@
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Item;
using Content.Shared.Tag;
-using Robust.Shared.Utility;
+using Robust.Shared.Prototypes;
namespace Content.Shared.Whitelist;
public sealed partial class EntityWhitelistSystem : EntitySystem
{
+ [Dependency] private IPrototypeManager _proto = default!;
[Dependency] private TagSystem _tag = default!;
+ [Dependency] private EntityQuery _itemQuery;
- [Dependency] private EntityQuery _itemQuery = default!;
+ private string _itemComponentName = string.Empty;
+ private string _tagComponentName = string.Empty;
- ///
- public bool IsValid(EntityWhitelist list, [NotNullWhen(true)] EntityUid? uid)
+ public override void Initialize()
{
- return uid != null && IsValid(list, uid.Value);
+ base.Initialize();
+
+ // caching for minor performance improvement
+ _itemComponentName = Factory.GetComponentName();
+ _tagComponentName = Factory.GetComponentName();
}
///
- /// Checks whether a given entity is allowed by a whitelist and not blocked by a blacklist.
- /// If a blacklist is provided and it matches then this returns false.
- /// If a whitelist is provided and it does not match then this returns false.
- /// If either list is null it does not get checked.
+ /// Checks whether a given entity satisfies a whitelist.
+ /// Returns false if the entity is null.
///
- public bool CheckBoth([NotNullWhen(true)] EntityUid? uid, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null)
+ public bool IsValid(EntityWhitelist list, [NotNullWhen(true)] EntityUid? uid)
{
- if (uid == null)
- return false;
-
- if (blacklist != null && IsValid(blacklist, uid))
- return false;
-
- return whitelist == null || IsValid(whitelist, uid);
+ return uid != null && IsValid(list, uid.Value);
}
///
@@ -70,13 +68,31 @@ public sealed partial class EntityWhitelistSystem : EntitySystem
return list.RequireAll;
}
+
/// The following are a list of "helper functions" that are basically the same as each other
/// to help make code that uses EntityWhitelist a bit more readable because at the moment
/// it is quite clunky having to write out component.Whitelist == null ? true : _whitelist.IsValid(component.Whitelist, uid)
/// several times in a row and makes comparisons easier to read
///
- /// Helper function to determine if Whitelist is not null and entity is on list
+ /// Checks whether a given entity is allowed by a whitelist and not blocked by a blacklist.
+ /// If a blacklist is provided and it matches then this returns false.
+ /// If a whitelist is provided and it does not match then this returns false.
+ /// If either list is null it does not get checked.
+ ///
+ public bool CheckBoth([NotNullWhen(true)] EntityUid? uid, EntityWhitelist? blacklist = null, EntityWhitelist? whitelist = null)
+ {
+ if (uid == null)
+ return false;
+
+ if (blacklist != null && IsValid(blacklist, uid))
+ return false;
+
+ return whitelist == null || IsValid(whitelist, uid);
+ }
+
+ ///
+ /// Helper function to determine if a whitelist is not null and the entity is on list.
///
public bool IsWhitelistPass(EntityWhitelist? whitelist, EntityUid uid)
{
@@ -87,7 +103,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem
}
///
- /// Helper function to determine if Whitelist is not null and entity is not on the list
+ /// Helper function to determine if a whitelist is not null and the entity is not on the list.
///
public bool IsWhitelistFail(EntityWhitelist? whitelist, EntityUid uid)
{
@@ -98,7 +114,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem
}
///
- /// Helper function to determine if Whitelist is either null or the entity is on the list
+ /// Helper function to determine if a whitelist is either null or the entity is on the list.
///
public bool IsWhitelistPassOrNull(EntityWhitelist? whitelist, EntityUid uid)
{
@@ -109,7 +125,7 @@ public sealed partial class EntityWhitelistSystem : EntitySystem
}
///
- /// Helper function to determine if Whitelist is either null or the entity is not on the list
+ /// Helper function to determine if a whitelist is either null or the entity is not on the list.
///
public bool IsWhitelistFailOrNull(EntityWhitelist? whitelist, EntityUid uid)
{
From fc33ab61bf69732281eecd7340440d9a4eaa4fcd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]"
<41898282+github-actions[bot]@users.noreply.github.com>
Date: Sun, 17 May 2026 08:25:23 +0200
Subject: [PATCH 17/52] Update Credits (#43969)
Co-authored-by: PJBot
---
Resources/Credits/GitHub.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Resources/Credits/GitHub.txt b/Resources/Credits/GitHub.txt
index 92ef688d49..8e2319c912 100644
--- a/Resources/Credits/GitHub.txt
+++ b/Resources/Credits/GitHub.txt
@@ -1 +1 @@
-0-Anon, 0leshe, 0tito, 0x6273, 11BelowStudio, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, actioninja, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, afflewaffle, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, ahandleman, Ahion, aiden, aidenkrz, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, Androclast, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, arcanevaliance, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, arthropodia, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AshBats, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, Ataman, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, Axionyxx, azloserbits, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, baynarikattu, bea, BeatusCrow, bebr3ght, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, BombasterDS, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, buunie099, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Cabin-keeper, Caconym27, Calecute, Callmore, Camdot, cammusubi, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, CDWimmer, Centronias, Chaboricks, chairbender, chaisftw, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, CrazyPhantom779, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DaCookieCakes, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkie, DaturoDewitt, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, debugok, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, dimmoon1, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, EchoOfNothing, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, erorr404v1, Errant-4, ertanic, esguard, estacaoespacialpirata, eternally-confused, eugene, eveloop, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, fillervk, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Fruitsalad, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, gem, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, Glissadia, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, happyrobot33, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonbailey, jacksonzck, JackspajfMain, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap-havok, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, JerryImMouse, jerryimmouse, Jessetriesagain, jessicamaybe, JesterX666, Jewelots, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, johnjjohn, JohnJJohn, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, Kenionatus, kerisargit, keronshb, KeTuFaisPiKiNut, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kipdotnet, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, kleinerstation13, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, korczoczek, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, kresny, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Le-Arctic-Fox, leahcat, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, liem161, LightVillet, lilazero, liltenhead, linkbro1, LinkUyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lyxcaster, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnnusson, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, mastermiller01, matt, Matz05, max, MaxNox7, maylokana, mdrkrg, MDuch369, meara1179, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, mikeysaurus, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mohamedwidar, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, MrPersival, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, naxel11, NazrinNya, neborsh, nekokiwa, neomoth, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, Not-A-Chair, not-gavnaed, NotActuallyMarty, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, Nuggets219, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, Ohelig, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, PAFFhassoocks, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, Pharaz4, pheenty, philingham, Phill101, Phonix, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, piskaczek, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, Prole0, ProPandaBear, ProPeperos, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, RainyGale, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, Redrover1760, redspyy, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rewafflution, rhailrake, rhsvenson, riccardi48, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, robinthegirlthing, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, roryflowers, rosieposieeee, Roudenn, router, ruddygreat, rumaks-xyz, RumiTiger, Ruzihm, rwrv, S1rFl0, S1ss3l, Saakra, SabreML, Sadie-silly, saga3152, saintmuntzer, salarua, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, Shegare, shepardtothestars, shibechef, Sidzaru, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, skeeka-dev, skrybl, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SomegnihT, SonarZeBat, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, steel, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Synthestra, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taserthefox, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, theexetron, TheFlyingSentry, thefoty, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, TriviaSolari, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, tuchila-adi-bogdan, Tunguso4ka, TurboTrackerss14, TVK-04, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, UpAndLeaves, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, VanderslootAssgiraffe, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, Venomii, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, YuriyKiss, yuriykiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, zekins3366, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex
+0-Anon, 0leshe, 0tito, 0x6273, 11BelowStudio, 12rabbits, 1337dakota, 13spacemen, 154942, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 27alaing, 2DSiggy, 3nderall, 4310v343k, 4dplanner, 5tickman, 612git, 778b, 96flo, aaron, abadaba695, Ablankmann, abregado, Absolute-Potato, Absotively, achookh, Acruid, actioninja, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, afflewaffle, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, ahandleman, Ahion, aiden, Aidenkrz, aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, AlphaQwerty, Altoids1, amatwiedle, amylizzle, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, Androclast, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, arcanevaliance, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, arthropodia, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AshBats, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, Ataman, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, Axionyxx, azloserbits, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, baynarikattu, bea, BeatusCrow, bebr3ght, beck-thompson, beesterman, bellwetherlogic, ben, benbryant0, benev0, benjamin-burges, BGare, bhespiritu, bibbly, BigfootBravo, BIGZi0348, bingojohnson, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blitzthesquishy, Blobadoodle, bloodrizer, Bloody2372, blueDev2, Boaz1111, BobdaBiscuit, BobTheSleder, boiled-water-tsar, Bokser815, bolantej, BombasterDS, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, buunie099, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Cabin-keeper, Caconym27, Calecute, Callmore, Camdot, cammusubi, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, CDWimmer, Centronias, Chaboricks, chairbender, chaisftw, Chaoticaa, Charlese2, charlie, chartman, ChaseFlorom, chavonadelal, Cheackraze, CheddaCheez, cheesePizza2, CheesePlated, Chief-Engineer, chillyconmor, christhirtle, chromiumboy, Chronophylos, Chubbicous, Chubbygummibear, Ciac32, ciaran, citrea, civilCornball, claustro305, Clement-O, cloudyias, clyf, Clyybber, CMDR-Piboy314, cnv41, coco, cohanna, Cohnway, Cojoke-dot, ColdAutumnRain, Colin-Tel, collinlunn, ComicIronic, Compilatron144, CookieMasterT, coolboy911, CoolioDudio, coolmankid12345, Coolsurf6, cooperwallace, corentt, CormosLemming, CrafterKolyan, CraftyRenter, crazybrain23, Crazydave91920, CrazyPhantom779, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DaCookieCakes, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkie, DaturoDewitt, david, DawBla, Daxxi3, dch-GH, ddeegan, de0rix, Deahaka, dean, DEATHB4DEFEAT, Deatherd, deathride58, debugok, Decappi, Decortex, Deeeeja, deepdarkdepths, DeepwaterCreations, Deerstop, degradka, Delete69, deltanedas, DenisShvalov, DerbyX, derek, dersheppard, Deserty0, Detintinto, DevilishMilk, devinschubert14, dexlerxd, dffdff2423, DieselMohawk, DieselMohawkTheSequel, digitalic, Dimastra, dimmoon1, DinnerCalzone, DinoWattz, Disp-Dev, DisposableCrewmember42, dissidentbullet, DjfjdfofdjfjD, doc-michael, docnite, Doctor-Cpu, DogZeroX, dolgovmi, dontbetank, Doomsdrayk, Doru991, DoubleRiceEddiedd, DoutorWhite, DR-DOCTOR-EVIL-EVIL, Dragonjspider, dragonryan06, drakewill-CRL, Drayff, dreamlyjack, DrEnzyme, dribblydrone, DrMelon, drongood12, DrSingh, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, DuckManZach, Duddino, dukevanity, duskyjay, Dutch-VanDerLinde, dvir001, dylanstrategie, dylanwhittingham, Dynexust, Easypoller, echo, EchoOfNothing, eclips_e, eden077, EEASAS, Efruit, efzapa, Ekkosangen, ElectroSR, elsie, elthundercloud, Elysium206, emberwinters, Emisse, emmafornash, EmoGarbage404, Endecc, EnrichedCaramel, Entvari, eoineoineoin, ephememory, eris, erohrs2, erorr404v1, Errant-4, ertanic, esguard, estacaoespacialpirata, eternally-confused, eugene, eveloop, Ewanderer, ewokswagger, exincore, exp111, f0x-n3rd, F1restar4, FacePluslll, Fahasor, FairlySadPanda, farrellka-dev, FATFSAAM2, Feluk6174, ficcialfaint, Fiftyllama, Fildrance, fillervk, FinnishPaladin, firenamefn, Firewars763, FirinMaLazors, Fishfish458, fl-oz, Flareguy, flashgnash, FlipBrooke, FluffiestFloof, FluffMe, FluidRock, flymo5678, foboscheshir, FoLoKe, fooberticus, ForestNoises, forgotmyotheraccount, forkeyboards, forthbridge, Fortune117, foxhorn, freeman2651, freeze2222, frobnic8, Froffy025, Fromoriss, froozigiusz, FrostMando, FrostRibbon, Fruitsalad, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, gem, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, Glissadia, GnarpGnarp, GNF54, godisdeadLOL, goet, GoldenCan, Goldminermac, Golinth, golubgik, GoodWheatley, Gorox221, GR1231, gradientvera, graevy, GraniteSidewalk, GreaseMonk, greenrock64, GreyMario, GrownSamoyedDog, GTRsound, gusxyz, Gyrandola, h3half, hamurlik, Hanzdegloker, HappyRoach, happyrobot33, Hardly3D, harikattar, Hayden, he1acdvv, Hebi, Helix-ctrl, helm4142, Henry, HerCoyote23, Hi-Im-Shot, HighTechPuddle, Hitlinemoss, hiucko, hivehum, Hmeister-fake, Hmeister-real, Hobbitmax, hobnob, HoidC, Holinka4ever, holyssss, HoofedEar, Hoolny, hord-brayden, hoshizora-sayo, Hreno, Hrosts, htmlsystem, Huaqas, hubismal, Hugal31, Hyenh, hyperb1, hyperDelegate, hyphenationc, i-justuser-i, iaada, iacore, IamVelcroboy, Ian321, icekot8, icesickleone, iczero, iglov, IgorAnt028, igorsaux, ike709, illersaver, Illiux, Ilushkins33, Ilya246, IlyaElDunaev, imatsoup, IMCB, impubbi, imrenq, imweax, indeano, Injazz, Insineer, insoPL, IntegerTempest, Interrobang01, Intoxicating-Innocence, IProduceWidgets, itsmethom, Itzbenz, iztokbajcar, Jackal298, Jackrost, JackRyd3r, jacksonbailey, jacksonzck, JackspajfMain, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap-havok, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jewelots, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, JohnJJohn, johnjjohn, johnku1, Jophire, Jopogrechkin, joshepvodka, JpegOfAFrog, jproads, JrInventor05, Jrpl, jukereise, juliangiebel, JustArt1m, JustCone14, justdie12, justin, justintether, JustinTrotter, JustinWinningham, justtne, K-Dynamic, k3yw, Kadeo64, Kaga-404, kaiserbirch, KaiShibaa, kalane15, kalanosh, KamTheSythe, Kanashi-Panda, katzenminer, kbailey-git, Keelin, Keer-Sar, KEEYNy, keikiru, Kelrak, Kenionatus, kerisargit, keronshb, KeTuFaisPiKiNut, Khaomi, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kipdotnet, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, kleinerstation13, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, korczoczek, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, kresny, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, Le-Arctic-Fox, leahcat, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, liem161, LightVillet, lilazero, liltenhead, linkbro1, LinkUyx, Litraxx, little-meow-meow, LittleBuilderJane, LittleNorthStar, LittleNyanCat, lizelive, ljm862, lmsnoise, localcc, lokachop, lolman360, Lomcastar, Lordbrandon12, LordCarve, LordEclipse, lucas, LucasTheDrgn, luckyshotpictures, LudwigVonChesterfield, luegamer, luizwritescode, LukaSlade, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lyxcaster, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnnusson, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, mastermiller01, matt, Matz05, max, MaxNox7, maylokana, mdrkrg, MDuch369, meara1179, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, mikeysaurus, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mohamedwidar, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, MrPersival, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, naxel11, NazrinNya, neborsh, nekokiwa, neomoth, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, Not-A-Chair, not-gavnaed, NotActuallyMarty, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, Nuggets219, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, Ohelig, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, PAFFhassoocks, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, PGrayCS, pgraycs, Pgriha, phantom-lily, Pharaz4, pheenty, philingham, Phill101, Phonix, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, piskaczek, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, Prole0, ProPandaBear, ProPeperos, PrPleGoo, ps3moira, Pspritechologist, Psychpsyo, psykana, psykzz, PuceTint, pumkin69, PuroSlavKing, PursuitInAshes, Putnam3145, py01, Pyrovi, qrtDaniil, qrwas, Quantum-cross, quasr-9, quatre, QueerNB, QuietlyWhisper, qwerltaz, Radezolid, RadioMull, Radosvik, Radrark, Rainbeon, Rainfey, RainyGale, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, Redrover1760, redspyy, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rewafflution, rhailrake, rhsvenson, riccardi48, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, robinthegirlthing, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, roryflowers, rosieposieeee, Roudenn, router, ruddygreat, rumaks-xyz, RumiTiger, Ruzihm, rwrv, S1rFl0, S1ss3l, Saakra, SabreML, Sadie-silly, saga3152, saintmuntzer, salarua, Salex08, sam, samgithubaccount, Samuka-C, SaphireLattice, SapphicOverload, sarahon, sativaleanne, SaveliyM360, sBasalto, ScalyChimp, ScarKy0, ScholarNZL, schrodinger71, scrato, Scribbles0, scrivoy, scruq445, scuffedjays, ScumbagDog, SeamLesss, Segonist, semensponge, sephtasm, ser1-1y, Serkket, sewerpig, SG6732, sh18rw, Shaddap1, ShadeAware, ShadowCommander, shadowtheprotogen546, shaeone, shampunj, shariathotpatrol, SharkSnake98, Shegare, shepardtothestars, shibechef, Sidzaru, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, skeeka-dev, skrybl, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, SomegnihT, SonarZeBat, SonicHDC, SoulFN, SoulSloth, Soundwavesghost, soupkilove, southbridge-fur, sowelipililimute, Soydium, SpaceLizard24, SpaceLizardSky, SpaceManiac, SpaceRox1244, SpaceyLady, Spangs04, spanky-spanky, Sparlight, spartak, SpartanKadence, spderman3333, SpeltIncorrectyl, Spessmann, SphiraI, SplinterGP, spoogemonster, sporekto, sporkyz, ssdaniel24, stalengd, stanberytrask, Stanislav4ix, StanTheCarpenter, starbuckss14, Stealthbomber16, steel, Steffo99, stellar-novas, stewie523, stomf, Stop-Signs, stopbreaking, stopka-html, StrawberryMoses, Stray-Pyramid, strO0pwafel, Strol20, StStevens, Subversionary, sunbear-dev, SuperGDPWYL, superjj18, Supernorn, SurrealShibe, SweetAplle, SweptWasTaken, SyaoranFox, Sybil, SYNCHRONIC, Synthestra, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, taserthefox, taurie, Tayrtahn, tday93, teamaki, TeenSarlacc, TekuNut, telavivgamers, telyonok, temm1ie, TemporalOroboros, tentekal, terezi4real, Terraspark4941, texcruize, Tezzaide, TGODiamond, TGRCdev, tgrkzus, thanosdegraf, ThatGuyUSA, ThatOneGoblin25, thatrandomcanadianguy, TheArturZh, TheBlueYowie, thecopbennet, TheCze, TheDarkElites, thedraccx, TheEmber, theexetron, TheFlyingSentry, thefoty, TheGrimbeeper, TheIntoxicatedCat, thekilk, themias, theomund, TheProNoob678, TherapyGoth, ThereDrD0, TheSecondLord, TheShuEd, thetolbean, thevinter, TheWaffleJesus, Thinbug0, ThunderBear2006, timothyteakettle, TimrodDX, timurjavid, tin-man-tim, TiniestShark, Titian3, tk-a369, tkdrg, tmtmtl30, ToastEnjoyer, Toby222, TokenStyle, Tollhouse, Toly65, tom-leys, tomasalves8, Tomeno, Tonydatguy, topy, tornado-technology, TornadoTechnology, tosatur, TotallyLemon, ToxicSonicFan04, Tr1bute, travis-g-reid, treytipton, TriviaSolari, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, tuchila-adi-bogdan, Tunguso4ka, TurboTrackerss14, TVK-04, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, Unkn0wnGh0st333, unusualcrow, UpAndLeaves, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, VanderslootAssgiraffe, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, Venomii, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, viceemargo, VigersRay, violet754, Visne, vitopigno, vitusveit, vlad, vlados1408, VMSolidus, vmzd, VoidMeticulous, voidnull000, volotomite, volundr-, Voomra, Vordenburg, vorkathbruh, Vortebo, vulppine, wachte1, wafehling, walksanatora, Warentan, WarMechanic, Watermelon914, weaversam8, wertanchik, whateverusername0, whatston3, widgetbeck, Will-Oliver-Br, Willhelm53, WilliamECrew, willicassi, Winkarst-cpu, wirdal, wixoaGit, WlarusFromDaSpace, Wolfkey-SomeoneElseTookMyUsername, Worldwaker, wrexbe, wtcwr68, xeri7, xkreksx, xprospero, xRiriq, xsainteer, YanehCheck, yathxyz, Ygg01, YotaXP, youarereadingthis, YoungThugSS14, Yousifb26, youtissoum, yunii, yuriykiss, YuriyKiss, zach-hill, Zadeon, Zalycon, zamp, Zandario, Zap527, Zealith-Gamer, zekins3366, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex
From 863f3019510ea8df327e516a6c4e8c59badf56b0 Mon Sep 17 00:00:00 2001
From: Connor Huffine
Date: Sun, 17 May 2026 06:14:54 -0400
Subject: [PATCH 18/52] Make atmos devices respect map serialized enables
(#43970)
* Add early failout
* Create map loading test
* docs and test fixes
---------
Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com>
---
.../Tests/Atmos/AtmosMapLoadSettingsTest.cs | 86 ++++++++
.../Piping/EntitySystems/AtmosDeviceSystem.cs | 6 +
.../Atmospherics/load_atmos_test_room.yml | 205 ++++++++++++++++++
3 files changed, 297 insertions(+)
create mode 100644 Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs
create mode 100644 Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml
diff --git a/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs b/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs
new file mode 100644
index 0000000000..e1cce573e6
--- /dev/null
+++ b/Content.IntegrationTests/Tests/Atmos/AtmosMapLoadSettingsTest.cs
@@ -0,0 +1,86 @@
+using Content.Server.Atmos.Piping.Trinary.Components;
+using Content.Shared.Atmos.Components;
+using Content.Shared.Atmos.Piping.Binary.Components;
+using Robust.Shared.Utility;
+
+namespace Content.IntegrationTests.Tests.Atmos;
+
+///
+/// Test for ensuring that atmospherics components deserialize and spawn with settings applied.
+///
+[TestFixture]
+public sealed class AtmosMapLoadSettingsTest : AtmosTest
+{
+ // These values correspond to settings in the test map.
+ private const float PumpSetting = 180f;
+ private const float MixerMainSetting = 0.1f;
+ private const float MixerSideSetting = 0.9f;
+
+ ///
+ /// Test map containing saved atmos components.
+ ///
+ protected override ResPath? TestMapPath => new("Maps/Test/Atmospherics/load_atmos_test_room.yml");
+
+ ///
+ /// Test to verify that the settings have been properly applied.
+ ///
+ [Test]
+ public async Task TestMapLoading()
+ {
+ await Server.WaitAssertion(() =>
+ {
+ var volumePumpQuery = SEntMan.EntityQueryEnumerator();
+ while (volumePumpQuery.MoveNext(out var volumePump))
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(volumePump.Enabled, Is.True, "Volume pump did not load enabled!");
+ Assert.That(
+ volumePump.TransferRate,
+ Is.EqualTo(PumpSetting),
+ "Volume pump did not load correct setting!"
+ );
+ }
+ }
+
+ var pressurePumpQuery = SEntMan.EntityQueryEnumerator();
+ while (pressurePumpQuery.MoveNext(out var pressurePump))
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(pressurePump.Enabled, Is.True, "Pressure pump did not load enabled!");
+ Assert.That(
+ pressurePump.TargetPressure,
+ Is.EqualTo(PumpSetting),
+ "Pressure pump did not load correct setting!"
+ );
+ }
+ }
+
+ var mixerQuery = SEntMan.EntityQueryEnumerator();
+ while (mixerQuery.MoveNext(out var mixer))
+ {
+ using (Assert.EnterMultipleScope())
+ {
+ Assert.That(mixer.Enabled, Is.True, "Mixer did not load enabled!");
+ Assert.That(
+ mixer.TargetPressure,
+ Is.EqualTo(PumpSetting),
+ "Mixer pump did not load correct setting!"
+ );
+ Assert.That(
+ mixer.InletOneConcentration,
+ Is.EqualTo(MixerMainSetting),
+ "Mixer split did not load correct setting!"
+ );
+ Assert.That(
+ mixer.InletTwoConcentration,
+ Is.EqualTo(MixerSideSetting),
+ "Mixer split did not load correct setting!"
+ );
+ }
+ }
+
+ });
+ }
+}
diff --git a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs
index 2cd4b37371..e35072daa1 100644
--- a/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs
+++ b/Content.Server/Atmos/Piping/EntitySystems/AtmosDeviceSystem.cs
@@ -112,6 +112,12 @@ namespace Content.Server.Atmos.Piping.EntitySystems
private void OnDeviceParentChanged(Entity ent, ref EntParentChangedMessage args)
{
+ // Event is raised when a map is loaded in. Since this event mutates comp.Enabled,
+ // it will overwrite whatever saved value it had
+ // (so devices saved as enabled will just be disabled).
+ if (args.OldParent is null)
+ return;
+
RejoinAtmosphere(ent);
}
diff --git a/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml b/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml
new file mode 100644
index 0000000000..044460731a
--- /dev/null
+++ b/Resources/Maps/Test/Atmospherics/load_atmos_test_room.yml
@@ -0,0 +1,205 @@
+meta:
+ format: 7
+ category: Map
+ engineVersion: 277.0.0
+ forkId: ""
+ forkVersion: ""
+ time: 05/17/2026 04:58:27
+ entityCount: 22
+maps:
+- 1
+grids:
+- 2
+orphans: []
+nullspace: []
+tilemap:
+ 1: Space
+ 0: Plating
+entities:
+- proto: ""
+ entities:
+ - uid: 1
+ components:
+ - type: MetaData
+ name: Map Entity
+ - type: Transform
+ - type: Map
+ mapPaused: True
+ - type: GridTree
+ - type: Broadphase
+ - type: OccluderTree
+ - uid: 2
+ components:
+ - type: MetaData
+ name: grid
+ - type: Transform
+ pos: 2.754969,-0.5660831
+ parent: 1
+ - type: MapGrid
+ chunks:
+ 0,0:
+ ind: 0,0
+ tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAAEAAAAAAAABAAAAAAAAAQAAAAAAAA==
+ version: 7
+ - type: Broadphase
+ - type: Physics
+ bodyStatus: InAir
+ fixedRotation: False
+ bodyType: Dynamic
+ - type: Fixtures
+ fixtures: {}
+ - type: OccluderTree
+ - type: TileHistory
+ chunkHistory: {}
+ - type: SpreaderGrid
+ - type: Shuttle
+ dampingModifier: 0.25
+ - type: ImplicitRoof
+ - type: GridPathfinding
+ - type: Gravity
+ gravityShakeSound: !type:SoundPathSpecifier
+ path: /Audio/Effects/alert.ogg
+ - type: DecalGrid
+ chunkCollection:
+ version: 2
+ nodes: []
+ - type: GridAtmosphere
+ version: 2
+ data:
+ tiles:
+ 0,0:
+ 0: 61152
+ uniqueMixes:
+ - volume: 2500
+ temperature: 293.15
+ moles:
+ Oxygen: 21.824879
+ Nitrogen: 82.10312
+ chunkSize: 4
+ - type: GasTileOverlay
+ - type: RadiationGridResistance
+ - type: ExplosionAirtightGrid
+- proto: DebugAPCRecharging
+ entities:
+ - uid: 22
+ components:
+ - type: Transform
+ pos: 2.5,4.5
+ parent: 2
+ - type: Fixtures
+ fixtures: {}
+- proto: GasMixer
+ entities:
+ - uid: 21
+ components:
+ - type: Transform
+ pos: 3.5,3.5
+ parent: 2
+ - type: GasMixer
+ inletTwoConcentration: 0.9
+ inletOneConcentration: 0.1
+ targetPressure: 180
+ enabled: True
+- proto: GasPressurePump
+ entities:
+ - uid: 19
+ components:
+ - type: Transform
+ pos: 1.5,3.5
+ parent: 2
+ - type: GasPressurePump
+ targetPressure: 180
+ enabled: True
+- proto: GasVolumePump
+ entities:
+ - uid: 20
+ components:
+ - type: Transform
+ pos: 2.5,3.5
+ parent: 2
+ - type: GasVolumePump
+ transferRate: 180
+ enabled: True
+- proto: WallReinforced
+ entities:
+ - uid: 3
+ components:
+ - type: Transform
+ pos: 0.5,4.5
+ parent: 2
+ - uid: 4
+ components:
+ - type: Transform
+ pos: 0.5,3.5
+ parent: 2
+ - uid: 5
+ components:
+ - type: Transform
+ pos: 0.5,2.5
+ parent: 2
+ - uid: 6
+ components:
+ - type: Transform
+ pos: 0.5,1.5
+ parent: 2
+ - uid: 7
+ components:
+ - type: Transform
+ pos: 0.5,0.5
+ parent: 2
+ - uid: 8
+ components:
+ - type: Transform
+ pos: 1.5,0.5
+ parent: 2
+ - uid: 9
+ components:
+ - type: Transform
+ pos: 2.5,0.5
+ parent: 2
+ - uid: 10
+ components:
+ - type: Transform
+ pos: 3.5,0.5
+ parent: 2
+ - uid: 11
+ components:
+ - type: Transform
+ pos: 4.5,0.5
+ parent: 2
+ - uid: 12
+ components:
+ - type: Transform
+ pos: 4.5,1.5
+ parent: 2
+ - uid: 13
+ components:
+ - type: Transform
+ pos: 4.5,2.5
+ parent: 2
+ - uid: 14
+ components:
+ - type: Transform
+ pos: 4.5,3.5
+ parent: 2
+ - uid: 15
+ components:
+ - type: Transform
+ pos: 4.5,4.5
+ parent: 2
+ - uid: 16
+ components:
+ - type: Transform
+ pos: 3.5,4.5
+ parent: 2
+ - uid: 17
+ components:
+ - type: Transform
+ pos: 2.5,4.5
+ parent: 2
+ - uid: 18
+ components:
+ - type: Transform
+ pos: 1.5,4.5
+ parent: 2
+...
From 6f8dd94726eeaaaaf4d0289ae870dceaf1409797 Mon Sep 17 00:00:00 2001
From: pathetic meowmeow
Date: Sun, 17 May 2026 06:32:51 -0400
Subject: [PATCH 19/52] Add test plan to PR template (#43839)
---
.github/PULL_REQUEST_TEMPLATE.md | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
index 200a83aff5..5bdccc2cd0 100644
--- a/.github/PULL_REQUEST_TEMPLATE.md
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -9,6 +9,11 @@
## Technical details
+## Test plan
+
+
## Media
@@ -16,6 +21,7 @@ Small fixes/refactors are exempt. Media may be used in SS14 progress reports wit
## Requirements
- [ ] I have read and am following the [Pull Request and Changelog Guidelines](https://docs.spacestation14.com/en/general-development/codebase-info/pull-request-guidelines.html).
+- [ ] I have tested this pull request and written instructions on how to test it
- [ ] I have added media to this PR or it does not require an in-game showcase.
From 1723a8a169119c124e3ef3852da94fb4ba9302cb Mon Sep 17 00:00:00 2001
From: PJBot
Date: Sun, 17 May 2026 10:33:41 +0000
Subject: [PATCH 20/52] Automatic changelog update
---
Resources/Changelog/Changelog.yml | 18 +++++++-----------
1 file changed, 7 insertions(+), 11 deletions(-)
diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml
index 4aa85b61d0..612414c6cf 100644
--- a/Resources/Changelog/Changelog.yml
+++ b/Resources/Changelog/Changelog.yml
@@ -1,15 +1,4 @@
Entries:
-- author: Hitlinemoss
- changes:
- - message: Towels in the trinkets loadout menu are now sorted by hue.
- type: Tweak
- - message: White towels no longer have a playtime requirement.
- type: Tweak
- - message: Dark green towels are now actually darker than green towels.
- type: Fix
- id: 9182
- time: '2025-11-01T16:01:07.0000000+00:00'
- url: https://github.com/space-wizards/space-station-14/pull/39831
- author: SlamBamActionman
changes:
- message: Added new signs, spawners and consoles to Exo, along with some minor
@@ -4084,3 +4073,10 @@
id: 9693
time: '2026-05-16T22:29:20.0000000+00:00'
url: https://github.com/space-wizards/space-station-14/pull/36701
+- author: Nem
+ changes:
+ - message: Atmos devices can now be mapped in an enabled state.
+ type: Fix
+ id: 9694
+ time: '2026-05-17T10:32:33.0000000+00:00'
+ url: https://github.com/space-wizards/space-station-14/pull/43970
From 22a547c7c8aa1f0f6ac5f8c3e9941f2dfc25bd17 Mon Sep 17 00:00:00 2001
From: Eveloop <26272940+eveloop@users.noreply.github.com>
Date: Sun, 17 May 2026 18:59:37 +0300
Subject: [PATCH 21/52] Use dependency injection for `EntityQuery`s in
`Content.Server` (#43566)
* Replace usages of EntityQuery with dependency injected ones in Content.Server
* Remove unused EntityQuery dependencies
* Restore CheckPressureAndFire override method
* Revert EntityQuery refactor changes to DisposalTubeSystem.cs & DisposableSystem.cs
* Infer Transform/Metadata directly instead of passing (#43479)
* Resolve RA0049, RA0051 errors (#43479)
* Resolve RA0049, RA0051 errors (#43479)
* Apply suggestions from code review
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
---------
Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com>
---
.../Movement/Systems/MobCollisionSystem.cs | 2 -
Content.Server/Ame/AmeNodeGroup.cs | 1 -
.../Anomaly/AnomalySystem.Generator.cs | 4 +-
.../Anomaly/Effects/BluespaceAnomalySystem.cs | 5 +-
.../Anomaly/Effects/EntityAnomalySystem.cs | 5 --
.../Anomaly/Effects/InjectionAnomalySystem.cs | 8 +--
.../Effects/ProjectileAnomalySystem.cs | 13 ++--
.../Atmos/EntitySystems/AirtightSystem.cs | 1 -
.../EntitySystems/AtmosphereSystem.API.cs | 35 +++++------
.../AtmosphereSystem.Commands.cs | 4 +-
.../AtmosphereSystem.HighPressureDelta.cs | 13 ++--
.../AtmosphereSystem.Processing.cs | 7 +--
.../Atmos/EntitySystems/AtmosphereSystem.cs | 14 ++---
.../Atmos/EntitySystems/FlammableSystem.cs | 7 +--
.../EntitySystems/GasTileOverlaySystem.cs | 13 ++--
.../PipeRestrictOverlapSystem.cs | 5 +-
.../Atmos/Monitor/Systems/AirAlarmSystem.cs | 4 +-
.../Atmos/Monitor/Systems/FireAlarmSystem.cs | 4 +-
.../Body/Systems/InternalsSystem.cs | 5 --
.../Cargo/Systems/CargoSystem.Bounty.cs | 19 +++---
.../Cargo/Systems/CargoSystem.Orders.cs | 2 +-
.../Cargo/Systems/CargoSystem.TradeStation.cs | 14 ++---
Content.Server/Cargo/Systems/CargoSystem.cs | 13 +---
Content.Server/Chat/SuicideSystem.cs | 4 +-
Content.Server/Chat/Systems/ChatSystem.cs | 10 ++-
.../TileReactions/CleanTileReaction.cs | 4 +-
Content.Server/Chunking/ChunkingSystem.cs | 7 +--
.../Systems/PowerSensorSystem.cs | 9 +--
.../DeviceNetwork/Systems/DeviceListSystem.cs | 12 ++--
.../Systems/NetworkConfiguratorSystem.cs | 7 +--
.../Doors/Systems/FirelockSystem.cs | 37 +++++------
Content.Server/Dragon/DragonSystem.cs | 9 +--
.../EntitySystems/ExplosionSystem.GridMap.cs | 7 +--
.../ExplosionSystem.Processing.cs | 13 ----
.../EntitySystems/ExplosionSystem.cs | 24 +++----
.../Fluids/EntitySystems/PuddleSystem.cs | 17 ++---
.../Fluids/EntitySystems/SmokeSystem.cs | 12 +---
.../Fluids/EntitySystems/SpraySystem.cs | 7 +--
.../GameTicking/GameTicker.Spawning.cs | 7 +--
.../GameTicking/Rules/ZombieRuleSystem.cs | 4 +-
Content.Server/Ghost/GhostSystem.cs | 7 +--
Content.Server/Ghost/Roles/GhostRoleSystem.cs | 6 +-
Content.Server/Hands/Systems/HandsSystem.cs | 5 +-
.../Instruments/InstrumentSystem.cs | 29 ++++-----
.../EntitySystems/LightReplacerSystem.cs | 5 +-
.../Light/EntitySystems/RoofSystem.cs | 6 +-
.../Movement/Systems/MobCollisionSystem.cs | 5 +-
.../Movement/Systems/PullController.cs | 24 +++----
.../NPC/Pathfinding/PathfindingSystem.Grid.cs | 10 +--
.../NPC/Pathfinding/PathfindingSystem.cs | 24 +++----
.../NPC/Systems/NPCCombatSystem.Melee.cs | 16 ++---
.../NPC/Systems/NPCCombatSystem.Ranged.cs | 16 ++---
Content.Server/NPC/Systems/NPCJukeSystem.cs | 14 +----
.../Systems/NPCSteeringSystem.Obstacles.cs | 22 +++----
.../NPC/Systems/NPCSteeringSystem.cs | 15 ++---
.../NPC/Systems/NPCUtilitySystem.cs | 15 +----
.../EntitySystems/NodeContainerSystem.cs | 10 ++-
.../EntitySystems/NodeGroupSystem.cs | 15 +++--
.../Systems/HijackShuttleConditionSystem.cs | 10 +--
.../Systems/StealConditionSystem.cs | 5 +-
Content.Server/Parallax/BiomeSystem.cs | 20 ++----
.../ParticleAcceleratorSystem.Emitter.cs | 7 +--
.../Physics/Controllers/MoverController.cs | 12 ++--
Content.Server/Pinpointer/NavMapSystem.cs | 13 ++--
Content.Server/Pinpointer/PinpointerSystem.cs | 13 ++--
.../Pointing/EntitySystems/PointingSystem.cs | 4 +-
.../EntitySystems/ExtensionCableSystem.cs | 10 ++-
.../Power/EntitySystems/PowerNetSystem.cs | 20 +++---
.../EntitySystems/PowerReceiverSystem.cs | 11 ++--
.../Power/Generation/Teg/TegSystem.cs | 5 +-
Content.Server/Procedural/DungeonSystem.cs | 4 --
.../Radiation/Systems/RadiationSystem.cs | 1 +
.../Radio/EntitySystems/RadioSystem.cs | 5 +-
.../EntitySystems/RevenantSystem.Abilities.cs | 34 +++++-----
.../Revenant/EntitySystems/RevenantSystem.cs | 1 -
.../Salvage/SalvageSystem.Magnet.cs | 16 ++---
Content.Server/Salvage/SalvageSystem.cs | 7 +--
.../SensorMonitoringConsoleSystem.cs | 5 +-
.../Shuttles/Systems/ArrivalsSystem.cs | 10 +--
.../Shuttles/Systems/DockingSystem.Shuttle.cs | 23 +++----
.../Shuttles/Systems/DockingSystem.cs | 45 ++++++--------
.../Systems/ShuttleConsoleSystem.FTL.cs | 11 ++--
.../Shuttles/Systems/ShuttleConsoleSystem.cs | 15 ++---
.../Systems/ShuttleSystem.FasterThanLight.cs | 62 +++++++++----------
.../Systems/ShuttleSystem.GridFill.cs | 10 ++-
.../Shuttles/Systems/ShuttleSystem.Impact.cs | 17 ++---
.../Shuttles/Systems/ShuttleSystem.cs | 12 +---
.../Shuttles/Systems/SpaceGarbageSystem.cs | 7 +--
.../Shuttles/Systems/ThrusterSystem.cs | 36 +++++------
.../Silicons/StationAi/StationAiSystem.cs | 5 +-
.../ContainmentFieldGeneratorSystem.cs | 11 ++--
.../EntitySystems/EventHorizonSystem.cs | 5 +-
.../EntitySystems/GravityWellSystem.cs | 14 ++---
.../SingularityGeneratorSystem.cs | 4 +-
.../Speech/EntitySystems/ListeningSystem.cs | 7 +--
Content.Server/Spreader/KudzuSystem.cs | 17 ++---
Content.Server/Spreader/SpreaderSystem.cs | 43 +++++++------
.../Station/Systems/StationSystem.cs | 13 ++--
.../StationEvents/Events/GreytideVirusRule.cs | 10 +--
.../SurveillanceCameraMicrophoneSystem.cs | 7 +--
.../SurveillanceCameraSpeakerSystem.cs | 1 +
.../Systems/TemperatureSystem.Damage.cs | 10 +--
Content.Server/Tiles/RequiresTileSystem.cs | 5 +-
.../Artifact/XAE/XAEIgniteSystem.cs | 11 +---
.../Artifact/XAE/XAELightFlickerSystem.cs | 13 +---
.../XAE/XAEThrowThingsAroundSystem.cs | 11 +---
.../Parallax/Biomes/BiomeComponent.cs | 3 -
107 files changed, 451 insertions(+), 822 deletions(-)
diff --git a/Content.Client/Movement/Systems/MobCollisionSystem.cs b/Content.Client/Movement/Systems/MobCollisionSystem.cs
index 476150acb1..948f93b658 100644
--- a/Content.Client/Movement/Systems/MobCollisionSystem.cs
+++ b/Content.Client/Movement/Systems/MobCollisionSystem.cs
@@ -1,9 +1,7 @@
using System.Numerics;
using Content.Shared.CCVar;
-using Content.Shared.Movement.Components;
using Content.Shared.Movement.Systems;
using Robust.Client.Player;
-using Robust.Shared.Physics.Components;
using Robust.Shared.Timing;
namespace Content.Client.Movement.Systems;
diff --git a/Content.Server/Ame/AmeNodeGroup.cs b/Content.Server/Ame/AmeNodeGroup.cs
index bef5cf5611..3cb83056cc 100644
--- a/Content.Server/Ame/AmeNodeGroup.cs
+++ b/Content.Server/Ame/AmeNodeGroup.cs
@@ -4,7 +4,6 @@ using Content.Server.Ame.EntitySystems;
using Content.Server.Chat.Managers;
using Content.Server.Explosion.EntitySystems;
using Content.Server.NodeContainer.NodeGroups;
-using Content.Server.NodeContainer.Nodes;
using Content.Shared.NodeContainer;
using Content.Shared.NodeContainer.NodeGroups;
using Robust.Server.GameObjects;
diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs
index d1545adc32..e8788f57a4 100644
--- a/Content.Server/Anomaly/AnomalySystem.Generator.cs
+++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs
@@ -22,6 +22,7 @@ public sealed partial class AnomalySystem
{
[Dependency] private SharedMapSystem _mapSystem = default!;
[Dependency] private SharedTransformSystem _transform = default!;
+ [Dependency] private EntityQuery _physicsQuery = default!;
private void InitializeGenerator()
{
@@ -106,13 +107,12 @@ public sealed partial class AnomalySystem
}
// don't spawn inside of solid objects
- var physQuery = GetEntityQuery();
var valid = true;
// TODO: This should be using static lookup.
foreach (var ent in _mapSystem.GetAnchoredEntities(grid, gridComp, tile))
{
- if (!physQuery.TryGetComponent(ent, out var body))
+ if (!_physicsQuery.TryGetComponent(ent, out var body))
continue;
if (body.BodyType != BodyType.Static ||
!body.Hard ||
diff --git a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs
index a16a674047..4681ed75e8 100644
--- a/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs
+++ b/Content.Server/Anomaly/Effects/BluespaceAnomalySystem.cs
@@ -30,8 +30,7 @@ public sealed partial class BluespaceAnomalySystem : EntitySystem
private void OnPulse(EntityUid uid, BluespaceAnomalyComponent component, ref AnomalyPulseEvent args)
{
- var xformQuery = GetEntityQuery();
- var xform = xformQuery.GetComponent(uid);
+ var xform = Transform(uid);
var range = component.MaxShuffleRadius * args.Severity * args.PowerModifier;
// get a list of all entities in range with the MobStateComponent
// we filter out those inside a container
@@ -42,7 +41,7 @@ public sealed partial class BluespaceAnomalySystem : EntitySystem
var coords = new ValueList();
foreach (var ent in allEnts)
{
- if (xformQuery.TryGetComponent(ent, out var allXform))
+ if (TryComp(ent, out TransformComponent? allXform))
coords.Add(_xform.GetWorldPosition(allXform));
}
diff --git a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs
index 3e62ba8359..018af0fb50 100644
--- a/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs
+++ b/Content.Server/Anomaly/Effects/EntityAnomalySystem.cs
@@ -3,7 +3,6 @@ using Content.Shared.Anomaly.Components;
using Content.Shared.Anomaly.Effects;
using Content.Shared.Anomaly.Effects.Components;
using Robust.Shared.Map.Components;
-using Robust.Shared.Physics.Components;
using Robust.Shared.Random;
namespace Content.Server.Anomaly.Effects;
@@ -14,13 +13,9 @@ public sealed partial class EntityAnomalySystem : SharedEntityAnomalySystem
[Dependency] private IRobustRandom _random = default!;
[Dependency] private SharedMapSystem _mapSystem = default!;
- private EntityQuery _physicsQuery;
-
///
public override void Initialize()
{
- _physicsQuery = GetEntityQuery();
-
SubscribeLocalEvent(OnPulse);
SubscribeLocalEvent(OnSupercritical);
SubscribeLocalEvent(OnStabilityChanged);
diff --git a/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs b/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs
index 7c6e934e2b..4e58b3800e 100644
--- a/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs
+++ b/Content.Server/Anomaly/Effects/InjectionAnomalySystem.cs
@@ -18,15 +18,12 @@ public sealed partial class InjectionAnomalySystem : EntitySystem
[Dependency] private EntityLookupSystem _lookup = default!;
[Dependency] private SharedSolutionContainerSystem _solutionContainer = default!;
[Dependency] private TransformSystem _transform = default!;
-
- private EntityQuery