Cannot stack binary and trinary Atmos pumps and devices. 5x Filter rate boost (#16331)
* Cannot stack binary and trinary Atmos pumps and devices - Filters now have a 5x max volume to compensate for no more stacking - Add flipped versions of mixers and filters to the list of constructables * Oi! No anchoring unstackables together! * Use EntityLookupSystem in Unstackable and Window lookup - Use static method for AnyUnstackableTiles
This commit is contained in:
@@ -14,7 +14,6 @@ namespace Content.Client.Atmos.UI
|
||||
{
|
||||
|
||||
private GasFilterWindow? _window;
|
||||
private const float MaxTransferRate = Atmospherics.MaxTransferRate;
|
||||
|
||||
public GasFilterBoundUserInterface(ClientUserInterfaceComponent owner, Enum uiKey) : base(owner, uiKey)
|
||||
{
|
||||
@@ -49,7 +48,6 @@ namespace Content.Client.Atmos.UI
|
||||
private void OnFilterTransferRatePressed(string value)
|
||||
{
|
||||
float rate = float.TryParse(value, out var parsed) ? parsed : 0f;
|
||||
if (rate > MaxTransferRate) rate = MaxTransferRate;
|
||||
|
||||
SendMessage(new GasFilterChangeRateMessage(rate));
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
<BoxContainer Orientation="Horizontal" HorizontalExpand="True">
|
||||
<Label Text="{Loc comp-gas-filter-ui-filter-transfer-rate}"/>
|
||||
<LineEdit Name="FilterTransferRateInput" MinSize="40 0" />
|
||||
<LineEdit Name="FilterTransferRateInput" MinSize="60 0" />
|
||||
<Button Name="SetFilterRate" Text="{Loc comp-gas-filter-ui-filter-set-rate}" Disabled="True"/>
|
||||
</BoxContainer>
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using Content.Client.Popups;
|
||||
using Content.Shared.Construction;
|
||||
using Content.Shared.Construction.Prototypes;
|
||||
using Content.Shared.Examine;
|
||||
@@ -24,6 +25,7 @@ namespace Content.Client.Construction
|
||||
[Dependency] private readonly IPlayerManager _playerManager = default!;
|
||||
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
|
||||
[Dependency] private readonly SharedInteractionSystem _interactionSystem = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
|
||||
private readonly Dictionary<int, ConstructionGhostComponent> _ghosts = new();
|
||||
private readonly Dictionary<string, ConstructionGuide> _guideCache = new();
|
||||
@@ -188,11 +190,8 @@ namespace Content.Client.Construction
|
||||
if (!_interactionSystem.InRangeUnobstructed(user, loc, 20f, predicate: predicate))
|
||||
return false;
|
||||
|
||||
foreach (var condition in prototype.Conditions)
|
||||
{
|
||||
if (!condition.Condition(user, loc, dir))
|
||||
return false;
|
||||
}
|
||||
if (!CheckConstructionConditions(prototype, loc, dir, user))
|
||||
return false;
|
||||
|
||||
ghost = EntityManager.SpawnEntity("constructionghost", loc);
|
||||
var comp = EntityManager.GetComponent<ConstructionGhostComponent>(ghost.Value);
|
||||
@@ -217,6 +216,27 @@ namespace Content.Client.Construction
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool CheckConstructionConditions(ConstructionPrototype prototype, EntityCoordinates loc, Direction dir,
|
||||
EntityUid user)
|
||||
{
|
||||
foreach (var condition in prototype.Conditions)
|
||||
{
|
||||
if (!condition.Condition(user, loc, dir))
|
||||
{
|
||||
var message = condition.GenerateGuideEntry()?.Localization;
|
||||
if (message != null)
|
||||
{
|
||||
// Show the reason to the user:
|
||||
_popupSystem.PopupCoordinates(Loc.GetString(message), loc);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Checks if any construction ghosts are present at the given position
|
||||
/// </summary>
|
||||
|
||||
@@ -1,13 +1,16 @@
|
||||
using Content.Server.Administration.Logs;
|
||||
using Content.Server.Construction.Components;
|
||||
using Content.Server.Coordinates.Helpers;
|
||||
using Content.Server.Popups;
|
||||
using Content.Server.Pulling;
|
||||
using Content.Shared.Construction.Components;
|
||||
using Content.Shared.Construction.Conditions;
|
||||
using Content.Shared.Construction.EntitySystems;
|
||||
using Content.Shared.Database;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.Examine;
|
||||
using Content.Shared.Pulling.Components;
|
||||
using Content.Shared.Tag;
|
||||
using Content.Shared.Tools;
|
||||
using Content.Shared.Tools.Components;
|
||||
using Robust.Shared.Map;
|
||||
@@ -24,6 +27,7 @@ namespace Content.Server.Construction
|
||||
[Dependency] private readonly SharedToolSystem _tool = default!;
|
||||
[Dependency] private readonly PullingSystem _pulling = default!;
|
||||
[Dependency] private readonly SharedTransformSystem _transform = default!;
|
||||
[Dependency] private readonly TagSystem _tagSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
@@ -85,7 +89,26 @@ namespace Content.Server.Construction
|
||||
// TODO: Anchoring snaps rn anyway!
|
||||
if (component.Snap)
|
||||
{
|
||||
_transform.SetCoordinates(uid, xform.Coordinates.SnapToGrid(EntityManager, _mapManager));
|
||||
var coordinates = xform.Coordinates.SnapToGrid(EntityManager, _mapManager);
|
||||
|
||||
if (_tagSystem.HasTag(uid, "Unstackable"))
|
||||
{
|
||||
// Need to enforce the unstackable rules on anchoring also.
|
||||
var condition = new NoUnstackableInTile();
|
||||
if (NoUnstackableInTile.AnyUnstackableTiles(coordinates, _tagSystem))
|
||||
{
|
||||
var message = condition.GenerateGuideEntry()?.Localization;
|
||||
if (message != null)
|
||||
{
|
||||
// Show the reason to the user:
|
||||
_popup.PopupEntity(Loc.GetString(message), uid, args.User);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
_transform.SetCoordinates(uid, coordinates);
|
||||
}
|
||||
|
||||
RaiseLocalEvent(uid, new BeforeAnchoredEvent(args.User, used));
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
using Content.Shared.Maps;
|
||||
using Content.Shared.Tag;
|
||||
using JetBrains.Annotations;
|
||||
using Robust.Shared.Map;
|
||||
|
||||
namespace Content.Shared.Construction.Conditions
|
||||
{
|
||||
[UsedImplicitly]
|
||||
[DataDefinition]
|
||||
public sealed class NoUnstackableInTile : IConstructionCondition
|
||||
{
|
||||
public bool Condition(EntityUid user, EntityCoordinates location, Direction direction)
|
||||
{
|
||||
var tagSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<TagSystem>();
|
||||
|
||||
if (AnyUnstackableTiles(location, tagSystem))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public static bool AnyUnstackableTiles(EntityCoordinates location, TagSystem tagSystem)
|
||||
{
|
||||
var lookup = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<EntityLookupSystem>();
|
||||
|
||||
foreach (var entity in lookup.GetEntitiesIntersecting(location, LookupFlags.Approximate | LookupFlags.Static |
|
||||
LookupFlags.Sundries))
|
||||
{
|
||||
if (tagSystem.HasTag(entity, "Unstackable"))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public ConstructionGuideEntry GenerateGuideEntry()
|
||||
{
|
||||
return new ConstructionGuideEntry
|
||||
{
|
||||
Localization = "construction-step-condition-no-unstackable-in-tile"
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -12,8 +12,9 @@ namespace Content.Shared.Construction.Conditions
|
||||
public bool Condition(EntityUid user, EntityCoordinates location, Direction direction)
|
||||
{
|
||||
var tagSystem = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<TagSystem>();
|
||||
var lookup = IoCManager.Resolve<IEntitySystemManager>().GetEntitySystem<EntityLookupSystem>();
|
||||
|
||||
foreach (var entity in location.GetEntitiesInTile(LookupFlags.Approximate | LookupFlags.Static))
|
||||
foreach (var entity in lookup.GetEntitiesIntersecting(location, LookupFlags.Approximate | LookupFlags.Static))
|
||||
{
|
||||
if (tagSystem.HasTag(entity, "Window"))
|
||||
return false;
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
construction-step-condition-no-unstackable-in-tile = You cannot make a stack of similar devices.
|
||||
@@ -6,6 +6,9 @@
|
||||
mode: SnapgridCenter
|
||||
components:
|
||||
- type: AtmosDevice
|
||||
- type: Tag
|
||||
tags:
|
||||
- Unstackable
|
||||
- type: SubFloorHide
|
||||
blockInteractions: false
|
||||
blockAmbience: false
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
mode: SnapgridCenter
|
||||
components:
|
||||
- type: AtmosDevice
|
||||
- type: Tag
|
||||
tags:
|
||||
- Unstackable
|
||||
- type: SubFloorHide
|
||||
blockInteractions: false
|
||||
blockAmbience: false
|
||||
@@ -55,11 +58,16 @@
|
||||
type: GasFilterBoundUserInterface
|
||||
- type: GasFilter
|
||||
enabled: false
|
||||
transferRate: 1000
|
||||
maxTransferRate: 1000
|
||||
- type: Flippable
|
||||
mirrorEntity: GasFilterFlipped
|
||||
- type: Construction
|
||||
graph: GasTrinary
|
||||
node: filter
|
||||
conditions:
|
||||
- !type:TileNotBlocked
|
||||
- !type:NoUnstackableInTile
|
||||
- type: AmbientSound
|
||||
enabled: false
|
||||
volume: -9
|
||||
@@ -205,6 +213,9 @@
|
||||
mode: SnapgridCenter
|
||||
components:
|
||||
- type: AtmosDevice
|
||||
- type: Tag
|
||||
tags:
|
||||
- Unstackable
|
||||
- type: SubFloorHide
|
||||
blockInteractions: false
|
||||
blockAmbience: false
|
||||
|
||||
@@ -516,6 +516,7 @@
|
||||
state: pumpPressure
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
name: volumetric gas pump
|
||||
@@ -537,6 +538,7 @@
|
||||
state: pumpVolume
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasPassiveGate
|
||||
@@ -558,6 +560,7 @@
|
||||
state: pumpPassiveGate
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasValve
|
||||
@@ -579,6 +582,7 @@
|
||||
state: pumpManualValve
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: SignalControlledValve
|
||||
@@ -600,6 +604,7 @@
|
||||
state: pumpSignalValve
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasPort
|
||||
@@ -621,6 +626,7 @@
|
||||
state: gasCanisterPort
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasDualPortVentPump
|
||||
@@ -678,6 +684,24 @@
|
||||
mirror: GasFilter
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasFilterFlipped
|
||||
name: gas filter [flipped]
|
||||
description: Very useful for filtering gases.
|
||||
graph: GasTrinary
|
||||
startNode: start
|
||||
targetNode: filter
|
||||
category: construction-category-utilities
|
||||
placementMode: SnapgridCenter
|
||||
canBuildInImpassable: false
|
||||
icon:
|
||||
sprite: Structures/Piping/Atmospherics/gasfilter.rsi
|
||||
state: gasFilterF
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasMixer
|
||||
@@ -712,7 +736,25 @@
|
||||
state: gasMixerF
|
||||
mirror: GasMixer
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:TileNotBlocked
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: GasMixerFlipped
|
||||
name: gas mixer [flipped]
|
||||
description: Very useful for mixing gases.
|
||||
graph: GasTrinary
|
||||
startNode: start
|
||||
targetNode: mixer
|
||||
category: construction-category-utilities
|
||||
placementMode: SnapgridCenter
|
||||
canBuildInImpassable: false
|
||||
icon:
|
||||
sprite: Structures/Piping/Atmospherics/gasmixer.rsi
|
||||
state: gasMixerF
|
||||
conditions:
|
||||
- !type:TileNotBlocked
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
- type: construction
|
||||
id: PressureControlledValve
|
||||
@@ -728,7 +770,8 @@
|
||||
sprite: Structures/Piping/Atmospherics/pneumaticvalve.rsi
|
||||
state: off
|
||||
conditions:
|
||||
- !type:TileNotBlocked {}
|
||||
- !type:TileNotBlocked
|
||||
- !type:NoUnstackableInTile
|
||||
|
||||
# INTERCOM
|
||||
- type: construction
|
||||
|
||||
@@ -694,6 +694,9 @@
|
||||
- type: Tag
|
||||
id: TrashBag
|
||||
|
||||
- type: Tag
|
||||
id: Unstackable # To prevent things like atmos devices (filters etc) being stacked on one tile. See NoUnstackableInTile
|
||||
|
||||
- type: Tag
|
||||
id: VehicleKey
|
||||
|
||||
|
||||
Reference in New Issue
Block a user