From e0c084124f36f6ab502698dcd5ae8b869290a69f Mon Sep 17 00:00:00 2001 From: Steve Date: Sun, 25 Jan 2026 03:58:23 -0500 Subject: [PATCH 1/2] firefighter backpack --- .../Fluids/EntitySystems/SpraySystem.cs | 60 +++++++++- .../Components/AtmosResinDespawnComponent.cs | 12 ++ .../EntitySystems/AtmosResinDespawnSystem.cs | 75 +++++++++++++ .../SlotBasedConnectedContainerComponent.cs | 7 ++ .../SlotBasedConnectedContainerSystem.cs | 21 ++++ .../Fluids/Components/SprayComponent.cs | 14 +++ .../FirefighterTankRefillableComponent.cs | 41 +++++++ .../FirefighterTankRefillableSystem.cs | 106 ++++++++++++++++++ .../firefighter-nozzle-component.ftl | 3 + .../Catalog/Fills/Lockers/engineer.yml | 1 + .../Entities/Clothing/Back/specific.yml | 47 ++++++++ .../Entities/Effects/chemistry_effects.yml | 26 +++++ .../Objects/Tools/firefighting-nozzle.yml | 79 +++++++++++++ Resources/Prototypes/_Funkystation/tags.yml | 9 ++ .../equipped-BACKPACK.png | Bin 0 -> 1037 bytes .../Backpacks/atmosbackpacktank.rsi/icon.png | Bin 0 -> 467 bytes .../atmosbackpacktank.rsi/inhand-left.png | Bin 0 -> 573 bytes .../atmosbackpacktank.rsi/inhand-right.png | Bin 0 -> 578 bytes .../Backpacks/atmosbackpacktank.rsi/meta.json | 26 +++++ .../_Funkystation/Effects/resin.rsi/meta.json | 40 +++++++ .../Effects/resin.rsi/resin-dissolve.png | Bin 0 -> 6142 bytes .../Effects/resin.rsi/resin-east.png | Bin 0 -> 6619 bytes .../Effects/resin.rsi/resin-north.png | Bin 0 -> 6472 bytes .../Effects/resin.rsi/resin-south.png | Bin 0 -> 6537 bytes .../Effects/resin.rsi/resin-west.png | Bin 0 -> 6755 bytes .../_Funkystation/Effects/resin.rsi/resin.png | Bin 0 -> 2197 bytes .../equipped-BELT.png | Bin 0 -> 218 bytes .../frozen-smoke-capsule.rsi/icon.png | Bin 0 -> 163 bytes .../frozen-smoke-capsule.rsi/meta.json | 21 ++++ .../frozen-smoke-capsule.rsi/primed.png | Bin 0 -> 163 bytes .../Basic/extinguishernozzle.rsi/icon.png | Bin 0 -> 412 bytes .../extinguishernozzle.rsi/inhand-left.png | Bin 0 -> 874 bytes .../extinguishernozzle.rsi/inhand-right.png | Bin 0 -> 901 bytes .../Basic/extinguishernozzle.rsi/meta.json | 22 ++++ 34 files changed, 609 insertions(+), 1 deletion(-) create mode 100644 Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs create mode 100644 Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs create mode 100644 Content.Shared/_Funkystation/Atmos/Components/FirefighterTankRefillableComponent.cs create mode 100644 Content.Shared/_Funkystation/Atmos/Systems/FirefighterTankRefillableSystem.cs create mode 100644 Resources/Locale/en-US/_Funkystation/tools/components/firefighter-nozzle-component.ftl create mode 100644 Resources/Prototypes/_Funkystation/Entities/Clothing/Back/specific.yml create mode 100644 Resources/Prototypes/_Funkystation/Entities/Effects/chemistry_effects.yml create mode 100644 Resources/Prototypes/_Funkystation/Entities/Objects/Tools/firefighting-nozzle.yml create mode 100644 Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/equipped-BACKPACK.png create mode 100644 Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/icon.png create mode 100644 Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-left.png create mode 100644 Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-right.png create mode 100644 Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/meta.json create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/meta.json create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin-dissolve.png create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin-east.png create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin-north.png create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin-south.png create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin-west.png create mode 100644 Resources/Textures/_Funkystation/Effects/resin.rsi/resin.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/equipped-BELT.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/icon.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/meta.json create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/primed.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/icon.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/inhand-left.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/inhand-right.png create mode 100644 Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/meta.json diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index e3cb9a00c7e..384b2681a63 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -42,6 +42,9 @@ using Content.Shared.Fluids.Components; using Robust.Server.Containers; using Robust.Shared.Map; +using Content.Shared.Inventory; // Funky atmos - firefighter backpack +using Content.Shared.Whitelist; +using Content.Shared.Hands.EntitySystems; // Funky atmos - firefighter backpack namespace Content.Server.Fluids.EntitySystems; @@ -59,6 +62,10 @@ public sealed class SpraySystem : SharedSpraySystem [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly IConfigurationManager _cfg = default!; [Dependency] private readonly ContainerSystem _container = default!; + [Dependency] private readonly InventorySystem _inventory = default!; // Funky atmos - firefighter backpack + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; // Funky atmos - firefighter backpack + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; // Assmos - Extinguisher Nozzle + private float _gridImpulseMultiplier; @@ -111,8 +118,22 @@ public override void Spray(Entity entity, EntityUid? user = null public override void Spray(Entity entity, MapCoordinates mapcoord, EntityUid? user = null) { - if (!_solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out var soln, out var solution)) + // Funky atmos - firefighter backpack + var sprayOwner = entity.Owner; + var solutionName = entity.Comp.Solution; + + if (entity.Comp.ExternalContainer) + { + TryFindExternalProvider(entity, user, ref sprayOwner, ref solutionName); + } + + if (!_solutionContainer.TryGetSolution(sprayOwner, solutionName, out var soln, out var solution)) return; + // Funky atmos - end of changes + + // Funky - Uncomment and delete above block to revert + // if (!_solutionContainer.TryGetSolution(entity.Owner, entity.Comp.Solution, out var soln, out var solution)) + // return; var ev = new SprayAttemptEvent(user); RaiseLocalEvent(entity, ref ev); @@ -232,4 +253,41 @@ public override void Spray(Entity entity, MapCoordinates mapcoor _useDelay.TryResetDelay(entity); } + + private void TryFindExternalProvider(Entity entity, EntityUid? user, ref EntityUid sprayOwner, ref string solutionName) + { + if (!entity.Comp.ExternalContainer) + return; + + if (user == null) + return; + + foreach (var item in _handsSystem.EnumerateHeld(user.Value)) + { + if (item == entity.Owner) + continue; + + if (!_whitelistSystem.IsWhitelistFailOrNull(entity.Comp.ProviderWhitelist, item) && + _solutionContainer.TryGetSolution(item, entity.Comp.TankSolutionName, out _, out _)) + { + sprayOwner = item; + solutionName = entity.Comp.TankSolutionName; + return; + } + } + + if (_inventory.TryGetContainerSlotEnumerator(user.Value, out var enumerator, entity.Comp.TargetSlot)) + { + while (enumerator.NextItem(out var item)) + { + if (!_whitelistSystem.IsWhitelistFailOrNull(entity.Comp.ProviderWhitelist, item) && + _solutionContainer.TryGetSolution(item, entity.Comp.TankSolutionName, out _, out _)) + { + sprayOwner = item; + solutionName = entity.Comp.TankSolutionName; + return; + } + } + } + } } diff --git a/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs b/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs new file mode 100644 index 00000000000..0e165413247 --- /dev/null +++ b/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs @@ -0,0 +1,12 @@ +using Content.Server._Funkystation.Atmos.EntitySystems; + +namespace Content.Server._Funkystation.Atmos.Components; + +/// +/// Assmos - Extinguisher Nozzle +/// When a TimedDespawnComponent" despawns, another one will be spawned in its place. +/// +[RegisterComponent, Access(typeof(AtmosResinDespawnSystem))] +public sealed partial class AtmosResinDespawnComponent : Component +{ +} diff --git a/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs b/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs new file mode 100644 index 00000000000..e7c64eb672e --- /dev/null +++ b/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs @@ -0,0 +1,75 @@ +using Content.Server._Funkystation.Atmos.Components; +using Robust.Shared.Spawners; +using Content.Shared.Atmos; +using Content.Server.Atmos.EntitySystems; + +namespace Content.Server._Funkystation.Atmos.EntitySystems; + + +/// +/// Assmos - Extinguisher Nozzle +/// Sets atmospheric temperature to 20C and removes all toxins. +/// +public sealed class AtmosResinDespawnSystem : EntitySystem +{ + [Dependency] private readonly AtmosphereSystem _atmo = default!; + [Dependency] private readonly GasTileOverlaySystem _gasOverlaySystem = default!; + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnDespawn); + } + + private void OnDespawn(EntityUid uid, AtmosResinDespawnComponent comp, ref TimedDespawnEvent args) + { + if (!TryComp(uid, out TransformComponent? xform)) + return; + + var mix = _atmo.GetContainingMixture(uid, true); + GasMixture tempMix = new(); + if (mix is null) return; + + var gasesToRemove = new[] + { + Gas.WaterVapor, + Gas.CarbonDioxide, + Gas.Plasma, + Gas.Tritium, + Gas.Ammonia, + Gas.NitrousOxide, + Gas.Frezon, + Gas.BZ, + Gas.Healium, + Gas.Nitrium, + Gas.Hydrogen, + Gas.HyperNoblium, + Gas.ProtoNitrate, + Gas.Zauker, + Gas.Halon, + Gas.Helium, + Gas.AntiNoblium + }; + + float totalMolesRemoved = 0f; + + foreach (var gas in gasesToRemove) + { + float moles = mix.GetMoles(gas); + if (moles > 0) + { + totalMolesRemoved += moles; + mix.AdjustMoles(gas, -moles); + } + } + + if (totalMolesRemoved > 0) + { + tempMix.AdjustMoles(Gas.WaterVapor, totalMolesRemoved); + } + + _atmo.Merge(mix, tempMix); + mix.Temperature = Atmospherics.T20C; + _gasOverlaySystem.UpdateSessions(); + } +} diff --git a/Content.Shared/Chemistry/Components/SlotBasedConnectedContainerComponent.cs b/Content.Shared/Chemistry/Components/SlotBasedConnectedContainerComponent.cs index 927e5d34ba3..a68d80f67d3 100644 --- a/Content.Shared/Chemistry/Components/SlotBasedConnectedContainerComponent.cs +++ b/Content.Shared/Chemistry/Components/SlotBasedConnectedContainerComponent.cs @@ -25,4 +25,11 @@ public sealed partial class SlotBasedConnectedContainerComponent : Component /// [DataField] public EntityWhitelist? ContainerWhitelist; + + /// + /// If true, also check the user's active hands for a valid provider. + /// Funky atmos - firefighter backpack + /// + [DataField] + public bool CheckHands = false; } diff --git a/Content.Shared/Containers/SlotBasedConnectedContainerSystem.cs b/Content.Shared/Containers/SlotBasedConnectedContainerSystem.cs index b9c8b09c1e9..b9ed137b8b4 100644 --- a/Content.Shared/Containers/SlotBasedConnectedContainerSystem.cs +++ b/Content.Shared/Containers/SlotBasedConnectedContainerSystem.cs @@ -3,6 +3,7 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.Chemistry.Components; +using Content.Shared.Hands.EntitySystems; using Content.Shared.Inventory; using Content.Shared.Whitelist; using Robust.Shared.Containers; @@ -18,6 +19,7 @@ public sealed class SlotBasedConnectedContainerSystem : EntitySystem [Dependency] private readonly SharedContainerSystem _containers = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly SharedHandsSystem _hands = default!; // Funky atmos - firefighter backpack /// public override void Initialize() @@ -59,6 +61,25 @@ private bool TryGetConnectedContainer(EntityUid uid, SlotFlags slotFlag, EntityW return false; var user = container.Owner; + + // Funky atmos - firefighter backpack + // Check hands for connected container + if (TryComp(uid, out var comp) && comp.CheckHands) + { + foreach (var held in _hands.EnumerateHeld(user)) + { + if (held == uid) // don't pick active hand + continue; + + if (!_whitelistSystem.IsWhitelistFailOrNull(providerWhitelist, held)) + { + slotEntity = held; + return true; + } + } + } + // Funky atmos - end of changes + if (!_inventory.TryGetContainerSlotEnumerator(user, out var enumerator, slotFlag)) return false; diff --git a/Content.Shared/Fluids/Components/SprayComponent.cs b/Content.Shared/Fluids/Components/SprayComponent.cs index 40e4fe062cd..8bc088aedea 100644 --- a/Content.Shared/Fluids/Components/SprayComponent.cs +++ b/Content.Shared/Fluids/Components/SprayComponent.cs @@ -28,6 +28,8 @@ using Content.Shared.Fluids.EntitySystems; using Robust.Shared.Audio; using Robust.Shared.Prototypes; +using Content.Shared.Inventory; // Funky atmos - firefighter backpack +using Content.Shared.Whitelist; // Funky atmos - firefighter backpack namespace Content.Shared.Fluids.Components; @@ -38,6 +40,9 @@ public sealed partial class SprayComponent : Component [DataField] public string Solution = "spray"; + [DataField] + public string TankSolutionName = "tank"; // Funky atmos - firefighter backpack + [DataField] public FixedPoint2 TransferAmount = 10; @@ -68,4 +73,13 @@ public sealed partial class SprayComponent : Component [DataField] public LocId SprayEmptyPopupMessage = "spray-component-is-empty-message"; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public SlotFlags TargetSlot; // Funky atmos - firefighter backpack + + [ViewVariables(VVAccess.ReadWrite), DataField] + public EntityWhitelist? ProviderWhitelist; // Funky atmos - firefighter backpack + + [ViewVariables(VVAccess.ReadWrite), DataField] + public bool ExternalContainer = false; // Funky atmos - firefighter backpack } diff --git a/Content.Shared/_Funkystation/Atmos/Components/FirefighterTankRefillableComponent.cs b/Content.Shared/_Funkystation/Atmos/Components/FirefighterTankRefillableComponent.cs new file mode 100644 index 00000000000..d4f4a241189 --- /dev/null +++ b/Content.Shared/_Funkystation/Atmos/Components/FirefighterTankRefillableComponent.cs @@ -0,0 +1,41 @@ +using Content.Shared.Chemistry.Reagent; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Content.Shared.Inventory; +using Content.Shared.Whitelist; + +namespace Content.Shared._Funkystation.Atmos.Components; + +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] +public sealed partial class FirefighterTankRefillableComponent : Component +{ + [DataField, AutoNetworkedField] + public bool Enabled; + + /// + /// Name of solution/>. + /// + public const string SolutionName = "tank"; + + /// + /// Reagent that will be used in backpack. + /// + [DataField] + public ProtoId TankReagent = "Water"; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public SlotFlags TargetSlot; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public EntityWhitelist? ProviderWhitelist; + + [ViewVariables(VVAccess.ReadWrite), DataField] + public bool ExternalContainer = false; + + /// + /// Sound played when refilling the backpack. + /// + [DataField] + public SoundSpecifier FirefightingNozzleRefill = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); +} diff --git a/Content.Shared/_Funkystation/Atmos/Systems/FirefighterTankRefillableSystem.cs b/Content.Shared/_Funkystation/Atmos/Systems/FirefighterTankRefillableSystem.cs new file mode 100644 index 00000000000..836967695d1 --- /dev/null +++ b/Content.Shared/_Funkystation/Atmos/Systems/FirefighterTankRefillableSystem.cs @@ -0,0 +1,106 @@ +// Funky atmos - firefighter backpack + +using Content.Shared.Chemistry.Components; +using Content.Shared.DoAfter; +using Content.Shared.FixedPoint; +using Content.Shared.Interaction; +using Content.Shared.Inventory; +using Content.Shared.Whitelist; +using Content.Shared._Funkystation.Atmos.Components; +using Content.Shared.Chemistry.EntitySystems; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Popups; +using Robust.Shared.Audio.Systems; + +namespace Content.Shared._Funkystation.Atmos.Systems; + +public sealed class FirefighterTankRefillableSystem : EntitySystem +{ + [Dependency] private readonly InventorySystem _inventory = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly SharedPopupSystem _popup = default!; + [Dependency] private readonly SharedAudioSystem _audioSystem = default!; + [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; + [Dependency] private readonly SharedSolutionContainerSystem _solutionContainerSystem = default!; + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnFirefightingNozzleAfterInteract); + } + + private void OnFirefightingNozzleAfterInteract(Entity entity, ref AfterInteractEvent args) + { + var sprayOwner = entity.Owner; + var solutionName = FirefighterTankRefillableComponent.SolutionName; + + if (args.Handled) + return; + + if (args.Target is not { Valid: true } target || !args.CanReach) + return; + + if (TryComp(target, out ReagentTankComponent? tank) && tank.TankType == ReagentTankType.Fuel) + return; + + if (entity.Comp.ExternalContainer) + { + bool foundContainer = false; + + // Check held items (exclude nozzle itself) + foreach (var item in _handsSystem.EnumerateHeld(args.User)) + { + if (item == entity.Owner) + continue; + + if (!_whitelistSystem.IsWhitelistFailOrNull(entity.Comp.ProviderWhitelist, item) && + _solutionContainerSystem.TryGetSolution(item, FirefighterTankRefillableComponent.SolutionName, out _, out _)) + { + sprayOwner = item; + solutionName = FirefighterTankRefillableComponent.SolutionName; + foundContainer = true; + break; + } + } + + // Fall back to target slot + if (!foundContainer && _inventory.TryGetContainerSlotEnumerator(args.User, out var enumerator, entity.Comp.TargetSlot)) + { + while (enumerator.NextItem(out var item)) + { + if (!_whitelistSystem.IsWhitelistFailOrNull(entity.Comp.ProviderWhitelist, item) && + _solutionContainerSystem.TryGetSolution(item, FirefighterTankRefillableComponent.SolutionName, out _, out _)) + { + sprayOwner = item; + solutionName = FirefighterTankRefillableComponent.SolutionName; + foundContainer = true; + break; + } + } + } + } + + if (_solutionContainerSystem.TryGetDrainableSolution(target, out var targetSoln, out var targetSolution) + && _solutionContainerSystem.TryGetSolution(sprayOwner, solutionName, out var solutionComp, out var atmosBackpackTankSolution)) + { + var trans = FixedPoint2.Min(atmosBackpackTankSolution.AvailableVolume, targetSolution.Volume); + if (trans > 0) + { + var drained = _solutionContainerSystem.Drain(target, targetSoln.Value, trans); + _solutionContainerSystem.TryAddSolution(solutionComp.Value, drained); + _audioSystem.PlayPredicted(entity.Comp.FirefightingNozzleRefill, entity, user: args.User); + _popup.PopupClient(Loc.GetString("firefighter-nozzle-component-after-interact-refilled-message"), entity, args.User); + } + else if (atmosBackpackTankSolution.AvailableVolume <= 0) + { + _popup.PopupClient(Loc.GetString("firefighter-nozzle-component-already-full"), entity, args.User); + } + else + { + _popup.PopupClient(Loc.GetString("firefighter-nozzle-component-no-water-in-tank", ("owner", args.Target)), entity, args.User); + } + + args.Handled = true; + } + } +} diff --git a/Resources/Locale/en-US/_Funkystation/tools/components/firefighter-nozzle-component.ftl b/Resources/Locale/en-US/_Funkystation/tools/components/firefighter-nozzle-component.ftl new file mode 100644 index 00000000000..6e84cb5c5db --- /dev/null +++ b/Resources/Locale/en-US/_Funkystation/tools/components/firefighter-nozzle-component.ftl @@ -0,0 +1,3 @@ +firefighter-nozzle-component-no-water-in-tank = The {$owner} is empty. +firefighter-nozzle-component-after-interact-refilled-message = Refilled! +firefighter-nozzle-component-already-full = The backpack water tank is already full. diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index 031b22bd3e7..ee4f3b7f764 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -190,6 +190,7 @@ - id: RPD - id: RCDAmmo - id: AirGrenade + - id: ClothingBackpackFirefighterTank # Funkystation - type: entityTable id: FillAtmosphericsHardsuit diff --git a/Resources/Prototypes/_Funkystation/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/_Funkystation/Entities/Clothing/Back/specific.yml new file mode 100644 index 00000000000..b068d7f31fc --- /dev/null +++ b/Resources/Prototypes/_Funkystation/Entities/Clothing/Back/specific.yml @@ -0,0 +1,47 @@ +- type: entity + parent: Clothing + id: ClothingBackpackFirefighterTank + name: backpack firefighter tank + description: A refrigerated backpack water tank that can switch modes to launch ATMOS resin or work as a high pressure extinguisher. + components: + - type: Tag + tags: + - AtmosBackTank + - WhitelistChameleon + - type: Sprite + sprite: _Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi + state: icon + - type: Item + size: Ginormous + - type: Clothing + slots: BACK + sprite: _Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi + - type: SolutionAmmoProvider + solutionId: tank + proto: AtmosResin + fireCost: 25 + - type: SolutionContainerManager + solutions: + tank: + maxVol: 1200 + reagents: + - ReagentId: Water + Quantity: 1200 + - type: DrawableSolution + solution: tank + - type: DrainableSolution + solution: tank + - type: ExaminableSolution + solution: tank + - type: ItemSlots + slots: + nozzle_slot: + name: FirefighterNozzle + startingItem: FirefighterNozzle + whitelist: + tags: + - Nozzle + - type: FirefighterTankRefillable + - type: ContainerContainer + containers: + nozzle_slot: !type:ContainerSlot diff --git a/Resources/Prototypes/_Funkystation/Entities/Effects/chemistry_effects.yml b/Resources/Prototypes/_Funkystation/Entities/Effects/chemistry_effects.yml new file mode 100644 index 00000000000..0e4772b7dfd --- /dev/null +++ b/Resources/Prototypes/_Funkystation/Entities/Effects/chemistry_effects.yml @@ -0,0 +1,26 @@ +- type: entity + parent: BaseFoam + id: Resin + name: resin + categories: [ HideSpawnMenu ] + components: + - type: Sprite + color: "#ffffffcc" + sprite: _Funkystation/Effects/resin.rsi + layers: + - state: resin + map: ["enum.FoamVisualLayers.Base"] + - map: [ "enum.EdgeLayer.South" ] + state: resin-south + - map: [ "enum.EdgeLayer.East" ] + state: resin-east + - map: [ "enum.EdgeLayer.North" ] + state: resin-north + - map: [ "enum.EdgeLayer.West" ] + state: resin-west + - type: SmoothEdge + - type: IconSmooth + mode: NoSprite + - type: FoamVisuals + animationTime: 0.6 + animationState: resin-dissolve diff --git a/Resources/Prototypes/_Funkystation/Entities/Objects/Tools/firefighting-nozzle.yml b/Resources/Prototypes/_Funkystation/Entities/Objects/Tools/firefighting-nozzle.yml new file mode 100644 index 00000000000..2d787f01744 --- /dev/null +++ b/Resources/Prototypes/_Funkystation/Entities/Objects/Tools/firefighting-nozzle.yml @@ -0,0 +1,79 @@ +- type: entity + id: FirefighterNozzle + parent: BaseItem + name: firefighter nozzle + description: A specialized nozzle intended to fight fires. + components: + - type: Sprite + sprite: _Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi + state: icon + - type: Item + sprite: _Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi + size: Normal + - type: FirefighterTankRefillable + externalContainer: true + targetSlot: BACK + providerWhitelist: + tags: + - AtmosBackTank + - type: Tag + tags: + - Nozzle + + - type: Spray + transferAmount: 15 + pushbackAmount: 60 + spraySound: + path: /Audio/Effects/extinguish.ogg + sprayedPrototype: ExtinguisherSpray + vaporAmount: 5 + vaporSpread: 120 + sprayDistance: 5 + sprayVelocity: 2.0 + externalContainer: true + targetSlot: BACK + providerWhitelist: + tags: + - NozzleBackTank + - AtmosBackTank + - type: UseDelay + - type: PacifismAllowedGun + - type: Gun + fireRate: 1 + selectedMode: SemiAuto + availableModes: + - SemiAuto + soundGunshot: + path: /Audio/Effects/thunk.ogg + soundEmpty: + path: /Audio/Items/hiss.ogg + clumsyProof: true + - type: ClothingSlotAmmoProvider + - type: SlotBasedConnectedContainer + targetSlot: BACK + containerWhitelist: + tags: + - NozzleBackTank + - AtmosBackTank + checkHands: true + +- type: entity + parent: [ BaseCivilianContraband, GrenadeBase ] + categories: [ HideSpawnMenu ] + id: AtmosResin + name: atmos resin + description: Special grenade for atmosians. + components: + - type: Sprite + sprite: _Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi + state: icon + - type: SmokeOnTrigger + duration: 9 + spreadAmount: 1000 # Overly high number so resin spreads more evenly. Capped by duration. + smokePrototype: Resin + - type: DeleteOnTrigger + - type: TriggerOnLand + - type: TimerTriggerVisuals + - type: EmitSoundOnTrigger + sound: /Audio/Items/smoke_grenade_smoke.ogg + positional: true diff --git a/Resources/Prototypes/_Funkystation/tags.yml b/Resources/Prototypes/_Funkystation/tags.yml index 149d001cefa..8caf246d564 100644 --- a/Resources/Prototypes/_Funkystation/tags.yml +++ b/Resources/Prototypes/_Funkystation/tags.yml @@ -12,3 +12,12 @@ - type: Tag # Funky atmos - /tg/ gases id: PlasmaSheet + +- type: Tag # Funky atmos - firefighter backpack + id: AtmosBackTank + +- type: Tag # Funky atmos - firefighter backpack + id: Nozzle + +- type: Tag # Funky atmos - firefighter backpack + id: AtmosResinGrenade diff --git a/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/equipped-BACKPACK.png b/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/equipped-BACKPACK.png new file mode 100644 index 0000000000000000000000000000000000000000..74f5c86d8d07386a5579c5281de09be008c3c42a GIT binary patch literal 1037 zcmV+o1oHcdP)V4@&Nix9*XJ*oYMu?>{d6w=lyED_?yL(5SnLAH2ch1~%zVCeJ&Y3$U zAP!qIP-1KJ0z3!-*jxlc073vZXTaw0#R?zj+4&SsZK=4w%L~<8;Fk=XgjqqWV z{%B)2ggB!>k$Dl^URNocXmrD?$pm~&t^scmppWLJ3aF{x1M>^tV0>bkyAPvyVu{^! z0zhzIX4ha}U8&3;x#lH;jqqV)@>%#{7Qp2|yL3M?ta?swoHx*5Fept;O@YVb0k_)? zi9`a(btn{K#-kNqYiq0Ia5x~HPRqB+^=f(^YIi$e@WlidU%dF~Jk=!4eNRJ~qXzV1 z9~~W4#mo%i=9Ny#Rb38Uy^rN*!~N%_M8c0XxMa-8i_!QAS4v-a{$@HU3$pq6 z5ot%?uqyVt=zu0S%n8#;r=eE zt2dk(SDv%_q_wBe_jYh8mH2#PH zl(BOW0KVrBIvtuzJqGqMl?JW;fF`*#Hd|2u-Rqp(`_~gG&uQ=!VngH4Pyt}jdQG6- zy+VNMHD^Y@0`Lo9Zt*DmzIZ3|9{t}6fbUz<6Y#>wI*(QiS_0Vq@G8_+y;Xh6GW7uY zI{ke2S;6Jn=dJ*C&rZVZnU`6KDy9d(r?r-| zx?h*Ed7!ni>G#(4{D;o(bDy)S-1N!s`SSe!lhg5^*7K(3_Qvu0c*yRM;Pi~w;>GXx zZmqa{n4XQ><;L*%l-c5Py})gcm3)<)aHXu1rm1O(h+vhLQ#>G&00001bW%=J06^y0 zW&i*H@kvBMR5*>*lF3%XFbqYVT9F*NZd#xWCA756l;QvXj;9gf+3rF_7QH~rr z_y3|oO!Arcvk8N06KX08WS^j-z!Dln5O%6Mz^dFE;H)vub3@~tnG*t!MXMS$SaDs)J2(w+)!FLc}8_P!S~ zj(t=U_PhPBkTqd%m~ePFJen}z)~5u1dVYC*d*>j-dxC-Pjvt?2-$x`PH;rGBm@4lp zLNbDTAy8dYC<%^36Ns=BxO0*)5R|0EZKS-P7$`GPVT%9J_yJQ^4I$}PFkAot002ov JPDHLkV1mQ!+{*v} literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-left.png b/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-left.png new file mode 100644 index 0000000000000000000000000000000000000000..3806eeb66732d4645109a6e33e3f448a887815ff GIT binary patch literal 573 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=jKx9jP7LeL$-D%zzk9kkhE&XX zduyY&vZDywhx5u0XXUzYFo?PEavg`#L8C)UPfq;zN>?Z7ss4uxTD=L9m%RV5ui;&( zqq8jDqVIOg1wkz?0YBpEpllxAXT( zwK!o0yB3XK>Y@Gn`}e)8G`Gv}i~W*+eEXTrN7yf{@4vhKt?-xE$?OdFZ|c`qH9xy@ z_on5vi#$=;A7d4)7}jo`y~b_F=3<{P<&3p=&mWCnKkI6@Y)ok1#k}pUyUqwpH(a}= zxpYHM+KyE+$&zOmOgZHCHTmJJ^pkgZt#ywS@+9|!thQWaz2Np+CI+kJ&v%vv?$5h! zK6ly5_~i8h(hWgenX{ZUTW{4VZ`WJ3?f!(U_pXk9jm>8tnaeIZmwkjSVQs4++qI}W zIyrfiOua{7plP$lipy`0j7gF3GPie0`mK{e~6Kr)O@k zaBy*XKQmuU@x=6nMnBU8UDypW{Jj5)DNJ+~kUfz4Yws3Ck5s`UY!_aCy<;?MVU?iT zsZUc<#2j-Nj!7IT>`7eSx;aIzMjWWdMZQtz!~|Apr-^5jSS(pjahRpl7_;PCDSQ+< zspI6jX(L3o@`Q{9gG5;r!!_rRXO${W7BQyo<2LAa`1g+S6Xy$m?m6cgfa!t3)78&q Iol`;+0J8)AW&i*H literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-right.png b/Resources/Textures/_Funkystation/Clothing/Back/Backpacks/atmosbackpacktank.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ae08447e49da1033e7591d4f8baedb4bc0f565fa GIT binary patch literal 578 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 Q0ssI207*qoM6N<$f^!H*)&Kwi literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Effects/resin.rsi/resin-east.png b/Resources/Textures/_Funkystation/Effects/resin.rsi/resin-east.png new file mode 100644 index 0000000000000000000000000000000000000000..02f697f34cdf4dc89aa0bf6cd40f707473bf90b1 GIT binary patch literal 6619 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 ON4YpGVI8$w6aNqE)VO8< literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Effects/resin.rsi/resin-west.png b/Resources/Textures/_Funkystation/Effects/resin.rsi/resin-west.png new file mode 100644 index 0000000000000000000000000000000000000000..ba676735b3e56691df7b954ae457e78e781b7e6a GIT binary patch literal 6755 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 literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Effects/resin.rsi/resin.png b/Resources/Textures/_Funkystation/Effects/resin.rsi/resin.png new file mode 100644 index 0000000000000000000000000000000000000000..01f15e9953e571ff9dce7b51bc096fc6470f42ba GIT binary patch literal 2197 zcmV;G2x|9 zeUcGK3Yi007Hnxm6C#rM@gTOr*HVyjHY8w1u~i59WXU6D~$91x2XKf=04^ zK0yVRLYe!7u4GqSk~BfWP*=bZsX)REavbF6fwn>h1e25kCCN3gQqk6Mb21#Rg*gYF zNqxVesl*t#Poxw?l9CdH2V{~4ZbG>gOck4o&xDrD*OPcnY-uEcs1nmDw+1!IQeh8t zLg|I$x8D&}Z0X2VKp-VKd?El#B~2-UQHqe;#2*K0L0k&a8?FV!$=%5r*zHR13%*Wf z+ei)O{fRb3_5m)?8s&M8B_j|OWGF7qIws+Ryed}D&X&o*9zpJjDu@gDW0Kb-e^Dqx z&a;J)aEu)(f|bsQ4RME2kk+wY5HaKcxe4>W5(L={wt=S;?dRXiMvkD!9;6y#lRN?h zL_i*nR3~qSPeDRq4lK9_+2>BY4tyPyuQ%#aiG;uqIhak+(t&_E zp&2C#SjBpQDo8+)b>h#BR6#x#R24>$o>*_-Nt7VELsgI@RZtQ9Ik3KvRT&cadXUq} zC}>XXwh-%q-Wn2+rIIm`r67?oC&hp2*idR~&?+30xvtO*DMGFm&^N z^}?~f$n~IT=Ta|Ns~pFRc^u?^Ahp1IgJTj~Fz*i}6$J|KH&heblXxAVkRwQeyeN`_ zEDiZ+#6FSdAih*=h2F3Dai9a_Vvva+gBb_=_xm}{BgyY~WO>J@lkVuXQA)>(p_z_0 z!!8X}(dR@3=nAb6CPatfgGkU@!ACH@2mmvkjDW-WzkM?60NDE#duyaBc}&C#Ww}tb zA%Ocplf;innxLgIC2&nhCFUT~k;e|NgKUADBC4nqj%5(f4Lp!m(9$Tiku~Z6`WH$m zly<=`9YMfAF9ksuelSW>v{x9DSsg=>7eo*8`(S)NNKe$Es1dd!Ul!z}6OT#$v6HFT zFIVi^X}uv^5T0z`zG2Hk_=I&scO||w=oc`B6s%TCvqBim$3XzH5BvZ`xLv>S%opm0 z`pJm+u@S#NNfYuI=%r(&W38eZ3=6jVcL03b@FUPBrV#reMJUNsMxI8zmQHjr$?XQ*k`-=YgMk@Hh0^+I#dD+hg4con%nADK!2Ww9yTNNP_8&}3q&JGLj)bD6;2K!z=uCtptKf$- zd?$hQNp&R%Vx5F0IMiFEUkmH&MQ*3p_uCuuA3qRDxK(1E@K#|Y>5lA71r0@d zC8jfRq*kmpB+CB>6~0t(NQ~0TX|ub-bmn%jet#lcP-;U-W*nyi60#_=74~TiV_?~dTg7H4<~;4#)*zorc4*fdqDD%vZ%@(#dskvOHX#qk zi(y|c%)^n}jVcPm$_I87Jko&>NiKro>h=5r` zQpt57R+z^|xh#kos)cNW96PgLD3^|w0_;ew)OH0RJ~#B21^+yleh@i`rj*Nq^+K8J zM)|mr-O!OtndC8Gbwm}INHOB|M75FzR7JW{b>VnzI8Ip_V#$nzEbucE>R&E|gT6QN z?nGDeYe%>+x0PbGGQRyd3pz+s^wx-)h$uM&MJShdyepnNBxj&w|ImKX>F~q4o=ckRD**8SrvYkS$;a zVuCa!_DNp~@#%yO{C-g0{!9e;9H2^w6MLSI(1N@sC3mor*sUU|%nbBU@;Qjs$i?6_ ziN{1#sBK}yi`WBMD)q9QX?I;&?}5}p@ydw7oCju=$i$D0XoB@l9+UZafEdM=hE>HM z8&N>hpjA=^5j*pL23iZY^m8{HWF&gKP~R8Ag!$uzX(1P(-WJCFLA|~ahqJ$4ka@DA z7OXdX2y%5)3q?%H!;$w6+ksv>B>3w1A=KLy_aI7~6x50gLoNk+VQwq7T+nVPg0zPJ z5tO31?Phpd`ETv-|0Xt3~w%!-YwhK=N%ew|NCv5^PZCu zB~BIXzgxJL!*kN}zcZI*8ucZIK2elSW#3_&7dcJ!{kvGvN)Pv&jMqxfn)qhM=Y~G< zw*nc&z|inNc%$f#Q}X{gLZcfuz5j4=)i$Q(whmXr9&BOXAPSU^wQD%+)0uuDW(7#O Mr>mdKI;Vst0Kgkm4FCWD literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/icon.png b/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..a61f7b5a9b2039fd95db648eb3450f57103cc956 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*B?KA7@zr{_W%Ef4<9Tm zeRP20j3q&S!3+-1ZlnP@uAVNAAre!Q6C@M_q!<=TIy)=!Tw8fr<^a#P+vgQ{wyjPS zXiJHZX;HMd7dbWKxA-D&lTWHHEv6<{8MBN+c$t$Ko}Oc2=;Pv3nYrrga-e|>p00i_ I>zopr05(%J3IG5A literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/meta.json b/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/meta.json new file mode 100644 index 00000000000..06e0b2b0927 --- /dev/null +++ b/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/meta.json @@ -0,0 +1,21 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at https://github.com/tgstation/tgstation/pull/5645/commits/46a3170b2a1a0f9b6f03dd6bda8e443afed85ee3", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "primed" + }, + { + "name": "equipped-BELT", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/primed.png b/Resources/Textures/_Funkystation/Objects/Weapons/Grenades/frozen-smoke-capsule.rsi/primed.png new file mode 100644 index 0000000000000000000000000000000000000000..a61f7b5a9b2039fd95db648eb3450f57103cc956 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnH3?%tPCZz)@o&cW^*B?KA7@zr{_W%Ef4<9Tm zeRP20j3q&S!3+-1ZlnP@uAVNAAre!Q6C@M_q!<=TIy)=!Tw8fr<^a#P+vgQ{wyjPS zXiJHZX;HMd7dbWKxA-D&lTWHHEv6<{8MBN+c$t$Ko}Oc2=;Pv3nYrrga-e|>p00i_ I>zopr05(%J3IG5A literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/icon.png b/Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..cab041893e681190fa89bc2c263b23c06931ba9a GIT binary patch literal 412 zcmV;N0b~A&P)AD=RB3$8Ko=0004WQchCs$1n0efNvtx69&ef0RuK_1wSFSt5JK4P_WK}mU_Rb$W)X1?1GWhXfm(oQeB*cK z4>x=cDc^hpFT}H+^;<20ifqK?a>zal5OE!^<22f$QdI%5@e#o7M$=@#l+^%~ z2rbF!w`h?ZGXNVW4_~spt@tp4eg%r45j{U8XvfX~x`0OQ1FMARK-&?GtEP2}mMv3n z%*P51ldidolAMQXB}!wZSw;u#_~`+6q=8q`l@zz{bN$Fc41A zE^q`>nBq`4M8j2*LR5%v)=XG}^4@M{?qz+OCdJEcX8!r+-+8+N{*!41Rx+KvPaZq~ z8Hd0F-~q_E0vS)=JAelu;|gRveeVDs0A2;^_4)*N48zdF#Vf7IZmdPZ;#Vpa=ytm* zSPy|n%~&^O2LPih7K<<#4A=muR;$WYI-L${ysSz(x*5Bm!17IgpwpjN9vyWREx7y^(40x;dt0CW+ESksQ6 zJ(|rX^m;w#93TwJv*%5H* zDZtBHCla&X^``eQ>;a+xSp4wYU8M~c(X{*3!U%xvA3Ly~-*l$?RlZUF`SmgEo!(^! zVBT3#S1LXhel!}X`s;a3>{$~*H0 zu)Ud|P~4_@$GMFTfbOtp`MF%q>IRk_03>pJ{O(T&oZA5S^2XQ&NW`^MXW+^1C#B2Y zt3&o!;{>;Pjj+784 z-9R0LoiEi%Ns4Lnn|bHL_%RPQ7nsgP*i8BnU{iQ82f&R906Ys#yMX|}eO$AD<#w8b zQ4Smc%+E!uYd4IBy?+5M;s7KB0zl_DQmdxpn6q3;K%0)XStAAT-{vBY*+>iky&JIj z_(=kQzK$b7n<6f{h9KsOUve%wF#xdmT!JiGAlKGQ&PAdC{14r{46sNYE0~)&0Lvht z>oG{qMIHc0=-{3!C~XgbBLGN+=>d>Z){%XG16%&=Frn|G;{X5v07*qoM6N<$g8kHs Axc~qF literal 0 HcmV?d00001 diff --git a/Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/inhand-right.png b/Resources/Textures/_Funkystation/Objects/Weapons/Guns/Basic/extinguishernozzle.rsi/inhand-right.png new file mode 100644 index 0000000000000000000000000000000000000000..ca22fe4b91276af979dc15fe269ccc1048e535bf GIT binary patch literal 901 zcmV;01A6?4P)5#32%dYzj&sf|Jxm2xjRT5GTQmI=ci%30)#tiy(9egqG+Q zkYENQ21O|vI(85pV!n&#am}B;yuR~Za(nNE5=d|EpYQz6cg}k&tXO?}cX@IE zSPp>$zyV;n0+wIjIe-Jeas@2EzH&AZtpp&G$*4|RA7MlcT9?Ai=N=%N%~GXO5d*-aC!rwv zP0b7dF#7Y>83jMIkU(tFMn1`sIm zAi%kou+dOf8aAjwe$Otj-`}C_Gh3kn&>?^mB$G+?Sj!2u3tQ) zZ}&b^`^_F@zC1L_0RTYaRG%Ic&(o{gPwMX{MBvq(U@#bXFUS7%8Ml}?w&u-Jx=l4Ck3u48KnhOAs{nxIx>HEhURN4BfjuHg~ z+#Gs+l0eVl>2`N_$nJ}G8yI*cFWCo7WCe@2dipG_U3p87pR5^`{SZmN1A-4Hz^4=d z93b5d007FSRL`OI7y$tHMF|4{(!s|T{{f&|CxZX}Lsr?RN%lXj4B)#c0KmEo!QsI> z(Vl~ynEM#S07EkSrvd=lKynoIGtQC#m~jUVzGMl|@4-of?<6%FcQM{m+QlXu003YB zf~Z7`3j{ql(!z~HAlY-wa^fiNFtr4*3z!Z-oS*>!^i2{y2fG)qCH*9$>oT2vXQ!;3hF!|{#@^Zv)6I=c-*>gy)b(H=N09)vsaZd+; b Date: Mon, 26 Jan 2026 12:38:57 -0500 Subject: [PATCH 2/2] clean up some comments --- Content.Server/Fluids/EntitySystems/SpraySystem.cs | 2 +- .../Atmos/Components/AtmosResinDespawnComponent.cs | 4 ++-- .../Atmos/EntitySystems/AtmosResinDespawnSystem.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index 384b2681a63..cec404b522a 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -64,7 +64,7 @@ public sealed class SpraySystem : SharedSpraySystem [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly InventorySystem _inventory = default!; // Funky atmos - firefighter backpack [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; // Funky atmos - firefighter backpack - [Dependency] private readonly SharedHandsSystem _handsSystem = default!; // Assmos - Extinguisher Nozzle + [Dependency] private readonly SharedHandsSystem _handsSystem = default!; // Funky atmos - firefighter backpack private float _gridImpulseMultiplier; diff --git a/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs b/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs index 0e165413247..02109a7da95 100644 --- a/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs +++ b/Content.Server/_Funkystation/Atmos/Components/AtmosResinDespawnComponent.cs @@ -3,8 +3,8 @@ namespace Content.Server._Funkystation.Atmos.Components; /// -/// Assmos - Extinguisher Nozzle -/// When a TimedDespawnComponent" despawns, another one will be spawned in its place. +/// When a TimedDespawnComponent despawns, another one will be spawned in its place. +/// Funky atmos - firefighter backpack /// [RegisterComponent, Access(typeof(AtmosResinDespawnSystem))] public sealed partial class AtmosResinDespawnComponent : Component diff --git a/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs b/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs index e7c64eb672e..53d878d24c3 100644 --- a/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs +++ b/Content.Server/_Funkystation/Atmos/EntitySystems/AtmosResinDespawnSystem.cs @@ -7,8 +7,8 @@ namespace Content.Server._Funkystation.Atmos.EntitySystems; /// -/// Assmos - Extinguisher Nozzle /// Sets atmospheric temperature to 20C and removes all toxins. +/// Funky atmos - firefighter backpack /// public sealed class AtmosResinDespawnSystem : EntitySystem {