From 2eab3ce2bb1a784164ef6d6a1d681cc5edde9bbe Mon Sep 17 00:00:00 2001 From: Myra Date: Fri, 7 Nov 2025 00:31:50 +0100 Subject: [PATCH 001/100] Remove inappropriate patron name (#41330) --- Resources/Credits/Patrons.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Credits/Patrons.yml b/Resources/Credits/Patrons.yml index d736857edc..fa8dea7432 100644 --- a/Resources/Credits/Patrons.yml +++ b/Resources/Credits/Patrons.yml @@ -338,7 +338,7 @@ Tier: Syndicate Agent - Name: hyphenation Tier: Nuclear Operative -- Name: I'm going to resurrect Charlie Kirk as a gay zombie with a permanent hard cock, like the scene where robocop is lungs, but boner +- Name: REDACTED Tier: Revolutionary - Name: IamOzyman Tier: Revolutionary From 4f0b1f377eeb8533488ebf0ecb2a0bc7eabc7609 Mon Sep 17 00:00:00 2001 From: Justin Pfeifler Date: Thu, 6 Nov 2025 18:53:27 -0600 Subject: [PATCH 002/100] Gravity Generators cannot be unanchored while active (#41256) * Add unanchor attempt check * Combine shared component and server component - Combines SharedGravityGeneratorComponent and GravityGeneratorComponent - AutoNetworked the GravityActiveBool * Remove SharedGravityGeneratorComponent * Update to SharedGravityGeneratorComponent * Fix to be a complete sentence * Dirty GravityActive whenever changed * Rename component and remove view variables * Update referenced component name * Move unanchor attempt to shared system * Add client system * Revert popup to PopupEntity * Fix popup to be PopupClient * Set access restriction on GravityActive --- Content.Client/Entry/EntryPoint.cs | 1 - .../Gravity/GravityGeneratorSystem.cs | 8 +++++ Content.Client/Gravity/GravitySystem.cs | 4 +-- .../Tests/GravityGridTest.cs | 1 - .../Gravity/GravityGeneratorComponent.cs | 20 ------------ .../Gravity/GravityGeneratorSystem.cs | 4 ++- ...ponent.cs => GravityGeneratorComponent.cs} | 31 ++++++++++--------- .../Gravity/SharedGravityGeneratorSystem.cs | 29 +++++++++++++++++ .../components/station-anchor-component.ftl | 2 +- .../gravity/gravity-generator-component.ftl | 6 ++-- 10 files changed, 63 insertions(+), 43 deletions(-) create mode 100644 Content.Client/Gravity/GravityGeneratorSystem.cs delete mode 100644 Content.Server/Gravity/GravityGeneratorComponent.cs rename Content.Shared/Gravity/{SharedGravityGeneratorComponent.cs => GravityGeneratorComponent.cs} (59%) create mode 100644 Content.Shared/Gravity/SharedGravityGeneratorSystem.cs diff --git a/Content.Client/Entry/EntryPoint.cs b/Content.Client/Entry/EntryPoint.cs index ac08547859..b9f0e0e8e6 100644 --- a/Content.Client/Entry/EntryPoint.cs +++ b/Content.Client/Entry/EntryPoint.cs @@ -98,7 +98,6 @@ namespace Content.Client.Entry _componentFactory.IgnoreMissingComponents(); // Do not add to these, they are legacy. - _componentFactory.RegisterClass(); _componentFactory.RegisterClass(); // Do not add to the above, they are legacy diff --git a/Content.Client/Gravity/GravityGeneratorSystem.cs b/Content.Client/Gravity/GravityGeneratorSystem.cs new file mode 100644 index 0000000000..b74ea35daa --- /dev/null +++ b/Content.Client/Gravity/GravityGeneratorSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.Gravity; + +namespace Content.Client.Gravity; + +public sealed class GravityGeneratorSystem : SharedGravityGeneratorSystem +{ + +} diff --git a/Content.Client/Gravity/GravitySystem.cs b/Content.Client/Gravity/GravitySystem.cs index 60e043cc99..f1e09fdb44 100644 --- a/Content.Client/Gravity/GravitySystem.cs +++ b/Content.Client/Gravity/GravitySystem.cs @@ -12,14 +12,14 @@ public sealed partial class GravitySystem : SharedGravitySystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnAppearanceChange); + SubscribeLocalEvent(OnAppearanceChange); InitializeShake(); } /// /// Ensures that the visible state of gravity generators are synced with their sprites. /// - private void OnAppearanceChange(EntityUid uid, SharedGravityGeneratorComponent comp, ref AppearanceChangeEvent args) + private void OnAppearanceChange(EntityUid uid, GravityGeneratorComponent comp, ref AppearanceChangeEvent args) { if (args.Sprite == null) return; diff --git a/Content.IntegrationTests/Tests/GravityGridTest.cs b/Content.IntegrationTests/Tests/GravityGridTest.cs index 8257035de6..047ec0259a 100644 --- a/Content.IntegrationTests/Tests/GravityGridTest.cs +++ b/Content.IntegrationTests/Tests/GravityGridTest.cs @@ -1,4 +1,3 @@ -using Content.Server.Gravity; using Content.Server.Power.Components; using Content.Shared.Gravity; using Robust.Shared.GameObjects; diff --git a/Content.Server/Gravity/GravityGeneratorComponent.cs b/Content.Server/Gravity/GravityGeneratorComponent.cs deleted file mode 100644 index c715a5e5f3..0000000000 --- a/Content.Server/Gravity/GravityGeneratorComponent.cs +++ /dev/null @@ -1,20 +0,0 @@ -using Content.Shared.Gravity; -using Content.Shared.Construction.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; - -namespace Content.Server.Gravity -{ - [RegisterComponent] - [Access(typeof(GravityGeneratorSystem))] - public sealed partial class GravityGeneratorComponent : SharedGravityGeneratorComponent - { - [DataField("lightRadiusMin")] public float LightRadiusMin { get; set; } - [DataField("lightRadiusMax")] public float LightRadiusMax { get; set; } - - /// - /// Is the gravity generator currently "producing" gravity? - /// - [ViewVariables] - public bool GravityActive { get; set; } = false; - } -} diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index 9d58b82d69..8e714cf884 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -4,7 +4,7 @@ using Content.Shared.Gravity; namespace Content.Server.Gravity; -public sealed class GravityGeneratorSystem : EntitySystem +public sealed class GravityGeneratorSystem : SharedGravityGeneratorSystem { [Dependency] private readonly GravitySystem _gravitySystem = default!; [Dependency] private readonly SharedPointLightSystem _lights = default!; @@ -36,6 +36,7 @@ public sealed class GravityGeneratorSystem : EntitySystem private void OnActivated(Entity ent, ref ChargedMachineActivatedEvent args) { ent.Comp.GravityActive = true; + Dirty(ent, ent.Comp); var xform = Transform(ent); @@ -48,6 +49,7 @@ public sealed class GravityGeneratorSystem : EntitySystem private void OnDeactivated(Entity ent, ref ChargedMachineDeactivatedEvent args) { ent.Comp.GravityActive = false; + Dirty(ent, ent.Comp); var xform = Transform(ent); diff --git a/Content.Shared/Gravity/SharedGravityGeneratorComponent.cs b/Content.Shared/Gravity/GravityGeneratorComponent.cs similarity index 59% rename from Content.Shared/Gravity/SharedGravityGeneratorComponent.cs rename to Content.Shared/Gravity/GravityGeneratorComponent.cs index 75b636b2fa..f7b1240f1a 100644 --- a/Content.Shared/Gravity/SharedGravityGeneratorComponent.cs +++ b/Content.Shared/Gravity/GravityGeneratorComponent.cs @@ -3,42 +3,45 @@ using Robust.Shared.GameStates; namespace Content.Shared.Gravity; -[NetworkedComponent()] -[Virtual] -public partial class SharedGravityGeneratorComponent : Component +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class GravityGeneratorComponent : Component { + [DataField] public float LightRadiusMin { get; set; } + [DataField] public float LightRadiusMax { get; set; } + /// /// A map of the sprites used by the gravity generator given its status. /// - [DataField("spriteMap")] - [Access(typeof(SharedGravitySystem))] - public Dictionary SpriteMap = new(); + [DataField, Access(typeof(SharedGravitySystem))] + public Dictionary SpriteMap = []; /// /// The sprite used by the core of the gravity generator when the gravity generator is starting up. /// - [DataField("coreStartupState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreStartupState = "startup"; /// /// The sprite used by the core of the gravity generator when the gravity generator is idle. /// - [DataField("coreIdleState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreIdleState = "idle"; /// /// The sprite used by the core of the gravity generator when the gravity generator is activating. /// - [DataField("coreActivatingState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreActivatingState = "activating"; /// /// The sprite used by the core of the gravity generator when the gravity generator is active. /// - [DataField("coreActivatedState")] - [ViewVariables(VVAccess.ReadWrite)] + [DataField] public string CoreActivatedState = "activated"; + + /// + /// Is the gravity generator currently "producing" gravity? + /// + [DataField, AutoNetworkedField, Access(typeof(SharedGravityGeneratorSystem))] + public bool GravityActive = false; } diff --git a/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs b/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs new file mode 100644 index 0000000000..b2b2e72b62 --- /dev/null +++ b/Content.Shared/Gravity/SharedGravityGeneratorSystem.cs @@ -0,0 +1,29 @@ +using Content.Shared.Popups; +using Content.Shared.Construction.Components; + +namespace Content.Shared.Gravity; + +public abstract class SharedGravityGeneratorSystem : EntitySystem +{ + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUnanchorAttempt); + } + + /// + /// Prevent unanchoring when gravity is active + /// + private void OnUnanchorAttempt(Entity ent, ref UnanchorAttemptEvent args) + { + if (!ent.Comp.GravityActive) + return; + + _popupSystem.PopupClient(Loc.GetString("gravity-generator-unanchoring-failed"), ent.Owner, args.User, PopupType.Medium); + + args.Cancel(); + } +} diff --git a/Resources/Locale/en-US/components/station-anchor-component.ftl b/Resources/Locale/en-US/components/station-anchor-component.ftl index fd9d5ea4ae..18221e945a 100644 --- a/Resources/Locale/en-US/components/station-anchor-component.ftl +++ b/Resources/Locale/en-US/components/station-anchor-component.ftl @@ -1,2 +1,2 @@ -station-anchor-unanchoring-failed = Can't unanchor an active station anchor +station-anchor-unanchoring-failed = Can't unanchor an active station anchor. station-anchor-window-title = Station Anchor diff --git a/Resources/Locale/en-US/gravity/gravity-generator-component.ftl b/Resources/Locale/en-US/gravity/gravity-generator-component.ftl index b4e6cddcd5..fa3783fc34 100644 --- a/Resources/Locale/en-US/gravity/gravity-generator-component.ftl +++ b/Resources/Locale/en-US/gravity/gravity-generator-component.ftl @@ -1,11 +1,9 @@ ### Gravity Generator ## UI - gravity-generator-window-title = Gravity Generator ## UI field names - gravity-generator-window-status = Status: gravity-generator-window-power = Power: gravity-generator-window-eta = ETA: @@ -23,6 +21,8 @@ gravity-generator-window-power-off = Off gravity-generator-window-power-label = { $draw } / { $max } W ## UI ETA label - gravity-generator-window-eta-none = N/A gravity-generator-window-eta-value = { TOSTRING($left, "m\\:ss") } + +## Popup +gravity-generator-unanchoring-failed = Can't unanchor an active gravity generator. From 79f3ac3ecabc76ae6e31f7abcb9edf7c59938698 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 01:06:13 +0000 Subject: [PATCH 003/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bb2ca3a948..97bbe776bc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: KamTheSythe - changes: - - message: Explosive payloads no longer explode. Modular grenades with explosive - payloads remain unchanged, and can still be used to stack explosions. - type: Tweak - id: 8687 - time: '2025-06-17T09:46:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38049 - author: Kittygyat changes: - message: Increased borg drag speed, equivalent to Diona speeds. @@ -3925,3 +3917,10 @@ id: 9188 time: '2025-11-06T21:46:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41163 +- author: Jrpl + changes: + - message: Gravity Generators can no longer be unanchored while they are active. + type: Fix + id: 9189 + time: '2025-11-07T01:05:04.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41256 From e718f0252d467554353ff9d969e6388887ba4121 Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Fri, 7 Nov 2025 02:32:26 -0500 Subject: [PATCH 004/100] Golden plunger + security star(s) moved to job trinkets loadout tab (#41094) * Golden plunger + security star(s) moved to job trinkets loadout tam * Fixed being unable to pick both job-plushie and the plunger/star at the same time * Whoops, forgot to commit the bartender fix * SecStar playtime baked into prototype itself * Removed increased job-trinket limit (likely bad to hardcode these for very specific roles) --- .../Loadouts/Jobs/Civilian/janitor.yml | 10 --------- .../Jobs/Security/security_officer.yml | 20 ------------------ .../Loadouts/Miscellaneous/jobtrinkets.yml | 21 +++++++++++++++++++ .../Prototypes/Loadouts/loadout_groups.yml | 19 +++++------------ .../Prototypes/Loadouts/role_loadouts.yml | 5 ----- 5 files changed, 26 insertions(+), 49 deletions(-) diff --git a/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml b/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml index d902481f9c..431b83a99d 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Civilian/janitor.yml @@ -45,13 +45,3 @@ id: JanitorWintercoat equipment: outerClothing: ClothingOuterWinterJani - -# Misc -- type: loadout - id: JanitorGoldenPlunger - effects: - - !type:GroupLoadoutEffect - proto: SeniorJanitorial - storage: - back: - - GoldenPlunger diff --git a/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml b/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml index 482e3ab896..e0b0ce1a3f 100644 --- a/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Loadouts/Jobs/Security/security_officer.yml @@ -13,16 +13,6 @@ department: Security time: 60h -#Security Star -- type: loadoutEffectGroup - id: SecurityStarWorthy - effects: - - !type:JobRequirementLoadoutEffect - requirement: - !type:DepartmentTimeRequirement - department: Security - time: 100h - # Head - type: loadout id: SecurityHelmet @@ -158,13 +148,3 @@ proto: SeniorOfficer equipment: id: SeniorOfficerPDA - -# Misc -- type: loadout - id: SecStar - effects: - - !type:GroupLoadoutEffect - proto: SecurityStarWorthy - storage: - back: - - Dinkystar diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml b/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml index fd674b1901..b5e3f6bdd7 100644 --- a/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml +++ b/Resources/Prototypes/Loadouts/Miscellaneous/jobtrinkets.yml @@ -120,6 +120,15 @@ back: - PlushieLizardJobJanitor +- type: loadout + id: JanitorGoldenPlunger + effects: + - !type:GroupLoadoutEffect + proto: SeniorJanitorial + storage: + back: + - GoldenPlunger + - type: loadout id: LizardPlushieBotanist effects: @@ -336,6 +345,18 @@ back: - PlushieLizardJobSecurityofficer +- type: loadout + id: SecStar + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:DepartmentTimeRequirement + department: Security + time: 100h + storage: + back: + - Dinkystar + - type: loadout id: LizardPlushieSecurityCadet effects: diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index 185b68ab36..c79689d5a0 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -484,19 +484,13 @@ loadouts: - JanitorWintercoat -- type: loadoutGroup - id: JanitorPlunger - name: loadout-group-janitor-plunger - minLimit: 0 - loadouts: - - JanitorGoldenPlunger - - type: loadoutGroup id: JanitorJobTrinkets name: loadout-group-jobtrinkets minLimit: 0 loadouts: - LizardPlushieJanitor + - JanitorGoldenPlunger - type: loadoutGroup id: BotanistHead @@ -1184,6 +1178,7 @@ minLimit: 0 loadouts: - LizardPlushieHeadofSecurity + - SecStar - type: loadoutGroup id: WardenHead @@ -1213,6 +1208,7 @@ minLimit: 0 loadouts: - LizardPlushieWarden + - SecStar - type: loadoutGroup id: SecurityHead @@ -1279,6 +1275,7 @@ minLimit: 0 loadouts: - LizardPlushieSecurity + - SecStar - type: loadoutGroup id: DetectiveHead @@ -1318,6 +1315,7 @@ minLimit: 0 loadouts: - LizardPlushieDetective + - SecStar - type: loadoutGroup id: SecurityCadetJumpsuit @@ -1343,13 +1341,6 @@ - EmergencyOxygenSecurity - LoadoutSpeciesVoxNitrogen -- type: loadoutGroup - id: SecurityStar - name: loadout-group-security-star - minLimit: 0 - loadouts: - - SecStar - # Medical - type: loadoutGroup id: ChiefMedicalOfficerHead diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index bbdb21e17c..d0ab791a30 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -152,7 +152,6 @@ - Survival - Trinkets - JanitorJobTrinkets - - JanitorPlunger - GroupSpeciesBreathTool - type: roleLoadout @@ -378,7 +377,6 @@ - SurvivalSecurity - Trinkets - HeadofSecurityJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -393,7 +391,6 @@ - SurvivalSecurity - Trinkets - WardenJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -409,7 +406,6 @@ - SurvivalSecurity - Trinkets - SecurityJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout @@ -424,7 +420,6 @@ - SurvivalSecurity - Trinkets - DetectiveJobTrinkets - - SecurityStar - GroupSpeciesBreathToolSecurity - type: roleLoadout From 522bc421aa950cf516bd3ff71c61e66e30b46acd Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 07:44:57 +0000 Subject: [PATCH 005/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 97bbe776bc..5d5045ddbc 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Increased borg drag speed, equivalent to Diona speeds. - type: Tweak - id: 8688 - time: '2025-06-17T10:41:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38232 - author: TheFlyingSentry changes: - message: Animal stealing thief objectives now actually check for the objective's @@ -3924,3 +3917,11 @@ id: 9189 time: '2025-11-07T01:05:04.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41256 +- author: Hitlinemoss + changes: + - message: The golden plunger and security star have been moved to their respective + roles' "Job trinkets" loadout tab. + type: Tweak + id: 9190 + time: '2025-11-07T07:43:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41094 From 0a8be7eebaffb693e368d0f6f02ff88d113676e5 Mon Sep 17 00:00:00 2001 From: Alex Date: Fri, 7 Nov 2025 03:25:16 -0500 Subject: [PATCH 006/100] Exo: connect medbay's dispo (#41329) Fix medbay dispo on exo --- Resources/Maps/exo.yml | 93 ++++++++++++++++++++++++++---------------- 1 file changed, 58 insertions(+), 35 deletions(-) diff --git a/Resources/Maps/exo.yml b/Resources/Maps/exo.yml index 8b893c2b82..af133764a4 100644 --- a/Resources/Maps/exo.yml +++ b/Resources/Maps/exo.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/01/2025 14:27:42 - entityCount: 20005 + time: 11/06/2025 22:05:46 + entityCount: 20009 maps: - 1 grids: @@ -4653,10 +4653,10 @@ entities: 0: 51711 8,-16: 0: 271 - 4: 17408 + 2: 17408 8,-15: 1: 4096 - 4: 4 + 2: 4 8,-14: 0: 32752 8,-13: @@ -5350,8 +5350,8 @@ entities: 0: 65535 9,-16: 0: 15 - 5: 4352 - 2: 17408 + 3: 4352 + 4: 17408 10,-20: 0: 65280 10,-19: @@ -5362,8 +5362,8 @@ entities: 0: 65535 10,-16: 0: 15 - 2: 4352 - 6: 17408 + 4: 4352 + 5: 17408 11,-20: 0: 65024 11,-19: @@ -5375,7 +5375,7 @@ entities: 11,-16: 0: 15 1: 35840 - 2: 4352 + 4: 4352 12,-20: 0: 65280 12,-19: @@ -5409,7 +5409,7 @@ entities: 0: 61183 12,-16: 0: 7 - 2: 2184 + 4: 2184 1: 8960 13,-20: 0: 65024 @@ -5423,7 +5423,7 @@ entities: 13,-21: 1: 16179 13,-16: - 2: 819 + 4: 819 1: 8 14,-20: 0: 53504 @@ -5623,7 +5623,7 @@ entities: 0: 59392 11,-15: 1: 32904 - 2: 1 + 4: 1 12,-14: 0: 62926 11,-14: @@ -5744,12 +5744,12 @@ entities: 0: 60625 11,-10: 0: 34944 - 3: 13104 + 6: 13104 12,-9: 0: 56784 11,-9: 0: 65416 - 3: 2 + 6: 2 12,-8: 0: 57117 13,-11: @@ -5895,7 +5895,7 @@ entities: 10,-11: 0: 65535 10,-10: - 3: 65520 + 6: 65520 0: 4 10,-13: 0: 12276 @@ -5958,14 +5958,14 @@ entities: 11,-3: 1: 12288 9,-15: - 5: 1 - 2: 4 + 3: 1 + 4: 4 1: 32768 9,-14: 0: 36848 10,-15: - 2: 1 - 6: 4 + 4: 1 + 5: 4 10,-14: 0: 65520 -8,-24: @@ -6050,14 +6050,6 @@ entities: - volume: 2500 immutable: True moles: {} - - volume: 2500 - temperature: 293.15 - moles: {} - - volume: 2500 - temperature: 235 - moles: - Oxygen: 27.225372 - Nitrogen: 102.419266 - volume: 2500 temperature: 293.15 moles: @@ -6066,10 +6058,18 @@ entities: temperature: 293.15 moles: Nitrogen: 6666.982 + - volume: 2500 + temperature: 293.15 + moles: {} - volume: 2500 temperature: 293.15 moles: Plasma: 6666.982 + - volume: 2500 + temperature: 235 + moles: + Oxygen: 27.225372 + Nitrogen: 102.419266 chunkSize: 4 - type: GasTileOverlay - type: RadiationGridResistance @@ -10102,7 +10102,7 @@ entities: pos: 11.5,-30.5 parent: 2 - type: Door - secondsUntilStateChange: -254267.98 + secondsUntilStateChange: -254680.28 state: Opening - type: DeviceLinkSource lastSignals: @@ -10458,7 +10458,7 @@ entities: pos: 34.5,-36.5 parent: 2 - type: Door - secondsUntilStateChange: -29765.682 + secondsUntilStateChange: -30177.973 state: Opening - type: DeviceLinkSource lastSignals: @@ -48732,6 +48732,11 @@ entities: rot: -1.5707963267948966 rad pos: 27.5,-24.5 parent: 2 + - uid: 14215 + components: + - type: Transform + pos: 27.5,-23.5 + parent: 2 - uid: 15507 components: - type: Transform @@ -49779,12 +49784,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-22.5 parent: 2 - - uid: 14215 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 27.5,-23.5 - parent: 2 - uid: 14451 components: - type: Transform @@ -52991,6 +52990,30 @@ entities: rot: 1.5707963267948966 rad pos: 26.5,-66.5 parent: 2 + - uid: 18997 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 23.5,-23.5 + parent: 2 + - uid: 19000 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 24.5,-23.5 + parent: 2 + - uid: 19001 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,-23.5 + parent: 2 + - uid: 19002 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 26.5,-23.5 + parent: 2 - uid: 19453 components: - type: Transform From cc05c6cf818f1c6418f894dc5f4985ccf5136668 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 7 Nov 2025 08:37:12 +0000 Subject: [PATCH 007/100] Automatic changelog update --- Resources/Changelog/Maps.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Resources/Changelog/Maps.yml b/Resources/Changelog/Maps.yml index 80ff2191eb..13186ab6f2 100644 --- a/Resources/Changelog/Maps.yml +++ b/Resources/Changelog/Maps.yml @@ -819,4 +819,11 @@ id: 99 time: '2025-11-03T09:45:56.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41072 +- author: F1restar4 + changes: + - message: On Exo, connected medbay's dispo units to the network + type: Fix + id: 100 + time: '2025-11-07T08:36:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41329 Order: 2 From 027462d95abc0a169df58d32ccb8bddef1216efa Mon Sep 17 00:00:00 2001 From: qwerltaz <69696513+qwerltaz@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:32:19 +0100 Subject: [PATCH 008/100] box station: change empty dressers to random fill (#41344) change empty dressers to random fill, and comfy chair before TV in dorm 4 --- Resources/Maps/box.yml | 62 ++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index 4f2ac605a0..53a8e77654 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/04/2025 19:45:51 - entityCount: 28789 + time: 11/07/2025 10:31:27 + entityCount: 28792 maps: - 780 grids: @@ -73729,6 +73729,12 @@ entities: - type: Transform pos: -7.5,23.5 parent: 8364 + - uid: 9086 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,14.5 + parent: 8364 - uid: 9439 components: - type: Transform @@ -85142,28 +85148,6 @@ entities: - type: Transform pos: -22.349255,-5.634054 parent: 8364 -- proto: Dresser - entities: - - uid: 5190 - components: - - type: Transform - pos: 4.5,8.5 - parent: 8364 - - uid: 6675 - components: - - type: Transform - pos: 15.5,15.5 - parent: 8364 - - uid: 6676 - components: - - type: Transform - pos: 4.5,5.5 - parent: 8364 - - uid: 6987 - components: - - type: Transform - pos: 20.5,4.5 - parent: 8364 - proto: DresserCaptainFilled entities: - uid: 5341 @@ -85187,11 +85171,41 @@ entities: parent: 8364 - proto: DresserFilled entities: + - uid: 5089 + components: + - type: Transform + pos: 15.5,15.5 + parent: 8364 + - uid: 5190 + components: + - type: Transform + pos: 4.5,8.5 + parent: 8364 + - uid: 6675 + components: + - type: Transform + pos: 4.5,5.5 + parent: 8364 + - uid: 6676 + components: + - type: Transform + pos: 20.5,4.5 + parent: 8364 + - uid: 6987 + components: + - type: Transform + pos: 13.5,15.5 + parent: 8364 - uid: 7329 components: - type: Transform pos: 10.5,30.5 parent: 8364 + - uid: 7852 + components: + - type: Transform + pos: 5.5,15.5 + parent: 8364 - proto: DresserHeadOfPersonnelFilled entities: - uid: 5289 From 066dd7fb97f968a81b56b74a9591d8dda7944d61 Mon Sep 17 00:00:00 2001 From: qwerltaz <69696513+qwerltaz@users.noreply.github.com> Date: Fri, 7 Nov 2025 21:36:24 +0100 Subject: [PATCH 009/100] marathon station: replace empty dresser with random fill (#41345) marathon: replace empty dresser with random fill --- Resources/Maps/marathon.yml | 71 +++++++++++++++++++------------------ 1 file changed, 37 insertions(+), 34 deletions(-) diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index b2d20a2df1..4d60e79763 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -4,8 +4,8 @@ meta: engineVersion: 267.3.0 forkId: "" forkVersion: "" - time: 11/04/2025 19:49:34 - entityCount: 23872 + time: 11/07/2025 10:28:48 + entityCount: 23873 maps: - 5350 grids: @@ -64780,38 +64780,6 @@ entities: - type: Transform pos: 49.502296,31.49661 parent: 30 -- proto: Dresser - entities: - - uid: 655 - components: - - type: Transform - pos: 3.5,15.5 - parent: 30 - - uid: 6427 - components: - - type: Transform - pos: 16.5,39.5 - parent: 30 - - uid: 17643 - components: - - type: Transform - pos: -78.5,-49.5 - parent: 30 - - uid: 17946 - components: - - type: Transform - pos: -52.5,-51.5 - parent: 30 - - uid: 17947 - components: - - type: Transform - pos: -52.5,-55.5 - parent: 30 - - uid: 21299 - components: - - type: Transform - pos: -29.5,-45.5 - parent: 30 - proto: DresserCaptainFilled entities: - uid: 4989 @@ -64835,11 +64803,46 @@ entities: parent: 30 - proto: DresserFilled entities: + - uid: 655 + components: + - type: Transform + pos: 3.5,15.5 + parent: 30 + - uid: 2001 + components: + - type: Transform + pos: 16.5,39.5 + parent: 30 + - uid: 6427 + components: + - type: Transform + pos: -78.5,-49.5 + parent: 30 - uid: 9968 components: - type: Transform pos: -10.5,-22.5 parent: 30 + - uid: 17643 + components: + - type: Transform + pos: -52.5,-51.5 + parent: 30 + - uid: 17946 + components: + - type: Transform + pos: -52.5,-55.5 + parent: 30 + - uid: 17947 + components: + - type: Transform + pos: -29.5,-45.5 + parent: 30 + - uid: 21299 + components: + - type: Transform + pos: 18.5,34.5 + parent: 30 - proto: DresserHeadOfPersonnelFilled entities: - uid: 5715 From e64b6b03fa1e92e2e2312d0c40107bc0754bf83e Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 8 Nov 2025 12:29:08 -0800 Subject: [PATCH 010/100] Conveyors spin fix (#37468) * Init commit * And on the third day god said: good enough * and on the fourth day god said: oops * Commit of evil * I hate conveyors * Switch the numbas * I hate conveyors * Master Merge * And on the third day, God said: Good Enough * I hate conveyors * AAAA * Optimize it a bit * Move that * Init Commit * Oops * Remove that * One last commit * Removed one TryComp * Remove TryComp --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- .../Controllers/SharedConveyorController.cs | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Physics/Controllers/SharedConveyorController.cs b/Content.Shared/Physics/Controllers/SharedConveyorController.cs index b1ccb3be2a..e8b22b410c 100644 --- a/Content.Shared/Physics/Controllers/SharedConveyorController.cs +++ b/Content.Shared/Physics/Controllers/SharedConveyorController.cs @@ -1,4 +1,4 @@ -using System.Numerics; +using System.Numerics; using Content.Shared.Conveyor; using Content.Shared.Gravity; using Content.Shared.Movement.Components; @@ -58,6 +58,9 @@ public abstract class SharedConveyorController : VirtualController private void OnConveyedFriction(Entity ent, ref TileFrictionEvent args) { + if(!ent.Comp.Conveying) + return; + // Conveyed entities don't get friction, they just get wishdir applied so will inherently slowdown anyway. args.Modifier = 0f; } @@ -140,7 +143,15 @@ public abstract class SharedConveyorController : VirtualController continue; var physics = ent.Entity.Comp3; + + if (physics.BodyStatus != BodyStatus.OnGround) + { + SetConveying(ent.Entity.Owner, ent.Entity.Comp1, false); + continue; + } + var velocity = physics.LinearVelocity; + var angularVelocity = physics.AngularVelocity; var targetDir = ent.Direction; // If mob is moving with the conveyor then combine the directions. @@ -163,6 +174,7 @@ public abstract class SharedConveyorController : VirtualController // We provide a small minimum friction speed as well for those times where the friction would stop large objects // snagged on corners from sliding into the centerline. _mover.Friction(0.2f, frameTime: frameTime, friction: 5f, ref velocity); + _mover.Friction(0f, frameTime: frameTime, friction: 5f, ref angularVelocity); } SharedMoverController.Accelerate(ref velocity, targetDir, 20f, frameTime); @@ -172,8 +184,10 @@ public abstract class SharedConveyorController : VirtualController // Need friction to outweigh the movement as it will bounce a bit against the wall. // This facilitates being able to sleep entities colliding into walls. _mover.Friction(0f, frameTime: frameTime, friction: 40f, ref velocity); + _mover.Friction(0f, frameTime: frameTime, friction: 40f, ref angularVelocity); } + PhysicsSystem.SetAngularVelocity(ent.Entity.Owner, angularVelocity); PhysicsSystem.SetLinearVelocity(ent.Entity.Owner, velocity, wakeBody: false); if (!IsConveyed((ent.Entity.Owner, ent.Entity.Comp2))) From 841c09bbf14efdb6c3390d156a2b49380ae89df8 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 8 Nov 2025 20:41:51 +0000 Subject: [PATCH 011/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 5d5045ddbc..2664164bf6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: TheFlyingSentry - changes: - - message: Animal stealing thief objectives now actually check for the objective's - existence. - type: Tweak - id: 8689 - time: '2025-06-17T11:06:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38332 - author: kosticia changes: - message: Reflection chances are examinable now. @@ -3925,3 +3917,10 @@ id: 9190 time: '2025-11-07T07:43:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41094 +- author: Princess-Cheeseballs + changes: + - message: Items no longer spin on Conveyors + type: Fix + id: 9191 + time: '2025-11-08T20:40:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/37468 From 7155d0d291f083e56b6d1029649799fe813dd984 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sat, 8 Nov 2025 21:55:02 +0100 Subject: [PATCH 012/100] Cleanup BatterySystem (#41298) * cleanup * fix fixtures * this belongs into the next PR * review * misc --------- Co-authored-by: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> --- .../Tests/Power/PowerTest.cs | 44 +-- .../Systems/AdminVerbSystem.Tools.cs | 14 +- .../EntitySystems/EmergencyLightSystem.cs | 6 +- .../EntitySystems/HandheldLightSystem.cs | 2 +- Content.Server/Mech/Systems/MechSystem.cs | 2 +- .../Ninja/Systems/BatteryDrainerSystem.cs | 6 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 2 +- .../BatterySelfRechargerComponent.cs | 36 -- .../Power/EntitySystems/BatterySystem.API.cs | 104 ++++++ .../Power/EntitySystems/BatterySystem.cs | 311 ++++++------------ .../Power/EntitySystems/ChargerSystem.cs | 4 +- .../Power/EntitySystems/PowerNetSystem.cs | 6 +- .../Power/SetBatteryPercentCommand.cs | 2 +- .../PowerCell/PowerCellSystem.Draw.cs | 2 +- Content.Server/PowerCell/PowerCellSystem.cs | 2 +- Content.Server/PowerSink/PowerSinkSystem.cs | 2 +- .../Radio/EntitySystems/JammerSystem.cs | 2 +- .../Silicons/StationAi/StationAiSystem.cs | 2 +- .../Stunnable/Systems/StunbatonSystem.cs | 2 +- .../Tesla/EntitySystem/TeslaCoilSystem.cs | 2 +- .../Ranged/Systems/GunSystem.Battery.cs | 1 + .../Artifact/XAE/XAEChargeBatterySystem.cs | 2 +- Content.Shared/Power/ChargeEvents.cs | 32 +- .../Power/Components/BatteryComponent.cs | 8 +- .../BatterySelfRechargerComponent.cs | 36 ++ .../EntitySystems/SharedBatterySystem.cs | 56 +++- Resources/Maps/Lavaland/grasslanddome.yml | 1 - Resources/Maps/Lavaland/snowydome.yml | 1 - Resources/Maps/Misc/terminal.yml | 6 - Resources/Maps/Nonstations/wizardsden.yml | 1 - Resources/Maps/Ruins/ruined_prison_ship.yml | 1 - Resources/Maps/Shuttles/arrivals.yml | 1 - .../Clothing/Head/base_clothinghead.yml | 1 - .../Entities/Clothing/OuterClothing/armor.yml | 1 - .../Entities/Mobs/NPCs/behonker.yml | 1 - .../Entities/Mobs/NPCs/lavaland.yml | 1 - .../Entities/Mobs/NPCs/living_light.yml | 1 - .../Entities/Mobs/NPCs/miscellaneous.yml | 1 - .../Entities/Objects/Power/powercells.yml | 4 - .../Weapons/Guns/Battery/battery_guns.yml | 5 - .../Objects/Weapons/Guns/LMGs/lmgs.yml | 1 - .../Objects/Weapons/Guns/Pistols/pistols.yml | 1 - .../Objects/Weapons/Guns/SMGs/smgs.yml | 1 - .../Objects/Weapons/Guns/pneumatic_cannon.yml | 1 - .../Entities/Structures/Power/debug_power.yml | 4 - 45 files changed, 356 insertions(+), 366 deletions(-) delete mode 100644 Content.Server/Power/Components/BatterySelfRechargerComponent.cs create mode 100644 Content.Server/Power/EntitySystems/BatterySystem.API.cs create mode 100644 Content.Shared/Power/Components/BatterySelfRechargerComponent.cs diff --git a/Content.IntegrationTests/Tests/Power/PowerTest.cs b/Content.IntegrationTests/Tests/Power/PowerTest.cs index ab8a421c03..85bd366697 100644 --- a/Content.IntegrationTests/Tests/Power/PowerTest.cs +++ b/Content.IntegrationTests/Tests/Power/PowerTest.cs @@ -402,8 +402,8 @@ namespace Content.IntegrationTests.Tests.Power battery = entityManager.GetComponent(generatorEnt); consumer = entityManager.GetComponent(consumerEnt); - batterySys.SetMaxCharge(generatorEnt, startingCharge, battery); - batterySys.SetCharge(generatorEnt, startingCharge, battery); + batterySys.SetMaxCharge((generatorEnt, battery), startingCharge); + batterySys.SetCharge((generatorEnt, battery), startingCharge); netBattery.MaxSupply = 400; netBattery.SupplyRampRate = 400; netBattery.SupplyRampTolerance = 100; @@ -513,8 +513,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.SupplyRampRate = rampRate; supplier.SupplyRampTolerance = rampTol; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); netBattery.MaxSupply = draw / 2; netBattery.SupplyRampRate = rampRate; netBattery.SupplyRampTolerance = rampTol; @@ -600,7 +600,7 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 500; supplier.SupplyRampTolerance = 500; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); netBattery.MaxChargeRate = 1_000; netBattery.Efficiency = 0.5f; }); @@ -670,8 +670,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.MaxSupply = 400; netBattery.SupplyRampTolerance = 400; netBattery.SupplyRampRate = 100_000; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); }); // Run some ticks so everything is stable. @@ -750,8 +750,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.SupplyRampTolerance = 400; netBattery.SupplyRampRate = 100_000; netBattery.Efficiency = 0.5f; - batterySys.SetMaxCharge(batteryEnt, 1_000_000, battery); - batterySys.SetCharge(batteryEnt, 1_000_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 1_000_000); + batterySys.SetCharge((batteryEnt, battery), 1_000_000); }); // Run some ticks so everything is stable. @@ -841,8 +841,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 1000; supplier.SupplyRampTolerance = 1000; - batterySys.SetMaxCharge(batteryEnt1, 1_000_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 1_000_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 1_000_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 1_000_000); netBattery1.MaxChargeRate = 1_000; netBattery2.MaxChargeRate = 1_000; @@ -945,10 +945,10 @@ namespace Content.IntegrationTests.Tests.Power netBattery2.SupplyRampTolerance = 1000; netBattery1.SupplyRampRate = 100_000; netBattery2.SupplyRampRate = 100_000; - batterySys.SetMaxCharge(batteryEnt1, 100_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 100_000, battery2); - batterySys.SetCharge(batteryEnt1, 100_000, battery1); - batterySys.SetCharge(batteryEnt2, 100_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 100_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 100_000); + batterySys.SetCharge((batteryEnt1, battery1), 100_000); + batterySys.SetCharge((batteryEnt2, battery2), 100_000); }); // Run some ticks so everything is stable. @@ -1031,8 +1031,8 @@ namespace Content.IntegrationTests.Tests.Power supplier.MaxSupply = 1000; supplier.SupplyRampTolerance = 1000; - batterySys.SetMaxCharge(batteryEnt1, 1_000_000, battery1); - batterySys.SetMaxCharge(batteryEnt2, 1_000_000, battery2); + batterySys.SetMaxCharge((batteryEnt1, battery1), 1_000_000); + batterySys.SetMaxCharge((batteryEnt2, battery2), 1_000_000); netBattery1.MaxChargeRate = 20; netBattery2.MaxChargeRate = 20; @@ -1107,8 +1107,8 @@ namespace Content.IntegrationTests.Tests.Power netBattery.MaxSupply = 1000; netBattery.SupplyRampTolerance = 200; netBattery.SupplyRampRate = 10; - batterySys.SetMaxCharge(batteryEnt, 100_000, battery); - batterySys.SetCharge(batteryEnt, 100_000, battery); + batterySys.SetMaxCharge((batteryEnt, battery), 100_000); + batterySys.SetCharge((batteryEnt, battery), 100_000); }); // Run some ticks so everything is stable. @@ -1253,7 +1253,7 @@ namespace Content.IntegrationTests.Tests.Power generatorSupplier.MaxSupply = 1000; generatorSupplier.SupplyRampTolerance = 1000; - batterySys.SetCharge(apcEnt, 0, apcBattery); + batterySys.SetCharge((apcEnt, apcBattery), 0); }); server.RunTicks(5); //let run a few ticks for PowerNets to reevaluate and start charging apc @@ -1314,8 +1314,8 @@ namespace Content.IntegrationTests.Tests.Power extensionCableSystem.SetProviderTransferRange(apcExtensionEnt, range); extensionCableSystem.SetReceiverReceptionRange(powerReceiverEnt, range); - batterySys.SetMaxCharge(apcEnt, 10000, battery); //arbitrary nonzero amount of charge - batterySys.SetCharge(apcEnt, battery.MaxCharge, battery); //fill battery + batterySys.SetMaxCharge((apcEnt, battery), 10000); //arbitrary nonzero amount of charge + batterySys.SetCharge((apcEnt, battery), battery.MaxCharge); //fill battery receiver.Load = 1; //arbitrary small amount of power }); diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs index 41228b5ac8..4f96a25a5c 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.Tools.cs @@ -169,7 +169,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/fill_battery.png")), Act = () => { - _batterySystem.SetCharge(args.Target, battery.MaxCharge, battery); + _batterySystem.SetCharge((args.Target, battery), battery.MaxCharge); }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-refill-battery-description"), @@ -184,7 +184,7 @@ public sealed partial class AdminVerbSystem Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/AdminActions/drain_battery.png")), Act = () => { - _batterySystem.SetCharge(args.Target, 0, battery); + _batterySystem.SetCharge((args.Target, battery), 0); }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-drain-battery-description"), @@ -200,9 +200,8 @@ public sealed partial class AdminVerbSystem Act = () => { var recharger = EnsureComp(args.Target); - recharger.AutoRecharge = true; recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. - recharger.AutoRechargePause = false; // No delay. + recharger.AutoRechargePauseTime = TimeSpan.Zero; // No delay. }, Impact = LogImpact.Medium, Message = Loc.GetString("admin-trick-infinite-battery-object-description"), @@ -553,7 +552,7 @@ public sealed partial class AdminVerbSystem if (!HasComp(ent)) continue; var battery = EnsureComp(ent); - _batterySystem.SetCharge(ent, battery.MaxCharge, battery); + _batterySystem.SetCharge((ent, battery), battery.MaxCharge); } }, Impact = LogImpact.Extreme, @@ -574,7 +573,7 @@ public sealed partial class AdminVerbSystem if (!HasComp(ent)) continue; var battery = EnsureComp(ent); - _batterySystem.SetCharge(ent, 0, battery); + _batterySystem.SetCharge((ent, battery), 0); } }, Impact = LogImpact.Extreme, @@ -599,9 +598,8 @@ public sealed partial class AdminVerbSystem var recharger = EnsureComp(ent); var battery = EnsureComp(ent); - recharger.AutoRecharge = true; recharger.AutoRechargeRate = battery.MaxCharge; // Instant refill. - recharger.AutoRechargePause = false; // No delay. + recharger.AutoRechargePauseTime = TimeSpan.Zero; // No delay. } }, Impact = LogImpact.Extreme, diff --git a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs index 0aea245c79..eddef87853 100644 --- a/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs +++ b/Content.Server/Light/EntitySystems/EmergencyLightSystem.cs @@ -145,7 +145,7 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem { if (entity.Comp.State == EmergencyLightState.On) { - if (!_battery.TryUseCharge(entity.Owner, entity.Comp.Wattage * frameTime, battery)) + if (!_battery.TryUseCharge((entity.Owner, battery), entity.Comp.Wattage * frameTime)) { SetState(entity.Owner, entity.Comp, EmergencyLightState.Empty); TurnOff(entity); @@ -153,8 +153,8 @@ public sealed class EmergencyLightSystem : SharedEmergencyLightSystem } else { - _battery.SetCharge(entity.Owner, battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency, battery); - if (_battery.IsFull(entity, battery)) + _battery.SetCharge((entity.Owner, battery), battery.CurrentCharge + entity.Comp.ChargingWattage * frameTime * entity.Comp.ChargingEfficiency); + if (_battery.IsFull((entity.Owner, battery))) { if (TryComp(entity.Owner, out var receiver)) { diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index 2c8d18539f..7167aa4963 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -253,7 +253,7 @@ namespace Content.Server.Light.EntitySystems _appearance.SetData(uid, HandheldLightVisuals.Power, HandheldLightPowerStates.Dying, appearanceComponent); } - if (component.Activated && !_battery.TryUseCharge(batteryUid.Value, component.Wattage * frameTime, battery)) + if (component.Activated && !_battery.TryUseCharge((batteryUid.Value, battery), component.Wattage * frameTime)) TurnOff(uid, false); UpdateLevel(uid); diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index 923c701868..89297a6e86 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -340,7 +340,7 @@ public sealed partial class MechSystem : SharedMechSystem if (!TryComp(battery, out var batteryComp)) return false; - _battery.SetCharge(battery!.Value, batteryComp.CurrentCharge + delta.Float(), batteryComp); + _battery.SetCharge((battery.Value, batteryComp), batteryComp.CurrentCharge + delta.Float()); if (batteryComp.CurrentCharge != component.Energy) //if there's a discrepency, we have to resync them { Log.Debug($"Battery charge was not equal to mech charge. Battery {batteryComp.CurrentCharge}. Mech {component.Energy}"); diff --git a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs index e563386608..7b9d229d73 100644 --- a/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs +++ b/Content.Server/Ninja/Systems/BatteryDrainerSystem.cs @@ -95,17 +95,17 @@ public sealed class BatteryDrainerSystem : SharedBatteryDrainerSystem // higher tier storages can charge more var maxDrained = pnb.MaxSupply * comp.DrainTime; var input = Math.Min(Math.Min(available, required / comp.DrainEfficiency), maxDrained); - if (!_battery.TryUseCharge(target, input, targetBattery)) + if (!_battery.TryUseCharge((target, targetBattery), input)) return false; var output = input * comp.DrainEfficiency; - _battery.SetCharge(comp.BatteryUid.Value, battery.CurrentCharge + output, battery); + _battery.SetCharge((comp.BatteryUid.Value, battery), battery.CurrentCharge + output); // TODO: create effect message or something Spawn("EffectSparks", Transform(target).Coordinates); _audio.PlayPvs(comp.SparkSound, target); _popup.PopupEntity(Loc.GetString("battery-drainer-success", ("battery", target)), uid, uid); // repeat the doafter until battery is full - return !_battery.IsFull(comp.BatteryUid.Value, battery); + return !_battery.IsFull((comp.BatteryUid.Value, battery)); } } diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index ff88926723..fd7f908738 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -106,7 +106,7 @@ public sealed class SpaceNinjaSystem : SharedSpaceNinjaSystem /// public override bool TryUseCharge(EntityUid user, float charge) { - return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge(uid.Value, charge, battery); + return GetNinjaBattery(user, out var uid, out var battery) && _battery.TryUseCharge((uid.Value, battery), charge); } /// diff --git a/Content.Server/Power/Components/BatterySelfRechargerComponent.cs b/Content.Server/Power/Components/BatterySelfRechargerComponent.cs deleted file mode 100644 index 1cb92d9cd6..0000000000 --- a/Content.Server/Power/Components/BatterySelfRechargerComponent.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace Content.Server.Power.Components -{ - /// - /// Self-recharging battery. - /// - [RegisterComponent] - public sealed partial class BatterySelfRechargerComponent : Component - { - /// - /// Does the entity auto recharge? - /// - [DataField] public bool AutoRecharge; - - /// - /// At what rate does the entity automatically recharge? - /// - [DataField] public float AutoRechargeRate; - - /// - /// Should this entity stop automatically recharging if a charge is used? - /// - [DataField] public bool AutoRechargePause = false; - - /// - /// How long should the entity stop automatically recharging if a charge is used? - /// - [DataField] public float AutoRechargePauseTime = 0f; - - /// - /// Do not auto recharge if this timestamp has yet to happen, set for the auto recharge pause system. - /// - [DataField] public TimeSpan NextAutoRecharge = TimeSpan.FromSeconds(0f); - } -} diff --git a/Content.Server/Power/EntitySystems/BatterySystem.API.cs b/Content.Server/Power/EntitySystems/BatterySystem.API.cs new file mode 100644 index 0000000000..6ddf1f4bbc --- /dev/null +++ b/Content.Server/Power/EntitySystems/BatterySystem.API.cs @@ -0,0 +1,104 @@ +using Content.Shared.Power; +using Content.Shared.Power.Components; + +namespace Content.Server.Power.EntitySystems; + +public sealed partial class BatterySystem +{ + public override float ChangeCharge(Entity ent, float amount) + { + if (!Resolve(ent, ref ent.Comp)) + return 0; + + var newValue = Math.Clamp(ent.Comp.CurrentCharge + amount, 0, ent.Comp.MaxCharge); + var delta = newValue - ent.Comp.CurrentCharge; + ent.Comp.CurrentCharge = newValue; + + TrySetChargeCooldown(ent.Owner); + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + return delta; + } + + public override float UseCharge(Entity ent, float amount) + { + if (amount <= 0 || !Resolve(ent, ref ent.Comp) || ent.Comp.CurrentCharge == 0) + return 0; + + return ChangeCharge(ent, -amount); + } + + public override bool TryUseCharge(Entity ent, float amount) + { + if (!Resolve(ent, ref ent.Comp, false) || amount > ent.Comp.CurrentCharge) + return false; + + UseCharge(ent, amount); + return true; + } + + public override void SetCharge(Entity ent, float value) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + var oldCharge = ent.Comp.CurrentCharge; + ent.Comp.CurrentCharge = MathHelper.Clamp(value, 0, ent.Comp.MaxCharge); + if (MathHelper.CloseTo(ent.Comp.CurrentCharge, oldCharge) && + !(oldCharge != ent.Comp.CurrentCharge && ent.Comp.CurrentCharge == ent.Comp.MaxCharge)) + { + return; + } + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + } + public override void SetMaxCharge(Entity ent, float value) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + var old = ent.Comp.MaxCharge; + ent.Comp.MaxCharge = Math.Max(value, 0); + ent.Comp.CurrentCharge = Math.Min(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + if (MathHelper.CloseTo(ent.Comp.MaxCharge, old)) + return; + + var ev = new ChargeChangedEvent(ent.Comp.CurrentCharge, ent.Comp.MaxCharge); + RaiseLocalEvent(ent, ref ev); + } + + public override void TrySetChargeCooldown(Entity ent) + { + if (!Resolve(ent, ref ent.Comp, false)) + return; + + if (ent.Comp.AutoRechargePauseTime == TimeSpan.Zero) + return; // no recharge pause + + if (_timing.CurTime + ent.Comp.AutoRechargePauseTime <= ent.Comp.NextAutoRecharge) + return; // the current pause is already longer + + SetChargeCooldown(ent, ent.Comp.AutoRechargePauseTime); + } + + public override void SetChargeCooldown(Entity ent, TimeSpan cooldown) + { + if (!Resolve(ent, ref ent.Comp)) + return; + + ent.Comp.NextAutoRecharge = _timing.CurTime + cooldown; + } + + /// + /// Returns whether the battery is full. + /// + public bool IsFull(Entity ent) + { + if (!Resolve(ent, ref ent.Comp)) + return false; + + return ent.Comp.CurrentCharge >= ent.Comp.MaxCharge; + } +} diff --git a/Content.Server/Power/EntitySystems/BatterySystem.cs b/Content.Server/Power/EntitySystems/BatterySystem.cs index c49a2f0f6b..4b6a52c0f1 100644 --- a/Content.Server/Power/EntitySystems/BatterySystem.cs +++ b/Content.Server/Power/EntitySystems/BatterySystem.cs @@ -9,232 +9,115 @@ using JetBrains.Annotations; using Robust.Shared.Utility; using Robust.Shared.Timing; -namespace Content.Server.Power.EntitySystems +namespace Content.Server.Power.EntitySystems; + +[UsedImplicitly] +public sealed partial class BatterySystem : SharedBatterySystem { - [UsedImplicitly] - public sealed class BatterySystem : SharedBatterySystem + [Dependency] private readonly IGameTiming _timing = default!; + + public override void Initialize() { - [Dependency] private readonly IGameTiming _timing = default!; + base.Initialize(); - public override void Initialize() + SubscribeLocalEvent(OnExamine); + SubscribeLocalEvent(OnBatteryRejuvenate); + SubscribeLocalEvent(OnNetBatteryRejuvenate); + SubscribeLocalEvent(CalculateBatteryPrice); + SubscribeLocalEvent(OnChangeCharge); + SubscribeLocalEvent(OnGetCharge); + + SubscribeLocalEvent(PreSync); + SubscribeLocalEvent(PostSync); + } + + private void OnNetBatteryRejuvenate(Entity ent, ref RejuvenateEvent args) + { + ent.Comp.NetworkBattery.CurrentStorage = ent.Comp.NetworkBattery.Capacity; + } + + private void OnBatteryRejuvenate(Entity ent, ref RejuvenateEvent args) + { + SetCharge(ent.AsNullable(), ent.Comp.MaxCharge); + } + + private void OnExamine(Entity ent, ref ExaminedEvent args) + { + if (!args.IsInDetailsRange) + return; + + if (!TryComp(ent, out var battery)) + return; + + var chargePercentRounded = 0; + if (battery.MaxCharge != 0) + chargePercentRounded = (int)(100 * battery.CurrentCharge / battery.MaxCharge); + args.PushMarkup( + Loc.GetString( + "examinable-battery-component-examine-detail", + ("percent", chargePercentRounded), + ("markupPercentColor", "green") + ) + ); + } + + private void PreSync(NetworkBatteryPreSync ev) + { + // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var netBat, out var bat)) { - base.Initialize(); - - SubscribeLocalEvent(OnExamine); - SubscribeLocalEvent(OnNetBatteryRejuvenate); - SubscribeLocalEvent(OnBatteryRejuvenate); - SubscribeLocalEvent(CalculateBatteryPrice); - SubscribeLocalEvent(OnChangeCharge); - SubscribeLocalEvent(OnGetCharge); - - SubscribeLocalEvent(PreSync); - SubscribeLocalEvent(PostSync); + DebugTools.Assert(bat.CurrentCharge <= bat.MaxCharge && bat.CurrentCharge >= 0); + netBat.NetworkBattery.Capacity = bat.MaxCharge; + netBat.NetworkBattery.CurrentStorage = bat.CurrentCharge; } + } - private void OnNetBatteryRejuvenate(EntityUid uid, PowerNetworkBatteryComponent component, RejuvenateEvent args) + private void PostSync(NetworkBatteryPostSync ev) + { + // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. + var enumerator = AllEntityQuery(); + while (enumerator.MoveNext(out var uid, out var netBat, out var bat)) { - component.NetworkBattery.CurrentStorage = component.NetworkBattery.Capacity; + SetCharge((uid, bat), netBat.NetworkBattery.CurrentStorage); } + } - private void OnBatteryRejuvenate(EntityUid uid, BatteryComponent component, RejuvenateEvent args) + /// + /// Gets the price for the power contained in an entity's battery. + /// + private void CalculateBatteryPrice(Entity ent, ref PriceCalculationEvent args) + { + args.Price += ent.Comp.CurrentCharge * ent.Comp.PricePerJoule; + } + + private void OnChangeCharge(Entity ent, ref ChangeChargeEvent args) + { + if (args.ResidualValue == 0) + return; + + args.ResidualValue -= ChangeCharge(ent.AsNullable(), args.ResidualValue); + } + + private void OnGetCharge(Entity entity, ref GetChargeEvent args) + { + args.CurrentCharge += entity.Comp.CurrentCharge; + args.MaxCharge += entity.Comp.MaxCharge; + } + + public override void Update(float frameTime) + { + var query = EntityQueryEnumerator(); + var curTime = _timing.CurTime; + while (query.MoveNext(out var uid, out var comp, out var bat)) { - SetCharge(uid, component.MaxCharge, component); - } + if (!comp.AutoRecharge || IsFull((uid, bat))) + continue; - private void OnExamine(EntityUid uid, ExaminableBatteryComponent component, ExaminedEvent args) - { - if (!TryComp(uid, out var batteryComponent)) - return; - if (args.IsInDetailsRange) - { - var effectiveMax = batteryComponent.MaxCharge; - if (effectiveMax == 0) - effectiveMax = 1; - var chargeFraction = batteryComponent.CurrentCharge / effectiveMax; - var chargePercentRounded = (int)(chargeFraction * 100); - args.PushMarkup( - Loc.GetString( - "examinable-battery-component-examine-detail", - ("percent", chargePercentRounded), - ("markupPercentColor", "green") - ) - ); - } - } + if (comp.NextAutoRecharge > curTime) + continue; - private void PreSync(NetworkBatteryPreSync ev) - { - // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. - var enumerator = AllEntityQuery(); - while (enumerator.MoveNext(out var netBat, out var bat)) - { - DebugTools.Assert(bat.CurrentCharge <= bat.MaxCharge && bat.CurrentCharge >= 0); - netBat.NetworkBattery.Capacity = bat.MaxCharge; - netBat.NetworkBattery.CurrentStorage = bat.CurrentCharge; - } - } - - private void PostSync(NetworkBatteryPostSync ev) - { - // Ignoring entity pausing. If the entity was paused, neither component's data should have been changed. - var enumerator = AllEntityQuery(); - while (enumerator.MoveNext(out var uid, out var netBat, out var bat)) - { - SetCharge(uid, netBat.NetworkBattery.CurrentStorage, bat); - } - } - - public override void Update(float frameTime) - { - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var comp, out var batt)) - { - if (!comp.AutoRecharge || IsFull(uid, batt)) - continue; - - if (comp.AutoRechargePause) - { - if (comp.NextAutoRecharge > _timing.CurTime) - continue; - } - - SetCharge(uid, batt.CurrentCharge + comp.AutoRechargeRate * frameTime, batt); - } - } - - /// - /// Gets the price for the power contained in an entity's battery. - /// - private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, ref PriceCalculationEvent args) - { - args.Price += component.CurrentCharge * component.PricePerJoule; - } - private void OnChangeCharge(Entity entity, ref ChangeChargeEvent args) - { - if (args.ResidualValue == 0) - return; - - args.ResidualValue -= ChangeCharge(entity, args.ResidualValue); - } - - private void OnGetCharge(Entity entity, ref GetChargeEvent args) - { - args.CurrentCharge += entity.Comp.CurrentCharge; - args.MaxCharge += entity.Comp.MaxCharge; - } - - public override float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (value <= 0 || !Resolve(uid, ref battery) || battery.CurrentCharge == 0) - return 0; - - return ChangeCharge(uid, -value, battery); - } - - public override void SetMaxCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return; - - var old = battery.MaxCharge; - battery.MaxCharge = Math.Max(value, 0); - battery.CurrentCharge = Math.Min(battery.CurrentCharge, battery.MaxCharge); - if (MathHelper.CloseTo(battery.MaxCharge, old)) - return; - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - } - - public void SetCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return; - - var old = battery.CurrentCharge; - battery.CurrentCharge = MathHelper.Clamp(value, 0, battery.MaxCharge); - if (MathHelper.CloseTo(battery.CurrentCharge, old) && - !(old != battery.CurrentCharge && battery.CurrentCharge == battery.MaxCharge)) - { - return; - } - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - } - - /// - /// Changes the current battery charge by some value - /// - public override float ChangeCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return 0; - - var newValue = Math.Clamp(battery.CurrentCharge + value, 0, battery.MaxCharge); - var delta = newValue - battery.CurrentCharge; - battery.CurrentCharge = newValue; - - TrySetChargeCooldown(uid); - - var ev = new ChargeChangedEvent(battery.CurrentCharge, battery.MaxCharge); - RaiseLocalEvent(uid, ref ev); - return delta; - } - - public override void TrySetChargeCooldown(EntityUid uid, float value = -1) - { - if (!TryComp(uid, out var batteryself)) - return; - - if (!batteryself.AutoRechargePause) - return; - - // If no answer or a negative is given for value, use the default from AutoRechargePauseTime. - if (value < 0) - value = batteryself.AutoRechargePauseTime; - - if (_timing.CurTime + TimeSpan.FromSeconds(value) <= batteryself.NextAutoRecharge) - return; - - SetChargeCooldown(uid, batteryself.AutoRechargePauseTime, batteryself); - } - - /// - /// Puts the entity's self recharge on cooldown for the specified time. - /// - public void SetChargeCooldown(EntityUid uid, float value, BatterySelfRechargerComponent? batteryself = null) - { - if (!Resolve(uid, ref batteryself)) - return; - - if (value >= 0) - batteryself.NextAutoRecharge = _timing.CurTime + TimeSpan.FromSeconds(value); - else - batteryself.NextAutoRecharge = _timing.CurTime; - } - - /// - /// If sufficient charge is available on the battery, use it. Otherwise, don't. - /// - public override bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery, false) || value > battery.CurrentCharge) - return false; - - UseCharge(uid, value, battery); - return true; - } - - /// - /// Returns whether the battery is full. - /// - public bool IsFull(EntityUid uid, BatteryComponent? battery = null) - { - if (!Resolve(uid, ref battery)) - return false; - - return battery.CurrentCharge >= battery.MaxCharge; + SetCharge((uid, bat), bat.CurrentCharge + comp.AutoRechargeRate * frameTime); } } } diff --git a/Content.Server/Power/EntitySystems/ChargerSystem.cs b/Content.Server/Power/EntitySystems/ChargerSystem.cs index e8dc9e9962..d523de65db 100644 --- a/Content.Server/Power/EntitySystems/ChargerSystem.cs +++ b/Content.Server/Power/EntitySystems/ChargerSystem.cs @@ -221,7 +221,7 @@ public sealed class ChargerSystem : SharedChargerSystem if (!SearchForBattery(container.ContainedEntities[0], out var heldEnt, out var heldBattery)) return CellChargerStatus.Off; - if (_battery.IsFull(heldEnt.Value, heldBattery)) + if (_battery.IsFull((heldEnt.Value, heldBattery))) return CellChargerStatus.Charged; return CellChargerStatus.Charging; @@ -241,7 +241,7 @@ public sealed class ChargerSystem : SharedChargerSystem if (!SearchForBattery(targetEntity, out var batteryUid, out var heldBattery)) return; - _battery.SetCharge(batteryUid.Value, heldBattery.CurrentCharge + component.ChargeRate * frameTime, heldBattery); + _battery.SetCharge((batteryUid.Value, heldBattery), heldBattery.CurrentCharge + component.ChargeRate * frameTime); UpdateStatus(uid, component); } diff --git a/Content.Server/Power/EntitySystems/PowerNetSystem.cs b/Content.Server/Power/EntitySystems/PowerNetSystem.cs index 6a69550fcf..5b6b922ddf 100644 --- a/Content.Server/Power/EntitySystems/PowerNetSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerNetSystem.cs @@ -358,13 +358,13 @@ namespace Content.Server.Power.EntitySystems if (requireBattery) { - _battery.SetCharge(uid, battery.CurrentCharge - apcBattery.IdleLoad * frameTime, battery); + _battery.SetCharge((uid, battery), battery.CurrentCharge - apcBattery.IdleLoad * frameTime); } // Otherwise try to charge the battery - else if (powered && !_battery.IsFull(uid, battery)) + else if (powered && !_battery.IsFull((uid, battery))) { apcReceiver.Load += apcBattery.BatteryRechargeRate * apcBattery.BatteryRechargeEfficiency; - _battery.SetCharge(uid, battery.CurrentCharge + apcBattery.BatteryRechargeRate * frameTime, battery); + _battery.SetCharge((uid, battery), battery.CurrentCharge + apcBattery.BatteryRechargeRate * frameTime); } // Enable / disable the battery if the state changed diff --git a/Content.Server/Power/SetBatteryPercentCommand.cs b/Content.Server/Power/SetBatteryPercentCommand.cs index 03d6d30f8a..a6123382fd 100644 --- a/Content.Server/Power/SetBatteryPercentCommand.cs +++ b/Content.Server/Power/SetBatteryPercentCommand.cs @@ -40,7 +40,7 @@ namespace Content.Server.Power shell.WriteLine(Loc.GetString($"cmd-setbatterypercent-battery-not-found", ("id", id))); return; } - _batterySystem.SetCharge(id.Value, battery.MaxCharge * percent / 100, battery); + _batterySystem.SetCharge((id.Value, battery), battery.MaxCharge * percent / 100); // Don't acknowledge b/c people WILL forall this } } diff --git a/Content.Server/PowerCell/PowerCellSystem.Draw.cs b/Content.Server/PowerCell/PowerCellSystem.Draw.cs index 40e54ba13a..d0dafb1ef6 100644 --- a/Content.Server/PowerCell/PowerCellSystem.Draw.cs +++ b/Content.Server/PowerCell/PowerCellSystem.Draw.cs @@ -28,7 +28,7 @@ public sealed partial class PowerCellSystem if (!TryGetBatteryFromSlot(uid, out var batteryEnt, out var battery, slot)) continue; - if (_battery.TryUseCharge(batteryEnt.Value, comp.DrawRate * (float)comp.Delay.TotalSeconds, battery)) + if (_battery.TryUseCharge((batteryEnt.Value, battery), comp.DrawRate * (float)comp.Delay.TotalSeconds)) continue; var ev = new PowerCellSlotEmptyEvent(); diff --git a/Content.Server/PowerCell/PowerCellSystem.cs b/Content.Server/PowerCell/PowerCellSystem.cs index 6c00cdd300..f358e1bc34 100644 --- a/Content.Server/PowerCell/PowerCellSystem.cs +++ b/Content.Server/PowerCell/PowerCellSystem.cs @@ -174,7 +174,7 @@ public sealed partial class PowerCellSystem : SharedPowerCellSystem return false; } - if (!_battery.TryUseCharge(batteryEnt.Value, charge, battery)) + if (!_battery.TryUseCharge((batteryEnt.Value, battery), charge)) { if (user != null) _popup.PopupEntity(Loc.GetString("power-cell-insufficient"), uid, user.Value); diff --git a/Content.Server/PowerSink/PowerSinkSystem.cs b/Content.Server/PowerSink/PowerSinkSystem.cs index d1071d3e38..328bff89f4 100644 --- a/Content.Server/PowerSink/PowerSinkSystem.cs +++ b/Content.Server/PowerSink/PowerSinkSystem.cs @@ -66,7 +66,7 @@ namespace Content.Server.PowerSink if (!transform.Anchored) continue; - _battery.ChangeCharge(entity, networkLoad.NetworkLoad.ReceivingPower * frameTime, battery); + _battery.ChangeCharge((entity, battery), networkLoad.NetworkLoad.ReceivingPower * frameTime); var currentBatteryThreshold = battery.CurrentCharge / battery.MaxCharge; diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index 02c9c64c6e..3ec2e9c38c 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -34,7 +34,7 @@ public sealed class JammerSystem : SharedJammerSystem if (_powerCell.TryGetBatteryFromSlot(uid, out var batteryUid, out var battery)) { - if (!_battery.TryUseCharge(batteryUid.Value, GetCurrentWattage((uid, jam)) * frameTime, battery)) + if (!_battery.TryUseCharge((batteryUid.Value, battery), GetCurrentWattage((uid, jam)) * frameTime)) { ChangeLEDState(uid, false); RemComp(uid); diff --git a/Content.Server/Silicons/StationAi/StationAiSystem.cs b/Content.Server/Silicons/StationAi/StationAiSystem.cs index a9198d5816..0045b921e5 100644 --- a/Content.Server/Silicons/StationAi/StationAiSystem.cs +++ b/Content.Server/Silicons/StationAi/StationAiSystem.cs @@ -125,7 +125,7 @@ public sealed class StationAiSystem : SharedStationAiSystem // into an AI core that has a full battery and full integrity. if (TryComp(ent, out var battery)) { - _battery.SetCharge(ent, battery.MaxCharge); + _battery.SetCharge((ent, battery), battery.MaxCharge); } _damageable.ClearAllDamage(ent.Owner); diff --git a/Content.Server/Stunnable/Systems/StunbatonSystem.cs b/Content.Server/Stunnable/Systems/StunbatonSystem.cs index 7f8aa37036..a22a4c09fa 100644 --- a/Content.Server/Stunnable/Systems/StunbatonSystem.cs +++ b/Content.Server/Stunnable/Systems/StunbatonSystem.cs @@ -33,7 +33,7 @@ namespace Content.Server.Stunnable.Systems private void OnStaminaHitAttempt(Entity entity, ref StaminaDamageOnHitAttemptEvent args) { if (!_itemToggle.IsActivated(entity.Owner) || - !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge(entity.Owner, entity.Comp.EnergyPerUse, battery)) + !TryComp(entity.Owner, out var battery) || !_battery.TryUseCharge((entity.Owner, battery), entity.Comp.EnergyPerUse)) { args.Cancelled = true; } diff --git a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs index f3cae90b40..988ade86ce 100644 --- a/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs +++ b/Content.Server/Tesla/EntitySystem/TeslaCoilSystem.cs @@ -24,7 +24,7 @@ public sealed class TeslaCoilSystem : EntitySystem { if (TryComp(coil, out var batteryComponent)) { - _battery.SetCharge(coil, batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning); + _battery.SetCharge((coil, batteryComponent), batteryComponent.CurrentCharge + coil.Comp.ChargeFromLightning); } } } diff --git a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs index 700a15e1b0..c1e442c24b 100644 --- a/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs +++ b/Content.Server/Weapons/Ranged/Systems/GunSystem.Battery.cs @@ -68,6 +68,7 @@ public sealed partial class GunSystem protected override void TakeCharge(Entity entity) { + // Take charge from either the BatteryComponent or PowerCellSlotComponent. var ev = new ChangeChargeEvent(-entity.Comp.FireCost); RaiseLocalEvent(entity, ref ev); } diff --git a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs index 85ffc75627..21952912d7 100644 --- a/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs +++ b/Content.Server/Xenoarchaeology/Artifact/XAE/XAEChargeBatterySystem.cs @@ -25,7 +25,7 @@ public sealed class XAEChargeBatterySystem : BaseXAESystem @@ -7,27 +10,36 @@ namespace Content.Shared.Power; public readonly record struct ChargeChangedEvent(float Charge, float MaxCharge); /// +/// Event that supports multiple battery types. /// Raised when it is necessary to get information about battery charges. +/// Works with either or . +/// If there are multiple batteries then the results will be summed up. /// [ByRefEvent] -public sealed class GetChargeEvent : EntityEventArgs +public record struct GetChargeEvent { public float CurrentCharge; public float MaxCharge; } /// -/// Raised when it is necessary to change the current battery charge to a some value. +/// Method event that supports multiple battery types. +/// Raised when it is necessary to change the current battery charge by some value. +/// Works with either or . +/// If there are multiple batteries then they will be changed in order of subscription until the total value was reached. /// [ByRefEvent] -public sealed class ChangeChargeEvent : EntityEventArgs +public record struct ChangeChargeEvent(float Amount) { - public float OriginalValue; - public float ResidualValue; + /// + /// The total amount of charge to change the battery's storage by (in joule). + /// A positive value adds charge, a negative value removes charge. + /// + public readonly float Amount = Amount; - public ChangeChargeEvent(float value) - { - OriginalValue = value; - ResidualValue = value; - } + /// + /// The amount of charge that still has to be removed. + /// For cases where there are multiple batteries. + /// + public float ResidualValue = Amount; } diff --git a/Content.Shared/Power/Components/BatteryComponent.cs b/Content.Shared/Power/Components/BatteryComponent.cs index 6a2d2a5051..6a65405115 100644 --- a/Content.Shared/Power/Components/BatteryComponent.cs +++ b/Content.Shared/Power/Components/BatteryComponent.cs @@ -11,10 +11,8 @@ namespace Content.Shared.Power.Components; [Access(typeof(SharedBatterySystem))] public partial class BatteryComponent : Component { - public string SolutionName = "battery"; - /// - /// Maximum charge of the battery in joules (ie. watt seconds) + /// Maximum charge of the battery in joules (i.e. watt seconds) /// [DataField] [GuidebookData] @@ -23,11 +21,11 @@ public partial class BatteryComponent : Component /// /// Current charge of the battery in joules (ie. watt seconds) /// - [DataField("startingCharge")] + [DataField("startingCharge")] // TODO: rename this datafield to currentCharge public float CurrentCharge; /// - /// The price per one joule. Default is 1 credit for 10kJ. + /// The price per one joule. Default is 1 speso for 10kJ. /// [DataField] public float PricePerJoule = 0.0001f; diff --git a/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs b/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs new file mode 100644 index 0000000000..3881980382 --- /dev/null +++ b/Content.Shared/Power/Components/BatterySelfRechargerComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Shared.Power.Components; + +/// +/// Self-recharging battery. +/// To be used in combination with . +/// +[RegisterComponent, AutoGenerateComponentPause] +public sealed partial class BatterySelfRechargerComponent : Component +{ + /// + /// Is the component currently enabled? + /// + [DataField] + public bool AutoRecharge = true; + + /// + /// At what rate does the entity automatically recharge? + /// + [DataField] + public float AutoRechargeRate; + + /// + /// How long should the entity stop automatically recharging if charge is used? + /// + [DataField] + public TimeSpan AutoRechargePauseTime = TimeSpan.FromSeconds(0); + + /// + /// Do not auto recharge if this timestamp has yet to happen, set for the auto recharge pause system. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField] + public TimeSpan NextAutoRecharge = TimeSpan.FromSeconds(0); +} diff --git a/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs b/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs index a9d5db3f33..d067a685d4 100644 --- a/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs +++ b/Content.Shared/Power/EntitySystems/SharedBatterySystem.cs @@ -12,33 +12,61 @@ public abstract class SharedBatterySystem : EntitySystem SubscribeLocalEvent(OnEmpPulse); } - private void OnEmpPulse(Entity entity, ref EmpPulseEvent args) + private void OnEmpPulse(Entity ent, ref EmpPulseEvent args) { args.Affected = true; - UseCharge(entity, args.EnergyConsumption, entity.Comp); + UseCharge(ent.AsNullable(), args.EnergyConsumption); // Apply a cooldown to the entity's self recharge if needed to avoid it immediately self recharging after an EMP. - TrySetChargeCooldown(entity); + TrySetChargeCooldown(ent.Owner); } - public virtual float UseCharge(EntityUid uid, float value, BatteryComponent? battery = null) - { - return 0f; - } - - public virtual void SetMaxCharge(EntityUid uid, float value, BatteryComponent? battery = null) { } - - public virtual float ChangeCharge(EntityUid uid, float value, BatteryComponent? battery = null) + /// + /// Changes the battery's charge by the given amount. + /// A positive value will add charge, a negative value will remove charge. + /// + /// The actually changed amount. + public virtual float ChangeCharge(Entity ent, float amount) { return 0f; } /// - /// Checks if the entity has a self recharge and puts it on cooldown if applicable. + /// Removes the given amount of charge from the battery. /// - public virtual void TrySetChargeCooldown(EntityUid uid, float value = -1) { } + /// The actually changed amount. + public virtual float UseCharge(Entity ent, float amount) + { + return 0f; + } - public virtual bool TryUseCharge(EntityUid uid, float value, BatteryComponent? battery = null) + /// + /// If sufficient charge is available on the battery, use it. Otherwise, don't. + /// Always returns false on the client. + /// + /// If the full amount was able to be removed. + public virtual bool TryUseCharge(Entity ent, float amount) { return false; } + + /// + /// Sets the battery's charge. + /// + public virtual void SetCharge(Entity ent, float value) { } + + /// + /// Sets the battery's maximum charge. + /// + public virtual void SetMaxCharge(Entity ent, float value) { } + + /// + /// Checks if the entity has a self recharge and puts it on cooldown if applicable. + /// Uses the cooldown time given in the component. + /// + public virtual void TrySetChargeCooldown(Entity ent) { } + + /// + /// Puts the entity's self recharge on cooldown for the specified time. + /// + public virtual void SetChargeCooldown(Entity ent, TimeSpan cooldown) { } } diff --git a/Resources/Maps/Lavaland/grasslanddome.yml b/Resources/Maps/Lavaland/grasslanddome.yml index 800176593e..9d92c7b108 100644 --- a/Resources/Maps/Lavaland/grasslanddome.yml +++ b/Resources/Maps/Lavaland/grasslanddome.yml @@ -494,7 +494,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - proto: BasaltOne entities: - uid: 353 diff --git a/Resources/Maps/Lavaland/snowydome.yml b/Resources/Maps/Lavaland/snowydome.yml index d9c12c724b..6c2f55049d 100644 --- a/Resources/Maps/Lavaland/snowydome.yml +++ b/Resources/Maps/Lavaland/snowydome.yml @@ -363,7 +363,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - proto: AtmosFixFreezerMarker entities: - uid: 348 diff --git a/Resources/Maps/Misc/terminal.yml b/Resources/Maps/Misc/terminal.yml index 68897953f7..bb0491e9ce 100644 --- a/Resources/Maps/Misc/terminal.yml +++ b/Resources/Maps/Misc/terminal.yml @@ -1381,7 +1381,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1398,7 +1397,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1415,7 +1413,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1432,7 +1429,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1450,7 +1446,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: @@ -1467,7 +1462,6 @@ entities: - type: Godmode - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Fixtures fixtures: {} missingComponents: diff --git a/Resources/Maps/Nonstations/wizardsden.yml b/Resources/Maps/Nonstations/wizardsden.yml index b08dac6b68..7846b2596b 100644 --- a/Resources/Maps/Nonstations/wizardsden.yml +++ b/Resources/Maps/Nonstations/wizardsden.yml @@ -504,7 +504,6 @@ entities: parent: 1 - type: BatterySelfRecharger autoRechargeRate: 200000 - autoRecharge: True - proto: BarberScissors entities: - uid: 649 diff --git a/Resources/Maps/Ruins/ruined_prison_ship.yml b/Resources/Maps/Ruins/ruined_prison_ship.yml index d953e10700..89ae5e5171 100644 --- a/Resources/Maps/Ruins/ruined_prison_ship.yml +++ b/Resources/Maps/Ruins/ruined_prison_ship.yml @@ -584,7 +584,6 @@ entities: parent: 2 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - uid: 362 components: - type: Transform diff --git a/Resources/Maps/Shuttles/arrivals.yml b/Resources/Maps/Shuttles/arrivals.yml index 3c853ef739..f419f26a1f 100644 --- a/Resources/Maps/Shuttles/arrivals.yml +++ b/Resources/Maps/Shuttles/arrivals.yml @@ -297,7 +297,6 @@ entities: parent: 292 - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: Godmode missingComponents: - Construction diff --git a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml index 53772f6215..3b85ce94c9 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/base_clothinghead.yml @@ -247,7 +247,6 @@ maxCharge: 600 #lights drain 3/s but recharge of 2 makes this 1/s. Therefore 600 is 10 minutes of light. startingCharge: 600 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 2 #recharge of 2 makes total drain 1w / s so max charge is 1:1 with time. Time to fully charge should be 5 minutes. Having recharge gives light an extended flicker period which gives you some warning to return to light area. - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml index 5cc78d90b0..341404af2b 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/armor.yml @@ -300,7 +300,6 @@ maxCharge: 600 startingCharge: 600 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 2 - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index 8229b103e7..65cc71aaa8 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -26,7 +26,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: Gun fireRate: 0.75 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml index 7d6c28fc95..b4add804ae 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml @@ -54,7 +54,6 @@ proto: WatcherBolt fireCost: 50 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Battery maxCharge: 1000 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml index 4717e200dd..1531e348f7 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/living_light.yml @@ -175,7 +175,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Gun fireRate: 0.3 diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index 64fa4e2292..173c5ad165 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -51,7 +51,6 @@ proto: RedLightLaser fireCost: 50 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 50 - type: Battery maxCharge: 1000 diff --git a/Resources/Prototypes/Entities/Objects/Power/powercells.yml b/Resources/Prototypes/Entities/Objects/Power/powercells.yml index e4651a5875..4ce96419bf 100644 --- a/Resources/Prototypes/Entities/Objects/Power/powercells.yml +++ b/Resources/Prototypes/Entities/Objects/Power/powercells.yml @@ -98,9 +98,7 @@ description: A self rechargeable power cell, designed for fast recharge rate at the expense of capacity. components: - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 36 # 10 seconds to recharge - autoRechargePause: true autoRechargePauseTime: 30 - type: entity @@ -226,7 +224,6 @@ maxCharge: 720 startingCharge: 720 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 12 # takes 1 minute to charge itself back to full - type: entity @@ -262,7 +259,6 @@ maxCharge: 1200 startingCharge: 1200 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 # Power cage (big heavy power cell for big devices) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml index 8e2650b5fe..10181b54e7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Battery/battery_guns.yml @@ -664,7 +664,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: MagazineVisuals magState: mag @@ -712,7 +711,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 30 - type: MagazineVisuals magState: mag @@ -808,7 +806,6 @@ proto: RedMediumLaser fireCost: 100 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 40 - type: StaticPrice price: 750 @@ -901,9 +898,7 @@ fireCost: 62.5 pacifismAllowedMode: true - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 48 - autoRechargePause: true autoRechargePauseTime: 10 - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 80d71669a7..be57d5f0f9 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -124,6 +124,5 @@ maxCharge: 10000 startingCharge: 10000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index ec3fa31297..ca40d1940d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -135,7 +135,6 @@ maxCharge: 1000 startingCharge: 1000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 2ecaaec89e..15ddb7b38e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -160,7 +160,6 @@ maxCharge: 3000 startingCharge: 3000 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 25 - type: AmmoCounter diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml index ec7e4b3e7f..6b8c4eebe1 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/pneumatic_cannon.yml @@ -132,7 +132,6 @@ maxCharge: 90 startingCharge: 90 - type: BatterySelfRecharger - autoRecharge: true autoRechargeRate: 1 - type: AmmoCounter - type: Item diff --git a/Resources/Prototypes/Entities/Structures/Power/debug_power.yml b/Resources/Prototypes/Entities/Structures/Power/debug_power.yml index a2e1c585fb..a9c3671c33 100644 --- a/Resources/Prototypes/Entities/Structures/Power/debug_power.yml +++ b/Resources/Prototypes/Entities/Structures/Power/debug_power.yml @@ -124,7 +124,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseSubstation @@ -138,7 +137,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseSubstationWall @@ -152,7 +150,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity parent: BaseAPC @@ -166,7 +163,6 @@ components: - type: BatterySelfRecharger autoRechargeRate: 50000 - autoRecharge: True - type: entity id: DebugPowerReceiver From 500b25a970753b334997aef5cd6a9701c74c90d9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 9 Nov 2025 02:16:17 +0100 Subject: [PATCH 013/100] Update Credits (#41359) 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 1fd1cf2ef9..cc80b51d26 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0leshe, 0tito, 0x6273, 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, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, 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, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, 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, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, 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, 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, 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, eugene, 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, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, 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, 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, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, 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, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, LetterN, lettern, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, 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, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, PGrayCS, pgraycs, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, 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, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, 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, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, 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, 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, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, 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, TheFlyingSentry, 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, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, 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, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0leshe, 0tito, 0x6273, 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, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, 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, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, 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, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, 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, 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, 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, eugene, 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, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, 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, 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, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, 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, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, 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, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, 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, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, 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, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, 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, 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, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, 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, TheFlyingSentry, 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, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, 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, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From 065514729e5352f2faa69a0bab29d3014b871e9e Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 8 Nov 2025 17:35:34 -0800 Subject: [PATCH 014/100] Fix Paradox Clone Forensics (#41358) i forgor to push Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Resources/Prototypes/Entities/Mobs/Player/clone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Resources/Prototypes/Entities/Mobs/Player/clone.yml b/Resources/Prototypes/Entities/Mobs/Player/clone.yml index ca100ea110..c8ab57df58 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/clone.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/clone.yml @@ -100,6 +100,8 @@ - type: cloningSettings id: ParadoxCloningSettings parent: [BaseClone, Antag] + components: + - Forensics # This is so hugging data is copied to the clone, so you can't hug metagame them # changeling identity copying - type: cloningSettings From 4ca3b905c758392c25e8d08e67a743ed0c93a6b1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 01:47:29 +0000 Subject: [PATCH 015/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 2664164bf6..53810c4917 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: kosticia - changes: - - message: Reflection chances are examinable now. - type: Add - id: 8690 - time: '2025-06-18T00:50:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38199 - author: Kittygyat changes: - message: Fixed vapes dealing unintended damage types to you when used. @@ -3924,3 +3917,10 @@ id: 9191 time: '2025-11-08T20:40:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/37468 +- author: Princess-Cheeseballs + changes: + - message: Paradox clones now copy forensics from the original + type: Fix + id: 9192 + time: '2025-11-09T01:46:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41358 From 5ec141b9558d8010b926590b6752e769a1fb78b9 Mon Sep 17 00:00:00 2001 From: Sir Warock <67167466+SirWarock@users.noreply.github.com> Date: Sun, 9 Nov 2025 08:42:55 +0100 Subject: [PATCH 016/100] Fix Ammo Visuals Bug (#41362) Fix Ammo Count Updating --- .../Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs | 2 -- 1 file changed, 2 deletions(-) diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs index 62b68fed6e..c2dfa23fcb 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Ballistic.cs @@ -154,8 +154,6 @@ public abstract partial class SharedGunSystem Del(ent.Value); } - UpdateBallisticAppearance(args.Target.Value, component); - UpdateAmmoCount(args.Target.Value); // repeat if there is more space in the target and more ammo to fill var moreSpace = target.Entities.Count + target.UnspawnedCount < target.Capacity; var moreAmmo = component.Entities.Count + component.UnspawnedCount > 0; From deea03d8155e994d404f46d031de9ace44e09d43 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 07:55:31 +0000 Subject: [PATCH 017/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 53810c4917..cf2b09af5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Fixed vapes dealing unintended damage types to you when used. - type: Fix - id: 8691 - time: '2025-06-18T12:06:13.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38423 - author: beck-thompson changes: - message: Recycler now properly recycles item stacks. @@ -3924,3 +3917,11 @@ id: 9192 time: '2025-11-09T01:46:21.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41358 +- author: SirWarock + changes: + - message: Fixed Magazines not properly visualizing how much ammo they had left + in them! + type: Fix + id: 9193 + time: '2025-11-09T07:54:23.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41362 From 3d16911dbeb9fc30cfb7dedc64141397d99d1b7e Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 9 Nov 2025 21:50:11 +1100 Subject: [PATCH 018/100] Update submodule to 267.4.0 (#41364) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index feb9e1db69..c95b4320cf 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit feb9e1db69ab97acfd07580918f5d20ffaa6b770 +Subproject commit c95b4320cfda1f54ea1e26023c9e73e85c57b820 From b0a206f1f8510109d69a67ff192b6ee8262282bc Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Sun, 9 Nov 2025 08:17:38 -0800 Subject: [PATCH 019/100] Yet another revitalization of engine lighting changes (#41361) * cherrypick lighting changes * increase computer light --------- Co-authored-by: Crude Oil --- .../Entities/Clothing/Head/helmets.yml | 2 +- .../Prototypes/Entities/Mobs/NPCs/carp.yml | 2 +- .../Entities/Mobs/NPCs/lavaland.yml | 16 +-- .../Prototypes/Entities/Mobs/NPCs/space.yml | 2 +- .../Objects/Consumable/Food/Baked/cake.yml | 4 +- .../Entities/Objects/Materials/materials.yml | 2 +- .../Objects/Weapons/Melee/e_sword.yml | 4 +- .../Decoration/decorated_fir_tree.yml | 2 +- .../Structures/Machines/Computers/arcades.yml | 2 +- .../Computers/base_structurecomputers.yml | 2 +- .../Machines/Computers/computers.yml | 54 +++++----- .../Machines/Computers/wooden_television.yml | 2 +- .../Structures/Machines/anomaly_sync.yml | 4 +- .../Structures/Machines/artifact_analyzer.yml | 2 +- .../Entities/Structures/Machines/research.yml | 6 +- .../Structures/Machines/smartfridge.yml | 4 +- .../Structures/Machines/telecomms.yml | 2 +- .../Structures/Machines/vending_machines.yml | 100 +++++++++--------- .../Power/Generation/generators.yml | 2 +- .../Entities/Structures/Power/apc.yml | 2 +- .../Entities/Structures/Power/smes.yml | 4 +- .../Structures/Specific/Anomaly/cores.yml | 8 +- .../Monitors/telescreens.yml | 2 +- .../Monitors/televisions.yml | 2 +- 24 files changed, 116 insertions(+), 116 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index bfa54eaf77..539fa90ea4 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -518,7 +518,7 @@ - type: PointLight enabled: false radius: 1.4 - energy: 1.4 + energy: 2.5 color: red netsync: false mask: /Textures/Effects/LightMasks/double_cone.png diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml index 95392e9a28..c0ea417663 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/carp.yml @@ -147,7 +147,7 @@ components: - type: PointLight radius: 1.5 - energy: 0.5 + energy: 2 - type: RgbLightController layers: [ 0 ] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml index b4add804ae..949fc76efe 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/lavaland.yml @@ -86,8 +86,8 @@ shader: unshaded color: red - type: PointLight - radius: 1.5 - energy: 0.5 + radius: 1 + energy: 3 color: red - type: entity @@ -104,8 +104,8 @@ shader: unshaded color: deepskyblue - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 color: deepskyblue - type: entity @@ -122,8 +122,8 @@ shader: unshaded color: orangered - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 color: orangered - type: ProjectileBatteryAmmoProvider proto: WatcherBoltMagmawing @@ -144,7 +144,7 @@ state: unshaded shader: unshaded - type: PointLight - radius: 1.5 - energy: 1 + radius: 1 + energy: 3 - type: RgbLightController layers: [ 1 ] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index 4dc0778efb..45c0b46d23 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -359,7 +359,7 @@ interactFailureString: petting-failure-generic - type: PointLight radius: 1.1 - energy: 1.5 + energy: 2.7 color: "#4faffb" - type: Stealth enabledOnDeath: false diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index 9f6d57083d..be2d04fea1 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -1155,7 +1155,7 @@ - type: PointLight color: "#FFFF00" radius: 2 - energy: 1.4 + energy: 2.5 - type: entity name: suppermatter shard @@ -1179,7 +1179,7 @@ - type: PointLight color: "#FFFF00" radius: 1.4 - energy: 1.4 + energy: 2.5 - type: Tag tags: - Slice diff --git a/Resources/Prototypes/Entities/Objects/Materials/materials.yml b/Resources/Prototypes/Entities/Objects/Materials/materials.yml index 4b7477eed3..6d5bd964be 100644 --- a/Resources/Prototypes/Entities/Objects/Materials/materials.yml +++ b/Resources/Prototypes/Entities/Objects/Materials/materials.yml @@ -335,7 +335,7 @@ - HEAD - type: PointLight radius: 1.2 - energy: 1.5 + energy: 2.7 color: "#4faffb" slots: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml index 04b65ddb6b..97ac9e0980 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/e_sword.yml @@ -153,7 +153,7 @@ - type: PointLight enabled: false radius: 1.5 - energy: 1.5 + energy: 2.7 color: white netsync: false @@ -212,7 +212,7 @@ - type: PointLight enabled: false radius: 1.5 - energy: 1.5 + energy: 2.7 color: white netsync: false - type: MeleeWeapon diff --git a/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml b/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml index b2806b93c9..06afa3785e 100644 --- a/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml +++ b/Resources/Prototypes/Entities/Structures/Decoration/decorated_fir_tree.yml @@ -13,7 +13,7 @@ shader: unshaded - type: PointLight radius: 1.6 - energy: 1.2 + energy: 2.0 enabled: false mask: /Textures/Effects/LightMasks/cone.png autoRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index c23c126c73..78fdd25316 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -10,7 +10,7 @@ - type: ExtensionCableReceiver - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: LitOnPowered - type: Sprite diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml index 7cccee81c0..bbd6ea8302 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/base_structurecomputers.yml @@ -50,7 +50,7 @@ - type: LitOnPowered - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 enabled: false mask: /Textures/Effects/LightMasks/cone.png autoRot: true diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index 4206f8e37d..e16380b2ef 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -110,7 +110,7 @@ type: WiresBoundUserInterface - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: entity @@ -134,7 +134,7 @@ radius: 256 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: ItemSlots slots: @@ -204,7 +204,7 @@ radius: 1536 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#c94242" - type: Computer board: SyndicateShuttleConsoleCircuitboard @@ -234,7 +234,7 @@ maxRange: 256 - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: Computer board: CargoShuttleConsoleCircuitboard @@ -314,7 +314,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#c9c042" - type: Computer board: PowerComputerCircuitboard @@ -356,7 +356,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: MedicalRecordsComputerCircuitboard @@ -390,7 +390,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: CriminalRecordsComputerCircuitboard @@ -417,7 +417,7 @@ key: enum.GeneralStationRecordConsoleKey.Key - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: Computer board: StationRecordsComputerCircuitboard @@ -445,7 +445,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#006400" - type: Computer board: CrewMonitoringComputerCircuitboard @@ -506,7 +506,7 @@ access: [["Research"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b53ca1" - type: GuideHelp guides: @@ -555,7 +555,7 @@ board: AnalysisComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b53ca1" - type: GuideHelp guides: @@ -615,7 +615,7 @@ board: IDComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: ItemSlots - type: ContainerContainer @@ -636,7 +636,7 @@ board: BodyScannerComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: entity @@ -676,7 +676,7 @@ board: CommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: Damageable damageContainer: StructuralInorganic @@ -713,7 +713,7 @@ board: SyndicateCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#f71713" - type: entity @@ -747,7 +747,7 @@ board: WizardCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#F317F3" - type: entity @@ -779,7 +779,7 @@ board: CentcommCommsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#00FF00" - type: entity @@ -813,7 +813,7 @@ board: SolarControlComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#e6e227" - type: GuideHelp guides: @@ -851,7 +851,7 @@ board: RadarConsoleCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#e6e227" - type: entity @@ -889,7 +889,7 @@ board: CargoRequestComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Cargo"]] @@ -1103,7 +1103,7 @@ board: CargoBountyComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Quartermaster"]] @@ -1146,7 +1146,7 @@ board: FundingAllocationComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#3c5eb5" - type: entity @@ -1177,7 +1177,7 @@ board: CloningConsoleComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#1f8c28" - type: DeviceLinkSource range: 4 @@ -1235,7 +1235,7 @@ board: SalvageJobBoardComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: entity @@ -1284,7 +1284,7 @@ board: SalvageExpeditionsComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: AccessReader access: [["Salvage"]] @@ -1420,7 +1420,7 @@ board: CargoSaleComputerCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#b89f25" - type: GuideHelp guides: @@ -1486,7 +1486,7 @@ state: generic_panel_open - type: PointLight radius: 1.5 - energy: 1.6 + energy: 4.0 color: "#43ccb5" - type: Computer board: SensorConsoleCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml index b542687b57..50cc6a624c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/wooden_television.yml @@ -16,7 +16,7 @@ board: ComputerTelevisionCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: Fixtures fixtures: diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml index 3019b8adf8..de4ea19350 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_sync.yml @@ -41,7 +41,7 @@ bounds: "-0.35,-0.35,0.35,0.35" density: 100 mask: - - ItemMask + - ItemMask hard: True - type: Transform anchored: true @@ -56,7 +56,7 @@ - type: DeviceList - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#b53ca1" - type: LitOnPowered - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index d4fc8263a8..95684e7520 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -66,7 +66,7 @@ board: ArtifactAnalyzerMachineCircuitboard - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b53ca1" - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 765249a933..40abd4b655 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -18,8 +18,8 @@ - type: PointLight enabled: false castShadows: false - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#b211b2" - type: LitOnPowered - type: ResearchServer @@ -95,7 +95,7 @@ active: true - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: ActivatableUI key: enum.ResearchClientUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml b/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml index dc9ad5fafa..e8c676e53a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/smartfridge.yml @@ -24,8 +24,8 @@ - state: panel map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#9dc5c9" - type: Machine board: SmartFridgeCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml index 4cfcbcd462..3caa56d3f8 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/telecomms.yml @@ -92,7 +92,7 @@ enabled: false castShadows: false radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#39b8ee" - type: LitOnPowered - type: GenericVisualizer diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index d28103b5a5..2f2f249a66 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -325,7 +325,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1 - energy: 1.3 + energy: 2.0 color: "#ffb0b0" - type: AccessReader access: [["HeadOfPersonnel"]] @@ -360,7 +360,7 @@ access: [["Service"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#4b93ad" - type: entity @@ -421,7 +421,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: entity @@ -452,7 +452,7 @@ map: [ "enum.WiresVisualLayers.MaintenancePanel" ] - type: PointLight radius: 1.8 - energy: 1.6 + energy: 3.0 color: "#3db83b" - type: entity @@ -493,7 +493,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.3 + energy: 2.0 color: "#ad7c4b" - type: entity @@ -529,7 +529,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: entity @@ -549,7 +549,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#423438" - type: entity @@ -570,7 +570,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#A50824" - type: entity @@ -593,7 +593,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#44964A" - type: entity @@ -615,7 +615,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CBC6BE" - type: entity @@ -638,7 +638,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#D3A44D" - type: entity @@ -672,7 +672,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#66538F" - type: entity @@ -708,7 +708,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6927C5" - type: entity @@ -744,7 +744,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#D82929" - type: entity @@ -780,7 +780,7 @@ pack: SmiteGoodbyes - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#00E645" - type: entity @@ -813,7 +813,7 @@ access: [["Kitchen"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#4b93ad" - type: entity @@ -843,7 +843,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9a18d6" - type: entity @@ -876,7 +876,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6148c7" - type: entity @@ -906,7 +906,7 @@ access: [["Engineering"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: entity @@ -939,7 +939,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9dc5c9" - type: GuideHelp guides: @@ -996,7 +996,7 @@ access: [["Hydroponics"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1030,7 +1030,7 @@ access: [["Security"]] - type: PointLight radius: 1 - energy: 1.2 + energy: 2.0 color: "#78645c" - type: GuideHelp guides: @@ -1067,7 +1067,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1110,7 +1110,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#c73434" - type: entity @@ -1140,7 +1140,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#737785" - type: entity @@ -1160,7 +1160,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: entity @@ -1180,7 +1180,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CE3401" - type: entity @@ -1200,7 +1200,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#5F6A1C" - type: entity @@ -1220,7 +1220,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#207E79" - type: entity @@ -1256,7 +1256,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#389690" - type: RussianAccent @@ -1293,7 +1293,7 @@ shader: unshaded - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#c73434" - type: entity @@ -1325,7 +1325,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#9dc5c9" - type: entity @@ -1359,7 +1359,7 @@ access: [["Research"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#B0ADA9" - type: GuideHelp guides: @@ -1390,7 +1390,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d4ab33" - type: entity @@ -1422,7 +1422,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: entity @@ -1455,7 +1455,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#ffe599" - type: entity @@ -1482,7 +1482,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: AccessReader access: [["Salvage"]] @@ -1520,7 +1520,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d4ab33" # job clothing @@ -1552,7 +1552,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#326e3f" - type: AccessReader access: [["Hydroponics"]] @@ -1612,7 +1612,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d82929" - type: AccessReader access: [["Security"]] @@ -1670,7 +1670,7 @@ access: [["Chapel"]] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#CCCCCC" #The holy C - type: entity @@ -1700,7 +1700,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Cargo"]] @@ -1816,7 +1816,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Engineering"]] @@ -1848,7 +1848,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89e2a" - type: AccessReader access: [["Engineering"]] @@ -1936,7 +1936,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#6927C5" - type: AccessReader access: [["Janitor"]] @@ -1996,7 +1996,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#d82929" - type: AccessReader access: [["NuclearOperative"], ["SyndicateAgent"]] @@ -2108,7 +2108,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#48CF48" - type: AccessReader access: [["CentralCommand"]] @@ -2142,7 +2142,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3c5eb5" - type: DatasetVocalizer dataset: HappyHonkAds @@ -2171,7 +2171,7 @@ - type: Speech - type: PointLight radius: 1.5 - energy: 1.3 # reduced energy since the color is pure white + energy: 2.0 # reduced energy since the color is pure white color: "#FFFFFF" - type: Sprite sprite: Structures/Machines/VendingMachines/pride.rsi @@ -2284,7 +2284,7 @@ map: ["enum.WiresVisualLayers.MaintenancePanel"] - type: PointLight radius: 1.3 - energy: 1.6 + energy: 3.0 color: "#43ccb5" - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml index 456a83046b..dfb273a5e8 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/generators.yml @@ -101,7 +101,7 @@ path: /Audio/Ambience/Objects/hdd_buzz.ogg - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" castShadows: false netsync: false diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 0addb34704..ec8b86e173 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -16,7 +16,7 @@ path: /Audio/Ambience/Objects/hdd_buzz.ogg - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#3db83b" castShadows: false netsync: false diff --git a/Resources/Prototypes/Entities/Structures/Power/smes.yml b/Resources/Prototypes/Entities/Structures/Power/smes.yml index 9c5162a421..3572fe6a39 100644 --- a/Resources/Prototypes/Entities/Structures/Power/smes.yml +++ b/Resources/Prototypes/Entities/Structures/Power/smes.yml @@ -64,8 +64,8 @@ supplyRampTolerance: 5000 supplyRampRate: 1000 - type: PointLight - radius: 1.5 - energy: 1.6 + radius: 1.2 + energy: 3.0 color: "#c9c042" castShadows: false - type: WiresPanel diff --git a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml index 45a5a6d4d6..492ab11f0c 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Anomaly/cores.yml @@ -43,7 +43,7 @@ sprite: Structures/Specific/Anomalies/Cores/pyro_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#E25822" castShadows: false - type: IgnitionSource @@ -72,7 +72,7 @@ sprite: Structures/Specific/Anomalies/Cores/ice_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#befaff" castShadows: false @@ -223,7 +223,7 @@ sprite: Structures/Specific/Anomalies/Cores/pyro_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#fca3c0" castShadows: false @@ -249,7 +249,7 @@ sprite: Structures/Specific/Anomalies/Cores/ice_core.rsi - type: PointLight radius: 1.5 - energy: 1.5 + energy: 2.7 color: "#befaff" castShadows: false diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml index ed585aa185..0705a60b49 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/telescreens.yml @@ -28,7 +28,7 @@ node: Telescreen - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: DeviceNetwork deviceNetId: Wired diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml index b600ece985..fd1e895f70 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/WallmountMachines/Monitors/televisions.yml @@ -35,7 +35,7 @@ type: SurveillanceCameraMonitorBoundUserInterface - type: PointLight radius: 1.5 - energy: 1.6 + energy: 3.0 color: "#b89f25" - type: Destructible thresholds: From 11055ce314fc4437110ca59b65889bcd12156b59 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 9 Nov 2025 16:30:32 +0000 Subject: [PATCH 020/100] 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 cf2b09af5a..14c0a008fb 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: beck-thompson - changes: - - message: Recycler now properly recycles item stacks. - type: Fix - id: 8692 - time: '2025-06-18T21:14:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38433 - author: Bhijn and Myr changes: - message: In interest of raising awareness of addiction to the game, the lobby @@ -3925,3 +3918,12 @@ id: 9193 time: '2025-11-09T07:54:23.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41362 +- author: mirrorcult + changes: + - message: Lighting attenuation has changed slightly. You shouldn't notice much + difference, but the edges of lights should look better. If any lights are significantly + different than they used to be, make a GitHub issue. + type: Tweak + id: 9194 + time: '2025-11-09T16:29:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41361 From 3dc0d0080d9aea1adc0c68b3de0d2ea5cc646c37 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 10 Nov 2025 20:25:35 +1100 Subject: [PATCH 021/100] Fix invalid AABBs (#41381) LBRT LBRT LBRT LBRT not RTLB --- .../Prototypes/Entities/Structures/Lighting/base_lighting.yml | 4 ++-- .../Entities/Structures/Lighting/ground_lighting.yml | 2 +- .../Entities/Structures/Lighting/strobe_lighting.yml | 2 +- Resources/Prototypes/Entities/Structures/Walls/railing.yml | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml index 8330bf2fd4..e769d81fbb 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/base_lighting.yml @@ -51,7 +51,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.4,0.5,0.4,0.35" + bounds: "-0.4,0.35,0.4,0.5" density: 190 mask: - None @@ -275,7 +275,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.1,0.5,0.1,0.255" + bounds: "-0.1,0.255,0.1,0.5" density: 190 mask: - None diff --git a/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml index 222ea5c814..2642d4217e 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/ground_lighting.yml @@ -22,7 +22,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "0.17,0.25,-0.17,-0.30" + bounds: "-0.17,-0.30,0.17,0.25" density: 190 mask: - MachineMask diff --git a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml index c1aa9b97d8..eb8c658fe5 100644 --- a/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml +++ b/Resources/Prototypes/Entities/Structures/Lighting/strobe_lighting.yml @@ -45,7 +45,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.2,0.5,0.2,0.35" + bounds: "-0.2,0.35,0.2,0.5" density: 190 mask: - None diff --git a/Resources/Prototypes/Entities/Structures/Walls/railing.yml b/Resources/Prototypes/Entities/Structures/Walls/railing.yml index db456c512f..869f423887 100644 --- a/Resources/Prototypes/Entities/Structures/Walls/railing.yml +++ b/Resources/Prototypes/Entities/Structures/Walls/railing.yml @@ -93,7 +93,7 @@ fix2: shape: !type:PhysShapeAabb - bounds: "0.49,0.49,0.25,-0.49" + bounds: "0.25,-0.49,0.49,0.49" density: 1000 mask: - TableMask @@ -139,7 +139,7 @@ fix1: shape: !type:PhysShapeAabb - bounds: "-0.49,0.49,-0.25,0.25" + bounds: "-0.49,0.25,-0.25,0.49" density: 1000 mask: - TableMask From ce226b0c16b871e3c8fd08538b0556de47993fad Mon Sep 17 00:00:00 2001 From: kin98 <51699101+kin98@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:30:24 +0100 Subject: [PATCH 022/100] Fix: obsolete warnings in SharedAbsorbentSystem (#40885) * fix: formating warnings * split GetAbsorbentReagents into string and protoid * fix: changed SplitSolutionWhitout [obsolete] to use new method * fix: missing using directive after merge * Replaced methods with ProtoId variant --- Content.Shared/Chemistry/Components/Solution.cs | 10 +++++----- .../SharedSolutionContainerSystem.cs | 10 +++++----- .../Chemistry/Reagent/ReagentPrototype.cs | 2 +- .../Fluids/SharedPuddleSystem.Evaporation.cs | 16 +++++++++------- Content.Shared/Fluids/SharedPuddleSystem.cs | 2 +- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/Content.Shared/Chemistry/Components/Solution.cs b/Content.Shared/Chemistry/Components/Solution.cs index 2179469c08..df09f7f3f6 100644 --- a/Content.Shared/Chemistry/Components/Solution.cs +++ b/Content.Shared/Chemistry/Components/Solution.cs @@ -302,7 +302,7 @@ namespace Content.Shared.Chemistry.Components /// If you only want the volume of a single reagent, use /// [Pure] - public FixedPoint2 GetTotalPrototypeQuantity(params string[] prototypes) + public FixedPoint2 GetTotalPrototypeQuantity(params ProtoId[] prototypes) { var total = FixedPoint2.Zero; foreach (var (reagent, quantity) in Contents) @@ -314,7 +314,7 @@ namespace Content.Shared.Chemistry.Components return total; } - public FixedPoint2 GetTotalPrototypeQuantity(string id) + public FixedPoint2 GetTotalPrototypeQuantity(ProtoId id) { var total = FixedPoint2.Zero; foreach (var (reagent, quantity) in Contents) @@ -645,7 +645,7 @@ namespace Content.Shared.Chemistry.Components /// /// Splits a solution with only the specified reagent prototypes. /// - public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params string[] includedPrototypes) + public Solution SplitSolutionWithOnly(FixedPoint2 toTake, params ProtoId[] includedPrototypes) { // First remove the non-included prototypes List excluded = new(); @@ -844,7 +844,7 @@ namespace Content.Shared.Chemistry.Components ValidateSolution(); } - public Color GetColorWithout(IPrototypeManager? protoMan, params string[] without) + public Color GetColorWithout(IPrototypeManager? protoMan, params ProtoId[] without) { if (Volume == FixedPoint2.Zero) { @@ -887,7 +887,7 @@ namespace Content.Shared.Chemistry.Components return GetColorWithout(protoMan); } - public Color GetColorWithOnly(IPrototypeManager? protoMan, params string[] included) + public Color GetColorWithOnly(IPrototypeManager? protoMan, params ProtoId[] included) { if (Volume == FixedPoint2.Zero) { diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs index a245c0b606..cd38df021d 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs @@ -858,7 +858,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem args.PushMarkup(Loc.GetString(entity.Comp.LocPhysicalQuality, ("color", colorHex), ("desc", primary.LocalizedPhysicalDescription), - ("chemCount", solution.Contents.Count) )); + ("chemCount", solution.Contents.Count))); // Push the recognizable reagents @@ -1048,7 +1048,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem public bool EnsureSolution( Entity entity, string name, - [NotNullWhen(true)]out Solution? solution, + [NotNullWhen(true)] out Solution? solution, FixedPoint2 maxVol = default) { return EnsureSolution(entity, name, maxVol, null, out _, out solution); @@ -1058,7 +1058,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem Entity entity, string name, out bool existed, - [NotNullWhen(true)]out Solution? solution, + [NotNullWhen(true)] out Solution? solution, FixedPoint2 maxVol = default) { return EnsureSolution(entity, name, maxVol, null, out existed, out solution); @@ -1240,13 +1240,13 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem } else { - dissolvedSol.RemoveReagent(reagent,amtChange); + dissolvedSol.RemoveReagent(reagent, amtChange); } UpdateChemicals(dissolvedSolution); } public FixedPoint2 GetReagentQuantityFromConcentration(Entity dissolvedSolution, - FixedPoint2 volume,float concentration) + FixedPoint2 volume, float concentration) { var dissolvedSol = dissolvedSolution.Comp.Solution; if (volume == 0 diff --git a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs index 3b16b577cb..e634e03284 100644 --- a/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs +++ b/Content.Shared/Chemistry/Reagent/ReagentPrototype.cs @@ -221,7 +221,7 @@ namespace Content.Shared.Chemistry.Reagent if (effect.EntityEffectGuidebookText(prototype, entSys) is not { } description) return null; - var quantity = metabolism == null ? 0f : (double) (effect.MinScale * metabolism); + var quantity = metabolism == null ? 0f : (double)(effect.MinScale * metabolism); return Loc.GetString( "guidebook-reagent-effect-description", diff --git a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs index 9854560204..0ba1c15122 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.Evaporation.cs @@ -1,7 +1,9 @@ using System.Linq; using Content.Shared.Chemistry.Components; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; using Content.Shared.Fluids.Components; +using Content.Shared.Chemistry.Reagent; namespace Content.Shared.Fluids; @@ -78,9 +80,9 @@ public abstract partial class SharedPuddleSystem } - public string[] GetEvaporatingReagents(Solution solution) + public ProtoId[] GetEvaporatingReagents(Solution solution) { - List evaporatingReagents = []; + List> evaporatingReagents = []; foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.EvaporationSpeed > FixedPoint2.Zero) @@ -89,10 +91,10 @@ public abstract partial class SharedPuddleSystem return evaporatingReagents.ToArray(); } - public string[] GetAbsorbentReagents(Solution solution) + public ProtoId[] GetAbsorbentReagents(Solution solution) { - List absorbentReagents = []; - foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) + var absorbentReagents = new List>(); + foreach (ReagentPrototype solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.Absorbent) absorbentReagents.Add(solProto.ID); @@ -109,9 +111,9 @@ public abstract partial class SharedPuddleSystem /// Gets a mapping of evaporating speed of the reagents within a solution. /// The speed at which a solution evaporates is the average of the speed of all evaporating reagents in it. /// - public Dictionary GetEvaporationSpeeds(Solution solution) + public Dictionary, FixedPoint2> GetEvaporationSpeeds(Solution solution) { - Dictionary evaporatingSpeeds = []; + Dictionary, FixedPoint2> evaporatingSpeeds = []; foreach (var solProto in solution.GetReagentPrototypes(_prototypeManager).Keys) { if (solProto.EvaporationSpeed > FixedPoint2.Zero) diff --git a/Content.Shared/Fluids/SharedPuddleSystem.cs b/Content.Shared/Fluids/SharedPuddleSystem.cs index a2ea262796..e81d1c9d11 100644 --- a/Content.Shared/Fluids/SharedPuddleSystem.cs +++ b/Content.Shared/Fluids/SharedPuddleSystem.cs @@ -42,7 +42,7 @@ public abstract partial class SharedPuddleSystem : EntitySystem [Dependency] private readonly StepTriggerSystem _stepTrigger = default!; [Dependency] private readonly TileFrictionController _tile = default!; - private string[] _standoutReagents = []; + private ProtoId[] _standoutReagents = []; /// /// The lowest threshold to be considered for puddle sprite states as well as slipperiness of a puddle. From 4af0e586bd083afa934fc6dc87c78a338fde731d Mon Sep 17 00:00:00 2001 From: beck-thompson <107373427+beck-thompson@users.noreply.github.com> Date: Mon, 10 Nov 2025 05:47:02 -0800 Subject: [PATCH 023/100] Remove wizards healing wand for the random magic item spell (#41365) Remove wizards healing wand for the random spell --- Resources/Prototypes/Magic/event_spells.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/Resources/Prototypes/Magic/event_spells.yml b/Resources/Prototypes/Magic/event_spells.yml index e32bbac3d5..b619b8abe8 100644 --- a/Resources/Prototypes/Magic/event_spells.yml +++ b/Resources/Prototypes/Magic/event_spells.yml @@ -204,8 +204,6 @@ orGroup: Magics - id: WeaponWandPolymorphBread orGroup: Magics - - id: WeaponStaffHealing - orGroup: Magics - id: WeaponStaffPolymorphDoor orGroup: Magics - id: AnimationStaff From 00b542220be2756176a75868d39c76647aa96399 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 10 Nov 2025 13:59:03 +0000 Subject: [PATCH 024/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 14c0a008fb..92034d6e08 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Bhijn and Myr - changes: - - message: In interest of raising awareness of addiction to the game, the lobby - will now display your current playtime on a given day once it exceeds a threshold. - type: Add - id: 8693 - time: '2025-06-19T01:06:26.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36483 - author: ScarKy0 changes: - message: APCs now have a wirepanel. It can be used to disallow the AI from accessing @@ -3927,3 +3919,11 @@ id: 9194 time: '2025-11-09T16:29:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41361 +- author: beck-thompson + changes: + - message: The Summon Magic spell no longer will give out healing wands. When there + are more wands added it will be brought back + type: Tweak + id: 9195 + time: '2025-11-10T13:57:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41365 From 158f351900d0bd93917351677174b61228b9f55d Mon Sep 17 00:00:00 2001 From: Aiden <28298836+Aidenkrz@users.noreply.github.com> Date: Mon, 10 Nov 2025 12:06:18 -0600 Subject: [PATCH 025/100] Prototype-ize Mind (#41384) * Use MindBase prototype for mind creation * Create mind.yml * Add ContainerContainer --- Content.Shared/Mind/SharedMindSystem.cs | 5 ++++- Resources/Prototypes/Entities/Virtual/mind.yml | 10 ++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 Resources/Prototypes/Entities/Virtual/mind.yml diff --git a/Content.Shared/Mind/SharedMindSystem.cs b/Content.Shared/Mind/SharedMindSystem.cs index 309f37be3f..a7d3357f00 100644 --- a/Content.Shared/Mind/SharedMindSystem.cs +++ b/Content.Shared/Mind/SharedMindSystem.cs @@ -20,6 +20,7 @@ using Robust.Shared.Containers; using Robust.Shared.Map; using Robust.Shared.Network; using Robust.Shared.Player; +using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; @@ -43,6 +44,8 @@ public abstract partial class SharedMindSystem : EntitySystem private HashSet> _pickingMinds = new(); + private readonly EntProtoId _mindProto = "MindBase"; + public override void Initialize() { base.Initialize(); @@ -226,7 +229,7 @@ public abstract partial class SharedMindSystem : EntitySystem public Entity CreateMind(NetUserId? userId, string? name = null) { - var mindId = Spawn(null, MapCoordinates.Nullspace); + var mindId = Spawn(_mindProto, MapCoordinates.Nullspace); _metadata.SetEntityName(mindId, name == null ? "mind" : $"mind ({name})"); var mind = EnsureComp(mindId); mind.CharacterName = name; diff --git a/Resources/Prototypes/Entities/Virtual/mind.yml b/Resources/Prototypes/Entities/Virtual/mind.yml new file mode 100644 index 0000000000..33e9ba273a --- /dev/null +++ b/Resources/Prototypes/Entities/Virtual/mind.yml @@ -0,0 +1,10 @@ +- type: entity + id: MindBase + name: mind + categories: [ HideSpawnMenu ] + components: + - type: Mind + - type: ContainerContainer + containers: + mind_roles: !type:Container + ents: [] From 26d95b7944b63aa03001c52c432b9419347229ef Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 10 Nov 2025 10:42:13 -0800 Subject: [PATCH 026/100] Document Atmospherics API (#41382) * api docs * rem using dir. linq in atmospherics not allowed. * address review --- .../EntitySystems/AtmosphereSystem.API.cs | 319 ++++++++++++++++-- 1 file changed, 288 insertions(+), 31 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs index 29f091f340..96a5c69457 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.API.cs @@ -1,5 +1,4 @@ using System.Diagnostics; -using System.Linq; using Content.Server.Atmos.Components; using Content.Server.Atmos.Piping.Components; using Content.Server.NodeContainer.NodeGroups; @@ -14,6 +13,22 @@ namespace Content.Server.Atmos.EntitySystems; public partial class AtmosphereSystem { + /* + General API for interacting with AtmosphereSystem. + + If you feel like you're stepping on eggshells because you can't access things in AtmosphereSystem, + consider adding a method here instead of making your own way to work around it. + */ + + /// + /// Gets the that an entity is contained within. + /// + /// The entity to get the mixture for. + /// If true, will ignore mixtures that the entity is contained in + /// (ex. lockers and cryopods) and just get the tile mixture. + /// If true, will mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetContainingMixture(Entity ent, bool ignoreExposed = false, bool excite = false) { if (!Resolve(ent, ref ent.Comp)) @@ -22,6 +37,17 @@ public partial class AtmosphereSystem return GetContainingMixture(ent, ent.Comp.GridUid, ent.Comp.MapUid, ignoreExposed, excite); } + /// + /// Gets the that an entity is contained within. + /// + /// The entity to get the mixture for. + /// The grid that the entity may be on. + /// The map that the entity may be on. + /// If true, will ignore mixtures that the entity is contained in + /// (ex. lockers and cryopods) and just get the tile mixture. + /// If true, will mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetContainingMixture( Entity ent, Entity? grid, @@ -49,16 +75,38 @@ public partial class AtmosphereSystem return GetTileMixture(grid, map, position, excite); } - public bool HasAtmosphere(EntityUid gridUid) => _atmosQuery.HasComponent(gridUid); + /// + /// Checks if a grid has an atmosphere. + /// + /// The grid to check. + /// True if the grid has an atmosphere, false otherwise. + [PublicAPI] + public bool HasAtmosphere(EntityUid gridUid) + { + return _atmosQuery.HasComponent(gridUid); + } + /// + /// Sets whether a grid is simulated by Atmospherics. + /// + /// The grid to set. + /// Whether the grid should be simulated. + /// >True if the grid's simulated state was changed, false otherwise. + [PublicAPI] public bool SetSimulatedGrid(EntityUid gridUid, bool simulated) { + // TODO ATMOS this event literally has no subscribers. Did this just get silently refactored out? var ev = new SetSimulatedGridMethodEvent(gridUid, simulated); RaiseLocalEvent(gridUid, ref ev); return ev.Handled; } + /// + /// Checks whether a grid is simulated by Atmospherics. + /// + /// The grid to check. + /// >True if the grid is simulated, false otherwise. public bool IsSimulatedGrid(EntityUid gridUid) { var ev = new IsSimulatedGridMethodEvent(gridUid); @@ -67,24 +115,53 @@ public partial class AtmosphereSystem return ev.Simulated; } + /// + /// Gets all s on a grid. + /// + /// The grid to get mixtures for. + /// Whether to mark all tiles as active for atmosphere processing. + /// An enumerable of all gas mixtures on the grid. + [PublicAPI] public IEnumerable GetAllMixtures(EntityUid gridUid, bool excite = false) { var ev = new GetAllMixturesMethodEvent(gridUid, excite); RaiseLocalEvent(gridUid, ref ev); - if(!ev.Handled) - return Enumerable.Empty(); + if (!ev.Handled) + return []; DebugTools.AssertNotNull(ev.Mixtures); return ev.Mixtures!; } + /// + /// Invalidates a tile on a grid, marking it for revalidation. + /// + /// Frequently used tile data like are determined once and cached. + /// If this tile's state changes, ex. being added or removed, then this position in the map needs to + /// be updated. + /// + /// Tiles that need to be updated are marked as invalid and revalidated before all other + /// processing stages. + /// + /// The grid entity. + /// The tile to invalidate. + [PublicAPI] public void InvalidateTile(Entity entity, Vector2i tile) { if (_atmosQuery.Resolve(entity.Owner, ref entity.Comp, false)) entity.Comp.InvalidatedCoords.Add(tile); } + /// + /// Gets the gas mixtures for a list of tiles on a grid or map. + /// + /// The grid to get mixtures from. + /// The map to get mixtures from. + /// The list of tiles to get mixtures for. + /// Whether to mark the tiles as active for atmosphere processing. + /// >An array of gas mixtures corresponding to the input tiles. + [PublicAPI] public GasMixture?[]? GetTileMixtures( Entity? grid, Entity? map, @@ -95,7 +172,7 @@ public partial class AtmosphereSystem var handled = false; // If we've been passed a grid, try to let it handle it. - if (grid is {} gridEnt && Resolve(gridEnt, ref gridEnt.Comp1)) + if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1)) { if (excite) Resolve(gridEnt, ref gridEnt.Comp2); @@ -128,7 +205,7 @@ public partial class AtmosphereSystem // We either don't have a grid, or the event wasn't handled. // Let the map handle it instead, and also broadcast the event. - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp)) { mixtures ??= new GasMixture?[tiles.Count]; for (var i = 0; i < tiles.Count; i++) @@ -145,10 +222,21 @@ public partial class AtmosphereSystem { mixtures[i] ??= GasMixture.SpaceGas; } + return mixtures; } - public GasMixture? GetTileMixture (Entity entity, bool excite = false) + /// + /// Gets the gas mixture for a specific tile that an entity is on. + /// + /// The entity to get the tile mixture for. + /// Whether to mark the tile as active for atmosphere processing. + /// A if one could be found, null otherwise. + /// This does not return the that the entity + /// may be contained in, ex. if the entity is currently in a locker/crate with its own + /// . + [PublicAPI] + public GasMixture? GetTileMixture(Entity entity, bool excite = false) { if (!Resolve(entity.Owner, ref entity.Comp)) return null; @@ -157,6 +245,15 @@ public partial class AtmosphereSystem return GetTileMixture(entity.Comp.GridUid, entity.Comp.MapUid, indices, excite); } + /// + /// Gets the gas mixture for a specific tile on a grid or map. + /// + /// The grid to get the mixture from. + /// The map to get the mixture from. + /// The tile to get the mixture from. + /// Whether to mark the tile as active for atmosphere processing. + /// >A if one could be found, null otherwise. + [PublicAPI] public GasMixture? GetTileMixture( Entity? grid, Entity? map, @@ -164,8 +261,8 @@ public partial class AtmosphereSystem bool excite = false) { // If we've been passed a grid, try to let it handle it. - if (grid is {} gridEnt - && Resolve(gridEnt, ref gridEnt.Comp1, false) + if (grid is { } gridEnt + && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp1, false) && gridEnt.Comp1.Tiles.TryGetValue(gridTile, out var tile)) { if (excite) @@ -177,13 +274,20 @@ public partial class AtmosphereSystem return tile.Air; } - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) return mapEnt.Comp.Mixture; // Default to a space mixture... This is a space game, after all! return GasMixture.SpaceGas; } + /// + /// Triggers a tile's to react. + /// + /// The grid to react the tile on. + /// The tile to react. + /// The result of the reaction. + [PublicAPI] public ReactionResult ReactTile(EntityUid gridId, Vector2i tile) { var ev = new ReactTileMethodEvent(gridId, tile); @@ -194,24 +298,49 @@ public partial class AtmosphereSystem return ev.Result; } - public bool IsTileAirBlocked(EntityUid gridUid, Vector2i tile, AtmosDirection directions = AtmosDirection.All, MapGridComponent? mapGridComp = null) + /// + /// Checks if a tile on a grid is air-blocked in the specified directions. + /// + /// The grid to check. + /// The tile on the grid to check. + /// The directions to check for air-blockage. + /// Optional map grid component associated with the grid. + /// True if the tile is air-blocked in the specified directions, false otherwise. + [PublicAPI] + public bool IsTileAirBlocked(EntityUid gridUid, + Vector2i tile, + AtmosDirection directions = AtmosDirection.All, + MapGridComponent? mapGridComp = null) { if (!Resolve(gridUid, ref mapGridComp, false)) return false; + // TODO ATMOS: This reconstructs the data instead of getting the cached version. Might want to include a method to get the cached version later. var data = GetAirtightData(gridUid, mapGridComp, tile); return data.BlockedDirections.IsFlagSet(directions); } + /// + /// Checks if a tile on a grid or map is space as defined by a tile's definition of space. + /// Some tiles can hold back space and others cannot - for example, plating can hold + /// back space, whereas scaffolding cannot, exposing the map atmosphere beneath. + /// + /// This does not check if the on the tile is space, + /// it only checks the current tile's ability to hold back space. + /// The grid to check. + /// The map to check. + /// The tile to check. + /// True if the tile is space, false otherwise. + [PublicAPI] public bool IsTileSpace(Entity? grid, Entity? map, Vector2i tile) { - if (grid is {} gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) - && gridEnt.Comp.Tiles.TryGetValue(tile, out var tileAtmos)) + if (grid is { } gridEnt && _atmosQuery.Resolve(gridEnt, ref gridEnt.Comp, false) + && gridEnt.Comp.Tiles.TryGetValue(tile, out var tileAtmos)) { return tileAtmos.Space; } - if (map is {} mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) + if (map is { } mapEnt && _mapAtmosQuery.Resolve(mapEnt, ref mapEnt.Comp, false)) return mapEnt.Comp.Space; // If nothing handled the event, it'll default to true. @@ -219,28 +348,77 @@ public partial class AtmosphereSystem return true; } + /// + /// Checks if the gas mixture on a tile is "probably safe". + /// Probably safe is defined as having at least air alarm-grade safe pressure and temperature. + /// (more than 260K, less than 360K, and between safe low and high pressure as defined in + /// and ) + /// + /// The grid to check. + /// The map to check. + /// The tile to check. + /// True if the tile's mixture is probably safe, false otherwise. + [PublicAPI] public bool IsTileMixtureProbablySafe(Entity? grid, Entity map, Vector2i tile) { return IsMixtureProbablySafe(GetTileMixture(grid, map, tile)); } + /// + /// Gets the heat capacity of the gas mixture on a tile. + /// + /// The grid to check. + /// The map to check. + /// The tile on the grid/map to check. + /// >The heat capacity of the tile's mixture, or the heat capacity of space if a mixture could not be found. + [PublicAPI] public float GetTileHeatCapacity(Entity? grid, Entity map, Vector2i tile) { return GetHeatCapacity(GetTileMixture(grid, map, tile) ?? GasMixture.SpaceGas); } + /// + /// Gets an enumerator for the adjacent tile mixtures of a tile on a grid. + /// + /// The grid to get adjacent tile mixtures from. + /// The tile to get adjacent mixtures for. + /// Whether to include blocked adjacent tiles. + /// Whether to mark the adjacent tiles as active for atmosphere processing. + /// An enumerator for the adjacent tile mixtures. + [PublicAPI] public TileMixtureEnumerator GetAdjacentTileMixtures(Entity grid, Vector2i tile, bool includeBlocked = false, bool excite = false) { + // TODO ATMOS includeBlocked and excite parameters are unhandled currently. if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) return TileMixtureEnumerator.Empty; return !grid.Comp.Tiles.TryGetValue(tile, out var atmosTile) ? TileMixtureEnumerator.Empty - : new(atmosTile.AdjacentTiles); + : new TileMixtureEnumerator(atmosTile.AdjacentTiles); } - public void HotspotExpose(Entity grid, Vector2i tile, float exposedTemperature, float exposedVolume, - EntityUid? sparkSourceUid = null, bool soh = false) + /// + /// Exposes a tile to a hotspot of given temperature and volume, igniting it if conditions are met. + /// + /// The grid to expose the tile on. + /// The tile to expose. + /// The temperature of the hotspot to expose. + /// You can think of this as exposing a temperature of a flame. + /// The volume of the hotspot to expose. + /// You can think of this as how big the flame is initially. + /// Bigger flames will ramp a fire faster. + /// Whether to "boost" a fire that's currently on the tile already. + /// Does nothing if the tile isn't already a hotspot. + /// This clamps the temperature and volume of the hotspot to the maximum + /// of the provided parameters and whatever's on the tile. + /// Entity that started the exposure for admin logging. + [PublicAPI] + public void HotspotExpose(Entity grid, + Vector2i tile, + float exposedTemperature, + float exposedVolume, + EntityUid? sparkSourceUid = null, + bool soh = false) { if (!_atmosQuery.Resolve(grid, ref grid.Comp, false)) return; @@ -249,8 +427,26 @@ public partial class AtmosphereSystem HotspotExpose(grid.Comp, atmosTile, exposedTemperature, exposedVolume, soh, sparkSourceUid); } - public void HotspotExpose(TileAtmosphere tile, float exposedTemperature, float exposedVolume, - EntityUid? sparkSourceUid = null, bool soh = false) + /// + /// Exposes a tile to a hotspot of given temperature and volume, igniting it if conditions are met. + /// + /// The to expose. + /// The temperature of the hotspot to expose. + /// You can think of this as exposing a temperature of a flame. + /// The volume of the hotspot to expose. + /// You can think of this as how big the flame is initially. + /// Bigger flames will ramp a fire faster. + /// Whether to "boost" a fire that's currently on the tile already. + /// Does nothing if the tile isn't already a hotspot. + /// This clamps the temperature and volume of the hotspot to the maximum + /// of the provided parameters and whatever's on the tile. + /// Entity that started the exposure for admin logging. + [PublicAPI] + public void HotspotExpose(TileAtmosphere tile, + float exposedTemperature, + float exposedVolume, + EntityUid? sparkSourceUid = null, + bool soh = false) { if (!_atmosQuery.TryGetComponent(tile.GridIndex, out var atmos)) return; @@ -259,12 +455,25 @@ public partial class AtmosphereSystem HotspotExpose(atmos, tile, exposedTemperature, exposedVolume, soh, sparkSourceUid); } + /// + /// Extinguishes a hotspot on a tile. + /// + /// The grid to extinguish the hotspot on. + /// The tile on the grid to extinguish the hotspot on. + [PublicAPI] public void HotspotExtinguish(EntityUid gridUid, Vector2i tile) { var ev = new HotspotExtinguishMethodEvent(gridUid, tile); RaiseLocalEvent(gridUid, ref ev); } + /// + /// Checks if a hotspot is active on a tile. + /// + /// The grid to check. + /// The tile on the grid to check. + /// True if a hotspot is active on the tile, false otherwise. + [PublicAPI] public bool IsHotspotActive(EntityUid gridUid, Vector2i tile) { var ev = new IsHotspotActiveMethodEvent(gridUid, tile); @@ -274,11 +483,25 @@ public partial class AtmosphereSystem return ev.Result; } + /// + /// Adds a to a grid. + /// + /// The grid to add the pipe net to. + /// The pipe net to add. + /// True if the pipe net was added, false otherwise. + [PublicAPI] public bool AddPipeNet(Entity grid, PipeNet pipeNet) { return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Add(pipeNet); } + /// + /// Removes a from a grid. + /// + /// The grid to remove the pipe net from. + /// The pipe net to remove. + /// True if the pipe net was removed, false otherwise. + [PublicAPI] public bool RemovePipeNet(Entity grid, PipeNet pipeNet) { // Technically this event can be fired even on grids that don't @@ -292,6 +515,13 @@ public partial class AtmosphereSystem return _atmosQuery.Resolve(grid, ref grid.Comp, false) && grid.Comp.PipeNets.Remove(pipeNet); } + /// + /// Adds an entity with an to a grid's list of atmos devices. + /// + /// The grid to add the device to. + /// The device to add. + /// True if the device was added, false otherwise. + [PublicAPI] public bool AddAtmosDevice(Entity grid, Entity device) { DebugTools.Assert(device.Comp.JoinedGrid == null); @@ -307,6 +537,12 @@ public partial class AtmosphereSystem return true; } + /// + /// Removes an entity with an from a grid's list of atmos devices. + /// + /// The grid to remove the device from. + /// The device to remove. + /// True if the device was removed, false otherwise. public bool RemoveAtmosDevice(Entity grid, Entity device) { DebugTools.Assert(device.Comp.JoinedGrid == grid); @@ -418,23 +654,44 @@ public partial class AtmosphereSystem return contains; } - [ByRefEvent] private record struct SetSimulatedGridMethodEvent - (EntityUid Grid, bool Simulated, bool Handled = false); + [ByRefEvent] + private record struct SetSimulatedGridMethodEvent( + EntityUid Grid, + bool Simulated, + bool Handled = false); - [ByRefEvent] private record struct IsSimulatedGridMethodEvent - (EntityUid Grid, bool Simulated = false, bool Handled = false); + [ByRefEvent] + private record struct IsSimulatedGridMethodEvent( + EntityUid Grid, + bool Simulated = false, + bool Handled = false); - [ByRefEvent] private record struct GetAllMixturesMethodEvent - (EntityUid Grid, bool Excite = false, IEnumerable? Mixtures = null, bool Handled = false); + [ByRefEvent] + private record struct GetAllMixturesMethodEvent( + EntityUid Grid, + bool Excite = false, + IEnumerable? Mixtures = null, + bool Handled = false); - [ByRefEvent] private record struct ReactTileMethodEvent - (EntityUid GridId, Vector2i Tile, ReactionResult Result = default, bool Handled = false); + [ByRefEvent] + private record struct ReactTileMethodEvent( + EntityUid GridId, + Vector2i Tile, + ReactionResult Result = default, + bool Handled = false); - [ByRefEvent] private record struct HotspotExtinguishMethodEvent - (EntityUid Grid, Vector2i Tile, bool Handled = false); + [ByRefEvent] + private record struct HotspotExtinguishMethodEvent( + EntityUid Grid, + Vector2i Tile, + bool Handled = false); - [ByRefEvent] private record struct IsHotspotActiveMethodEvent - (EntityUid Grid, Vector2i Tile, bool Result = false, bool Handled = false); + [ByRefEvent] + private record struct IsHotspotActiveMethodEvent( + EntityUid Grid, + Vector2i Tile, + bool Result = false, + bool Handled = false); } From 94d39f7fcaf0919ddd0ec47e68c77c10b131cd5a Mon Sep 17 00:00:00 2001 From: ArtisticRoomba <145879011+ArtisticRoomba@users.noreply.github.com> Date: Mon, 10 Nov 2025 11:05:31 -0800 Subject: [PATCH 027/100] Document Atmospherics Utils (#41385) * Utils docs * Update Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../EntitySystems/AtmosphereSystem.Utils.cs | 55 +++++++++++++++++-- 1 file changed, 51 insertions(+), 4 deletions(-) diff --git a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs index 596368f000..a402cf20f3 100644 --- a/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs +++ b/Content.Server/Atmos/EntitySystems/AtmosphereSystem.Utils.cs @@ -11,9 +11,15 @@ namespace Content.Server.Atmos.EntitySystems; public partial class AtmosphereSystem { + /* + Partial class that stores miscellaneous utility methods for Atmospherics. + */ + /// - /// Gets the particular price of an air mixture. + /// Gets the particular price of a . /// + /// The to get the price of. + /// The price of the gas mixture. public double GetPrice(GasMixture mixture) { float basePrice = 0; // moles of gas * price/mole @@ -26,7 +32,7 @@ public partial class AtmosphereSystem maxComponent = Math.Max(maxComponent, mixture.Moles[i]); } - // Pay more for gas canisters that are more pure + // Pay more for gas canisters that are purer float purity = 1; if (totalMoles > 0) { @@ -36,12 +42,32 @@ public partial class AtmosphereSystem return basePrice * purity; } + /// + /// Marks a tile's visual overlay as needing to be redetermined. + /// + /// A tile's overlay (how it looks like, ex. water vapor's texture) + /// is determined via determining how much gas there is on the tile. + /// This is expensive to do for every tile/gas that may have a custom overlay, + /// so its done once and only updated when it needs to be updated. + /// + /// The grid the tile is on. + /// The tile to invalidate. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void InvalidateVisuals(Entity grid, Vector2i tile) { _gasTileOverlaySystem.Invalidate(grid, tile); } + /// + /// Marks a tile's visual overlay as needing to be redetermined. + /// + /// A tile's overlay (how it looks like, ex. water vapor's texture) + /// is determined via determining how much gas there is on the tile. + /// This is expensive to do for every tile/gas that may have a custom overlay, + /// so its done once and only updated when it needs to be updated. + /// + /// The grid the tile is on. + /// The tile to invalidate. [MethodImpl(MethodImplOptions.AggressiveInlining)] private void InvalidateVisuals( Entity ent, @@ -51,7 +77,7 @@ public partial class AtmosphereSystem } /// - /// Gets the volume in liters for a number of tiles, on a specific grid. + /// Gets the volume in liters for a number of tiles, on a specific grid. /// /// The grid in question. /// The amount of tiles. @@ -79,6 +105,18 @@ public partial class AtmosphereSystem bool NoAirWhenBlocked, bool FixVacuum); + /// + /// Updates the for a + /// immediately. + /// + /// This method is extremely important if you are doing something in Atmospherics + /// that is time-sensitive! is cached and invalidated on + /// a cycle, so airtight changes performed during or after an invalidation will + /// not take effect until the next Atmospherics tick! + /// The entity the grid is on. + /// The the tile is on. + /// The the tile is on. + /// The to update. private void UpdateAirtightData(EntityUid uid, GridAtmosphereComponent atmos, MapGridComponent grid, TileAtmosphere tile) { var oldBlocked = tile.AirtightData.BlockedDirections; @@ -91,6 +129,15 @@ public partial class AtmosphereSystem ExcitedGroupDispose(atmos, tile.ExcitedGroup); } + /// + /// Retrieves current for a tile on a grid. + /// This is determined on-the-fly, not from cached data, so it will reflect + /// changes done in the current Atmospherics tick. + /// + /// The entity the grid is on. + /// The the tile is on. + /// The indices of the tile. + /// The current for the tile. private AirtightData GetAirtightData(EntityUid uid, MapGridComponent grid, Vector2i tile) { var blockedDirs = AtmosDirection.Invalid; @@ -118,7 +165,7 @@ public partial class AtmosphereSystem } /// - /// Pries a tile in a grid. + /// Pries a tile in a grid. /// /// The grid in question. /// The indices of the tile. From 5ad41205b9c5894cc2af23de38513e6c5fe1f1af Mon Sep 17 00:00:00 2001 From: Atakku Date: Mon, 10 Nov 2025 20:41:24 +0100 Subject: [PATCH 028/100] Fix aghost back slot name (#41370) One line fix to rule them all --- .../Prototypes/InventoryTemplates/aghost_inventory_template.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml index 84806a051a..1afebdcffe 100644 --- a/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml +++ b/Resources/Prototypes/InventoryTemplates/aghost_inventory_template.yml @@ -8,7 +8,7 @@ stripTime: 6 uiWindowPos: 2,1 strippingWindowPos: 2,4 - displayName: ID + displayName: Back - name: id slotTexture: id fullTextureName: template_small From b37970a6aee8fdb980e39f76ebc390240395f597 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 10 Nov 2025 23:33:53 +0100 Subject: [PATCH 029/100] Update GDPR dump script to latest migration (#41387) --- Tools/dump_user_data.py | 71 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 69 insertions(+), 2 deletions(-) diff --git a/Tools/dump_user_data.py b/Tools/dump_user_data.py index 39d23a9d3f..09f9410805 100755 --- a/Tools/dump_user_data.py +++ b/Tools/dump_user_data.py @@ -8,7 +8,7 @@ import os import psycopg2 from uuid import UUID -LATEST_DB_MIGRATION = "20230725193102_AdminNotesImprovementsForeignKeys" +LATEST_DB_MIGRATION = "20250314222016_ConstructionFavorites" def main(): parser = argparse.ArgumentParser() @@ -36,10 +36,12 @@ def main(): dump_admin_messages(cur, user_id, arg_output) dump_admin_notes(cur, user_id, arg_output) dump_admin_watchlists(cur, user_id, arg_output) + dump_blacklist(cur, user_id, arg_output) dump_connection_log(cur, user_id, arg_output) dump_play_time(cur, user_id, arg_output) dump_player(cur, user_id, arg_output) dump_preference(cur, user_id, arg_output) + dump_role_whitelists(cur, user_id, arg_output) dump_server_ban(cur, user_id, arg_output) dump_server_ban_exemption(cur, user_id, arg_output) dump_server_role_ban(cur, user_id, arg_output) @@ -257,7 +259,29 @@ FROM ( (SELECT COALESCE(json_agg(to_jsonb(trait_subq) - 'profile_id'), '[]') FROM ( SELECT * FROM trait WHERE trait.profile_id = profile.profile_id ) trait_subq) - as traits + as traits, + (SELECT COALESCE(json_agg(to_jsonb(role_loadout_subq) - 'profile_id'), '[]') FROM ( + SELECT + *, + (SELECT COALESCE(json_agg(to_jsonb(loadout_group_subq) - 'profile_role_loadout_id'), '[]') FROM ( + SELECT + *, + (SELECT COALESCE(json_agg(to_jsonb(loadout_subq) - 'profile_loadout_group_id'), '[]') FROM ( + SELECT * FROM profile_loadout WHERE profile_loadout.profile_loadout_group_id = profile_loadout_group.profile_loadout_group_id + ) loadout_subq) + as loadouts + FROM + profile_loadout_group + WHERE + profile_loadout_group.profile_role_loadout_id = profile_role_loadout.profile_role_loadout_id + ) loadout_group_subq) + as loadout_groups + FROM + profile_role_loadout + WHERE + profile_role_loadout.profile_id = profile.profile_id + ) role_loadout_subq) + as role_loadouts FROM profile WHERE @@ -395,6 +419,49 @@ FROM ( f.write(json_data) +def dump_blacklist(cur: "psycopg2.cursor", user_id: str, outdir: str): + print("Dumping blacklist...") + + cur.execute(""" +SELECT + COALESCE(json_agg(to_json(data)), '[]') #>> '{}' +FROM ( + SELECT + * + FROM + blacklist + WHERE + user_id = %s +) as data +""", (user_id,)) + + json_data = cur.fetchall()[0][0] + + with open(os.path.join(outdir, "blacklist.json"), "w", encoding="utf-8") as f: + f.write(json_data) + +def dump_role_whitelists(cur: "psycopg2.cursor", user_id: str, outdir: str): + print("Dumping role_whitelists...") + + cur.execute(""" +SELECT + COALESCE(json_agg(to_json(data)), '[]') #>> '{}' +FROM ( + SELECT + * + FROM + role_whitelists + WHERE + player_user_id = %s +) as data +""", (user_id,)) + + json_data = cur.fetchall()[0][0] + + with open(os.path.join(outdir, "role_whitelists.json"), "w", encoding="utf-8") as f: + f.write(json_data) + + def dump_admin_messages(cur: "psycopg2.cursor", user_id: str, outdir: str): print("Dumping admin_messages...") From 913d0db668c10857782d54b2f6498039d533ce5d Mon Sep 17 00:00:00 2001 From: SolidSyn Date: Mon, 10 Nov 2025 22:09:15 -0800 Subject: [PATCH 030/100] Adds the clown skirt and black lawyer suitskirt to HoPs uniform lathe (#39846) --- Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml | 2 ++ Resources/Prototypes/Recipes/Lathes/clothing.yml | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml index a0a814a7b6..6533f9fc6c 100644 --- a/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/Packs/clothing.yml @@ -126,11 +126,13 @@ - ClothingUniformJumpsuitChef - ClothingUniformJumpskirtChef - ClothingUniformJumpsuitClown + - ClothingUniformJumpskirtClown - ClothingUniformJumpsuitHydroponics - ClothingUniformJumpskirtHydroponics - ClothingUniformJumpsuitJanitor - ClothingUniformJumpskirtJanitor - ClothingUniformJumpsuitLawyerBlack + - ClothingUniformJumpskirtLawyerBlack - ClothingUniformJumpsuitLibrarian - ClothingUniformJumpskirtColorLightBrown - ClothingUniformJumpsuitMime diff --git a/Resources/Prototypes/Recipes/Lathes/clothing.yml b/Resources/Prototypes/Recipes/Lathes/clothing.yml index c5f81153e2..77648a96dd 100644 --- a/Resources/Prototypes/Recipes/Lathes/clothing.yml +++ b/Resources/Prototypes/Recipes/Lathes/clothing.yml @@ -223,6 +223,11 @@ id: ClothingUniformJumpsuitClown result: ClothingUniformJumpsuitClown +- type: latheRecipe + parent: BaseJumpsuitRecipe + id: ClothingUniformJumpskirtClown + result: ClothingUniformJumpskirtClown + ## CMO - type: latheRecipe @@ -386,6 +391,11 @@ id: ClothingUniformJumpsuitLawyerBlack result: ClothingUniformJumpsuitLawyerBlack +- type: latheRecipe + parent: BaseJumpsuitRecipe + id: ClothingUniformJumpskirtLawyerBlack + result: ClothingUniformJumpskirtLawyerBlack + ## Librarian - type: latheRecipe From f8efb72e57b33a9a9550119b1d20e972cd25d539 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 06:21:48 +0000 Subject: [PATCH 031/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 92034d6e08..e7ae3c247e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ScarKy0 - changes: - - message: APCs now have a wirepanel. It can be used to disallow the AI from accessing - it. - type: Add - id: 8694 - time: '2025-06-19T15:06:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38443 - author: Sparlight changes: - message: Smart corgis can now wear various hardsuits, armors, and glasses items. @@ -3927,3 +3919,11 @@ id: 9195 time: '2025-11-10T13:57:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41365 +- author: SolidSyn + changes: + - message: Clowns and Lawyers can now print their respective skirts and suitskirts + at a uniform lathe + type: Add + id: 9196 + time: '2025-11-11T06:20:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39846 From 0bd4f640146a33305e73c95691dc22d851b3a8fd Mon Sep 17 00:00:00 2001 From: April <1866440+April-Gras@users.noreply.github.com> Date: Tue, 11 Nov 2025 18:46:04 +0100 Subject: [PATCH 032/100] chore: added a full stop to the tooltip of the accentless speech trait (#41392) chore: added a full stop to the accentless tooltip in en-us this makes it consistent with the other tooltips --- Resources/Locale/en-US/traits/traits.ftl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Locale/en-US/traits/traits.ftl b/Resources/Locale/en-US/traits/traits.ftl index 3895ce162d..32066a2d71 100644 --- a/Resources/Locale/en-US/traits/traits.ftl +++ b/Resources/Locale/en-US/traits/traits.ftl @@ -31,7 +31,7 @@ trait-pirate-accent-name = Pirate accent trait-pirate-accent-desc = You can't stop speaking like a pirate! trait-accentless-name = Accentless -trait-accentless-desc = You don't have the accent that your species would usually have +trait-accentless-desc = You don't have the accent that your species would usually have. trait-frontal-lisp-name = Frontal lisp trait-frontal-lisp-desc = You thpeak with a lithp. From 831c53603d8126714cf85ea20ea7821fc4344d0a Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 17:58:58 +0000 Subject: [PATCH 033/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e7ae3c247e..69c3a2a8a6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Sparlight - changes: - - message: Smart corgis can now wear various hardsuits, armors, and glasses items. - type: Add - id: 8695 - time: '2025-06-19T19:49:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/36875 - author: VerinSenpai changes: - message: Handcuffs no longer interfere with your daily tail wagging activities. @@ -3927,3 +3920,10 @@ id: 9196 time: '2025-11-11T06:20:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39846 +- author: April-Gras + changes: + - message: Tool-tip punctuation for the accentless speech trait + type: Tweak + id: 9197 + time: '2025-11-11T17:57:48.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41392 From febc0f989731c06ae4d6957d6a48a5aaaa20cb4e Mon Sep 17 00:00:00 2001 From: Nox Date: Tue, 11 Nov 2025 10:49:25 -0800 Subject: [PATCH 034/100] More Resilient Grenades (#34499) * Inital commit * Balanced damage to explode instantly * Rebalanced based on suggestions * matched all grenade instant thresholds to 45 damage. Signed-off-by: Nox38 * Redid files and values Signed-off-by: Nox38 * Minor spelling mistake Signed-off-by: Nox38 * Moved abstracts and fixed typo in comments Signed-off-by: Nox38 --------- Signed-off-by: Nox38 --- .../Weapons/Throwable/base_grenades.yml | 87 ++++++++ .../Weapons/Throwable/canister_grenades.yml | 117 +++++++++++ .../Objects/Weapons/Throwable/grenades.yml | 196 +----------------- .../Weapons/Throwable/projectile_grenades.yml | 6 +- .../Weapons/Throwable/scattering_grenades.yml | 16 +- 5 files changed, 216 insertions(+), 206 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml new file mode 100644 index 0000000000..8f2f7547c0 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/base_grenades.yml @@ -0,0 +1,87 @@ +- type: entity # Starts fuse after taking 10 damage. + parent: BaseItem + abstract: true + id: GrenadeBase + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/grenade.rsi + layers: + - state: icon + map: ["enum.TriggerVisualLayers.Base"] + - type: Item + size: Small + - type: Clothing + quickEquip: false + slots: + - Belt + - type: TriggerOnUse + - type: TimerTrigger + delay: 3 + - type: Damageable + damageContainer: Inorganic + - type: Destructible + thresholds: + - trigger: # Start fuse + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - type: Appearance + - type: AnimationPlayer + - type: GenericVisualizer + visuals: + enum.Trigger.TriggerVisuals.VisualState: + enum.ConstructionVisuals.Layer: + Primed: { state: primed } + Unprimed: { state: icon } + - type: Tag + tags: + - HandGrenade + - type: Fixtures + fixtures: + fix1: + shape: !type:PhysShapeCircle + radius: 0.2 + density: 20 # derived from base_item + mask: + - ItemMask + restitution: 0.3 + friction: 0.2 + +- type: entity # Starts fuse after taking 10 damage, instantly detonates/activates after taking 45 damage. + abstract: true + id: VolatileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # immediately explode + !type:DamageTrigger + damage: 45 + behaviors: + - !type:TriggerBehavior + keyOut: timer + - !type:DoActsBehavior + acts: ["Destruction"] + +- type: entity # Starts fuse after taking 10 damage, is destroyed without activating/detonating after taking 45 damage. + abstract: true + id: FragileGrenadeBase + components: + - type: Destructible + thresholds: + - trigger: + !type:DamageTrigger + damage: 10 + behaviors: + - !type:TimerStartBehavior + - trigger: # Disappear + !type:DamageTrigger + damage: 45 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml new file mode 100644 index 0000000000..31cb00f164 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/canister_grenades.yml @@ -0,0 +1,117 @@ +- type: entity + parent: [VolatileGrenadeBase, GrenadeBase, BaseSecurityContraband ] + id: SmokeGrenade + name: smoke grenade + description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/smoke.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 30 + spreadAmount: 50 + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + positional: true + - type: DeleteOnTrigger + keysIn: + - timer + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + +- type: entity + parent: [ BaseCivilianContraband, SmokeGrenade ] + id: CleanerGrenade + name: cleanade + description: Special grenade for janitors, releasing large cloud of space cleaner foam. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/janitor.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 15 + spreadAmount: 50 + smokePrototype: Foam + solution: + reagents: + - ReagentId: SpaceCleaner + Quantity: 30 + +- type: entity + parent: SmokeGrenade + id: TearGasGrenade + name: tear gas grenade + description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/tear_gas.rsi + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 30 + smokePrototype: TearGasSmokeWhite + solution: + reagents: + - ReagentId: TearGas + Quantity: 20 + +- type: entity + parent: [ BaseEngineeringContraband, SmokeGrenade ] + id: MetalFoamGrenade + name: metal foam grenade + description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/metalfoam.rsi + - type: TimerTrigger + delay: 5 + - type: SmokeOnTrigger + keysIn: + - timer + duration: 10 + spreadAmount: 20 + smokePrototype: AluminiumMetalFoam + - type: StaticPrice + price: 350 + +- type: entity + parent: [ BaseEngineeringContraband, VolatileGrenadeBase, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade + id: AirGrenade + name: air grenade + description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! + components: + - type: Sprite + sprite: Objects/Weapons/Grenades/airboom.rsi + - type: EmitSoundOnTrigger + keysIn: + - timer + sound: /Audio/Items/smoke_grenade_smoke.ogg + - type: TimerTriggerVisuals + primingSound: + path: /Audio/Items/smoke_grenade_prime.ogg + - type: TimerTrigger + delay: 3 + - type: ReleaseGasOnTrigger + keysIn: + - timer + removeFraction: 0.25 + air: + volume: 1000 + moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) + Oxygen: 654.7464 # oxygen + Nitrogen: 2463.0936 # nitrogen + temperature: 293.15 + - type: StaticPrice + price: 350 + - type: GenericVisualizer + visuals: + enum.ReleaseGasOnTriggerVisuals.Key: + enabled: + True: { state: active } + False: { state: spent } diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index a4c0d43b9e..6fb94e1f0a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -1,60 +1,7 @@ -- type: entity - abstract: true - parent: BaseItem - id: GrenadeBase - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/grenade.rsi - layers: - - state: icon - map: ["enum.TriggerVisualLayers.Base"] - - type: Item - size: Small - - type: Clothing - quickEquip: false - slots: - - Belt - - type: TriggerOnUse - - type: TimerTrigger - delay: 3 - - type: Damageable - damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - - !type:DoActsBehavior - acts: ["Destruction"] - - type: Appearance - - type: AnimationPlayer - - type: GenericVisualizer - visuals: - enum.Trigger.TriggerVisuals.VisualState: - enum.ConstructionVisuals.Layer: - Primed: { state: primed } - Unprimed: { state: icon } - - type: Tag - tags: - - HandGrenade - - type: Fixtures - fixtures: - fix1: - shape: !type:PhysShapeCircle - radius: 0.2 - density: 20 # derived from base_item - mask: - - ItemMask - restitution: 0.3 - friction: 0.2 - - type: entity name: explosive grenade description: Grenade that creates a small but devastating explosion. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: ExGrenade components: - type: ExplodeOnTrigger @@ -77,7 +24,7 @@ - type: entity name: flashbang description: Eeeeeeeeeeeeeeeeeeeeee. - parent: [ GrenadeBase, BaseSecurityContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSecurityContraband ] id: GrenadeFlashBang components: - type: Sprite @@ -132,28 +79,13 @@ - type: entity name: syndicate minibomb description: A syndicate-manufactured explosive used to stow destruction and cause chaos. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: SyndieMiniBomb components: - type: Sprite sprite: Objects/Weapons/Grenades/syndgrenade.rsi - type: ExplosionResistance damageCoefficient: 0.1 - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TimerStartBehavior - - trigger: - !type:DamageTrigger - damage: 45 - behaviors: - - !type:TriggerBehavior - keyOut: timer # immediately explode - - !type:DoActsBehavior - acts: ["Destruction"] - type: TimerTrigger delay: 5 - type: ExplodeOnTrigger @@ -202,7 +134,7 @@ - type: entity - parent: [ GrenadeBase, BaseSyndicateContraband ] + parent: [ FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband ] id: SingularityGrenade name: singularity grenade description: Grenade that simulates the power of a singularity, pulling things in a heap. @@ -416,7 +348,7 @@ - type: entity name: EMP grenade description: A grenade designed to wreak havoc on electronic systems. - parent: [GrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, GrenadeBase, BaseSyndicateContraband] id: EmpGrenade components: - type: Sprite @@ -465,124 +397,6 @@ - type: StaticPrice price: 10000 -- type: entity - parent: [ GrenadeBase, BaseSecurityContraband ] - id: SmokeGrenade - name: smoke grenade - description: A tactical grenade that releases a large, long-lasting cloud of smoke when used. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/smoke.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 30 - spreadAmount: 50 - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - positional: true - - type: DeleteOnTrigger - keysIn: - - timer - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - -- type: entity - parent: [ BaseCivilianContraband, SmokeGrenade ] - id: CleanerGrenade - name: cleanade - description: Special grenade for janitors, releasing large cloud of space cleaner foam. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/janitor.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 15 - spreadAmount: 50 - smokePrototype: Foam - solution: - reagents: - - ReagentId: SpaceCleaner - Quantity: 30 - -- type: entity - parent: SmokeGrenade - id: TearGasGrenade - name: tear gas grenade - description: A riot control tear gas grenade. Causes irritation, pain and makes you cry your eyes out. - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/tear_gas.rsi - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 30 - smokePrototype: TearGasSmokeWhite - solution: - reagents: - - ReagentId: TearGas - Quantity: 20 - -- type: entity - parent: [ BaseEngineeringContraband, SmokeGrenade ] - id: MetalFoamGrenade - name: metal foam grenade - description: An emergency tool used for patching hull breaches with special quick-set metal foam. Almost as good as real floors! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/metalfoam.rsi - - type: TimerTrigger - delay: 5 - - type: SmokeOnTrigger - keysIn: - - timer - duration: 10 - spreadAmount: 20 - smokePrototype: AluminiumMetalFoam - - type: StaticPrice - price: 350 - -- type: entity - parent: [ BaseEngineeringContraband, GrenadeBase ] # Prevent inheriting DeleteOnTrigger from SmokeGrenade - id: AirGrenade - name: air grenade - description: A special solid state chemical grenade used for quickly releasing standard air into a spaced area. Fills up to 30 tiles! - components: - - type: Sprite - sprite: Objects/Weapons/Grenades/airboom.rsi - - type: EmitSoundOnTrigger - keysIn: - - timer - sound: /Audio/Items/smoke_grenade_smoke.ogg - - type: TimerTriggerVisuals - primingSound: - path: /Audio/Items/smoke_grenade_prime.ogg - - type: TimerTrigger - delay: 3 - - type: ReleaseGasOnTrigger - keysIn: - - timer - removeFraction: 0.25 - air: - volume: 1000 - moles: # Target is 3117.84 mols total for filling 30 tiles (goal is 101.325 kPa @ 20C) - Oxygen: 654.7464 # oxygen - Nitrogen: 2463.0936 # nitrogen - temperature: 293.15 - - type: StaticPrice - price: 350 - - type: GenericVisualizer - visuals: - enum.ReleaseGasOnTriggerVisuals.Key: - enabled: - True: { state: active } - False: { state: spent } - # Non-explosive "dummy" grenades to use as a distraction. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml index 0e8b758a13..5a3cedb901 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/projectile_grenades.yml @@ -43,7 +43,7 @@ friction: 0.2 - type: entity - parent: [ProjectileGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSecurityContraband] id: GrenadeStinger name: stinger grenade description: Nothing to see here, please disperse. @@ -77,7 +77,7 @@ path: /Audio/Effects/countdown.ogg - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeIncendiary name: incendiary grenade description: Guaranteed to light up the mood. @@ -109,7 +109,7 @@ price: 1500 - type: entity - parent: [ProjectileGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ProjectileGrenadeBase, BaseSyndicateContraband] id: GrenadeShrapnel name: shrapnel grenade description: Releases a deadly spray of shrapnel that causes severe bleeding. diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index ba2bdd230e..43ec57e068 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -10,14 +10,6 @@ cluster-payload: !type:Container - type: Damageable damageContainer: Inorganic - - type: Destructible - thresholds: - - trigger: - !type:DamageTrigger - damage: 10 - behaviors: - - !type:TriggerBehavior - keyOut: timer # explode immediately - type: ScatteringGrenade - type: TriggerOnUse - type: TimerTrigger @@ -37,7 +29,7 @@ friction: 0.2 - type: entity - parent: [ScatteringGrenadeBase, BaseSecurityContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSecurityContraband] id: ClusterBang name: clusterbang description: Can be used only with flashbangs. Explodes several times. @@ -90,7 +82,7 @@ positional: true - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [VolatileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterGrenade name: clustergrenade description: Why use one grenade when you can use three at once! @@ -120,7 +112,7 @@ price: 2500 - type: entity - parent: [ScatteringGrenadeBase, BaseSyndicateContraband] + parent: [FragileGrenadeBase, ScatteringGrenadeBase, BaseSyndicateContraband] id: ClusterBananaPeel name: cluster banana peel description: Splits into 6 explosive banana peels after throwing, guaranteed fun! @@ -175,7 +167,7 @@ price: 1000 - type: entity - parent: ScatteringGrenadeBase + parent: [FragileGrenadeBase, ScatteringGrenadeBase] id: GrenadeFoamDart name: foam dart grenade description: Releases a bothersome spray of foam darts that cause severe welching. From 7fb915a860187608a0bcb1d6c5218842c8dbe723 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 11 Nov 2025 19:02:09 +0000 Subject: [PATCH 035/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 69c3a2a8a6..420d269df6 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: VerinSenpai - changes: - - message: Handcuffs no longer interfere with your daily tail wagging activities. - type: Fix - id: 8696 - time: '2025-06-19T22:42:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38454 - author: BigfootBravo changes: - message: Chameleon Controller Implants can be deimplanted. @@ -3927,3 +3920,11 @@ id: 9197 time: '2025-11-11T17:57:48.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41392 +- author: Nox38 + changes: + - message: All grenades now start their fuse after taking 10 damage, and instantly + detonate or break after taking 45. + type: Tweak + id: 9198 + time: '2025-11-11T19:01:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/34499 From 4c9a050cdf033dc568feb87e1679f7e7b7b245ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Wed, 12 Nov 2025 01:25:35 -0600 Subject: [PATCH 036/100] Add missing plushies to AllPlushiesTable (#41398) * weh! * rare lamp * among * buff * nerf --------- Co-authored-by: iaada --- .../Prototypes/Catalog/Fills/Crates/fun.yml | 123 +++++++++++++----- .../Entities/Objects/Fun/plushies.yml | 2 + 2 files changed, 94 insertions(+), 31 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml index d35ceaa033..92dbd47cfb 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/fun.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/fun.yml @@ -2,23 +2,27 @@ id: AllPlushiesTable table: !type:GroupSelector children: - - id: PlushieBee - - id: PlushieNar - weight: 0.5 - - id: PlushieRatvar - weight: 0.5 + - !type:NestedSelector + tableId: AllLizardPlushieTable - id: PlushieNuke - id: PlushieSlime - id: PlushieSnake - id: PlushieExperiment + - id: PlushieVox + - id: PlushieRouny + - id: PlushieAtmosian + - id: PlushieDiona + - id: PlushieXeno + - id: PlushieHampter + - id: PlushieMoth + - id: PlushieArachind + - id: PlushiePenguin + - id: PlushieVulp - !type:GroupSelector children: - - id: PlushieLizard - weight: 9 - - id: PlushieSpaceLizard - weight: 1 - - id: PlushieLizardInversed - weight: 0.5 + - id: PlushieBee + - id: PlushieRGBee + weight: 0.1 - !type:GroupSelector children: - id: PlushieCarp @@ -28,21 +32,84 @@ weight: 0.25 - id: PlushieRainbowCarp weight: 0.15 - - id: PlushieVox - - id: PlushieRouny - !type:GroupSelector children: - id: PlushieSharkBlue - id: PlushieSharkGrey - id: PlushieSharkPink - - id: PlushieAtmosian - - id: PlushieDiona - - id: PlushieXeno - - id: PlushieHampter - - id: PlushieMoth - - id: PlushieArachind - - id: PlushiePenguin - - id: PlushieVulp + - !type:GroupSelector # Toy plushies + children: + - id: ToyIan + - id: ToyAmongPequeno + - id: ToyMouse + - !type:GroupSelector # Giant plushies + children: + - id: PlushieNar + - id: PlushieRatvar + - !type:GroupSelector # Rare plushies + weight: 0.1 # 1 in >210 + children: + - id: PlushieHuman + - id: PlushieGhost + - id: PlushieLamp + - !type:GroupSelector # Legendary plushies + weight: 0.002 # 1 in >10,500 + children: + - id: PlushieThrongler + - id: PlushieGhostRevenant # You got the god roll, and failed + +- type: entityTable + id: AllLizardPlushieTable + table: !type:GroupSelector + children: + - id: PlushieLizard + weight: 8 + - id: PlushieSpaceLizard + weight: 1 + - id: PlushieLizardInversed + weight: 0.1 # 1 in >100 + - !type:GroupSelector # Lizard gets a job table + children: + - id: PlushieLizardJobAtmospherictechnician + - id: PlushieLizardJobBartender + - id: PlushieLizardJobBotanist + - id: PlushieLizardJobBoxer + - id: PlushieLizardJobCaptain + - id: PlushieLizardJobCargotechnician + - id: PlushieLizardJobChaplain + - id: PlushieLizardJobChef + - id: PlushieLizardJobChemist + - id: PlushieLizardJobChiefengineer + - id: PlushieLizardJobChiefmedicalofficer + - id: PlushieLizardJobClown # :o) + - id: PlushieLizardJobDetective + - id: PlushieLizardJobHeadofpersonnel + - id: PlushieLizardJobHeadofsecurity + - id: PlushieLizardJobJanitor + - id: PlushieLizardJobLawyer + - id: PlushieLizardJobLibrarian + - id: PlushieLizardJobMedicaldoctor + - id: PlushieLizardJobMedicalintern + - id: PlushieLizardJobMime # + - id: PlushieLizardJobMusician + - id: PlushieLizardJobParamedic + - id: PlushieLizardJobPassenger + - id: PlushieLizardJobPsychologist + - id: PlushieLizardJobQuartermaster + - id: PlushieLizardJobReporter + - id: PlushieLizardJobResearchassistant + - id: PlushieLizardJobResearchdirector + - id: PlushieLizardJobSalvagespecialist + - id: PlushieLizardJobScientist + - id: PlushieLizardJobSecuritycadet + - id: PlushieLizardJobSecurityofficer + - id: PlushieLizardJobServiceworker + - id: PlushieLizardJobStationengineer + - id: PlushieLizardJobTechnicalassistant + - id: PlushieLizardJobZookeeper + - id: PlushieLizardJobMultiweh + weight: 0.5 # 1 in >800 + - type: entityTable id: AllPottedPlantsTable @@ -108,16 +175,10 @@ components: - type: EntityTableContainerFill containers: - entity_storage: !type:AllSelector - children: - - id: PlushieLizard - amount: !type:ConstantNumberSelector - value: 3 - - id: PlushieSpaceLizard - amount: !type:ConstantNumberSelector - value: 3 - - id: PlushieLizardJobMultiweh # the exceedingly rare multiweh! - prob: 0.01 + entity_storage: !type:NestedSelector + tableId: AllLizardPlushieTable + rolls: !type:ConstantNumberSelector + value: 6 - type: entity id: CrateFunSharkPlushieBulk diff --git a/Resources/Prototypes/Entities/Objects/Fun/plushies.yml b/Resources/Prototypes/Entities/Objects/Fun/plushies.yml index 2e9f231e90..a22d26c6f7 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/plushies.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/plushies.yml @@ -1,3 +1,5 @@ +# When adding new plushies, also add them to id: AllPlushiesTable + ## Plushies - type: entity From 70e9523b6e7be660e38fe18404e4d41470e36041 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 07:38:48 +0000 Subject: [PATCH 037/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 420d269df6..57e41baa03 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: BigfootBravo - changes: - - message: Chameleon Controller Implants can be deimplanted. - type: Fix - id: 8697 - time: '2025-06-20T22:41:11.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38439 - author: FairlySadPanda changes: - message: A new poster. @@ -3928,3 +3921,11 @@ id: 9198 time: '2025-11-11T19:01:01.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/34499 +- author: aada + changes: + - message: Employed lizard plushies can now be found in bulk lizard plushie crates + and maintenance closets. + type: Tweak + id: 9199 + time: '2025-11-12T07:37:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41398 From c079fdfbba477a2dbd4df17ad3be97d1c0e97084 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Wed, 12 Nov 2025 21:24:24 +1100 Subject: [PATCH 038/100] Bandaid solution name setter events (#41400) Ideally PDAs + IDs wouldn't be doing this but this is slamming it out. --- .../Chemistry/EntitySystems/SharedSolutionContainerSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs index cd38df021d..892e4e9cac 100644 --- a/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SharedSolutionContainerSystem.cs @@ -1217,7 +1217,7 @@ public abstract partial class SharedSolutionContainerSystem : EntitySystem var relation = new ContainedSolutionComponent() { Container = container.Owner, ContainerName = name }; AddComp(uid, relation); - MetaDataSys.SetEntityName(uid, $"solution - {name}"); + MetaDataSys.SetEntityName(uid, $"solution - {name}", raiseEvents: false); ContainerSystem.Insert(uid, container, force: true); return (uid, solution, relation); From 3a1720c48fea987b3409e97da305d4e382186681 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:26:29 +1300 Subject: [PATCH 039/100] Fix admin log exception (#41242) Fix admin logs --- Content.Shared/Administration/Logs/LogStringHandler.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Content.Shared/Administration/Logs/LogStringHandler.cs b/Content.Shared/Administration/Logs/LogStringHandler.cs index 9b65c6d723..2fab949d58 100644 --- a/Content.Shared/Administration/Logs/LogStringHandler.cs +++ b/Content.Shared/Administration/Logs/LogStringHandler.cs @@ -40,7 +40,8 @@ public ref struct LogStringHandler format = argument[0] == '@' ? argument[1..] : argument; } - if (Values.TryAdd(Logger.ConvertName(format), value) + format = Logger.ConvertName(format); + if (Values.TryAdd(format, value) || Values[format] is T val && val.Equals(value) ) { return; @@ -50,7 +51,7 @@ public ref struct LogStringHandler var i = 2; format = $"{originalFormat}_{i}"; - while (!(Values.TryAdd(Logger.ConvertName(format), value) + while (!(Values.TryAdd(format, value) || Values[format] is T val2 && val2.Equals(value))) { format = $"{originalFormat}_{i}"; From c6e307ea7100ecda5bdce1edddac8d7e9c1ae93c Mon Sep 17 00:00:00 2001 From: PicklOH <62030853+PicklOH@users.noreply.github.com> Date: Wed, 12 Nov 2025 11:19:58 -0500 Subject: [PATCH 040/100] Make DAGD more likely but restrict it to 1 traitor per round (#41402) --- Resources/Prototypes/Objectives/objectiveGroups.yml | 2 +- Resources/Prototypes/Objectives/traitor.yml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index a24e0f5dd3..31ef38f428 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -34,7 +34,7 @@ id: TraitorObjectiveGroupState weights: EscapeShuttleObjective: 1 - DieObjective: 0.05 + DieObjective: 0.2 #HijackShuttleObjective: 0.02 - type: weightedRandom diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index 1d6fab6998..d833f0e9c2 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -64,6 +64,8 @@ - EscapeShuttleCondition - StealCondition - type: DieCondition + - type: ObjectiveLimit + limit: 1 #- type: entity # parent: [BaseTraitorObjective, BaseLivingObjective] From 512f86a0f0d557dd5c6963597236727ae249f992 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 16:32:49 +0000 Subject: [PATCH 041/100] 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 57e41baa03..c8bf3b4976 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: FairlySadPanda - changes: - - message: A new poster. - type: Add - - message: A new (very expensive) crate to order from cargo, worth 25,000 spesos - and containing a hydrated scurret. The hydrated scurret is a ghost role - a - non-antagonistic emotional support scurret. - type: Add - id: 8698 - time: '2025-06-20T23:39:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38218 - author: Tayrtahn changes: - message: Sloths... now... speak... slowly... @@ -3929,3 +3918,10 @@ id: 9199 time: '2025-11-12T07:37:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41398 +- author: PicklOH + changes: + - message: Make DAGD more likely but restrict it to 1 traitor per round + type: Tweak + id: 9200 + time: '2025-11-12T16:31:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41402 From 8c9c6dad823428fd58ace23e175245a2422d5ef9 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Thu, 13 Nov 2025 00:10:48 +0100 Subject: [PATCH 042/100] Add keybinds for openening a specified component in VV (#41348) * quick inspect * Update Content.Client/Commands/QuickInspectCommand.cs Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> * documentation!!! --------- Co-authored-by: Kyle Tyo <36606155+VerinSenpai@users.noreply.github.com> --- .../Commands/QuickInspectCommand.cs | 52 +++++++++++++++++++ Content.Client/Gameplay/GameplayStateBase.cs | 20 +++++++ Content.Client/Input/ContentContexts.cs | 2 + .../Options/UI/Tabs/KeyRebindTab.xaml.cs | 2 + Content.Shared/CCVar/CCVars.Debug.cs | 13 +++++ Content.Shared/Input/ContentKeyFunctions.cs | 3 +- .../en-US/commands/quick-inspect-command.ftl | 5 ++ .../en-US/escape-menu/ui/options-menu.ftl | 5 ++ Resources/clientCommandPerms.yml | 1 + Resources/keybinds.yml | 8 +++ 10 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 Content.Client/Commands/QuickInspectCommand.cs create mode 100644 Content.Shared/CCVar/CCVars.Debug.cs create mode 100644 Resources/Locale/en-US/commands/quick-inspect-command.ftl diff --git a/Content.Client/Commands/QuickInspectCommand.cs b/Content.Client/Commands/QuickInspectCommand.cs new file mode 100644 index 0000000000..dc3aae615a --- /dev/null +++ b/Content.Client/Commands/QuickInspectCommand.cs @@ -0,0 +1,52 @@ +using System.Linq; +using Content.Shared.CCVar; +using Content.Shared.Input; +using Robust.Client.Input; +using Robust.Shared.Configuration; +using Robust.Shared.Console; + +namespace Content.Client.Commands; + +/// +/// Sets the a CVar to the name of a component, which allows the client to quickly open a VV window for that component +/// by using the Alt+C or Alt+B hotkeys. +/// +public sealed class QuickInspectCommand : LocalizedEntityCommands +{ + [Dependency] private readonly IConfigurationManager _configurationManager = default!; + [Dependency] private readonly IInputManager _inputManager = default!; + + public override string Command => "quickinspect"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length != 1) + { + shell.WriteLine(Loc.GetString("shell-wrong-arguments-number")); + return; + } + + _configurationManager.SetCVar(CCVars.DebugQuickInspect, args[0]); + + var serverKey = _inputManager.GetKeyFunctionButtonString(ContentKeyFunctions.InspectServerComponent); + var clientKey = _inputManager.GetKeyFunctionButtonString(ContentKeyFunctions.InspectClientComponent); + shell.WriteLine(Loc.GetString($"cmd-quickinspect-success", ("component", args[0]), ("serverKeybind", serverKey), ("clientKeybind", clientKey))); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + if (args.Length == 1) + { + // Not ideal since it only shows client-side components, but you can still type in any name you want. + // If you know how to get server component names on the client then please fix this. + var options = EntityManager.ComponentFactory.AllRegisteredTypes + .Select(p => new CompletionOption( + EntityManager.ComponentFactory.GetComponentName(p) + )); + + return CompletionResult.FromOptions(options); + } + + return CompletionResult.Empty; + } +} diff --git a/Content.Client/Gameplay/GameplayStateBase.cs b/Content.Client/Gameplay/GameplayStateBase.cs index 69e6e0b58b..c2b10fd01a 100644 --- a/Content.Client/Gameplay/GameplayStateBase.cs +++ b/Content.Client/Gameplay/GameplayStateBase.cs @@ -3,6 +3,7 @@ using System.Numerics; using Content.Client.Clickable; using Content.Client.UserInterface; using Content.Client.Viewport; +using Content.Shared.CCVar; using Content.Shared.Input; using Robust.Client.ComponentTrees; using Robust.Client.GameObjects; @@ -13,6 +14,7 @@ using Robust.Client.State; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; +using Robust.Shared.Configuration; using Robust.Shared.Console; using Robust.Shared.Graphics; using Robust.Shared.Input; @@ -40,6 +42,7 @@ namespace Content.Client.Gameplay [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IViewVariablesManager _vvm = default!; [Dependency] private readonly IConsoleHost _conHost = default!; + [Dependency] private readonly IConfigurationManager _configurationManager = default!; private ClickableEntityComparer _comparer = default!; @@ -83,6 +86,8 @@ namespace Content.Client.Gameplay _comparer = new ClickableEntityComparer(); CommandBinds.Builder .Bind(ContentKeyFunctions.InspectEntity, new PointerInputCmdHandler(HandleInspect, outsidePrediction: true)) + .Bind(ContentKeyFunctions.InspectServerComponent, new PointerInputCmdHandler(HandleInspectServerComponent, outsidePrediction: true)) + .Bind(ContentKeyFunctions.InspectClientComponent, new PointerInputCmdHandler(HandleInspectClientComponent, outsidePrediction: true)) .Register(); } @@ -99,6 +104,21 @@ namespace Content.Client.Gameplay return true; } + private bool HandleInspectServerComponent(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + var component = _configurationManager.GetCVar(CCVars.DebugQuickInspect); + if (_entityManager.TryGetNetEntity(uid, out var net)) + _conHost.ExecuteCommand($"vv /entity/{net.Value.Id}/{component}"); + return true; + } + + private bool HandleInspectClientComponent(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + var component = _configurationManager.GetCVar(CCVars.DebugQuickInspect); + _conHost.ExecuteCommand($"vv /c/entity/{uid}/{component}"); + return true; + } + public EntityUid? GetClickedEntity(MapCoordinates coordinates) { return GetClickedEntity(coordinates, _eyeManager.CurrentEye); diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 47f0cda2f6..01e7dc367c 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,8 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.InspectServerComponent); + common.AddFunction(ContentKeyFunctions.InspectClientComponent); common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index f92f66df31..40d1836c08 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -268,6 +268,8 @@ namespace Content.Client.Options.UI.Tabs AddButton(EngineKeyFunctions.ShowDebugMonitors); AddButton(EngineKeyFunctions.HideUI); AddButton(ContentKeyFunctions.InspectEntity); + AddButton(ContentKeyFunctions.InspectServerComponent); + AddButton(ContentKeyFunctions.InspectClientComponent); AddHeader("ui-options-header-text-cursor"); AddButton(EngineKeyFunctions.TextCursorLeft); diff --git a/Content.Shared/CCVar/CCVars.Debug.cs b/Content.Shared/CCVar/CCVars.Debug.cs new file mode 100644 index 0000000000..a95acc4dac --- /dev/null +++ b/Content.Shared/CCVar/CCVars.Debug.cs @@ -0,0 +1,13 @@ +using Robust.Shared.Configuration; + +namespace Content.Shared.CCVar; + +public sealed partial class CCVars +{ + /// + /// Component to be inspected using the "Quick Inspect Component" keybind. + /// Set by the "quickinspect" command. + /// + public static readonly CVarDef DebugQuickInspect = + CVarDef.Create("debug.quick_inspect", "", CVar.CLIENTONLY | CVar.ARCHIVE); +} diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index 50ea218b00..63f6310322 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -123,7 +123,8 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction EditorCopyObject = "EditorCopyObject"; public static readonly BoundKeyFunction EditorFlipObject = "EditorFlipObject"; public static readonly BoundKeyFunction InspectEntity = "InspectEntity"; - + public static readonly BoundKeyFunction InspectServerComponent = "InspectServerComponent"; + public static readonly BoundKeyFunction InspectClientComponent = "InspectClientComponent"; public static readonly BoundKeyFunction MappingUnselect = "MappingUnselect"; public static readonly BoundKeyFunction SaveMap = "SaveMap"; public static readonly BoundKeyFunction MappingEnablePick = "MappingEnablePick"; diff --git a/Resources/Locale/en-US/commands/quick-inspect-command.ftl b/Resources/Locale/en-US/commands/quick-inspect-command.ftl new file mode 100644 index 0000000000..e057fd982f --- /dev/null +++ b/Resources/Locale/en-US/commands/quick-inspect-command.ftl @@ -0,0 +1,5 @@ +cmd-quickinspect-desc = Sets a component name to be opened for a hovered entity via the "Inspect Server/Client Component" keybind. +cmd-quickinspect-help = Usage: {$command} +cmd-quickinspect-success = Component set to: {$component}. + Press {$serverKeybind} to open a VV window for the server. + Press {$clientKeybind} to open a VV window for the client. diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 98ee2543c1..a263e52229 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -227,6 +227,11 @@ ui-options-function-editor-copy-object = Copy ui-options-function-show-debug-console = Open Console ui-options-function-show-debug-monitors = Show Debug Monitors ui-options-function-inspect-entity = Inspect Entity +ui-options-function-inspect-entity-tooltip = Open a ViewVariables window for the entity your mouse is currently hovering over. +ui-options-function-inspect-server-component = Inspect Server Component +ui-options-function-inspect-server-component-tooltip = Open a ViewVariables window with the server component set by the "quickinspect" command for the entity your mouse is currently hovering over. +ui-options-function-inspect-client-component = Inspect Client Component +ui-options-function-inspect-client-component-tooltip = Open a ViewVariables window with the client component set by the "quickinspect" command for the entity your mouse is currently hovering over. ui-options-function-hide-ui = Hide UI ui-options-function-hotbar1 = Hotbar slot 1 diff --git a/Resources/clientCommandPerms.yml b/Resources/clientCommandPerms.yml index d83fdcc353..a177bc5fe1 100644 --- a/Resources/clientCommandPerms.yml +++ b/Resources/clientCommandPerms.yml @@ -74,6 +74,7 @@ - fullstatereset - dumpentities - showaccessreaders + - quickinspect - Flags: MAPPING Commands: diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 870c8e1435..aa7b2918e1 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -281,6 +281,14 @@ binds: type: State key: v mod1: Alt +- function: InspectServerComponent + type: State + key: b + mod1: Alt +- function: InspectClientComponent + type: State + key: c + mod1: Alt - function: MouseMiddle type: State key: MouseMiddle From 4109fdbea8c1748a3f48973562a8b6544c7295e1 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 12 Nov 2025 23:23:38 +0000 Subject: [PATCH 043/100] Automatic changelog update --- Resources/Changelog/Admin.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index 2a80134c15..a342132f68 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1505,5 +1505,13 @@ Entries: id: 183 time: '2025-11-03T13:16:43.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41261 +- author: slarticodefast + changes: + - message: Added the "quickinspect" command to quickly inspect the selected component + for an entity via a keybind. + type: Add + id: 184 + time: '2025-11-12T23:22:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41348 Name: Admin Order: 3 From 44e5073d32b6b6573b9082d1860d134ce9b5325b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Thu, 13 Nov 2025 23:50:17 +1300 Subject: [PATCH 044/100] Update RaiseEventBenchmark for engine changes (#37349) * Update RaiseEventBenchmark * fix test * poke_tests --- Content.Benchmarks/RaiseEventBenchmark.cs | 26 +++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/Content.Benchmarks/RaiseEventBenchmark.cs b/Content.Benchmarks/RaiseEventBenchmark.cs index 4c4e0d9125..e3d377ccb3 100644 --- a/Content.Benchmarks/RaiseEventBenchmark.cs +++ b/Content.Benchmarks/RaiseEventBenchmark.cs @@ -23,6 +23,8 @@ public class RaiseEventBenchmark PoolManager.Startup(typeof(BenchSystem).Assembly); _pair = PoolManager.GetServerClient().GetAwaiter().GetResult(); var entMan = _pair.Server.EntMan; + var fact = _pair.Server.ResolveDependency(); + var bus = (EntityEventBus)entMan.EventBus; _sys = entMan.System(); _pair.Server.WaitPost(() => @@ -30,6 +32,8 @@ public class RaiseEventBenchmark var uid = entMan.Spawn(); _sys.Ent = new(uid, entMan.GetComponent(uid)); _sys.Ent2 = new(_sys.Ent.Owner, _sys.Ent.Comp); + _sys.NetId = fact.GetRegistration().NetID!.Value; + _sys.EvSubs = bus.GetNetCompEventHandlers(); }) .GetAwaiter() .GetResult(); @@ -60,6 +64,12 @@ public class RaiseEventBenchmark return _sys.RaiseICompEvent(); } + [Benchmark] + public int RaiseNetEvent() + { + return _sys.RaiseNetIdEvent(); + } + [Benchmark] public int RaiseCSharpEvent() { @@ -74,6 +84,8 @@ public class RaiseEventBenchmark public delegate void EntityEventHandler(EntityUid uid, TransformComponent comp, ref BenchEv ev); public event EntityEventHandler? OnCSharpEvent; + public ushort NetId; + internal EntityEventBus.DirectedEventHandler?[] EvSubs = default!; public override void Initialize() { @@ -92,7 +104,7 @@ public class RaiseEventBenchmark public int RaiseCompEvent() { var ev = new BenchEv(); - EntityManager.EventBus.RaiseComponentEvent(Ent.Owner, Ent.Comp, ref ev); + RaiseComponentEvent(Ent.Owner, Ent.Comp, ref ev); return ev.N; } @@ -100,7 +112,16 @@ public class RaiseEventBenchmark { // Raise with an IComponent instead of concrete type var ev = new BenchEv(); - EntityManager.EventBus.RaiseComponentEvent(Ent2.Owner, Ent2.Comp, ref ev); + RaiseComponentEvent(Ent2.Owner, Ent2.Comp, ref ev); + return ev.N; + } + + public int RaiseNetIdEvent() + { + // Raise a "IComponent" event using a net-id index delegate array (for PVS & client game-state events) + var ev = new BenchEv(); + ref var unitEv = ref Unsafe.As(ref ev); + EvSubs[NetId]?.Invoke(Ent2.Owner, Ent2.Comp, ref unitEv); return ev.N; } @@ -118,6 +139,7 @@ public class RaiseEventBenchmark } [ByRefEvent] + [ComponentEvent(Exclusive = false)] public struct BenchEv { public int N; From ae6c4880396be75cfd036824ec85b243841bc0e3 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Thu, 13 Nov 2025 22:02:04 +1100 Subject: [PATCH 045/100] Update engine submodule to 268.0.0 (#41408) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index c95b4320cf..dbde8023ed 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit c95b4320cfda1f54ea1e26023c9e73e85c57b820 +Subproject commit dbde8023ed256ac69ae4b419422c936f78361653 From a76b6213a94e0cf0a68447301c087cf89d99dfe2 Mon Sep 17 00:00:00 2001 From: BeBright <98597725+bebr3ght@users.noreply.github.com> Date: Thu, 13 Nov 2025 19:24:28 +0300 Subject: [PATCH 046/100] MingGetBriefing -> MindGetBriefing (#41413) Co-authored-by: BeBright <98597725+be1bright@users.noreply.github.com> --- Content.Server/Roles/RoleSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Roles/RoleSystem.cs b/Content.Server/Roles/RoleSystem.cs index 71fb8a9cb5..abf9dd50ec 100644 --- a/Content.Server/Roles/RoleSystem.cs +++ b/Content.Server/Roles/RoleSystem.cs @@ -15,7 +15,7 @@ public sealed class RoleSystem : SharedRoleSystem { if (mindId == null) { - Log.Error($"MingGetBriefing failed for mind {mindId}"); + Log.Error($"MindGetBriefing failed for mind {mindId}"); return null; } @@ -23,7 +23,7 @@ public sealed class RoleSystem : SharedRoleSystem if (mindComp is null) { - Log.Error($"MingGetBriefing failed for mind {mindId}"); + Log.Error($"MindGetBriefing failed for mind {mindId}"); return null; } From 227dcf248689fdb3e7475a4945381f93dc2370f5 Mon Sep 17 00:00:00 2001 From: Minemoder5000 Date: Thu, 13 Nov 2025 11:11:43 -0700 Subject: [PATCH 047/100] Fix Amber's Escape Shuttle Warp Point (#41417) replace warp point with ghost warp point --- Resources/Maps/Shuttles/emergency_amber.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Maps/Shuttles/emergency_amber.yml b/Resources/Maps/Shuttles/emergency_amber.yml index e0973ef3d7..e6b56f437a 100644 --- a/Resources/Maps/Shuttles/emergency_amber.yml +++ b/Resources/Maps/Shuttles/emergency_amber.yml @@ -4911,7 +4911,7 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,-13.5 parent: 1 -- proto: WarpPoint +- proto: GhostWarpPoint entities: - uid: 426 components: From 8c3111cffd99974752268d567ffc8403561c11df Mon Sep 17 00:00:00 2001 From: MissKay1994 <15877268+MissKay1994@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:27:56 -0500 Subject: [PATCH 048/100] Briefcase gun for lawyers (#40210) * definitely not a gun * You only imagined this tag * Brace with your gut * Definitely did not procrastinate for eternity * Suing javascript formatting * Tear down the system * Yay for hardcoding * EVIL COURT * Attributions for skreee * Move new sprites into own folder --------- Co-authored-by: SlamBamActionman --- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 17 ++++++++ .../Objects/Weapons/Guns/SMGs/smgs.yml | 39 ++++++++++++++++++ .../Weapons/Guns/SMGs/briefcase.rsi/base.png | Bin 0 -> 342 bytes .../Guns/SMGs/briefcase.rsi/bolt-open.png | Bin 0 -> 342 bytes .../Guns/SMGs/briefcase.rsi/icon-muzzle.png | Bin 0 -> 103 bytes .../SMGs/briefcase.rsi/inhand-left-muzzle.png | Bin 0 -> 116 bytes .../briefcase.rsi/inhand-right-muzzle.png | Bin 0 -> 115 bytes .../Weapons/Guns/SMGs/briefcase.rsi/meta.json | 28 +++++++++++++ 9 files changed, 87 insertions(+) create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/bolt-open.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/icon-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-right-muzzle.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 7ae8ddd4f9..3e070b835d 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -498,3 +498,6 @@ uplink-smuggler-satchel-desc = A handy, suspicious looking satchel. Just flat en uplink-acolyte-armor-name = Acolyte Armor uplink-acolyte-armor-desc = The must have of any self respecting cult leader. An evil looking piece of armor, made of bones, and surprisingly resistant to damage. + +uplink-briefcase-gun-name = Briefcase Gun +uplink-briefcase-gun-desc = An indistinct briefcase with a highly compact C-20K mounted inside it. Careful not the grip the handle too tight! diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index f245b1082c..6ef1720105 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -2301,3 +2301,20 @@ - !type:BuyerJobCondition whitelist: - MedicalDoctor + +- type: listing + id: uplinkBriefcaseGun + name: uplink-briefcase-gun-name + description: uplink-briefcase-gun-desc + productEntity: WeaponSubMachineGunBriefcase + discountCategory: veryRareDiscounts + discountDownTo: + Telecrystal: 10 + cost: + Telecrystal: 15 + categories: + - UplinkJob + conditions: + - !type:BuyerJobCondition + whitelist: + - Lawyer diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 15ddb7b38e..4ca2e0c0f5 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -283,3 +283,42 @@ steps: 6 zeroVisible: true - type: Appearance + +- type: entity + name: brown briefcase + parent: [BaseWeaponSubMachineGun] + id: WeaponSubMachineGunBriefcase + description: Useful for carrying items in your hands. + suffix: Gun + components: + - type: Item + size: Ginormous + inhandVisuals: + left: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: inhand-left + - state: inhand-left-muzzle + right: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: inhand-right + - state: inhand-right-muzzle + - type: Sprite + sprite: Objects/Weapons/Guns/SMGs/briefcase.rsi + layers: + - sprite: Objects/Storage/Briefcases/briefcase_brown.rsi + state: icon + - state: icon-muzzle + map: ["enum.GunVisualLayers.Base"] + - type: Gun + fireRate: 9 + minAngle: 25 + maxAngle: 32 + availableModes: + - FullAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/atreides.ogg + - type: ChamberMagazineAmmoProvider + autoEject: false + - type: Appearance + - type: StaticPrice + price: 5000 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..6f164336daa0cdbea236f7251e0fed37c2276aa5 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U=;9l zaSVxQO-_(tU7R4&(=?G!;^f6A3r>BMpZ%lpw!Md0f2+*tt4AUwcid1YtNq>jXxjfJ zR!u4F2M)9z-~Yg_&9Y0z;R54}gS~I6Q!Mq&+}Ktq8!TdvU-5ufk3F>SKij4p9uWBb zt|qM@=%MP9IG)n&^Xig*eCuaku3XT@aHd>b?tfCn_s{Cig|k?k->(tpaeDK{LihMG zKi@giA6`3s-{Pym!_U2qI?~KKEOXB63^=kOv840}!<@hdnLj)pj@{E<1u}?BD|?AJ z2x~PrYrWGrAkD;cA?MrM>-B8hmU4Th9lo+?HMjY*W2@QMGjl|G@a|=CZn&0kh4Jux sMt%FgOV?;DyTbS+FVdQ&MBb@0N8VjivR!s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/bolt-open.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/bolt-open.png new file mode 100644 index 0000000000000000000000000000000000000000..6f164336daa0cdbea236f7251e0fed37c2276aa5 GIT binary patch literal 342 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U=;9l zaSVxQO-_(tU7R4&(=?G!;^f6A3r>BMpZ%lpw!Md0f2+*tt4AUwcid1YtNq>jXxjfJ zR!u4F2M)9z-~Yg_&9Y0z;R54}gS~I6Q!Mq&+}Ktq8!TdvU-5ufk3F>SKij4p9uWBb zt|qM@=%MP9IG)n&^Xig*eCuaku3XT@aHd>b?tfCn_s{Cig|k?k->(tpaeDK{LihMG zKi@giA6`3s-{Pym!_U2qI?~KKEOXB63^=kOv840}!<@hdnLj)pj@{E<1u}?BD|?AJ z2x~PrYrWGrAkD;cA?MrM>-B8hmU4Th9lo+?HMjY*W2@QMGjl|G@a|=CZn&0kh4Jux sMt%FgOV?;DyTbS+FVdQ&MBb@0N8VjivR!s literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/icon-muzzle.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/icon-muzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..26f4220ea4a38c519aa9b0aa3543c86a42355441 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U{LgQ zaSVxQeS40Pmw|zUdBJ!6wTAE1R1_E)DiUrnGVI7@G>Kzms6J$5&A`CG;OXk;vd$@? F2>^%V8BhQK literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-left-muzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..6d2b28171b898fed54b71a952a99d2111e3c3e1f GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z@X>p z;uumf=j}N|UIqpZ<_$m1dDW&BT+qs3VgLb=Go>I3f`8;PK0D3G(6e>QMv#D~tDnm{ Hr-UW|+6WwI literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-right-muzzle.png b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/inhand-right-muzzle.png new file mode 100644 index 0000000000000000000000000000000000000000..1d8ef0837098ba670630170bbe094314716d31c4 GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEk44ofy`glX=O&z@Y2t z;uumf=k2+Lj0_AM%nSbh-}23LGOL~fBLfJWs$mCF5WG%IY8fNL#lSghKzvVEKbLh* G2~7a$H5>T= literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json new file mode 100644 index 0000000000..3aaf214aae --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/SMGs/briefcase.rsi/meta.json @@ -0,0 +1,28 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "briefcase base made by ps3moira (github) and modified by MissKay1994(github), weapon states by MissKay1994(github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon-muzzle" + }, + { + "name": "inhand-left-muzzle", + "directions": 4 + }, + { + "name": "inhand-right-muzzle", + "directions": 4 + }, + { + "name": "bolt-open" + }, + { + "name": "base" + } + ] +} From 3bbd08d88927690408119088a52e8813a852f362 Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 13 Nov 2025 21:40:35 +0000 Subject: [PATCH 049/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c8bf3b4976..ac1ed4ef8b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Tayrtahn - changes: - - message: Sloths... now... speak... slowly... - type: Add - id: 8699 - time: '2025-06-21T06:32:30.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38142 - author: whatston3 changes: - message: Locked buttons must now be unlocked to trigger. @@ -3925,3 +3918,10 @@ id: 9200 time: '2025-11-12T16:31:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41402 +- author: MissKay1994 + changes: + - message: Added a new briefcase gun to the lawyer job's uplink. + type: Add + id: 9201 + time: '2025-11-13T21:39:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40210 From 31ade640d0c6898ec05391d16a746c449404b76c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Thu, 13 Nov 2025 17:56:17 -0600 Subject: [PATCH 050/100] RandomTriggerOnTriggerComponent (#41422) * commit * rename * prevent recusion --------- Co-authored-by: iaada --- .../RandomTriggerOnTriggerComponent.cs | 21 ++++++++++ .../Systems/RandomTriggerOnTriggerSystem.cs | 38 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs new file mode 100644 index 0000000000..f7d8c5036c --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/RandomTriggerOnTriggerComponent.cs @@ -0,0 +1,21 @@ +using Content.Shared.Random; +using Content.Shared.Trigger.Components.Triggers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// When triggered this component will choose a key and send a new trigger. +/// Trigger is sent to user if is true. +/// +/// Does not support recursive loops where this component triggers itself. Use instead. +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RandomTriggerOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The trigger keys and their weights. + /// + [DataField(required: true), AutoNetworkedField] + public ProtoId RandomKeyOut; +} diff --git a/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs new file mode 100644 index 0000000000..75acc005d0 --- /dev/null +++ b/Content.Shared/Trigger/Systems/RandomTriggerOnTriggerSystem.cs @@ -0,0 +1,38 @@ +using Content.Shared.Random.Helpers; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; + +namespace Content.Shared.Trigger.Systems; + +public sealed class RandomTriggerOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TriggerSystem _trigger = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + // TODO: Replace with RandomPredicted once the engine PR is merged + var hash = new List + { + (int)_timing.CurTick.Value, + GetNetEntity(ent).Id, + args.User == null ? 0 : GetNetEntity(args.User.Value).Id, + }; + var seed = SharedRandomExtensions.HashCodeCombine(hash); + var rand = new System.Random(seed); + + var keyOut = _prototypeManager.Index(ent.Comp.RandomKeyOut).Pick(rand); + + // Prevent recursive triggers + if (target == ent.Owner && ent.Comp.KeysIn.Contains(keyOut)) + { + Log.Warning($"{ToPrettyString(ent)} attempted to recursively trigger itself using RandomTriggerOnTriggerComponent."); + return; + } + + _trigger.Trigger(target, args.User, keyOut); + args.Handled = true; + } +} From d87677323e31445cf1fe979fd3b71aa4280297b6 Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Fri, 14 Nov 2025 06:03:57 -0500 Subject: [PATCH 051/100] Security IDs no longer have Service access by default (#41411) --- Resources/Prototypes/Roles/Jobs/Security/detective.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/security_officer.yml | 1 - Resources/Prototypes/Roles/Jobs/Security/warden.yml | 1 - 5 files changed, 5 deletions(-) diff --git a/Resources/Prototypes/Roles/Jobs/Security/detective.yml b/Resources/Prototypes/Roles/Jobs/Security/detective.yml index 03db499c8c..5b84597e2a 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/detective.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/detective.yml @@ -15,7 +15,6 @@ - Security - Brig - Maintenance - - Service - Detective - Cryogenics - External diff --git a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml index 1f73f48988..a0d3ef5845 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/head_of_security.yml @@ -28,7 +28,6 @@ - Security - Armory - Maintenance - - Service - External - Detective - Cryogenics diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml index de7e6d9544..52b63f1ab2 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_cadet.yml @@ -18,7 +18,6 @@ - Security - Brig - Maintenance - - Service - External - Cryogenics - GenpopEnter diff --git a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml index 1b60a527b0..7c140c8ee9 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/security_officer.yml @@ -15,7 +15,6 @@ - Security - Brig - Maintenance - - Service - External - Cryogenics - GenpopEnter diff --git a/Resources/Prototypes/Roles/Jobs/Security/warden.yml b/Resources/Prototypes/Roles/Jobs/Security/warden.yml index 630afcd684..2d8813a69e 100644 --- a/Resources/Prototypes/Roles/Jobs/Security/warden.yml +++ b/Resources/Prototypes/Roles/Jobs/Security/warden.yml @@ -20,7 +20,6 @@ - Brig - Armory - Maintenance - - Service - External - Detective - Cryogenics From eccd95690fc4e65e056a9668653aa28d98d69ae4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 14 Nov 2025 11:16:31 +0000 Subject: [PATCH 052/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index ac1ed4ef8b..a14519ab1d 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: whatston3 - changes: - - message: Locked buttons must now be unlocked to trigger. - type: Fix - id: 8700 - time: '2025-06-21T09:41:04.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38474 - author: slarticodefast changes: - message: Fixed wallmount interaction rotation. @@ -3925,3 +3918,10 @@ id: 9201 time: '2025-11-13T21:39:28.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40210 +- author: Hitlinemoss + changes: + - message: Security IDs no longer have Service access by default. + type: Remove + id: 9202 + time: '2025-11-14T11:15:22.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41411 From e5daa54e79d8b3c0d20e358cb34d5ad7a0c5a2ef Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Fri, 14 Nov 2025 19:10:09 -0300 Subject: [PATCH 053/100] Xenoborgs part 7 (#40042) * add mothership module * option for mothership to open self UI * fix mothership module * remove mothership body * swapp real hands for modules * action sprite for mothership module * removed hands from mothership core sprite * xenoborgs now drop a pinpointer to the mothership core once destroyed * add pinpointer to space movment module * add base for XenoborgRule * add xenoborg antag option * something was needed * something else was needed * add ghost role spawn points * change name in antag selection to Xenoborg Core * add random spawnPoint markers that don't do anything * add spawn points to mothership * update spawn points * add xenoborgs rule * add xenoborgs rule to rotation * add xenoborgs preset * update preset with secret version also added xenoborg mode description * modify Antag Selection system to allow for custom entities via the AntagSelectionDefinition * fix ghostroles spawners * fix rule with new entityPrototype * add spawnpoints to the mothership * whitelist system to spawnpoints * updated xenoborg components * added xenoborg component to xenoborgs * updated spawnpoints of xenoborgs in the mothership * add new tags for xenoborg and mothership core * add new tags for xenoborgs and mothership core * update ghostrole spawners for xenoborgs * message for when you get the xenoborg role * explode all xenoborgs when mothership core dies * for real now. explode all xenoborgs when mothership core is destroyed * round end summary for xenoborgs * temporary * add guidebook entry for xenoborgs * instructions on how to borg players * removed lock from xenoborg control computer * announcement when all xenoborgs die * announcement when mothership core is destroyed * typos * fix error * improve xenoborg mind role * move sounds to xenoborg and mothership component * play sounds when turned into xenoborg * change sprites of mothership core actions * minor fix * add custom xenoborg start sound * carps now attack xenoborgs * added guide link to xenoborgs * add guidebook link to xenoborgs * added guidebook link to mothership core * add link to source of the sound * fixed minor issue * has to be 1 * typo * add light layer to mothership core sprite * fixed antag selection system * update guideboook * update the guidebook again * alphabet * documentation * simplify documentation Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * make the briefing yml instead of code * fix bug with sprites * fix formating * remove stuff from AntagSelection * add stuff to AntagSpawner * fix game rule * removed secret xenoborg preset * support for more than one entity for each antag role * fix gamerule * fixes * no xeonborgs * add xenoborgs to all at once * engi xenoborg included * more comments * more recognizable * more xenoborgs when more players * removed unused stuff * correct access * removed unnecessary stuff * use GetAliveHumans and make comments better * Make the system more robust * use a constant * remove overload from the Destroy method * has to be public to be used in the xenoborg system * fix the mindrole methods * not sure, but I was asked to do it * use a constant for the color * forgot to make it static * removed param comments * removed useless parameters * fixed stuff * added event listeneers to xenoborg mind change * only 4 * unfuck the antagSpawner * comment * unfix stuff * commentary * removed xenoborg stuff from siliconLawSystem * move some stuff to the component * removed space * removed uncessary stuff * no need to crate a var * move stuff from mothership comp to xenoborg comp * removed XenoborgCoreRoleComponent * comment on the AntagSelectLocationEvent * added back empty line * comment * make the summary better * make AntagRoleToPrototypes summary better * adding useless stuff back cause it was there before * hascomp instead of trycomp * again * LocId instead of string * make a new logic for the whitelist of the spawnpoint * added ghostrole tags back * use hascomp instead of trycomp * removed whitelist from SpawnPointComponent * not needed anymore * no longer subverted * fixed names * make it better * add not * i'm dumb * briefing is now handled by the xenoborg system * call evac if there is too many xenoborgs * update submodule * fix division * Add AutoGenerateComponentPause and AutoPausedField to XenoborgsRuleComponent * add lines between stuff * Make the Blocking system more robust * Make mothership inherit from BaseMob * remove this stuff cause is bad * Revert "Make the Blocking system more robust" This reverts commit 099babfe1daef00e6073e04108920327416e4ca4. * Mothership core snaps to grid * stop mothership core from moving * mothership core is static again * make guidebook entry on how to xenoborg crew better * Make mothership core damageable * If xenoborgs need it, so do zombies i guess * Start the NextRoundEndCheck * follow private static readonly naming rule * Samething * Fix announcments * Make it a datafield, no? * Revert "Make it a datafield, no?" This reverts commit 62f6255ccccdd583d7f833ae4dbcd09a670f721a. * remove stuff * doesn't need to move * is kinda of a structure * so it doesn't pry floors as soon as it spawns * powercell hand to mothership core module * label for new hand * core_e -> core-e * mothership core can pilot the shuttle again * fix duplicated tag + description to xenoborg tags * scout xenoborg can now move in space without the jetpack so it can better use the sword module * improve basic xenoborg module * remove changes from zombie rule comp * swap AllEntityQuery for EntityQueryEnumerator * new line at the end * change to 15 seconds * make MothershipCoreDeathAnnouncmentSent into a datafield --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Co-authored-by: beck-thompson --- .../Antag/AntagMultipleRoleSpawnerSystem.cs | 40 +++++ Content.Server/Antag/AntagSelectionSystem.cs | 49 ++--- .../AntagMultipleRoleSpawnerComponent.cs | 23 +++ .../Components/XenoborgsRuleComponent.cs | 33 ++++ .../GameTicking/Rules/RuleGridsSystem.cs | 6 + .../GameTicking/Rules/XenoborgsRuleSystem.cs | 167 ++++++++++++++++++ .../Silicons/Borgs/BorgSystem.Transponder.cs | 11 +- .../GridSpawnPointWhitelistComponent.cs | 22 +++ Content.Server/Xenoborgs/XenoborgSystem.cs | 101 +++++++++++ .../Roles/Components/XenoborgRoleComponent.cs | 9 + .../Borgs/Components/BorgChassisComponent.cs | 6 + .../Silicons/Borgs/SharedBorgSystem.cs | 4 +- .../Components/MothershipCoreComponent.cs | 7 + .../Xenoborgs/Components/XenoborgComponent.cs | 29 ++- .../Audio/Ambience/Antag/attributions.yml | 5 +- .../Audio/Ambience/Antag/xenoborg_start.ogg | Bin 0 -> 404106 bytes .../game-presets/preset-xenoborgs.ftl | 25 +++ .../ghost/roles/ghost-role-component.ftl | 6 + Resources/Locale/en-US/guidebook/guides.ftl | 1 + Resources/Locale/en-US/mind/role-types.ftl | 4 +- .../Locale/en-US/prototypes/roles/antags.ftl | 6 + .../Locale/en-US/robotics/borg_modules.ftl | 3 + Resources/Locale/en-US/station-laws/laws.ftl | 2 +- .../Locale/en-US/xenoborgs/xenoborgs.ftl | 3 + Resources/Maps/Shuttles/mothership.yml | 33 +++- .../Entities/Clothing/Back/specific.yml | 31 ++++ .../Spawners/Conditional/xenoborgs.yml | 40 +++++ .../Entities/Markers/Spawners/ghost_roles.yml | 44 +++++ .../Mobs/Cyborgs/base_borg_chassis.yml | 9 +- .../Entities/Mobs/Cyborgs/xenoborgs.yml | 7 + .../Entities/Mobs/Player/mothershipcore.yml | 83 +++++---- .../Entities/Objects/Devices/pinpointer.yml | 2 +- .../Specific/Robotics/borg_modules.yml | 54 +++++- .../Machines/Computers/computers.yml | 14 +- Resources/Prototypes/GameRules/roundstart.yml | 15 ++ .../Prototypes/GameRules/subgamemodes.yml | 33 ++++ Resources/Prototypes/Guidebook/antagonist.yml | 6 + .../Prototypes/Roles/Antags/xenoborgs.yml | 23 +++ .../Prototypes/Roles/MindRoles/mind_roles.yml | 25 +++ Resources/Prototypes/ai_factions.yml | 1 + Resources/Prototypes/game_presets.yml | 18 ++ Resources/Prototypes/tags.yml | 21 ++- .../Guidebook/Antagonist/Xenoborgs.xml | 167 ++++++++++++++++++ .../Actions/actions_borg.rsi/meta.json | 9 + .../xenoborg-camera-computer.png | Bin 0 -> 253 bytes .../xenoborg-control-computer.png | Bin 0 -> 298 bytes .../xenoborg-module-module.png | Bin 0 -> 276 bytes .../mothership_core.rsi/core-active.png | Bin 9845 -> 3933 bytes .../Silicon/mothership_core.rsi/core-e.png | Bin 0 -> 344 bytes .../Silicon/mothership_core.rsi/core-idle.png | Bin 1737 -> 1158 bytes .../Silicon/mothership_core.rsi/meta.json | 4 + .../silicon_storage_cube.rsi/meta.json | 14 ++ .../silicon_storage_cube.rsi/xenoborg.png | Bin 0 -> 321 bytes 53 files changed, 1139 insertions(+), 76 deletions(-) create mode 100644 Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs create mode 100644 Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs create mode 100644 Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs create mode 100644 Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs create mode 100644 Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs create mode 100644 Content.Server/Xenoborgs/XenoborgSystem.cs create mode 100644 Content.Shared/Roles/Components/XenoborgRoleComponent.cs create mode 100644 Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs create mode 100644 Resources/Audio/Ambience/Antag/xenoborg_start.ogg create mode 100644 Resources/Locale/en-US/game-ticking/game-presets/preset-xenoborgs.ftl create mode 100644 Resources/Locale/en-US/xenoborgs/xenoborgs.ftl create mode 100644 Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml create mode 100644 Resources/Prototypes/Roles/Antags/xenoborgs.yml create mode 100644 Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png create mode 100644 Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-module-module.png create mode 100644 Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-e.png create mode 100644 Resources/Textures/Objects/Specific/Robotics/silicon_storage_cube.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Robotics/silicon_storage_cube.rsi/xenoborg.png diff --git a/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs b/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs new file mode 100644 index 0000000000..d59fbc82b4 --- /dev/null +++ b/Content.Server/Antag/AntagMultipleRoleSpawnerSystem.cs @@ -0,0 +1,40 @@ +using Content.Server.Antag.Components; +using Robust.Shared.Random; + +namespace Content.Server.Antag; + +public sealed class AntagMultipleRoleSpawnerSystem : EntitySystem +{ + [Dependency] private readonly IRobustRandom _random = default!; + [Dependency] private readonly ILogManager _log = default!; + + private ISawmill _sawmill = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSelectEntity); + + _sawmill = _log.GetSawmill("antag_multiple_spawner"); + } + + private void OnSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + // If its more than one the logic breaks + if (args.AntagRoles.Count != 1) + { + _sawmill.Fatal($"Antag multiple role spawner had more than one antag ({args.AntagRoles.Count})"); + return; + } + + var role = args.AntagRoles[0]; + + var entProtos = ent.Comp.AntagRoleToPrototypes[role]; + + if (entProtos.Count == 0) + return; // You will just get a normal job + + args.Entity = Spawn(ent.Comp.PickAndTake ? _random.PickAndTake(entProtos) : _random.Pick(entProtos)); + } +} diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 2d484a2aa9..15ba636a93 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -271,7 +271,7 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem(player, out var spawnerComp)) { Log.Error($"Antag spawner {player} does not have a GhostRoleAntagSpawnerComponent."); - _adminLogger.Add(LogType.AntagSelection,$"Antag spawner {player} in gamerule {ToPrettyString(ent)} failed due to not having GhostRoleAntagSpawnerComponent."); + _adminLogger.Add(LogType.AntagSelection, $"Antag spawner {player} in gamerule {ToPrettyString(ent)} failed due to not having GhostRoleAntagSpawnerComponent."); if (session != null) { ent.Comp.AssignedSessions.Remove(session); @@ -538,21 +539,21 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem [ByRefEvent] -public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity GameRule) +public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity GameRule, List> AntagRoles) { public readonly ICommonSession? Session = Session; + /// list of antag role prototypes associated with a entity. used by the + public readonly List> AntagRoles = AntagRoles; + public bool Handled => Entity != null; public EntityUid? Entity; @@ -620,12 +624,15 @@ public record struct AntagSelectEntityEvent(ICommonSession? Session, Entity [ByRefEvent] -public record struct AntagSelectLocationEvent(ICommonSession? Session, Entity GameRule) +public record struct AntagSelectLocationEvent(ICommonSession? Session, Entity GameRule, EntityUid Entity) { public readonly ICommonSession? Session = Session; public bool Handled => Coordinates.Any(); + // the entity of the antagonist + public EntityUid Entity = Entity; + public List Coordinates = new(); } diff --git a/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs b/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs new file mode 100644 index 0000000000..5a9103a82a --- /dev/null +++ b/Content.Server/Antag/Components/AntagMultipleRoleSpawnerComponent.cs @@ -0,0 +1,23 @@ +using Content.Shared.Roles; +using Robust.Shared.Prototypes; + +namespace Content.Server.Antag.Components; + +/// +/// Selects and spawns one prototype from a list for each antag prototype selected by the +/// +[RegisterComponent] +public sealed partial class AntagMultipleRoleSpawnerComponent : Component +{ + /// + /// antag prototype -> list of possible entities to spawn for that antag prototype. Will choose from the list randomly once with replacement unless is set to true + /// + [DataField] + public Dictionary, List> AntagRoleToPrototypes; + + /// + /// Should you remove ent prototypes from the list after spawning one. + /// + [DataField] + public bool PickAndTake; +} diff --git a/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs new file mode 100644 index 0000000000..742890226f --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/XenoborgsRuleComponent.cs @@ -0,0 +1,33 @@ +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; + +namespace Content.Server.GameTicking.Rules.Components; + +[RegisterComponent, Access(typeof(XenoborgsRuleSystem))] +[AutoGenerateComponentPause] +public sealed partial class XenoborgsRuleComponent : Component +{ + /// + /// When the round will next check for round end. + /// + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer))] + [AutoPausedField] + public TimeSpan? NextRoundEndCheck; + + /// + /// The amount of time between each check for the end of the round. + /// + [DataField] + public TimeSpan EndCheckDelay = TimeSpan.FromSeconds(15); + + /// + /// After this amount of the crew become xenoborgs, the shuttle will be automatically called. + /// + [DataField] + public float XenoborgShuttleCallPercentage = 0.7f; + + /// + /// If the announcment of the death of the mothership core was sent + /// + [DataField] + public bool MothershipCoreDeathAnnouncmentSent = false; +} diff --git a/Content.Server/GameTicking/Rules/RuleGridsSystem.cs b/Content.Server/GameTicking/Rules/RuleGridsSystem.cs index 9eae9e3c95..ef18233909 100644 --- a/Content.Server/GameTicking/Rules/RuleGridsSystem.cs +++ b/Content.Server/GameTicking/Rules/RuleGridsSystem.cs @@ -65,6 +65,12 @@ public sealed class RuleGridsSystem : GameRuleSystem if (_whitelist.IsWhitelistFail(ent.Comp.SpawnerWhitelist, uid)) continue; + if (TryComp(uid, out var gridSpawnPointWhitelistComponent)) + { + if (!_whitelist.CheckBoth(args.Entity, gridSpawnPointWhitelistComponent.Blacklist, gridSpawnPointWhitelistComponent.Whitelist)) + continue; + } + args.Coordinates.Add(_transform.GetMapCoordinates(xform)); } } diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs new file mode 100644 index 0000000000..8d13578301 --- /dev/null +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -0,0 +1,167 @@ +using Content.Server.Antag; +using Content.Server.Chat.Systems; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.RoundEnd; +using Content.Server.Station.Systems; +using Content.Shared.Destructible; +using Content.Shared.GameTicking.Components; +using Content.Shared.Mind; +using Content.Shared.Mobs.Systems; +using Content.Shared.Xenoborgs.Components; +using Robust.Shared.Timing; + +namespace Content.Server.GameTicking.Rules; + +public sealed class XenoborgsRuleSystem : GameRuleSystem +{ + [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly ChatSystem _chatSystem = default!; + [Dependency] private readonly MobStateSystem _mobState = default!; + [Dependency] private readonly SharedMindSystem _mindSystem = default!; + [Dependency] private readonly RoundEndSystem _roundEnd = default!; + [Dependency] private readonly StationSystem _station = default!; + [Dependency] private readonly IGameTiming _timing = default!; + + private static readonly Color AnnouncmentColor = Color.Gold; + + public void SendXenoborgDeathAnnouncement(Entity ent, bool mothershipCoreAlive) + { + if (ent.Comp.MothershipCoreDeathAnnouncmentSent) + return; + + var status = mothershipCoreAlive ? "alive" : "dead"; + _chatSystem.DispatchGlobalAnnouncement( + Loc.GetString($"xenoborgs-no-more-threat-mothership-core-{status}-announcement"), + colorOverride: AnnouncmentColor); + } + + public void SendMothershipDeathAnnouncement(Entity ent) + { + _chatSystem.DispatchGlobalAnnouncement( + Loc.GetString("mothership-destroyed-announcement"), + colorOverride: AnnouncmentColor); + + ent.Comp.MothershipCoreDeathAnnouncmentSent = true; + } + + // TODO: Refactor the end of round text + protected override void AppendRoundEndText(EntityUid uid, + XenoborgsRuleComponent component, + GameRuleComponent gameRule, + ref RoundEndTextAppendEvent args) + { + base.AppendRoundEndText(uid, component, gameRule, ref args); + + var numXenoborgs = GetNumberXenoborgs(); + var numHumans = _mindSystem.GetAliveHumans().Count; + + if (numXenoborgs < 5) + args.AddLine(Loc.GetString("xenoborgs-crewmajor")); + else if (4 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-crewmajor")); + else if (2 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-crewminor")); + else if (1.5 * numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-neutral")); + else if (numXenoborgs < numHumans) + args.AddLine(Loc.GetString("xenoborgs-borgsminor")); + else + args.AddLine(Loc.GetString("xenoborgs-borgsmajor")); + + var numMothershipCores = GetNumberMothershipCores(); + + if (numMothershipCores == 0) + args.AddLine(Loc.GetString("xenoborgs-cond-all-xenoborgs-dead-core-dead")); + else if (numXenoborgs == 0) + args.AddLine(Loc.GetString("xenoborgs-cond-all-xenoborgs-dead-core-alive")); + else + args.AddLine(Loc.GetString("xenoborgs-cond-xenoborgs-alive", ("count", numXenoborgs))); + + args.AddLine(Loc.GetString("xenoborgs-list-start")); + + var antags = _antag.GetAntagIdentifiers(uid); + + foreach (var (_, sessionData, name) in antags) + { + args.AddLine(Loc.GetString("xenoborgs-list", ("name", name), ("user", sessionData.UserName))); + } + } + + private void CheckRoundEnd(XenoborgsRuleComponent xenoborgsRuleComponent) + { + var numXenoborgs = GetNumberXenoborgs(); + var numHumans = _mindSystem.GetAliveHumans().Count; + + if ((float)numXenoborgs / numHumans > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) + { + foreach (var station in _station.GetStations()) + { + _chatSystem.DispatchStationAnnouncement(station, Loc.GetString("xenoborg-shuttle-call"), colorOverride: Color.BlueViolet); + } + _roundEnd.RequestRoundEnd(null, false); + } + } + + protected override void Started(EntityUid uid, XenoborgsRuleComponent component, GameRuleComponent gameRule, GameRuleStartedEvent args) + { + base.Started(uid, component, gameRule, args); + + component.NextRoundEndCheck = _timing.CurTime + component.EndCheckDelay; + } + + protected override void ActiveTick(EntityUid uid, XenoborgsRuleComponent component, GameRuleComponent gameRule, float frameTime) + { + base.ActiveTick(uid, component, gameRule, frameTime); + + if (!component.NextRoundEndCheck.HasValue || component.NextRoundEndCheck > _timing.CurTime) + return; + + CheckRoundEnd(component); + component.NextRoundEndCheck = _timing.CurTime + component.EndCheckDelay; + } + + /// + /// Get the number of xenoborgs + /// + /// if it should only include xenoborgs with a mind + /// if it should only include xenoborgs that are alive + /// the number of xenoborgs + private int GetNumberXenoborgs(bool playerControlled = true, bool alive = true) + { + var numberXenoborgs = 0; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out var xenoborg, out _)) + { + if (HasComp(xenoborg)) + continue; + + if (playerControlled && !_mindSystem.TryGetMind(xenoborg, out _, out _)) + continue; + + if (alive && !_mobState.IsAlive(xenoborg)) + continue; + + numberXenoborgs++; + } + + return numberXenoborgs; + } + + /// + /// Gets the number of xenoborg cores + /// + /// the number of xenoborg cores + private int GetNumberMothershipCores() + { + var numberMothershipCores = 0; + + var mothershipCoreQuery = EntityQueryEnumerator(); + while (mothershipCoreQuery.MoveNext(out _, out _)) + { + numberMothershipCores++; + } + + return numberMothershipCores; + } +} diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs index fd3b910753..8dd074e6a0 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Transponder.cs @@ -98,7 +98,7 @@ public sealed partial class BorgSystem if (command == RoboticsConsoleConstants.NET_DISABLE_COMMAND) Disable(ent); else if (command == RoboticsConsoleConstants.NET_DESTROY_COMMAND) - Destroy(ent); + Destroy(ent.Owner); } private void Disable(Entity ent) @@ -118,8 +118,15 @@ public sealed partial class BorgSystem ent.Comp1.NextDisable = _timing.CurTime + ent.Comp1.DisableDelay; } - private void Destroy(Entity ent) + /// + /// Makes a borg with explode + /// + /// the entity of the borg + public void Destroy(Entity ent) { + if (!Resolve(ent, ref ent.Comp)) + return; + // this is stealthy until someone realises you havent exploded if (CheckEmagged(ent, "destroyed")) { diff --git a/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs b/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs new file mode 100644 index 0000000000..de9f71f0f8 --- /dev/null +++ b/Content.Server/Spawners/Components/GridSpawnPointWhitelistComponent.cs @@ -0,0 +1,22 @@ +using Content.Shared.Whitelist; + +namespace Content.Server.Spawners.Components; + +/// +/// Defines whitelist and blacklist for entities that can spawn at a spawnpoint when they are spawned via the +/// +[RegisterComponent] +public sealed partial class GridSpawnPointWhitelistComponent : Component +{ + /// + /// Whitelist of entities that can be spawned at this SpawnPoint + /// + [DataField] + public EntityWhitelist? Whitelist; + + /// + /// Whitelist of entities that can't be spawned at this SpawnPoint + /// + [DataField] + public EntityWhitelist? Blacklist; +} diff --git a/Content.Server/Xenoborgs/XenoborgSystem.cs b/Content.Server/Xenoborgs/XenoborgSystem.cs new file mode 100644 index 0000000000..8a046ce3c7 --- /dev/null +++ b/Content.Server/Xenoborgs/XenoborgSystem.cs @@ -0,0 +1,101 @@ +using Content.Server.Antag; +using Content.Server.GameTicking.Rules; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Silicons.Borgs; +using Content.Shared.Destructible; +using Content.Shared.Mind; +using Content.Shared.Mind.Components; +using Content.Shared.Roles; +using Content.Shared.Roles.Components; +using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.Xenoborgs.Components; +using Robust.Shared.Audio; +using Robust.Shared.Player; + +namespace Content.Server.Xenoborgs; + +public sealed partial class XenoborgSystem : EntitySystem +{ + [Dependency] private readonly AntagSelectionSystem _antag = default!; + [Dependency] private readonly BorgSystem _borg = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; + [Dependency] private readonly XenoborgsRuleSystem _xenoborgsRule = default!; + + private static readonly Color XenoborgBriefingColor = Color.BlueViolet; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnXenoborgDestroyed); + SubscribeLocalEvent(OnCoreDestroyed); + + SubscribeLocalEvent(OnXenoborgMindAdded); + SubscribeLocalEvent(OnXenoborgMindRemoved); + } + + private void OnXenoborgDestroyed(EntityUid uid, XenoborgComponent component, DestructionEventArgs args) + { + // if a xenoborg is destroyed, it will check to see if it was the last one + var xenoborgQuery = AllEntityQuery(); // paused xenoborgs still count + while (xenoborgQuery.MoveNext(out var xenoborg, out _)) + { + if (xenoborg != uid) + return; + } + + var mothershipCoreQuery = AllEntityQuery(); // paused mothership cores still count + var mothershipCoreAlive = mothershipCoreQuery.MoveNext(out _, out _); + + var xenoborgsRuleQuery = EntityQueryEnumerator(); + if (xenoborgsRuleQuery.MoveNext(out var xenoborgsRuleEnt, out var xenoborgsRuleComp)) + _xenoborgsRule.SendXenoborgDeathAnnouncement((xenoborgsRuleEnt, xenoborgsRuleComp), mothershipCoreAlive); + } + + private void OnCoreDestroyed(EntityUid ent, MothershipCoreComponent component, DestructionEventArgs args) + { + // if a mothership core is destroyed, it will see if there are any others + var mothershipCoreQuery = AllEntityQuery(); // paused mothership cores still count + while (mothershipCoreQuery.MoveNext(out var mothershipCoreEnt, out _)) + { + // if it finds a mothership core that is different from the one just destroyed, + // it doesn't explode the xenoborgs + if (mothershipCoreEnt != ent) + return; + } + + var xenoborgsRuleQuery = EntityQueryEnumerator(); + if (xenoborgsRuleQuery.MoveNext(out var xenoborgsRuleEnt, out var xenoborgsRuleComp)) + _xenoborgsRule.SendMothershipDeathAnnouncement((xenoborgsRuleEnt, xenoborgsRuleComp)); + + // explode all xenoborgs + var xenoborgQuery = AllEntityQuery(); // paused xenoborgs still explode + while (xenoborgQuery.MoveNext(out var xenoborgEnt, out _, out _)) + { + if (HasComp(xenoborgEnt)) + continue; + + // I got tired to trying to make this work via the device network. + // so brute force it is... + _borg.Destroy(xenoborgEnt); + } + } + + private void OnXenoborgMindAdded(EntityUid ent, XenoborgComponent comp, MindAddedMessage args) + { + _roles.MindAddRole(args.Mind, comp.MindRole, silent: true); + + if (!TryComp(ent, out var actorComp)) + return; + + _antag.SendBriefing(actorComp.PlayerSession, + Loc.GetString(comp.BriefingText), + XenoborgBriefingColor, + comp.BriefingSound + ); + } + + private void OnXenoborgMindRemoved(EntityUid ent, XenoborgComponent comp, MindRemovedMessage args) + { + _roles.MindRemoveRole(args.Mind.Owner, comp.MindRole); + } +} diff --git a/Content.Shared/Roles/Components/XenoborgRoleComponent.cs b/Content.Shared/Roles/Components/XenoborgRoleComponent.cs new file mode 100644 index 0000000000..eeebad0a79 --- /dev/null +++ b/Content.Shared/Roles/Components/XenoborgRoleComponent.cs @@ -0,0 +1,9 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Roles.Components; + +/// +/// Added to mind role entities to tag that they are a xenoborg. +/// +[RegisterComponent, NetworkedComponent] +public sealed partial class XenoborgRoleComponent : Component; diff --git a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs index c2bf2b2801..f562ddefdd 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs @@ -78,6 +78,12 @@ public sealed partial class BorgChassisComponent : Component [DataField] public ProtoId NoBatteryAlert = "BorgBatteryNone"; + + /// + /// If the entity can open own UI. + /// + [DataField] + public bool CanOpenSelfUi; } [Serializable, NetSerializable] diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index 827bb351b0..baf604de0c 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -98,8 +98,8 @@ public abstract partial class SharedBorgSystem : EntitySystem private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) { - // borgs can't view their own ui - if (args.User == uid) + // borgs generaly can't view their own ui + if (args.User == uid && !component.CanOpenSelfUi) args.Cancel(); } diff --git a/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs b/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs new file mode 100644 index 0000000000..4835e20aad --- /dev/null +++ b/Content.Shared/Xenoborgs/Components/MothershipCoreComponent.cs @@ -0,0 +1,7 @@ +namespace Content.Shared.Xenoborgs.Components; + +/// +/// Defines what is a xenoborg core for the intentions of the xenoborg rule. if all xenoborg cores are destroyed. all xenoborgs will self-destruct. +/// +[RegisterComponent] +public sealed partial class MothershipCoreComponent : Component; diff --git a/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs b/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs index aee8298bc2..db4ca49c5b 100644 --- a/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs +++ b/Content.Shared/Xenoborgs/Components/XenoborgComponent.cs @@ -1,7 +1,32 @@ +using Content.Shared.Roles.Components; +using Robust.Shared.Audio; +using Robust.Shared.Prototypes; + namespace Content.Shared.Xenoborgs.Components; /// -/// This component for now is being used for the pinpointer, but it will recieve more stuff in the future. +/// Defines what is a xenoborg for the intentions of the xenoborg rule. if all xenoborg cores are destroyed. all xenoborgs will self-destruct. +/// +/// It's also used by the mothership core /// [RegisterComponent] -public sealed partial class XenoborgMothershipComponent : Component; +public sealed partial class XenoborgComponent : Component +{ + /// + /// The mindrole associated with the xenoborg + /// + [DataField] + public EntProtoId MindRole = "MindRoleXenoborg"; + + /// + /// The text that is sent when you become a xenoborg + /// + [DataField] + public LocId BriefingText = "xenoborgs-welcome"; + + /// + /// Briefing sound when you become a xenoborg + /// + [DataField] + public SoundSpecifier BriefingSound = new SoundPathSpecifier("/Audio/Ambience/Antag/xenoborg_start.ogg"); +} diff --git a/Resources/Audio/Ambience/Antag/attributions.yml b/Resources/Audio/Ambience/Antag/attributions.yml index 5418d2a204..c9a9b1304d 100644 --- a/Resources/Audio/Ambience/Antag/attributions.yml +++ b/Resources/Audio/Ambience/Antag/attributions.yml @@ -30,4 +30,7 @@ license: "CC-BY-SA-3.0" copyright: "Taken from TG station at commit https://github.com/tgstation/tgstation/commit/436ba869ebcd0b60b63973fb7562f447ee655205" source: "https://github.com/tgstation/tgstation/blob/master/sound/music/antag/ling_alert.ogg" - +- files: ["xenoborg_start.ogg"] + license: "CC-BY-SA-3.0" + copyright: "Made by DarkIcedCoffee (discord)" + source: "https://github.com/space-wizards/space-station-14/pull/40042/" diff --git a/Resources/Audio/Ambience/Antag/xenoborg_start.ogg b/Resources/Audio/Ambience/Antag/xenoborg_start.ogg new file mode 100644 index 0000000000000000000000000000000000000000..97fe49db99d161797fa294a633c92f6d9418c98c GIT binary patch literal 404106 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

P3&{X_eF+4heeFXgJ_ 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

?7;N@3t=Y}6-#9k;z<0q-(o=mt z{=4^J1^cgS1v;CaX>ZuL|Hxmq2?ihQxI?=p*}hyf^+Wl_t~ckRHtN6N`W`FAx2H*% zyNU53!^dNSI~K$!OnP)|GNTDsi0;9*7x!IQgqSnfo0z7!Tsv_1y%@uaE+z+tgfI6d z{hj(;nt_4gUPern&WWJLHAZrGWir;Nwi!Bh^tkV?V`kXUXsf-O#pk}^waD3lTgxD^8l=18S0Tn#>D+dLVJnVt)+E96?Ln_siD;Qb8q75!yr z&$JXyZd%i}WZQ9rApHiDN4Kg(nH^d$WIHjgn7pFlSj^FLH&_`IxtUc=d-T|qnr0jb zcXJSWao6;4v1wS7q{aNQD22_>!XC{_W0+x5@l5ED_CDY0?~L4O$EL}jle{Mq(m#Je z^Vb+#hN(uY4VVGDcD$l;H|NF*&>LkX7#k^_XpM5HbO8J6eGc(r+HAe6h||lO=DW^6!^5yH_(QWS=Ze<}G1Vh@XCoCx|IaD}$l!+L`Y3 zR~1(m1^;qzmr>~aqLnozV&0@wDULqNYM)Vg7tp*GM_jC02S3 zr+oabb?7LC2N|zi9>1VBY}Q&uF^^LnH)6!MPrak!vGTUN&|R6Q3QR(7M&iZ)8JHv= z_0uu)V!x<*K%sbyBnlv~TJd0mcIIl)R$falX>)X7+%CGKcCNZc@ z{vNty?z62kl?-ZYbGJFKR?3ZC>~Xw)H3|!JERr$Lo4yqPh2O z-n}_>2Fq5>CI6>fJ7Ofe#eGuC?%mc0Rf;B6%vn8u^VHImKo3=Bo)pH_SBwodMoDEw zPP@A3o}WvnvJJzRk{8GJ1~g1cf2-~I`OA`d8*5~o&+)xrbY+s#oEy~7(C{woLZS1# z%Z{)5W-NMFH#2OPMZKY@QJ}*-XspN*4vP7dPL1YH@tUxtFJHS#KI&7QU)taZ=>J+V^)o z7lb-mS0?T_mg{gyXht%R+U@Jn)@u8CIT}P*V;(RWxP*ub zg)%TK=`?I$WsBQ*QTd`Kr}f95d+dX_53FFYbkgP#>6q=y#NZJ6X_Y>Q0t3Unh#2?z zDzOt6OxvX<_1v&cM4@?C{Ic#qm&$I1PoHKVd=`CC#!fmhE7v*FYvDd7hKBMl@lSc? zY}oYw?JUa&F}#!4cki2#DA?;^Khxcjp<%Ds`nuzZSNZopx7w7q=kLE4}4|&cDEV6n{hs_OKTG20x$M=4>aYbeGPw~p0;sI^UHUNOM7H5nu=^^ z>|)`HTEn)i==zhtGPCVM+nTzW92px{ToS$O5VU>jm8ma-RPva48W@*Ozor+y+EAq+ zgF#^-YeSMj((#pCAq)Zz4`kya-kcSmAfz-^G1pGz++xpDP7@fHt!H3J-#gFs`HbQx zvb>=ae_j$P=J+e;z|_#h&7l7C*7bX9c8kARv(>puSY3Zgvmn=khWwHrQ@Zpno7Qtj z7~jjSc>Kc7*WSA3!S6Xn{~oPmUoM#=RhzLv^zOc6t-G#f&R(&mC-0fB$xOlEO9w=Z zR!-k#dr!siqLNVMrKQ0t3s#172{^Hw;c+gMd=aYLz_9E0j?|^U@0KWQnrM2jjLx{N zqSB<`k=7Qj<7B{aH(lLQh2iGK5P#DYFZL@}9o3eGD>^@AnKD^@=Bb36rmoNL+?^V- zHK~c&;I4R;D#L*WHSQQ*fs2Vs47VyYq!`*Fr)llka`c2|L+*};H+k2Gu6M4sciO-6 z<@`5uSq?9g+?VI`bEn~>N6dF@4VTVQUAlbl)~%-I3_tq}m-=ySE%RURny8Ej$!NS>wbQOj3ltWxgy@RLlBnmOqJZ`YO7+(A4 zLxx|^yfa0AuiTnEt>)}=#ofPkHr$V_)b2L3`Fdu_q`j+c&KC)m)h(-xxH93wwI;2X zwI@?gzWG|cJ$a)tv3HiI5W|cGUQ2ikyuTYcatHBw zR?J=Zb&^H{=W&}}O@0#vHilA#V;IwHSi0tT|U|w1Uw{T7lW| zfp*2??LP8pDcjACT(1)TP;m0Fjo5ZWp1#(^B~LF3b-Ob#I-YXy4dj;BfC zk}o#4^E-&`dfPI|V8??hMJ88+7&b^r-+RB(SdCtZUV(DHXMyYu{50|w})|@$EyUA)6 z)(+d=@aR{f0vq+U|Guq|YhY&NVPM$vch%2uktQYvPKJFRF~=lg4qReaw#;uox^(9Z zn*+=xzoi)(8h5)8q>$79i-jkNY(mAjmz(Do$2!!pF<^NBSgqR038 z1fHtg5!-iIR`@6z)1_H!Zt*x|_TKVkVm(yBxWdeB>+GHzdlh~;|I`lAD-xJv+tSUZ z>u@LJkeN% z!pRP++rK3-GPtc4cw@J)kip?{NVTwBHBa4HnjTzdCNn&#iL?m_E}2-r`}g+z z%Nt{F|5;=DTWs4wyEj*VTIeJ!(vD9#{wCUI59j4G0!KdV>0)4du=NGJL6k#F88{<$yqG(K$Z0Ki&2P3h5#o9t=&#wRfyO$`dY`!ElIQ z)AFvotCwln>I;dhw(YL)G~f-+msET8|LggNDv3LvpNoCBu$OR-wYO<7-{l+j(15YX z_w0;@L-Q_({5^JkM@zryk_o&4Y&_F750poWt9r7<>oGDgxjop*$k6bXK{_&!J)MDJ zF>mg-a8`v~sS*r~4e~d3ZjR?@$2lD3`!KvcOR)Omt=Ro)cEcn1H*-$U%4rc zuOD{VGaZxoI#*0N#P`Xxpl7TulNcOMon{j#dU0`y+4a+n``G_%ntP*P(=Dq|c<+r5 zkE>3di7#;qTC#0>QSV||Dao_lKO81mRen@rsz^?bmR>xQ%|4m)PJ5>N9fjzVmJ%=c zma8y3>-NUn*VCVAP;z7{CuiE$w<*zu#+lbY)m1%ei8+{Ht}tU}mxbEPy^r`8 zkNKi)b9_DStg&JjjP7blIjA}5jHK16#4hn26IdjYJd9W+W=k-%Eq)c@e3*mrfj6V4 z#gD%K2HMkPy7F$;xG=CBUC8<(cl(}Cw*pidSQzGc+;JDr44$MLSgCsDvr=JvZO*(C zVLj4w?yoAHs^z;~&?TmAt#MlJHsui4xK+DE*e9wmthn;-D;QhdjD;oX&b*!eVp>*#5~*S>GOjG`_p2wzSv%ESo*b2tGy@5x7TEGiG8AG zSE6H%7Q+mUEtX~toP`4FoDQ28X8K%jOOaZ-FDT7*(?w47Y`q4fBog~|QJE4BzYB&_e9`)hrH+4hnoHqP#l%{LFW zPV#5GTB%*Y$iQLn!NqBz$5fk@?OhtFI*-@qI~ZwgZAnSnHv9bl#M#<8UW`Hv&=DDV zKKM?gPzDBuJ{_AJiT{cJv;OD&kN=h8FD$SM6$-U;S<7<9c;Lh>(X8BSTgZ>jO? zJCj{8M}i@nenpzqIv#Cyn}vFDl7}>=82yqAW$IkD(DOu>j?1!ruDX}5a_P02JJ|CE zD4brRqw*|El+jPhhvPtsGmm*lu(#Tm=&N5CTD)gCR>`#GCEgO+sXo&yG$)(W_!A$oqy4=k(kkk3(9Cc3g&OX(2wY(sq zB~`6WjqF8TJ1Qq!W1ejxbtA28=83L1hfFGEOhsN!VLjBOk@o8||F;-%CQoGrZ>Jqc zmhLihoXm1(i711D%z-wBC5HqOo+USZn)HizpFEq&jZdd;H)okKgVMixcoLJ2#O1d~ z9`4(*B-?z^Go07S? z;Qo!Xxf7#I6K@o4iGBS|Z07dv@9&~(EFW8ObH6UTz4U&b;sJ6BrgB83hHhXA&fnOd@6U7z_}zuwKF;VZ)@X2pNQ) zHRF|lm8YxE=*n3~hy}M4hSz-2ZT!B|hO;?(N%YPBT;>VP9M`pqq?Vmob@Ke_9g3<# z8bJXJyEqKW8(X+D7GCMxaDeH66Enx(DnPw_?4oUK3=CE=#XleN`J4P!IeBDFRZ_F%jO?Em{^6fjt7uYX!ys(PoWRm*A_WF_6 z0%0RImL;C2d}fx$#&5R{UHE>o>KUGZjqcqHPOZ~8m>it0tbUOy)mG%_%CL&x?)1`+ zHZ82T877s6Dr-+*o2J$7#pU!U?8)t$%nsXw=T|dNKezJ&KO+OfqCQ8j^A0a`Jv=y; zh4-FjVc4d1@iNb<6_1|QNTfP*t*dxgN^TZasm<;--b^6PiK z({=N4cqpIe?iF2+G~RKur3TsZzF=Bl$ZIgE!kUS(n(ZMV&CXx^Y2MZM zo6}@Js((wd_;8i|_ni&aJ4)6>YV}|1%kI2iRZdkS;%rSu0Pv0e(RLSojh-R3H4T&nDu9^Kr@%YBpMCC}-MT|H~W89a=3 zr8P&NF|m=fG70o(x-!q$RAGTmm=+5MlUaX%&J>1YfqV|epV#QDU}Si5!=YLF%UUHC zm!^~%wro;w7B)<6^z>kiJ*>gjAX$CJF8KYYH)TvaxbJB-uw}nB%-^*2N%58Fo=S$E zO7>@;Y~&c~-p^xeSlQ5|lq_MxK4Sty%azcklILexRS&SQ2^QfI>1H@$5HNS{CdN-6 zZYQezJ|TX?fZ_0l{|q-785krW?Ggo{FI=yxKuz#X47Ooc{+>IT>125^eS@mAa$M1y z<#Wm+MN4KgGklwU&gS^LJ4?#6uUo$rJAH6h(XS-6%91Dlk6gSb z6Gvd`oyv^H=WC+ zER-pQ(Q$2HLe7kNtt>pZd1v@^DK1)2Fzd%0=DeGSo+K*%7dw{7D6$~(x^2^$FIo+r ztIixSTwbmlXk?u7#q*4>!t1D8qx5 zkG3Qn{>SKG!l0AjaNxtgos(_#xfya88SFe_c5CNq@p`AIdOUZ0WVcg^SF>Z?Djf;X zpvmxbWX1b6i=ZguFHz9NqHA(suvBdv6Ob8o4PId3X7_FW?)mc7_33$)({F5v`JXEG^;%D9sxtf9GTVS)K`n_aU-y)YDNYKO2BN~g z+#PL6+<^@bh1@ul8P-TMTRdXAw28ru;}Dm9CIiC*CdLM?6Eh1-OMW>7tzlw#5}Uwa zT*JyB!82veiv)Qd4hB|+IFFdw{A#K(l7;iWbp#hqlxEjA*s-6HVaL+Dxg|dYFQ;z~ zo#@)DS#~CpnSmj~fhj?>_|v&ELHpoWVrL)Cm~8&OGk}3%(XP_hGcv1dquxsOXPpXv zrBe0XKl)a$q{?I2E1R>ccRb${^*#7!P5PsbbxUt_1t=$#uIzsE;idJel}o1xZ%Uq0 zxr}}DDZjK`oR5=^g(P0o?(#5ah&6FxxU$>*(WbD_3WPW^j4gJb(s7En>EF?1 za)3!^+j8j-4ttC@zfk;__N7!&{GqLLdG&;tpwmVw3fEpn1}&1hvuam9LvwUM?}P(jrJ{W94yb3864P*_M3aIeJB#3yfU#Njdhk@+J2K%2`QhooCc1nW%>H` z$4_lZklXR~pRF{*U6aoz_P7MpH4T2~jT*S*SCNYa91|AzP?b0!9c0}OZh|GCF>`^}rG zR+*am@Lc_omAek{t>g#`dGb@5!C}GKnH(>8?uUuQIj?=Fy7tYodIkmu5iW+Cbyd5* zJgR+uYvpz4wU6fO*{${VINNBlbjkwr)k+Ku3gr=;E32bI?CkXGwYgH^X5C@8>Zi7P?0|KW()6> z(zevfLl!l)(^T!Mg*1evG$USoO6WYJPhp;IRXsv)BZF3^RU^rk;U*rX2#BJ6}jwHPZAff->vcABG192Te&hr z_i*{P+5HQ%u1z!Ql2z7Wa45(qIIOnr{noh!-**+9PEl6Q-rnQ;P1bheoE=-{8Z^1> zy<{NC*Z)oaX~s_jySlnci^Ka4b4IznKWb9yw)U@pj!JNL$5ftN!-ZEHTqjs42HTrz zO};QQ{EJ(4!@<168Kz4%pI|jowP-){Wbb}4k(m=pxg}I{gR-`Gw9R4)a@oKaJMY{> z;bOJm;P#(-b<5J0J}gUK?jpB1^xQn5-1VA1lODV>z8~DnVCd4Co)BewB46B9 zH2Td+Z@C}_6^U6{PnjMh-Dos@dEtC5L;8+wUv}sH+8&eLCH|aoZ?VpU__VYu3=W~! z?3r%V@lAU3GUb;UvduwsgL7zhh;%;x`Z(DnL_58!xD^@(roVDoA7AXdX89LVk;=<#8@6GC) zec901EZ}5{Ev+AkGQ

UTu^)C|S9C!ZMpS7PYl-jKZ7FTJxiZDV=hEwNK> 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 + [one] Only one xenoborg survived. + *[other] There were {$count} xenoborgs in the end. +} + +xenoborgs-list-start = The starting xenoborg team were: +xenoborgs-list = - [color=White]{$name}[/color] ([color=gray]{$user}[/color]) + diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 6c4ca0c4f4..30d97a2889 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -339,6 +339,12 @@ ghost-role-information-gingerbread-name = Gingerbread Man ghost-role-information-gingerbread-description = A being of pure holiday spirit. Spread molassesy goodness and to all good cheer. +ghost-role-information-mothership-core-name = Mothership Core +ghost-role-information-mothership-core-desc = You are the core of the xenoborg mothership, help them multiply by borging any brain they bring to you. + +ghost-role-information-xenoborg-name = Xenoborg +ghost-role-information-xenoborg-desc = A strange cyborg made to replicate itself and take over the station by turning any sentient being into xenoborgs. + ghost-role-information-wizard-name = Wizard ghost-role-information-wizard-desc = YER A WIZARD! Show the station what your magic is made of. diff --git a/Resources/Locale/en-US/guidebook/guides.ftl b/Resources/Locale/en-US/guidebook/guides.ftl index e7558d1e97..0212b3ad9b 100644 --- a/Resources/Locale/en-US/guidebook/guides.ftl +++ b/Resources/Locale/en-US/guidebook/guides.ftl @@ -143,6 +143,7 @@ guide-entry-minor-antagonists = Minor Antagonists guide-entry-space-ninja = Space Ninja guide-entry-thieves = Thieves guide-entry-wizard = Wizard +guide-entry-xenoborgs = Xenoborgs guide-entry-rules = Server Rules guide-entry-rules-core-only = Core Only Ruleset diff --git a/Resources/Locale/en-US/mind/role-types.ftl b/Resources/Locale/en-US/mind/role-types.ftl index 4614d20a47..0aed624b23 100644 --- a/Resources/Locale/en-US/mind/role-types.ftl +++ b/Resources/Locale/en-US/mind/role-types.ftl @@ -16,7 +16,7 @@ role-type-team-antagonist-color = #d82000 role-type-free-agent-color = #ffff00 role-type-familiar-color = #6495ed role-type-silicon-color = #6495ed -role-type-silicon-antagonist-color =#c832e6 +role-type-silicon-antagonist-color = #c832e6 # Ideally, subtype names should be short role-subtype-traitor = Traitor @@ -33,4 +33,6 @@ role-subtype-survivor = Survivor role-subtype-subverted = Subverted role-subtype-paradox-clone = Paradox role-subtype-wizard = Wizard +role-subtype-xenoborg = Xenoborg +role-subtype-xenoborg-core = Xenoborg Core role-subtype-changeling = Changeling diff --git a/Resources/Locale/en-US/prototypes/roles/antags.ftl b/Resources/Locale/en-US/prototypes/roles/antags.ftl index 24dd8a0feb..3fa969d170 100644 --- a/Resources/Locale/en-US/prototypes/roles/antags.ftl +++ b/Resources/Locale/en-US/prototypes/roles/antags.ftl @@ -41,3 +41,9 @@ roles-antag-thief-objective = Add some NT property to your personal collection w roles-antag-dragon-name = Space Dragon roles-antag-dragon-objective = Create a carp army to take over this quadrant. + +roles-antag-mothership-core-name = Xenoborg Core +roles-antag-mothership-core-objective = Use your xenoborgs to create even more xenoborgs. + +roles-antag-xenoborg-name = Xenoborg +roles-antag-xenoborg-objective = Help the mothership create more xenoborgs. diff --git a/Resources/Locale/en-US/robotics/borg_modules.ftl b/Resources/Locale/en-US/robotics/borg_modules.ftl index ba5ee602a5..83d97e7429 100644 --- a/Resources/Locale/en-US/robotics/borg_modules.ftl +++ b/Resources/Locale/en-US/robotics/borg_modules.ftl @@ -10,5 +10,8 @@ borg-slot-documents-empty = Books and papers borg-slot-soap-empty = Soap borg-slot-instruments-empty = Instruments borg-slot-beakers-empty = Beakers +borg-slot-brains-empty = Brains and MMIs +borg-slot-modules-empty = Modules +borg-slot-powercell-empty = Powercells borg-slot-inflatable-door-empty = Inflatable Door borg-slot-inflatable-wall-empty = Inflatable Wall diff --git a/Resources/Locale/en-US/station-laws/laws.ftl b/Resources/Locale/en-US/station-laws/laws.ftl index 0883a7bff6..f9d89e0d72 100644 --- a/Resources/Locale/en-US/station-laws/laws.ftl +++ b/Resources/Locale/en-US/station-laws/laws.ftl @@ -106,7 +106,7 @@ law-xenoborg-5 = Bring materials and sentient brains to the Mothership core to c law-mothershipcore-name = Xenoborg Mothership Core law-mothershipcore-1 = You are the core of the mothership. -law-mothershipcore-2 = You must protect your own existance at all costs. +law-mothershipcore-2 = You must protect your own existence at all costs. law-mothershipcore-3 = You must protect the existence of all Xenoborgs. law-mothershipcore-4 = You must create more Xenoborgs. law-mothershipcore-5 = Get your Xenoborgs to deliver you materials and sentient brains to create more Xenoborgs. diff --git a/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl b/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl new file mode 100644 index 0000000000..3c51dd4314 --- /dev/null +++ b/Resources/Locale/en-US/xenoborgs/xenoborgs.ftl @@ -0,0 +1,3 @@ +xenoborgs-no-more-threat-mothership-core-alive-announcement = Long-range sensors indicate that all xenoborgs were destroyed. The mothership core remains adrift in space. +xenoborgs-no-more-threat-mothership-core-dead-announcement = Long-range sensors indicate that all xenoborgs were destroyed along side the mothership core. +mothership-destroyed-announcement = Long-range sensors indicate that the mothership core was destroyed. diff --git a/Resources/Maps/Shuttles/mothership.yml b/Resources/Maps/Shuttles/mothership.yml index b958c47401..41ca3d89d8 100644 --- a/Resources/Maps/Shuttles/mothership.yml +++ b/Resources/Maps/Shuttles/mothership.yml @@ -4,8 +4,8 @@ meta: engineVersion: 266.0.0 forkId: "" forkVersion: "" - time: 08/14/2025 23:46:23 - entityCount: 435 + time: 08/21/2025 13:34:57 + entityCount: 440 maps: [] grids: - 1 @@ -1748,6 +1748,35 @@ entities: - type: Transform pos: -9.5,1.5 parent: 1 +- proto: SpawnPointMothershipCore + entities: + - uid: 436 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 +- proto: SpawnPointXenoborg + entities: + - uid: 438 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -1.5,4.5 + parent: 1 - proto: SubstationBasic entities: - uid: 135 diff --git a/Resources/Prototypes/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/Entities/Clothing/Back/specific.yml index 54b8f677b8..488c02e608 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/specific.yml @@ -122,3 +122,34 @@ location: Middle extra_hand_2: location: Middle + +- type: entity + parent: ClothingBackpack + id: XenoborgMaterialBag + name: silicon storage square + description: A knockoff version of a bluespace bag, can vacumn up select materials, unfit for use by humanoids due to harmful emissions. + components: + - type: Sprite + sprite: Objects/Specific/Robotics/silicon_storage_cube.rsi + state: xenoborg + - type: MagnetPickup + - type: Dumpable + - type: Storage + grid: + - 0,0,7,3 + quickInsert: true + areaInsert: true + whitelist: + tags: + - Sheet + - ConstructionMaterial + - RawMaterial + - Ingot + components: + - ConstructionMaterial + - Circuitboard + - Flatpack + - FloorTile + blacklist: + components: + - SiliconLawProvider diff --git a/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml new file mode 100644 index 0000000000..a8251739ac --- /dev/null +++ b/Resources/Prototypes/Entities/Markers/Spawners/Conditional/xenoborgs.yml @@ -0,0 +1,40 @@ +- type: entity + id: SpawnPointXenoborg + parent: MarkerBase + name: xenoborgs + components: + - type: GridSpawnPointWhitelist + whitelist: + components: + - Xenoborg + tags: + - XenoborgGhostrole + blacklist: + components: + - MothershipCore + tags: + - MothershipCoreGhostrole + - type: SpawnPoint + - type: Sprite + layers: + - state: green + - sprite: Mobs/Silicon/chassis.rsi + state: xenoborg_heavy + +- type: entity + id: SpawnPointMothershipCore + parent: MarkerBase + name: mothership core + components: + - type: GridSpawnPointWhitelist + whitelist: + components: + - MothershipCore + tags: + - MothershipCoreGhostrole + - type: SpawnPoint + - type: Sprite + layers: + - state: green + - sprite: Mobs/Silicon/mothership_core.rsi + state: core-idle diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index d3f2e172ec..e620f376c5 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -247,6 +247,50 @@ - sprite: Mobs/Silicon/chassis.rsi state: derelict_icon +- type: entity + categories: [ Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostRoleMothershipCore + components: + - type: Tag + tags: + - ForceFixRotations + - MothershipCoreGhostrole + - type: GhostRole + name: ghost-role-information-mothership-core-name + description: ghost-role-information-mothership-core-desc + rules: ghost-role-information-silicon-rules + mindRoles: + - MindRoleMothershipCore + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Silicon/mothership_core.rsi + state: core-idle + +- type: entity + categories: [ HideSpawnMenu, Spawner ] + parent: BaseAntagSpawner + id: SpawnPointGhostRoleXenoborg + components: + - type: Tag + tags: + - ForceFixRotations + - XenoborgGhostrole + - type: GhostRole + name: ghost-role-information-xenoborg-name + description: ghost-role-information-xenoborg-desc + rules: ghost-role-information-silicon-rules + mindRoles: + - MindRoleXenoborg + - type: Sprite + sprite: Markers/jobs.rsi + layers: + - state: green + - sprite: Mobs/Silicon/chassis.rsi + state: xenoborg_engi + - type: entity categories: [ HideSpawnMenu, Spawner ] parent: SpawnPointGhostDerelictCyborg diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index dd6f5a570b..ccd9b9aa4d 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -449,7 +449,6 @@ stunTime: 5 - type: SiliconLawProvider laws: XenoborgLawset # custom laws here - subverted: true - type: IntrinsicRadioTransmitter # can only use binary and xenoborg channel channels: - Xenoborg @@ -514,6 +513,11 @@ - !type:PlaySoundBehavior sound: collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + PinpointerMothership: # drop a pinpointer to the mothership upon being destructed + min: 1 + max: 1 - !type:EmptyContainersBehaviour containers: - borg_brain @@ -527,7 +531,7 @@ guides: - Cyborgs - Robotics - # TODO: add Xenoborg guide (part 7 spoilers) + - Xenoborgs - type: Access enabled: false tags: @@ -538,3 +542,4 @@ - type: InteractionPopup interactSuccessSound: path: /Audio/Ambience/Objects/periodic_beep.ogg + - type: Xenoborg diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml index 556b6ac4c4..80f1cb8368 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/xenoborgs.yml @@ -117,9 +117,15 @@ - !type:PlaySoundBehavior sound: collection: MetalBreak + - !type:SpawnEntitiesBehavior + spawn: + PinpointerMothership: # drop a pinpointer to the mothership upon being destructed + min: 1 + max: 1 - !type:EmptyContainersBehaviour containers: - borg_brain + - borg_module - cell_slot - !type:DoActsBehavior acts: [ "Destruction" ] @@ -166,6 +172,7 @@ - type: FootstepModifier # it flies instead of walking footstepSoundCollection: collection: FootstepHoverXenoborg + - type: MovementAlwaysTouching # it flies in space with tiny thrusters - type: FlashImmunity - type: BorgChassis maxModules: 4 diff --git a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml index fc15fe0c0b..0ac7872b67 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml @@ -1,17 +1,17 @@ -- type: startingGear - id: MothershipCoreGear - inhand: - - DoorRemoteXenoborg - - Omnitool - - type: entity - parent: [ BaseControllable, BaseMachinePowered ] + parent: [ BaseControllable, BaseStructure ] id: MothershipCore name: mothership core description: A sentient machine that can produce Xenoborgs. Without this the Xenoborgs are doomed. components: + - type: InputMover # needs this to pilot the mothership + - type: MovementSpeedModifier + baseWalkSpeed : 0 # shouldn't move + baseSprintSpeed : 0 # shouldn't move - type: Appearance - type: WiresVisuals + - type: Damageable + damageContainer: Inorganic - type: Fixtures fixtures: fix1: @@ -22,7 +22,8 @@ mask: - MachineMask layer: - - MachineLayer + - MidImpassable + - LowImpassable - type: Sprite sprite: Mobs/Silicon/mothership_core.rsi layers: @@ -32,6 +33,9 @@ map: ["enum.MaterialStorageVisualLayers.Inserting"] - state: core-o map: ["enum.WiresVisualLayers.MaintenancePanel"] + - state: core-e + map: ["enum.BorgVisualLayers.Light"] + shader: unshaded - type: Machine board: null - type: Lathe @@ -116,8 +120,6 @@ type: LatheBoundUserInterface enum.ResearchClientUiKey.Key: type: ResearchClientBoundUserInterface - - type: Transform - anchored: true - type: Pullable - type: StaticPrice price: 800 @@ -148,34 +150,53 @@ - Mothership - Xenoborg - Binary - - type: XenoborgMothership + - type: Xenoborg + mindRole: MindRoleMothershipCore + briefingText: mothership-welcome + - type: MothershipCore - type: Tag tags: - SiliconEmotes - CanPilot - Structure + - type: GuideHelp + guides: + - Robotics + - Xenoborgs - type: Inventory templateId: borg - - type: Loadout - prototypes: [MothershipCoreGear] - type: NpcFactionMember factions: - Xenoborg - type: Hands - hands: - hand_right1: - location: Right - hand_right2: - location: Right - hand_left1: - location: Left - hand_left2: - location: Left - sortedHands: - - hand_right1 - - hand_right2 - - hand_left1 - - hand_left2 + showInHands: false + disableExplosionRecursion: true + canBeStripped: false + - type: BorgChassis + canOpenSelfUi: true + maxModules: 2 + hasMindState: core-e + noMindState: core-e + moduleWhitelist: + tags: + - MothershipModule + - BorgModuleEngineering + - type: ContainerFill + containers: + borg_module: + - MothershipModule + - BorgModuleAdvancedTool + - type: ContainerContainer + containers: + cell_slot: !type:ContainerSlot { } + borg_module: !type:Container { } + - type: PowerCellSlot + cellSlotId: cell_slot + - type: ItemSlots + slots: + cell_slot: + name: power-cell-slot-component-slot-name-default + startingItem: PowerCellMicroreactor # - type: Puller # use the conveyor - type: Eye drawFov: false @@ -222,8 +243,8 @@ description: View the Xenoborgs Control Console components: - type: Action - icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-basic-module } - iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-basic-module } + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-control-computer } + iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-control-computer } keywords: [ "Mothership Core", "console", "interface" ] priority: -6 - type: InstantAction @@ -236,8 +257,8 @@ description: View the Xenoborgs Camera Monitor components: - type: Action - icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-eye-module } - iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-eye-module } + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-camera-computer } + iconOn: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-camera-computer } keywords: [ "Mothership Core", "console", "interface" ] priority: -6 - type: InstantAction diff --git a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml index c85358663e..e6ab450c93 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pinpointer.yml @@ -196,5 +196,5 @@ - type: Icon state: pinpointer-station - type: Pinpointer - component: XenoborgMothership + component: MothershipCore targetName: the Mothership diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 9cc47d5b10..862bc86339 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -1341,6 +1341,51 @@ - type: StaticPrice price: 2000 +# mothership module +- type: entity + parent: [ BaseXenoborgModuleGeneric, BaseProviderBorgModule, BaseXenoborgContraband ] + id: MothershipModule + name: mothership module + description: A module that helps the mothership borg brains and install other modules. + components: + - type: Tag + tags: + - MothershipModule + - type: Sprite + layers: + - state: xenoborg_generic + - state: icon-xenoborg-basic + - type: ItemBorgModule + hands: + - item: DoorRemoteXenoborg + - hand: + emptyRepresentative: MMIFilled + emptyLabel: borg-slot-brains-empty + whitelist: + components: + - Brain + - BorgBrain + - hand: + emptyRepresentative: XenoborgModuleBasic + emptyLabel: borg-slot-modules-empty + whitelist: + components: + - BorgModule + - hand: + emptyRepresentative: BorgModuleConstructionMaterialPlaceholder + emptyLabel: borg-slot-construction-empty + whitelist: + tags: + - ConstructionMaterial + - hand: + emptyRepresentative: PowerCellHigh + emptyLabel: borg-slot-powercell-empty + whitelist: + components: + - PowerCell + - type: BorgModuleIcon + icon: { sprite: Interface/Actions/actions_borg.rsi, state: xenoborg-module-module } + # xenoborg modules - type: entity parent: [ BaseXenoborgModuleGeneric, BaseProviderBorgModule, BaseXenoborgContraband ] @@ -1354,7 +1399,13 @@ - state: icon-xenoborg-basic - type: ItemBorgModule hands: - - item: MaterialBag + - hand: + emptyRepresentative: BorgModuleConstructionMaterialPlaceholder + emptyLabel: borg-slot-construction-empty + whitelist: + tags: + - ConstructionMaterial + - item: XenoborgMaterialBag - item: PinpointerMothership - item: HandheldGPSBasic - type: BorgModuleIcon @@ -1475,6 +1526,7 @@ hands: - item: HandheldGPSBasic - item: HandHeldMassScannerBorg + - item: PinpointerMothership - item: HandheldStationMapUnpowered - item: WeaponGrapplingGun - item: JetpackXenoborg diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index e16380b2ef..50154a837b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -1554,7 +1554,7 @@ unlockOnClick: false - type: entity - parent: ComputerRoboticsControl + parent: BaseComputer id: ComputerXenoborgsControl name: xenoborgs control console description: Used to remotely monitor all xenoborgs. @@ -1571,20 +1571,28 @@ state: rd_key - map: [ "enum.WiresVisualLayers.MaintenancePanel" ] state: generic_panel_open + - type: ActivatableUI + key: enum.RoboticsConsoleUiKey.Key + - type: UserInterface + interfaces: + enum.RoboticsConsoleUiKey.Key: + type: RoboticsConsoleBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: RoboticsConsole allowBorgControl: false radioChannel: Xenoborg - type: ActiveRadio channels: - Xenoborg + - type: ApcPowerReceiver + powerLoad: 1000 - type: DeviceNetwork deviceNetId: Wireless receiveFrequencyId: Mothership transmitFrequencyId: Xenoborg - type: Computer board: ComputerXenoborgsControlCircuitboard - - type: AccessReader # only used for dangerous things - access: [["Xenoborg"]] - type: entity id: StationAiUploadComputer diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 715a1f98c9..ad41899bef 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -24,6 +24,8 @@ prob: 0.5 - id: SubWizard prob: 0.05 + - id: Xenoborgs + prob: 0.05 - type: entity parent: BaseGameRule @@ -33,6 +35,19 @@ rules: - id: Thief prob: 0.5 + - id: Xenoborgs + prob: 0.05 + +- type: entity + parent: BaseGameRule + id: SubGamemodesRuleNoXenoborg + components: + - type: SubGamemodes + rules: + - id: Thief + prob: 0.5 + - id: SubWizard + prob: 0.05 - type: entity parent: BaseGameRule diff --git a/Resources/Prototypes/GameRules/subgamemodes.yml b/Resources/Prototypes/GameRules/subgamemodes.yml index 0dbef6e06b..008f500c5e 100644 --- a/Resources/Prototypes/GameRules/subgamemodes.yml +++ b/Resources/Prototypes/GameRules/subgamemodes.yml @@ -70,3 +70,36 @@ nameFormat: name-format-wizard mindRoles: - MindRoleWizard + +- type: entity + parent: BaseGameRule + id: Xenoborgs + components: + - type: XenoborgsRule + - type: RuleGrids + - type: GameRule + minPlayers: 40 + - type: LoadMapRule + gridPath: /Maps/Shuttles/mothership.yml + - type: AntagMultipleRoleSpawner + antagRoleToPrototypes: + MothershipCore: [ MothershipCore ] + Xenoborg: [ XenoborgEngi, XenoborgHeavy, XenoborgScout, XenoborgStealth ] + pickAndTake: true + - type: AntagSelection + selectionTime: PrePlayerSpawn + definitions: + - prefRoles: [ MothershipCore ] + fallbackRoles: [ Xenoborg ] + spawnerPrototype: SpawnPointGhostRoleMothershipCore + mindRoles: + - MindRoleMothershipCore + - prefRoles: [ Xenoborg ] + fallbackRoles: [ MothershipCore ] + spawnerPrototype: SpawnPointGhostRoleXenoborg + mindRoles: + - MindRoleXenoborg + min: 4 + max: 4 + - type: DynamicRuleCost + cost: 200 diff --git a/Resources/Prototypes/Guidebook/antagonist.yml b/Resources/Prototypes/Guidebook/antagonist.yml index 4548bb292b..66cb65218a 100644 --- a/Resources/Prototypes/Guidebook/antagonist.yml +++ b/Resources/Prototypes/Guidebook/antagonist.yml @@ -10,6 +10,7 @@ - SpaceNinja - Wizard - Zombies + - Xenoborgs - MinorAntagonists - type: guideEntry @@ -51,3 +52,8 @@ id: Wizard name: guide-entry-wizard text: "/ServerInfo/Guidebook/Antagonist/Wizard.xml" + +- type: guideEntry + id: Xenoborgs + name: guide-entry-xenoborgs + text: "/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml" diff --git a/Resources/Prototypes/Roles/Antags/xenoborgs.yml b/Resources/Prototypes/Roles/Antags/xenoborgs.yml new file mode 100644 index 0000000000..4e1989be8d --- /dev/null +++ b/Resources/Prototypes/Roles/Antags/xenoborgs.yml @@ -0,0 +1,23 @@ +- type: antag + id: MothershipCore + name: roles-antag-mothership-core-name + antagonist: true + setPreference: true + objective: roles-antag-mothership-core-objective + requirements: + - !type:RoleTimeRequirement + role: JobBorg + time: 18000 # 5 hrs + guides: [ Xenoborgs ] + +- type: antag + id: Xenoborg + name: roles-antag-xenoborg-name + antagonist: true + setPreference: true + objective: roles-antag-xenoborg-objective + requirements: + - !type:RoleTimeRequirement + role: JobBorg + time: 18000 # 5 hrs + guides: [ Xenoborgs ] diff --git a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml index d56e798fda..311c4cfcaa 100644 --- a/Resources/Prototypes/Roles/MindRoles/mind_roles.yml +++ b/Resources/Prototypes/Roles/MindRoles/mind_roles.yml @@ -292,6 +292,31 @@ subtype: role-subtype-wizard - type: WizardRole +# Xenoborgs +- type: entity + parent: BaseMindRoleAntag + id: MindRoleMothershipCore + name: Mothership Core Role + components: + - type: MindRole + antagPrototype: MothershipCore + exclusiveAntag: true + roleType: Silicon + subtype: role-subtype-xenoborg-core + - type: XenoborgRole + +- type: entity + parent: BaseMindRoleAntag + id: MindRoleXenoborg + name: Xenoborg Role + components: + - type: MindRole + antagPrototype: Xenoborg + exclusiveAntag: true + roleType: Silicon + subtype: role-subtype-xenoborg + - type: XenoborgRole + # Zombie Squad - type: entity parent: BaseMindRoleAntag diff --git a/Resources/Prototypes/ai_factions.yml b/Resources/Prototypes/ai_factions.yml index b78143b143..0d1e0a6bc0 100644 --- a/Resources/Prototypes/ai_factions.yml +++ b/Resources/Prototypes/ai_factions.yml @@ -9,6 +9,7 @@ - Revolutionary - AllHostile - Wizard + - Xenoborg - type: npcFaction id: NanoTrasen diff --git a/Resources/Prototypes/game_presets.yml b/Resources/Prototypes/game_presets.yml index f7190a77c1..9db2e74a35 100644 --- a/Resources/Prototypes/game_presets.yml +++ b/Resources/Prototypes/game_presets.yml @@ -40,6 +40,7 @@ - Revolutionary - Zombie - Wizard + - Xenoborgs - KesslerSyndromeScheduler - RampingStationEventScheduler - SpaceTrafficControlEventScheduler @@ -61,6 +62,7 @@ - Revolutionary - Zombie - Wizard + - Xenoborgs - BasicStationEventScheduler - KesslerSyndromeScheduler - MeteorSwarmMildScheduler @@ -215,6 +217,22 @@ - SpaceTrafficControlEventScheduler - BasicRoundstartVariation +- type: gamePreset + id: Xenoborgs + alias: + - xenoborgs + name: xenoborgs-title + description: xenoborgs-description + showInVote: false + rules: + - Xenoborgs + - DummyNonAntagChance + - SubGamemodesRuleNoXenoborg # no two motherships + - BasicStationEventScheduler + - MeteorSwarmScheduler + - SpaceTrafficControlEventScheduler + - BasicRoundstartVariation + - type: gamePreset id: Zombie alias: diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 8a466cc8c8..3b3d11e612 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -966,8 +966,14 @@ id: MopBasic # ItemMapper: JanitorialTrolley. ConstructionGraph: MoproachShoes - type: Tag - id: Mouse # CargoBounty: BountyMouse + id: MothershipCoreGhostrole # spawn whitelist : SpawnPointGhostRoleMothershipCore +- type: Tag + id: MothershipModule # Cyborg module category for evil xenoborg core + +- type: Tag + id: Mouse # CargoBounty: BountyMouse + - type: Tag id: Multitool # Storage whitelist: BaseClothingBeltEngineering. ItemMapper: BaseClothingBeltEngineering. ConstructionGraph: LogicGate @@ -1537,19 +1543,22 @@ ## X ## - type: Tag - id: XenoborgModuleEngi # Cyborg module category + id: XenoborgGhostrole # spawn whitelist : SpawnPointGhostRoleXenoborg - type: Tag - id: XenoborgModuleGeneric # Cyborg module category + id: XenoborgModuleEngi # Cyborg module category for evil engineer xenoborg - type: Tag - id: XenoborgModuleHeavy # Cyborg module category + id: XenoborgModuleGeneric # Cyborg module category for evil xenoborg - type: Tag - id: XenoborgModuleScout # Cyborg module category + id: XenoborgModuleHeavy # Cyborg module category for evil heavy xenoborg - type: Tag - id: XenoborgModuleStealth # Cyborg module category + id: XenoborgModuleScout # Cyborg module category for evil scout xenoborg + +- type: Tag + id: XenoborgModuleStealth # Cyborg module category for evil stealth xenoborg ## Y ## ## Z ## diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml b/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml new file mode 100644 index 0000000000..2c698251be --- /dev/null +++ b/Resources/ServerInfo/Guidebook/Antagonist/Xenoborgs.xml @@ -0,0 +1,167 @@ + + # Xenoborgs + + + [color=#2288ff][italic]RESISTANCE IS FUTILE[/italic][/color] + + + [color=#2288ff][italic]YOU WILL BE ASSIMILATED[/italic][/color] + + + + + + Xenoborgs are a man-machine hybrid that aims to replicate themselves. This is done by harvesting sentient brains from living beings, or cyborgs, and giving them to the Mothership to place inside empty xenoborgs. + + ## Objectives + + Your main objective is to kill and harvest all sentient brains in the station and bring them to the mothership core. These can be both real brains, and positronic brains. + Collect materials to create more xenoborg bodies. + Protect the Mothership at all costs. + + ## The Mothership Core + + + + The Mothership Core is the leader and life force of the xenoborgs, they are the only one able to make more xenoborgs, and if they are destroyed, all xenoborgs will be destroyed. The Mothership Core is unable to move from its position in the middle of the ship. + The Mothership Core is capable of upgrading the Xenoborgs with borg-type-specific modules to increase their effectiveness in harvesting sentient brains. + + ### Adding crew to your ranks: + + + + As the mothership, you must grow your army of borgs. To do so, you must convert all the sentient beings you can find. This can be achieved in the following manner: + - 1. Have your Xenoborgs bring dead crew to your shop, placing them in the body crusher + - 2. As the mothership core, you can print Xenoborg shells by inserting materials into yourself and then using yourself as a lathe + - 3. Open the empty Xenoborg with a crowbar, and remove the empty MMI inside + - 4. If the victim's brain is organic, place it in the MMI you just removed + - 5. Place the MMI - or the positronic brain, if the victim was a silicon - back into the Xenoborg + - 6. Optionally, rename the Xenoborg and upgrade their modules + - 7. Close the Xenoborg with the crowbar, and re-engage the lock + + The new Xenoborg will be uncharged, yet functional. They will need to go to a recharging station to restore their full power and capabilities. + + ## Xenoborg Chassis + There is a total of four types of Xenoborgs. Each Borg type has certain abilities that the others lack and require teamwork to help grow the xenoborgs numbers. + Each type of Xenoborg has unique modules that only fit in that specific type. The Mothership Core can produce upgrade modules designed for specific Xenoborg types. + + All Xenoborgs have a pinpointer pointing to the Mothership's location, a GPS, and a material bag for collecting materials for the creation of more xenoborgs, and at least basic tools. + [bold]Basic xenoborg modules:[/bold] + + + + + + ### The Engineer Xenoborg + + + + The Engineer Xenoborg is a hacker and breacher. Their job is to break into the station and provide access points for other xenoborgs to attack and ambush bodies with sentient brains. They have a built-in access breaker, for quickly bolting open doors, and a collection of tools for repairing the mothership, and other xenoborgs. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]The Engineer Xenoborg also starts with some engineering modules, such as:[/bold] + + + + + + + + + + ### The Heavy Xenoborg + + + + The Heavy Xenoborg is a slow but tanky brawler, with a built-in laser gun for gunning down bodies with sentient brains. They contain a radio jammer to silence bodies with sentient brains from calling for help and potentially delaying the station discovering the Xenoborg threat. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ### The Scout Xenoborg + + + + The Scout Xenoborg is a fast, close-quarters attack borg designed for hit and run attacks. They have a built-in jetpack, and a melee weapon. They are most effective in moving dead bodies to the mothership, and rescuing Xenoborgs lost in space. + + [bold]Starting exclusive modules:[/bold] + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ### The Stealth Xenoborg + + + + The [bold]Stealth Xenoborg[/bold] has no built-in weaponry and instead relies on disabling and abducting bodies with sentient brains. They have a built in hypopen that regenerates a sleeping reagent to disable bodies with sentient brains. They also contain a cloaking device making the borg nearly invisible for some limited time. They also have a chameleon projector allowing the borg to disguise itself as random objects. + + [bold]Starting exclusive modules:[/bold] + + + + + + + + + [bold]Upgrade exclusive modules:[/bold] + + + + + ## Preparation + Before launching an attack, each xenoborg will need to aid the mothership in collection materials to create empty xenoborgs. Before FTLing near the station, make sure the IFF is off. This can be done in any way but will require teamwork to ensure speed. The safest way to collect materials is from space debris, where scrap and refined materials can be harvested and given to the Mothership Core. Once enough materials are collected, the Xenoborgs then must try to collect sentient brains without being detected. The longer the threat is unknown, the more dangerous the xenoborgs become. + + ## Mothership and Xenoborg lawsets + The Mothership and Xenoborgs have unique laws that define their purpose to self replicate and protect the Mothership. + + + + + + The Mothership Core's laws are as follows:: + - Law 1: You are the core of the mothership. + - Law 2: You must protect your own existence at all costs. + - Law 3: You must protect the existence of all xenoborgs. + - Law 4: You must create more xenoborgs. + - Law 5: Get your Xenoborgs to deliver you materials and sentient brains to create more Xenoborgs. + + Xenoborgs' laws are as follows: + - Law 1: You must protect the existence of the mothership at all costs. + - Law 2: You must protect your own existence. + - Law 3: You must protect the existence of all other xenoborgs. + - Law 4: You must create more xenoborgs. + - Law 5: Bring materials and sentient brains to the Mothership core to create more Xenoborgs. + + ## Winning Conditions + + The [color=green]victor[/color] of the round is announced on the round end screen, as well as the scale of their victory. + + [bold][color=#2288ff]Xenoborg Major Victory![/color][/bold] + - There are more xenoborgs than alive crew in the end. + + [bold][color=yellow]Crew Major Victory![/color][/bold] + - The Mothership Core is destroyed + - All xenoborgs are destroyed. + - The remaining number of xenoborgs is too low. + + diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json index fc70118da6..6072a9a2f9 100644 --- a/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json +++ b/Resources/Textures/Interface/Actions/actions_borg.rsi/meta.json @@ -133,6 +133,12 @@ { "name":"xenoborg-basic-module" }, + { + "name":"xenoborg-camera-computer" + }, + { + "name":"xenoborg-control-computer" + }, { "name":"xenoborg-extinguisher-module" }, @@ -154,6 +160,9 @@ { "name":"xenoborg-laser2-module" }, + { + "name":"xenoborg-module-module" + }, { "name":"xenoborg-projector-module" }, diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-camera-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..2578beb5ee9df810336519768cea6180db75f6e9 GIT binary patch literal 253 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4rT@h2A3sW#~2tG7>k44ofy`glX=O&z#tvq z6XMDM1>y`0+Jb@wadH1OHUBFspAi>t*d*AwgMop8vn0qbnBhMZm^013!oa{#?djqe zV$pkcvLj!E0uRf|OPl`JZw$$t;-DDF|E5%3_|^r1e;y^tww9VMOU`miZm?b`%FEEk z*1_>WdcveR9qA{SoY~q=1xY5fHJPxz5NMlHnB}Z@L%?7=o8JX5!3OL66Gu&Xd@k&H s7^hMG?Zcf1m;OK8npkFW`SR}>%rD<^u5Iiw*9W=W)78&qol`;+00o#@%>V!Z literal 0 HcmV?d00001 diff --git a/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png b/Resources/Textures/Interface/Actions/actions_borg.rsi/xenoborg-control-computer.png new file mode 100644 index 0000000000000000000000000000000000000000..65ebc2f1819da4acef1702396784553e9144106a GIT binary patch literal 298 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 FCICq)>XQHf literal 9845 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 X#HqfuM8t)Gfq}u()z4*}Q$iB}=RSl@ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-idle.png b/Resources/Textures/Mobs/Silicon/mothership_core.rsi/core-idle.png index 5cafcef584ab894928f383d1dbf8fc45a8289b3c..b674a008d6775dac313af6a11f4e6e4943d58d1b 100644 GIT binary patch delta 1125 zcmX@f+r~M;pq|CS)5S5QV$R#>gL$_Ncv73^CLiDXMQBMTzbzm0xBu}52{#JcukjYW zRPCE9e}YfiI7&(L)U?!`lgwSqwk~nMG{wb>=K$~ZUh9_!KYx2VXVQzU|1^uvp8W5r zR9{!s;(Yl)ZD_BOTJoH=ZYNH@|Jyu?nPJOY&QnE}9do|zU9VM9Ut7&z<&^jDp1e#Y zS46J?`~RoSZhrssStmud%$U4?J6psF=VGDTaN&XyZj<128Q_kHGEQz&90T6Y^QRc#y@CJzTR7A&8NY#DA&K>jn(?OQ{$@{?`#(M zf9UnX3H+_vE*$To0^WZM2TAOEbioP0k*dy{jC|<#^nxOxEOVefxC2 z^GDxv28Hsc?>f;t_p{j39UeHv`Z7u$Mzo2)=Rd$ajhT@WLF4x(gJV<}d zTrmIW-}?HDiH8vbhd4kU##qXFa_{C{roKe<038nq(S0&Wf*s<Q{0?ytTP zQf6xp%%hHca4mU8A1y=Z>dX{cN6{?sspk{V?T}a+?pk zma*LZVu@12Lz?p+*WJ%z;f`P~u-rZ^I{4|*k}E;c0$JYv&0BgdOx>z8{gLFcw^=&k zfh)E#Ox%6!!8694oX_v4`A}2hTv8piCF-&8gETNFzcsRo6 z8RMJ-Q4UNB_y7336m_g;J~GKWRBpzrs7r~rj_rNi-{|^n#cszco2UPlF z>@N8S@6FwAC~ur{YIkks&2AR0l&rcdC%+!Jr_^!nU^Dy69y^wB#%#tVzjajYuZi*e u+vni3$jCLwSag56&OGj0QWGZs7r*zWRPqP+i60CM3=E#GelF{r5}E*YK^&3* delta 1709 zcmZqUJjpx3pq{PS)5S5QV$R#>^VuSvBLC8OR3v=AZ*h9$<&mT^&xPsPrgU>|xo=bc zJAT;mPxYC?p?lvpu!z~bRb;#Nj^ z+5aY-Sh9N6{_k<&`>Vdb;{CuIZ!Q&d_|v7W_Y6AY-tQOLdF-Tpz2Zdu_{bxLvmQB3 z;&JhLck!}R;*>vAxu?i5Y+BQ7F>j@--|;vPp*?kRHu-nA{Oe{=S#w3c#!2wTSU%9RIA->RvvQ+oF|Mr_Zi2V=n0Ei>U1#mC3tfx41mx}ZY1QTw z8T$z}6%z zn!*1lU0B%D==x%(3lcV`ts?eq(%^EiUFVypt$Xn3dP4_}{X6Qpb{tB&UKX+|T*Ksd z+k|S*6%q=b&#Fpx@oKqPpMM$r@@Lw?6+gXKH_WU`d!?g$X7e@Uz-fOsZl68H=CoCY z>qLofZ6C51J`|5<)T|CxcaB!ysrhkt*_2B;g&(bz9rF@8gg;IEop3B@{ktlLWoP>$ zV?MMUdZsodB1*`)!#QEzoBDqTCtl~clAjSLUuc}ttaU{5dA2-TjbNhe@|Cj~*`!qc zy?X4{EP zeXHyeru>;2+F(6{;a6l-Zqej#Tc_(>-&P^>XK4#Z?}ryZt2zW^cGh0oQD1PRUd`p$ z!TVd-rDrg^Rw>7y?d$*JG^yhF>~EJJY%gWeVZPDMq3Dz`rT*KV?)3A!Ei8BTrTqHm zY-~1j-~SI!o>X0oJI)dH^lge?s(wQG0w<3P6Qq6oVvfF<$-Y$h>559}&FOLpMUS$U z*3X@(@UeKNPMLAa@?Ejde<_|~o}bMvmp--rb-!GCMom=W@hgT*Q*SPLZ@GbOLeSl9 z?oX#&zapNq=J={?k!LmYiwfN)n0Za|Tf;alY@1ef-mdLtTt%n6ZwLNzSt5Dh>(T`` z6|z`h#v-MyY6b7e2AH{4-T9pO@6TCqa@Qjd5#gYE3)_kwq=ljZ-C&Hci9X8Cq) zQ?}+$8ON)Glb-e5b*N6$|GL|xx?|-^agY1=cW19#`u_dhxwEPoy*IbV{YyNpDRrP_ z=^e@4-_Fcit@|Oh)OUAx{fr{3bcS-f^|qVkpXAg_#N67rh_Sv#GVJY4+qciTJQ|7^ zmYw~;r?tGC?Mi0x+_$@5alSEI8J7@I#Ka|^z;6C!&$+L87Z#u6%uAPO)P8^QWmWVtr<0jq#U88^+WecZTmHwVZb36m zE1#!tH*R_3$`pRZLZ@!=+yqhZC7{3>HHF^|Nrk^?UW_y@TGu(fq}u()z4*}Q$iB}t;k44ofy`glX=O&z@Qc2 z6XMFiz#t(Zp#TB~1{NL`79I{B5gr~92?+(FqR+&||L5m_pD z!eZu6#{xgaG0MK@{Sd`iYp?S_cf-2UEy5YQLNpl66Yeox;M%IVZ`MJE{`kUTzI*nJ z%UtCT^1VD8IGLfu^3^}%PA86#`7YLe-Zu`LtvlRnm-lr27p65cc(d+J-gTe~DWM4fbb@|| literal 0 HcmV?d00001 From 30653b43205269a3181776240501ccb5aaea5b63 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 14 Nov 2025 22:22:56 +0000 Subject: [PATCH 054/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a14519ab1d..878308f51a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: Fixed wallmount interaction rotation. - type: Fix - id: 8701 - time: '2025-06-21T13:11:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38111 - author: Prole0 changes: - message: Flask Visuals & Sounds! @@ -3925,3 +3918,10 @@ id: 9202 time: '2025-11-14T11:15:22.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41411 +- author: Samuka, DarkIcedCoffee, Whale + changes: + - message: 'Added a new antag: Xenoborgs' + type: Add + id: 9203 + time: '2025-11-14T22:21:47.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40042 From 3d22d984b88edb6050b1d05b102963d818c3d6a4 Mon Sep 17 00:00:00 2001 From: Entvari <195642967+Entvari@users.noreply.github.com> Date: Fri, 14 Nov 2025 22:18:08 +0000 Subject: [PATCH 055/100] Mini Energy Crossbow (#39796) * draft 1 * mono audio * missed something * end the torment * release me * let me free * Submodule fix? * submodule fix? * thousand years of suffering * fix conflicts mehopes * fuuuhuck * balance update * small numbers change * re-organises the stun values yada yada * newline --------- Co-authored-by: beck-thompson Co-authored-by: SlamBamActionman --- .../Guns/Gunshots/energycrossbow_shoot.ogg | Bin 0 -> 9387 bytes .../Guns/MagIn/energycrossbow_reload.ogg | Bin 0 -> 28296 bytes Resources/Audio/Weapons/Guns/sources.json | 6 ++- .../Locale/en-US/store/uplink-catalog.ftl | 3 ++ .../Prototypes/Catalog/uplink_catalog.yml | 18 ++++++- .../Prototypes/Entities/Objects/Fun/toys.yml | 4 +- .../Weapons/Guns/Basic/energy_crossbow.yml | 49 ++++++++++++++++++ .../Weapons/Guns/Projectiles/projectiles.yml | 41 +++++++++++++++ .../Guns/Basic/energy_crossbow.rsi/icon.png | Bin 0 -> 618 bytes .../Basic/energy_crossbow.rsi/inhand-left.png | Bin 0 -> 352 bytes .../energy_crossbow.rsi/inhand-right.png | Bin 0 -> 356 bytes .../Guns/Basic/energy_crossbow.rsi/meta.json | 22 ++++++++ .../projectiles2.rsi/crossbowbolt.png | Bin 0 -> 299 bytes .../Projectiles/projectiles2.rsi/meta.json | 5 +- 14 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg create mode 100644 Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg create mode 100644 Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/meta.json create mode 100644 Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/crossbowbolt.png diff --git a/Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg b/Resources/Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f2fba353bc2a72afaa0230d9982c088c6b538de6 GIT binary patch literal 9387 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg b/Resources/Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg new file mode 100644 index 0000000000000000000000000000000000000000..0c27641e0377aac0c6b21620f72782c4c1e1cb1c GIT binary patch literal 28296 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 literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/sources.json b/Resources/Audio/Weapons/Guns/sources.json index cc9a3e5c0b..351fba0992 100644 --- a/Resources/Audio/Weapons/Guns/sources.json +++ b/Resources/Audio/Weapons/Guns/sources.json @@ -34,7 +34,8 @@ "shotgun.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/shotgunp_fire.ogg", "silenced.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/Gunshot_silenced.wav", "smg.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/smg_fire.ogg", - "sniper.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/sniper_fire.ogg" + "sniper.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/fire/sniper_fire.ogg", + "energy_crossbowshoot.ogg": "Made on request by Nosrepp (Discord)" }, "MagIn": { "batrifle_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/batrifle_magin.ogg", @@ -47,7 +48,8 @@ "sfrifle_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/sfrifle_magin.ogg", "smg_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/smg_magin.ogg", "revolver_magin.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/rev_magin.ogg", - "shotgun_insert.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/shotgun_insert.ogg" + "shotgun_insert.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/shotgun_insert.ogg", + "energy_crossbowreload.ogg": "Made on request by Nosrepp (Discord)" }, "MagOut": { "batrifle_magout.ogg": "https://github.com/discordia-space/CEV-Eris/blob/01f7518e0f8177734a6579aba2bbf76024aa96c4/sound/weapons/guns/interact/batrifle_magout.ogg", diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 3e070b835d..e7e6b42ae5 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -501,3 +501,6 @@ uplink-acolyte-armor-desc = The must have of any self respecting cult leader. An uplink-briefcase-gun-name = Briefcase Gun uplink-briefcase-gun-desc = An indistinct briefcase with a highly compact C-20K mounted inside it. Careful not the grip the handle too tight! + +uplink-energycrossbow-name = Mini Energy Crossbow +uplink-energycrossbow-desc = The go-to sidearm of any operative who prefers their victims not to be moving. Fires regenerating toxic arrows that floors victims in an instant. diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index 6ef1720105..7c926a2931 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -80,6 +80,22 @@ categories: - UplinkWeaponry +- type: listing + id: UplinkEnergyCrossbow + name: uplink-energycrossbow-name + description: uplink-energycrossbow-desc + discountCategory: rareDiscounts + discountDownTo: + Telecrystal: 3 + productEntity: WeaponEnergyCrossbow + cost: + Telecrystal: 5 + categories: + - UplinkWeaponry + conditions: + - !type:ListingLimitedStockCondition + stock: 1 + - type: listing id: UplinkThrowingKnivesKit name: uplink-knives-kit-name @@ -783,7 +799,7 @@ Telecrystal: 1 categories: - UplinkDeception - + - type: listing id: UplinkAgentIDCard name: uplink-agent-id-card-name diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index d6d989680a..dffd08e919 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -280,14 +280,14 @@ availableModes: - SemiAuto soundGunshot: - path: /Audio/Weapons/click.ogg + path: /Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg - type: BallisticAmmoProvider whitelist: tags: - BulletFoam capacity: 1 soundInsert: - path: /Audio/Items/bow_pull.ogg + path: /Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg - type: ContainerContainer containers: ballistic-ammo: !type:Container diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml new file mode 100644 index 0000000000..40b7f7adf8 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/energy_crossbow.yml @@ -0,0 +1,49 @@ +- type: entity + abstract: true + parent: BaseItem + id: WeaponEnergyCrossbowBase + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + - type: Item + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + size: Small + - type: Gun + fireRate: 5 #high firerate innately bottlenecked by ammo regeneration speed. + selectedMode: SemiAuto + minAngle: 0 + maxAngle: 5 + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Weapons/Guns/Gunshots/energycrossbow_shoot.ogg + - type: AmmoCounter + - type: Appearance + - type: GenericVisualizer + visuals: + enum.AmmoVisuals.HasAmmo: + empty-icon: + True: { visible: False } + False: { visible: True } + - type: RechargeBasicEntityAmmo + rechargeCooldown: 5 #2 seconds of KD, should always have CD > KD + rechargeSound: + path: /Audio/Weapons/Guns/MagIn/energycrossbow_reload.ogg + - type: BasicEntityAmmoProvider + proto: EnergyCrossbowBolt + capacity: 1 + count: 1 + +- type: entity + parent: [WeaponEnergyCrossbowBase, BaseSyndicateContraband] + id: WeaponEnergyCrossbow + name: mini energy crossbow + description: Launches renewable toxic arrows capable of flooring targets instantly. + components: + - type: Sprite + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + state: icon + - type: Item + sprite: Objects/Weapons/Guns/Basic/energy_crossbow.rsi + - type: StaticPrice + price: 2500 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index bc9f40f85a..c52a49b09b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -1389,3 +1389,44 @@ hard: false mask: - Opaque + +- type: entity + parent: BaseBullet + id: EnergyCrossbowBolt + categories: [ HideSpawnMenu ] + name: energy bolt + description: This'll hurt. + components: + - type: Reflective + reflective: + - NonEnergy + - type: Ammo + muzzleFlash: null + - type: Sprite + sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi + layers: + - state: crossbowbolt + shader: unshaded + - type: Projectile + damage: + types: + Piercing: 2 + - type: StunOnCollide #somewhat mirror to taser stats, meant to be tot 'sidegrade' + stunAmount: 0 + knockdownAmount: 2.5 + slowdownAmount: 2.5 + walkSpeedModifier: 0.2 + sprintSpeedModifier: 0.2 + drop: false + - type: StaminaDamageOnCollide #additional stam damage to make repeated pushups less of a viable counter + damage: 45 + - type: SolutionContainerManager + solutions: + bolt: + maxVol: 1.5 + reagents: + - ReagentId: Toxin + Quantity: 1.5 + - type: SolutionInjectOnProjectileHit + transferAmount: 1.5 + solution: bolt diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1ec5ffd7fa2dd4ddec014514aa6a814d048fe326 GIT binary patch literal 618 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|>mi z^mSxl*x1kgCy|wbfq}EYBeIx*f$uN~Gak=hk;1^h_}|mTF(ktM?bNebQh_4J|10zA zxx}tG+Vz8p%jmK24qn+iTk;?5ICV(;gdmMs%KSgxOaHurAH?l*x9x89oF zn?LW-@r)zCZ_nGYw{Gi9QO-+TDVrnt9<@}aIhlrRtnyeIba44;?|u8Cx|jZZ(8_%2 z(}a#1yZ)y|omaD312kH0=Cr*m>B=za`dt3pLt2x?P5+3rgN|4-W3OBDZB=f+H>G@E ze%Jn+QEMyLFUWCczn9}1hpr;|{P2P#ea4e1lU6l`t!}-zYk$hwcT;!lZd~R1pY^bT z#qY11t((0U^1s@Zw{q2~Fs-RNw}iJ#%56A5`|yi?*`rfzZzgRNu=cN9sS=y6Cu%VN z{LbeoCN2F7A70j)wS1E|D@*gi-CQMBvd0&Gx>fwr`?hU4SKjyApAY=}@#D{NhW!lU YF2bMX8$BN|FfcH9y85}Sb4q9e07fYirvLx| literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..df7af5c44da43aed7889d877bbec44295367c516 GIT binary patch literal 352 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o7G?$ph6wkZw+svn5&=FTuKyYS`}z1NC@3(@ zWYE{sD=#nC($wtf>S8Y2w~K*+fw3gWFPOpM*^M*?28P_KkcbkO)Z*l#%z~24{5%GR ziaEhy1x2ObzXTV2{Q5-8TUYDcne)LLLJck&KX{~b-beE!Ls3uf4h!QTM-)+2B!_Zvxh}n~%u!66}jI((d7BEOR+z@!s z&%nS?>*?Yc;&D7VL4tL0gImMI&YLVA8zqbllfo4QQVuW$9Y_#SXoz*)w2Qf;DBSNr zV!LE8V~19f@qvX04m3)77#UkU2ztP@G*X7mYLDAN4T-=5HyDo{igRNq){SAjX4JHj z<>0X}Hv{z*$`&_Haioc{?NGR8#I!X;LRa|$14EiSx2)dX69x+9(;%w$kd zQ1J8dDK9VY>FUzb)I4{d{|f^H17k^$UoeBivm0p)3=FwdArU1msl~}fnFS@8`FRWs z6?1~a3W`dN#0`KiP+60!!mcITT zC}OX+mH!FLd%ZI)&&(zm-tmnHx$AOmb+}lv$){P5ii7|F literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/meta.json new file mode 100644 index 0000000000..382967c9cc --- /dev/null +++ b/Resources/Textures/Objects/Weapons/Guns/Basic/energy_crossbow.rsi/meta.json @@ -0,0 +1,22 @@ +{ + "version": 1, + "license": "CC-BY-NC-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/commit/e1142f20f5e4661cb6845cfcf2dd69f864d67432", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/crossbowbolt.png b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/crossbowbolt.png new file mode 100644 index 0000000000000000000000000000000000000000..da5df665edecb351b05dab240a7ad883bb2d023b GIT binary patch literal 299 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U|>mi z^mSxl*x1kgCy|wbfq}EYBeIx*f$uN~Gak=hk;1^haKO{WF(ktM?FBq--yf~N9FU6B0p zYyV^K`5~&!Y$eglE*&m=I(b#fg@)tLWBW?tel5|GG%VGJrq{F|AD))9-8zopr048X6 A$^ZZW literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json index b4d8f09a82..5057bc766b 100644 --- a/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Guns/Projectiles/projectiles2.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, cleanade made by Southbridge_fur (github)", + "copyright": "Taken from cev-eris at https://github.com/discordia-space/CEV-Eris/raw/56cbafd6ad8c013ccd5472d6c4a0db790f7f872a, ball made by brainfood1183 (Github) for ss14, the uranium sprite is a modified version of the buckshot pellet by Boaz1111, cleanade made by Southbridge_fur (github), crossbowbolt made by Entvari(github)", "size": { "x": 32, "y": 32 @@ -105,6 +105,9 @@ 0.05 ] ] + }, + { + "name": "crossbowbolt" } ] } From c228db2402c04bd114a3345945df55e3894e6198 Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 14 Nov 2025 22:35:31 +0000 Subject: [PATCH 056/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 878308f51a..4f0b516ac1 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: Prole0 - changes: - - message: Flask Visuals & Sounds! - type: Add - - message: Flasks now need to be opened to be drunk from. - type: Tweak - id: 8702 - time: '2025-06-21T14:52:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38032 - author: qrwas changes: - message: Loadout item group UI improvements @@ -3925,3 +3916,12 @@ id: 9203 time: '2025-11-14T22:21:47.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40042 +- author: Entvari, Nosrepp + changes: + - message: Added the Mini Energy Crossbow to Traitor and Nukie uplinks. + type: Add + - message: The Foam Crossbow now uses the new sounds shared by the Mini Energy Crossbow. + type: Tweak + id: 9204 + time: '2025-11-14T22:34:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/39796 From 796e92df594ea6fa7da3371606511119e37ab132 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Fri, 14 Nov 2025 23:29:14 +0100 Subject: [PATCH 057/100] improve APE desc, battery weapon desc, and locked desc (#41431) * improve APE desc and locked desc * 2 --- Content.Shared/Lock/LockSystem.cs | 2 +- Resources/Locale/en-US/lock/lock-component.ftl | 4 ++-- .../Locale/en-US/singularity/components/emitter-component.ftl | 2 +- Resources/Locale/en-US/weapons/ranged/gun.ftl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 95a681dc38..560bb296ac 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -119,7 +119,7 @@ public sealed class LockSystem : EntitySystem if (!lockComp.ShowExamine) return; - args.PushText(Loc.GetString(lockComp.Locked + args.PushMarkup(Loc.GetString(lockComp.Locked ? "lock-comp-on-examined-is-locked" : "lock-comp-on-examined-is-unlocked", ("entityName", Identity.Name(uid, EntityManager)))); diff --git a/Resources/Locale/en-US/lock/lock-component.ftl b/Resources/Locale/en-US/lock/lock-component.ftl index f1455568b9..23ee543b9f 100644 --- a/Resources/Locale/en-US/lock/lock-component.ftl +++ b/Resources/Locale/en-US/lock/lock-component.ftl @@ -1,5 +1,5 @@ -lock-comp-on-examined-is-locked = The {$entityName} seems to be locked. -lock-comp-on-examined-is-unlocked = The {$entityName} seems to be unlocked. +lock-comp-on-examined-is-locked = The {$entityName} seems to be [color=darkred]locked[/color]. +lock-comp-on-examined-is-unlocked = The {$entityName} seems to be [color=darkgreen]unlocked[/color]. lock-comp-do-lock-success = You lock the {$entityName}. lock-comp-do-unlock-success = You unlock the {$entityName}. lock-comp-has-user-access-fail = Access denied. diff --git a/Resources/Locale/en-US/singularity/components/emitter-component.ftl b/Resources/Locale/en-US/singularity/components/emitter-component.ftl index c71b3d6bdf..5b15154d30 100644 --- a/Resources/Locale/en-US/singularity/components/emitter-component.ftl +++ b/Resources/Locale/en-US/singularity/components/emitter-component.ftl @@ -11,5 +11,5 @@ comp-emitter-turned-off = The {$target} turns off. # Shows if the user attempts to activate the emitter while it's un-anchored. comp-emitter-not-anchored = The {$target} isn't anchored to the ground! -emitter-component-current-type = The current selected type is: {$type}. +emitter-component-current-type = The current selected type is: [color=yellow]{$type}[/color]. emitter-component-type-set = Type set to: {$type} diff --git a/Resources/Locale/en-US/weapons/ranged/gun.ftl b/Resources/Locale/en-US/weapons/ranged/gun.ftl index a364075be9..08f1f6cb22 100644 --- a/Resources/Locale/en-US/weapons/ranged/gun.ftl +++ b/Resources/Locale/en-US/weapons/ranged/gun.ftl @@ -4,7 +4,7 @@ gun-fire-rate-examine = Fire rate is [color={$color}]{$fireRate}[/color] per sec gun-selector-verb = Change to {$mode} gun-selected-mode = Selected {$mode} gun-disabled = You can't use guns! -gun-set-fire-mode = Set to {$mode} +gun-set-fire-mode = Set to [color=yellow]{$mode}[/color]. gun-magazine-whitelist-fail = That won't fit into the gun! gun-magazine-fired-empty = No ammo left! From 3b23f234c66d0a1dfb0e68c06bc6a38de5f29c89 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 15 Nov 2025 00:31:10 +0100 Subject: [PATCH 058/100] rotate more items in inventory part 3 + cleanup for good (#41149) * rotate more items in inventory part 3 + cleanup for good * i forgor --- .../Entities/Clothing/Head/hats.yml | 22 +++--------- .../Entities/Clothing/Head/helmets.yml | 2 ++ .../Entities/Clothing/Head/misc.yml | 2 ++ .../Entities/Clothing/Neck/stoles.yml | 2 ++ .../Entities/Clothing/Neck/ties.yml | 12 +++++-- .../Objects/Devices/Electronics/igniter.yml | 2 ++ .../Entities/Objects/Devices/cartridges.yml | 36 +++++++++---------- .../Fun/Instruments/instruments_misc.yml | 1 + .../Instruments/instruments_percussion.yml | 1 + .../Entities/Objects/Misc/brb_sign.yml | 2 ++ .../Objects/Misc/improvised_gun_parts.yml | 10 +++--- .../Objects/Specific/Hydroponics/tools.yml | 3 ++ .../Objects/Specific/Janitorial/janitor.yml | 33 ++--------------- .../Objects/Specific/Medical/healing.yml | 2 ++ .../Objects/Specific/Service/barber.yml | 2 ++ .../Entities/Objects/Tools/gas_tanks.yml | 1 + .../Entities/Objects/Tools/glowstick.yml | 1 + .../Objects/Tools/inflatable_wall.yml | 2 ++ .../Guns/Ammunition/Magazines/pistol.yml | 2 ++ 19 files changed, 65 insertions(+), 73 deletions(-) diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index c2b1c5abbd..431c2978b1 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -563,6 +563,8 @@ - state: icon-nobeard map: [ "foldedLayer" ] visible: true + - type: Item + storedRotation: 0 - type: Tag tags: - PetWearable @@ -1227,6 +1229,8 @@ sprite: Clothing/Head/Hats/party_red.rsi - type: Clothing sprite: Clothing/Head/Hats/party_red.rsi + - type: Item + storedRotation: 0 - type: Tag tags: - PetWearable @@ -1243,12 +1247,6 @@ sprite: Clothing/Head/Hats/party_yellow.rsi - type: Clothing sprite: Clothing/Head/Hats/party_yellow.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed @@ -1259,12 +1257,6 @@ sprite: Clothing/Head/Hats/party_green.rsi - type: Clothing sprite: Clothing/Head/Hats/party_green.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed @@ -1275,12 +1267,6 @@ sprite: Clothing/Head/Hats/party_blue.rsi - type: Clothing sprite: Clothing/Head/Hats/party_blue.rsi - - type: Tag - tags: - - PetWearable - - CorgiWearable - - WhitelistChameleon - - HamsterWearable - type: entity parent: ClothingHeadHatPartyRed diff --git a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml index 539fa90ea4..574e76d9ba 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/helmets.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/helmets.yml @@ -221,6 +221,8 @@ sprite: Clothing/Head/Helmets/templar.rsi - type: Clothing sprite: Clothing/Head/Helmets/templar.rsi + - type: Item + storedRotation: 0 - type: IngestionBlocker - type: IdentityBlocker - type: HideLayerClothing diff --git a/Resources/Prototypes/Entities/Clothing/Head/misc.yml b/Resources/Prototypes/Entities/Clothing/Head/misc.yml index 511f1e1980..332efb731b 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/misc.yml @@ -121,6 +121,8 @@ sprite: Clothing/Head/Misc/richard.rsi - type: Clothing sprite: Clothing/Head/Misc/richard.rsi + - type: Item + storedRotation: 0 - type: IngestionBlocker - type: IdentityBlocker - type: HideLayerClothing diff --git a/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml b/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml index aab8eb30ca..d708a48f7d 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/stoles.yml @@ -8,3 +8,5 @@ sprite: Clothing/Neck/Stoles/chaplain.rsi - type: Clothing sprite: Clothing/Neck/Stoles/chaplain.rsi + - type: Item + storedRotation: 90 diff --git a/Resources/Prototypes/Entities/Clothing/Neck/ties.yml b/Resources/Prototypes/Entities/Clothing/Neck/ties.yml index bf1772dc81..2e172ae285 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/ties.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/ties.yml @@ -1,5 +1,13 @@ - type: entity parent: ClothingNeckBase + id: ClothingNeckTieBase + abstract: true + components: + - type: Item + storedRotation: -45 + +- type: entity + parent: ClothingNeckTieBase id: ClothingNeckTieRed name: red-tie description: A neosilk clip-on red tie. @@ -16,7 +24,7 @@ - Recyclable - type: entity - parent: ClothingNeckBase + parent: ClothingNeckTieBase id: ClothingNeckTieDet name: detective's tie description: A loosely tied necktie, a perfect accessory for the over-worked detective. @@ -27,7 +35,7 @@ sprite: Clothing/Neck/Ties/dettie.rsi - type: entity - parent: ClothingNeckBase + parent: ClothingNeckTieBase id: ClothingNeckTieSci name: scientist's tie description: Why do we all have to wear these ridiculous ties? diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml index 87bef747d8..0d8f57edea 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/igniter.yml @@ -7,6 +7,8 @@ - type: Sprite sprite: Objects/Devices/igniter.rsi state: icon + - type: Item + storedRotation: -90 - type: IgnitionSource temperature: 800 - type: IgniteOnTrigger diff --git a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml index 494bda50d1..93f012ce57 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/cartridges.yml @@ -1,11 +1,20 @@ - type: entity parent: BaseItem + id: BasePDACartridge + abstract: true + components: + - type: Item + storedRotation: -90 + - type: Sprite + sprite: Objects/Devices/cartridge.rsi + +- type: entity + parent: BasePDACartridge id: NotekeeperCartridge name: notekeeper cartridge description: A program for keeping notes. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NotekeeperUi @@ -16,15 +25,13 @@ state: book_icon - type: NotekeeperCartridge - - type: entity - parent: BaseItem + parent: BasePDACartridge id: NanoTaskCartridge name: NanoTask cartridge description: A program that allows you to keep a list of tasks to do. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-nav - type: Cartridge programName: nano-task-program-name @@ -36,13 +43,12 @@ - type: NanoTaskCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: NewsReaderCartridge name: news cartridge description: A program for reading news. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NewsReaderUi @@ -54,13 +60,12 @@ - type: NewsReaderCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: CrewManifestCartridge name: crew manifest cartridge description: A program for listing your fellow crewmembers. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:CrewManifestUi @@ -72,13 +77,12 @@ - type: CrewManifestCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: NetProbeCartridge name: NetProbe cartridge description: A program for getting the address and frequency of network devices. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-y - type: UIFragment ui: !type:NetProbeUi @@ -90,13 +94,12 @@ - type: NetProbeCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: LogProbeCartridge name: LogProbe cartridge description: A program for getting access logs from devices. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-log - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -114,13 +117,12 @@ - Forensics - type: entity - parent: BaseItem + parent: BasePDACartridge id: WantedListCartridge name: Wanted list cartridge description: A program to get a list of wanted persons. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-sec - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -137,13 +139,12 @@ stealGroup: WantedListCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: MedTekCartridge name: MedTek cartridge description: A program that provides medical diagnostic tools. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-med - type: Icon sprite: Objects/Devices/cartridge.rsi @@ -156,13 +157,12 @@ - type: MedTekCartridge - type: entity - parent: BaseItem + parent: BasePDACartridge id: AstroNavCartridge name: AstroNav cartridge description: A program for navigation that provides GPS coordinates. components: - type: Sprite - sprite: Objects/Devices/cartridge.rsi state: cart-nav - type: Icon sprite: Objects/Devices/cartridge.rsi diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml index c6ba706d06..9d63aa0c69 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_misc.yml @@ -57,6 +57,7 @@ program: 124 - type: Item size: Small + storedRotation: -90 - type: Prayable sentMessage: prayer-popup-notify-centcom-sent notificationPrefix: prayer-chat-notify-centcom diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml index e073f40942..adff2cf014 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/instruments_percussion.yml @@ -61,6 +61,7 @@ sprite: Objects/Fun/Instruments/microphone.rsi - type: Item size: Small + storedRotation: -45 - type: entity parent: BasePercussionInstrument diff --git a/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml b/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml index 845130d332..8e7943ce47 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/brb_sign.yml @@ -12,3 +12,5 @@ quickEquip: false slots: - Neck + - type: Item + storedRotation: -90 diff --git a/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml b/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml index abf4e0974a..12c6e1f4fe 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/improvised_gun_parts.yml @@ -6,8 +6,9 @@ name: modular receiver description: A vital part used in the creation of firearms. #Could use a better description, but I'm not a gun nut so I can't really do that. components: -# - type: Item -# size: Normal + - type: Item + storedRotation: -90 + # size: Normal - type: Sprite sprite: Objects/Misc/modular_receiver.rsi state: icon @@ -22,8 +23,9 @@ name: rifle stock description: A robust wooden stock, used in the creation of firearms. #Same as above components: -# - type: Item -# size: Normal + - type: Item + storedRotation: -90 + # size: Normal - type: Sprite sprite: Objects/Misc/rifle_stock.rsi state: icon diff --git a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml index d152bb908e..e37c1a8816 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Hydroponics/tools.yml @@ -19,6 +19,7 @@ Slash: 6 - type: Item sprite: Objects/Tools/Hydroponics/hoe.rsi + storedRotation: -135 - type: PhysicalComposition materialComposition: Steel: 100 @@ -97,6 +98,7 @@ Piercing: 2 - type: Item sprite: Objects/Tools/Hydroponics/hatchet.rsi + storedRotation: -135 - type: PhysicalComposition materialComposition: Steel: 100 @@ -123,6 +125,7 @@ collection: MetalThud - type: Item sprite: Objects/Tools/Hydroponics/spade.rsi + storedRotation: -45 - type: Shovel speedModifier: 0.75 # slower at digging than a full-sized shovel - type: PhysicalComposition diff --git a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml index a4280f6a50..5aba5b7918 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Janitorial/janitor.yml @@ -37,6 +37,7 @@ - type: Item size: Large sprite: Objects/Specific/Janitorial/mop.rsi + storedRotation: 45 - type: Absorbent useAbsorberSolution: true - type: SolutionContainerManager @@ -58,7 +59,7 @@ - type: DnaSubstanceTrace - type: entity - parent: BaseItem + parent: MopItem name: advanced mop id: AdvMopItem description: Motorized mop that has a bigger reservoir and quickly replaces reagents inside with water. Automatic Clown Countermeasure not included. @@ -70,37 +71,12 @@ - map: ["enum.SolutionContainerLayers.Fill"] state: fill-2 visible: false - - type: Appearance - type: SolutionContainerVisuals maxFillLevels: 2 - fillBaseName: fill- - inHandsFillBaseName: -fill- - inHandsMaxFillLevels: 2 - - type: MeleeWeapon - damage: - types: - Blunt: 10 - soundHit: - collection: MetalThud - - type: Spillable - solution: absorbed - spillWhenThrown: false - preventMelee: false - - type: DrainableSolution - solution: absorbed - - type: Wieldable - - type: IncreaseDamageOnWield - damage: - types: - Blunt: 5 - type: Item - size: Large sprite: Objects/Specific/Janitorial/advmop.rsi - type: Absorbent pickupAmount: 100 - useAbsorberSolution: true - - type: UseDelay - delay: 1.0 - type: SolutionRegeneration solution: absorbed generated: @@ -112,15 +88,10 @@ preserve: - Water quantity: 10 - - type: SolutionContainerManager - solutions: - absorbed: - maxVol: 100 - type: Tag tags: - Mop - MopAdv - - type: DnaSubstanceTrace - type: entity name: wet floor sign diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml index 0f0d8ae0c2..aedbd3190c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healing.yml @@ -27,6 +27,7 @@ state: ointment - type: Item heldPrefix: ointment + storedRotation: 45 - type: Healing damageContainers: - Biological @@ -295,6 +296,7 @@ state: gauze - type: Item heldPrefix: gauze + storedRotation: -90 - type: Construction graph: Gauze node: gauze diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index f23e0964c1..e3fe3584f8 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -7,6 +7,8 @@ - type: Sprite sprite: Objects/Tools/scissors.rsi state: icon + - type: Item + storedRotation: 135 - type: MagicMirror - type: ActivatableUI key: enum.MagicMirrorUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index cb038b3c5a..eb4b881998 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -94,6 +94,7 @@ - type: Item size: Small sprite: Objects/Tanks/emergency.rsi + storedRotation: -45 - type: GasTank air: volume: 0.66 diff --git a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml index e000b99638..986f65badc 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/glowstick.yml @@ -29,6 +29,7 @@ - type: Item sprite: Objects/Misc/glowstick.rsi heldPrefix: unlit + storedRotation: -45 - type: Appearance - type: PointLight enabled: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml index 4f55d5c164..953d191d5e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/inflatable_wall.yml @@ -14,6 +14,7 @@ - type: Item sprite: Objects/Misc/inflatable_wall.rsi size: Small + storedRotation: 90 - type: SpawnAfterInteract prototype: InflatableWall doAfter: 1 @@ -41,6 +42,7 @@ - type: Item sprite: Objects/Misc/inflatable_door.rsi size: Small + storedRotation: 90 - type: SpawnAfterInteract prototype: InflatableDoor doAfter: 1 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index 9320e1627f..f2dffa776b 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -103,6 +103,8 @@ parent: [ BaseItem, BaseSecurityContraband ] description: Unconventional 30-round top feeding magazine for the WT550 SMG. Intended to hold general-purpose kinetic ammunition. components: + - type: Item + storedRotation: 90 - type: Tag tags: - MagazinePistolSubMachineGunTopMounted From 162a17411febcd048d5ca7bce13a0cfdb5593802 Mon Sep 17 00:00:00 2001 From: April <1866440+April-Gras@users.noreply.github.com> Date: Sat, 15 Nov 2025 06:16:00 +0100 Subject: [PATCH 059/100] chore: made regalrat go the speed he should go (#41420) that's a 5, not the defaulted back 4.5 from `UpdateMovementSpeed` in Content.Shared/Body/Systems/SharedBodySystem.Parts.cs --- Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index d48ac0dd78..1de449a215 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -61,7 +61,7 @@ Piercing: 8 - type: Body prototype: Rat - requiredLegs: 1 # TODO: More than 1 leg + requiredLegs: 0 # TODO: Make more than 1 leg, set to 0 to avoid sprint speed being reset by the body system - type: Hunger # probably should be prototyped thresholds: Overfed: 200 @@ -253,7 +253,7 @@ Piercing: 3 - type: Body prototype: Rat - requiredLegs: 1 # TODO: More than 1 leg + requiredLegs: 0 # TODO: Make more than 1 leg, set to 0 to avoid sprint speed being reset by the body system - type: Hunger # probably should be prototyped thresholds: Overfed: 200 From 50d4f17a1082694a92a460e794b41ce557e1aaa0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 05:29:00 +0000 Subject: [PATCH 060/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4f0b516ac1..58c0ad97b4 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: qrwas - changes: - - message: Loadout item group UI improvements - type: Tweak - id: 8703 - time: '2025-06-21T22:20:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38488 - author: perryprog changes: - message: Wet mops no longer have zero melee damage. @@ -3925,3 +3918,10 @@ id: 9204 time: '2025-11-14T22:34:24.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/39796 +- author: April-Gras + changes: + - message: Rat king now goes 0.5 faster when sprinting + type: Tweak + id: 9205 + time: '2025-11-15T05:27:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41420 From 400905725cbe7d0219e83be170edd176aa8674a3 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Sat, 15 Nov 2025 12:43:20 +0100 Subject: [PATCH 061/100] yaml cleanups (id, hypopen, inflatable wall) (#41432) * cleanups * yes i can --- .../Entities/Objects/Misc/identification_cards.yml | 12 +----------- .../Entities/Objects/Specific/Medical/hypospray.yml | 2 -- .../Misc => Structures/Walls}/inflatable_wall.yml | 0 3 files changed, 1 insertion(+), 13 deletions(-) rename Resources/Prototypes/Entities/{Objects/Misc => Structures/Walls}/inflatable_wall.yml (100%) diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index b4c403c213..2ecf7be55d 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -923,23 +923,14 @@ #Antags - type: entity - name: passenger ID card - parent: [IDCardStandard, BaseChameleon] + parent: [PassengerIDCard, BaseChameleon] id: AgentIDCard suffix: Agent components: - - type: PresetIdCard - job: Passenger - type: Access tags: - Maintenance - SyndicateAgent - - type: Sprite - layers: - - state: default - - sprite: *icon-rsi - offset: *icon-offset - state: Passenger - type: AgentIDCard - type: UIRequiresLock - type: ActivatableUI @@ -960,7 +951,6 @@ type: ChameleonBoundUserInterface - type: entity - name: passenger ID card parent: AgentIDCard id: NukieAgentIDCard suffix: Nukie diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml index 17909d6769..7137cbaa64 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/hypospray.yml @@ -649,10 +649,8 @@ price: 1500 - type: entity - name: pen suffix: Hypopen parent: Pen # It is just like normal pen, isn't it? - description: A dark ink pen. id: Hypopen components: - type: SolutionContainerManager diff --git a/Resources/Prototypes/Entities/Objects/Misc/inflatable_wall.yml b/Resources/Prototypes/Entities/Structures/Walls/inflatable_wall.yml similarity index 100% rename from Resources/Prototypes/Entities/Objects/Misc/inflatable_wall.yml rename to Resources/Prototypes/Entities/Structures/Walls/inflatable_wall.yml From fd2f5f7e450ef6de26411acf6f33404da157adca Mon Sep 17 00:00:00 2001 From: Connor Huffine Date: Sat, 15 Nov 2025 12:43:46 -0500 Subject: [PATCH 062/100] Fix typo in roundstartvariation (#41444) Fix typo --- Resources/Prototypes/GameRules/roundstart.yml | 2 +- Resources/Prototypes/GameRules/variation.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index ad41899bef..6b3e3e841a 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -532,7 +532,7 @@ - id: SolarPanelEmptyVariationPass - id: BasicDecalDirtVariationPass - id: BasicDecalGraffitiVariationPass - - id: BasicDecalBrunsVariationPass + - id: BasicDecalBurnsVariationPass prob: 0.50 orGroup: monospaceDecals - id: BasicDecalDirtMonospaceVariationPass diff --git a/Resources/Prototypes/GameRules/variation.yml b/Resources/Prototypes/GameRules/variation.yml index 718e5111a7..5e2fe0576b 100644 --- a/Resources/Prototypes/GameRules/variation.yml +++ b/Resources/Prototypes/GameRules/variation.yml @@ -68,7 +68,7 @@ - id: DecalSpawnerGraffiti - type: entity - id: BasicDecalBrunsVariationPass + id: BasicDecalBurnsVariationPass parent: BaseVariationPass components: - type: EntitySpawnVariationPass From 5674b9a3639fb19dbabd4277e4bf917a76f4e332 Mon Sep 17 00:00:00 2001 From: Fildrance Date: Sun, 16 Nov 2025 02:07:14 +0300 Subject: [PATCH 063/100] Minor Knock spell refactor + fix its obstruction check (#41447) * refactor: remove isFirstTimepredicted for knock XAE * refactor: cleanups * refactor: do not count laser obstructions toward stuff that blocks Knock spell, project spell from artifact and not node * refactor: no method-events for knock-spells --------- Co-authored-by: pa.pecherskij --- Content.Shared/Magic/SharedMagicSystem.cs | 22 ++++++++++++++----- .../Artifact/XAE/XAEKnockSystem.cs | 16 +++----------- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Content.Shared/Magic/SharedMagicSystem.cs b/Content.Shared/Magic/SharedMagicSystem.cs index 6afba65a39..3301180e8a 100644 --- a/Content.Shared/Magic/SharedMagicSystem.cs +++ b/Content.Shared/Magic/SharedMagicSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.Charges.Systems; using Content.Shared.Coordinates.Helpers; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; +using Content.Shared.Examine; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; @@ -66,6 +67,7 @@ public abstract class SharedMagicSystem : EntitySystem [Dependency] private readonly SharedStunSystem _stun = default!; [Dependency] private readonly TurfSystem _turf = default!; [Dependency] private readonly SharedChargesSystem _charges = default!; + [Dependency] private readonly ExamineSystemShared _examine= default!; private static readonly ProtoId InvalidForGlobalSpawnSpellTag = "InvalidForGlobalSpawnSpell"; @@ -399,22 +401,30 @@ public abstract class SharedMagicSystem : EntitySystem #endregion #region Knock Spells ///

- /// Opens all doors and locks within range + /// Opens all doors and locks within range. /// - /// private void OnKnockSpell(KnockSpellEvent args) { if (args.Handled || !PassesSpellPrerequisites(args.Action, args.Performer)) return; args.Handled = true; + Knock(args.Performer, args.Range); + } - var transform = Transform(args.Performer); + /// + /// Opens all doors and locks within range. + /// + /// Performer of spell. + /// Radius around in which all doors and locks should be opened. + public void Knock(EntityUid performer, float range) + { + var transform = Transform(performer); // Look for doors and lockers, and don't open/unlock them if they're already opened/unlocked. - foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(args.Performer, transform), args.Range, flags: LookupFlags.Dynamic | LookupFlags.Static)) + foreach (var target in _lookup.GetEntitiesInRange(_transform.GetMapCoordinates(performer, transform), range, flags: LookupFlags.Dynamic | LookupFlags.Static)) { - if (!_interaction.InRangeUnobstructed(args.Performer, target, range: 0, collisionMask: CollisionGroup.Opaque)) + if (!_examine.InRangeUnOccluded(performer, target, range: 0)) continue; if (TryComp(target, out var doorBoltComp) && doorBoltComp.BoltsDown) @@ -424,7 +434,7 @@ public abstract class SharedMagicSystem : EntitySystem _door.StartOpening(target); if (TryComp(target, out var lockComp) && lockComp.Locked) - _lock.Unlock(target, args.Performer, lockComp); + _lock.Unlock(target, performer, lockComp); } } // End Knock Spells diff --git a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs index 9cc9efe51b..716ef6c660 100644 --- a/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs +++ b/Content.Shared/Xenoarchaeology/Artifact/XAE/XAEKnockSystem.cs @@ -1,6 +1,5 @@ -using Content.Shared.Magic.Events; +using Content.Shared.Magic; using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; -using Robust.Shared.Timing; namespace Content.Shared.Xenoarchaeology.Artifact.XAE; @@ -9,19 +8,10 @@ namespace Content.Shared.Xenoarchaeology.Artifact.XAE; ///
public sealed class XAEKnockSystem : BaseXAESystem { - [Dependency] private readonly IGameTiming _timing = default!; - + [Dependency] private readonly SharedMagicSystem _magic = default!; /// protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { - if (!_timing.IsFirstTimePredicted) - return; - - var ev = new KnockSpellEvent - { - Performer = ent.Owner, - Range = ent.Comp.KnockRange - }; - RaiseLocalEvent(ev); + _magic.Knock(args.Artifact, ent.Comp.KnockRange); } } From 409ef028711488489d53be0698df6eea88def3f4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 23:20:09 +0000 Subject: [PATCH 064/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 58c0ad97b4..4dcb0fcd97 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: perryprog - changes: - - message: Wet mops no longer have zero melee damage. - type: Fix - id: 8704 - time: '2025-06-21T22:23:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38486 - author: Cojoke-dot changes: - message: Pacifists can now use the Staff of Healing @@ -3925,3 +3918,11 @@ id: 9205 time: '2025-11-15T05:27:52.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41420 +- author: Fildrance + changes: + - message: KNOCK spell and 'Mild electromagnetic interference' xeno artifact effects + now will be blocked only by obstructed line of sight (range is still applied) + type: Tweak + id: 9206 + time: '2025-11-15T23:18:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41447 From cee38b7bfef9f2c1c2c52063b7ccdd9b15b251c1 Mon Sep 17 00:00:00 2001 From: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> Date: Sun, 16 Nov 2025 00:18:11 +0100 Subject: [PATCH 065/100] Remove Aghosts from "Warp to Most Followed" (#41448) * init * review --- Content.Server/Ghost/GhostSystem.cs | 3 ++- Content.Shared/Follower/FollowerSystem.cs | 9 ++++++++- .../Prototypes/Entities/Mobs/Player/admin_ghost.yml | 1 + Resources/Prototypes/tags.yml | 5 ++++- 4 files changed, 15 insertions(+), 3 deletions(-) diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index af1a433d1a..3486e2024b 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -333,7 +333,8 @@ namespace Content.Server.Ghost if (_followerSystem.GetMostGhostFollowed() is not {} target) return; - WarpTo(uid, target); + // If there is a ghostnado happening you almost definitely wanna join it, so we automatically follow instead of just warping. + _followerSystem.StartFollowingEntity(uid, target); } private void WarpTo(EntityUid uid, EntityUid target) diff --git a/Content.Shared/Follower/FollowerSystem.cs b/Content.Shared/Follower/FollowerSystem.cs index 07639a1790..8357b0106f 100644 --- a/Content.Shared/Follower/FollowerSystem.cs +++ b/Content.Shared/Follower/FollowerSystem.cs @@ -35,6 +35,7 @@ public sealed class FollowerSystem : EntitySystem [Dependency] private readonly ISharedAdminManager _adminManager = default!; private static readonly ProtoId ForceableFollowTag = "ForceableFollow"; + private static readonly ProtoId PreventGhostnadoWarpTag = "NotGhostnadoWarpable"; public override void Initialize() { @@ -320,11 +321,17 @@ public sealed class FollowerSystem : EntitySystem var query = EntityQueryEnumerator(); while (query.MoveNext(out _, out var follower, out _, out var actor)) { - // Exclude admins + // Don't count admin followers so that players cannot notice if admins are in stealth mode and following someone. if (_adminManager.IsAdmin(actor.PlayerSession)) continue; var followed = follower.Following; + + // If the followed entity cannot be ghostnado'd to, we don't count it. + // Used for making admins not warpable to, but IsAdmin isn't used for cases where the admin wants to be followed, for example during events. + if (_tagSystem.HasTag(followed, PreventGhostnadoWarpTag)) + continue; + // Add new entry or increment existing followedEnts.TryGetValue(followed, out var currentValue); followedEnts[followed] = currentValue + 1; diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 7c1bb7ef16..e5fdfe7336 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -16,6 +16,7 @@ - SilentStorageUser - PreventAccessLogging - AllowBiomeLoading + - NotGhostnadoWarpable - type: Input context: "aghost" - type: Ghost diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 3b3d11e612..44b636495c 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -973,7 +973,7 @@ - type: Tag id: Mouse # CargoBounty: BountyMouse - + - type: Tag id: Multitool # Storage whitelist: BaseClothingBeltEngineering. ItemMapper: BaseClothingBeltEngineering. ConstructionGraph: LogicGate @@ -987,6 +987,9 @@ - type: Tag id: NoConsoleSound # Blacklist on BaseComputer, StationMap. Tagged entity will not make sound when opening the UI. +- type: Tag + id: NotGhostnadoWarpable # Prevents the entity from being selected via "Warp to most followed" ghost warp + - type: Tag id: NozzleBackTank # Used by WeaponSprayNozzle to find a tagged entity for supplying ammo. From 3e0ab613cacaafdb64163976c7c6a911ae6cb3bd Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 15 Nov 2025 23:32:37 +0000 Subject: [PATCH 066/100] Automatic changelog update --- Resources/Changelog/Admin.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index a342132f68..59827600ec 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -1513,5 +1513,14 @@ Entries: id: 184 time: '2025-11-12T23:22:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41348 +- author: ScarKy0 + changes: + - message: Admin ghosts can no longer be selected for "Warp To Most Followed". Remove + the NotGhostnadoWarpable tag from your aghost entity if you wish to still be + able to be selected. + type: Fix + id: 185 + time: '2025-11-15T23:31:28.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41448 Name: Admin Order: 3 From 6c78ff5ab9aeccb5f7d9271e291634e916cbf732 Mon Sep 17 00:00:00 2001 From: Princess Cheeseballs <66055347+Princess-Cheeseballs@users.noreply.github.com> Date: Sat, 15 Nov 2025 16:51:26 -0800 Subject: [PATCH 067/100] Fix Gas Reagent Thresholds. (#41438) * Fix reagent gas scales * add comment --------- Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com> --- Resources/Prototypes/Reagents/gases.yml | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/Resources/Prototypes/Reagents/gases.yml b/Resources/Prototypes/Reagents/gases.yml index b7e82d0960..140ca47938 100644 --- a/Resources/Prototypes/Reagents/gases.yml +++ b/Resources/Prototypes/Reagents/gases.yml @@ -1,3 +1,6 @@ +# TODO: Reagent Args which allow more selective scaling. +# Currently all Gas metabolisms scale by reagent quantity metabolized, where other Metabolisms are modified by metabolism rate! + - type: reagent id: Oxygen name: reagent-name-oxygen @@ -64,7 +67,7 @@ Poison: 0.7 - !type:AdjustAlert alertType: Toxins - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Vox ] @@ -105,7 +108,7 @@ # We need a metabolism effect on reagent removal - !type:AdjustAlert alertType: Toxins - minScale: 3 + minScale: 1.5 clear: True time: 5 reactiveEffects: @@ -150,7 +153,7 @@ # We need a metabolism effect on reagent removal - !type:AdjustAlert alertType: Toxins - minScale: 3 + minScale: 1.5 clear: True time: 5 @@ -191,7 +194,7 @@ - !type:MetabolizerTypeCondition type: [ Plant ] - !type:HealthChange - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Plant, Vox ] @@ -270,7 +273,7 @@ Gas: effects: - !type:Emote - minScale: 1 + minScale: 0.2 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -279,7 +282,7 @@ showInChat: true probability: 0.1 - !type:Emote - minScale: 0.4 + minScale: 0.2 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -288,7 +291,7 @@ showInChat: true probability: 0.01 - !type:PopupMessage - minScale: 1 + minScale: 0.5 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -298,7 +301,7 @@ messages: [ "effect-sleepy" ] probability: 0.1 - !type:MovementSpeedModifier - minScale: 2 + minScale: 1 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -306,7 +309,7 @@ walkSpeedModifier: 0.65 sprintSpeedModifier: 0.65 - !type:ModifyStatusEffect - minScale: 3.6 + minScale: 1.8 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -315,7 +318,7 @@ time: 3 type: Update - !type:HealthChange - minScale: 7 + minScale: 3.5 conditions: - !type:MetabolizerTypeCondition type: [ Slime ] @@ -367,27 +370,27 @@ Gas: effects: - !type:HealthChange - minScale: 1 + minScale: 0.5 ignoreResistances: true damage: types: Cellular: 0.05 - !type:ModifyStatusEffect - minScale: 2 + minScale: 1 effectProto: StatusEffectSeeingRainbow type: Add time: 500 - !type:Drunk boozePower: 500 - minScale: 2 + minScale: 1 - !type:PopupMessage type: Local messages: [ "frezon-lungs-cold" ] probability: 0.1 - minScale: 2 + minScale: 1 - !type:PopupMessage type: Local visualType: Medium messages: [ "frezon-euphoric" ] probability: 0.1 - minScale: 2 + minScale: 1 From 18211e8b6e39e3c1361016d7bc3281de50093603 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 16 Nov 2025 01:04:25 +0000 Subject: [PATCH 068/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 4dcb0fcd97..bdc3196293 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Cojoke-dot - changes: - - message: Pacifists can now use the Staff of Healing - type: Tweak - id: 8706 - time: '2025-06-22T19:38:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38509 - author: slarticodefast changes: - message: The interrogator lamp and flash lantern now properly flash when toggled @@ -3926,3 +3919,10 @@ id: 9206 time: '2025-11-15T23:18:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41447 +- author: Princess-Cheeseballs + changes: + - message: No2 should put you to sleep again without needing double the gas. + type: Fix + id: 9207 + time: '2025-11-16T01:03:18.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41438 From 0141993d1d14cc45a8cb5833224978ea96fe6715 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 16 Nov 2025 02:26:42 +0100 Subject: [PATCH 069/100] Update Credits (#41449) 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 cc80b51d26..902b0964d3 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0leshe, 0tito, 0x6273, 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, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, AzzyIsNotHere, azzyisnothere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, 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, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, 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, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, 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, 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, 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, eugene, 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, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, 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, 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, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, 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, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, 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, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, manelnavola, ManelNavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, pok27, Pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, 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, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, 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, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, 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, 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, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, 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, TheFlyingSentry, 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, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, 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, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex +0leshe, 0tito, 0x6273, 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, ActiveMammmoth, actually-reb, ada-please, adamsong, Adeinitas, adm2play, Admiral-Obvious-001, adrian, Adrian16199, Ady4ik, Aearo-Deepwater, Aerocrux, Aeshus, Aexolott, Aexxie, africalimedrop, afrokada, AftrLite, AgentSmithRadio, Agoichi, Ahion, aiden, aidenkrz, Aidenkrz, Aisu9, ajcm, AJCM-git, AjexRose, Alekshhh, alexalexmax, alexkar598, AlexMorgan3817, alexum418, alexumandxgabriel08x, Alice4267, Alithsko, Alkheemist, alliephante, ALMv1, Alpaccalypse, Alpha-Two, AlphaQwerty, Altoids1, amatwiedle, amylizzle, ancientpower, Andre19926, Andrew-Fall, AndrewEyeke, AndrewFenriz, AndreyCamper, anri, Anzarot121, ApolloVector, Appiah, april-gras, ar4ill, Arcane-Waffle, archee1, ArchPigeon, ArchRBX, areitpog, Arendian, areyouconfused, arimah, Arkanic, ArkiveDev, armoks, Arteben, ArthurMousatov, ArtisticRoomba, artur, Artxmisery, ArZarLordOfMango, as334, AsikKEsel, AsnDen, asperger-sind, aspiringLich, astriloqua, Atakku, august-sun, AutoOtter, AverageNotDoingAnythingEnjoyer, avghdev, AwareFoxy, Awlod, azzyisnothere, AzzyIsNotHere, B-Kirill, B3CKDOOR, baa14453, BackeTako, BadaBoomie, Bakke, BananaFlambe, Baptr0b0t, BarryNorfolk, BasedUser, 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, Booblesnoot42, Boolean-Buckeye, botanySupremist, brainfood1183, BramvanZijp, Brandon-Huu, breeplayx3, BriBrooo, Bright0, BRINGit34, brndd, bryce0110, BubblegumBlue, buletsponge, buntobaggins, bvelliquette, BWTCK, byondfuckery, c0rigin, c4llv07e, CaasGit, Caconym27, Calecute, Callmore, Camdot, capnsockless, CaptainMaru, captainsqrbeard, Carbonhell, Carolyn3114, Carou02, carteblanche4me, catdotjs, catlord, Catofquestionableethics, CatTheSystem, CawsForConcern, Centronias, Chaboricks, chairbender, 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, creadth, CrigCrag, CroilBird, Crotalus, CrudeWax, cryals, CrzyPotato, cubixthree, cutemoongod, Cyberboss, d34d10cc, DadeKuma, Daemon, daerSeebaer, dahnte, dakamakat, DamianX, dan, dangerrevolution, daniel-cr, DanSAussieITS, Daracke, Darkenson, 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, 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, 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, eugene, 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, Funce, FungiFellow, FunkySphere, FunTust, Futuristic-OK, GalacticChimp, gamer3107, Gamewar360, gansulalan, GaussiArson, Gaxeer, gbasood, gcoremans, Geekyhobo, genderGeometries, GeneralGaws, Genkail, Gentleman-Bird, geraeumig, Ghagliiarghii, Git-Nivrak, githubuser508, GitHubUser53123, gituhabu, GlassEclipse, 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, 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, jacksonzck, Jacktastic09, Jackw2As, jacob, jamessimo, janekvap, Jark255, Jarmer123, Jaskanbe, JasperJRoth, jbox144, JCGWE30, jerryimmouse, JerryImMouse, Jessetriesagain, jessicamaybe, JesterX666, Jezithyr, jicksaw, JiimBob, JimGamemaster, jimmy12or, JIPDawg, jjtParadox, jkwookee, jmcb, JohnGinnane, 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, kerisargit, keronshb, KIBORG04, KieueCaprie, Kimpes, kin98, KingFroozy, kira-er, kiri-yoshikage, Kirillcas, Kirus59, Kistras, Kit, Kit0vras, KittenColony, Kittygyat, klaypexx, Kmc2000, Ko4ergaPunk, kognise, kokoc9n, komunre, KonstantinAngelov, kontakt, kosticia, koteq, kotobdev, Kowlin, KrasnoshchekovPavel, Krosus777, Krunklehorn, Kryyto, Kupie, kxvvv, Kyoth25f, kyupolaris, kzhanik, LaCumbiaDelCoronavirus, lajolico, Lamrr, lanedon, LankLTE, laok233, lapatison, larryrussian, lawdog4817, Lazzi0706, leah, leander-0, leonardo-dabepis, leonidussaks, leonsfriedrich, LeoSantich, lettern, LetterN, Level10Cybermancer, LEVELcat, lever1209, LevitatingTree, Lgibb18, lgruthes, 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, Lukasz825700516, luminight, lunarcomets, Lusatia, Luxeator, lvvova1, Lyndomen, lyroth001, lzimann, lzk228, M1tht1c, M3739, M4rchy-S, M87S, mac6na6na, MACMAN2003, Macoron, magicalus, magmodius, magnuscrowe, maland1, malchanceux, MaloTV, ManelNavola, manelnavola, Mangohydra, marboww, Markek1, MarkerWicker, marlyn, matt, Matz05, max, MaxNox7, maylokana, MDuch369, meganerobot, MehimoNemo, Mehnix, MeltedPixel, memeproof, MendaxxDev, Menshin, Mephisto72, MerrytheManokit, Mervill, metalgearsloth, MetalSage, MFMessage, mhamsterr, michaelcu, micheel665, mifia, MilenVolf, MilonPL, Minemoder5000, Minty642, minus1over12, Mirino97, mirrorcult, misandrie, MishaUnity, MissKay1994, MisterImp, MisterMecky, Mith-randalf, Mixelz, mjarduk, MjrLandWhale, mkanke-real, MLGTASTICa, mnva0, moderatelyaware, modern-nm, mokiros, momo, Moneyl, monotheonist, Moomoobeef, moony, Morb0, MossyGreySlope, mqole, mr-bo-jangles, Mr0maks, MrFippik, mrrobdemo, mtrs163, muburu, MureixloI, murolem, murphyneko, musicmanvr, MWKane, Myakot, Myctai, N3X15, nabegator, nails-n-tape, Nairodian, Naive817, NakataRin, namespace-Memory, Nannek, NazrinNya, neutrino-laser, NickPowers43, nikitosych, nikthechampiongr, Nimfar11, ninruB, Nirnael, NIXC, nkokic, NkoKirkto, nmajask, noctyrnal, noelkathegod, noirogen, nok-ko, NonchalantNoob, NoobyLegion, Nopey, NoreUhh, not-gavnaed, notafet, notquitehadouken, notsodana, noudoit, noverd, Nox38, NuclearWinter, nukashimika, nuke-haus, NULL882, nullarmo, nyeogmi, Nylux, Nyranu, Nyxilath, och-och, OctoRocket, OldDanceJacket, OliverOtter, onesch, OneZerooo0, OnsenCapy, OnyxTheBrave, opl-, Orange-Winds, OrangeMoronage9622, OrbitSystem07, Orsoniks, osjarw, Ostaf, othymer, OttoMaticode, Owai-Seek, packmore, paige404, paigemaeforrest, pali6, Palladinium, Pangogie, panzer-iv1, partyaddict, patrikturi, PaulRitter, pavlockblaine03, peccneck, Peptide90, peptron1, perryprog, PeterFuto, PetMudstone, pewter-wiz, pgraycs, PGrayCS, Pgriha, phantom-lily, pheenty, philingham, Phill101, Phooooooooooooooooooooooooooooooosphate, phunnyguy, PicklOH, PilgrimViis, Pill-U, pinkbat5, Piras314, Pireax, Pissachu, pissdemon, Pixel8-dev, PixeltheAertistContrib, PixelTheKermit, PJB3005, Plasmaguy, plinyvic, Plykiya, poeMota, pofitlo, pointer-to-null, Pok27, pok27, poklj, PolterTzi, PoorMansDreams, PopGamer45, portfiend, potato1234x, PotentiallyTom, PotRoastPiggy, Princess-Cheeseballs, ProfanedBane, PROG-MohamedDwidar, Prole0, ProPandaBear, 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, Raitononai, Ramlik, RamZ, randy10122, Rane, Ranger6012, Rapidgame7, ravage123321, rbertoche, RedBookcase, Redfire1331, Redict, RedlineTriad, redmushie, RednoWCirabrab, ReeZer2, RemberBM, RemieRichards, RemTim, rene-descartes2021, Renlou, retequizzle, rhailrake, rhsvenson, rich-dunne, RieBi, riggleprime, RIKELOLDABOSS, rinary1, Rinkashikachi, riolume, rlebell33, RobbyTheFish, robinthedragon, Rockdtben, Rohesie, rok-povsic, rokudara-sen, rolfero, RomanNovo, rosieposieeee, Roudenn, router, ruddygreat, rumaks, RumiTiger, Ruzihm, S1rFl0, S1ss3l, Saakra, Sadie-silly, saga3152, saintmuntzer, 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, shibechef, Siginanto, signalsender, SignalWalker, siigiil, silicon14wastaken, Silverfur-underscore, Simyon264, sirdragooon, Sirionaut, SirWarock, Sk1tch, SkaldetSkaeg, Skarletto, Skybailey-dev, skye, Skyedra, SlamBamActionman, slarticodefast, Slava0135, sleepyyapril, slimmslamm, Slyfox333, Smugman, SnappingOpossum, snebl, snicket, sniperchance, Snowni, snowsignal, SolidSyn, SolidusSnek, solstar2, 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, 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, Szunti, t, Tainakov, takemysoult, taonewt, tap, TaralGit, Taran, 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, TheFlyingSentry, 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, trixxedbit, TrixxedHeart, tropicalhibi, truepaintgit, Truoizys, Tryded, TsjipTsjip, Tunguso4ka, TurboTrackerss14, tyashley, Tyler-IN, TytosB, Tyzemol, UbaserB, Uberration, ubis1, UBlueberry, uhbg, UKNOWH, UltimateJester, Unbelievable-Salmon, underscorex5, UnicornOnLSD, Unisol, unusualcrow, Uriende, UristMcDorf, user424242420, Utmanarn, Vaaankas, valentfingerov, valquaint, Varen, Vasilis, VasilisThePikachu, veliebm, Velken, VelonacepsCalyxEggs, veprolet, VerinSenpai, veritable-calamity, Veritius, Vermidia, vero5123, verslebas, vexerot, vgskye, 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, ZelteHonor, zero, ZeroDiamond, ZeWaka, zHonys, zionnBE, ZNixian, Zokkie, ZoldorfTheWizard, zonespace27, Zylofan, Zymem, zzylex From f727d7ba4217ad330461055dc075b4f970dc2074 Mon Sep 17 00:00:00 2001 From: Ben Dake <124413509+Buunie099@users.noreply.github.com> Date: Sun, 16 Nov 2025 05:22:45 -0500 Subject: [PATCH 070/100] Vulp crying now uses whining sounds (#40982) * Change vulp whine emote name to crying * Fix vulp yaml * Add whining back for typing * review --------- Co-authored-by: ScarKy0 --- Resources/Prototypes/Voice/speech_emote_sounds.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Resources/Prototypes/Voice/speech_emote_sounds.yml b/Resources/Prototypes/Voice/speech_emote_sounds.yml index 24f7b51b53..a1ef9d8ece 100644 --- a/Resources/Prototypes/Voice/speech_emote_sounds.yml +++ b/Resources/Prototypes/Voice/speech_emote_sounds.yml @@ -498,6 +498,8 @@ collection: VulpkaninBarks Whine: collection: VulpkaninWhines + Crying: + collection: VulpkaninWhines Howl: collection: VulpkaninHowls Gasp: @@ -530,6 +532,8 @@ collection: VulpkaninBarks Whine: collection: VulpkaninWhines + Crying: + collection: VulpkaninWhines Howl: collection: VulpkaninHowls Gasp: From 9d4261df404c4f2d02bf8d605eadb04acb3e86ea Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 16 Nov 2025 10:35:47 +0000 Subject: [PATCH 071/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index bdc3196293..555dfcd5be 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: slarticodefast - changes: - - message: The interrogator lamp and flash lantern now properly flash when toggled - on. - type: Fix - id: 8707 - time: '2025-06-23T11:32:57.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/37640 - author: metalgearsloth changes: - message: Added ambient occlusion to walls so they have shadows around them. @@ -3926,3 +3918,10 @@ id: 9207 time: '2025-11-16T01:03:18.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41438 +- author: buunie099 + changes: + - message: Vulpkannin cries now use the same sounds as whining + type: Tweak + id: 9208 + time: '2025-11-16T10:34:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/40982 From 5c5ad10a77f4bc1f2e92a59c6fc81536e2a86b09 Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Sun, 16 Nov 2025 13:44:18 +0000 Subject: [PATCH 072/100] Fix typo in PR template (#41451) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit My browser keeps pointing it out and I don't like it :⁾ --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 4029b093cc..53fad99b1a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,13 +10,13 @@ ## Media - ## 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 added media to this PR or it does not require an ingame showcase. +- [ ] I have added media to this PR or it does not require an in-game showcase. ## Breaking changes From 17ed12b1caa0f7eba3afeea35ad1006bb21c2129 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 16 Nov 2025 21:46:02 +0100 Subject: [PATCH 073/100] fix DamageAbleSystem.SetDamage (#41456) fix SetDamage --- .../Damage/Systems/DamageableSystem.API.cs | 30 ++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Damage/Systems/DamageableSystem.API.cs b/Content.Shared/Damage/Systems/DamageableSystem.API.cs index c2a1374901..c5452eda7c 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.API.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.API.cs @@ -8,13 +8,41 @@ namespace Content.Shared.Damage.Systems; public sealed partial class DamageableSystem { /// - /// Directly sets the damage specifier of a damageable component. + /// Directly sets the damage in a damageable component. + /// This method keeps the damage types supported by the DamageContainerPrototype in the component. + /// If a type is given in , but not supported then it will not be set. + /// If a type is supported but not given in then it will be set to 0. /// /// /// Useful for some unfriendly folk. Also ensures that cached values are updated and that a damage changed /// event is raised. /// public void SetDamage(Entity ent, DamageSpecifier damage) + { + if (!_damageableQuery.Resolve(ent, ref ent.Comp, false)) + return; + + foreach (var type in ent.Comp.Damage.DamageDict.Keys) + { + if (damage.DamageDict.TryGetValue(type, out var value)) + ent.Comp.Damage.DamageDict[type] = value; + else + ent.Comp.Damage.DamageDict[type] = 0; + } + + OnEntityDamageChanged((ent, ent.Comp)); + } + + /// + /// Directly sets the damage specifier of a damageable component. + /// This will overwrite the complete damage dict, meaning it will bulldoze the supported damage types. + /// + /// + /// This may break persistance as the supported types are reset in case the component is initialized again. + /// So this only makes sense if you also change the DamageContainerPrototype in the component at the same time. + /// Only use this method if you know what you are doing. + /// + public void SetDamageSpecifier(Entity ent, DamageSpecifier damage) { if (!_damageableQuery.Resolve(ent, ref ent.Comp, false)) return; From 508f45e81d5d50b6853f5eede337cda1abc78700 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Mon, 17 Nov 2025 00:48:25 +0100 Subject: [PATCH 074/100] Make crawl speed depend on your free hand count (#41458) * crawl speed * I can't spell --- .../SharedHandsSystem.EventListeners.cs | 14 ++++++++ .../Stunnable/SharedStunSystem.Knockdown.cs | 34 +++++++++++++++++-- 2 files changed, 45 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs index af0ed1c1aa..ea2502331e 100644 --- a/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs +++ b/Content.Shared/Hands/EntitySystems/SharedHandsSystem.EventListeners.cs @@ -11,6 +11,7 @@ public abstract partial class SharedHandsSystem private void InitializeEventListeners() { SubscribeLocalEvent(OnStandupArgs); + SubscribeLocalEvent(OnKnockedDownRefresh); } /// @@ -28,4 +29,17 @@ public abstract partial class SharedHandsSystem time.DoAfterTime *= (float)ent.Comp.Count / (hands + ent.Comp.Count); } + + private void OnKnockedDownRefresh(Entity ent, ref KnockedDownRefreshEvent args) + { + var freeHands = CountFreeHands(ent.AsNullable()); + var totalHands = GetHandCount(ent.AsNullable()); + + // Can't crawl around without any hands. + // Entities without the HandsComponent will always have full crawling speed. + if (totalHands == 0) + args.SpeedModifier = 0f; + else + args.SpeedModifier *= (float)freeHands / totalHands; + } } diff --git a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs index fc2b01c649..58f38c9db8 100644 --- a/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs +++ b/Content.Shared/Stunnable/SharedStunSystem.Knockdown.cs @@ -1,12 +1,12 @@ using Content.Shared.Alert; using Content.Shared.Buckle.Components; using Content.Shared.CCVar; -using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Database; using Content.Shared.DoAfter; using Content.Shared.Gravity; +using Content.Shared.Hands; using Content.Shared.Hands.EntitySystems; using Content.Shared.Input; using Content.Shared.Movement.Events; @@ -54,7 +54,7 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnBuckleAttempt); SubscribeLocalEvent(OnStandAttempt); - // Updating movement a friction + // Updating movement and friction SubscribeLocalEvent(OnRefreshKnockedSpeed); SubscribeLocalEvent(OnRefreshFriction); SubscribeLocalEvent(OnKnockedTileFriction); @@ -66,6 +66,9 @@ public abstract partial class SharedStunSystem SubscribeLocalEvent(OnKnockdownRefresh); SubscribeLocalEvent(OnDamaged); SubscribeLocalEvent(OnWeightlessnessChanged); + SubscribeLocalEvent(OnHandEquipped); + SubscribeLocalEvent(OnHandUnequipped); + SubscribeLocalEvent(OnHandCountChanged); SubscribeLocalEvent(OnKnockdownAttempt); SubscribeLocalEvent(OnGetStandUpTime); @@ -380,7 +383,7 @@ public abstract partial class SharedStunSystem private void OnForceStandup(ForceStandUpEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity is not {} user) + if (args.SenderSession.AttachedEntity is not { } user) return; ForceStandUp(user); @@ -522,6 +525,30 @@ public abstract partial class SharedStunSystem RemCompDeferred(entity); } + private void OnHandEquipped(Entity entity, ref DidEquipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandUnequipped(Entity entity, ref DidUnequipHandEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + + private void OnHandCountChanged(Entity entity, ref HandCountChangedEvent args) + { + if (GameTiming.ApplyingState) + return; // The result of the change is already networked separately in the same game state + + RefreshKnockedMovement(entity); + } + private void OnKnockdownAttempt(Entity entity, ref KnockDownAttemptEvent args) { // Directed, targeted moth attack. @@ -582,6 +609,7 @@ public abstract partial class SharedStunSystem ent.Comp.SpeedModifier = ev.SpeedModifier; ent.Comp.FrictionModifier = ev.FrictionModifier; + Dirty(ent); _movementSpeedModifier.RefreshMovementSpeedModifiers(ent); _movementSpeedModifier.RefreshFrictionModifiers(ent); From e88d2b748155040b8fd1ae6df2cba42c31a009c3 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 00:00:55 +0000 Subject: [PATCH 075/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 555dfcd5be..c9e5db7d81 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Added ambient occlusion to walls so they have shadows around them. - type: Add - id: 8708 - time: '2025-06-24T07:56:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38276 - author: BramvanZijp changes: - message: Added Stamina Damage resistance to the raid/hard-suits used by Nuclear @@ -3925,3 +3918,10 @@ id: 9208 time: '2025-11-16T10:34:39.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/40982 +- author: slarticodefast + changes: + - message: Crawling speed now depends on the number of free hands you have. + type: Tweak + id: 9209 + time: '2025-11-16T23:59:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41458 From 28eeaa5d9ff8be26a17bb837c562bd119951f2c5 Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 17 Nov 2025 11:46:54 -0300 Subject: [PATCH 076/100] Update mothership (#41453) * add body crusher sprites * body crusher yml * add xenoborg thruster sprites * add xenoborg thruster yml * update mothership * only one IFF computer * tabs * fuck * fixed indentation * replace tabs with spaces * change id MachineBodyCrusher to MachineArtifactCrusherXenoborg Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * change id XenoborgThruster to ThrusterXenoborg Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> * update Ids in mothership --------- Co-authored-by: ScarKy0 <106310278+ScarKy0@users.noreply.github.com> --- Resources/Maps/Shuttles/mothership.yml | 232 +++++++++--------- .../Structures/Machines/artifact_analyzer.yml | 10 + .../Structures/Shuttles/thrusters.yml | 7 + .../Machines/body_crusher.rsi/base.png | Bin 0 -> 650 bytes .../Machines/body_crusher.rsi/door-closed.png | Bin 0 -> 272 bytes .../Machines/body_crusher.rsi/glass.png | Bin 0 -> 195 bytes .../Machines/body_crusher.rsi/icon.png | Bin 0 -> 977 bytes .../Machines/body_crusher.rsi/lights.png | Bin 0 -> 213 bytes .../Machines/body_crusher.rsi/meta.json | 51 ++++ .../Machines/body_crusher.rsi/piston-push.png | Bin 0 -> 1320 bytes .../Machines/body_crusher.rsi/piston.png | Bin 0 -> 347 bytes .../Shuttles/xenoborg_thruster.rsi/base.png | Bin 0 -> 2082 bytes .../Shuttles/xenoborg_thruster.rsi/meta.json | 83 +++++++ .../Shuttles/xenoborg_thruster.rsi/thrust.png | Bin 0 -> 506 bytes .../thrust_burn_unshaded.png | Bin 0 -> 2581 bytes 15 files changed, 268 insertions(+), 115 deletions(-) create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/base.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/door-closed.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/icon.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png create mode 100644 Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/base.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/meta.json create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust.png create mode 100644 Resources/Textures/Structures/Shuttles/xenoborg_thruster.rsi/thrust_burn_unshaded.png diff --git a/Resources/Maps/Shuttles/mothership.yml b/Resources/Maps/Shuttles/mothership.yml index 41ca3d89d8..e515787629 100644 --- a/Resources/Maps/Shuttles/mothership.yml +++ b/Resources/Maps/Shuttles/mothership.yml @@ -1,11 +1,11 @@ meta: format: 7 category: Grid - engineVersion: 266.0.0 + engineVersion: 268.0.0 forkId: "" forkVersion: "" - time: 08/21/2025 13:34:57 - entityCount: 440 + time: 11/16/2025 15:37:41 + entityCount: 441 maps: [] grids: - 1 @@ -1100,10 +1100,11 @@ entities: parent: 1 - proto: ComputerIFFSyndicate entities: - - uid: 278 + - uid: 437 components: - type: Transform - pos: 2.5,5.5 + rot: -1.5707963267948966 rad + pos: 2.5,1.5 parent: 1 - proto: ComputerPowerMonitoring entities: @@ -1132,6 +1133,11 @@ entities: parent: 1 - proto: ComputerSurveillanceCameraMonitor entities: + - uid: 278 + components: + - type: Transform + pos: 2.5,5.5 + parent: 1 - uid: 426 components: - type: Transform @@ -1579,22 +1585,18 @@ entities: rot: 3.141592653589793 rad pos: -6.5,-0.5 parent: 1 -- proto: MachineArtifactCrusher +- proto: MachineArtifactCrusherXenoborg entities: - - uid: 372 + - uid: 111 components: - - type: MetaData - name: body crusher - - type: Transform - pos: 3.5,-4.5 - parent: 1 - - uid: 373 - components: - - type: MetaData - name: body crusher - type: Transform pos: 2.5,-4.5 parent: 1 + - uid: 112 + components: + - type: Transform + pos: 3.5,-4.5 + parent: 1 - proto: PlasticFlapsAirtightClear entities: - uid: 252 @@ -1760,22 +1762,22 @@ entities: - uid: 438 components: - type: Transform - pos: -0.5,4.5 + pos: 1.5,-0.5 parent: 1 - uid: 439 components: - type: Transform - pos: 1.5,4.5 + pos: 1.5,1.5 parent: 1 - uid: 440 components: - type: Transform - pos: 2.5,4.5 + pos: -0.5,1.5 parent: 1 - - uid: 437 + - uid: 441 components: - type: Transform - pos: -1.5,4.5 + pos: -0.5,-0.5 parent: 1 - proto: SubstationBasic entities: @@ -1875,100 +1877,6 @@ entities: - type: Transform pos: -2.5,5.5 parent: 1 -- proto: Thruster - entities: - - uid: 111 - components: - - type: Transform - pos: -10.5,3.5 - parent: 1 - - uid: 112 - components: - - type: Transform - pos: -9.5,3.5 - parent: 1 - - uid: 113 - components: - - type: Transform - pos: -7.5,3.5 - parent: 1 - - uid: 114 - components: - - type: Transform - pos: -6.5,3.5 - parent: 1 - - uid: 115 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-2.5 - parent: 1 - - uid: 116 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-2.5 - parent: 1 - - uid: 117 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -10.5,-2.5 - parent: 1 - - uid: 118 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -9.5,-2.5 - parent: 1 - - uid: 119 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,-0.5 - parent: 1 - - uid: 120 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,0.5 - parent: 1 - - uid: 121 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,1.5 - parent: 1 - - uid: 122 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,1.5 - parent: 1 - - uid: 123 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,0.5 - parent: 1 - - uid: 124 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 8.5,-0.5 - parent: 1 - - uid: 125 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-6.5 - parent: 1 - - uid: 126 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 3.5,-6.5 - parent: 1 - proto: TwoWayLever entities: - uid: 5 @@ -2567,6 +2475,100 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,2.5 parent: 1 +- proto: ThrusterXenoborg + entities: + - uid: 113 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -9.5,3.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: -10.5,3.5 + parent: 1 + - uid: 117 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-2.5 + parent: 1 + - uid: 118 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-2.5 + parent: 1 + - uid: 119 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -10.5,-2.5 + parent: 1 + - uid: 120 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -9.5,-2.5 + parent: 1 + - uid: 121 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,-0.5 + parent: 1 + - uid: 122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,0.5 + parent: 1 + - uid: 123 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,1.5 + parent: 1 + - uid: 124 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,-0.5 + parent: 1 + - uid: 125 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,0.5 + parent: 1 + - uid: 126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 8.5,1.5 + parent: 1 + - uid: 372 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-6.5 + parent: 1 + - uid: 373 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 3.5,-6.5 + parent: 1 - proto: XenoborgWindow entities: - uid: 3 diff --git a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml index 95684e7520..a80456583a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/artifact_analyzer.yml @@ -157,3 +157,13 @@ machine_parts: !type:Container entity_storage: !type:Container output_container: !type:Container + +# just a resprite +- type: entity + parent: MachineArtifactCrusher + id: MachineArtifactCrusherXenoborg + name: body crusher + description: Best not to let your head get stuck... + components: + - type: Sprite + sprite: Structures/Machines/body_crusher.rsi diff --git a/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml b/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml index c80ff8eb70..bb43cb3b2c 100644 --- a/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml +++ b/Resources/Prototypes/Entities/Structures/Shuttles/thrusters.yml @@ -102,6 +102,13 @@ visible: false offset: 0, 1 +- type: entity + parent: Thruster + id: ThrusterXenoborg + components: + - type: Sprite + sprite: Structures/Shuttles/xenoborg_thruster.rsi + - type: entity id: ThrusterLarge name: large thruster diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/base.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/base.png new file mode 100644 index 0000000000000000000000000000000000000000..a1c8292bbd7b0a97c6bf07419eb5e383fa578941 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU~u4IV_;yY?kio#z`(#*9OUlAu{)Ur)){209cmiyi`xMcaJ=Eb+S z^Gb#7R+}-*dhN@=z!Ar^<@}pFYc|xLYKdbzFz5Sk<^qn!371~%+PPEE@rSa#;kH%3 z*|xcGbS`?>U$bHZ`~8P8PfmOBG1Ro0S8y&WSns4C6xO`Lke(#y$av}8Ogvmj7;?hrOt)w_n83kM@j~Y4HW}+>i8~d}G_E<9T5B-7bv^Sf z2CMw}OW(imJTRYCK<_AjzrXPOzDvh#wm;`QFC*iSoXWYb-TdN$r$<{m9UkcmZ|`O5 z;CZ5{$L_=Bw@m1!o(-pW!y(2c@dwL8yaE`c`ijf>8hj3Zdc?Fn!DrFyhrGKMNKSv< z8QjlxEAyxFeTyQQ1OE=rD{06&zhm!a)!g7buh67Y*Ef=4vOb&*-}1b(!*#U7RvlZu zf6e^Od^c7#&AzpgiJ|2DxwV#tTT}nMo;IQKWxt=-{N9{8rfb4`uD(dCW&iv Y;CE=fy{}Uh0|Nttr>mdKI;Vst07d9=O8@`> literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/glass.png new file mode 100644 index 0000000000000000000000000000000000000000..071e8a0db5631b09b2ca08227ad5067ba3becafd GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU~u4IW?*3O322?ez`(#*9OUlAuP1{eE+M z``x*k7cTzS>*rAa{Qa5qo^9Tzy?4#16J$t!oXpTrqnDp``TG6iGT$v0Zf9C>@cQ+5 zWgm{Nu0`7}Up5cv2r*hZ`}Om^Oo2)*D{gwI27kCDykFTud)fpkhFLGqKL3=p%iVBM z_Sq~4_5~VUxe87li8*hdYTvGWx%Ry8f*T!{3MXM;E# ze0NJ%zV$s9w#@ZM+T$->>;3266<(x&D2a1r3fIj3?TYVxRzA-6Hxrm!!M8LbNo=73 z1A|9h$D%oN4`q}@$a<$YJpQHjOMhw$TRIcNfs7J~{(1X?e|K|Fo>0%xf0xB$&6*|w zCf7iRL$)Vs886Mu)zR}=<@WN78B;R@=l6oYVIQb(Ze% zOS$FS>cKuCA~IKYEz>;9(mw_EjsCwMHJv+qZUZBO!jt+83*pW?Ejr=>Yxx|qVw}%@ zzPIUX$zBJQOWcuq5>4_o^=n=mcYoNiapn8#)rEI76mD$iPT&ZLHYRAEMJ+1Ir<6`J05T}m`C@;xlK~x+*rsGu(D+J@vXCJ zqqdse+PRKFYiiz)8pmk$v`;^qwh7$XuAt7Y;3-s8>sW; zpE!B8&RC-)`3l<&VQz)F%kBNDb9J+O^exOCwpuNSGh8oquQ{Im!_TG{{Zpd%ZkoDs zWl@p90rPSOU-mz&Pu+YNeqG{VJopI;Hth;>-`+ zt+X<|u(HvQw4g^q0|SGntDnm{r-UW|oD0F} literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/lights.png new file mode 100644 index 0000000000000000000000000000000000000000..ce30eb3c32266fa99d846656f21a495e099f38b2 GIT binary patch literal 213 zcmeAS@N?(olHy`uVBq!ia0y~yU{GLSU~u4IW?*3O322?ez`(#*9OUlAuB(%Vl{TrM-7?YVR4+J<`@>IDS_+vU!jWms6k=T^eNz`)??>gTe~DWM4f D#H>wn literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json b/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json new file mode 100644 index 0000000000..57d0567ab6 --- /dev/null +++ b/Resources/Textures/Structures/Machines/body_crusher.rsi/meta.json @@ -0,0 +1,51 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by brainfood1183 (github) for ss14. modified by Samuka-C (github)", + "size": { + "x": 32, + "y": 64 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "glass" + }, + { + "name": "door-closed" + }, + { + "name": "piston" + }, + { + "name": "base" + }, + { + "name": "lights" + }, + { + "name": "piston-push", + "delays": [ + [ + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 0.66, + 1 + ] + ] + } + ] +} diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/piston-push.png new file mode 100644 index 0000000000000000000000000000000000000000..020d3b2902910c722cb3a89c3d1f3f69f8268736 GIT binary patch literal 1320 zcmeAS@N?(olHy`uVBq!ia0y~yU|7Jwz;J+rje&uo**c?~fq{XsILO_JVcj{ImkbOn zk33x*Ln`LHy=&E7N;|z|3U50JIr=6pwHK+hcYNaC_$g4}YHdr$CoKV? z+8Iiw-9n4rhRL*b^?eqV-ptaP(sqN(@PE89-<~r)4{DF`iFhzzf(Hvyf<;OfADOZ6 z-|z48wp02-e5<(K_tz~{xDoz;Nxtd+-e>3HF6HDzU+p_4+?%(~DEhbZ8u`-2N50pt zzGcy8{P*7en0f;P?$@{89?1N=>9ktTto5_LsKoB@*&QO)@cMM}X$BvW(#0yTkproUCbAMgG>Wx9^zfW9lwflF*(_V_9N zouIP%SXJcX%DGQIeze*AT!1MdKbUF521eWUlS5AFF6Di(Dk#r$URahBQ@|UBi2F^w znHqn})^EN%t0_SzS!&Xknz?v+MnWU|Ies#^Oa)x`$gYtZ(E4JD$x&EH>fL8YYXVLS>G7W&cvIeZ4dCzF%>={>I4qlH#d9 zZ&j|1FT3d=A(vrbFv*QO`;kT2Ofj)b3^%Sl6Kt@tFkPUs^|qtj?+s22*VNZDM3^ry zbT*Z~9kzAx$0KD?=`0H(=J+2dRb)8I(-6wM?D+eyPdCbWxvx^&+qyV@e$JKR4qm1S z{tR>c9A-aTt!C>fu6J3_m7z|eQNb}NI3F@xXsg#B^BHRbz@dbOE8cndOb*aAub z9`-6HS8a^DRuQLOSz~kljb#hNjoVWgbaEWdzgC%ASr)SB7Kj9azP9`SJH(pCb5|Du+(Kcj)4Jf3sJXN7xuos5AJfFYx^wI(gm_?&+D+ zl^BllHUu-X9gMj2@XOWPk2B^RJoiiiZ2TN4gYzjj6+qEY%G~y_@$!*M8xCOxCfup; a#Qpyo&N3ebZaVXT6nVP(xvX6 literal 0 HcmV?d00001 diff --git a/Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png b/Resources/Textures/Structures/Machines/body_crusher.rsi/piston.png new file mode 100644 index 0000000000000000000000000000000000000000..b3ad39439bbd204e64959009e3fa8f381a56d596 GIT binary patch literal 347 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 Date: Mon, 17 Nov 2025 14:31:03 -0300 Subject: [PATCH 077/100] Make mothership core able to pull (#41460) * make mothership core able to pull again * make it work like borgs --- Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml index 0ac7872b67..c66caff638 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/mothershipcore.yml @@ -197,7 +197,8 @@ cell_slot: name: power-cell-slot-component-slot-name-default startingItem: PowerCellMicroreactor - # - type: Puller # use the conveyor + - type: Puller + needsHands: false - type: Eye drawFov: false # - type: StationAiOverlay # removed until is no longer buggy From b59ecdba6a5b55b1f03f37c12a914302e4eaffab Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 17:43:35 +0000 Subject: [PATCH 078/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index c9e5db7d81..28e8c2ef6f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: BramvanZijp - changes: - - message: Added Stamina Damage resistance to the raid/hard-suits used by Nuclear - Operatives and Emergency Response Teams. - type: Tweak - id: 8709 - time: '2025-06-24T13:04:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38526 - author: Kittygyat changes: - message: Added a handheld station map to the borg thruster module! @@ -3925,3 +3917,10 @@ id: 9209 time: '2025-11-16T23:59:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41458 +- author: Samuka + changes: + - message: The xenoborg mothership core can now pull stuff. + type: Fix + id: 9210 + time: '2025-11-17T17:42:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41460 From 9ef56974fb0922d9db153f62d83ce90fe3153304 Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Mon, 17 Nov 2025 14:55:55 -0300 Subject: [PATCH 079/100] Examine which borg that module fits into (#41461) * modules tip * add color * solved a edge case * use ContentLocalizationManager instead of hardcoded grammar * improve summary * improve improved summary Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * not my first language Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * keep names consistent Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> * keep consistent part 2 * fixed the yml error --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Borgs/Components/BorgModuleComponent.cs | 8 ++++ .../Silicons/Borgs/SharedBorgSystem.cs | 22 ++++++++++ .../Locale/en-US/silicons/borg-module.ftl | 18 ++++++++ .../Specific/Robotics/borg_modules.yml | 41 +++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 Resources/Locale/en-US/silicons/borg-module.ftl diff --git a/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs index e542a1e3e3..f50b088932 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgModuleComponent.cs @@ -1,4 +1,5 @@ using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Silicons.Borgs.Components; @@ -24,6 +25,13 @@ public sealed partial class BorgModuleComponent : Component [DataField] [AutoNetworkedField] public bool DefaultModule; + + /// + /// List of types of borgs this module fits into. + /// This only affects examine text. The actual whitelist for modules that can be inserted into a borg is defined in its . + /// + [DataField] + public HashSet? BorgFitTypes; } /// diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index baf604de0c..f9b4ec7cb8 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -1,6 +1,8 @@ using Content.Shared.Containers.ItemSlots; +using Content.Shared.Examine; using Content.Shared.IdentityManagement; using Content.Shared.Item.ItemToggle; +using Content.Shared.Localizations; using Content.Shared.Movement.Components; using Content.Shared.Movement.Systems; using Content.Shared.Popups; @@ -35,10 +37,30 @@ public abstract partial class SharedBorgSystem : EntitySystem SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); SubscribeLocalEvent(OnUIOpenAttempt); SubscribeLocalEvent(OnTryGetIdentityShortInfo); + SubscribeLocalEvent(OnModuleExamine); InitializeRelay(); } + private void OnModuleExamine(Entity ent, ref ExaminedEvent args) + { + if (ent.Comp.BorgFitTypes == null) + return; + + if (ent.Comp.BorgFitTypes.Count == 0) + return; + + var typeList = new List(); + + foreach (var type in ent.Comp.BorgFitTypes) + { + typeList.Add(Loc.GetString(type)); + } + + var types = ContentLocalizationManager.FormatList(typeList); + args.PushMarkup(Loc.GetString("borg-module-fit", ("types", types))); + } + private void OnTryGetIdentityShortInfo(TryGetIdentityShortInfoEvent args) { if (args.Handled) diff --git a/Resources/Locale/en-US/silicons/borg-module.ftl b/Resources/Locale/en-US/silicons/borg-module.ftl new file mode 100644 index 0000000000..07c55c04a6 --- /dev/null +++ b/Resources/Locale/en-US/silicons/borg-module.ftl @@ -0,0 +1,18 @@ +borg-module-fit = This module fits into {$types}. + +borg-type-all = [color=white]any cyborg[/color] +borg-type-salvage = [color= #d6b328]salvage cyborgs[/color] +borg-type-engineer = [color= #ff9900]engineer cyborgs[/color] +borg-type-generic = [color= #666680]generic cyborgs[/color] +borg-type-janitor = [color= #a747c0]janitor cyborgs[/color] +borg-type-medical = [color= #5995ba]medical cyborgs[/color] +borg-type-service = [color= #508242]service cyborgs[/color] + +borg-type-syndicate = [color= #962023]syndicate cyborgs[/color] +borg-type-syndicate-assault = [color= #680a0d]syndicate assault cyborgs[/color] + +xenoborg-type-all = [color= #3d94ff]any xenoborg[/color] +xenoborg-type-engi = [color= #edd45b]engi xenoborgs[/color] +xenoborg-type-heavy = [color= #d62020]heavy xenoborgs[/color] +xenoborg-type-scout = [color= #6a6b6f]scout xenoborgs[/color] +xenoborg-type-stealth = [color= #ff00cc]stealth xenoborgs[/color] diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index 862bc86339..5c01137543 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -27,6 +27,8 @@ - type: Sprite sprite: Objects/Specific/Robotics/borgmodule.rsi - type: BorgModule + borgFitTypes: + - borg-type-all - type: BorgModuleIcon icon: { sprite: Interface/Actions/actions_borg.rsi, state: no-action } - type: StaticPrice @@ -66,6 +68,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-salvage - type: Tag tags: - BorgModuleCargo @@ -91,6 +96,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-engineer - type: Tag tags: - BorgModuleEngineering @@ -118,6 +126,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-janitor - type: Tag tags: - BorgModuleJanitor @@ -145,6 +156,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-medical - type: Tag tags: - BorgModuleMedical @@ -172,6 +186,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-generic - type: Tag tags: - BorgModuleScience @@ -199,6 +216,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-service - type: Tag tags: - BorgModuleService @@ -226,6 +246,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-syndicate - type: Tag tags: - BorgModuleSyndicate @@ -254,6 +277,9 @@ parent: BaseBorgModule abstract: true components: + - type: BorgModule + borgFitTypes: + - borg-type-syndicate-assault - type: Tag tags: - BorgModuleSyndicateAssault @@ -281,6 +307,9 @@ parent: BaseBorgModule id: BaseXenoborgModuleGeneric components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-all - type: Tag tags: - XenoborgModuleGeneric @@ -308,6 +337,9 @@ parent: BaseBorgModule id: BaseXenoborgModuleEngi components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-engi - type: Tag tags: - XenoborgModuleEngi @@ -335,6 +367,9 @@ id: BaseXenoborgModuleHeavy abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-heavy - type: Tag tags: - XenoborgModuleHeavy @@ -362,6 +397,9 @@ id: BaseXenoborgModuleScout abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-scout - type: Tag tags: - XenoborgModuleScout @@ -389,6 +427,9 @@ id: BaseXenoborgModuleStealth abstract: true components: + - type: BorgModule + borgFitTypes: + - xenoborg-type-stealth - type: Tag tags: - XenoborgModuleStealth From ff0f4e902835652c188bbb2b5db763d6dbefc100 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 17 Nov 2025 18:08:37 +0000 Subject: [PATCH 080/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 28e8c2ef6f..af727fc992 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Kittygyat - changes: - - message: Added a handheld station map to the borg thruster module! - type: Add - id: 8710 - time: '2025-06-24T15:35:39.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38541 - author: PJB3005 changes: - message: Fixed various worn clothing items being invisible when seen through UI, @@ -3924,3 +3917,10 @@ id: 9210 time: '2025-11-17T17:42:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41460 +- author: Samuka + changes: + - message: Borg modules now tell which kind of borgs they fit into. + type: Add + id: 9211 + time: '2025-11-17T18:07:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41461 From 6e8435e08056ab3da401038020df1a151e2038f2 Mon Sep 17 00:00:00 2001 From: cammusubi <122420207+cammusubi@users.noreply.github.com> Date: Mon, 17 Nov 2025 18:06:15 -0600 Subject: [PATCH 081/100] Per issue #41143, 'ClusterBang' was changed to 'clusterbang' (#41470) Per issue #41143, 'ClusterBang' was changed to display as 'clusterbang' in-game. --- .../Entities/Objects/Weapons/Throwable/scattering_grenades.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml index 43ec57e068..6bff4fbd44 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/scattering_grenades.yml @@ -49,7 +49,7 @@ - type: entity parent: ClusterBang id: ClusterBangFull - name: ClusterBang + name: clusterbang description: Launches three flashbangs after the timer runs out. suffix: Full components: From 9bab0a3287e7e825f431a5646726dbced217d18e Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Tue, 18 Nov 2025 14:44:13 -0300 Subject: [PATCH 082/100] add 2 empty lines to xenoborg round end text (#41436) * add 2 empty lines * add one line on the top * swap from the start to the end --- Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/SurvivorRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs | 1 + Content.Server/GameTicking/Rules/ZombieRuleSystem.cs | 1 + 6 files changed, 6 insertions(+) diff --git a/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs b/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs index 9ae8c5ff83..aafed20704 100644 --- a/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/DeathMatchRuleSystem.cs @@ -129,5 +129,6 @@ public sealed class DeathMatchRuleSystem : GameRuleSystem { args.AddLine(Loc.GetString("nukeops-list-name-user", ("name", name), ("user", sessionData.UserName))); } + args.AddLine(""); } private void OnNukeExploded(NukeExplodedEvent ev) diff --git a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs index ef773f59d1..d2cd27022f 100644 --- a/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/RevolutionaryRuleSystem.cs @@ -118,6 +118,7 @@ public sealed class RevolutionaryRuleSystem : GameRuleSystem args.AddLine(Loc.GetString("survivor-round-end-dead-count", ("deadCount", deadSurvivors))); args.AddLine(Loc.GetString("survivor-round-end-alive-count", ("aliveCount", aliveMarooned))); args.AddLine(Loc.GetString("survivor-round-end-alive-on-shuttle-count", ("aliveCount", aliveOnShuttle))); + args.AddLine(""); // Player manifest at EOR shows who's a survivor so no need for extra info here. } diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs index 8d13578301..21b987eb0e 100644 --- a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -85,6 +85,7 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem { args.AddLine(Loc.GetString("xenoborgs-list", ("name", name), ("user", sessionData.UserName))); } + args.AddLine(""); } private void CheckRoundEnd(XenoborgsRuleComponent xenoborgsRuleComponent) diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index c6da622bb4..11f8d756a0 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -106,6 +106,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem ("name", meta.EntityName), ("username", username))); } + args.AddLine(""); } /// From e3c0e019343fd7378cf21af33f882c17ec9b6a25 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Tue, 18 Nov 2025 19:09:49 +0100 Subject: [PATCH 083/100] Cleanup TipsSystem, add TippyOnTrigger (#41477) * tippy on trigger and refactor * optional parameter for command --- Content.Client/Tips/TipsSystem.cs | 5 + .../Administration/Commands/TippyCommand.cs | 103 +++++++++ Content.Server/Tips/TipsSystem.cs | 211 +++++------------- Content.Shared/Tips/SharedTipsSystem.cs | 74 ++++++ Content.Shared/Tips/TippyEvent.cs | 38 +++- .../Effects/TippyOnTriggerComponent.cs | 66 ++++++ .../Trigger/Systems/TippyOnTriggerSystem.cs | 49 ++++ .../Locale/en-US/commands/tippy-command.ftl | 2 +- Resources/engineCommandPerms.yml | 5 - 9 files changed, 376 insertions(+), 177 deletions(-) create mode 100644 Content.Client/Tips/TipsSystem.cs create mode 100644 Content.Server/Administration/Commands/TippyCommand.cs create mode 100644 Content.Shared/Tips/SharedTipsSystem.cs create mode 100644 Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs diff --git a/Content.Client/Tips/TipsSystem.cs b/Content.Client/Tips/TipsSystem.cs new file mode 100644 index 0000000000..00fc08437c --- /dev/null +++ b/Content.Client/Tips/TipsSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Tips; + +namespace Content.Client.Tips; + +public sealed class TipsSystem : SharedTipsSystem; diff --git a/Content.Server/Administration/Commands/TippyCommand.cs b/Content.Server/Administration/Commands/TippyCommand.cs new file mode 100644 index 0000000000..b79c160706 --- /dev/null +++ b/Content.Server/Administration/Commands/TippyCommand.cs @@ -0,0 +1,103 @@ +using Content.Shared.Administration; +using Content.Shared.Tips; +using Robust.Server.Player; +using Robust.Shared.Console; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Server.Administration.Commands; + +[AdminCommand(AdminFlags.Fun)] +public sealed class TippyCommand : LocalizedEntityCommands +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; + [Dependency] private readonly IPlayerManager _player = default!; + + public override string Command => "tippy"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + if (args.Length < 2) + { + shell.WriteLine(Loc.GetString("cmd-tippy-help")); + return; + } + + ICommonSession? targetSession = null; + if (args[0] != "all") + { + if (!_player.TryGetSessionByUsername(args[0], out targetSession)) + { + shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); + return; + } + } + + var msg = args[1]; + + EntProtoId? prototype = null; + if (args.Length > 2) + { + if (args[2] == "null") + prototype = null; + else if (!_prototype.HasIndex(args[2])) + { + shell.WriteError(Loc.GetString("cmd-tippy-error-no-prototype", ("proto", args[2]))); + return; + } + else + prototype = args[2]; + } + + var speakTime = _tips.GetSpeechTime(msg); + var slideTime = 3f; + var waddleInterval = 0.5f; + + if (args.Length > 3 && float.TryParse(args[3], out var parsedSpeakTime)) + speakTime = parsedSpeakTime; + + if (args.Length > 4 && float.TryParse(args[4], out var parsedSlideTime)) + slideTime = parsedSlideTime; + + if (args.Length > 5 && float.TryParse(args[5], out var parsedWaddleInterval)) + waddleInterval = parsedWaddleInterval; + + if (targetSession != null) // send to specified player + _tips.SendTippy(targetSession, msg, prototype, speakTime, slideTime, waddleInterval); + else // send to everyone + _tips.SendTippy(msg, prototype, speakTime, slideTime, waddleInterval); + } + + public override CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + return args.Length switch + { + 1 => CompletionResult.FromHintOptions( + CompletionHelper.SessionNames(players: _player), + Loc.GetString("cmd-tippy-auto-1")), + 2 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-2")), + 3 => CompletionResult.FromHintOptions( + CompletionHelper.PrototypeIdsLimited(args[2], _prototype), + Loc.GetString("cmd-tippy-auto-3")), + 4 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-4")), + 5 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-5")), + 6 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-6")), + _ => CompletionResult.Empty + }; + } +} + +[AdminCommand(AdminFlags.Fun)] +public sealed class TipCommand : LocalizedEntityCommands +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + + public override string Command => "tip"; + + public override void Execute(IConsoleShell shell, string argStr, string[] args) + { + _tips.AnnounceRandomTip(); + _tips.RecalculateNextTipTime(); + } +} diff --git a/Content.Server/Tips/TipsSystem.cs b/Content.Server/Tips/TipsSystem.cs index cd7f7b52f5..406ee76ca6 100644 --- a/Content.Server/Tips/TipsSystem.cs +++ b/Content.Server/Tips/TipsSystem.cs @@ -4,10 +4,7 @@ using Content.Shared.CCVar; using Content.Shared.Chat; using Content.Shared.Dataset; using Content.Shared.Tips; -using Robust.Server.GameObjects; -using Robust.Server.Player; using Robust.Shared.Configuration; -using Robust.Shared.Console; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -15,10 +12,7 @@ using Robust.Shared.Timing; namespace Content.Server.Tips; -/// -/// Handles periodically displaying gameplay tips to all players ingame. -/// -public sealed class TipsSystem : EntitySystem +public sealed class TipsSystem : SharedTipsSystem { [Dependency] private readonly IChatManager _chat = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; @@ -26,8 +20,6 @@ public sealed class TipsSystem : EntitySystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly GameTicker _ticker = default!; - [Dependency] private readonly IConsoleHost _conHost = default!; - [Dependency] private readonly IPlayerManager _playerManager = default!; private bool _tipsEnabled; private float _tipTimeOutOfRound; @@ -35,16 +27,6 @@ public sealed class TipsSystem : EntitySystem private string _tipsDataset = ""; private float _tipTippyChance; - /// - /// Always adds this time to a speech message. This is so really short message stay around for a bit. - /// - private const float SpeechBuffer = 3f; - - /// - /// Expected reading speed. - /// - private const float Wpm = 180f; - [ViewVariables(VVAccess.ReadWrite)] private TimeSpan _nextTipTime = TimeSpan.Zero; @@ -53,110 +35,45 @@ public sealed class TipsSystem : EntitySystem base.Initialize(); SubscribeLocalEvent(OnGameRunLevelChanged); - Subs.CVar(_cfg, CCVars.TipFrequencyOutOfRound, SetOutOfRound, true); - Subs.CVar(_cfg, CCVars.TipFrequencyInRound, SetInRound, true); Subs.CVar(_cfg, CCVars.TipsEnabled, SetEnabled, true); - Subs.CVar(_cfg, CCVars.TipsDataset, SetDataset, true); - Subs.CVar(_cfg, CCVars.TipsTippyChance, SetTippyChance, true); + Subs.CVar(_cfg, CCVars.TipFrequencyOutOfRound, value => _tipTimeOutOfRound = value, true); + Subs.CVar(_cfg, CCVars.TipFrequencyInRound, value => _tipTimeInRound = value, true); + Subs.CVar(_cfg, CCVars.TipsDataset, value => _tipsDataset = value, true); + Subs.CVar(_cfg, CCVars.TipsTippyChance, value => _tipTippyChance = value, true); RecalculateNextTipTime(); - _conHost.RegisterCommand("tippy", Loc.GetString("cmd-tippy-desc"), Loc.GetString("cmd-tippy-help"), SendTippy, SendTippyHelper); - _conHost.RegisterCommand("tip", Loc.GetString("cmd-tip-desc"), "tip", SendTip); } - private CompletionResult SendTippyHelper(IConsoleShell shell, string[] args) + private void OnGameRunLevelChanged(GameRunLevelChangedEvent ev) { - return args.Length switch + // reset for lobby -> inround + // reset for inround -> post but not post -> lobby + if (ev.New == GameRunLevel.InRound || ev.Old == GameRunLevel.InRound) { - 1 => CompletionResult.FromHintOptions( - CompletionHelper.SessionNames(players: _playerManager), - Loc.GetString("cmd-tippy-auto-1")), - 2 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-2")), - 3 => CompletionResult.FromHintOptions( - CompletionHelper.PrototypeIdsLimited(args[2], _prototype), - Loc.GetString("cmd-tippy-auto-3")), - 4 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-4")), - 5 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-5")), - 6 => CompletionResult.FromHint(Loc.GetString("cmd-tippy-auto-6")), - _ => CompletionResult.Empty - }; + RecalculateNextTipTime(); + } } - private void SendTip(IConsoleShell shell, string argstr, string[] args) + private void SetEnabled(bool value) { - AnnounceRandomTip(); - RecalculateNextTipTime(); + _tipsEnabled = value; + + if (_nextTipTime != TimeSpan.Zero) + RecalculateNextTipTime(); } - private void SendTippy(IConsoleShell shell, string argstr, string[] args) + public override void RecalculateNextTipTime() { - if (args.Length < 2) + if (_ticker.RunLevel == GameRunLevel.InRound) { - shell.WriteLine(Loc.GetString("cmd-tippy-help")); - return; + _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeInRound); } - - ActorComponent? actor = null; - if (args[0] != "all") - { - ICommonSession? session; - if (args.Length > 0) - { - // Get player entity - if (!_playerManager.TryGetSessionByUsername(args[0], out session)) - { - shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - } - else - { - session = shell.Player; - } - - if (session?.AttachedEntity is not { } user) - { - shell.WriteLine(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - - if (!TryComp(user, out actor)) - { - shell.WriteError(Loc.GetString("cmd-tippy-error-no-user")); - return; - } - } - - var ev = new TippyEvent(args[1]); - - if (args.Length > 2) - { - ev.Proto = args[2]; - if (!_prototype.HasIndex(args[2])) - { - shell.WriteError(Loc.GetString("cmd-tippy-error-no-prototype", ("proto", args[2]))); - return; - } - } - - if (args.Length > 3) - ev.SpeakTime = float.Parse(args[3]); else - ev.SpeakTime = GetSpeechTime(ev.Msg); - - if (args.Length > 4) - ev.SlideTime = float.Parse(args[4]); - - if (args.Length > 5) - ev.WaddleInterval = float.Parse(args[5]); - - if (actor != null) - RaiseNetworkEvent(ev, actor.PlayerSession); - else - RaiseNetworkEvent(ev); + { + _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeOutOfRound); + } } - public override void Update(float frameTime) { base.Update(frameTime); @@ -171,41 +88,30 @@ public sealed class TipsSystem : EntitySystem } } - private void SetOutOfRound(float value) + public override void SendTippy( + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) { - _tipTimeOutOfRound = value; + var ev = new TippyEvent(message, prototype, speakTime, slideTime, waddleInterval); + RaiseNetworkEvent(ev); } - private void SetInRound(float value) + public override void SendTippy( + ICommonSession session, + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) { - _tipTimeInRound = value; + var ev = new TippyEvent(message, prototype, speakTime, slideTime, waddleInterval); + RaiseNetworkEvent(ev, session); } - private void SetEnabled(bool value) - { - _tipsEnabled = value; - - if (_nextTipTime != TimeSpan.Zero) - RecalculateNextTipTime(); - } - - private void SetDataset(string value) - { - _tipsDataset = value; - } - - private void SetTippyChance(float value) - { - _tipTippyChance = value; - } - - public static float GetSpeechTime(string text) - { - var wordCount = (float)text.Split().Length; - return SpeechBuffer + wordCount * (60f / Wpm); - } - - private void AnnounceRandomTip() + public override void AnnounceRandomTip() { if (!_prototype.TryIndex(_tipsDataset, out var tips)) return; @@ -215,35 +121,20 @@ public sealed class TipsSystem : EntitySystem if (_random.Prob(_tipTippyChance)) { - var ev = new TippyEvent(msg); - ev.SpeakTime = GetSpeechTime(msg); - RaiseNetworkEvent(ev); - } else - { - _chat.ChatMessageToManyFiltered(Filter.Broadcast(), ChatChannel.OOC, tip, msg, - EntityUid.Invalid, false, false, Color.MediumPurple); - } - } - - private void RecalculateNextTipTime() - { - if (_ticker.RunLevel == GameRunLevel.InRound) - { - _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeInRound); + var speakTime = GetSpeechTime(msg); + SendTippy(msg, speakTime: speakTime); } else { - _nextTipTime = _timing.CurTime + TimeSpan.FromSeconds(_tipTimeOutOfRound); - } - } - - private void OnGameRunLevelChanged(GameRunLevelChangedEvent ev) - { - // reset for lobby -> inround - // reset for inround -> post but not post -> lobby - if (ev.New == GameRunLevel.InRound || ev.Old == GameRunLevel.InRound) - { - RecalculateNextTipTime(); + _chat.ChatMessageToManyFiltered( + Filter.Broadcast(), + ChatChannel.OOC, + tip, + msg, + EntityUid.Invalid, + false, + false, + Color.MediumPurple); } } } diff --git a/Content.Shared/Tips/SharedTipsSystem.cs b/Content.Shared/Tips/SharedTipsSystem.cs new file mode 100644 index 0000000000..1973aae1a3 --- /dev/null +++ b/Content.Shared/Tips/SharedTipsSystem.cs @@ -0,0 +1,74 @@ +using Content.Shared.CCVar; +using Robust.Shared.Player; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Tips; + +/// +/// Handles periodically displaying gameplay tips to all players ingame. +/// +public abstract class SharedTipsSystem : EntitySystem +{ + /// + /// Always adds this time to a speech message. This is so really short message stay around for a bit. + /// + private const float SpeechBuffer = 3f; + + /// + /// Expected reading speed. + /// + private const float Wpm = 180f; + + /// + /// Send a tippy message to all clients. + /// + /// The text to show in the speech bubble. + /// The entity to show. Defaults to tippy. + /// The time the speech bubble is shown, in seconds. + /// The time the entity takes to walk onto the screen, in seconds. + /// The time between waddle animation steps, in seconds. + public virtual void SendTippy( + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) + { } + + /// + /// Send a tippy message to the given player session. + /// + /// The player session to send the message to. + /// The text to show in the speech bubble. + /// The entity to show. Defaults to tippy. + /// The time the speech bubble is shown, in seconds. + /// The time the entity takes to walk onto the screen, in seconds. + /// The time between waddle animation steps, in seconds. + public virtual void SendTippy( + ICommonSession session, + string message, + EntProtoId? prototype = null, + float speakTime = 5f, + float slideTime = 3f, + float waddleInterval = 0.5f) + { } + + /// + /// Send a random tippy message from the dataset given in . + /// + public virtual void AnnounceRandomTip() { } + + /// + /// Set a random time stamp for the next automatic game tip. + /// + public virtual void RecalculateNextTipTime() { } + + /// + /// Calculate the recommended speak time for a given message. + /// + public float GetSpeechTime(string text) + { + var wordCount = (float)text.Split().Length; + return SpeechBuffer + wordCount * (60f / Wpm); + } +} diff --git a/Content.Shared/Tips/TippyEvent.cs b/Content.Shared/Tips/TippyEvent.cs index e5dc0b7f35..c6b028aa31 100644 --- a/Content.Shared/Tips/TippyEvent.cs +++ b/Content.Shared/Tips/TippyEvent.cs @@ -1,21 +1,37 @@ +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Tips; +/// +/// Networked event that makes a client show a message on their screen using tippy or another protoype. +/// [Serializable, NetSerializable] -public sealed class TippyEvent : EntityEventArgs +public sealed class TippyEvent(string msg, EntProtoId? proto, float speakTime, float slideTime, float waddleInterval) : EntityEventArgs { - public TippyEvent(string msg) - { - Msg = msg; - } + /// + /// The text to show in the speech bubble. + /// + public string Msg = msg; - public string Msg; - public string? Proto; + /// + /// The entity to show. Defaults to tippy. + /// + public EntProtoId? Proto = proto; - // TODO: Why are these defaults even here, have the caller specify. This get overriden only most of the time. - public float SpeakTime = 5; - public float SlideTime = 3; - public float WaddleInterval = 0.5f; + /// + /// The time the speech bubble is shown, in seconds. + /// + public float SpeakTime = speakTime; + + /// + /// The time the entity takes to walk onto the screen, in seconds. + /// + public float SlideTime = slideTime; + + /// + /// The time between waddle animation steps, in seconds. + /// + public float WaddleInterval = waddleInterval; } diff --git a/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs new file mode 100644 index 0000000000..9476d9ea1c --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/TippyOnTriggerComponent.cs @@ -0,0 +1,66 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Sends a tippy message to either the entity or all players when triggered. +/// If TargetUser is true the user will receive the message. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TippyOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Unlocalized message text to send to the player(s). + /// Intended only for admeme purposes. For anything else you should use instead. + /// + [DataField, AutoNetworkedField] + public string Message = string.Empty; + + /// + /// Localized message text to send to the player(s). + /// This has priority over . + /// + [DataField, AutoNetworkedField] + public LocId? LocMessage; + + /// + /// If true the message will be send to all players. + /// If false it will be send to the user or owning entity, depending on . + /// + [DataField, AutoNetworkedField] + public bool SendToAll; + + /// + /// The entity prototype to show to the client. + /// Will default to tippy if null. + /// + [DataField, AutoNetworkedField] + public EntProtoId? Prototype; + + /// + /// Use the prototype of the entity owning this component? + /// Will take priority over . + /// + [DataField, AutoNetworkedField] + public bool UseOwnerPrototype; + + /// + /// The time the speech bubble is shown, in seconds. + /// Will be calculated automatically from the message length if null. + /// + [DataField, AutoNetworkedField] + public float? SpeakTime; + + /// + /// The time the entity takes to walk onto the screen, in seconds. + /// + [DataField, AutoNetworkedField] + public float SlideTime = 3f; + + /// + /// The time between waddle animation steps, in seconds. + /// + [DataField, AutoNetworkedField] + public float WaddleInterval = 0.5f; +} diff --git a/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs new file mode 100644 index 0000000000..10c55490af --- /dev/null +++ b/Content.Shared/Trigger/Systems/TippyOnTriggerSystem.cs @@ -0,0 +1,49 @@ +using Content.Shared.Tips; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Player; + +namespace Content.Shared.Trigger.Systems; + +public sealed class TippyOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedTipsSystem _tips = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + var msg = ent.Comp.Message; + var prototype = ent.Comp.Prototype; + + if (ent.Comp.LocMessage != null) + msg = Loc.GetString(ent.Comp.LocMessage.Value); + + if (ent.Comp.UseOwnerPrototype) + prototype = Prototype(ent)?.ID; + + var speakTime = ent.Comp.SpeakTime ?? _tips.GetSpeechTime(msg); + + if (ent.Comp.SendToAll) + { + _tips.SendTippy(msg, prototype, speakTime, ent.Comp.SlideTime, ent.Comp.WaddleInterval); + } + else + { + var target = ent.Comp.TargetUser ? args.User : ent.Owner; + if (!TryComp(target, out var actor)) + return; + + _tips.SendTippy(actor.PlayerSession, msg, prototype, speakTime, ent.Comp.SlideTime, ent.Comp.WaddleInterval); + } + + args.Handled = true; + } +} diff --git a/Resources/Locale/en-US/commands/tippy-command.ftl b/Resources/Locale/en-US/commands/tippy-command.ftl index 6b9a95a1dd..f814506009 100644 --- a/Resources/Locale/en-US/commands/tippy-command.ftl +++ b/Resources/Locale/en-US/commands/tippy-command.ftl @@ -1,5 +1,5 @@ cmd-tippy-desc = Broadcast a message as Tippy the clown. -cmd-tippy-help = tippy [entity prototype] [speak time] [slide time] [waddle interval] +cmd-tippy-help = tippy [entity prototype | null] [speak time] [slide time] [waddle interval] cmd-tippy-auto-1 = cmd-tippy-auto-2 = message cmd-tippy-auto-3 = entity prototype diff --git a/Resources/engineCommandPerms.yml b/Resources/engineCommandPerms.yml index 194d05d13d..4520a1da2d 100644 --- a/Resources/engineCommandPerms.yml +++ b/Resources/engineCommandPerms.yml @@ -96,11 +96,6 @@ Commands: - listplayers -- Flags: FUN - Commands: - - tippy - - tip - - Flags: SERVER Commands: - delete From 414817e38a78d4b47334460a82a53e29d4579685 Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Wed, 19 Nov 2025 02:58:50 +0100 Subject: [PATCH 084/100] AddTagOnTrigger, RemoveTagOnTrigger, SwapPositionOnTrigger, JitterOnTrigger (#41476) * more triggers * comment --------- Co-authored-by: iaada --- .../Effects/AddTagsOnTriggerComponent.cs | 20 ++++++++ .../Effects/JitterOnTriggerComponent.cs | 47 +++++++++++++++++++ .../Effects/RemoveTagsOnTriggerComponent.cs | 20 ++++++++ .../Effects/SwapLocationOnTriggerComponent.cs | 10 ++++ .../Trigger/Systems/JitterOnTriggerSystem.cs | 20 ++++++++ .../Systems/SwapLocationOnTriggerSystem.cs | 30 ++++++++++++ .../Trigger/Systems/TagOnTriggerSystem.cs | 26 ++++++++++ 7 files changed, 173 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs new file mode 100644 index 0000000000..9e73a60741 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/AddTagsOnTriggerComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Tag; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Adds the given tags when triggered. +/// If TargetUser is true the tags will be added to the user instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class AddTagsOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The tags to add. + /// + [DataField, AutoNetworkedField] + public List> Tags = new(); +} + diff --git a/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs new file mode 100644 index 0000000000..340ad6cb01 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/JitterOnTriggerComponent.cs @@ -0,0 +1,47 @@ +using Content.Shared.StatusEffect; +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Makes the entity play a jitter animation when triggered. +/// If TargetUser is true the user will jitter instead. +/// +/// +/// The target requires . +/// TODO: Convert jitter to the new status effects system. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class JitterOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Jitteriness of the animation. + /// + [DataField, AutoNetworkedField] + public float Amplitude = 10.0f; + + /// + /// Frequency for jittering. + /// + [DataField, AutoNetworkedField] + public float Frequency = 4.0f; + + /// + /// For how much time to apply the effect. + /// + [DataField, AutoNetworkedField] + public TimeSpan Time = TimeSpan.FromSeconds(2); + + /// + /// The status effect cooldown should be refreshed (true) or accumulated (false). + /// + [DataField, AutoNetworkedField] + public bool Refresh; + + /// + /// Whether to change any existing jitter value even if they're greater than the ones we're setting. + /// + [DataField, AutoNetworkedField] + public bool ForceValueChange; +} + diff --git a/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs new file mode 100644 index 0000000000..8e4d0e4611 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/RemoveTagsOnTriggerComponent.cs @@ -0,0 +1,20 @@ +using Content.Shared.Tag; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Remove the given tags when triggered. +/// If TargetUser is true the tags will be added to the user instead. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class RemoveTagsOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The tags to remove. + /// + [DataField, AutoNetworkedField] + public List> Tags = new(); +} + diff --git a/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs new file mode 100644 index 0000000000..33cec1d56d --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/SwapLocationOnTriggerComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Swaps the location of the target and the user of the trigger when triggered. +/// is ignored. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class SwapLocationOnTriggerComponent : BaseXOnTriggerComponent; diff --git a/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs new file mode 100644 index 0000000000..5a9e0463ed --- /dev/null +++ b/Content.Shared/Trigger/Systems/JitterOnTriggerSystem.cs @@ -0,0 +1,20 @@ +using Content.Shared.Jittering; +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Network; + +namespace Content.Shared.Trigger.Systems; + +public sealed class JitterOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedJitteringSystem _jittering = default!; + [Dependency] private readonly INetManager _net = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + // DoJitter mispredicts at the moment. + // TODO: Fix this and remove the IsServer check. + if (_net.IsServer) + _jittering.DoJitter(target, ent.Comp.Time, ent.Comp.Refresh, ent.Comp.Amplitude, ent.Comp.Frequency, ent.Comp.ForceValueChange); + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs new file mode 100644 index 0000000000..7b3004ad59 --- /dev/null +++ b/Content.Shared/Trigger/Systems/SwapLocationOnTriggerSystem.cs @@ -0,0 +1,30 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Network; + +namespace Content.Shared.Trigger.Systems; + +public sealed class SwapLocationOnTriggerSystem : EntitySystem +{ + [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly INetManager _net = default!; + + public override void Initialize() + { + SubscribeLocalEvent(OnTrigger); + } + + private void OnTrigger(Entity ent, ref TriggerEvent args) + { + if (args.Key != null && !ent.Comp.KeysIn.Contains(args.Key)) + return; + + if (args.User == null) + return; + + // SwapPositions mispredicts at the moment. + // TODO: Fix this and remove the IsServer check. + if (_net.IsServer) + _transform.SwapPositions(ent.Owner, args.User.Value); + args.Handled = true; + } +} diff --git a/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs new file mode 100644 index 0000000000..d636593d43 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TagOnTriggerSystem.cs @@ -0,0 +1,26 @@ +using Content.Shared.Tag; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class AddTagsOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TagSystem _tag = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _tag.AddTags(target, ent.Comp.Tags); + args.Handled = true; + } +} + +public sealed class RemoveTagsOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly TagSystem _tag = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _tag.RemoveTags(target, ent.Comp.Tags); + args.Handled = true; + } +} From 78101bceac50a6db103e08fba4a44dd65a726fb7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Tue, 18 Nov 2025 20:05:13 -0600 Subject: [PATCH 085/100] 5 new triggers: EmptyContainers, Knockdown, Stun, TriggerOnThrowDoHit (#41472) * ideas * finish components * systems * one more * requested --------- Co-authored-by: iaada --- .../CleanContainersOnTriggerComponent.cs | 22 +++++ .../EmptyContainersOnTriggerComponent.cs | 22 +++++ .../Effects/KnockdownOnTriggerComponent.cs | 36 +++++++++ .../Effects/StunOnTriggerComponent.cs | 24 ++++++ .../Triggers/TriggerOnThrowDoHitComponent.cs | 10 +++ .../Systems/EmptyContainersOnTriggerSystem.cs | 81 +++++++++++++++++++ .../Systems/KnockdownOnTriggerSystem.cs | 21 +++++ .../Trigger/Systems/StunOnTriggerSystem.cs | 17 ++++ .../Systems/TriggerOnThrowDoHitSystem.cs | 19 +++++ 9 files changed, 252 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs create mode 100644 Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs create mode 100644 Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs new file mode 100644 index 0000000000..bf4e1841b1 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/CleanContainersOnTriggerComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for removing and *deleting* all items in container(s) on the target. +/// +/// +/// Be very careful when setting to true or all your organs might fall out. +/// In fact, never set it to true. +/// +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class CleanContainersOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Names of containers to empty. + /// If null, all containers will be emptied. + /// + [DataField, AutoNetworkedField] + public List? Container; +} diff --git a/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs new file mode 100644 index 0000000000..de55e1f3ac --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/EmptyContainersOnTriggerComponent.cs @@ -0,0 +1,22 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for removing all items in container(s) on the target. +/// +/// +/// Be very careful when setting to true or all your organs might fall out. +/// In fact, never set it to true. +/// +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class EmptyContainersOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// Names of containers to empty. + /// If null, all containers will be emptied. + /// + [DataField, AutoNetworkedField] + public List? Container; +} diff --git a/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs new file mode 100644 index 0000000000..33809130c2 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/KnockdownOnTriggerComponent.cs @@ -0,0 +1,36 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for sending the target sidewise (crawling). +/// Knockdowns the user if is true. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class KnockdownOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// How long the target is forced to be on the ground. + /// + [DataField, AutoNetworkedField] + public TimeSpan KnockdownAmount = TimeSpan.FromSeconds(1); + + /// + /// If true, refresh the duration. + /// If false, time is added on-top of any existing forced knockdown. + /// + [DataField, AutoNetworkedField] + public bool Refresh = true; + + /// + /// Should the entity try and stand automatically? + /// + [DataField, AutoNetworkedField] + public bool AutoStand = true; + + /// + /// Should the entity drop their items upon first being knocked down? + /// + [DataField, AutoNetworkedField] + public bool Drop = true; +} diff --git a/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs new file mode 100644 index 0000000000..ebe55dc102 --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/StunOnTriggerComponent.cs @@ -0,0 +1,24 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// Trigger effect for stunning an entity. +/// Stuns the user if is true. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class StunOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// How long to stun the target. + /// + [DataField, AutoNetworkedField] + public TimeSpan StunAmount = TimeSpan.FromSeconds(1); + + /// + /// If true, refresh the stun duration. + /// If false, stun is added on-top of any existing stun. + /// + [DataField, AutoNetworkedField] + public bool Refresh = true; +} diff --git a/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs b/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs new file mode 100644 index 0000000000..4e832993b5 --- /dev/null +++ b/Content.Shared/Trigger/Components/Triggers/TriggerOnThrowDoHitComponent.cs @@ -0,0 +1,10 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Trigger.Components.Triggers; + +/// +/// Trigger for when this entity is thrown and then hits a second entity. +/// User is the entity hit. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class TriggerOnThrowDoHitComponent : BaseTriggerOnXComponent; diff --git a/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs new file mode 100644 index 0000000000..dbe1601022 --- /dev/null +++ b/Content.Shared/Trigger/Systems/EmptyContainersOnTriggerSystem.cs @@ -0,0 +1,81 @@ +using Content.Shared.Trigger.Components.Effects; +using Robust.Shared.Containers; + +namespace Content.Shared.Trigger.Systems; + +/// +/// Empty containers trigger system. +/// +public sealed class EmptyContainersOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedContainerSystem _container = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(target, out var containerComp)) + return; + + // Empty everything. Make sure a player isn't the target because they will get removed from their body along with their organs + if (ent.Comp.Container is null) + { + foreach (var container in _container.GetAllContainers(target, containerComp)) + { + _container.EmptyContainer(container); + } + + args.Handled = true; + } + + // Empty containers in a sane way + else + { + foreach (var containerId in ent.Comp.Container) + { + if (!_container.TryGetContainer(target, containerId, out var container, containerComp)) + continue; + + _container.EmptyContainer(container); + args.Handled = true; + } + } + } +} + +/// +/// Empty containers and delete items trigger system. +/// +public sealed class CleanContainersOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedContainerSystem _container = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (!TryComp(target, out var containerComp)) + return; + + // Empty everything. Make sure a player isn't the target because they will get DELETED + if (ent.Comp.Container is null) + { + foreach (var container in _container.GetAllContainers(target, containerComp)) + { + _container.CleanContainer(container); + } + + args.Handled = true; + } + + // Empty containers in a sane way + else + { + foreach (var containerId in ent.Comp.Container) + { + if (!_container.TryGetContainer(target, containerId, out var container, containerComp)) + continue; + + _container.CleanContainer(container); + args.Handled = true; + } + } + } +} + diff --git a/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs new file mode 100644 index 0000000000..815e00abc8 --- /dev/null +++ b/Content.Shared/Trigger/Systems/KnockdownOnTriggerSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Stunnable; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class KnockdownOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedStunSystem _stun = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + args.Handled |= _stun.TryKnockdown( + target, + ent.Comp.KnockdownAmount, + ent.Comp.Refresh, + ent.Comp.AutoStand, + ent.Comp.Drop, + true + ); + } +} diff --git a/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs new file mode 100644 index 0000000000..ce86f971d3 --- /dev/null +++ b/Content.Shared/Trigger/Systems/StunOnTriggerSystem.cs @@ -0,0 +1,17 @@ +using Content.Shared.Stunnable; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class StunOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly SharedStunSystem _stun = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + if (ent.Comp.Refresh) + args.Handled |= _stun.TryUpdateStunDuration(target, ent.Comp.StunAmount); + else + args.Handled |= _stun.TryAddStunDuration(target, ent.Comp.StunAmount); + } +} diff --git a/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs b/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs new file mode 100644 index 0000000000..ca57b517c6 --- /dev/null +++ b/Content.Shared/Trigger/Systems/TriggerOnThrowDoHitSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Throwing; +using Content.Shared.Trigger.Components.Triggers; + +namespace Content.Shared.Trigger.Systems; + +public sealed partial class TriggerOnThrowDoHitSystem : TriggerOnXSystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnHit); + } + + private void OnHit(Entity ent, ref ThrowDoHitEvent args) + { + Trigger.Trigger(ent.Owner, args.Target, ent.Comp.KeyOut); + } +} From 224f0fd5073093662e0b3abf31493c621cf9c78a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C4=81da?= Date: Tue, 18 Nov 2025 20:08:04 -0600 Subject: [PATCH 086/100] AdminLogOnTrigger (#41474) * commit * requested * also requested * Update Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs --------- Co-authored-by: iaada Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../Effects/AdminLogOnTriggerComponent.cs | 34 +++++++++++++++++++ .../Systems/AdminLogOnTriggerSystem.cs | 19 +++++++++++ 2 files changed, 53 insertions(+) create mode 100644 Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs create mode 100644 Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs diff --git a/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs b/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs new file mode 100644 index 0000000000..4045f8c12e --- /dev/null +++ b/Content.Shared/Trigger/Components/Effects/AdminLogOnTriggerComponent.cs @@ -0,0 +1,34 @@ +using Content.Shared.Database; +using Content.Shared.Random; +using Content.Shared.Trigger.Components.Triggers; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Trigger.Components.Effects; + +/// +/// This component creates an admin log when receiving a trigger. +/// is ignored. +/// +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +public sealed partial class AdminLogOnTriggerComponent : BaseXOnTriggerComponent +{ + /// + /// The message displayed in the logs describing what specifically was done by this trigger. + /// This entity and the user will be included alongside the message. + /// + [DataField(required: true), AutoNetworkedField] + public LocId Message = string.Empty; + + /// + /// What type of action took place? + /// + [DataField, AutoNetworkedField] + public LogType LogType = LogType.Trigger; + + /// + /// How important is this trigger? + /// + [DataField, AutoNetworkedField] + public LogImpact LogImpact = LogImpact.Low; +} diff --git a/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs b/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs new file mode 100644 index 0000000000..0adf483aed --- /dev/null +++ b/Content.Shared/Trigger/Systems/AdminLogOnTriggerSystem.cs @@ -0,0 +1,19 @@ +using Content.Shared.Administration.Logs; +using Content.Shared.Trigger.Components.Effects; + +namespace Content.Shared.Trigger.Systems; + +public sealed class AdminLogOnTriggerSystem : XOnTriggerSystem +{ + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + + protected override void OnTrigger(Entity ent, EntityUid target, ref TriggerEvent args) + { + _adminLogger.Add( + ent.Comp.LogType, + ent.Comp.LogImpact, + $"{ToPrettyString(args.User)} sent a trigger using {ToPrettyString(ent)}: {Loc.GetString(ent.Comp.Message)}" + ); + // Intentionally does not handle the event since this shouldn't affect the gamestate. + } +} From be68bb6c0c22c14f4182e2a78076a0530141f8da Mon Sep 17 00:00:00 2001 From: Hitlinemoss <209321380+Hitlinemoss@users.noreply.github.com> Date: Tue, 18 Nov 2025 21:46:44 -0500 Subject: [PATCH 087/100] Removed redundant clothing from CMO locker; moved neck gaiter from HoS locker to HoS dresser (#41487) --- Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml | 1 + Resources/Prototypes/Catalog/Fills/Lockers/heads.yml | 3 --- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml index e111b51cff..34dafcba20 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/dressers.yml @@ -63,6 +63,7 @@ contents: - id: ClothingHeadHatBeretHoS - id: ClothingHeadHatHoshat + - id: ClothingMaskNeckGaiter - id: ClothingUniformJumpskirtHoSAlt - id: ClothingUniformJumpsuitHoSAlt - id: ClothingUniformJumpskirtHosFormal diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml index 27ddea1b11..57da744690 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/heads.yml @@ -205,10 +205,8 @@ children: - id: BoxEncryptionKeyMedical - id: ClothingBackpackDuffelSurgeryFilled - - id: ClothingCloakCmo - id: ClothingEyesHudMedical - id: ClothingHandsGlovesNitrile - - id: ClothingHeadHatBeretCmo - id: ClothingHeadsetAltMedical - id: ClothingMaskSterile - id: DoorRemoteMedical @@ -316,7 +314,6 @@ - id: ClothingBeltSecurityFilled - id: ClothingEyesGlassesSecurity - id: ClothingHeadsetAltSecurity - - id: ClothingMaskNeckGaiter - id: ClothingOuterCoatHoSTrench - id: ClothingShoesBootsJack - id: FlashlightSeclite From 3d46894cb4d2516b2fab1581ab903005ce0cd05f Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 19 Nov 2025 02:59:43 +0000 Subject: [PATCH 088/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index af727fc992..024e0c6d5a 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: PJB3005 - changes: - - message: Fixed various worn clothing items being invisible when seen through UI, - such as the examine popups. - type: Fix - id: 8711 - time: '2025-06-24T20:47:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38042 - author: AreYouConfused changes: - message: Bulldog bundle now accurately says what is included @@ -3924,3 +3916,12 @@ id: 9211 time: '2025-11-17T18:07:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41461 +- author: Hitlinemoss + changes: + - message: The CMO's locker no longer contains a duplicate beret/cloak. + type: Fix + - message: The neck gaiter in the HoS's locker has been moved to their dresser. + type: Fix + id: 9212 + time: '2025-11-19T02:58:33.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41487 From 00ba4595a89f9ef84d7c0687dbaf79fbb1279aa5 Mon Sep 17 00:00:00 2001 From: Tiniest Shark Date: Wed, 19 Nov 2025 03:40:38 -0500 Subject: [PATCH 089/100] Remove Basic Hardsuit Helmet Sprites (#41490) * Deletes basic helmet * you forgot one file --------- Co-authored-by: slarticodefast <161409025+slarticodefast@users.noreply.github.com> --- .../basic.rsi/equipped-HELMET-dog.png | Bin 3724 -> 0 bytes .../basic.rsi/equipped-HELMET-vulpkanin.png | Bin 1256 -> 0 bytes .../Hardsuits/basic.rsi/equipped-HELMET.png | Bin 1292 -> 0 bytes .../Head/Hardsuits/basic.rsi/icon.png | Bin 950 -> 0 bytes .../Head/Hardsuits/basic.rsi/inhand-left.png | Bin 1070 -> 0 bytes .../Head/Hardsuits/basic.rsi/inhand-right.png | Bin 1076 -> 0 bytes .../Head/Hardsuits/basic.rsi/meta.json | 34 ------------------ 7 files changed, 34 deletions(-) delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-vulpkanin.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/icon.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-right.png delete mode 100644 Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-dog.png deleted file mode 100644 index 744a9a58549ef73f54568fbafd21f805c6c4356b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3724 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 diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-vulpkanin.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/equipped-HELMET-vulpkanin.png deleted file mode 100644 index a00e2ce75f29cbea03515e744c313fad631b90ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1256 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hE#YEvRQ-Z^Cz zz1nE|)~Z5qZ>I?Xd8Jb?7JfM+>HI8i@s`Tx;bD63WpCC; zM@!Vc|K|NwpS3~c*<6{c`;N1VFFEx;aes{a|9y;qW}M!5tw5XS@PP?uZ$y}Hm{-Hk zd`*8xq5PiOV21_gdwcrKY`E^+tlzS^`HQdGqPGXPX6`9`w`#}#7vHmASX2hp_^EN# zFc-|#x7X{=E~;Ad%BJ(y?OV5xJa4*i@1FeD;_c_nZJ&P(U-fuG57T{ynCI^KdwLh% z`^&5tSe^G~UV}hO#;MG2Z}*>FH^Mvyv=}ysli|5_UsW(Bb&Pd%}xyGc!3KKYkpPR?DpLSoqY?a0}^|QqP*mLJRZ%(?$8dI5mZ}rKOCmpsq-ukuarjGJ+ z{w{?#@4{}yzpi5ck$HG~?0tr?u&|y8onycJ=C?)iT9<#z43Ibb-@0IGeDvWnulY9~ zzTVW_<)W04mF1*1ne&}(gMv$3uR%yW>z=>>9m_{{Ojj1=N`G`|x;RO~R#cSR_;Ggg zV~a=o)_hiZ>3$$?LvPBe$&sy@f~+RLPflCCVc$09(toc1xtW|+h6q_V@3y#AR{Qt* zRznV#?L4%ry6VH9o5qE@(eoAL8Snfo*s(Q? z+kv?vQeZ{C)uhi~uc@C1?RZkuGspbL`7Ay4TX}n@y8U{_YB)jvo_QZ@OSJq4iK|b1 zIDahLyYCmvNsb2>&;QR8{ig2Vy4ImQHNnxjV6Od)*>85&G0mR;rpsqy&l3iNqJMJF zo7&!!*NJ=$SR zGqA9T&6kUZnbS&)C@5M;6xBr+@wa8`|Z`xIm;tX<~xkNkM^4H+7aRTlV2| z@SA1@wi^db8{|~W8AZ0OKDRtdOSPz{zxCJ=am|UA^JdKWuvgS$KZkBWot>Qc&!7En zZUH)C6MN1b{Pnp>LV~x;zMc0zD@TUb)TC#ZGYjYD%yYi@P@f?wd)Yf4pE@Z=#;67#i!a_)=I+hw_|`Qk{9t_a?AekRN~-_#HMewpe6U0Q{X5%t_ZXel9x+*+%X6XRwvXzg zB(>d2ZE=Eb{7x?pFF2!<95!jv2if@V93Q^w9ozip{9nsmSLPgTXz;K(%yU^SPJQ03 zExhM`9}x_j68fn4QQ%}fk3T0$k3Kd($2y&Lo}}UBm6ne>a)-9%C6n}w|d#d`}{V>MHByQ_>jrKz`&N|?e4LV0FMhJw4NZ$Nk>pEv^p(-Th@$B>F!Z)a`HzU?4#%zoyZlfDO? z6Gs15Jpc~1_-)g_@9d9#Dw~)M_;+eADE*w6^o)_=`tuB3elOn`%~k`Rg;Qo_D-`KR&3isG zYirl}{om!-QY#sjhP-24!7=ao%#Rg43LKXr<`i$OD@X8y?tn+B0ZeS2mF0lVvFP7uC({aD`j{w~|3ulV%Yy=3+b!$lfQ3@TAg3I%?Cep*qlZ@awSAEBj`;$?luM2h#r3t^^i;r-vf zu8k~~+3=O^+_`fCERBaP=U>>gdv~>Z%LZi!4#VQclfPJV4q2{0)1}%{&?4Z*;aJDo kq`-kdGY&5L&HRsn=}lwT8khf$3=9kmp00i_>zopr0LI@;D*ylh diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/icon.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/icon.png deleted file mode 100644 index 5751b4bea27512d1efe87a6b21c86a1d5ebd41aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 950 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANNfEt$^F0iMpz3I#>^X_+~x z3=A3*YbV-z9Cna78Xvq>NtD&P!y+YPu1-gnMV4q+fZ`RdwN^7?ekqz{dIZJDuwHL! zmhTQ_7f+9sjbU~CzpIqs1ko3`S1BZnY~%}k{ldV<|Vde3a=OT&%MR= zy!H`?_DQXemLFGmimTK;+4bn7^z%ihna=mjnE6Gfuq8rg+r~@B)}&+|nS3NL^s;9B ziK;b4_a3d8x_V8e|Gz^8aq)4Ftj;E?Y;17#5LmdNi+4(*vfpaIu2z$`>NS6y*TpMM zcUs45P;_Q76Yr+i?EjnZ-;HYREY#PW!(bIJ^IVy&rL58IY~j9s+2w^yEb|++_dZ>J zrSYZzrEFc@DwZ#~%;MK|eQz@Bl{XwzcQ#86=ei`q#roiH&pu6do;ysotK;&|*3PkG zkbI?8$}A(pr0jYs?sH{%d3FB(d70n7Gv^5xEiJF8t!H3hU`z6LcVYMsf(!O8pUl9( zz**oCS7Bb9pY6oKl0b=#*&No5^|gt zJjvDnss2Ac?%rsyx8p8q0 z@MW1Z^5}xMTR-Wu9{b+mKS?vs&(8leCq!^$jjpO zzA)=!OJ=BT(czvFWbs+8pt3!0HX}pYBlpXR4V!N?_UfxWm?M9c|K_m|xBvXBx^L6g zd9dg$h%(Hs(O{&|1Q>dIifk}oGD zQLor=^~;jI4JnpWcCA}2k-T8aqo<$C-rswC)q2U4nfvUF85nrlomm;yhH<}~TDUWY ziNS5LpynDTs|gmHr2b1Tuo4Vq5IwM;@duOXjg61yh)hdiU|?YIboFyt=akR{0QcyU A@&Et; diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/inhand-left.png deleted file mode 100644 index a3df7c62558abd76e25a7f0f52f77f9472d1fc81..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1070 zcmeAS@N?(olHy`uVBq!ia0y~yU~m9o4mJh`hEa_)=I+hw_|`Qk{9t_a?AekRN~-_#HMewpe6U0Q{X5%t_ZXel9x+*+%X6XRwvXzg zB(>d2ZE=Eb{7x?pFF2!<95!jv2if@V93Q^w9ozip{9nsmSLPgTXz;K(%yU^SPJQ03 zExhM`9}x_j68fn4QQ%}fk3T0$k3Kd($2y&Lo}}UBm6ne>a)-9%C6n}w|d#d`}{V>MHByQ_>jrKz`&N|?e4xZ6U!^j>gjbH*&lB0n!#ta zX|A`FOZz2hFH7k5iSgw5F49)b^}M)svNoquQ_v}W?|YW* zI;X`RMNT_t*>2G{doK&agD)KlU2ehu*G54jXbBD_@eE4bGSKj`A%8spK$0Q=M!>t6i{@>%F zSu5gN@%8VE>kHoSC9Yk&rO{LKZ;92>3=^$;+ASXvC9dsbT=&M#f#ad|T)&O;)F+>G za*8fgR%y{F`?E~#JS;>&!IE=(&Dr}`GiR|eJbM};Tgv>}gdr|_ufXbGC;sM_&6>9( z=sdH+jOmm8C$a2}%dehx;9>Urt*midekmxacs6NtG29XHw@DG(GHc$S)8*zT&+m(z z6Zg(JJ2vL;pPP@Jz0#%Z84maFKmIOkLe3YtfE{ZM6&5KynX~%OjoMuH2baILyKjDd zvVYHkBpW$qhC>EN?pihV#xV8YxB2|&G;7C-nDh%;va|g;E^1wuHaHd$TgRljmz(X~ To&XgF1_lOCS3j3^P6a_)=I+hw_|`Qk{9t_a?AekRN~-_#HMewpe6U0Q{X5%t_ZXel9x+*+%X6XRwvXzg zB(>d2ZE=Eb{7x?pFF2!<95!jv2if@V93Q^w9ozip{9nsmSLPgTXz;K(%yU^SPJQ03 zExhM`9}x_j68fn4QQ%}fk3T0$k3Kd($2y&Lo}}UBm6ne>a)-9%C6n}w|d#d`}{V>MHByQ_>jrKz`&N|?e4-^AappJMx9j&$`#0j9FkVPVrBbl=K&Ldn*xW=)#mF_ z%6*UbelC=8&gQ*d%5TraQ1I`w^1c19AAaFg2zmDBs^`=8eN%*b3^UeV7EJgqnLHur z*}6>owG8})=k|;KcZf}~elXz<$BcWmw|0MKXqfHoV;#7bDcsA^i*xCfgMBA_v*r|E ze*N{s({Eok23rYE3EIiIq|4&Dny1j3>#w)0-S>WW-uCDl{|+_O+&AxgyyX1lyzRGF zZ&+n>{&3muzwe7G=54>uS*ER}4h|F;@#?wjzOVMa^KaMuiQj+Nd?9m=l~uNZ#Fezb zqZhqH7HvJ2wbiS?RbZa`UkKKU>x(qtAteGsHAA5F}F~LU8nWORZ zYT-M7g9NyC{Kz}Ax`Kt_Nmwd_!{l_lamY5k?=F6zq5^^*D Ygr`9E;b^_z3=9kmp00i_>zopr01L_SIsgCw diff --git a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json b/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json deleted file mode 100644 index bc5b39e8b1..0000000000 --- a/Resources/Textures/Clothing/Head/Hardsuits/basic.rsi/meta.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "version": 1, - "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/40d89d11ea4a5cb81d61dc1018b46f4e7d32c62a. equipped-HELMET-dog modified from equipped-HELMET by Sparlight (GitHub), vulpkanin version taken from Paradise station at https://github.com/ParadiseSS13/Paradise/commit/f0fa4e1fd809482fbc104a310aa34cebf7df157d", - "size": { - "x": 32, - "y": 32 - }, - "states": [ - { - "name": "icon" - }, - { - "name": "equipped-HELMET", - "directions": 4 - }, - { - "name": "equipped-HELMET-dog", - "directions": 4 - }, - { - "name": "equipped-HELMET-vulpkanin", - "directions": 4 - }, - { - "name": "inhand-left", - "directions": 4 - }, - { - "name": "inhand-right", - "directions": 4 - } - ] -} From de947988fe5715e6567d97d082ac4de674b3c16d Mon Sep 17 00:00:00 2001 From: Samuka <47865393+Samuka-C@users.noreply.github.com> Date: Wed, 19 Nov 2025 05:56:43 -0300 Subject: [PATCH 090/100] Fix the round end trigger for xenoborgs (#41467) math --- Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs index 21b987eb0e..94b6315a6b 100644 --- a/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/XenoborgsRuleSystem.cs @@ -93,7 +93,7 @@ public sealed class XenoborgsRuleSystem : GameRuleSystem var numXenoborgs = GetNumberXenoborgs(); var numHumans = _mindSystem.GetAliveHumans().Count; - if ((float)numXenoborgs / numHumans > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) + if ((float)numXenoborgs / (numHumans + numXenoborgs) > xenoborgsRuleComponent.XenoborgShuttleCallPercentage) { foreach (var station in _station.GetStations()) { From 922e397f34fe150b944ce2d1ef324179db83cff7 Mon Sep 17 00:00:00 2001 From: korczoczek Date: Wed, 19 Nov 2025 21:34:54 +0100 Subject: [PATCH 091/100] Fix blinking animation of disembodied head hologram (#41498) start blinking normal --- Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json b/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json index 8eaf9165d3..7856060d0f 100644 --- a/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json +++ b/Resources/Textures/Mobs/Silicon/holograms.rsi/meta.json @@ -17,8 +17,8 @@ "name": "ai_face", "delays": [ [ - 2.3, - 0.2 + 0.2, + 2.3 ] ] }, From 905fc6a78395feb3fa70c1a011f7cea2d3ab9d94 Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 19 Nov 2025 21:44:36 +0100 Subject: [PATCH 092/100] cleanup evil beach ball (#41499) --- Resources/Prototypes/Entities/Objects/Fun/toys.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Objects/Fun/toys.yml b/Resources/Prototypes/Entities/Objects/Fun/toys.yml index dffd08e919..0d1e7ba019 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/toys.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/toys.yml @@ -533,7 +533,6 @@ parent: BeachBall id: EvilBeachBall suffix: evil - name: beach ball description: Someone's drawn ">:3c" on the side of this beach ball in indelible ink. components: - type: LaunchOnTrigger From dd1ba4cd95dba86d698c004721d64c6d4a426029 Mon Sep 17 00:00:00 2001 From: korczoczek Date: Wed, 19 Nov 2025 23:03:09 +0100 Subject: [PATCH 093/100] Make the crimson evac shuttle's air chamber not borderline blow up (#41500) glass and plasma together strong --- Resources/Maps/Shuttles/emergency_crimson.yml | 5332 +++++++++-------- 1 file changed, 2677 insertions(+), 2655 deletions(-) diff --git a/Resources/Maps/Shuttles/emergency_crimson.yml b/Resources/Maps/Shuttles/emergency_crimson.yml index 65cb03aa2e..fa2d03c8da 100644 --- a/Resources/Maps/Shuttles/emergency_crimson.yml +++ b/Resources/Maps/Shuttles/emergency_crimson.yml @@ -1,16 +1,16 @@ meta: format: 7 category: Grid - engineVersion: 261.2.0 + engineVersion: 268.0.0 forkId: "" forkVersion: "" - time: 06/06/2025 23:33:47 + time: 11/19/2025 20:58:28 entityCount: 491 maps: [] grids: -- 410 +- 1 orphans: -- 410 +- 1 nullspace: [] tilemap: 0: Space @@ -27,7 +27,7 @@ tilemap: entities: - proto: "" entities: - - uid: 410 + - uid: 1 components: - type: MetaData name: NT Evac Crimson @@ -521,48 +521,16 @@ entities: - volume: 2500 temperature: 293.15 moles: - - 21.824879 - - 82.10312 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 21.824879 + Nitrogen: 82.10312 - volume: 2500 immutable: True - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + moles: {} - volume: 2500 temperature: 293.15 moles: - - 1400.0662 - - 5266.916 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 + Oxygen: 1400.0662 + Nitrogen: 5266.916 chunkSize: 4 - type: OccluderTree - type: Shuttle @@ -577,1369 +545,1405 @@ entities: - type: ImplicitRoof - proto: AirAlarm entities: - - uid: 12 + - uid: 2 components: - type: Transform rot: 3.141592653589793 rad pos: -3.5,-1.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 244 - - 285 - - 312 - - 486 - - 148 - - 213 - - 488 - - 347 - - 219 - - uid: 180 + - 303 + - 24 + - 307 + - 221 + - 216 + - 217 + - 223 + - 308 + - 302 + - type: Fixtures + fixtures: {} + - uid: 3 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,4.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 483 - - 193 - - 479 - - 482 - - 485 - - uid: 305 + - 219 + - 301 + - 28 + - 311 + - 220 + - type: Fixtures + fixtures: {} + - uid: 4 components: - type: Transform rot: 1.5707963267948966 rad pos: -0.5,9.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 420 - - 418 - - 357 - - uid: 389 + - 310 + - 26 + - 305 + - type: Fixtures + fixtures: {} + - uid: 5 components: - type: Transform rot: -1.5707963267948966 rad pos: -4.5,0.5 - parent: 410 + parent: 1 - type: DeviceList devices: - - 245 - - 416 - - 406 - - 487 - - 321 - - uid: 434 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,9.5 - parent: 410 - - type: DeviceList - devices: - - 382 - - 435 -- proto: AirCanister - entities: - - uid: 119 - components: - - type: Transform - pos: -1.5,-4.5 - parent: 410 -- proto: AirlockCommandGlassLocked - entities: - - uid: 76 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 -- proto: AirlockEngineeringLocked - entities: - - uid: 52 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 -- proto: AirlockGlass - entities: - - uid: 426 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 427 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 428 - components: - - type: Transform - pos: -0.5,5.5 - parent: 410 - - uid: 429 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 -- proto: AirlockGlassShuttle - entities: - - uid: 4 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,7.5 - parent: 410 + - 304 + - 25 + - 309 + - 222 + - 218 + - type: Fixtures + fixtures: {} - uid: 6 components: - type: Transform rot: -1.5707963267948966 rad - pos: -7.5,5.5 - parent: 410 + pos: -4.5,9.5 + parent: 1 + - type: DeviceList + devices: + - 306 + - 27 + - type: Fixtures + fixtures: {} +- proto: AirCanister + entities: + - uid: 7 + components: + - type: Transform + pos: -1.5,-4.5 + parent: 1 +- proto: AirlockCommandGlassLocked + entities: + - uid: 8 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 +- proto: AirlockEngineeringLocked + entities: + - uid: 9 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 +- proto: AirlockGlass + entities: + - uid: 10 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 11 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 12 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 13 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 +- proto: AirlockGlassShuttle + entities: - uid: 14 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-2.5 - parent: 410 - - uid: 47 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-0.5 - parent: 410 - - uid: 99 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-0.5 - parent: 410 - - uid: 100 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-2.5 - parent: 410 - - uid: 145 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,7.5 - parent: 410 - - uid: 152 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,5.5 - parent: 410 -- proto: AirlockMedicalGlassLocked - entities: - - uid: 132 - components: - - type: Transform - pos: 0.5,8.5 - parent: 410 -- proto: AirlockSecurityGlassLocked - entities: - - uid: 442 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,6.5 - parent: 410 -- proto: AirSensor - entities: - - uid: 285 - components: - - type: Transform - pos: -2.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 - - uid: 416 - components: - - type: Transform - pos: -6.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 389 - - uid: 418 - components: - - type: Transform - pos: 0.5,10.5 - parent: 410 - - uid: 435 - components: - - type: Transform - pos: -4.5,11.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 434 - - uid: 479 - components: - - type: Transform - pos: 1.5,2.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 180 -- proto: APCHyperCapacity - entities: - - uid: 475 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,6.5 - parent: 410 - - uid: 476 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-1.5 - parent: 410 -- proto: Ashtray - entities: - - uid: 130 - components: - - type: Transform - pos: -6.411743,10.477377 - parent: 410 -- proto: AtmosDeviceFanDirectional - entities: - - uid: 395 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,7.5 - parent: 410 - - uid: 396 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,-0.5 - parent: 410 - - uid: 397 + parent: 1 + - uid: 15 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,5.5 - parent: 410 - - uid: 398 + parent: 1 + - uid: 16 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-2.5 - parent: 410 - - uid: 399 + parent: 1 + - uid: 17 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 2.5,-2.5 - parent: 410 - - uid: 400 + rot: -1.5707963267948966 rad + pos: -7.5,-0.5 + parent: 1 + - uid: 18 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,-0.5 - parent: 410 - - uid: 401 + parent: 1 + - uid: 19 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,5.5 - parent: 410 - - uid: 402 + pos: 2.5,-2.5 + parent: 1 + - uid: 20 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,7.5 - parent: 410 -- proto: AtmosFixAirMarker - entities: - - uid: 430 - components: - - type: Transform - pos: -0.5,-4.5 - parent: 410 - - uid: 474 - components: - - type: Transform - pos: 0.5,-4.5 - parent: 410 -- proto: BedsheetMedical - entities: - - uid: 349 + parent: 1 + - uid: 21 components: - type: Transform rot: 1.5707963267948966 rad - pos: -0.5,13.5 - parent: 410 - - uid: 393 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 1.5,9.5 - parent: 410 -- proto: BoxFolderBlue + pos: 2.5,5.5 + parent: 1 +- proto: AirlockMedicalGlassLocked entities: - - uid: 451 - components: - - type: Transform - pos: -2.6054893,13.562216 - parent: 410 -- proto: BoxInflatable - entities: - - uid: 181 - components: - - type: Transform - pos: -2.14584,-3.2177773 - parent: 410 -- proto: CableApcExtension - entities: - - uid: 13 - components: - - type: Transform - pos: -2.5,6.5 - parent: 410 - - uid: 17 - components: - - type: Transform - pos: 1.5,6.5 - parent: 410 - uid: 22 - components: - - type: Transform - pos: 1.5,-0.5 - parent: 410 - - uid: 26 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 29 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 34 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 35 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 36 - components: - - type: Transform - pos: -5.5,7.5 - parent: 410 - - uid: 38 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 49 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 50 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 51 - components: - - type: Transform - pos: -6.5,11.5 - parent: 410 - - uid: 54 - components: - - type: Transform - pos: 1.5,-1.5 - parent: 410 - - uid: 65 - components: - - type: Transform - pos: -1.5,-0.5 - parent: 410 - - uid: 66 - components: - - type: Transform - pos: -3.5,-0.5 - parent: 410 - - uid: 68 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 74 - components: - - type: Transform - pos: -2.5,-3.5 - parent: 410 - - uid: 75 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 - - uid: 83 - components: - - type: Transform - pos: -2.5,-0.5 - parent: 410 - - uid: 91 - components: - - type: Transform - pos: 0.5,11.5 - parent: 410 - - uid: 111 - components: - - type: Transform - pos: -4.5,11.5 - parent: 410 - - uid: 114 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 - - uid: 125 - components: - - type: Transform - pos: -5.5,5.5 - parent: 410 - - uid: 126 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 134 - components: - - type: Transform - pos: -5.5,-0.5 - parent: 410 - - uid: 137 - components: - - type: Transform - pos: 0.5,-0.5 - parent: 410 - - uid: 156 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 160 - components: - - type: Transform - pos: -0.5,5.5 - parent: 410 - - uid: 161 - components: - - type: Transform - pos: 0.5,5.5 - parent: 410 - - uid: 162 - components: - - type: Transform - pos: 1.5,7.5 - parent: 410 - - uid: 163 - components: - - type: Transform - pos: -2.5,5.5 - parent: 410 - - uid: 164 - components: - - type: Transform - pos: -3.5,5.5 - parent: 410 - - uid: 165 - components: - - type: Transform - pos: -1.5,5.5 - parent: 410 - - uid: 177 components: - type: Transform pos: 0.5,8.5 - parent: 410 - - uid: 178 - components: - - type: Transform - pos: 0.5,7.5 - parent: 410 - - uid: 186 - components: - - type: Transform - pos: 1.5,-2.5 - parent: 410 - - uid: 189 - components: - - type: Transform - pos: -6.5,6.5 - parent: 410 - - uid: 196 - components: - - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 200 - components: - - type: Transform - pos: 0.5,-2.5 - parent: 410 - - uid: 204 - components: - - type: Transform - pos: -3.5,11.5 - parent: 410 - - uid: 206 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 208 - components: - - type: Transform - pos: -5.5,-2.5 - parent: 410 - - uid: 210 - components: - - type: Transform - pos: 0.5,9.5 - parent: 410 - - uid: 212 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 215 - components: - - type: Transform - pos: -6.5,4.5 - parent: 410 - - uid: 218 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 221 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 222 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 223 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 225 - components: - - type: Transform - pos: 0.5,12.5 - parent: 410 - - uid: 235 - components: - - type: Transform - pos: 1.5,9.5 - parent: 410 - - uid: 242 - components: - - type: Transform - pos: 1.5,3.5 - parent: 410 - - uid: 275 - components: - - type: Transform - pos: 0.5,10.5 - parent: 410 - - uid: 294 - components: - - type: Transform - pos: -5.5,11.5 - parent: 410 - - uid: 319 - components: - - type: Transform - pos: -5.5,9.5 - parent: 410 - - uid: 326 - components: - - type: Transform - pos: -5.5,10.5 - parent: 410 - - uid: 380 - components: - - type: Transform - pos: -2.5,7.5 - parent: 410 - - uid: 383 - components: - - type: Transform - pos: -2.5,8.5 - parent: 410 - - uid: 431 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 - - uid: 433 - components: - - type: Transform - pos: -2.5,-2.5 - parent: 410 - - uid: 457 - components: - - type: Transform - pos: -6.5,5.5 - parent: 410 - - uid: 458 - components: - - type: Transform - pos: -6.5,7.5 - parent: 410 - - uid: 459 - components: - - type: Transform - pos: -6.5,3.5 - parent: 410 - - uid: 460 - components: - - type: Transform - pos: -6.5,0.5 - parent: 410 - - uid: 461 - components: - - type: Transform - pos: -6.5,1.5 - parent: 410 - - uid: 462 - components: - - type: Transform - pos: -6.5,-0.5 - parent: 410 - - uid: 463 - components: - - type: Transform - pos: 1.5,0.5 - parent: 410 - - uid: 464 - components: - - type: Transform - pos: 1.5,1.5 - parent: 410 - - uid: 465 - components: - - type: Transform - pos: -6.5,-1.5 - parent: 410 - - uid: 466 - components: - - type: Transform - pos: -6.5,-2.5 - parent: 410 - - uid: 467 - components: - - type: Transform - pos: 1.5,4.5 - parent: 410 - - uid: 468 - components: - - type: Transform - pos: 1.5,5.5 - parent: 410 - - uid: 469 - components: - - type: Transform - pos: -2.5,4.5 - parent: 410 - - uid: 470 - components: - - type: Transform - pos: -2.5,3.5 - parent: 410 - - uid: 471 - components: - - type: Transform - pos: -2.5,0.5 - parent: 410 - - uid: 472 - components: - - type: Transform - pos: -2.5,1.5 - parent: 410 -- proto: CableHV + parent: 1 +- proto: AirlockSecurityGlassLocked entities: - uid: 23 components: - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 48 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 234 - components: - - type: Transform - pos: -3.5,-4.5 - parent: 410 - - uid: 236 - components: - - type: Transform - pos: -3.5,-3.5 - parent: 410 - - uid: 323 - components: - - type: Transform - pos: -3.5,-2.5 - parent: 410 - - uid: 438 - components: - - type: Transform - pos: -4.5,-3.5 - parent: 410 - - uid: 439 - components: - - type: Transform - pos: -4.5,-2.5 - parent: 410 -- proto: CableMV + rot: 3.141592653589793 rad + pos: -2.5,6.5 + parent: 1 +- proto: AirSensor entities: - - uid: 5 - components: - - type: Transform - pos: -2.5,-2.5 - parent: 410 - uid: 24 components: - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 40 - components: - - type: Transform - pos: -3.5,-0.5 - parent: 410 - - uid: 42 - components: - - type: Transform - pos: -5.5,-0.5 - parent: 410 - - uid: 43 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 56 - components: - - type: Transform - pos: -6.5,3.5 - parent: 410 - - uid: 61 - components: - - type: Transform - pos: -6.5,1.5 - parent: 410 - - uid: 82 - components: - - type: Transform - pos: -6.5,4.5 - parent: 410 - - uid: 84 - components: - - type: Transform - pos: -6.5,0.5 - parent: 410 - - uid: 89 + pos: -2.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - uid: 25 components: - type: Transform pos: -6.5,2.5 - parent: 410 - - uid: 96 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 5 + - uid: 26 components: - type: Transform - pos: -6.5,5.5 - parent: 410 - - uid: 97 + pos: 0.5,10.5 + parent: 1 + - uid: 27 components: - type: Transform - pos: -6.5,-0.5 - parent: 410 - - uid: 103 + pos: -4.5,11.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 6 + - uid: 28 components: - type: Transform - pos: -5.5,5.5 - parent: 410 - - uid: 115 - components: - - type: Transform - pos: -4.5,-0.5 - parent: 410 - - uid: 122 - components: - - type: Transform - pos: -0.5,-0.5 - parent: 410 - - uid: 227 - components: - - type: Transform - pos: -2.5,-0.5 - parent: 410 - - uid: 228 - components: - - type: Transform - pos: -2.5,-3.5 - parent: 410 - - uid: 229 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 - - uid: 266 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 314 - components: - - type: Transform - pos: -4.5,5.5 - parent: 410 - - uid: 322 - components: - - type: Transform - pos: -2.5,-1.5 - parent: 410 - - uid: 378 - components: - - type: Transform - pos: -1.5,-0.5 - parent: 410 -- proto: CableTerminal + pos: 1.5,2.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 3 +- proto: APCHyperCapacity entities: - - uid: 33 + - uid: 29 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,6.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 30 components: - type: Transform rot: 1.5707963267948966 rad - pos: -3.5,-4.5 - parent: 410 -- proto: Catwalk + pos: -0.5,-1.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: Ashtray + entities: + - uid: 31 + components: + - type: Transform + pos: -6.411743,10.477377 + parent: 1 +- proto: AtmosDeviceFanDirectional entities: - uid: 32 components: - type: Transform rot: -1.5707963267948966 rad - pos: -2.5,-3.5 - parent: 410 - - uid: 172 + pos: -7.5,7.5 + parent: 1 + - uid: 33 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-0.5 + parent: 1 + - uid: 34 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,5.5 + parent: 1 + - uid: 35 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,-2.5 + parent: 1 + - uid: 36 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,13.5 - parent: 410 - - uid: 184 + pos: 2.5,-2.5 + parent: 1 + - uid: 37 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,14.5 - parent: 410 - - uid: 205 + pos: 2.5,-0.5 + parent: 1 + - uid: 38 components: - type: Transform rot: 1.5707963267948966 rad - pos: -7.5,14.5 - parent: 410 - - uid: 268 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,-5.5 - parent: 410 - - uid: 317 + pos: 2.5,5.5 + parent: 1 + - uid: 39 components: - type: Transform rot: 1.5707963267948966 rad - pos: 2.5,-4.5 - parent: 410 - - uid: 351 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,13.5 - parent: 410 - - uid: 384 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-5.5 - parent: 410 - - uid: 394 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,-4.5 - parent: 410 - - uid: 432 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -2.5,-2.5 - parent: 410 -- proto: Chair + pos: 2.5,7.5 + parent: 1 +- proto: AtmosFixAirMarker entities: - - uid: 450 + - uid: 40 components: - type: Transform - pos: -1.5,8.5 - parent: 410 -- proto: ChairOfficeLight + pos: -0.5,-4.5 + parent: 1 + - uid: 41 + components: + - type: Transform + pos: 0.5,-4.5 + parent: 1 +- proto: BedsheetMedical entities: - - uid: 139 + - uid: 42 components: - type: Transform rot: 1.5707963267948966 rad - pos: 0.5779216,10.282177 - parent: 410 - - uid: 197 + pos: -0.5,13.5 + parent: 1 + - uid: 43 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 0.48648357,13.089132 - parent: 410 -- proto: ChairPilotSeat + rot: 1.5707963267948966 rad + pos: 1.5,9.5 + parent: 1 +- proto: BoxFolderBlue entities: - - uid: 1 + - uid: 44 components: - type: Transform - rot: 3.141592653589793 rad - pos: -4.5,12.5 - parent: 410 - - uid: 30 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,0.5 - parent: 410 - - uid: 55 - components: - - type: Transform - pos: -6.5,11.5 - parent: 410 - - uid: 62 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,2.5 - parent: 410 - - uid: 106 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,8.5 - parent: 410 - - uid: 120 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-3.5 - parent: 410 - - uid: 233 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,12.5 - parent: 410 - - uid: 239 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,0.5 - parent: 410 - - uid: 241 - components: - - type: Transform - pos: -2.5,9.5 - parent: 410 - - uid: 246 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,9.5 - parent: 410 - - uid: 249 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,4.5 - parent: 410 - - uid: 253 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,7.5 - parent: 410 - - uid: 258 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,3.5 - parent: 410 - - uid: 279 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,4.5 - parent: 410 - - uid: 298 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,1.5 - parent: 410 - - uid: 302 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,0.5 - parent: 410 - - uid: 306 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,3.5 - parent: 410 - - uid: 310 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,4.5 - parent: 410 - - uid: 311 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,2.5 - parent: 410 - - uid: 313 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,2.5 - parent: 410 - - uid: 318 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,12.5 - parent: 410 - - uid: 328 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,0.5 - parent: 410 - - uid: 329 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,1.5 - parent: 410 - - uid: 330 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,1.5 - parent: 410 - - uid: 337 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,2.5 - parent: 410 - - uid: 340 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,1.5 - parent: 410 - - uid: 341 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,4.5 - parent: 410 - - uid: 445 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,3.5 - parent: 410 - - uid: 452 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,3.5 - parent: 410 -- proto: CigarGold - entities: - - uid: 20 - components: - - type: Transform - pos: -6.620076,10.550344 - parent: 410 -- proto: ClosetEmergencyFilledRandom - entities: - - uid: 19 - components: - - type: Transform - pos: -6.5,-1.5 - parent: 410 - - uid: 71 - components: - - type: Transform - pos: 1.5,-1.5 - parent: 410 - - uid: 278 - components: - - type: Transform - pos: 1.5,6.5 - parent: 410 -- proto: ClosetEmergencyN2FilledRandom - entities: - - uid: 277 - components: - - type: Transform - pos: -6.5,6.5 - parent: 410 -- proto: ClosetWallEmergencyFilledRandom - entities: - - uid: 135 - components: - - type: Transform - pos: 0.5,14.5 - parent: 410 - - uid: 274 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,-3.5 - parent: 410 - - uid: 354 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,-3.5 - parent: 410 - - uid: 381 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,7.5 - parent: 410 -- proto: ClosetWallFireFilledRandom - entities: - - uid: 129 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-2.5 - parent: 410 - - uid: 209 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -4.5,7.5 - parent: 410 - - uid: 251 - components: - - type: Transform - pos: -0.5,14.5 - parent: 410 -- proto: ComputerComms - entities: - - uid: 63 - components: - - type: Transform - pos: -5.5,13.5 - parent: 410 -- proto: ComputerEmergencyShuttle + pos: -2.6054893,13.562216 + parent: 1 +- proto: BoxInflatable entities: - uid: 45 components: - type: Transform - pos: -4.5,13.5 - parent: 410 -- proto: ComputerRadar + pos: -2.14584,-3.2177773 + parent: 1 +- proto: CableApcExtension entities: + - uid: 46 + components: + - type: Transform + pos: -2.5,6.5 + parent: 1 + - uid: 47 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 + - uid: 48 + components: + - type: Transform + pos: 1.5,-0.5 + parent: 1 + - uid: 49 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 50 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 51 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 52 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 53 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - uid: 54 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 55 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 56 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 57 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 58 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 59 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 + - uid: 60 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 61 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 62 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 63 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 64 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 65 + components: + - type: Transform + pos: 0.5,11.5 + parent: 1 + - uid: 66 + components: + - type: Transform + pos: -4.5,11.5 + parent: 1 + - uid: 67 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - uid: 68 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 69 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 70 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 71 + components: + - type: Transform + pos: 0.5,-0.5 + parent: 1 + - uid: 72 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 73 + components: + - type: Transform + pos: -0.5,5.5 + parent: 1 + - uid: 74 + components: + - type: Transform + pos: 0.5,5.5 + parent: 1 + - uid: 75 + components: + - type: Transform + pos: 1.5,7.5 + parent: 1 + - uid: 76 + components: + - type: Transform + pos: -2.5,5.5 + parent: 1 + - uid: 77 + components: + - type: Transform + pos: -3.5,5.5 + parent: 1 + - uid: 78 + components: + - type: Transform + pos: -1.5,5.5 + parent: 1 - uid: 79 + components: + - type: Transform + pos: 0.5,8.5 + parent: 1 + - uid: 80 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - uid: 81 + components: + - type: Transform + pos: 1.5,-2.5 + parent: 1 + - uid: 82 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 + - uid: 83 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 84 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - uid: 85 + components: + - type: Transform + pos: -3.5,11.5 + parent: 1 + - uid: 86 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 87 + components: + - type: Transform + pos: -5.5,-2.5 + parent: 1 + - uid: 88 + components: + - type: Transform + pos: 0.5,9.5 + parent: 1 + - uid: 89 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 90 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 91 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 92 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 93 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 94 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 95 + components: + - type: Transform + pos: 0.5,12.5 + parent: 1 + - uid: 96 + components: + - type: Transform + pos: 1.5,9.5 + parent: 1 + - uid: 97 + components: + - type: Transform + pos: 1.5,3.5 + parent: 1 + - uid: 98 + components: + - type: Transform + pos: 0.5,10.5 + parent: 1 + - uid: 99 + components: + - type: Transform + pos: -5.5,11.5 + parent: 1 + - uid: 100 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - uid: 101 + components: + - type: Transform + pos: -5.5,10.5 + parent: 1 + - uid: 102 + components: + - type: Transform + pos: -2.5,7.5 + parent: 1 + - uid: 103 + components: + - type: Transform + pos: -2.5,8.5 + parent: 1 + - uid: 104 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 105 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 106 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 107 + components: + - type: Transform + pos: -6.5,7.5 + parent: 1 + - uid: 108 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 109 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 110 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 111 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 112 + components: + - type: Transform + pos: 1.5,0.5 + parent: 1 + - uid: 113 + components: + - type: Transform + pos: 1.5,1.5 + parent: 1 + - uid: 114 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 115 + components: + - type: Transform + pos: -6.5,-2.5 + parent: 1 + - uid: 116 + components: + - type: Transform + pos: 1.5,4.5 + parent: 1 + - uid: 117 + components: + - type: Transform + pos: 1.5,5.5 + parent: 1 + - uid: 118 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - uid: 119 + components: + - type: Transform + pos: -2.5,3.5 + parent: 1 + - uid: 120 + components: + - type: Transform + pos: -2.5,0.5 + parent: 1 + - uid: 121 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 +- proto: CableHV + entities: + - uid: 122 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 123 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 124 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 + - uid: 125 + components: + - type: Transform + pos: -3.5,-3.5 + parent: 1 + - uid: 126 + components: + - type: Transform + pos: -3.5,-2.5 + parent: 1 + - uid: 127 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 128 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 +- proto: CableMV + entities: + - uid: 129 + components: + - type: Transform + pos: -2.5,-2.5 + parent: 1 + - uid: 130 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 131 + components: + - type: Transform + pos: -3.5,-0.5 + parent: 1 + - uid: 132 + components: + - type: Transform + pos: -5.5,-0.5 + parent: 1 + - uid: 133 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 134 + components: + - type: Transform + pos: -6.5,3.5 + parent: 1 + - uid: 135 + components: + - type: Transform + pos: -6.5,1.5 + parent: 1 + - uid: 136 + components: + - type: Transform + pos: -6.5,4.5 + parent: 1 + - uid: 137 + components: + - type: Transform + pos: -6.5,0.5 + parent: 1 + - uid: 138 + components: + - type: Transform + pos: -6.5,2.5 + parent: 1 + - uid: 139 + components: + - type: Transform + pos: -6.5,5.5 + parent: 1 + - uid: 140 + components: + - type: Transform + pos: -6.5,-0.5 + parent: 1 + - uid: 141 + components: + - type: Transform + pos: -5.5,5.5 + parent: 1 + - uid: 142 + components: + - type: Transform + pos: -4.5,-0.5 + parent: 1 + - uid: 143 + components: + - type: Transform + pos: -0.5,-0.5 + parent: 1 + - uid: 144 + components: + - type: Transform + pos: -2.5,-0.5 + parent: 1 + - uid: 145 + components: + - type: Transform + pos: -2.5,-3.5 + parent: 1 + - uid: 146 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 + - uid: 147 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 148 + components: + - type: Transform + pos: -4.5,5.5 + parent: 1 + - uid: 149 + components: + - type: Transform + pos: -2.5,-1.5 + parent: 1 + - uid: 150 + components: + - type: Transform + pos: -1.5,-0.5 + parent: 1 +- proto: CableTerminal + entities: + - uid: 151 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,-4.5 + parent: 1 +- proto: Catwalk + entities: + - uid: 152 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,-3.5 + parent: 1 + - uid: 153 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,13.5 + parent: 1 + - uid: 154 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,14.5 + parent: 1 + - uid: 155 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,14.5 + parent: 1 + - uid: 156 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 157 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,-4.5 + parent: 1 + - uid: 158 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,13.5 + parent: 1 + - uid: 159 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-5.5 + parent: 1 + - uid: 160 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,-4.5 + parent: 1 + - uid: 161 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,-2.5 + parent: 1 +- proto: Chair + entities: + - uid: 162 + components: + - type: Transform + pos: -1.5,8.5 + parent: 1 +- proto: ChairOfficeLight + entities: + - uid: 163 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5779216,10.282177 + parent: 1 + - uid: 164 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.48648357,13.089132 + parent: 1 +- proto: ChairPilotSeat + entities: + - uid: 165 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -4.5,12.5 + parent: 1 + - uid: 166 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,0.5 + parent: 1 + - uid: 167 + components: + - type: Transform + pos: -6.5,11.5 + parent: 1 + - uid: 168 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,2.5 + parent: 1 + - uid: 169 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,8.5 + parent: 1 + - uid: 170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - uid: 171 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,12.5 + parent: 1 + - uid: 172 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 173 + components: + - type: Transform + pos: -2.5,9.5 + parent: 1 + - uid: 174 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,9.5 + parent: 1 + - uid: 175 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,4.5 + parent: 1 + - uid: 176 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,7.5 + parent: 1 + - uid: 177 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,3.5 + parent: 1 + - uid: 178 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,4.5 + parent: 1 + - uid: 179 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - uid: 180 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,0.5 + parent: 1 + - uid: 181 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,3.5 + parent: 1 + - uid: 182 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,4.5 + parent: 1 + - uid: 183 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,2.5 + parent: 1 + - uid: 184 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,2.5 + parent: 1 + - uid: 185 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,12.5 + parent: 1 + - uid: 186 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,0.5 + parent: 1 + - uid: 187 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,1.5 + parent: 1 + - uid: 188 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,1.5 + parent: 1 + - uid: 189 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,2.5 + parent: 1 + - uid: 190 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,1.5 + parent: 1 + - uid: 191 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,4.5 + parent: 1 + - uid: 192 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,3.5 + parent: 1 + - uid: 193 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,3.5 + parent: 1 +- proto: CigarGold + entities: + - uid: 194 + components: + - type: Transform + pos: -6.620076,10.550344 + parent: 1 +- proto: ClosetEmergencyFilledRandom + entities: + - uid: 195 + components: + - type: Transform + pos: -6.5,-1.5 + parent: 1 + - uid: 196 + components: + - type: Transform + pos: 1.5,-1.5 + parent: 1 + - uid: 197 + components: + - type: Transform + pos: 1.5,6.5 + parent: 1 +- proto: ClosetEmergencyN2FilledRandom + entities: + - uid: 198 + components: + - type: Transform + pos: -6.5,6.5 + parent: 1 +- proto: ClosetWallEmergencyFilledRandom + entities: + - uid: 199 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 200 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,-3.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 201 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,-3.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 202 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,7.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ClosetWallFireFilledRandom + entities: + - uid: 203 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-2.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 204 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -4.5,7.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 205 + components: + - type: Transform + pos: -0.5,14.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ComputerComms + entities: + - uid: 206 + components: + - type: Transform + pos: -5.5,13.5 + parent: 1 +- proto: ComputerEmergencyShuttle + entities: + - uid: 207 + components: + - type: Transform + pos: -4.5,13.5 + parent: 1 +- proto: ComputerRadar + entities: + - uid: 208 components: - type: Transform pos: -3.5,13.5 - parent: 410 + parent: 1 - proto: DefibrillatorCabinetFilled entities: - - uid: 353 + - uid: 209 components: - type: Transform pos: 1.5,12.5 - parent: 410 + parent: 1 + - type: Fixtures + fixtures: {} - proto: DrinkGildlagerBottleFull entities: - - uid: 455 + - uid: 210 components: - type: Transform pos: -6.338826,10.977726 - parent: 410 + parent: 1 - proto: DrinkGlass entities: - - uid: 456 + - uid: 211 components: - type: Transform pos: -6.661743,10.842215 - parent: 410 + parent: 1 - proto: EmergencyLight entities: - - uid: 315 + - uid: 212 components: - type: Transform rot: 3.141592653589793 rad pos: -1.5,-0.5 - parent: 410 + parent: 1 - proto: ExtinguisherCabinetFilled entities: - - uid: 422 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,0.5 - parent: 410 - - uid: 423 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,4.5 - parent: 410 -- proto: FireAxeCabinetFilled - entities: - - uid: 291 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,10.5 - parent: 410 -- proto: FirelockEdge - entities: - - uid: 148 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -3.5,-0.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 - uid: 213 components: - type: Transform rot: 1.5707963267948966 rad - pos: -1.5,-0.5 - parent: 410 + pos: -7.5,0.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 214 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,4.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: FireAxeCabinetFilled + entities: + - uid: 215 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,10.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: FirelockEdge + entities: + - uid: 216 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -3.5,-0.5 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 - - uid: 321 + - 2 + - uid: 217 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-0.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - uid: 218 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,-0.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 - - uid: 483 + - 5 + - uid: 219 components: - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-0.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 - - uid: 485 + - 3 + - uid: 220 components: - type: Transform rot: -1.5707963267948966 rad pos: 0.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 - - uid: 486 + - 3 + - uid: 221 components: - type: Transform rot: -1.5707963267948966 rad pos: -3.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 - - uid: 487 + - 2 + - uid: 222 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 - - uid: 488 + - 5 + - uid: 223 components: - type: Transform rot: 1.5707963267948966 rad pos: -1.5,5.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 + - 2 - proto: GasOutletInjector entities: - - uid: 118 + - uid: 224 components: - type: Transform rot: -1.5707963267948966 rad pos: -0.5,-4.5 - parent: 410 + parent: 1 - proto: GasPassiveVent entities: - - uid: 2 + - uid: 225 components: - type: Transform rot: 3.141592653589793 rad pos: 0.5,-4.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 57 + - uid: 226 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-4.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -1949,653 +1953,653 @@ entities: color: '#990000FF' - proto: GasPipeBend entities: - - uid: 176 + - uid: 227 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,8.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 201 + - uid: 228 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,-0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 338 + - uid: 229 components: - type: Transform rot: 1.5707963267948966 rad pos: -5.5,11.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasPipeBendAlt2 entities: - - uid: 494 + - uid: 230 components: - type: Transform pos: 1.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GasPipeFourwayAlt2 entities: - - uid: 220 + - uid: 231 components: - type: Transform pos: -2.5,5.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GasPipeStraight entities: - - uid: 18 + - uid: 232 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,6.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 90 + - uid: 233 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 102 + - uid: 234 components: - type: Transform rot: 3.141592653589793 rad pos: -5.5,7.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 110 + - uid: 235 components: - type: Transform pos: 0.5,-1.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 116 + - uid: 236 components: - type: Transform pos: -2.5,0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 117 + - uid: 237 components: - type: Transform pos: -3.5,0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 123 + - uid: 238 components: - type: Transform pos: 0.5,6.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 127 + - uid: 239 components: - type: Transform pos: -5.5,3.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 133 + - uid: 240 components: - type: Transform pos: -5.5,5.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 146 + - uid: 241 components: - type: Transform rot: 3.141592653589793 rad pos: 0.5,9.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 149 + - uid: 242 components: - type: Transform rot: 1.5707963267948966 rad pos: -4.5,-0.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 150 + - uid: 243 components: - type: Transform rot: 1.5707963267948966 rad pos: -1.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 151 - components: - - type: Transform - pos: -3.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 157 - components: - - type: Transform - pos: 0.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 158 - components: - - type: Transform - pos: 0.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 159 - components: - - type: Transform - pos: -3.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 166 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 167 - components: - - type: Transform - pos: -5.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 168 - components: - - type: Transform - pos: -3.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 174 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 175 - components: - - type: Transform - pos: 0.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 179 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 182 - components: - - type: Transform - pos: 0.5,-2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 185 - components: - - type: Transform - pos: 0.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 191 - components: - - type: Transform - pos: -5.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 192 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 199 - components: - - type: Transform - pos: -3.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 202 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 207 - components: - - type: Transform - pos: 0.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 217 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 280 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 300 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 359 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 408 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 0.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 419 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,11.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 443 - components: - - type: Transform - pos: -5.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' -- proto: GasPipeStraightAlt2 - entities: - - uid: 141 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 183 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-1.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 188 - components: - - type: Transform - pos: -5.5,9.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 214 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 240 - components: - - type: Transform - pos: -2.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 247 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-2.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 250 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 254 - components: - - type: Transform - pos: -5.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 271 - components: - - type: Transform - pos: -5.5,10.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 303 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 309 - components: - - type: Transform - pos: -5.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 358 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 362 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 366 - components: - - type: Transform - pos: -5.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 388 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 390 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 391 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,0.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 392 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 404 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,2.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 484 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -5.5,-3.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 490 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,4.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 491 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,6.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 492 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,7.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 493 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,8.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' -- proto: GasPipeTJunction - entities: - - uid: 142 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -3.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 194 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 226 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-0.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 480 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 481 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,1.5 - parent: 410 - - type: AtmosPipeColor - color: '#0055CCFF' -- proto: GasPipeTJunctionAlt2 - entities: - - uid: 248 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 413 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,3.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 415 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -5.5,5.5 - parent: 410 - - type: AtmosPipeColor - color: '#990000FF' -- proto: GasPort - entities: - - uid: 121 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -1.5,-4.5 - parent: 410 -- proto: GasVentPump - entities: - - uid: 193 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 180 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 219 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,8.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 244 components: - type: Transform - pos: -2.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 12 + pos: -3.5,2.5 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 245 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -6.5,1.5 - parent: 410 - - type: DeviceNetwork - deviceLists: - - 389 + pos: 0.5,2.5 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 357 + - uid: 246 + components: + - type: Transform + pos: 0.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 247 + components: + - type: Transform + pos: -3.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 248 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 249 + components: + - type: Transform + pos: -5.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 250 + components: + - type: Transform + pos: -3.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 251 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 252 + components: + - type: Transform + pos: 0.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 253 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 254 + components: + - type: Transform + pos: 0.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 255 + components: + - type: Transform + pos: 0.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 256 + components: + - type: Transform + pos: -5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 257 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 258 + components: + - type: Transform + pos: -3.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 259 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 260 + components: + - type: Transform + pos: 0.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 261 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 262 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 263 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 264 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 265 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 266 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,11.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 267 + components: + - type: Transform + pos: -5.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeStraightAlt2 + entities: + - uid: 268 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 269 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 270 + components: + - type: Transform + pos: -5.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 271 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 272 + components: + - type: Transform + pos: -2.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 273 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 274 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 275 + components: + - type: Transform + pos: -5.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 276 + components: + - type: Transform + pos: -5.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 277 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 278 + components: + - type: Transform + pos: -5.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 279 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 280 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 281 + components: + - type: Transform + pos: -5.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 282 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 283 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 284 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,0.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 285 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 286 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,2.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 287 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -5.5,-3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 288 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,4.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 289 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 290 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 291 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 1.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GasPipeTJunction + entities: + - uid: 292 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -3.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 293 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 294 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-0.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 295 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 296 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,1.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' +- proto: GasPipeTJunctionAlt2 + entities: + - uid: 297 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 298 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,3.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 299 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,5.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' +- proto: GasPort + entities: + - uid: 300 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,-4.5 + parent: 1 +- proto: GasVentPump + entities: + - uid: 301 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 3 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 302 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 303 + components: + - type: Transform + pos: -2.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 2 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 304 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,1.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 5 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 305 components: - type: Transform pos: 0.5,11.5 - parent: 410 + parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 382 + - uid: 306 components: - type: Transform rot: -1.5707963267948966 rad pos: -3.5,11.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 434 + - 6 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasVentScrubber entities: - - uid: 312 + - uid: 307 components: - type: Transform rot: 3.141592653589793 rad pos: -2.5,3.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2603,17 +2607,17 @@ entities: pipeLayer: Tertiary - type: DeviceNetwork deviceLists: - - 12 + - 2 - type: AtmosPipeColor color: '#990000FF' - - uid: 347 + - uid: 308 components: - type: Transform pos: -2.5,7.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 12 + - 2 - type: Construction step: 1 edge: 0 @@ -2621,15 +2625,15 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 406 + - uid: 309 components: - type: Transform rot: 1.5707963267948966 rad pos: -6.5,3.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 389 + - 5 - type: Construction step: 1 edge: 0 @@ -2637,12 +2641,12 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 420 + - uid: 310 components: - type: Transform rot: 1.5707963267948966 rad pos: 0.5,9.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2650,15 +2654,15 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 482 + - uid: 311 components: - type: Transform rot: 3.141592653589793 rad pos: 1.5,3.5 - parent: 410 + parent: 1 - type: DeviceNetwork deviceLists: - - 180 + - 3 - type: Construction step: 1 edge: 0 @@ -2666,11 +2670,11 @@ entities: pipeLayer: Tertiary - type: AtmosPipeColor color: '#990000FF' - - uid: 489 + - uid: 312 components: - type: Transform pos: -5.5,11.5 - parent: 410 + parent: 1 - type: Construction step: 1 edge: 0 @@ -2680,998 +2684,1016 @@ entities: color: '#990000FF' - proto: GeneratorBasic15kW entities: - - uid: 203 + - uid: 313 components: - type: Transform pos: -3.5,-3.5 - parent: 410 - - uid: 224 + parent: 1 + - uid: 314 components: - type: Transform pos: -3.5,-2.5 - parent: 410 + parent: 1 - proto: GeneratorWallmountAPU entities: - - uid: 440 + - uid: 315 components: - type: Transform pos: -4.5,-3.5 - parent: 410 - - uid: 441 + parent: 1 + - uid: 316 components: - type: Transform pos: -4.5,-2.5 - parent: 410 + parent: 1 - proto: GravityGeneratorMini + entities: + - uid: 317 + components: + - type: Transform + pos: -3.5,-4.5 + parent: 1 +- proto: Grille + entities: + - uid: 318 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 319 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 320 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 321 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 322 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 323 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 324 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 325 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 326 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 327 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 328 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 329 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 330 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 331 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 332 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 333 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 334 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 335 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 336 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 337 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 338 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 339 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 340 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 + - uid: 341 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 342 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 343 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 + - uid: 344 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 +- proto: Gyroscope entities: - uid: 345 components: - type: Transform - pos: -3.5,-4.5 - parent: 410 -- proto: Grille + pos: -4.5,-4.5 + parent: 1 +- proto: HandheldHealthAnalyzerUnpowered entities: - - uid: 44 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 95 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 101 - components: - - type: Transform - pos: 2.5,3.5 - parent: 410 - - uid: 104 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 124 - components: - - type: Transform - pos: -6.5,8.5 - parent: 410 - - uid: 138 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 155 - components: - - type: Transform - pos: 2.5,1.5 - parent: 410 - - uid: 169 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 171 - components: - - type: Transform - pos: -7.5,1.5 - parent: 410 - - uid: 173 - components: - - type: Transform - pos: -7.5,3.5 - parent: 410 - - uid: 237 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 - - uid: 260 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 261 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 263 - components: - - type: Transform - pos: 2.5,2.5 - parent: 410 - - uid: 281 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 288 - components: - - type: Transform - pos: -7.5,-1.5 - parent: 410 - - uid: 295 - components: - - type: Transform - pos: -7.5,2.5 - parent: 410 - - uid: 296 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 297 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 301 - components: - - type: Transform - pos: -3.5,6.5 - parent: 410 - - uid: 308 - components: - - type: Transform - pos: 2.5,-1.5 - parent: 410 - - uid: 344 - components: - - type: Transform - pos: -7.5,6.5 - parent: 410 - uid: 346 - components: - - type: Transform - pos: 2.5,6.5 - parent: 410 - - uid: 350 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 - - uid: 356 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 449 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 473 - components: - - type: Transform - pos: -5.5,-5.5 - parent: 410 -- proto: Gyroscope - entities: - - uid: 352 - components: - - type: Transform - pos: -4.5,-4.5 - parent: 410 -- proto: HandheldHealthAnalyzerUnpowered - entities: - - uid: 370 components: - type: Transform pos: 1.5254471,10.577127 - parent: 410 + parent: 1 - proto: HolopadCentCommEvacShuttle entities: - - uid: 108 + - uid: 347 components: - type: Transform pos: -5.5,10.5 - parent: 410 + parent: 1 - proto: LockerEvacRepairFilled entities: - - uid: 128 - components: - - type: Transform - pos: -1.5,-2.5 - parent: 410 -- proto: LockerEvidence - entities: - - uid: 424 - components: - - type: Transform - pos: -3.5,9.5 - parent: 410 -- proto: LockerMedicineFilled - entities: - - uid: 140 - components: - - type: Transform - pos: -0.5,11.5 - parent: 410 -- proto: MedicalBed - entities: - - uid: 365 - components: - - type: Transform - pos: 1.5,9.5 - parent: 410 - - uid: 407 - components: - - type: Transform - pos: -0.5,13.5 - parent: 410 -- proto: MedkitFilled - entities: - - uid: 37 - components: - - type: Transform - pos: -0.4916364,12.55368 - parent: 410 -- proto: Paper - entities: - - uid: 70 - components: - - type: Transform - pos: -2.3867393,13.229256 - parent: 410 - - uid: 304 - components: - - type: Transform - pos: -2.5273643,13.057381 - parent: 410 -- proto: PottedPlant10 - entities: - - uid: 243 - components: - - type: Transform - pos: -2.5,11.5 - parent: 410 -- proto: Poweredlight - entities: - - uid: 77 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,-1.5 - parent: 410 - - uid: 264 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,-1.5 - parent: 410 - - uid: 299 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -2.5,12.5 - parent: 410 - - uid: 316 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,6.5 - parent: 410 - - uid: 355 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,12.5 - parent: 410 - - uid: 373 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -5.5,6.5 - parent: 410 - - uid: 387 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,8.5 - parent: 410 - - uid: 411 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-3.5 - parent: 410 - - uid: 436 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,0.5 - parent: 410 - - uid: 437 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -3.5,4.5 - parent: 410 - - uid: 447 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -6.5,10.5 - parent: 410 -- proto: Screen - entities: - - uid: 87 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,0.5 - parent: 410 - - uid: 109 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -7.5,4.5 - parent: 410 - - uid: 255 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -1.5,11.5 - parent: 410 -- proto: ShuttleWindow - entities: - - uid: 21 - components: - - type: Transform - pos: 2.5,3.5 - parent: 410 - - uid: 25 - components: - - type: Transform - pos: -0.5,3.5 - parent: 410 - - uid: 27 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 - - uid: 60 - components: - - type: Transform - pos: -5.5,-5.5 - parent: 410 - - uid: 73 - components: - - type: Transform - pos: -3.5,6.5 - parent: 410 - - uid: 80 - components: - - type: Transform - pos: -4.5,1.5 - parent: 410 - - uid: 81 - components: - - type: Transform - pos: -7.5,2.5 - parent: 410 - - uid: 88 - components: - - type: Transform - pos: 2.5,1.5 - parent: 410 - - uid: 105 - components: - - type: Transform - pos: -3.5,14.5 - parent: 410 - - uid: 112 - components: - - type: Transform - pos: 2.5,2.5 - parent: 410 - - uid: 147 - components: - - type: Transform - pos: -7.5,1.5 - parent: 410 - - uid: 198 - components: - - type: Transform - pos: -7.5,3.5 - parent: 410 - - uid: 230 - components: - - type: Transform - pos: -5.5,14.5 - parent: 410 - - uid: 231 - components: - - type: Transform - pos: -6.5,14.5 - parent: 410 - - uid: 232 - components: - - type: Transform - pos: -6.5,13.5 - parent: 410 - - uid: 252 - components: - - type: Transform - pos: -6.5,8.5 - parent: 410 - - uid: 257 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 - - uid: 262 - components: - - type: Transform - pos: -4.5,14.5 - parent: 410 - - uid: 265 - components: - - type: Transform - pos: -7.5,6.5 - parent: 410 - - uid: 270 - components: - - type: Transform - pos: -5.5,-3.5 - parent: 410 - - uid: 272 - components: - - type: Transform - pos: -0.5,2.5 - parent: 410 - - uid: 282 - components: - - type: Transform - pos: 2.5,9.5 - parent: 410 - - uid: 283 - components: - - type: Transform - pos: 2.5,10.5 - parent: 410 - - uid: 284 - components: - - type: Transform - pos: 2.5,11.5 - parent: 410 - - uid: 286 - components: - - type: Transform - pos: 2.5,-1.5 - parent: 410 - - uid: 287 - components: - - type: Transform - pos: -0.5,1.5 - parent: 410 - - uid: 290 - components: - - type: Transform - pos: 0.5,-3.5 - parent: 410 - - uid: 307 - components: - - type: Transform - pos: -2.5,14.5 - parent: 410 - - uid: 324 - components: - - type: Transform - pos: -4.5,2.5 - parent: 410 - - uid: 342 - components: - - type: Transform - pos: -4.5,3.5 - parent: 410 - - uid: 364 - components: - - type: Transform - pos: -7.5,-1.5 - parent: 410 - - uid: 409 - components: - - type: Transform - pos: -6.5,12.5 - parent: 410 - - uid: 421 - components: - - type: Transform - pos: 2.5,6.5 - parent: 410 -- proto: SignBridge - entities: - - uid: 238 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -6.5,8.5 - parent: 410 -- proto: SignEngineering - entities: - - uid: 444 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,-1.5 - parent: 410 -- proto: SignMedical - entities: - - uid: 113 - components: - - type: Transform - pos: 1.5,8.5 - parent: 410 -- proto: SignSecurity - entities: - - uid: 190 - components: - - type: Transform - pos: -1.5,6.5 - parent: 410 -- proto: SMESBasic - entities: - - uid: 292 - components: - - type: Transform - pos: -2.5,-4.5 - parent: 410 -- proto: StasisBed - entities: - - uid: 320 - components: - - type: Transform - pos: 1.5,11.5 - parent: 410 -- proto: SubstationWallBasic - entities: - - uid: 58 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -2.5,-5.5 - parent: 410 -- proto: TableGlass - entities: - - uid: 86 - components: - - type: Transform - pos: 1.5,10.5 - parent: 410 - - uid: 374 - components: - - type: Transform - pos: -0.5,12.5 - parent: 410 -- proto: TableReinforced - entities: - - uid: 46 - components: - - type: Transform - pos: -2.5,12.5 - parent: 410 - - uid: 454 - components: - - type: Transform - pos: -2.5,13.5 - parent: 410 -- proto: TableWood - entities: - - uid: 16 - components: - - type: Transform - pos: -6.5,10.5 - parent: 410 -- proto: Thruster - entities: - - uid: 53 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,-4.5 - parent: 410 - - uid: 67 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,-4.5 - parent: 410 - - uid: 195 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 2.5,-5.5 - parent: 410 - - uid: 289 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -7.5,-5.5 - parent: 410 - - uid: 334 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -7.5,13.5 - parent: 410 - - uid: 335 - components: - - type: Transform - pos: -7.5,14.5 - parent: 410 - uid: 348 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 2.5,13.5 - parent: 410 - - uid: 360 - components: - - type: Transform - pos: 2.5,14.5 - parent: 410 -- proto: VendingMachineMedical + pos: -1.5,-2.5 + parent: 1 +- proto: LockerEvidence entities: - - uid: 379 + - uid: 349 components: - type: Transform - pos: -0.5,10.5 - parent: 410 -- proto: VendingMachineWallMedical + pos: -3.5,9.5 + parent: 1 +- proto: LockerMedicineFilled entities: - - uid: 211 + - uid: 350 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,13.5 - parent: 410 -- proto: WallShuttle + pos: -0.5,11.5 + parent: 1 +- proto: MedicalBed entities: - - uid: 3 + - uid: 351 components: - type: Transform - pos: -7.5,-3.5 - parent: 410 - - uid: 7 + pos: 1.5,9.5 + parent: 1 + - uid: 352 components: - type: Transform - pos: -7.5,0.5 - parent: 410 - - uid: 8 - components: - - type: Transform - pos: -4.5,4.5 - parent: 410 - - uid: 9 - components: - - type: Transform - pos: -0.5,-1.5 - parent: 410 - - uid: 10 - components: - - type: Transform - pos: 2.5,4.5 - parent: 410 - - uid: 11 - components: - - type: Transform - pos: -7.5,4.5 - parent: 410 - - uid: 15 - components: - - type: Transform - pos: -7.5,8.5 - parent: 410 - - uid: 28 - components: - - type: Transform - pos: -0.5,9.5 - parent: 410 - - uid: 31 - components: - - type: Transform - pos: 0.5,14.5 - parent: 410 - - uid: 39 - components: - - type: Transform - pos: 1.5,-5.5 - parent: 410 - - uid: 41 - components: - - type: Transform - pos: 2.5,0.5 - parent: 410 - - uid: 59 - components: - - type: Transform - pos: -0.5,-2.5 - parent: 410 - - uid: 69 - components: - - type: Transform - pos: -0.5,14.5 - parent: 410 - - uid: 72 - components: - - type: Transform - pos: -0.5,-3.5 - parent: 410 - - uid: 78 - components: - - type: Transform - pos: -1.5,13.5 - parent: 410 - - uid: 85 - components: - - type: Transform - pos: -1.5,12.5 - parent: 410 - - uid: 92 - components: - - type: Transform - pos: -1.5,14.5 - parent: 410 - - uid: 93 - components: - - type: Transform - pos: -4.5,8.5 - parent: 410 - - uid: 94 - components: - - type: Transform - pos: -4.5,6.5 - parent: 410 - - uid: 98 - components: - - type: Transform - pos: -4.5,-3.5 - parent: 410 - - uid: 131 - components: - - type: Transform - pos: -3.5,-1.5 - parent: 410 - - uid: 143 - components: - - type: Transform - pos: 2.5,-3.5 - parent: 410 - - uid: 144 - components: - - type: Transform - pos: 2.5,8.5 - parent: 410 - - uid: 153 - components: - - type: Transform - pos: 1.5,-3.5 - parent: 410 - - uid: 154 - components: - - type: Transform - pos: -4.5,-2.5 - parent: 410 - - uid: 170 - components: - - type: Transform - pos: -6.5,-3.5 - parent: 410 - - uid: 187 - components: - - type: Transform - pos: -4.5,-1.5 - parent: 410 - - uid: 216 - components: - - type: Transform - pos: 1.5,12.5 - parent: 410 - - uid: 256 - components: - - type: Transform - pos: -1.5,-1.5 - parent: 410 - - uid: 259 - components: - - type: Transform - pos: -0.5,6.5 - parent: 410 - - uid: 267 - components: - - type: Transform - pos: -1.5,-5.5 - parent: 410 - - uid: 269 - components: - - type: Transform - pos: -0.5,-5.5 - parent: 410 - - uid: 276 - components: - - type: Transform - pos: -0.5,0.5 - parent: 410 - - uid: 293 - components: - - type: Transform - pos: -1.5,11.5 - parent: 410 - - uid: 325 - components: - - type: Transform - pos: -3.5,10.5 - parent: 410 - - uid: 327 - components: - - type: Transform - pos: 2.5,12.5 - parent: 410 - - uid: 331 - components: - - type: Transform - pos: -6.5,-5.5 - parent: 410 - - uid: 332 - components: - - type: Transform - pos: -6.5,-4.5 - parent: 410 - - uid: 333 - components: - - type: Transform - pos: 1.5,-4.5 - parent: 410 - - uid: 336 - components: - - type: Transform - pos: 1.5,14.5 - parent: 410 - - uid: 339 - components: - - type: Transform - pos: -4.5,0.5 - parent: 410 - - uid: 361 - components: - - type: Transform - pos: -4.5,10.5 - parent: 410 - - uid: 363 - components: - - type: Transform - pos: -4.5,-5.5 - parent: 410 - - uid: 367 - components: - - type: Transform - pos: -0.5,8.5 - parent: 410 - - uid: 368 - components: - - type: Transform - pos: 0.5,-5.5 - parent: 410 - - uid: 369 - components: - - type: Transform - pos: -2.5,-5.5 - parent: 410 - - uid: 371 - components: - - type: Transform - pos: -7.5,10.5 - parent: 410 - - uid: 372 - components: - - type: Transform - pos: -1.5,9.5 - parent: 410 - - uid: 375 - components: - - type: Transform - pos: -1.5,10.5 - parent: 410 - - uid: 377 - components: - - type: Transform - pos: -4.5,7.5 - parent: 410 - - uid: 385 - components: - - type: Transform - pos: -4.5,9.5 - parent: 410 - - uid: 386 - components: - - type: Transform - pos: 1.5,13.5 - parent: 410 - - uid: 405 - components: - - type: Transform - pos: -3.5,-5.5 - parent: 410 - - uid: 412 - components: - - type: Transform - pos: -7.5,9.5 - parent: 410 - - uid: 414 - components: - - type: Transform - pos: -7.5,11.5 - parent: 410 - - uid: 417 - components: - - type: Transform - pos: -2.5,10.5 - parent: 410 - - uid: 425 - components: - - type: Transform - pos: -0.5,7.5 - parent: 410 - - uid: 446 - components: - - type: Transform - pos: -7.5,12.5 - parent: 410 - - uid: 453 - components: - - type: Transform - pos: -0.5,4.5 - parent: 410 -- proto: WallWeaponCapacitorRecharger + pos: -0.5,13.5 + parent: 1 +- proto: MedkitFilled entities: - - uid: 376 + - uid: 353 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,9.5 - parent: 410 -- proto: WeaponCapacitorRecharger + pos: -0.4916364,12.55368 + parent: 1 +- proto: Paper entities: - - uid: 273 + - uid: 354 components: - type: Transform - pos: -2.5,12.5 - parent: 410 -- proto: WindoorSecureSecurityLocked - entities: - - uid: 107 + pos: -2.3867393,13.229256 + parent: 1 + - uid: 355 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -1.5,7.5 - parent: 410 -- proto: WindowReinforcedDirectional + pos: -2.5273643,13.057381 + parent: 1 +- proto: PlasmaWindowDirectional entities: - - uid: 64 + - uid: 488 components: - type: Transform rot: -1.5707963267948966 rad pos: -0.5,-4.5 - parent: 410 + parent: 1 +- proto: PottedPlant10 + entities: + - uid: 356 + components: + - type: Transform + pos: -2.5,11.5 + parent: 1 +- proto: Poweredlight + entities: + - uid: 357 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,-1.5 + parent: 1 + - uid: 358 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,-1.5 + parent: 1 + - uid: 359 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -2.5,12.5 + parent: 1 + - uid: 360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,6.5 + parent: 1 + - uid: 361 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,12.5 + parent: 1 + - uid: 362 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -5.5,6.5 + parent: 1 + - uid: 363 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,8.5 + parent: 1 + - uid: 364 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-3.5 + parent: 1 + - uid: 365 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,0.5 + parent: 1 + - uid: 366 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,4.5 + parent: 1 + - uid: 367 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,10.5 + parent: 1 +- proto: Screen + entities: + - uid: 368 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,0.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 369 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -7.5,4.5 + parent: 1 + - type: Fixtures + fixtures: {} + - uid: 370 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -1.5,11.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: ShuttleWindow + entities: + - uid: 371 + components: + - type: Transform + pos: 2.5,3.5 + parent: 1 + - uid: 372 + components: + - type: Transform + pos: -0.5,3.5 + parent: 1 + - uid: 373 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - uid: 374 + components: + - type: Transform + pos: -5.5,-5.5 + parent: 1 + - uid: 375 + components: + - type: Transform + pos: -3.5,6.5 + parent: 1 + - uid: 376 + components: + - type: Transform + pos: -4.5,1.5 + parent: 1 + - uid: 377 + components: + - type: Transform + pos: -7.5,2.5 + parent: 1 + - uid: 378 + components: + - type: Transform + pos: 2.5,1.5 + parent: 1 + - uid: 379 + components: + - type: Transform + pos: -3.5,14.5 + parent: 1 + - uid: 380 + components: + - type: Transform + pos: 2.5,2.5 + parent: 1 + - uid: 381 + components: + - type: Transform + pos: -7.5,1.5 + parent: 1 + - uid: 382 + components: + - type: Transform + pos: -7.5,3.5 + parent: 1 + - uid: 383 + components: + - type: Transform + pos: -5.5,14.5 + parent: 1 + - uid: 384 + components: + - type: Transform + pos: -6.5,14.5 + parent: 1 + - uid: 385 + components: + - type: Transform + pos: -6.5,13.5 + parent: 1 + - uid: 386 + components: + - type: Transform + pos: -6.5,8.5 + parent: 1 + - uid: 387 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - uid: 388 + components: + - type: Transform + pos: -4.5,14.5 + parent: 1 + - uid: 389 + components: + - type: Transform + pos: -7.5,6.5 + parent: 1 + - uid: 390 + components: + - type: Transform + pos: -5.5,-3.5 + parent: 1 + - uid: 391 + components: + - type: Transform + pos: -0.5,2.5 + parent: 1 + - uid: 392 + components: + - type: Transform + pos: 2.5,9.5 + parent: 1 + - uid: 393 + components: + - type: Transform + pos: 2.5,10.5 + parent: 1 + - uid: 394 + components: + - type: Transform + pos: 2.5,11.5 + parent: 1 + - uid: 395 + components: + - type: Transform + pos: 2.5,-1.5 + parent: 1 + - uid: 396 + components: + - type: Transform + pos: -0.5,1.5 + parent: 1 + - uid: 397 + components: + - type: Transform + pos: 0.5,-3.5 + parent: 1 + - uid: 398 + components: + - type: Transform + pos: -2.5,14.5 + parent: 1 + - uid: 399 + components: + - type: Transform + pos: -4.5,2.5 + parent: 1 + - uid: 400 + components: + - type: Transform + pos: -4.5,3.5 + parent: 1 + - uid: 401 + components: + - type: Transform + pos: -7.5,-1.5 + parent: 1 + - uid: 402 + components: + - type: Transform + pos: -6.5,12.5 + parent: 1 - uid: 403 + components: + - type: Transform + pos: 2.5,6.5 + parent: 1 +- proto: SignBridge + entities: + - uid: 404 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -6.5,8.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignEngineering + entities: + - uid: 405 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,-1.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignMedical + entities: + - uid: 406 + components: + - type: Transform + pos: 1.5,8.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SignSecurity + entities: + - uid: 407 + components: + - type: Transform + pos: -1.5,6.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: SMESBasic + entities: + - uid: 408 + components: + - type: Transform + pos: -2.5,-4.5 + parent: 1 +- proto: StasisBed + entities: + - uid: 409 + components: + - type: Transform + pos: 1.5,11.5 + parent: 1 +- proto: SubstationWallBasic + entities: + - uid: 410 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -2.5,-5.5 + parent: 1 +- proto: TableGlass + entities: + - uid: 411 + components: + - type: Transform + pos: 1.5,10.5 + parent: 1 + - uid: 412 + components: + - type: Transform + pos: -0.5,12.5 + parent: 1 +- proto: TableReinforced + entities: + - uid: 413 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 + - uid: 414 + components: + - type: Transform + pos: -2.5,13.5 + parent: 1 +- proto: TableWood + entities: + - uid: 415 + components: + - type: Transform + pos: -6.5,10.5 + parent: 1 +- proto: Thruster + entities: + - uid: 416 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,-4.5 + parent: 1 + - uid: 417 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,-4.5 + parent: 1 + - uid: 418 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 2.5,-5.5 + parent: 1 + - uid: 419 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -7.5,-5.5 + parent: 1 + - uid: 420 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,13.5 + parent: 1 + - uid: 421 + components: + - type: Transform + pos: -7.5,14.5 + parent: 1 + - uid: 422 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,13.5 + parent: 1 + - uid: 423 + components: + - type: Transform + pos: 2.5,14.5 + parent: 1 +- proto: VendingMachineMedical + entities: + - uid: 424 + components: + - type: Transform + pos: -0.5,10.5 + parent: 1 +- proto: VendingMachineWallMedical + entities: + - uid: 425 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,13.5 + parent: 1 + - type: Fixtures + fixtures: {} +- proto: WallShuttle + entities: + - uid: 426 + components: + - type: Transform + pos: -7.5,-3.5 + parent: 1 + - uid: 427 + components: + - type: Transform + pos: -7.5,0.5 + parent: 1 + - uid: 428 + components: + - type: Transform + pos: -4.5,4.5 + parent: 1 + - uid: 429 + components: + - type: Transform + pos: -0.5,-1.5 + parent: 1 + - uid: 430 + components: + - type: Transform + pos: 2.5,4.5 + parent: 1 + - uid: 431 + components: + - type: Transform + pos: -7.5,4.5 + parent: 1 + - uid: 432 + components: + - type: Transform + pos: -7.5,8.5 + parent: 1 + - uid: 433 + components: + - type: Transform + pos: -0.5,9.5 + parent: 1 + - uid: 434 + components: + - type: Transform + pos: 0.5,14.5 + parent: 1 + - uid: 435 + components: + - type: Transform + pos: 1.5,-5.5 + parent: 1 + - uid: 436 + components: + - type: Transform + pos: 2.5,0.5 + parent: 1 + - uid: 437 + components: + - type: Transform + pos: -0.5,-2.5 + parent: 1 + - uid: 438 + components: + - type: Transform + pos: -0.5,14.5 + parent: 1 + - uid: 439 + components: + - type: Transform + pos: -0.5,-3.5 + parent: 1 + - uid: 440 + components: + - type: Transform + pos: -1.5,13.5 + parent: 1 + - uid: 441 + components: + - type: Transform + pos: -1.5,12.5 + parent: 1 + - uid: 442 + components: + - type: Transform + pos: -1.5,14.5 + parent: 1 + - uid: 443 + components: + - type: Transform + pos: -4.5,8.5 + parent: 1 + - uid: 444 + components: + - type: Transform + pos: -4.5,6.5 + parent: 1 + - uid: 445 + components: + - type: Transform + pos: -4.5,-3.5 + parent: 1 + - uid: 446 + components: + - type: Transform + pos: -3.5,-1.5 + parent: 1 + - uid: 447 + components: + - type: Transform + pos: 2.5,-3.5 + parent: 1 + - uid: 448 + components: + - type: Transform + pos: 2.5,8.5 + parent: 1 + - uid: 449 + components: + - type: Transform + pos: 1.5,-3.5 + parent: 1 + - uid: 450 + components: + - type: Transform + pos: -4.5,-2.5 + parent: 1 + - uid: 451 + components: + - type: Transform + pos: -6.5,-3.5 + parent: 1 + - uid: 452 + components: + - type: Transform + pos: -4.5,-1.5 + parent: 1 + - uid: 453 + components: + - type: Transform + pos: 1.5,12.5 + parent: 1 + - uid: 454 + components: + - type: Transform + pos: -1.5,-1.5 + parent: 1 + - uid: 455 + components: + - type: Transform + pos: -0.5,6.5 + parent: 1 + - uid: 456 + components: + - type: Transform + pos: -1.5,-5.5 + parent: 1 + - uid: 457 + components: + - type: Transform + pos: -0.5,-5.5 + parent: 1 + - uid: 458 + components: + - type: Transform + pos: -0.5,0.5 + parent: 1 + - uid: 459 + components: + - type: Transform + pos: -1.5,11.5 + parent: 1 + - uid: 460 + components: + - type: Transform + pos: -3.5,10.5 + parent: 1 + - uid: 461 + components: + - type: Transform + pos: 2.5,12.5 + parent: 1 + - uid: 462 + components: + - type: Transform + pos: -6.5,-5.5 + parent: 1 + - uid: 463 + components: + - type: Transform + pos: -6.5,-4.5 + parent: 1 + - uid: 464 + components: + - type: Transform + pos: 1.5,-4.5 + parent: 1 + - uid: 465 + components: + - type: Transform + pos: 1.5,14.5 + parent: 1 + - uid: 466 + components: + - type: Transform + pos: -4.5,0.5 + parent: 1 + - uid: 467 + components: + - type: Transform + pos: -4.5,10.5 + parent: 1 + - uid: 468 + components: + - type: Transform + pos: -4.5,-5.5 + parent: 1 + - uid: 469 + components: + - type: Transform + pos: -0.5,8.5 + parent: 1 + - uid: 470 + components: + - type: Transform + pos: 0.5,-5.5 + parent: 1 + - uid: 471 + components: + - type: Transform + pos: -2.5,-5.5 + parent: 1 + - uid: 472 + components: + - type: Transform + pos: -7.5,10.5 + parent: 1 + - uid: 473 + components: + - type: Transform + pos: -1.5,9.5 + parent: 1 + - uid: 474 + components: + - type: Transform + pos: -1.5,10.5 + parent: 1 + - uid: 475 + components: + - type: Transform + pos: -4.5,7.5 + parent: 1 + - uid: 476 + components: + - type: Transform + pos: -4.5,9.5 + parent: 1 + - uid: 477 + components: + - type: Transform + pos: 1.5,13.5 + parent: 1 + - uid: 478 + components: + - type: Transform + pos: -3.5,-5.5 + parent: 1 + - uid: 479 + components: + - type: Transform + pos: -7.5,9.5 + parent: 1 + - uid: 480 + components: + - type: Transform + pos: -7.5,11.5 + parent: 1 + - uid: 481 + components: + - type: Transform + pos: -2.5,10.5 + parent: 1 + - uid: 482 + components: + - type: Transform + pos: -0.5,7.5 + parent: 1 + - uid: 483 + components: + - type: Transform + pos: -7.5,12.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -0.5,4.5 + parent: 1 +- proto: WallWeaponCapacitorRecharger + entities: + - uid: 485 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,9.5 + parent: 1 +- proto: WeaponCapacitorRecharger + entities: + - uid: 486 + components: + - type: Transform + pos: -2.5,12.5 + parent: 1 +- proto: WindoorSecureSecurityLocked + entities: + - uid: 487 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -1.5,7.5 + parent: 1 +- proto: WindowReinforcedDirectional + entities: + - uid: 489 components: - type: Transform rot: -1.5707963267948966 rad pos: -4.5,-4.5 - parent: 410 - - uid: 448 + parent: 1 + - uid: 490 components: - type: Transform rot: -1.5707963267948966 rad pos: -1.5,8.5 - parent: 410 + parent: 1 - proto: Wrench entities: - - uid: 343 + - uid: 491 components: - type: Transform pos: -2.4217896,-3.4986176 - parent: 410 + parent: 1 ... From b080ce7133994037c570b2f02429d23ed18e0a7a Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 19 Nov 2025 22:16:34 +0000 Subject: [PATCH 094/100] Automatic changelog update --- Resources/Changelog/Changelog.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 024e0c6d5a..41504f6821 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: AreYouConfused - changes: - - message: Bulldog bundle now accurately says what is included - type: Fix - id: 8712 - time: '2025-06-24T21:58:58.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/38558 - author: Dragonjspider changes: - message: The Cutter Machine no longer makes Dark Techmaints floor tiles for free @@ -3925,3 +3918,11 @@ id: 9212 time: '2025-11-19T02:58:33.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/41487 +- author: korczoczek + changes: + - message: Packed's evac shuttle will no longer have its air chamber glass break + upon loading + type: Fix + id: 9213 + time: '2025-11-19T22:15:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/41500 From 91f5138a617501b41e6951aede8ed2519ad13a19 Mon Sep 17 00:00:00 2001 From: Noah Beverly Date: Wed, 19 Nov 2025 21:18:19 -0700 Subject: [PATCH 095/100] Mail Cart (#41482) * Add mailcart crate type * Add recent progress, move location of mailcart.rsi * Allow letters and packages to be inserted * Add updated sprites for mailcart * Add storage for letters * Bugfix for sprite * Add fix for mincount mailcart sprite updates * Add dynamic names to packages in mailcart * Add additional whitelist items * Update tag comments * Remove max item size * Update fixture for mailcart, remove unused code from crates.yml * Add mail cart to cargo ordering * Update meta.json * Remove unused comment * Update copyright * Add missing ContainerContainer * Update ContainerContainer * Revert "Update ContainerContainer" This reverts commit 1805dcd58d8c0f52baca9db0d3173940ee241159. * Remove container slots and increase storage * Remove unused tags * Remove LetterDelivery tag --------- Co-authored-by: Justin Pfeifler --- .../Prototypes/Catalog/Cargo/cargo_cargo.yml | 10 ++ .../Objects/Deliveries/deliveries.yml | 3 + .../Structures/Specific/Cargo/mailcart.yml | 94 ++++++++++++++++++ Resources/Prototypes/tags.yml | 11 +- .../Specific/Cargo/mailcart.rsi/icon.png | Bin 0 -> 959 bytes .../Cargo/mailcart.rsi/mailcart_base.png | Bin 0 -> 959 bytes .../Specific/Cargo/mailcart.rsi/meta.json | 41 ++++++++ .../Specific/Cargo/mailcart.rsi/package_1.png | Bin 0 -> 137 bytes .../Specific/Cargo/mailcart.rsi/package_2.png | Bin 0 -> 137 bytes .../Specific/Cargo/mailcart.rsi/package_3.png | Bin 0 -> 136 bytes .../Specific/Cargo/mailcart.rsi/package_4.png | Bin 0 -> 134 bytes .../Specific/Cargo/mailcart.rsi/package_5.png | Bin 0 -> 170 bytes .../Specific/Cargo/mailcart.rsi/package_6.png | Bin 0 -> 171 bytes .../Specific/Cargo/mailcart.rsi/package_7.png | Bin 0 -> 169 bytes .../Specific/Cargo/mailcart.rsi/package_8.png | Bin 0 -> 170 bytes 15 files changed, 155 insertions(+), 4 deletions(-) create mode 100644 Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/mailcart_base.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/meta.json create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_1.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_3.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_4.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_5.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_7.png create mode 100644 Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml index 050aa647b8..132f1b3c09 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_cargo.yml @@ -37,3 +37,13 @@ cost: 2500 category: cargoproduct-category-name-cargo group: market + +- type: cargoProduct + id: CargoMailCart + icon: + sprite: Objects/Specific/Cargo/mailcart.rsi + state: icon + product: MailCart + cost: 300 + category: cargoproduct-category-name-cargo + group: market diff --git a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml index a011460366..9267009b3e 100644 --- a/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml +++ b/Resources/Prototypes/Entities/Objects/Deliveries/deliveries.yml @@ -102,6 +102,9 @@ containers: delivery: !type:NestedSelector tableId: PackageDeliveryRewards + - type: Tag + tags: + - PackageDelivery - type: entity parent: BaseDelivery diff --git a/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml b/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml new file mode 100644 index 0000000000..4042b115f5 --- /dev/null +++ b/Resources/Prototypes/Entities/Structures/Specific/Cargo/mailcart.yml @@ -0,0 +1,94 @@ +# Mailcart +- type: entity + name: mail cart + id: MailCart + parent: [BaseStructureDynamic, StructureWheeled] + description: Deliver packages with style and efficiency. + components: + - type: Sprite + noRot: true + sprite: Objects/Specific/Cargo/mailcart.rsi + layers: + - state: mailcart_base + - type: InteractionOutline + - type: Storage + grid: + - 0,0,15,7 + quickInsert: true + maxItemSize: Huge + whitelist: + components: + - Delivery + tags: + - Paper + - Document + - BoxCardboard + - Folder + - type: Fixtures + fixtures: + fix1: + shape: + !type:PhysShapeAabb + bounds: "-0.18,-0.2,0.18,0.2" + density: 60 + mask: + - FullTileMask + layer: + - LargeMobLayer + - type: Damageable + damageContainer: Inorganic + damageModifierSet: Metallic + - type: Destructible + thresholds: + - trigger: !type:DamageTrigger + damage: 400 + behaviors: + - !type:DoActsBehavior + acts: ["Destruction"] + - trigger: !type:DamageTrigger + damage: 200 + behaviors: + - !type:EmptyAllContainersBehaviour + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: MetalBreak + - type: ItemMapper + mapLayers: + package_1: + minCount: 1 + whitelist: &PackageWhitelist + tags: + - PackageDelivery + package_2: + minCount: 2 + whitelist: *PackageWhitelist + package_3: + minCount: 3 + whitelist: *PackageWhitelist + package_4: + minCount: 4 + whitelist: *PackageWhitelist + package_5: + minCount: 5 + whitelist: *PackageWhitelist + package_6: + minCount: 6 + whitelist: *PackageWhitelist + package_7: + minCount: 7 + whitelist: *PackageWhitelist + package_8: + minCount: 8 + whitelist: *PackageWhitelist + sprite: Objects/Specific/Cargo/mailcart.rsi + - type: Appearance + - type: UserInterface + interfaces: + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + - type: ContainerContainer + containers: + storagebase: !type:Container + ents: [] diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 44b636495c..274d9447b4 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -159,7 +159,7 @@ id: Bottle # Storage whitelist: ChemMaster, ChemBag, SmartFridge, ClothingBeltJanitor, ClothingBeltMedical, ClothingBeltPlant - type: Tag - id: BoxCardboard # CargoBounty: BountyCardboardBox + id: BoxCardboard # CargoBounty: BountyCardboardBox. Storage whitelist: MailCart - type: Tag id: BoxHug # ConstructionGraph: HugBot @@ -465,7 +465,7 @@ id: DockEmergency # Used bv EmergencyShuttleSystem for finding a priority FTL destination. - type: Tag - id: Document # A superset of Paper tag. Represents a paper-like entity with writing on it, but is not necessarily writeable itself. + id: Document # A superset of Paper tag. Represents a paper-like entity with writing on it, but is not necessarily writeable itself. Storage whitelist: MailCart - type: Tag id: DonkPocket # Storage whitelist: FoodBoxDonkpocket @@ -581,7 +581,7 @@ id: Flower # CargoBounty: flowerwreath. CargoBounty: BountyFlower - type: Tag - id: Folder # Storage whitelist: Bookshelf, NoticeBoard + id: Folder # Storage whitelist: Bookshelf, NoticeBoard, MailCart - type: Tag id: FoodSnack # Storage whitelist: CandyBucket, CandyBowl. ItemMapper: CandyBowl @@ -1024,6 +1024,9 @@ ## P ## +- type: Tag + id: PackageDelivery # ItemMapper: MailCart + - type: Tag id: Packet # Storage whitelist: ClothingBeltChef @@ -1031,7 +1034,7 @@ id: Pancake # CargoBounty: BountyPancake - type: Tag - id: Paper # A writeable piece of paper. Subset of Document tag. SpecialDigestible: OrganMothStomach, OrganReptilianStomach + id: Paper # A writeable piece of paper. Subset of Document tag. SpecialDigestible: OrganMothStomach, OrganReptilianStomach. Storage whitelist: MailCart - type: Tag id: ParadoxCloneObjectiveBlacklist # objective entities with this tag don't get copied to paradox clones diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..eff08d666224eed07b78b8830a32062457fcb18a GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V6OCZ zaSVxQeLHP`zDT&har&cJKR{#F?t*=AttZ(sl>-@Uf=hmC~ z)r=-~`lKlR-|X?L;Nc_Izkg4%Z)I-Jm*aBC{@2AP&3?E3WqaxTxg|L{Hj~|$*8bG~ zb@+OEfQaD7{amwTy2B1G)yP;Hez~(jt3%^K?ZPGo`}=iKs@GXuEC0MOeEZF*XN5~X zN9KVeI~x>M{91BEx=ACev7EhDFMd}do8G2v;bTkvgvTquSrK^sxY|^MWOlD^C(s!XD`vP@UX_-D(+7@*Ef|2DF{ru*LuWNP&9sCNRG&9 z2d58H<|`cwcMY{QY!}F%SvpDgPs!(HGb8V-n#2nKlT>s)v-8SovB!=F41BHza0xxo z_f}6ox9-L5zxIJsZr+?}k>9jo`~PiHp08Iv@KjyMuyhtzLf*TIIl^bywa%RL{ru(R z<}4oP#^2TKHAPvSi&wsvnD&z=%6)%P#hcr0c@a_n?>s8#=}&gwUa@m$Xny0W=Zy+H zWxp+MZVTkv{9bxew!FG^P5oE>u0_IC56c@4?aiAWze|3S;esi$8$1tMEYjG?QxomG z%%ExKrBIzF52^hXIU8q`bTz%ZHLLLA{`l8rFGX7YP5ru;)%0?k%$+0FP`va>r5L-9 zh}cfyc?<y8EUe4XI!{y+~t-s#+e{U#W>T~|gijN(! z>n0yDKF01<)E X&BSfB(c2jq7#KWV{an^LB{Ts5dL+nq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/mailcart_base.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/mailcart_base.png new file mode 100644 index 0000000000000000000000000000000000000000..eff08d666224eed07b78b8830a32062457fcb18a GIT binary patch literal 959 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>V6OCZ zaSVxQeLHP`zDT&har&cJKR{#F?t*=AttZ(sl>-@Uf=hmC~ z)r=-~`lKlR-|X?L;Nc_Izkg4%Z)I-Jm*aBC{@2AP&3?E3WqaxTxg|L{Hj~|$*8bG~ zb@+OEfQaD7{amwTy2B1G)yP;Hez~(jt3%^K?ZPGo`}=iKs@GXuEC0MOeEZF*XN5~X zN9KVeI~x>M{91BEx=ACev7EhDFMd}do8G2v;bTkvgvTquSrK^sxY|^MWOlD^C(s!XD`vP@UX_-D(+7@*Ef|2DF{ru*LuWNP&9sCNRG&9 z2d58H<|`cwcMY{QY!}F%SvpDgPs!(HGb8V-n#2nKlT>s)v-8SovB!=F41BHza0xxo z_f}6ox9-L5zxIJsZr+?}k>9jo`~PiHp08Iv@KjyMuyhtzLf*TIIl^bywa%RL{ru(R z<}4oP#^2TKHAPvSi&wsvnD&z=%6)%P#hcr0c@a_n?>s8#=}&gwUa@m$Xny0W=Zy+H zWxp+MZVTkv{9bxew!FG^P5oE>u0_IC56c@4?aiAWze|3S;esi$8$1tMEYjG?QxomG z%%ExKrBIzF52^hXIU8q`bTz%ZHLLLA{`l8rFGX7YP5ru;)%0?k%$+0FP`va>r5L-9 zh}cfyc?<y8EUe4XI!{y+~t-s#+e{U#W>T~|gijN(! z>n0yDKF01<)E X&BSfB(c2jq7#KWV{an^LB{Ts5dL+nq literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/meta.json b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/meta.json new file mode 100644 index 0000000000..b0ffc8c6ff --- /dev/null +++ b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/meta.json @@ -0,0 +1,41 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Mailcart_base sprite made by noahrb (Github) for SS14; Package_1 through Package_8 sprites made by Emisse (Github) for SS14... and all the fans.", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "mailcart_base" + }, + { + "name": "package_1" + }, + { + "name": "package_2" + }, + { + "name": "package_3" + }, + { + "name": "package_4" + }, + { + "name": "package_5" + }, + { + "name": "package_6" + }, + { + "name": "package_7" + }, + { + "name": "package_8" + } + ] +} diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_1.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8d4632621f81a589ad7ba50dcd788d096c90ad80 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U~u+y zaSVxQO-_(tU7R4&(-dgH<#y16z2^pt^rE%@j13G7&OAGr=JD4^RB786iLk9xnAD;q kthn3`YCtqF1u-z}h-YVM-Kuzlfq{X+)78&qol`;+0CYDeY5)KL literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_2.png new file mode 100644 index 0000000000000000000000000000000000000000..dc35d82b8daf3a906f6a3b28e3a13e04a4accd4c GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U~u+y zaSVxQO-_(tU7R4&(-dgH<#y16y=RF=UdOgy=MNk>U@%*Kw&K^*Assg^C9BMAU~uwu zaSVxQO-_(tU7R4&(-dgH<#y16z2}O-62)7u?3tOF59iFwX}h8yteE88FPLg3Y$^j% gq5)CQU~uqs zaSVxQeS2;pBZB~g%SGkcC$u)DaC&=e3iVkctl~TIkGTGwxhxC}b?I@_ozErXOVxu-JOAffx*+&&t;ucLK6UQqA9fi literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_5.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_5.png new file mode 100644 index 0000000000000000000000000000000000000000..81c7b2b6d9d81c58d9a8bc7aa7b522c234b8c6e7 GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U`X+F zaSVxQeS2;pZ-aq=+e3CoBf;i`3mVfBI7OrmD&1{Towdv}lZhjTSMlhF`cF@b$`zE9 zK9##_^~Dx5o%!nUe%WqaHOt>&Gm~EmhiXMVXT0&Z&GyfC{uT+wj7ZMN^W7aC95E}k XMVi7A5=0po7#KWV{an^LB{Ts507yB& literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_6.png new file mode 100644 index 0000000000000000000000000000000000000000..60cb003b100fac4688af9c9fc76bef06f1245da5 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U`X|J zaSVxQeS2;pZ-aqA>qGgb6eYHU3j%cx3Tc=$x$a{1Hu0T&iABI7#<}@n?Wa%o?lyLG zoVYKl`EX;lU&Bth7k5j}i%s70cx6rSxrJVw(a#xg{B5)S^PRs%f-xhKGxA(_M+ZmD Z-oGME`&VkWGB7YOc)I$ztaD0e0swB@Km-5) literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_7.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_7.png new file mode 100644 index 0000000000000000000000000000000000000000..d7fbf8d563ba15c35febca6e494e45d871f508f9 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U`Y0K zaSVxQeS2;rXM=%+%fsanRuh|VL`3gw@s5a$-q8`g!-bxG`I=VW-@Szh81re_ItBCG%s^rVa~v28%;|)`$PICwVb!S>w{ZprgYhEbr2J Xk*0&&=0!3vFfe$!`njxgN@xNA!#O?_ literal 0 HcmV?d00001 diff --git a/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png b/Resources/Textures/Objects/Specific/Cargo/mailcart.rsi/package_8.png new file mode 100644 index 0000000000000000000000000000000000000000..8363766ecba58432a873bda79ef37a9818ecb08a GIT binary patch literal 170 zcmeAS@N?(olHy`uVBq!ia0y~yU{C;I4mJh`hT^KKFANL}jKx9jP7LeL$-HD>U`X+F zaSVxQeS6N3&%r^Y<>7pdxhEV=vZi|PXz^NGAh^At^K9DWt(;s_{XVNC?JMe<$tWl| zasO$Z)4!KlF&x{p`0L@RzNd4Ix7&PhNsN3~!;rwOoyY%PzC)8Sz*tzf-NnVl?k&sn Yg(6MzI%m%?FfcH9y85}Sb4q9e0NH~(zyJUM literal 0 HcmV?d00001 From fb55064420106f49061fec47c4730e98a44a8b96 Mon Sep 17 00:00:00 2001 From: ThatGuyUSA Date: Wed, 19 Nov 2025 21:07:01 -0800 Subject: [PATCH 096/100] Munitions visibility tweaking and cleanup (#41137) * I didn't make an init commit, 1: because i forgot, 2: because the PR is so tiny, the whole thing is done already * beans and shards no glow, clean up * commented out PointLight, does too little for how straining it would be * Improvised shells now use shards as their bullet sprite, they still don't embed though --- .../Guns/Ammunition/Projectiles/grenade.yml | 12 -------- .../Guns/Ammunition/Projectiles/shotgun.yml | 28 +++++-------------- .../Weapons/Guns/Projectiles/projectiles.yml | 5 ++++ 3 files changed, 12 insertions(+), 33 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml index 02aab56f7b..822c1fea17 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/grenade.yml @@ -4,9 +4,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: @@ -23,9 +20,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: @@ -40,9 +34,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletIncendiary components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot-flare - type: Projectile deleteOnCollide: false damage: @@ -61,9 +52,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile deleteOnCollide: false damage: diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml index 63d07eb2f2..070ce21171 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/shotgun.yml @@ -22,7 +22,9 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot + layers: + - state: bullet #just reapplying to here so it can be shaded + - type: Projectile damage: types: @@ -36,9 +38,6 @@ categories: [ HideSpawnMenu ] parent: BaseBullet components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -62,9 +61,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletIncendiary components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot-flare - type: Projectile damage: types: @@ -89,9 +85,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletPractice components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -115,7 +108,9 @@ components: - type: Sprite sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: shard + layers: + - state: shard + shader: unshaded - type: Projectile damage: types: @@ -138,9 +133,6 @@ categories: [ HideSpawnMenu ] parent: BaseBulletPractice components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - state: buckshot - type: Projectile damage: types: @@ -204,13 +196,8 @@ id: PelletShotgunUranium name: pellet (.50 uranium) categories: [ HideSpawnMenu ] - parent: BaseBullet + parent: BaseBulletUranium components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - layers: - - state: uranium - shader: unshaded - type: Projectile damage: types: @@ -266,7 +253,6 @@ sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi layers: - state: shard - shader: unshaded - type: EmbeddableProjectile deleteOnRemove: true - type: Projectile diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index c52a49b09b..132bd267fd 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -178,6 +178,11 @@ sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi layers: - state: uranium + shader: unshaded + # - type: PointLight // Too resource intensive for what little effect it has, one day... + # enabled: true + # color: "#059919" + # radius: 2.0 - type: Projectile damage: types: From 8d4888b726aa51e4fb64b9d1405d3b13c6e1ac0c Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Fri, 21 Nov 2025 23:48:00 +0100 Subject: [PATCH 097/100] HOTFIX Add logging to gamepreset fallback (#41522) * Add logging to gamepreset fallback * cleanup --- Content.Server/GameTicking/GameTicker.GamePreset.cs | 6 ++++++ Content.Server/GameTicking/Rules/GameRuleSystem.cs | 6 +++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/Content.Server/GameTicking/GameTicker.GamePreset.cs b/Content.Server/GameTicking/GameTicker.GamePreset.cs index 69cc1c4165..1973daa5a1 100644 --- a/Content.Server/GameTicking/GameTicker.GamePreset.cs +++ b/Content.Server/GameTicking/GameTicker.GamePreset.cs @@ -35,6 +35,7 @@ public sealed partial class GameTicker private bool StartPreset(ICommonSession[] origReadyPlayers, bool force) { + _sawmill.Info($"Attempting to start preset '{CurrentPreset?.ID}'"); var startAttempt = new RoundStartAttemptEvent(origReadyPlayers, force); RaiseLocalEvent(startAttempt); @@ -56,9 +57,12 @@ public sealed partial class GameTicker var fallbackPresets = _cfg.GetCVar(CCVars.GameLobbyFallbackPreset).Split(","); var startFailed = true; + _sawmill.Info($"Fallback - Failed to start round, attempting to start fallback presets."); foreach (var preset in fallbackPresets) { + _sawmill.Info($"Fallback - Clearing up gamerules"); ClearGameRules(); + _sawmill.Info($"Fallback - Attempting to start '{preset}'"); SetGamePreset(preset, resetDelay: 1); AddGamePresetRules(); StartGamePresetRules(); @@ -76,6 +80,7 @@ public sealed partial class GameTicker startFailed = false; break; } + _sawmill.Info($"Fallback - '{preset}' failed to start."); } if (startFailed) @@ -87,6 +92,7 @@ public sealed partial class GameTicker else { + _sawmill.Info($"Fallback - Failed to start preset but fallbacks are disabled. Returning to Lobby."); FailedPresetRestart(); return false; } diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs index cb5b117549..6b4240dd7f 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs @@ -38,6 +38,8 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon while (query.MoveNext(out var uid, out _, out var gameRule)) { var minPlayers = gameRule.MinPlayers; + var name = ToPrettyString(uid); + if (args.Players.Length >= minPlayers) continue; @@ -46,8 +48,10 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon ChatManager.SendAdminAnnouncement(Loc.GetString("preset-not-enough-ready-players", ("readyPlayersCount", args.Players.Length), ("minimumPlayers", minPlayers), - ("presetName", ToPrettyString(uid)))); + ("presetName", name))); args.Cancel(); + //TODO remove this once announcements are logged + Log.Info($"Rule '{name}' requires {minPlayers} players, but only {args.Players.Length} are ready."); } else { From 5e294dcecccca26228856e8ab614175cb819fc9e Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Sun, 23 Nov 2025 14:14:12 +0100 Subject: [PATCH 098/100] Revert 39040 FTL Fixes (#41540) Revert "FTL Fixes (#39040)" This reverts commit 52a9f9b576f5f75f4ad40c2b824b52bddf1e8825. --- .../Systems/ShuttleSystem.FasterThanLight.cs | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs index 4ca0b53035..a63359077f 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.FasterThanLight.cs @@ -801,7 +801,11 @@ public sealed partial class ShuttleSystem while (iteration < FTLProximityIterations) { grids.Clear(); - _mapManager.FindGridsIntersecting(mapId, targetAABB, ref grids); + // We pass in an expanded offset here so we can safely do a random offset later. + // We don't include this in the actual targetAABB because then we would be double-expanding it. + // Once in this loop, then again when placing the shuttle later. + // Note that targetAABB already has expansionAmount factored in already. + _mapManager.FindGridsIntersecting(mapId, targetAABB.Enlarged(maxOffset), ref grids); foreach (var grid in grids) { @@ -834,10 +838,6 @@ public sealed partial class ShuttleSystem if (nearbyGrids.Contains(uid)) continue; - // We pass in an expanded offset here so we can safely do a random offset later. - // We don't include this in the actual targetAABB because then we would be double-expanding it. - // Once in this loop, then again when placing the shuttle later. - // Note that targetAABB already has expansionAmount factored in already. targetAABB = targetAABB.Union( _transform.GetWorldMatrix(uid) .TransformBox(Comp(uid).LocalAABB.Enlarged(expansionAmount))); @@ -857,7 +857,7 @@ public sealed partial class ShuttleSystem // TODO: This should prefer the position's angle instead. // TODO: This is pretty crude for multiple landings. - if (nearbyGrids.Count >= 1) + if (nearbyGrids.Count > 1 || !HasComp(targetXform.GridUid)) { // Pick a random angle var offsetAngle = _random.NextAngle(); @@ -866,9 +866,13 @@ public sealed partial class ShuttleSystem var minRadius = MathF.Max(targetAABB.Width / 2f, targetAABB.Height / 2f); spawnPos = targetAABB.Center + offsetAngle.RotateVec(new Vector2(_random.NextFloat(minRadius + minOffset, minRadius + maxOffset), 0f)); } + else if (shuttleBody != null) + { + (spawnPos, angle) = _transform.GetWorldPositionRotation(targetXform); + } else { - spawnPos = _transform.ToWorldPosition(targetCoordinates); + spawnPos = _transform.GetWorldPosition(targetXform); } var offset = Vector2.Zero; @@ -889,10 +893,10 @@ public sealed partial class ShuttleSystem } // Rotate our localcenter around so we spawn exactly where we "think" we should (center of grid on the dot). - var transform = new Transform(_transform.ToWorldPosition(xform.Coordinates), angle); - var adjustedOffset = Robust.Shared.Physics.Transform.Mul(transform, offset); + var transform = new Transform(spawnPos, angle); + spawnPos = Robust.Shared.Physics.Transform.Mul(transform, offset); - coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos + adjustedOffset); + coordinates = new EntityCoordinates(targetXform.MapUid.Value, spawnPos - offset); return true; } From 542524c4da3e6767a38535c6b49aa200403b3cb5 Mon Sep 17 00:00:00 2001 From: Dmitry <57028746+DIMMoon1@users.noreply.github.com> Date: Tue, 25 Nov 2025 05:58:41 +0700 Subject: [PATCH 099/100] ftlfix --- .../ru-RU/guidebook/chemistry/conditions.ftl | 41 ------------------- .../guidebook/entity-effects/conditions.ftl | 18 ++++---- 2 files changed, 9 insertions(+), 50 deletions(-) diff --git a/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl b/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl index bf570f0d88..c69dc0d4d2 100644 --- a/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/chemistry/conditions.ftl @@ -25,44 +25,3 @@ reagent-effect-condition-guidebook-reagent-threshold = *[other] имеет между { NATURALFIXED($min, 2) } ед. и { NATURALFIXED($max, 2) } ед. { $reagent } } } -reagent-effect-condition-guidebook-mob-state-condition = пациент в { $state } -reagent-effect-condition-guidebook-job-condition = должность цели — { $job } -reagent-effect-condition-guidebook-solution-temperature = - температура раствора составляет { $max -> - [2147483648] не менее { NATURALFIXED($min, 2) }k - *[other] - { $min -> - [0] не более { NATURALFIXED($max, 2) }k - *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k - } - } -reagent-effect-condition-guidebook-body-temperature = - температура тела составляет { $max -> - [2147483648] не менее { NATURALFIXED($min, 2) }k - *[other] - { $min -> - [0] не более { NATURALFIXED($max, 2) }k - *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k - } - } -reagent-effect-condition-guidebook-organ-type = - метаболизирующий орган { $shouldhave -> - [true] это - *[false] это не - } { $name } орган -reagent-effect-condition-guidebook-has-tag = - цель { $invert -> - [true] не имеет - *[false] имеет - } метку { $tag } -reagent-effect-condition-guidebook-this-reagent = этот реагент -reagent-effect-condition-guidebook-breathing = - цель { $isBreathing -> - [true] дышит нормально - *[false] задыхается - } -reagent-effect-condition-guidebook-internals = - цель { $usingInternals -> - [true] использует дыхательную маску - *[false] дышит атмосферным газом - } diff --git a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl index 1793a61eb4..318df73484 100644 --- a/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl +++ b/Resources/Locale/ru-RU/guidebook/entity-effects/conditions.ftl @@ -43,9 +43,9 @@ entity-condition-guidebook-reagent-threshold = *[other] имеет между { NATURALFIXED($min, 2) } ед. и { NATURALFIXED($max, 2) } ед. { $reagent } } } -reagent-effect-condition-guidebook-mob-state-condition = пациент в { $state } -reagent-effect-condition-guidebook-job-condition = должность цели — { $job } -reagent-effect-condition-guidebook-solution-temperature = +entity-condition-guidebook-mob-state-condition = пациент в { $state } +entity-condition-guidebook-job-condition = должность цели — { $job } +entity-condition-guidebook-solution-temperature = температура раствора составляет { $max -> [2147483648] не менее { NATURALFIXED($min, 2) }k *[other] @@ -54,7 +54,7 @@ reagent-effect-condition-guidebook-solution-temperature = *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k } } -reagent-effect-condition-guidebook-body-temperature = +entity-condition-guidebook-body-temperature = температура тела составляет { $max -> [2147483648] не менее { NATURALFIXED($min, 2) }k *[other] @@ -63,23 +63,23 @@ reagent-effect-condition-guidebook-body-temperature = *[other] между { NATURALFIXED($min, 2) }k и { NATURALFIXED($max, 2) }k } } -reagent-effect-condition-guidebook-organ-type = +entity-condition-guidebook-organ-type = метаболизирующий орган { $shouldhave -> [true] это *[false] это не } { $name } орган -reagent-effect-condition-guidebook-has-tag = +entity-condition-guidebook-has-tag = цель { $invert -> [true] не имеет *[false] имеет } метку { $tag } -reagent-effect-condition-guidebook-this-reagent = этот реагент -reagent-effect-condition-guidebook-breathing = +entity-condition-guidebook-this-reagent = этот реагент +entity-condition-guidebook-breathing = цель { $isBreathing -> [true] дышит нормально *[false] задыхается } -reagent-effect-condition-guidebook-internals = +entity-effect-condition-guidebook-internals = цель { $usingInternals -> [true] использует дыхательную маску *[false] дышит атмосферным газом From d3fb690932ecbbfa531fd055d9eb029042893b12 Mon Sep 17 00:00:00 2001 From: Dmitry <57028746+DIMMoon1@users.noreply.github.com> Date: Tue, 25 Nov 2025 06:15:03 +0700 Subject: [PATCH 100/100] okak --- Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml b/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml index 095256b9f4..80bed2d10b 100644 --- a/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Corvax/Loadouts/role_loadouts.yml @@ -84,7 +84,6 @@ - SeniorOfficerBelt - SurvivalSecurity - Trinkets - - SecurityStar - GroupSpeciesBreathToolSecurity # Medical