From ede1406128a2ad4d6f378bc0dae35e777d904a34 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Wed, 22 May 2024 10:52:57 +0300 Subject: [PATCH 001/112] Artifact portal effect changes (#28200) Update portal.yml --- Resources/Prototypes/Entities/Effects/portal.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Entities/Effects/portal.yml b/Resources/Prototypes/Entities/Effects/portal.yml index eb69ac821f5..75300693cd9 100644 --- a/Resources/Prototypes/Entities/Effects/portal.yml +++ b/Resources/Prototypes/Entities/Effects/portal.yml @@ -65,7 +65,7 @@ energy: 1 netsync: false - type: TimedDespawn - lifetime: 120 + lifetime: 1 - type: Portal canTeleportToOtherMaps: true From 6a9139b4e1427fa8ea397383c04f9391ee287fb7 Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 22 May 2024 07:54:04 +0000 Subject: [PATCH 002/112] 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 12da3a2a900..d20cf44cdb9 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Removed Hamlet, Smile and Pun Pun from Thief objectives - type: Remove - id: 6111 - time: '2024-03-07T23:53:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25921 - author: MACMAN2003 changes: - message: Diagonal windows no longer space you when in a pressurized environment. @@ -3870,3 +3863,10 @@ id: 6610 time: '2024-05-21T10:16:35.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28160 +- author: TheShuEd + changes: + - message: Artifact portal lifespan reduced from 120 seconds to 1 second + type: Tweak + id: 6611 + time: '2024-05-22T07:52:58.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28200 From df8b9a659ecbd412243acdbf02fa96e2a74d5789 Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Wed, 22 May 2024 11:16:20 +0000 Subject: [PATCH 003/112] Firelock improvements part 1 (#26582) * Change prying system and pryunpoweredcomp to allow for custom time modifiers This will be useful if I go the route of making firelocks pryable when unpowered instead of just being able to open and close instantly when unpowered. * Make firelocks properly predicted Shared system made. Since atmos checks can only be done on the server we just have it set relevant bools on the component and then dirty it. Ditched atmos checks on trying to open, they now only happen whenever firelocks are updated. * Make firelocks pryable without a crowbar While this usually would only allow you to do this when a door is unpowered, firelocks do not have the airlock component which actually does that check. As such firelocks will always allow you to pry them open/closed by hand. * Clean up System. Change update interval to be based on ticks. Move as much as possible to shared * Make firelocks unable to emergency close for 2 seconds after being pried open * Clean up * More cleanup * Reorganize SharedFirelockSystem methods to match Initialize order --------- Co-authored-by: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> --- Content.Client/Doors/FirelockSystem.cs | 3 +- .../Doors/Systems/FirelockSystem.cs | 134 +++--------------- .../Doors/Components/FirelockComponent.cs | 48 ++++++- .../Doors/Systems/SharedDoorSystem.cs | 3 +- .../Doors/Systems/SharedFirelockSystem.cs | 125 ++++++++++++++++ .../Components/PryUnpoweredComponent.cs | 2 + Content.Shared/Prying/Systems/PryingSystem.cs | 8 +- .../Structures/Doors/Firelocks/firelock.yml | 2 + 8 files changed, 200 insertions(+), 125 deletions(-) create mode 100644 Content.Shared/Doors/Systems/SharedFirelockSystem.cs diff --git a/Content.Client/Doors/FirelockSystem.cs b/Content.Client/Doors/FirelockSystem.cs index cfd84a47133..f64b4c8e522 100644 --- a/Content.Client/Doors/FirelockSystem.cs +++ b/Content.Client/Doors/FirelockSystem.cs @@ -1,9 +1,10 @@ using Content.Shared.Doors.Components; +using Content.Shared.Doors.Systems; using Robust.Client.GameObjects; namespace Content.Client.Doors; -public sealed class FirelockSystem : EntitySystem +public sealed class FirelockSystem : SharedFirelockSystem { [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index 3d4c8a4ec59..5ad86fb20aa 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -1,67 +1,56 @@ using Content.Server.Atmos.Components; using Content.Server.Atmos.EntitySystems; using Content.Server.Atmos.Monitor.Systems; -using Content.Server.Popups; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; using Content.Server.Shuttles.Components; -using Content.Shared.Access.Systems; using Content.Shared.Atmos; using Content.Shared.Atmos.Monitor; using Content.Shared.Doors; using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; -using Content.Shared.Popups; -using Content.Shared.Prying.Components; using Robust.Shared.Map.Components; namespace Content.Server.Doors.Systems { - public sealed class FirelockSystem : EntitySystem + public sealed class FirelockSystem : SharedFirelockSystem { - [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly SharedDoorSystem _doorSystem = default!; [Dependency] private readonly AtmosAlarmableSystem _atmosAlarmable = default!; [Dependency] private readonly AtmosphereSystem _atmosSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; - [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly SharedMapSystem _mapping = default!; - private static float _visualUpdateInterval = 0.5f; - private float _accumulatedFrameTime; + private const int UpdateInterval = 30; + private int _accumulatedTicks; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnBeforeDoorOpened); - SubscribeLocalEvent(OnDoorGetPryTimeModifier); - SubscribeLocalEvent(OnUpdateState); SubscribeLocalEvent(OnBeforeDoorAutoclose); SubscribeLocalEvent(OnAtmosAlarm); - // Visuals - SubscribeLocalEvent(UpdateVisuals); - SubscribeLocalEvent(UpdateVisuals); SubscribeLocalEvent(PowerChanged); + } private void PowerChanged(EntityUid uid, FirelockComponent component, ref PowerChangedEvent args) { // TODO this should REALLLLY not be door specific appearance thing. _appearance.SetData(uid, DoorVisuals.Powered, args.Powered); + component.Powered = args.Powered; + Dirty(uid, component); } - #region Visuals - private void UpdateVisuals(EntityUid uid, FirelockComponent component, EntityEventArgs args) => UpdateVisuals(uid, component); - public override void Update(float frameTime) { - _accumulatedFrameTime += frameTime; - if (_accumulatedFrameTime < _visualUpdateInterval) + _accumulatedTicks += 1; + if (_accumulatedTicks < UpdateInterval) return; - _accumulatedFrameTime -= _visualUpdateInterval; + _accumulatedTicks = 0; var airtightQuery = GetEntityQuery(); var appearanceQuery = GetEntityQuery(); @@ -84,94 +73,13 @@ public override void Update(float frameTime) { var (fire, pressure) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); + firelock.Temperature = fire; + firelock.Pressure = pressure; + Dirty(uid, firelock); } } } - private void UpdateVisuals(EntityUid uid, - FirelockComponent? firelock = null, - DoorComponent? door = null, - AirtightComponent? airtight = null, - AppearanceComponent? appearance = null, - TransformComponent? xform = null) - { - if (!Resolve(uid, ref door, ref appearance, false)) - return; - - // only bother to check pressure on doors that are some variation of closed. - if (door.State != DoorState.Closed - && door.State != DoorState.Welded - && door.State != DoorState.Denying) - { - _appearance.SetData(uid, DoorVisuals.ClosedLights, false, appearance); - return; - } - - var query = GetEntityQuery(); - if (!Resolve(uid, ref firelock, ref airtight, ref appearance, ref xform, false) || !query.Resolve(uid, ref airtight, false)) - return; - - var (fire, pressure) = CheckPressureAndFire(uid, firelock, xform, airtight, query); - _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); - } - #endregion - - public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = null, DoorComponent? door = null) - { - if (!Resolve(uid, ref firelock, ref door)) - return false; - - if (door.State == DoorState.Open) - { - if (_doorSystem.TryClose(uid, door)) - { - return _doorSystem.OnPartialClose(uid, door); - } - } - return false; - } - - private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) - { - // Give the Door remote the ability to force a firelock open even if it is holding back dangerous gas - var overrideAccess = (args.User != null) && _accessReaderSystem.IsAllowed(args.User.Value, uid); - - if (!this.IsPowered(uid, EntityManager) || (!overrideAccess && IsHoldingPressureOrFire(uid, component))) - args.Cancel(); - } - - private void OnDoorGetPryTimeModifier(EntityUid uid, FirelockComponent component, ref GetPryTimeModifierEvent args) - { - var state = CheckPressureAndFire(uid, component); - - if (state.Fire) - { - _popupSystem.PopupEntity(Loc.GetString("firelock-component-is-holding-fire-message"), - uid, args.User, PopupType.MediumCaution); - } - else if (state.Pressure) - { - _popupSystem.PopupEntity(Loc.GetString("firelock-component-is-holding-pressure-message"), - uid, args.User, PopupType.MediumCaution); - } - - if (state.Fire || state.Pressure) - args.PryTimeModifier *= component.LockedPryTimeModifier; - } - - private void OnUpdateState(EntityUid uid, FirelockComponent component, DoorStateChangedEvent args) - { - var ev = new BeforeDoorAutoCloseEvent(); - RaiseLocalEvent(uid, ev); - UpdateVisuals(uid, component, args); - if (ev.Cancelled) - { - return; - } - - _doorSystem.SetNextStateChange(uid, component.AutocloseDelay); - } - private void OnBeforeDoorAutoclose(EntityUid uid, FirelockComponent component, BeforeDoorAutoCloseEvent args) { if (!this.IsPowered(uid, EntityManager)) @@ -204,12 +112,6 @@ private void OnAtmosAlarm(EntityUid uid, FirelockComponent component, AtmosAlarm } } - public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) - { - var result = CheckPressureAndFire(uid, firelock); - return result.Pressure || result.Fire; - } - public (bool Pressure, bool Fire) CheckPressureAndFire(EntityUid uid, FirelockComponent firelock) { var query = GetEntityQuery(); @@ -234,17 +136,17 @@ public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) return (false, false); } - if (!TryComp(xform.ParentUid, out GridAtmosphereComponent? gridAtmosphere)) + if (!HasComp(xform.ParentUid)) return (false, false); var grid = Comp(xform.ParentUid); - var pos = grid.CoordinatesToTile(xform.Coordinates); + var pos = _mapping.CoordinatesToTile(xform.ParentUid, grid, xform.Coordinates); var minPressure = float.MaxValue; var maxPressure = float.MinValue; var minTemperature = float.MaxValue; var maxTemperature = float.MinValue; - bool holdingFire = false; - bool holdingPressure = false; + var holdingFire = false; + var holdingPressure = false; // We cannot simply use `_atmosSystem.GetAdjacentTileMixtures` because of how the `includeBlocked` option // works, we want to ignore the firelock's blocking, while including blockers on other tiles. @@ -284,7 +186,7 @@ public bool IsHoldingPressureOrFire(EntityUid uid, FirelockComponent firelock) { // Is there some airtight entity blocking this direction? If yes, don't include this direction in the // pressure differential - if (HasAirtightBlocker(grid.GetAnchoredEntities(adjacentPos), dir.GetOpposite(), airtightQuery)) + if (HasAirtightBlocker(_mapping.GetAnchoredEntities(xform.ParentUid, grid, adjacentPos), dir.GetOpposite(), airtightQuery)) continue; var p = gas.Pressure; diff --git a/Content.Shared/Doors/Components/FirelockComponent.cs b/Content.Shared/Doors/Components/FirelockComponent.cs index 97e57185cac..ca62daaa0fd 100644 --- a/Content.Shared/Doors/Components/FirelockComponent.cs +++ b/Content.Shared/Doors/Components/FirelockComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Doors.Components; +using Robust.Shared.GameStates; namespace Content.Shared.Doors.Components { @@ -7,9 +7,11 @@ namespace Content.Shared.Doors.Components /// auto-closing on depressurization, air/fire alarm interactions, and preventing normal door functions when /// retaining pressure.. /// - [RegisterComponent] + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class FirelockComponent : Component { + #region Settings + /// /// Pry time modifier to be used when the firelock is currently closed due to fire or pressure. /// @@ -39,5 +41,47 @@ public sealed partial class FirelockComponent : Component /// [DataField("alarmAutoClose"), ViewVariables(VVAccess.ReadWrite)] public bool AlarmAutoClose = true; + + /// + /// The cooldown duration before a firelock can automatically close due to a hazardous environment after it has + /// been pried open. Measured in seconds. + /// + [DataField] + public TimeSpan EmergencyCloseCooldownDuration = TimeSpan.FromSeconds(2); + + #endregion + + #region Set by system + + /// + /// When the firelock will be allowed to automatically close again due to a hazardous environment. + /// + [DataField] + public TimeSpan? EmergencyCloseCooldown; + + /// + /// Whether the firelock can open, or is locked due to its environment. + /// + public bool IsLocked => Pressure || Temperature; + + /// + /// Whether the firelock is holding back a hazardous pressure. + /// + [DataField, AutoNetworkedField] + public bool Pressure; + + /// + /// Whether the firelock is holding back extreme temperatures. + /// + [DataField, AutoNetworkedField] + public bool Temperature; + + /// + /// Whether the airlock is powered. + /// + [DataField, AutoNetworkedField] + public bool Powered; + + #endregion } } diff --git a/Content.Shared/Doors/Systems/SharedDoorSystem.cs b/Content.Shared/Doors/Systems/SharedDoorSystem.cs index b58b7b265e9..20456c14777 100644 --- a/Content.Shared/Doors/Systems/SharedDoorSystem.cs +++ b/Content.Shared/Doors/Systems/SharedDoorSystem.cs @@ -6,7 +6,6 @@ using Content.Shared.Database; using Content.Shared.Doors.Components; using Content.Shared.Emag.Systems; -using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Physics; using Content.Shared.Popups; @@ -466,7 +465,7 @@ public bool OnPartialClose(EntityUid uid, DoorComponent? door = null, PhysicsCom door.Partial = true; - // Make sure no entity waled into the airlock when it started closing. + // Make sure no entity walked into the airlock when it started closing. if (!CanClose(uid, door)) { door.NextStateChange = GameTiming.CurTime + door.OpenTimeTwo; diff --git a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs new file mode 100644 index 00000000000..7d033efdd40 --- /dev/null +++ b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs @@ -0,0 +1,125 @@ +using Content.Shared.Access.Systems; +using Content.Shared.Doors.Components; +using Content.Shared.Popups; +using Content.Shared.Prying.Components; +using Robust.Shared.Timing; + +namespace Content.Shared.Doors.Systems; + +public abstract class SharedFirelockSystem : EntitySystem +{ + [Dependency] private readonly AccessReaderSystem _accessReaderSystem = default!; + [Dependency] private readonly SharedPopupSystem _popupSystem = default!; + [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedDoorSystem _doorSystem = default!; + [Dependency] private readonly IGameTiming _gameTiming = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUpdateState); + + // Access/Prying + SubscribeLocalEvent(OnBeforeDoorOpened); + SubscribeLocalEvent(OnDoorGetPryTimeModifier); + SubscribeLocalEvent(OnAfterPried); + + // Visuals + SubscribeLocalEvent(UpdateVisuals); + SubscribeLocalEvent(UpdateVisuals); + } + + public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = null, DoorComponent? door = null) + { + if (!Resolve(uid, ref firelock, ref door)) + return false; + + if (door.State != DoorState.Open + || firelock.EmergencyCloseCooldown != null + && _gameTiming.CurTime < firelock.EmergencyCloseCooldown) + return false; + + if (!_doorSystem.TryClose(uid, door)) + return false; + + return _doorSystem.OnPartialClose(uid, door); + } + + private void OnUpdateState(EntityUid uid, FirelockComponent component, DoorStateChangedEvent args) + { + var ev = new BeforeDoorAutoCloseEvent(); + RaiseLocalEvent(uid, ev); + UpdateVisuals(uid, component, args); + if (ev.Cancelled) + { + return; + } + + _doorSystem.SetNextStateChange(uid, component.AutocloseDelay); + } + + #region Access/Prying + + private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) + { + // Give the Door remote the ability to force a firelock open even if it is holding back dangerous gas + var overrideAccess = (args.User != null) && _accessReaderSystem.IsAllowed(args.User.Value, uid); + + if (!component.Powered || (!overrideAccess && component.IsLocked)) + args.Cancel(); + } + + private void OnDoorGetPryTimeModifier(EntityUid uid, FirelockComponent component, ref GetPryTimeModifierEvent args) + { + if (component.Temperature) + { + _popupSystem.PopupClient(Loc.GetString("firelock-component-is-holding-fire-message"), + uid, args.User, PopupType.MediumCaution); + } + else if (component.Pressure) + { + _popupSystem.PopupClient(Loc.GetString("firelock-component-is-holding-pressure-message"), + uid, args.User, PopupType.MediumCaution); + } + + if (component.IsLocked) + args.PryTimeModifier *= component.LockedPryTimeModifier; + } + + private void OnAfterPried(EntityUid uid, FirelockComponent component, ref PriedEvent args) + { + component.EmergencyCloseCooldown = _gameTiming.CurTime + component.EmergencyCloseCooldownDuration; + } + + #endregion + + #region Visuals + + private void UpdateVisuals(EntityUid uid, FirelockComponent component, EntityEventArgs args) => UpdateVisuals(uid, component); + + private void UpdateVisuals(EntityUid uid, + FirelockComponent? firelock = null, + DoorComponent? door = null, + AppearanceComponent? appearance = null) + { + if (!Resolve(uid, ref door, ref appearance, false)) + return; + + // only bother to check pressure on doors that are some variation of closed. + if (door.State != DoorState.Closed + && door.State != DoorState.Welded + && door.State != DoorState.Denying) + { + _appearance.SetData(uid, DoorVisuals.ClosedLights, false, appearance); + return; + } + + if (!Resolve(uid, ref firelock, ref appearance, false)) + return; + + _appearance.SetData(uid, DoorVisuals.ClosedLights, firelock.IsLocked, appearance); + } + + #endregion +} diff --git a/Content.Shared/Prying/Components/PryUnpoweredComponent.cs b/Content.Shared/Prying/Components/PryUnpoweredComponent.cs index f0e61dc9685..b6b69a2577d 100644 --- a/Content.Shared/Prying/Components/PryUnpoweredComponent.cs +++ b/Content.Shared/Prying/Components/PryUnpoweredComponent.cs @@ -8,4 +8,6 @@ namespace Content.Shared.Prying.Components; [RegisterComponent, NetworkedComponent] public sealed partial class PryUnpoweredComponent : Component { + [DataField] + public float PryModifier = 0.1f; } diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index ab87585c706..372c89c9ae0 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -93,17 +93,17 @@ public bool TryPry(EntityUid target, EntityUid user, out DoAfterId? id) id = null; // We don't care about displaying a message if no tool was used. - if (!CanPry(target, user, out _)) + if (!TryComp(target, out var unpoweredComp) || !CanPry(target, user, out _, unpoweredComp: unpoweredComp)) // If we have reached this point we want the event that caused this // to be marked as handled. return true; // hand-prying is much slower - var modifier = CompOrNull(user)?.SpeedModifier ?? 0.1f; + var modifier = CompOrNull(user)?.SpeedModifier ?? unpoweredComp.PryModifier; return StartPry(target, user, null, modifier, out id); } - private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null) + private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null, PryUnpoweredComponent? unpoweredComp = null) { BeforePryEvent canev; @@ -113,7 +113,7 @@ private bool CanPry(EntityUid target, EntityUid user, out string? message, Pryin } else { - if (!TryComp(target, out _)) + if (!Resolve(target, ref unpoweredComp)) { message = null; return false; diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index fcdb432dce6..860db862aee 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -108,6 +108,8 @@ - type: DoorBolt - type: AccessReader access: [ [ "Engineering" ] ] + - type: PryUnpowered + pryModifier: 0.5 - type: entity id: Firelock From 456e6f07ec4c98a72a0900bde6aee4051ae7ee4f Mon Sep 17 00:00:00 2001 From: PJBot Date: Wed, 22 May 2024 11:17:27 +0000 Subject: [PATCH 004/112] Automatic changelog update --- Resources/Changelog/Changelog.yml | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index d20cf44cdb9..a8e3a5f155b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: MACMAN2003 - changes: - - message: Diagonal windows no longer space you when in a pressurized environment. - type: Fix - id: 6112 - time: '2024-03-08T07:50:34.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25926 - author: mryikes changes: - message: New Nuke Detonation Song "Clearly Nuclear". @@ -3870,3 +3863,15 @@ id: 6611 time: '2024-05-22T07:52:58.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28200 +- author: nikthechampiongr + changes: + - message: Firelocks can now be pried by hand. + type: Tweak + - message: Firelocks will now not automatically close for 2 seconds after you pry + them open. + type: Tweak + - message: Firelocks are now properly predicted. + type: Fix + id: 6612 + time: '2024-05-22T11:16:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26582 From 687bf8caaa1f3c75224f8cdb367a358d6e1ebfbe Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Wed, 22 May 2024 05:29:19 -0700 Subject: [PATCH 005/112] Revert "Make hotplate and grill anchorable on table" (#28202) Revert "Make hotplate and grill anchorable on table (#28026)" This reverts commit 26747be232c364abcb4e43fb934c85ef0e3e1264. --- .../Prototypes/Entities/Structures/Machines/hotplate.yml | 4 +++- .../Prototypes/Entities/Structures/Machines/microwave.yml | 1 - .../Entities/Structures/Machines/reagent_grinder.yml | 1 - 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml index 05cbb60ed30..3764f135915 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/hotplate.yml @@ -15,7 +15,9 @@ mask: - TabletopMachineMask layer: - - TabletopMachineLayer + - Impassable + - MidImpassable + - LowImpassable hard: false - type: ApcPowerReceiver powerLoad: 300 diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index d78960030d6..fe4eb145183 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -58,7 +58,6 @@ - TabletopMachineMask layer: - TabletopMachineLayer - hard: false - type: Sprite sprite: Structures/Machines/microwave.rsi drawdepth: SmallObjects diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index 9894a2691fe..d6e73333133 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -32,7 +32,6 @@ - TabletopMachineMask layer: - TabletopMachineLayer - hard: false - type: Sprite sprite: Structures/Machines/juicer.rsi drawdepth: SmallObjects From 1fa493e1af0e3f31b53c40bda0d7cefe885af343 Mon Sep 17 00:00:00 2001 From: Julian Giebel Date: Wed, 22 May 2024 16:23:55 +0200 Subject: [PATCH 006/112] Implement permissive version of AddMarkup and use it for tips (#28204) * Implement permissive version of ddMarkup Use permissive ddMarkup for news article input Use permissive ddMarkup for tips * Fix doc comment format --- .../MassMedia/Ui/ArticleEditorPanel.xaml.cs | 2 +- Content.Client/Message/RichTextLabelExt.cs | 18 ++++++++++++++++++ Content.Client/Tips/TippyUIController.cs | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs index 7f98e3e0c3d..5e068f1e9c5 100644 --- a/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs +++ b/Content.Client/MassMedia/Ui/ArticleEditorPanel.xaml.cs @@ -76,7 +76,7 @@ private void OnPreview(BaseButton.ButtonEventArgs eventArgs) TextEditPanel.Visible = !_preview; PreviewPanel.Visible = _preview; - PreviewLabel.SetMarkup(Rope.Collapse(ContentField.TextRope)); + PreviewLabel.SetMarkupPermissive(Rope.Collapse(ContentField.TextRope)); } private void OnCancel(BaseButton.ButtonEventArgs eventArgs) diff --git a/Content.Client/Message/RichTextLabelExt.cs b/Content.Client/Message/RichTextLabelExt.cs index ab6d17bf44d..7ff6390764b 100644 --- a/Content.Client/Message/RichTextLabelExt.cs +++ b/Content.Client/Message/RichTextLabelExt.cs @@ -5,9 +5,27 @@ namespace Content.Client.Message; public static class RichTextLabelExt { + + + /// + /// Sets the labels markup. + /// + /// + /// Invalid markup will cause exceptions to be thrown. Don't use this for user input! + /// public static RichTextLabel SetMarkup(this RichTextLabel label, string markup) { label.SetMessage(FormattedMessage.FromMarkup(markup)); return label; } + + /// + /// Sets the labels markup.
+ /// Uses FormatedMessage.FromMarkupPermissive which treats invalid markup as text. + ///
+ public static RichTextLabel SetMarkupPermissive(this RichTextLabel label, string markup) + { + label.SetMessage(FormattedMessage.FromMarkupPermissive(markup)); + return label; + } } diff --git a/Content.Client/Tips/TippyUIController.cs b/Content.Client/Tips/TippyUIController.cs index 67c3ee45a7e..2cc694d97d4 100644 --- a/Content.Client/Tips/TippyUIController.cs +++ b/Content.Client/Tips/TippyUIController.cs @@ -175,7 +175,7 @@ private void NextState(TippyUI tippy) sprite.LayerSetVisible("hiding", false); } sprite.Rotation = 0; - tippy.Label.SetMarkup(_currentMessage.Msg); + tippy.Label.SetMarkupPermissive(_currentMessage.Msg); tippy.Label.Visible = false; tippy.LabelPanel.Visible = false; tippy.Visible = true; From 79d4c0eee0861e8499134a34db0231a189206b0f Mon Sep 17 00:00:00 2001 From: Doctor-Cpu <77215380+Doctor-Cpu@users.noreply.github.com> Date: Wed, 22 May 2024 17:59:33 +0100 Subject: [PATCH 007/112] misc atlas fixes (#28191) misc fixes --- Resources/Maps/atlas.yml | 111 ++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 67 deletions(-) diff --git a/Resources/Maps/atlas.yml b/Resources/Maps/atlas.yml index cfd5f3b5acd..cb7dc8e778b 100644 --- a/Resources/Maps/atlas.yml +++ b/Resources/Maps/atlas.yml @@ -89,7 +89,7 @@ entities: version: 6 0,1: ind: 0,1 - tiles: AwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALAAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAA + tiles: AwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAAwAAAAAAAwAAAAAAAwAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHQAAAAAAeQAAAAAAWQAAAAAAWQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAUAAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALAAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAdgAAAAAAHQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAATQAAAAAATQAAAAAATQAAAAAATQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAPgAAAAAAdgAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAALgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAeAAAAAAAeAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAAAAAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAWQAAAAAA version: 6 1,1: ind: 1,1 @@ -3360,6 +3360,13 @@ entities: - type: Transform pos: -44.5,-15.5 parent: 30 +- proto: AirlockArmoryGlassLocked + entities: + - uid: 1448 + components: + - type: Transform + pos: 9.5,14.5 + parent: 30 - proto: AirlockAtmosphericsGlassLocked entities: - uid: 241 @@ -3940,6 +3947,9 @@ entities: - type: Transform pos: 18.5,-6.5 parent: 30 + - type: DeviceLinkSource + lastSignals: + DoorStatus: True - uid: 2282 components: - type: Transform @@ -4053,12 +4063,6 @@ entities: parent: 30 - proto: AirlockHeadOfSecurityGlassLocked entities: - - uid: 1448 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,14.5 - parent: 30 - uid: 7378 components: - type: Transform @@ -4239,6 +4243,9 @@ entities: - type: Transform pos: -6.5,17.5 parent: 30 + - type: DeviceLinkSource + lastSignals: + DoorStatus: True - proto: AirlockMedicalGlass entities: - uid: 2408 @@ -7082,7 +7089,7 @@ entities: - uid: 2074 components: - type: Transform - pos: -10.5,8.5 + pos: -7.5,8.5 parent: 30 - uid: 2075 components: @@ -23899,14 +23906,6 @@ entities: rot: 1.5707963267948966 rad pos: -44.5,-16.5 parent: 30 -- proto: EncryptionKeyCargo - entities: - - uid: 8041 - components: - - type: Transform - parent: 8035 - - type: Physics - canCollide: False - proto: EncryptionKeyCommand entities: - uid: 6716 @@ -23931,14 +23930,6 @@ entities: parent: 6972 - type: Physics canCollide: False -- proto: EncryptionKeyMedical - entities: - - uid: 7916 - components: - - type: Transform - parent: 7915 - - type: Physics - canCollide: False - proto: EncryptionKeyScience entities: - uid: 7393 @@ -38622,6 +38613,14 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,-9.5 parent: 30 +- proto: HydroponicsToolClippers + entities: + - uid: 7916 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.368904,17.565664 + parent: 30 - proto: HydroponicsToolHatchet entities: - uid: 1498 @@ -41743,14 +41742,6 @@ entities: parent: 30 - type: ApcPowerReceiver powerLoad: 0 - - uid: 7438 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -30.5,-11.5 - parent: 30 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 7439 components: - type: Transform @@ -41773,6 +41764,12 @@ entities: rot: 3.141592653589793 rad pos: 3.5,-15.5 parent: 30 + - uid: 8041 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -31.5,-11.5 + parent: 30 - uid: 8112 components: - type: Transform @@ -46316,6 +46313,14 @@ entities: - type: Transform pos: 10.5,15.5 parent: 30 +- proto: SpawnMobMonkeyPunpun + entities: + - uid: 8035 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,3.5 + parent: 30 - proto: SpawnMobMouse entities: - uid: 1570 @@ -48692,48 +48697,20 @@ entities: showEnts: False occludes: True ents: [] -- proto: TelecomServerFilled +- proto: TelecomServerFilledCargo entities: - - uid: 7915 + - uid: 7438 components: - type: Transform - pos: -47.5,6.5 + pos: -48.5,6.5 parent: 30 - - type: ContainerContainer - containers: - key_slots: !type:Container - showEnts: False - occludes: True - ents: - - 7916 - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - - uid: 8035 +- proto: TelecomServerFilledMedical + entities: + - uid: 7915 components: - type: Transform - pos: -48.5,6.5 + pos: -47.5,6.5 parent: 30 - - type: ContainerContainer - containers: - key_slots: !type:Container - showEnts: False - occludes: True - ents: - - 8041 - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - proto: ToiletDirtyWater entities: - uid: 7674 From c082773b5fa50741cd6d35dea95452a940feb36e Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Wed, 22 May 2024 18:59:49 +0200 Subject: [PATCH 008/112] Remove dupe closet janitor bombsuit (#28177) * Remove dupe closet janitor bombsuit * Update Resources/migration.yml Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> --------- Co-authored-by: Ed <96445749+TheShuEd@users.noreply.github.com> --- .../Prototypes/Catalog/Cargo/cargo_service.yml | 2 +- .../Prototypes/Catalog/Fills/Crates/service.yml | 13 ------------- .../Prototypes/Catalog/Fills/Lockers/service.yml | 2 +- Resources/migration.yml | 3 +++ 4 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml index ebcd9dfc5e6..d2ca08e1166 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_service.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_service.yml @@ -173,7 +173,7 @@ icon: sprite: Clothing/Head/Helmets/janitor_bombsuit.rsi state: icon - product: CrateJanitorExplosive + product: ClosetJanitorBombFilled cost: 1000 category: cargoproduct-category-name-service group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 35e66ac4d35..5b16b91f8b4 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -321,16 +321,3 @@ prob: 0.1 - id: ShardGlassPlasma prob: 0.1 - -- type: entity - id: CrateJanitorExplosive - parent: ClosetJanitorBomb - name: janitorial bomb suit crate - description: Supplies a bomb suit for cleaning up any explosive compounds, buy one today! - components: - - type: StorageFill - contents: - - id: ClothingOuterSuitJanitorBomb - amount: 1 - - id: ClothingHeadHelmetJanitorBombSuit - amount: 1 diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml index 945ae0dd7b8..6d0577a16eb 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/service.yml @@ -130,7 +130,7 @@ - type: entity id: ClosetJanitorBombFilled parent: ClosetJanitorBomb - suffix: Filled + suffix: DO NOT MAP, Filled components: - type: StorageFill contents: diff --git a/Resources/migration.yml b/Resources/migration.yml index 28d63be9920..c19f1408707 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -339,3 +339,6 @@ DrinkBottleGoldschlager: DrinkBottleGildlager # 2024-05-14 soda_dispenser: SodaDispenser chem_master: ChemMaster + +# 2024-05-21 +CrateJanitorExplosive: ClosetJanitorBombFilled From 0e0f50f3d1d76c0ba1283d5fa2a92678e3de0466 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Wed, 22 May 2024 21:16:14 -0700 Subject: [PATCH 009/112] Prioritize empty item slots when inserting (#28203) * Prioritize empty item slots when inserting * Revert "Prioritize empty item slots when inserting" This reverts commit 4272a65cba5fc18df801812b0af20123aec08409. * Prioritize empty item slots when inserting * Try drop * Check for any can insert before dropping --- .../Containers/ItemSlot/ItemSlotsSystem.cs | 76 ++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 914b34d3c12..2e3f9ed461a 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -197,6 +197,7 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera if (!EntityManager.TryGetComponent(args.User, out HandsComponent? hands)) return; + var slots = new List(); foreach (var slot in itemSlots.Slots.Values) { if (!slot.InsertOnInteract) @@ -205,10 +206,20 @@ private void OnInteractUsing(EntityUid uid, ItemSlotsComponent itemSlots, Intera if (!CanInsert(uid, args.Used, args.User, slot, swap: slot.Swap, popup: args.User)) continue; - // Drop the held item onto the floor. Return if the user cannot drop. - if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands)) - return; + slots.Add(slot); + } + if (slots.Count == 0) + return; + + // Drop the held item onto the floor. Return if the user cannot drop. + if (!_handsSystem.TryDrop(args.User, args.Used, handsComp: hands)) + return; + + slots.Sort(SortEmpty); + + foreach (var slot in slots) + { if (slot.Item != null) _handsSystem.TryPickupAnyHand(args.User, slot.Item.Value, handsComp: hands); @@ -333,6 +344,65 @@ public bool TryInsertFromHand(EntityUid uid, ItemSlot slot, EntityUid user, Hand Insert(uid, slot, held, user, excludeUserAudio: excludeUserAudio); return true; } + + /// + /// Tries to insert an item into any empty slot. + /// + /// The entity that has the item slots. + /// The item to be inserted. + /// The entity performing the interaction. + /// + /// If true, will exclude the user when playing sound. Does nothing client-side. + /// Useful for predicted interactions + /// + /// False if failed to insert item + public bool TryInsertEmpty(Entity ent, EntityUid item, EntityUid? user, bool excludeUserAudio = false) + { + if (!Resolve(ent, ref ent.Comp, false)) + return false; + + var slots = new List(); + foreach (var slot in ent.Comp.Slots.Values) + { + if (slot.ContainerSlot?.ContainedEntity != null) + continue; + + if (CanInsert(ent, item, user, slot)) + slots.Add(slot); + } + + if (slots.Count == 0) + return false; + + if (user != null && _handsSystem.IsHolding(user.Value, item)) + { + if (!_handsSystem.TryDrop(user.Value, item)) + return false; + } + + slots.Sort(SortEmpty); + + foreach (var slot in slots) + { + if (TryInsert(ent, slot, item, user, excludeUserAudio: excludeUserAudio)) + return true; + } + + return false; + } + + private static int SortEmpty(ItemSlot a, ItemSlot b) + { + var aEnt = a.ContainerSlot?.ContainedEntity; + var bEnt = b.ContainerSlot?.ContainedEntity; + if (aEnt == null && bEnt == null) + return a.Priority.CompareTo(b.Priority); + + if (aEnt == null) + return -1; + + return 1; + } #endregion #region Eject From 2ccd8e234d9acfb368c51fcf79485deb3d21ad4c Mon Sep 17 00:00:00 2001 From: blueDev2 <89804215+blueDev2@users.noreply.github.com> Date: Thu, 23 May 2024 16:27:45 -0400 Subject: [PATCH 010/112] Add Fruit Tag to watermelon slice (#28226) --- .../Prototypes/Entities/Objects/Consumable/Food/produce.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 1bd895829bd..888e4e4e353 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -1647,6 +1647,9 @@ reagents: - ReagentId: JuiceWatermelon Quantity: 4 + - type: Tag + tags: + - Fruit - type: entity name: grapes From 5cb914e4a62270d07d2c2f87e1d4762d14bc722f Mon Sep 17 00:00:00 2001 From: PJBot Date: Thu, 23 May 2024 20:28:53 +0000 Subject: [PATCH 011/112] 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 a8e3a5f155b..9ae89dad4a3 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: mryikes - changes: - - message: New Nuke Detonation Song "Clearly Nuclear". - type: Add - id: 6113 - time: '2024-03-09T01:44:54.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25765 - author: Plykiya changes: - message: Pre-filled syringes start in inject mode now. @@ -3875,3 +3868,10 @@ id: 6612 time: '2024-05-22T11:16:20.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/26582 +- author: blueDev2 + changes: + - message: Watermelon slices are now considered fruit + type: Fix + id: 6613 + time: '2024-05-23T20:27:45.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28226 From 594a8982602ca9e7cfe10dd77745e55b953088fb Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Thu, 23 May 2024 18:23:55 -0700 Subject: [PATCH 012/112] Fix whatever the fuck is going on in storage system slightly (#28236) * Fix whatever the fuck is going on in storage system slightly * Fix inverted check * h * Add silent bool * Silent --- .../BypassInteractionChecksComponent.cs | 6 ++ .../Inventory/InventorySystem.Slots.cs | 2 +- Content.Shared/Lock/LockSystem.cs | 9 +++ .../EntitySystems/SharedStorageSystem.cs | 62 ++++++++++--------- Content.Shared/Storage/StorageComponent.cs | 4 +- .../Entities/Mobs/Player/admin_ghost.yml | 1 + 6 files changed, 52 insertions(+), 32 deletions(-) create mode 100644 Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs diff --git a/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs b/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs new file mode 100644 index 00000000000..ca0ff963151 --- /dev/null +++ b/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs @@ -0,0 +1,6 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Interaction.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class BypassInteractionChecksComponent : Component; diff --git a/Content.Shared/Inventory/InventorySystem.Slots.cs b/Content.Shared/Inventory/InventorySystem.Slots.cs index 19831278b0a..228b788722e 100644 --- a/Content.Shared/Inventory/InventorySystem.Slots.cs +++ b/Content.Shared/Inventory/InventorySystem.Slots.cs @@ -75,7 +75,7 @@ private void OnOpenSlotStorage(OpenSlotStorageNetworkMessage ev, EntitySessionEv if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp(entityUid, out var storageComponent)) { - _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent); + _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent, false); } } diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 54f5d801ea0..4115358d9d7 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -8,6 +8,7 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Popups; +using Content.Shared.Storage; using Content.Shared.Storage.Components; using Content.Shared.Verbs; using Content.Shared.Wires; @@ -42,11 +43,13 @@ public override void Initialize() SubscribeLocalEvent(OnEmagged); SubscribeLocalEvent(OnDoAfterLock); SubscribeLocalEvent(OnDoAfterUnlock); + SubscribeLocalEvent(OnStorageInteractAttempt); SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnAttemptChangePanel); SubscribeLocalEvent(OnUnanchorAttempt); } + private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) { _appearanceSystem.SetData(uid, LockVisuals.Locked, lockComp.Locked); @@ -293,6 +296,12 @@ private void OnDoAfterUnlock(EntityUid uid, LockComponent component, UnlockDoAft TryUnlock(uid, args.User, skipDoAfter: true); } + private void OnStorageInteractAttempt(Entity ent, ref StorageInteractAttemptEvent args) + { + if (ent.Comp.Locked) + args.Cancelled = true; + } + private void OnLockToggleAttempt(Entity ent, ref LockToggleAttemptEvent args) { if (args.Cancelled) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 6dd7f9d4184..ea0c9632f0e 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -2,17 +2,15 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.ActionBlocker; -using Content.Shared.Administration; -using Content.Shared.Administration.Managers; using Content.Shared.Containers.ItemSlots; using Content.Shared.Destructible; using Content.Shared.DoAfter; -using Content.Shared.Ghost; using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Implants.Components; using Content.Shared.Input; using Content.Shared.Interaction; +using Content.Shared.Interaction.Components; using Content.Shared.Inventory; using Content.Shared.Item; using Content.Shared.Lock; @@ -40,7 +38,6 @@ public abstract class SharedStorageSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] protected readonly IRobustRandom Random = default!; - [Dependency] private readonly ISharedAdminManager _admin = default!; [Dependency] protected readonly ActionBlockerSystem ActionBlocker = default!; [Dependency] private readonly EntityLookupSystem _entityLookupSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -249,17 +246,8 @@ private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundU private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent args) { - var silent = false; - if (!args.CanAccess || !args.CanInteract || TryComp(uid, out var lockComponent) && lockComponent.Locked) - { - // we allow admins to open the storage anyways - if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin)) - return; - - silent = true; - } - - silent |= HasComp(args.User); + if (!CanInteract(args.User, (uid, component), args.CanAccess && args.CanInteract)) + return; // Does this player currently have the storage UI open? var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User); @@ -274,7 +262,7 @@ private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent< } else { - OpenStorageUI(uid, args.User, component, silent); + OpenStorageUI(uid, args.User, component); } } }; @@ -298,13 +286,16 @@ private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent< /// Opens the storage UI for an entity /// /// The entity to open the UI for - public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) + public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true) { if (!Resolve(uid, ref storageComp, false)) return; // prevent spamming bag open / honkerton honk sound silent |= TryComp(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay)); + if (!CanInteract(entity, (uid, storageComp), silent: silent)) + return; + if (!silent) { if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key)) @@ -326,7 +317,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb var entities = component.Container.ContainedEntities; - if (entities.Count == 0 || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked) + if (entities.Count == 0 || !CanInteract(args.User, (uid, component))) return; // if the target is storage, add a verb to transfer storage. @@ -337,7 +328,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb { Text = Loc.GetString("storage-component-transfer-verb"), IconEntity = GetNetEntity(args.Using), - Act = () => TransferEntities(uid, args.Target, args.User, component, lockComponent, targetStorage, targetLock) + Act = () => TransferEntities(uid, args.Target, args.User, component, null, targetStorage, targetLock) }; args.Verbs.Add(verb); @@ -350,7 +341,7 @@ private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerb /// true if inserted, false otherwise private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, InteractUsingEvent args) { - if (args.Handled || !storageComp.ClickInsert || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked) + if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false)) return; if (HasComp(uid)) @@ -368,7 +359,7 @@ private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, Intera /// private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInWorldEvent args) { - if (args.Handled || TryComp(uid, out var lockComponent) && lockComponent.Locked) + if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert)) return; // Toggle @@ -378,7 +369,7 @@ private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInW } else { - OpenStorageUI(uid, args.User, storageComp); + OpenStorageUI(uid, args.User, storageComp, false); } args.Handled = true; @@ -392,7 +383,7 @@ private void OnImplantActivate(EntityUid uid, StorageComponent storageComp, Open if (args.Handled) return; - OpenStorageUI(uid, args.Performer, storageComp); + OpenStorageUI(uid, args.Performer, storageComp, false); args.Handled = true; } @@ -1403,7 +1394,7 @@ public ItemSizePrototype GetMaxItemSize(Entity uid) } /// - /// Checks if a storage's UI is open by anyone when locked, and closes it unless they're an admin. + /// Checks if a storage's UI is open by anyone when locked, and closes it. /// private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockToggledEvent args) { @@ -1413,11 +1404,8 @@ private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockTo // Gets everyone looking at the UI foreach (var actor in _ui.GetActors(uid, StorageComponent.StorageUiKey.Key).ToList()) { - if (_admin.HasAdminFlag(actor, AdminFlags.Admin)) - continue; - - // And closes it unless they're an admin - _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor); + if (!CanInteract(actor, (uid, component))) + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor); } } @@ -1457,7 +1445,7 @@ private void HandleToggleSlotUI(ICommonSession? session, string slot) if (!_ui.IsUiOpen(storageEnt.Value, StorageComponent.StorageUiKey.Key, playerEnt)) { - OpenStorageUI(storageEnt.Value, playerEnt); + OpenStorageUI(storageEnt.Value, playerEnt, silent: false); } else { @@ -1472,6 +1460,20 @@ protected void ClearCantFillReasons() #endif } + private bool CanInteract(EntityUid user, Entity storage, bool canInteract = true, bool silent = true) + { + if (HasComp(user)) + return true; + + if (!canInteract) + return false; + + var ev = new StorageInteractAttemptEvent(silent); + RaiseLocalEvent(storage, ref ev); + + return !ev.Cancelled; + } + /// /// Plays a clientside pickup animation for the specified uid. /// diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index ef682dd4f94..2860f8dacfe 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -5,7 +5,6 @@ using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; @@ -228,6 +227,9 @@ public AnimateInsertingEntitiesEvent(NetEntity storage, List storedEn } } + [ByRefEvent] + public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false); + [NetSerializable] [Serializable] public enum StorageVisuals : byte diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 8171ec0053c..b294729e07a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -90,6 +90,7 @@ - type: InventorySlots - type: Loadout prototypes: [ MobAghostGear ] + - type: BypassInteractionChecks - type: entity id: ActionAGhostShowSolar From 8a95cb186c922eee64c4c389c5ff247090861210 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Thu, 23 May 2024 22:43:04 -0400 Subject: [PATCH 013/112] Remove AlertType and AlertCategory (#27933) --- Content.Client/Alerts/ClientAlertsSystem.cs | 2 +- Content.Client/Revenant/RevenantSystem.cs | 3 +- .../Systems/Alerts/AlertsUIController.cs | 3 +- .../Systems/Alerts/Widgets/AlertsUI.xaml.cs | 13 +- .../Components/Mobs/AlertsComponentTests.cs | 15 +- .../Tests/Gravity/WeightlessStatusTests.cs | 8 +- .../Abilities/Mime/MimePowersComponent.cs | 8 + .../Abilities/Mime/MimePowersSystem.cs | 11 +- Content.Server/Alert/Commands/ClearAlert.cs | 4 +- Content.Server/Alert/Commands/ShowAlert.cs | 4 +- .../Atmos/Components/BarotraumaComponent.cs | 10 + .../Atmos/Components/FlammableComponent.cs | 5 + .../Atmos/EntitySystems/BarotraumaSystem.cs | 10 +- .../Atmos/EntitySystems/FlammableSystem.cs | 4 +- .../Body/Components/BloodstreamComponent.cs | 4 + .../Body/Components/InternalsComponent.cs | 6 + .../Body/Components/LungComponent.cs | 4 +- .../Body/Systems/BloodstreamSystem.cs | 4 +- .../Body/Systems/InternalsSystem.cs | 14 +- .../Chemistry/ReagentEffects/AdjustAlert.cs | 8 +- Content.Server/Clothing/MagbootsSystem.cs | 4 +- .../Ensnaring/EnsnareableSystem.Ensnaring.cs | 4 +- .../Ninja/Systems/SpaceNinjaSystem.cs | 11 +- .../Revenant/EntitySystems/RevenantSystem.cs | 2 +- .../Shuttles/Systems/ShuttleConsoleSystem.cs | 4 +- Content.Server/Silicons/Borgs/BorgSystem.cs | 18 +- .../Components/TemperatureComponent.cs | 8 + .../Temperature/Systems/TemperatureSystem.cs | 14 +- Content.Shared/Alert/AlertCategory.cs | 20 -- .../Alert/AlertCategoryPrototype.cs | 14 ++ Content.Shared/Alert/AlertKey.cs | 12 +- Content.Shared/Alert/AlertOrderPrototype.cs | 35 +-- Content.Shared/Alert/AlertPrototype.cs | 206 +++++++++--------- Content.Shared/Alert/AlertState.cs | 3 +- Content.Shared/Alert/AlertType.cs | 59 ----- Content.Shared/Alert/AlertsSystem.cs | 26 +-- Content.Shared/Alert/ClickAlertEvent.cs | 7 +- .../Buckle/Components/StrapComponent.cs | 3 +- .../Buckle/SharedBuckleSystem.Buckle.cs | 5 +- Content.Shared/Clothing/MagbootsComponent.cs | 4 + .../Pacification/PacificationSystem.cs | 5 +- .../Pacification/PacifiedComponent.cs | 4 + .../Cuffs/Components/CuffableComponent.cs | 5 + Content.Shared/Cuffs/SharedCuffableSystem.cs | 4 +- .../Damage/Components/StaminaComponent.cs | 5 + .../Damage/Systems/StaminaSystem.cs | 8 +- .../Components/EnsnareableComponent.cs | 5 + Content.Shared/Gravity/SharedGravitySystem.cs | 15 +- .../Mobs/Components/MobThresholdsComponent.cs | 28 ++- .../Mobs/Systems/MobThresholdSystem.cs | 2 +- .../Pulling/Components/PullableComponent.cs | 5 + .../Pulling/Components/PullerComponent.cs | 7 +- .../Movement/Pulling/Systems/PullingSystem.cs | 8 +- .../Ninja/Components/SpaceNinjaComponent.cs | 4 + .../Nutrition/Components/HungerComponent.cs | 14 +- .../Nutrition/Components/ThirstComponent.cs | 12 +- .../Nutrition/EntitySystems/HungerSystem.cs | 4 +- .../Nutrition/EntitySystems/ThirstSystem.cs | 2 +- .../Revenant/Components/RevenantComponent.cs | 4 + .../Shuttles/Components/PilotComponent.cs | 5 + .../Borgs/Components/BorgChassisComponent.cs | 10 +- .../StatusEffect/StatusEffectPrototype.cs | 2 +- .../StatusEffect/StatusEffectsSystem.cs | 2 +- .../Weapons/Reflect/ReflectSystem.cs | 7 +- .../Shared/Alert/AlertManagerTests.cs | 17 +- .../Shared/Alert/AlertOrderPrototypeTests.cs | 26 +-- .../Shared/Alert/AlertPrototypeTests.cs | 6 +- .../Alert/ServerAlertsComponentTests.cs | 17 +- Resources/Prototypes/Alerts/categories.yml | 35 +++ 69 files changed, 482 insertions(+), 385 deletions(-) delete mode 100644 Content.Shared/Alert/AlertCategory.cs create mode 100644 Content.Shared/Alert/AlertCategoryPrototype.cs delete mode 100644 Content.Shared/Alert/AlertType.cs create mode 100644 Resources/Prototypes/Alerts/categories.yml diff --git a/Content.Client/Alerts/ClientAlertsSystem.cs b/Content.Client/Alerts/ClientAlertsSystem.cs index 223bf7876ac..359c8957f9d 100644 --- a/Content.Client/Alerts/ClientAlertsSystem.cs +++ b/Content.Client/Alerts/ClientAlertsSystem.cs @@ -91,7 +91,7 @@ private void OnPlayerDetached(EntityUid uid, AlertsComponent component, LocalPla ClearAlerts?.Invoke(this, EventArgs.Empty); } - public void AlertClicked(AlertType alertType) + public void AlertClicked(ProtoId alertType) { RaiseNetworkEvent(new ClickAlertEvent(alertType)); } diff --git a/Content.Client/Revenant/RevenantSystem.cs b/Content.Client/Revenant/RevenantSystem.cs index 49d29d8a5f4..e050fe35aa2 100644 --- a/Content.Client/Revenant/RevenantSystem.cs +++ b/Content.Client/Revenant/RevenantSystem.cs @@ -1,5 +1,4 @@ using Content.Client.Alerts; -using Content.Shared.Alert; using Content.Shared.Revenant; using Content.Shared.Revenant.Components; using Robust.Client.GameObjects; @@ -42,7 +41,7 @@ private void OnAppearanceChange(EntityUid uid, RevenantComponent component, ref private void OnUpdateAlert(Entity ent, ref UpdateAlertSpriteEvent args) { - if (args.Alert.AlertType != AlertType.Essence) + if (args.Alert.ID != ent.Comp.EssenceAlert) return; var sprite = args.SpriteViewEnt.Comp; diff --git a/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs b/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs index 3b85972a9b2..5c195120389 100644 --- a/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs +++ b/Content.Client/UserInterface/Systems/Alerts/AlertsUIController.cs @@ -7,6 +7,7 @@ using Robust.Client.Player; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Prototypes; namespace Content.Client.UserInterface.Systems.Alerts; @@ -43,7 +44,7 @@ private void OnScreenLoad() SyncAlerts(); } - private void OnAlertPressed(object? sender, AlertType e) + private void OnAlertPressed(object? sender, ProtoId e) { _alertsSystem?.AlertClicked(e); } diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs index a1a494c47b3..d6a79a81c46 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs @@ -4,6 +4,7 @@ using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Input; +using Robust.Shared.Prototypes; namespace Content.Client.UserInterface.Systems.Alerts.Widgets; @@ -21,8 +22,10 @@ public AlertsUI() RobustXamlLoader.Load(this); } - public void SyncControls(AlertsSystem alertsSystem, AlertOrderPrototype? alertOrderPrototype, - IReadOnlyDictionary alertStates) + public void SyncControls(AlertsSystem alertsSystem, + AlertOrderPrototype? alertOrderPrototype, + IReadOnlyDictionary alertStates) { // remove any controls with keys no longer present if (SyncRemoveControls(alertStates)) @@ -46,7 +49,7 @@ public void ClearAllControls() _alertControls.Clear(); } - public event EventHandler? AlertPressed; + public event EventHandler>? AlertPressed; private bool SyncRemoveControls(IReadOnlyDictionary alertStates) { @@ -88,7 +91,7 @@ private void SyncUpdateControls(AlertsSystem alertsSystem, AlertOrderPrototype? } if (_alertControls.TryGetValue(newAlert.AlertKey, out var existingAlertControl) && - existingAlertControl.Alert.AlertType == newAlert.AlertType) + existingAlertControl.Alert.ID == newAlert.ID) { // key is the same, simply update the existing control severity / cooldown existingAlertControl.SetSeverity(alertState.Severity); @@ -155,6 +158,6 @@ private void AlertControlPressed(BaseButton.ButtonEventArgs args) if (args.Event.Function != EngineKeyFunctions.UIClick) return; - AlertPressed?.Invoke(this, control.Alert.AlertType); + AlertPressed?.Invoke(this, control.Alert.ID); } } diff --git a/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs b/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs index 1da77ac5589..ef4e6326cda 100644 --- a/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs +++ b/Content.IntegrationTests/Tests/GameObjects/Components/Mobs/AlertsComponentTests.cs @@ -5,7 +5,6 @@ using Robust.Client.UserInterface; using Robust.Server.Player; using Robust.Shared.GameObjects; -using Robust.Shared.IoC; namespace Content.IntegrationTests.Tests.GameObjects.Components.Mobs { @@ -45,8 +44,8 @@ await server.WaitAssertion(() => Assert.That(alerts, Is.Not.Null); var alertCount = alerts.Count; - alertsSystem.ShowAlert(playerUid, AlertType.Debug1); - alertsSystem.ShowAlert(playerUid, AlertType.Debug2); + alertsSystem.ShowAlert(playerUid, "Debug1"); + alertsSystem.ShowAlert(playerUid, "Debug2"); Assert.That(alerts, Has.Count.EqualTo(alertCount + 2)); }); @@ -87,14 +86,14 @@ static AlertsUI FindAlertsUI(Control control) // we should be seeing 3 alerts - our health, and the 2 debug alerts, in a specific order. Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(3)); var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c); - var alertIDs = alertControls.Select(ac => ac.Alert.AlertType).ToArray(); - var expectedIDs = new[] { AlertType.HumanHealth, AlertType.Debug1, AlertType.Debug2 }; + var alertIDs = alertControls.Select(ac => ac.Alert.ID).ToArray(); + var expectedIDs = new[] { "HumanHealth", "Debug1", "Debug2" }; Assert.That(alertIDs, Is.SupersetOf(expectedIDs)); }); await server.WaitAssertion(() => { - alertsSystem.ClearAlert(playerUid, AlertType.Debug1); + alertsSystem.ClearAlert(playerUid, "Debug1"); }); await pair.RunTicksSync(5); @@ -104,8 +103,8 @@ await client.WaitAssertion(() => // we should be seeing 2 alerts now because one was cleared Assert.That(clientAlertsUI.AlertContainer.ChildCount, Is.GreaterThanOrEqualTo(2)); var alertControls = clientAlertsUI.AlertContainer.Children.Select(c => (AlertControl) c); - var alertIDs = alertControls.Select(ac => ac.Alert.AlertType).ToArray(); - var expectedIDs = new[] { AlertType.HumanHealth, AlertType.Debug2 }; + var alertIDs = alertControls.Select(ac => ac.Alert.ID).ToArray(); + var expectedIDs = new[] { "HumanHealth", "Debug2" }; Assert.That(alertIDs, Is.SupersetOf(expectedIDs)); }); diff --git a/Content.IntegrationTests/Tests/Gravity/WeightlessStatusTests.cs b/Content.IntegrationTests/Tests/Gravity/WeightlessStatusTests.cs index 0ad198d6ef2..74641126aee 100644 --- a/Content.IntegrationTests/Tests/Gravity/WeightlessStatusTests.cs +++ b/Content.IntegrationTests/Tests/Gravity/WeightlessStatusTests.cs @@ -1,5 +1,6 @@ using Content.Server.Gravity; using Content.Shared.Alert; +using Content.Shared.Gravity; using Robust.Shared.GameObjects; namespace Content.IntegrationTests.Tests.Gravity @@ -38,6 +39,7 @@ public async Task WeightlessStatusTest() var entityManager = server.ResolveDependency(); var alertsSystem = server.ResolveDependency().GetEntitySystem(); + var weightlessAlert = SharedGravitySystem.WeightlessAlert; EntityUid human = default; @@ -56,7 +58,7 @@ await server.WaitAssertion(() => await server.WaitAssertion(() => { // No gravity without a gravity generator - Assert.That(alertsSystem.IsShowingAlert(human, AlertType.Weightless)); + Assert.That(alertsSystem.IsShowingAlert(human, weightlessAlert)); generatorUid = entityManager.SpawnEntity("WeightlessGravityGeneratorDummy", entityManager.GetComponent(human).Coordinates); }); @@ -66,7 +68,7 @@ await server.WaitAssertion(() => await server.WaitAssertion(() => { - Assert.That(alertsSystem.IsShowingAlert(human, AlertType.Weightless), Is.False); + Assert.That(alertsSystem.IsShowingAlert(human, weightlessAlert), Is.False); // This should kill gravity entityManager.DeleteEntity(generatorUid); @@ -76,7 +78,7 @@ await server.WaitAssertion(() => await server.WaitAssertion(() => { - Assert.That(alertsSystem.IsShowingAlert(human, AlertType.Weightless)); + Assert.That(alertsSystem.IsShowingAlert(human, weightlessAlert)); }); await pair.RunTicksSync(10); diff --git a/Content.Server/Abilities/Mime/MimePowersComponent.cs b/Content.Server/Abilities/Mime/MimePowersComponent.cs index fd4fc2c2af9..d56644ed191 100644 --- a/Content.Server/Abilities/Mime/MimePowersComponent.cs +++ b/Content.Server/Abilities/Mime/MimePowersComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Alert; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -47,5 +48,12 @@ public sealed partial class MimePowersComponent : Component /// [DataField("vowCooldown")] public TimeSpan VowCooldown = TimeSpan.FromMinutes(5); + + [DataField] + public ProtoId VowAlert = "VowOfSilence"; + + [DataField] + public ProtoId VowBrokenAlert = "VowBroken"; + } } diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index 629fe993448..f3bf6e703f5 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -1,5 +1,4 @@ using Content.Server.Popups; -using Content.Server.Speech.Muting; using Content.Shared.Actions; using Content.Shared.Actions.Events; using Content.Shared.Alert; @@ -54,7 +53,7 @@ public override void Update(float frameTime) private void OnComponentInit(EntityUid uid, MimePowersComponent component, ComponentInit args) { EnsureComp(uid); - _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); + _alertsSystem.ShowAlert(uid, component.VowAlert); _actionsSystem.AddAction(uid, ref component.InvisibleWallActionEntity, component.InvisibleWallAction, uid); } @@ -115,8 +114,8 @@ public void BreakVow(EntityUid uid, MimePowersComponent? mimePowers = null) mimePowers.VowBroken = true; mimePowers.VowRepentTime = _timing.CurTime + mimePowers.VowCooldown; RemComp(uid); - _alertsSystem.ClearAlert(uid, AlertType.VowOfSilence); - _alertsSystem.ShowAlert(uid, AlertType.VowBroken); + _alertsSystem.ClearAlert(uid, mimePowers.VowAlert); + _alertsSystem.ShowAlert(uid, mimePowers.VowBrokenAlert); _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallActionEntity); } @@ -138,8 +137,8 @@ public void RetakeVow(EntityUid uid, MimePowersComponent? mimePowers = null) mimePowers.ReadyToRepent = false; mimePowers.VowBroken = false; AddComp(uid); - _alertsSystem.ClearAlert(uid, AlertType.VowBroken); - _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); + _alertsSystem.ClearAlert(uid, mimePowers.VowAlert); + _alertsSystem.ShowAlert(uid, mimePowers.VowBrokenAlert); _actionsSystem.AddAction(uid, ref mimePowers.InvisibleWallActionEntity, mimePowers.InvisibleWallAction, uid); } } diff --git a/Content.Server/Alert/Commands/ClearAlert.cs b/Content.Server/Alert/Commands/ClearAlert.cs index 73a6ca52c70..2e317de7547 100644 --- a/Content.Server/Alert/Commands/ClearAlert.cs +++ b/Content.Server/Alert/Commands/ClearAlert.cs @@ -40,13 +40,13 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var alertType = args[0]; var alertsSystem = _e.System(); - if (!alertsSystem.TryGet(Enum.Parse(alertType), out var alert)) + if (!alertsSystem.TryGet(alertType, out var alert)) { shell.WriteLine("unrecognized alertType " + alertType); return; } - alertsSystem.ClearAlert(attachedEntity, alert.AlertType); + alertsSystem.ClearAlert(attachedEntity, alert.ID); } } } diff --git a/Content.Server/Alert/Commands/ShowAlert.cs b/Content.Server/Alert/Commands/ShowAlert.cs index f37ab23f2fa..cae24ff3360 100644 --- a/Content.Server/Alert/Commands/ShowAlert.cs +++ b/Content.Server/Alert/Commands/ShowAlert.cs @@ -41,7 +41,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) var alertType = args[0]; var severity = args[1]; var alertsSystem = _e.System(); - if (!alertsSystem.TryGet(Enum.Parse(alertType), out var alert)) + if (!alertsSystem.TryGet(alertType, out var alert)) { shell.WriteLine("unrecognized alertType " + alertType); return; @@ -53,7 +53,7 @@ public void Execute(IConsoleShell shell, string argStr, string[] args) } short? severity1 = sevint == -1 ? null : sevint; - alertsSystem.ShowAlert(attachedEntity, alert.AlertType, severity1, null); + alertsSystem.ShowAlert(attachedEntity, alert.ID, severity1, null); } } } diff --git a/Content.Server/Atmos/Components/BarotraumaComponent.cs b/Content.Server/Atmos/Components/BarotraumaComponent.cs index 4e29699872e..d261c5ab030 100644 --- a/Content.Server/Atmos/Components/BarotraumaComponent.cs +++ b/Content.Server/Atmos/Components/BarotraumaComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; namespace Content.Server.Atmos.Components { @@ -46,5 +48,13 @@ public sealed partial class BarotraumaComponent : Component [ViewVariables(VVAccess.ReadWrite)] public bool HasImmunity = false; + [DataField] + public ProtoId HighPressureAlert = "HighPressure"; + + [DataField] + public ProtoId LowPressureAlert = "LowPressure"; + + [DataField] + public ProtoId PressureAlertCategory = "Pressure"; } } diff --git a/Content.Server/Atmos/Components/FlammableComponent.cs b/Content.Server/Atmos/Components/FlammableComponent.cs index e00f5efbdc5..9ae99a15136 100644 --- a/Content.Server/Atmos/Components/FlammableComponent.cs +++ b/Content.Server/Atmos/Components/FlammableComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Prototypes; namespace Content.Server.Atmos.Components { @@ -77,5 +79,8 @@ public sealed partial class FlammableComponent : Component /// [DataField, ViewVariables(VVAccess.ReadWrite)] public float FirestackFade = -0.1f; + + [DataField] + public ProtoId FireAlert = "Fire"; } } diff --git a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs index 98a5ffa70a8..ec508790ba8 100644 --- a/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs +++ b/Content.Server/Atmos/EntitySystems/BarotraumaSystem.cs @@ -245,7 +245,7 @@ public override void Update(float frameTime) _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking low pressure damage"); } - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 2); + _alertsSystem.ShowAlert(uid, barotrauma.LowPressureAlert, 2); } else if (pressure >= Atmospherics.HazardHighPressure) { @@ -260,7 +260,7 @@ public override void Update(float frameTime) _adminLogger.Add(LogType.Barotrauma, $"{ToPrettyString(uid):entity} started taking high pressure damage"); } - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 2); + _alertsSystem.ShowAlert(uid, barotrauma.HighPressureAlert, 2); } else { @@ -275,13 +275,13 @@ public override void Update(float frameTime) switch (pressure) { case <= Atmospherics.WarningLowPressure: - _alertsSystem.ShowAlert(uid, AlertType.LowPressure, 1); + _alertsSystem.ShowAlert(uid, barotrauma.LowPressureAlert, 1); break; case >= Atmospherics.WarningHighPressure: - _alertsSystem.ShowAlert(uid, AlertType.HighPressure, 1); + _alertsSystem.ShowAlert(uid, barotrauma.HighPressureAlert, 1); break; default: - _alertsSystem.ClearAlertCategory(uid, AlertCategory.Pressure); + _alertsSystem.ClearAlertCategory(uid, barotrauma.PressureAlertCategory); break; } } diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index 4a8cbbdc884..e8721920dd8 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -415,11 +415,11 @@ public override void Update(float frameTime) if (!flammable.OnFire) { - _alertsSystem.ClearAlert(uid, AlertType.Fire); + _alertsSystem.ClearAlert(uid, flammable.FireAlert); continue; } - _alertsSystem.ShowAlert(uid, AlertType.Fire); + _alertsSystem.ShowAlert(uid, flammable.FireAlert); if (flammable.FireStacks > 0) { diff --git a/Content.Server/Body/Components/BloodstreamComponent.cs b/Content.Server/Body/Components/BloodstreamComponent.cs index 1d8aa9ffd3d..a6d2afab219 100644 --- a/Content.Server/Body/Components/BloodstreamComponent.cs +++ b/Content.Server/Body/Components/BloodstreamComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Body.Systems; using Content.Server.Chemistry.EntitySystems; +using Content.Shared.Alert; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.Damage; @@ -171,5 +172,8 @@ public sealed partial class BloodstreamComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] public TimeSpan StatusTime; + + [DataField] + public ProtoId BleedingAlert = "Bleed"; } } diff --git a/Content.Server/Body/Components/InternalsComponent.cs b/Content.Server/Body/Components/InternalsComponent.cs index 18caab8dcf0..098f1789218 100644 --- a/Content.Server/Body/Components/InternalsComponent.cs +++ b/Content.Server/Body/Components/InternalsComponent.cs @@ -1,3 +1,6 @@ +using Content.Shared.Alert; +using Robust.Shared.Prototypes; + namespace Content.Server.Body.Components { /// @@ -18,5 +21,8 @@ public sealed partial class InternalsComponent : Component [ViewVariables(VVAccess.ReadWrite)] [DataField] public TimeSpan Delay = TimeSpan.FromSeconds(3); + + [DataField] + public ProtoId InternalsAlert = "Internals"; } } diff --git a/Content.Server/Body/Components/LungComponent.cs b/Content.Server/Body/Components/LungComponent.cs index 46600b30207..72af4d9e63a 100644 --- a/Content.Server/Body/Components/LungComponent.cs +++ b/Content.Server/Body/Components/LungComponent.cs @@ -1,8 +1,8 @@ -using Content.Server.Atmos; using Content.Server.Body.Systems; using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Chemistry.Components; +using Robust.Shared.Prototypes; namespace Content.Server.Body.Components; @@ -33,5 +33,5 @@ public sealed partial class LungComponent : Component /// The type of gas this lung needs. Used only for the breathing alerts, not actual metabolism. /// [DataField] - public AlertType Alert = AlertType.LowOxygen; + public ProtoId Alert = "LowOxygen"; } diff --git a/Content.Server/Body/Systems/BloodstreamSystem.cs b/Content.Server/Body/Systems/BloodstreamSystem.cs index ddeb154e790..f961307fc6a 100644 --- a/Content.Server/Body/Systems/BloodstreamSystem.cs +++ b/Content.Server/Body/Systems/BloodstreamSystem.cs @@ -392,11 +392,11 @@ public bool TryModifyBleedAmount(EntityUid uid, float amount, BloodstreamCompone component.BleedAmount = Math.Clamp(component.BleedAmount, 0, component.MaxBleedAmount); if (component.BleedAmount == 0) - _alertsSystem.ClearAlert(uid, AlertType.Bleed); + _alertsSystem.ClearAlert(uid, component.BleedingAlert); else { var severity = (short) Math.Clamp(Math.Round(component.BleedAmount, MidpointRounding.ToZero), 0, 10); - _alertsSystem.ShowAlert(uid, AlertType.Bleed, severity); + _alertsSystem.ShowAlert(uid, component.BleedingAlert, severity); } return true; diff --git a/Content.Server/Body/Systems/InternalsSystem.cs b/Content.Server/Body/Systems/InternalsSystem.cs index 8afd1c767f6..c1e1de2baad 100644 --- a/Content.Server/Body/Systems/InternalsSystem.cs +++ b/Content.Server/Body/Systems/InternalsSystem.cs @@ -144,12 +144,12 @@ private void OnDoAfter(Entity ent, ref InternalsDoAfterEvent private void OnInternalsStartup(Entity ent, ref ComponentStartup args) { - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } private void OnInternalsShutdown(Entity ent, ref ComponentShutdown args) { - _alerts.ClearAlert(ent, AlertType.Internals); + _alerts.ClearAlert(ent, ent.Comp.InternalsAlert); } private void OnInhaleLocation(Entity ent, ref InhaleLocationEvent args) @@ -159,7 +159,7 @@ private void OnInhaleLocation(Entity ent, ref InhaleLocation var gasTank = Comp(ent.Comp.GasTankEntity!.Value); args.Gas = _gasTank.RemoveAirVolume((ent.Comp.GasTankEntity.Value, gasTank), Atmospherics.BreathVolume); // TODO: Should listen to gas tank updates instead I guess? - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } } public void DisconnectBreathTool(Entity ent) @@ -173,7 +173,7 @@ public void DisconnectBreathTool(Entity ent) DisconnectTank(ent); } - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } public void ConnectBreathTool(Entity ent, EntityUid toolEntity) @@ -184,7 +184,7 @@ public void ConnectBreathTool(Entity ent, EntityUid toolEnti } ent.Comp.BreathToolEntity = toolEntity; - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); } public void DisconnectTank(InternalsComponent? component) @@ -196,7 +196,7 @@ public void DisconnectTank(InternalsComponent? component) _gasTank.DisconnectFromInternals((component.GasTankEntity.Value, tank)); component.GasTankEntity = null; - _alerts.ShowAlert(component.Owner, AlertType.Internals, GetSeverity(component)); + _alerts.ShowAlert(component.Owner, component.InternalsAlert, GetSeverity(component)); } public bool TryConnectTank(Entity ent, EntityUid tankEntity) @@ -208,7 +208,7 @@ public bool TryConnectTank(Entity ent, EntityUid tankEntity) _gasTank.DisconnectFromInternals((ent.Comp.GasTankEntity.Value, tank)); ent.Comp.GasTankEntity = tankEntity; - _alerts.ShowAlert(ent, AlertType.Internals, GetSeverity(ent)); + _alerts.ShowAlert(ent, ent.Comp.InternalsAlert, GetSeverity(ent)); return true; } diff --git a/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs b/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs index 8d475570ad0..40858176bd1 100644 --- a/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs +++ b/Content.Server/Chemistry/ReagentEffects/AdjustAlert.cs @@ -10,8 +10,8 @@ public sealed partial class AdjustAlert : ReagentEffect /// /// The specific Alert that will be adjusted /// - [DataField("alertType", required: true)] - public AlertType Type; + [DataField(required: true)] + public ProtoId AlertType; /// /// If true, the alert is removed after Time seconds. If Time was not specified the alert is removed immediately. @@ -42,7 +42,7 @@ public override void Effect(ReagentEffectArgs args) if (Clear && Time <= 0) { - alertSys.ClearAlert(args.SolutionEntity, Type); + alertSys.ClearAlert(args.SolutionEntity, AlertType); } else { @@ -52,7 +52,7 @@ public override void Effect(ReagentEffectArgs args) if ((ShowCooldown || Clear) && Time > 0) cooldown = (timing.CurTime, timing.CurTime + TimeSpan.FromSeconds(Time)); - alertSys.ShowAlert(args.SolutionEntity, Type, cooldown: cooldown, autoRemove: Clear, showCooldown: ShowCooldown); + alertSys.ShowAlert(args.SolutionEntity, AlertType, cooldown: cooldown, autoRemove: Clear, showCooldown: ShowCooldown); } } diff --git a/Content.Server/Clothing/MagbootsSystem.cs b/Content.Server/Clothing/MagbootsSystem.cs index f12558389e3..3838ad168d1 100644 --- a/Content.Server/Clothing/MagbootsSystem.cs +++ b/Content.Server/Clothing/MagbootsSystem.cs @@ -29,11 +29,11 @@ protected override void UpdateMagbootEffects(EntityUid parent, EntityUid uid, bo if (state) { - _alerts.ShowAlert(parent, AlertType.Magboots); + _alerts.ShowAlert(parent, component.MagbootsAlert); } else { - _alerts.ClearAlert(parent, AlertType.Magboots); + _alerts.ClearAlert(parent, component.MagbootsAlert); } } diff --git a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs index 105a8f9720d..51d3242ce4f 100644 --- a/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs +++ b/Content.Server/Ensnaring/EnsnareableSystem.Ensnaring.cs @@ -163,8 +163,8 @@ public void ForceFree(EntityUid ensnare, EnsnaringComponent component) public void UpdateAlert(EntityUid target, EnsnareableComponent component) { if (!component.IsEnsnared) - _alerts.ClearAlert(target, AlertType.Ensnared); + _alerts.ClearAlert(target, component.EnsnaredAlert); else - _alerts.ShowAlert(target, AlertType.Ensnared); + _alerts.ShowAlert(target, component.EnsnaredAlert); } } diff --git a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs index 1dfaf4f3393..0c1e88653fa 100644 --- a/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs +++ b/Content.Server/Ninja/Systems/SpaceNinjaSystem.cs @@ -102,20 +102,23 @@ private int Download(EntityUid uid, List ids) /// public void SetSuitPowerAlert(EntityUid uid, SpaceNinjaComponent? comp = null) { - if (!Resolve(uid, ref comp, false) || comp.Deleted || comp.Suit == null) + if (!Resolve(uid, ref comp, false)) + return; + + if (comp.Deleted || comp.Suit == null) { - _alerts.ClearAlert(uid, AlertType.SuitPower); + _alerts.ClearAlert(uid, comp.SuitPowerAlert); return; } if (GetNinjaBattery(uid, out _, out var battery)) { var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, battery.CurrentCharge), battery.MaxCharge, 8); - _alerts.ShowAlert(uid, AlertType.SuitPower, (short) severity); + _alerts.ShowAlert(uid, comp.SuitPowerAlert, (short) severity); } else { - _alerts.ClearAlert(uid, AlertType.SuitPower); + _alerts.ClearAlert(uid, comp.SuitPowerAlert); } } diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs index 86be70c41fe..c390432f3a1 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs @@ -141,7 +141,7 @@ public bool ChangeEssenceAmount(EntityUid uid, FixedPoint2 amount, RevenantCompo if (TryComp(uid, out var store)) _store.UpdateUserInterface(uid, uid, store); - _alerts.ShowAlert(uid, AlertType.Essence); + _alerts.ShowAlert(uid, component.EssenceAlert); if (component.Essence <= 0) { diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index 2b5769881d2..7a19fd13b2e 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -317,7 +317,7 @@ public void AddPilot(EntityUid uid, EntityUid entity, ShuttleConsoleComponent co component.SubscribedPilots.Add(entity); - _alertsSystem.ShowAlert(entity, AlertType.PilotingShuttle); + _alertsSystem.ShowAlert(entity, pilotComponent.PilotingAlert); pilotComponent.Console = uid; ActionBlockerSystem.UpdateCanMove(entity); @@ -339,7 +339,7 @@ public void RemovePilot(EntityUid pilotUid, PilotComponent pilotComponent) if (!helm.SubscribedPilots.Remove(pilotUid)) return; - _alertsSystem.ClearAlert(pilotUid, AlertType.PilotingShuttle); + _alertsSystem.ClearAlert(pilotUid, pilotComponent.PilotingAlert); _popup.PopupEntity(Loc.GetString("shuttle-pilot-end"), pilotUid, pilotUid); diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index ceab044d4c1..97adfd00eb4 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -84,7 +84,7 @@ public override void Initialize() private void OnMapInit(EntityUid uid, BorgChassisComponent component, MapInitEvent args) { - UpdateBatteryAlert(uid); + UpdateBatteryAlert((uid, component)); _movementSpeedModifier.RefreshMovementSpeedModifiers(uid); } @@ -183,7 +183,7 @@ private void OnMobStateChanged(EntityUid uid, BorgChassisComponent component, Mo private void OnPowerCellChanged(EntityUid uid, BorgChassisComponent component, PowerCellChangedEvent args) { - UpdateBatteryAlert(uid); + UpdateBatteryAlert((uid, component)); if (!TryComp(uid, out var draw)) return; @@ -256,12 +256,12 @@ private void OnBrainPointAttempt(EntityUid uid, BorgBrainComponent component, Po args.Cancel(); } - private void UpdateBatteryAlert(EntityUid uid, PowerCellSlotComponent? slotComponent = null) + private void UpdateBatteryAlert(Entity ent, PowerCellSlotComponent? slotComponent = null) { - if (!_powerCell.TryGetBatteryFromSlot(uid, out var battery, slotComponent)) + if (!_powerCell.TryGetBatteryFromSlot(ent, out var battery, slotComponent)) { - _alerts.ClearAlert(uid, AlertType.BorgBattery); - _alerts.ShowAlert(uid, AlertType.BorgBatteryNone); + _alerts.ClearAlert(ent, ent.Comp.BatteryAlert); + _alerts.ShowAlert(ent, ent.Comp.NoBatteryAlert); return; } @@ -269,13 +269,13 @@ private void UpdateBatteryAlert(EntityUid uid, PowerCellSlotComponent? slotCompo // we make sure 0 only shows if they have absolutely no battery. // also account for floating point imprecision - if (chargePercent == 0 && _powerCell.HasDrawCharge(uid, cell: slotComponent)) + if (chargePercent == 0 && _powerCell.HasDrawCharge(ent, cell: slotComponent)) { chargePercent = 1; } - _alerts.ClearAlert(uid, AlertType.BorgBatteryNone); - _alerts.ShowAlert(uid, AlertType.BorgBattery, chargePercent); + _alerts.ClearAlert(ent, ent.Comp.NoBatteryAlert); + _alerts.ShowAlert(ent, ent.Comp.BatteryAlert, chargePercent); } /// diff --git a/Content.Server/Temperature/Components/TemperatureComponent.cs b/Content.Server/Temperature/Components/TemperatureComponent.cs index ec00a570f96..3bfa12f2693 100644 --- a/Content.Server/Temperature/Components/TemperatureComponent.cs +++ b/Content.Server/Temperature/Components/TemperatureComponent.cs @@ -1,7 +1,9 @@ using Content.Server.Temperature.Systems; +using Content.Shared.Alert; using Content.Shared.Atmos; using Content.Shared.Damage; using Content.Shared.FixedPoint; +using Robust.Shared.Prototypes; namespace Content.Server.Temperature.Components; @@ -78,4 +80,10 @@ public float HeatCapacity /// [DataField] public bool TakingDamage = false; + + [DataField] + public ProtoId HotAlert = "Hot"; + + [DataField] + public ProtoId ColdAlert = "Cold"; } diff --git a/Content.Server/Temperature/Systems/TemperatureSystem.cs b/Content.Server/Temperature/Systems/TemperatureSystem.cs index 6c9e99e5f3b..23c8cb6783f 100644 --- a/Content.Server/Temperature/Systems/TemperatureSystem.cs +++ b/Content.Server/Temperature/Systems/TemperatureSystem.cs @@ -12,6 +12,7 @@ using Content.Shared.Rejuvenate; using Content.Shared.Temperature; using Robust.Shared.Physics.Components; +using Robust.Shared.Prototypes; namespace Content.Server.Temperature.Systems; @@ -33,6 +34,9 @@ public sealed class TemperatureSystem : EntitySystem private float _accumulatedFrametime; + [ValidatePrototypeId] + public const string TemperatureAlertCategory = "Temperature"; + public override void Initialize() { SubscribeLocalEvent(EnqueueDamage); @@ -180,13 +184,13 @@ private void OnRejuvenate(EntityUid uid, TemperatureComponent comp, RejuvenateEv private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureChangeEvent args) { - AlertType type; + ProtoId type; float threshold; float idealTemp; if (!TryComp(uid, out var temperature)) { - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + _alerts.ClearAlertCategory(uid, TemperatureAlertCategory); return; } @@ -203,12 +207,12 @@ private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureCha if (args.CurrentTemperature <= idealTemp) { - type = AlertType.Cold; + type = temperature.ColdAlert; threshold = temperature.ColdDamageThreshold; } else { - type = AlertType.Hot; + type = temperature.HotAlert; threshold = temperature.HeatDamageThreshold; } @@ -230,7 +234,7 @@ private void ServerAlert(EntityUid uid, AlertsComponent status, OnTemperatureCha break; case > 0.66f: - _alerts.ClearAlertCategory(uid, AlertCategory.Temperature); + _alerts.ClearAlertCategory(uid, TemperatureAlertCategory); break; } } diff --git a/Content.Shared/Alert/AlertCategory.cs b/Content.Shared/Alert/AlertCategory.cs deleted file mode 100644 index 7450f585a4e..00000000000 --- a/Content.Shared/Alert/AlertCategory.cs +++ /dev/null @@ -1,20 +0,0 @@ -namespace Content.Shared.Alert; - -/// -/// Every category of alert. Corresponds to category field in alert prototypes defined in YML -/// -public enum AlertCategory -{ - Pressure, - Temperature, - Breathing, - Buckled, - Health, - Internals, - Stamina, - Piloting, - Hunger, - Thirst, - Toxins, - Battery -} diff --git a/Content.Shared/Alert/AlertCategoryPrototype.cs b/Content.Shared/Alert/AlertCategoryPrototype.cs new file mode 100644 index 00000000000..7c7d0475214 --- /dev/null +++ b/Content.Shared/Alert/AlertCategoryPrototype.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Alert; + +/// +/// This is a prototype for a category for marking alerts as mutually exclusive. +/// +[Prototype] +public sealed partial class AlertCategoryPrototype : IPrototype +{ + /// + [IdDataField] + public string ID { get; } = default!; +} diff --git a/Content.Shared/Alert/AlertKey.cs b/Content.Shared/Alert/AlertKey.cs index c784af4cd48..c5c3a7643ec 100644 --- a/Content.Shared/Alert/AlertKey.cs +++ b/Content.Shared/Alert/AlertKey.cs @@ -1,5 +1,5 @@ -using Robust.Shared.Serialization; -using Robust.Shared.Serialization.Manager; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -11,13 +11,13 @@ namespace Content.Shared.Alert; [Serializable, NetSerializable] public struct AlertKey { - public AlertType? AlertType { get; private set; } = Alert.AlertType.Error; - public readonly AlertCategory? AlertCategory; + public ProtoId? AlertType { get; private set; } = default!; + public readonly ProtoId? AlertCategory; /// NOTE: if the alert has a category you must pass the category for this to work /// properly as a key. I.e. if the alert has a category and you pass only the alert type, and you /// compare this to another AlertKey that has both the category and the same alert type, it will not consider them equal. - public AlertKey(AlertType? alertType, AlertCategory? alertCategory) + public AlertKey(ProtoId? alertType, ProtoId? alertCategory) { AlertCategory = alertCategory; AlertType = alertType; @@ -49,7 +49,7 @@ public override int GetHashCode() /// alert category, must not be null /// An alert key for the provided alert category. This must only be used for /// queries and never storage, as it is lacking an alert type. - public static AlertKey ForCategory(AlertCategory category) + public static AlertKey ForCategory(ProtoId category) { return new(null, category); } diff --git a/Content.Shared/Alert/AlertOrderPrototype.cs b/Content.Shared/Alert/AlertOrderPrototype.cs index 8279d592b4b..af4241a27e7 100644 --- a/Content.Shared/Alert/AlertOrderPrototype.cs +++ b/Content.Shared/Alert/AlertOrderPrototype.cs @@ -7,7 +7,7 @@ namespace Content.Shared.Alert /// /// Defines the order of alerts so they show up in a consistent order. /// - [Prototype("alertOrder")] + [Prototype] [DataDefinition] public sealed partial class AlertOrderPrototype : IPrototype, IComparer { @@ -15,7 +15,7 @@ public sealed partial class AlertOrderPrototype : IPrototype, IComparer(alert)] = i++; + _typeToIdx[alert] = i++; break; case "category": - _categoryToIdx[Enum.Parse(alert)] = i++; + _categoryToIdx[alert] = i++; break; default: throw new ArgumentException(); @@ -58,17 +58,17 @@ public sealed partial class AlertOrderPrototype : IPrototype, IComparer _typeToIdx = new(); - private readonly Dictionary _categoryToIdx = new(); + private readonly Dictionary, int> _typeToIdx = new(); + private readonly Dictionary, int> _categoryToIdx = new(); private int GetOrderIndex(AlertPrototype alert) { - if (_typeToIdx.TryGetValue(alert.AlertType, out var idx)) + if (_typeToIdx.TryGetValue(alert.ID, out var idx)) { return idx; } if (alert.Category != null && - _categoryToIdx.TryGetValue((AlertCategory) alert.Category, out idx)) + _categoryToIdx.TryGetValue(alert.Category.Value, out idx)) { return idx; } @@ -78,20 +78,25 @@ private int GetOrderIndex(AlertPrototype alert) public int Compare(AlertPrototype? x, AlertPrototype? y) { - if ((x == null) && (y == null)) return 0; - if (x == null) return 1; - if (y == null) return -1; + if (x == null && y == null) + return 0; + if (x == null) + return 1; + if (y == null) + return -1; var idx = GetOrderIndex(x); var idy = GetOrderIndex(y); if (idx == -1 && idy == -1) { // break ties by type value // Must cast to int to avoid integer overflow when subtracting (enum's unsigned) - return (int)x.AlertType - (int)y.AlertType; + return string.Compare(x.ID, y.ID, StringComparison.InvariantCulture); } - if (idx == -1) return 1; - if (idy == -1) return -1; + if (idx == -1) + return 1; + if (idy == -1) + return -1; var result = idx - idy; // not strictly necessary (we don't care about ones that go at the same index) // but it makes the sort stable @@ -99,7 +104,7 @@ public int Compare(AlertPrototype? x, AlertPrototype? y) { // break ties by type value // Must cast to int to avoid integer overflow when subtracting (enum's unsigned) - return (int)x.AlertType - (int)y.AlertType; + return string.Compare(x.ID, y.ID, StringComparison.InvariantCulture); } return result; diff --git a/Content.Shared/Alert/AlertPrototype.cs b/Content.Shared/Alert/AlertPrototype.cs index 248cc00ba40..f53da27c0de 100644 --- a/Content.Shared/Alert/AlertPrototype.cs +++ b/Content.Shared/Alert/AlertPrototype.cs @@ -1,120 +1,116 @@ using Robust.Shared.Prototypes; using Robust.Shared.Utility; -namespace Content.Shared.Alert +namespace Content.Shared.Alert; + +/// +/// An alert popup with associated icon, tooltip, and other data. +/// +[Prototype] +public sealed partial class AlertPrototype : IPrototype { /// - /// An alert popup with associated icon, tooltip, and other data. + /// Type of alert, no 2 alert prototypes should have the same one. /// - [Prototype("alert")] - public sealed partial class AlertPrototype : IPrototype - { - [ViewVariables] - string IPrototype.ID => AlertType.ToString(); - - /// - /// Type of alert, no 2 alert prototypes should have the same one. - /// - [IdDataField] - public AlertType AlertType { get; private set; } - - /// - /// List of icons to use for this alert. Each entry corresponds to a different severity level, starting from the - /// minimum and incrementing upwards. If severities are not supported, the first entry is used. - /// - [DataField("icons", required: true)] - public List Icons = new(); - - /// - /// An entity used for displaying the in the UI control. - /// - [DataField] - public EntProtoId AlertViewEntity = "AlertSpriteView"; - - /// - /// Name to show in tooltip window. Accepts formatting. - /// - [DataField("name")] - public string Name { get; private set; } = ""; - - /// - /// Description to show in tooltip window. Accepts formatting. - /// - [DataField("description")] - public string Description { get; private set; } = ""; - - /// - /// Category the alert belongs to. Only one alert of a given category - /// can be shown at a time. If one is shown while another is already being shown, - /// it will be replaced. This can be useful for categories of alerts which should naturally - /// replace each other and are mutually exclusive, for example lowpressure / highpressure, - /// hot / cold. If left unspecified, the alert will not replace or be replaced by any other alerts. - /// - [DataField("category")] - public AlertCategory? Category { get; private set; } - - /// - /// Key which is unique w.r.t category semantics (alerts with same category have equal keys, - /// alerts with no category have different keys). - /// - public AlertKey AlertKey => new(AlertType, Category); - - /// - /// -1 (no effect) unless MaxSeverity is specified. Defaults to 1. Minimum severity level supported by this state. - /// - public short MinSeverity => MaxSeverity == -1 ? (short) -1 : _minSeverity; - - [DataField("minSeverity")] private short _minSeverity = 1; - - /// - /// Maximum severity level supported by this state. -1 (default) indicates - /// no severity levels are supported by the state. - /// - [DataField("maxSeverity")] - public short MaxSeverity = -1; - - /// - /// Indicates whether this state support severity levels - /// - public bool SupportsSeverity => MaxSeverity != -1; - - /// - /// Defines what to do when the alert is clicked. - /// This will always be null on clientside. - /// - [DataField("onClick", serverOnly: true)] - public IAlertClick? OnClick { get; private set; } - - /// severity level, if supported by this alert - /// the icon path to the texture for the provided severity level - public SpriteSpecifier GetIcon(short? severity = null) - { - var minIcons = SupportsSeverity - ? MaxSeverity - MinSeverity - : 1; + [IdDataField] + public string ID { get; private set; } = default!; - if (Icons.Count < minIcons) - throw new InvalidOperationException($"Insufficient number of icons given for alert {AlertType}"); + /// + /// List of icons to use for this alert. Each entry corresponds to a different severity level, starting from the + /// minimum and incrementing upwards. If severities are not supported, the first entry is used. + /// + [DataField(required: true)] + public List Icons = new(); - if (!SupportsSeverity) - return Icons[0]; + /// + /// An entity used for displaying the in the UI control. + /// + [DataField] + public EntProtoId AlertViewEntity = "AlertSpriteView"; - if (severity == null) - { - throw new ArgumentException($"No severity specified but this alert ({AlertKey}) has severity.", nameof(severity)); - } + /// + /// Name to show in tooltip window. Accepts formatting. + /// + [DataField] + public string Name { get; private set; } = string.Empty; - if (severity < MinSeverity) - { - throw new ArgumentOutOfRangeException(nameof(severity), $"Severity below minimum severity in {AlertKey}."); - } + /// + /// Description to show in tooltip window. Accepts formatting. + /// + [DataField] + public string Description { get; private set; } = string.Empty; - if (severity > MaxSeverity) - { - throw new ArgumentOutOfRangeException(nameof(severity), $"Severity above maximum severity in {AlertKey}."); - } + /// + /// Category the alert belongs to. Only one alert of a given category + /// can be shown at a time. If one is shown while another is already being shown, + /// it will be replaced. This can be useful for categories of alerts which should naturally + /// replace each other and are mutually exclusive, for example lowpressure / highpressure, + /// hot / cold. If left unspecified, the alert will not replace or be replaced by any other alerts. + /// + [DataField] + public ProtoId? Category { get; private set; } + + /// + /// Key which is unique w.r.t category semantics (alerts with same category have equal keys, + /// alerts with no category have different keys). + /// + public AlertKey AlertKey => new(ID, Category); - return Icons[severity.Value - _minSeverity]; + /// + /// -1 (no effect) unless MaxSeverity is specified. Defaults to 1. Minimum severity level supported by this state. + /// + public short MinSeverity => MaxSeverity == -1 ? (short) -1 : _minSeverity; + + [DataField("minSeverity")] private short _minSeverity = 1; + + /// + /// Maximum severity level supported by this state. -1 (default) indicates + /// no severity levels are supported by the state. + /// + [DataField] + public short MaxSeverity = -1; + + /// + /// Indicates whether this state support severity levels + /// + public bool SupportsSeverity => MaxSeverity != -1; + + /// + /// Defines what to do when the alert is clicked. + /// This will always be null on clientside. + /// + [DataField(serverOnly: true)] + public IAlertClick? OnClick { get; private set; } + + /// severity level, if supported by this alert + /// the icon path to the texture for the provided severity level + public SpriteSpecifier GetIcon(short? severity = null) + { + var minIcons = SupportsSeverity + ? MaxSeverity - MinSeverity + : 1; + + if (Icons.Count < minIcons) + throw new InvalidOperationException($"Insufficient number of icons given for alert {ID}"); + + if (!SupportsSeverity) + return Icons[0]; + + if (severity == null) + { + throw new ArgumentException($"No severity specified but this alert ({AlertKey}) has severity.", nameof(severity)); + } + + if (severity < MinSeverity) + { + throw new ArgumentOutOfRangeException(nameof(severity), $"Severity below minimum severity in {AlertKey}."); } + + if (severity > MaxSeverity) + { + throw new ArgumentOutOfRangeException(nameof(severity), $"Severity above maximum severity in {AlertKey}."); + } + + return Icons[severity.Value - _minSeverity]; } } diff --git a/Content.Shared/Alert/AlertState.cs b/Content.Shared/Alert/AlertState.cs index effd9522036..d6309f6b426 100644 --- a/Content.Shared/Alert/AlertState.cs +++ b/Content.Shared/Alert/AlertState.cs @@ -1,3 +1,4 @@ +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -9,5 +10,5 @@ public struct AlertState public (TimeSpan, TimeSpan)? Cooldown; public bool AutoRemove; public bool ShowCooldown; - public AlertType Type; + public ProtoId Type; } diff --git a/Content.Shared/Alert/AlertType.cs b/Content.Shared/Alert/AlertType.cs deleted file mode 100644 index b989b8d4b6f..00000000000 --- a/Content.Shared/Alert/AlertType.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace Content.Shared.Alert -{ - /// - /// Every kind of alert. Corresponds to alertType field in alert prototypes defined in YML - /// NOTE: Using byte for a compact encoding when sending this in messages, can upgrade - /// to ushort - /// - public enum AlertType : byte - { - Error, - LowOxygen, - LowNitrogen, - LowPressure, - HighPressure, - Fire, - Cold, - Hot, - Weightless, - Stun, - Handcuffed, - Ensnared, - Buckled, - HumanCrit, - HumanDead, - HumanHealth, - BorgBattery, - BorgBatteryNone, - PilotingShuttle, - Peckish, - Starving, - Thirsty, - Parched, - Stamina, - Pulled, - Pulling, - Magboots, - Internals, - Toxins, - Muted, - VowOfSilence, - VowBroken, - Essence, - Corporeal, - Bleed, - Pacified, - Debug1, - Debug2, - Debug3, - Debug4, - Debug5, - Debug6, - SuitPower, - BorgHealth, - BorgCrit, - BorgDead, - Deflecting - } - -} diff --git a/Content.Shared/Alert/AlertsSystem.cs b/Content.Shared/Alert/AlertsSystem.cs index 5b888e30c4c..83c6fcd0dd7 100644 --- a/Content.Shared/Alert/AlertsSystem.cs +++ b/Content.Shared/Alert/AlertsSystem.cs @@ -11,7 +11,7 @@ public abstract class AlertsSystem : EntitySystem [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IGameTiming _timing = default!; - private FrozenDictionary _typeToAlert = default!; + private FrozenDictionary, AlertPrototype> _typeToAlert = default!; public IReadOnlyDictionary? GetActiveAlerts(EntityUid euid) { @@ -20,23 +20,23 @@ public abstract class AlertsSystem : EntitySystem : null; } - public short GetSeverityRange(AlertType alertType) + public short GetSeverityRange(ProtoId alertType) { var minSeverity = _typeToAlert[alertType].MinSeverity; return (short)MathF.Max(minSeverity,_typeToAlert[alertType].MaxSeverity - minSeverity); } - public short GetMaxSeverity(AlertType alertType) + public short GetMaxSeverity(ProtoId alertType) { return _typeToAlert[alertType].MaxSeverity; } - public short GetMinSeverity(AlertType alertType) + public short GetMinSeverity(ProtoId alertType) { return _typeToAlert[alertType].MinSeverity; } - public bool IsShowingAlert(EntityUid euid, AlertType alertType) + public bool IsShowingAlert(EntityUid euid, ProtoId alertType) { if (!EntityManager.TryGetComponent(euid, out AlertsComponent? alertsComponent)) return false; @@ -51,7 +51,7 @@ public bool IsShowingAlert(EntityUid euid, AlertType alertType) } /// true iff an alert of the indicated alert category is currently showing - public bool IsShowingAlertCategory(EntityUid euid, AlertCategory alertCategory) + public bool IsShowingAlertCategory(EntityUid euid, ProtoId alertCategory) { return EntityManager.TryGetComponent(euid, out AlertsComponent? alertsComponent) && alertsComponent.Alerts.ContainsKey(AlertKey.ForCategory(alertCategory)); @@ -78,7 +78,7 @@ public bool TryGetAlertState(EntityUid euid, AlertKey key, out AlertState alertS /// be erased if there is currently a cooldown for the alert) /// if true, the alert will be removed at the end of the cooldown /// if true, the cooldown will be visibly shown over the alert icon - public void ShowAlert(EntityUid euid, AlertType alertType, short? severity = null, (TimeSpan, TimeSpan)? cooldown = null, bool autoRemove = false, bool showCooldown = true ) + public void ShowAlert(EntityUid euid, ProtoId alertType, short? severity = null, (TimeSpan, TimeSpan)? cooldown = null, bool autoRemove = false, bool showCooldown = true ) { // This should be handled as part of networking. if (_timing.ApplyingState) @@ -131,7 +131,7 @@ public void ShowAlert(EntityUid euid, AlertType alertType, short? severity = nul /// /// Clear the alert with the given category, if one is currently showing. /// - public void ClearAlertCategory(EntityUid euid, AlertCategory category) + public void ClearAlertCategory(EntityUid euid, ProtoId category) { if(!TryComp(euid, out AlertsComponent? alertsComponent)) return; @@ -150,7 +150,7 @@ public void ClearAlertCategory(EntityUid euid, AlertCategory category) /// /// Clear the alert of the given type if it is currently showing. /// - public void ClearAlert(EntityUid euid, AlertType alertType) + public void ClearAlert(EntityUid euid, ProtoId alertType) { if (_timing.ApplyingState) return; @@ -286,13 +286,13 @@ private void HandlePrototypesReloaded(PrototypesReloadedEventArgs obj) protected virtual void LoadPrototypes() { - var dict = new Dictionary(); + var dict = new Dictionary, AlertPrototype>(); foreach (var alert in _prototypeManager.EnumeratePrototypes()) { - if (!dict.TryAdd(alert.AlertType, alert)) + if (!dict.TryAdd(alert.ID, alert)) { Log.Error("Found alert with duplicate alertType {0} - all alerts must have" + - " a unique alertType, this one will be skipped", alert.AlertType); + " a unique alertType, this one will be skipped", alert.ID); } } @@ -303,7 +303,7 @@ protected virtual void LoadPrototypes() /// Tries to get the alert of the indicated type /// /// true if found - public bool TryGet(AlertType alertType, [NotNullWhen(true)] out AlertPrototype? alert) + public bool TryGet(ProtoId alertType, [NotNullWhen(true)] out AlertPrototype? alert) { return _typeToAlert.TryGetValue(alertType, out alert); } diff --git a/Content.Shared/Alert/ClickAlertEvent.cs b/Content.Shared/Alert/ClickAlertEvent.cs index fe7ca97e4c2..43dd086b562 100644 --- a/Content.Shared/Alert/ClickAlertEvent.cs +++ b/Content.Shared/Alert/ClickAlertEvent.cs @@ -1,4 +1,5 @@ -using Robust.Shared.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization; namespace Content.Shared.Alert; @@ -8,9 +9,9 @@ namespace Content.Shared.Alert; [Serializable, NetSerializable] public sealed class ClickAlertEvent : EntityEventArgs { - public readonly AlertType Type; + public readonly ProtoId Type; - public ClickAlertEvent(AlertType alertType) + public ClickAlertEvent(ProtoId alertType) { Type = alertType; } diff --git a/Content.Shared/Buckle/Components/StrapComponent.cs b/Content.Shared/Buckle/Components/StrapComponent.cs index 72c92ebf84b..9a19cea0c9a 100644 --- a/Content.Shared/Buckle/Components/StrapComponent.cs +++ b/Content.Shared/Buckle/Components/StrapComponent.cs @@ -3,6 +3,7 @@ using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Buckle.Components; @@ -115,7 +116,7 @@ public sealed partial class StrapComponent : Component /// [DataField] [ViewVariables(VVAccess.ReadWrite)] - public AlertType BuckledAlertType = AlertType.Buckled; + public ProtoId BuckledAlertType = "Buckled"; /// /// The sum of the sizes of all the buckled entities in this strap diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 0d67473ffee..4e94c6134b4 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -40,6 +40,9 @@ private void InitializeBuckle() SubscribeLocalEvent(OnBuckleUpdateCanMove); } + [ValidatePrototypeId] + public const string BuckledAlertCategory = "Buckled"; + private void OnBuckleComponentStartup(EntityUid uid, BuckleComponent component, ComponentStartup args) { UpdateBuckleStatus(uid, component); @@ -165,7 +168,7 @@ private void UpdateBuckleStatus(EntityUid uid, BuckleComponent buckleComp, Strap } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Buckled); + _alerts.ClearAlertCategory(uid, BuckledAlertCategory); } } diff --git a/Content.Shared/Clothing/MagbootsComponent.cs b/Content.Shared/Clothing/MagbootsComponent.cs index 0d0d59f89f5..0d074ff38b6 100644 --- a/Content.Shared/Clothing/MagbootsComponent.cs +++ b/Content.Shared/Clothing/MagbootsComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -16,4 +17,7 @@ public sealed partial class MagbootsComponent : Component [DataField("on"), AutoNetworkedField] public bool On; + + [DataField] + public ProtoId MagbootsAlert = "Magboots"; } diff --git a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs index 6d94c087af6..a927e1a6970 100644 --- a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs +++ b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs @@ -7,7 +7,6 @@ using Content.Shared.Popups; using Content.Shared.Throwing; using Content.Shared.Weapons.Ranged.Events; -using Content.Shared.Weapons.Ranged.Systems; using Robust.Shared.Timing; namespace Content.Shared.CombatMode.Pacification; @@ -109,7 +108,7 @@ private void OnStartup(EntityUid uid, PacifiedComponent component, ComponentStar _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, false); } - _alertsSystem.ShowAlert(uid, AlertType.Pacified); + _alertsSystem.ShowAlert(uid, component.PacifiedAlert); } private void OnShutdown(EntityUid uid, PacifiedComponent component, ComponentShutdown args) @@ -121,7 +120,7 @@ private void OnShutdown(EntityUid uid, PacifiedComponent component, ComponentShu _combatSystem.SetCanDisarm(uid, true, combatMode); _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, true); - _alertsSystem.ClearAlert(uid, AlertType.Pacified); + _alertsSystem.ClearAlert(uid, component.PacifiedAlert); } private void OnBeforeThrow(Entity ent, ref BeforeThrowEvent args) diff --git a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs index 464ef778851..96081e5dc67 100644 --- a/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs +++ b/Content.Shared/CombatMode/Pacification/PacifiedComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.CombatMode.Pacification; @@ -42,4 +44,6 @@ public sealed partial class PacifiedComponent : Component [DataField] public EntityUid? LastAttackedEntity = null; + [DataField] + public ProtoId PacifiedAlert = "Pacified"; } diff --git a/Content.Shared/Cuffs/Components/CuffableComponent.cs b/Content.Shared/Cuffs/Components/CuffableComponent.cs index 5da6fa41a5f..4ddfe1b53ee 100644 --- a/Content.Shared/Cuffs/Components/CuffableComponent.cs +++ b/Content.Shared/Cuffs/Components/CuffableComponent.cs @@ -1,6 +1,8 @@ +using Content.Shared.Alert; using Content.Shared.Damage; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -39,6 +41,9 @@ public sealed partial class CuffableComponent : Component /// [DataField("canStillInteract"), ViewVariables(VVAccess.ReadWrite)] public bool CanStillInteract = true; + + [DataField] + public ProtoId CuffedAlert = "Handcuffed"; } [Serializable, NetSerializable] diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 0077f5a358e..f0f9a949839 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -172,9 +172,9 @@ public void UpdateCuffState(EntityUid uid, CuffableComponent component) _actionBlocker.UpdateCanMove(uid); if (component.CanStillInteract) - _alerts.ClearAlert(uid, AlertType.Handcuffed); + _alerts.ClearAlert(uid, component.CuffedAlert); else - _alerts.ShowAlert(uid, AlertType.Handcuffed); + _alerts.ShowAlert(uid, component.CuffedAlert); var ev = new CuffedStateChangeEvent(); RaiseLocalEvent(uid, ref ev); diff --git a/Content.Shared/Damage/Components/StaminaComponent.cs b/Content.Shared/Damage/Components/StaminaComponent.cs index 5a2fba49701..14c3f6d9f53 100644 --- a/Content.Shared/Damage/Components/StaminaComponent.cs +++ b/Content.Shared/Damage/Components/StaminaComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Damage.Components; @@ -51,4 +53,7 @@ public sealed partial class StaminaComponent : Component [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] [AutoPausedField] public TimeSpan NextUpdate = TimeSpan.Zero; + + [DataField] + public ProtoId StaminaAlert = "Stamina"; } diff --git a/Content.Shared/Damage/Systems/StaminaSystem.cs b/Content.Shared/Damage/Systems/StaminaSystem.cs index 840b2e04311..1f9a7f1dd84 100644 --- a/Content.Shared/Damage/Systems/StaminaSystem.cs +++ b/Content.Shared/Damage/Systems/StaminaSystem.cs @@ -79,8 +79,7 @@ private void OnShutdown(EntityUid uid, StaminaComponent component, ComponentShut { RemCompDeferred(uid); } - - SetStaminaAlert(uid); + _alerts.ClearAlert(uid, component.StaminaAlert); } private void OnStartup(EntityUid uid, StaminaComponent component, ComponentStartup args) @@ -204,13 +203,10 @@ private void OnCollide(EntityUid uid, StaminaDamageOnCollideComponent component, private void SetStaminaAlert(EntityUid uid, StaminaComponent? component = null) { if (!Resolve(uid, ref component, false) || component.Deleted) - { - _alerts.ClearAlert(uid, AlertType.Stamina); return; - } var severity = ContentHelpers.RoundToLevels(MathF.Max(0f, component.CritThreshold - component.StaminaDamage), component.CritThreshold, 7); - _alerts.ShowAlert(uid, AlertType.Stamina, (short) severity); + _alerts.ShowAlert(uid, component.StaminaAlert, (short) severity); } /// diff --git a/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs index 553f6df1c77..2536fac4edc 100644 --- a/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs +++ b/Content.Shared/Ensnaring/Components/EnsnareableComponent.cs @@ -1,5 +1,7 @@ +using Content.Shared.Alert; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Ensnaring.Components; @@ -40,6 +42,9 @@ public sealed partial class EnsnareableComponent : Component [DataField("state")] public string? State; + + [DataField] + public ProtoId EnsnaredAlert = "Ensnared"; } [Serializable, NetSerializable] diff --git a/Content.Shared/Gravity/SharedGravitySystem.cs b/Content.Shared/Gravity/SharedGravitySystem.cs index 100d2ee74fb..df13be51fd4 100644 --- a/Content.Shared/Gravity/SharedGravitySystem.cs +++ b/Content.Shared/Gravity/SharedGravitySystem.cs @@ -17,6 +17,9 @@ public abstract partial class SharedGravitySystem : EntitySystem [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly InventorySystem _inventory = default!; + [ValidatePrototypeId] + public const string WeightlessAlert = "Weightless"; + public bool IsWeightless(EntityUid uid, PhysicsComponent? body = null, TransformComponent? xform = null) { Resolve(uid, ref body, false); @@ -93,11 +96,11 @@ private void OnGravityChange(ref GravityChangedEvent ev) if (!ev.HasGravity) { - _alerts.ShowAlert(uid, AlertType.Weightless); + _alerts.ShowAlert(uid, WeightlessAlert); } else { - _alerts.ClearAlert(uid, AlertType.Weightless); + _alerts.ClearAlert(uid, WeightlessAlert); } } } @@ -106,11 +109,11 @@ private void OnAlertsSync(AlertSyncEvent ev) { if (IsWeightless(ev.Euid)) { - _alerts.ShowAlert(ev.Euid, AlertType.Weightless); + _alerts.ShowAlert(ev.Euid, WeightlessAlert); } else { - _alerts.ClearAlert(ev.Euid, AlertType.Weightless); + _alerts.ClearAlert(ev.Euid, WeightlessAlert); } } @@ -118,11 +121,11 @@ private void OnAlertsParentChange(EntityUid uid, AlertsComponent component, ref { if (IsWeightless(uid)) { - _alerts.ShowAlert(uid, AlertType.Weightless); + _alerts.ShowAlert(uid, WeightlessAlert); } else { - _alerts.ClearAlert(uid, AlertType.Weightless); + _alerts.ClearAlert(uid, WeightlessAlert); } } diff --git a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs index e97d3672a21..0e37cf9b10e 100644 --- a/Content.Shared/Mobs/Components/MobThresholdsComponent.cs +++ b/Content.Shared/Mobs/Components/MobThresholdsComponent.cs @@ -2,6 +2,7 @@ using Content.Shared.FixedPoint; using Content.Shared.Mobs.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Mobs.Components; @@ -24,13 +25,16 @@ public sealed partial class MobThresholdsComponent : Component /// Used for alternate health alerts (silicons, for example) /// [DataField("stateAlertDict")] - public Dictionary StateAlertDict = new() + public Dictionary> StateAlertDict = new() { - {MobState.Alive, AlertType.HumanHealth}, - {MobState.Critical, AlertType.HumanCrit}, - {MobState.Dead, AlertType.HumanDead}, + {MobState.Alive, "HumanHealth"}, + {MobState.Critical, "HumanCrit"}, + {MobState.Dead, "HumanDead"}, }; + [DataField] + public ProtoId HealthAlertCategory = "Health"; + /// /// Whether or not this entity should display damage overlays (robots don't feel pain, black out etc.) /// @@ -53,19 +57,19 @@ public sealed class MobThresholdsComponentState : ComponentState public MobState CurrentThresholdState; - public Dictionary StateAlertDict = new() - { - {MobState.Alive, AlertType.HumanHealth}, - {MobState.Critical, AlertType.HumanCrit}, - {MobState.Dead, AlertType.HumanDead}, - }; + public Dictionary> StateAlertDict; public bool ShowOverlays; public bool AllowRevives; - public MobThresholdsComponentState(Dictionary unsortedThresholds, bool triggersAlerts, MobState currentThresholdState, - Dictionary stateAlertDict, bool showOverlays, bool allowRevives) + public MobThresholdsComponentState(Dictionary unsortedThresholds, + bool triggersAlerts, + MobState currentThresholdState, + Dictionary> stateAlertDict, + bool showOverlays, + bool allowRevives) { UnsortedThresholds = unsortedThresholds; TriggersAlerts = triggersAlerts; diff --git a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs index 59d9fb4c239..b11de9eac56 100644 --- a/Content.Shared/Mobs/Systems/MobThresholdSystem.cs +++ b/Content.Shared/Mobs/Systems/MobThresholdSystem.cs @@ -431,7 +431,7 @@ private void MobThresholdStartup(EntityUid target, MobThresholdsComponent thresh private void MobThresholdShutdown(EntityUid target, MobThresholdsComponent component, ComponentShutdown args) { if (component.TriggersAlerts) - _alerts.ClearAlertCategory(target, AlertCategory.Health); + _alerts.ClearAlertCategory(target, component.HealthAlertCategory); } private void OnUpdateMobState(EntityUid target, MobThresholdsComponent component, ref UpdateMobStateEvent args) diff --git a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs index db889e7e3bd..100cd9d6d3e 100644 --- a/Content.Shared/Movement/Pulling/Components/PullableComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullableComponent.cs @@ -1,4 +1,6 @@ +using Content.Shared.Alert; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; namespace Content.Shared.Movement.Pulling.Components; @@ -36,4 +38,7 @@ public sealed partial class PullableComponent : Component [Access(typeof(Systems.PullingSystem), Other = AccessPermissions.ReadExecute)] [AutoNetworkedField, DataField] public bool PrevFixedRotation; + + [DataField] + public ProtoId PulledAlert = "Pulled"; } diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs index 1fc9b731bd5..061ec13ed2a 100644 --- a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -1,5 +1,7 @@ -using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Alert; +using Content.Shared.Movement.Pulling.Systems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Movement.Pulling.Components; @@ -38,4 +40,7 @@ public sealed partial class PullerComponent : Component /// [DataField] public bool NeedsHands = true; + + [DataField] + public ProtoId PullingAlert = "Pulling"; } diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 81b2fee5695..2781c495298 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -223,7 +223,7 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) if (TryComp(oldPuller, out var pullerComp)) { var pullerUid = oldPuller.Value; - _alertsSystem.ClearAlert(pullerUid, AlertType.Pulling); + _alertsSystem.ClearAlert(pullerUid, pullerComp.PullingAlert); pullerComp.Pulling = null; Dirty(oldPuller.Value, pullerComp); @@ -237,7 +237,7 @@ private void StopPulling(EntityUid pullableUid, PullableComponent pullableComp) } - _alertsSystem.ClearAlert(pullableUid, AlertType.Pulled); + _alertsSystem.ClearAlert(pullableUid, pullableComp.PulledAlert); } public bool IsPulled(EntityUid uid, PullableComponent? component = null) @@ -460,8 +460,8 @@ public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, // Messaging var message = new PullStartedMessage(pullerUid, pullableUid); - _alertsSystem.ShowAlert(pullerUid, AlertType.Pulling); - _alertsSystem.ShowAlert(pullableUid, AlertType.Pulled); + _alertsSystem.ShowAlert(pullerUid, pullerComp.PullingAlert); + _alertsSystem.ShowAlert(pullableUid, pullableComp.PulledAlert); RaiseLocalEvent(pullerUid, message); RaiseLocalEvent(pullableUid, message); diff --git a/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs b/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs index 0f3bff265cb..91c816df5c9 100644 --- a/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs +++ b/Content.Shared/Ninja/Components/SpaceNinjaComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.Alert; using Content.Shared.Ninja.Systems; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; @@ -53,4 +54,7 @@ public sealed partial class SpaceNinjaComponent : Component /// [DataField] public EntProtoId SpiderChargeObjective = "SpiderChargeObjective"; + + [DataField] + public ProtoId SuitPowerAlert = "SuitPower"; } diff --git a/Content.Shared/Nutrition/Components/HungerComponent.cs b/Content.Shared/Nutrition/Components/HungerComponent.cs index 9ac82ba283c..79d895ddae6 100644 --- a/Content.Shared/Nutrition/Components/HungerComponent.cs +++ b/Content.Shared/Nutrition/Components/HungerComponent.cs @@ -2,6 +2,7 @@ using Content.Shared.Damage; using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic; @@ -65,15 +66,18 @@ public sealed partial class HungerComponent : Component /// /// A dictionary relating hunger thresholds to corresponding alerts. /// - [DataField("hungerThresholdAlerts", customTypeSerializer: typeof(DictionarySerializer))] + [DataField("hungerThresholdAlerts")] [AutoNetworkedField] - public Dictionary HungerThresholdAlerts = new() + public Dictionary> HungerThresholdAlerts = new() { - { HungerThreshold.Peckish, AlertType.Peckish }, - { HungerThreshold.Starving, AlertType.Starving }, - { HungerThreshold.Dead, AlertType.Starving } + { HungerThreshold.Peckish, "Peckish" }, + { HungerThreshold.Starving, "Starving" }, + { HungerThreshold.Dead, "Starving" } }; + [DataField] + public ProtoId HungerAlertCategory = "Hunger"; + /// /// A dictionary relating HungerThreshold to how much they modify . /// diff --git a/Content.Shared/Nutrition/Components/ThirstComponent.cs b/Content.Shared/Nutrition/Components/ThirstComponent.cs index 731346401fd..f3ac881361f 100644 --- a/Content.Shared/Nutrition/Components/ThirstComponent.cs +++ b/Content.Shared/Nutrition/Components/ThirstComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Alert; using Content.Shared.Nutrition.EntitySystems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Nutrition.Components; @@ -56,11 +57,14 @@ public sealed partial class ThirstComponent : Component {ThirstThreshold.Dead, 0.0f}, }; - public static readonly Dictionary ThirstThresholdAlertTypes = new() + [DataField] + public ProtoId ThirstyCategory = "Thirst"; + + public static readonly Dictionary> ThirstThresholdAlertTypes = new() { - {ThirstThreshold.Thirsty, AlertType.Thirsty}, - {ThirstThreshold.Parched, AlertType.Parched}, - {ThirstThreshold.Dead, AlertType.Parched}, + {ThirstThreshold.Thirsty, "Thirsty"}, + {ThirstThreshold.Parched, "Parched"}, + {ThirstThreshold.Dead, "Parched"}, }; } diff --git a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs index 4de4e4d5feb..bff15f06ff9 100644 --- a/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/HungerSystem.cs @@ -61,7 +61,7 @@ private void OnMapInit(EntityUid uid, HungerComponent component, MapInitEvent ar private void OnShutdown(EntityUid uid, HungerComponent component, ComponentShutdown args) { - _alerts.ClearAlertCategory(uid, AlertCategory.Hunger); + _alerts.ClearAlertCategory(uid, component.HungerAlertCategory); } private void OnRefreshMovespeed(EntityUid uid, HungerComponent component, RefreshMovementSpeedModifiersEvent args) @@ -142,7 +142,7 @@ private void DoHungerThresholdEffects(EntityUid uid, HungerComponent? component } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Hunger); + _alerts.ClearAlertCategory(uid, component.HungerAlertCategory); } if (component.HungerThresholdDecayModifiers.TryGetValue(component.CurrentThreshold, out var modifier)) diff --git a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs index 8ea7d9140c3..205d8d6cde3 100644 --- a/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs +++ b/Content.Shared/Nutrition/EntitySystems/ThirstSystem.cs @@ -165,7 +165,7 @@ private void UpdateEffects(EntityUid uid, ThirstComponent component) } else { - _alerts.ClearAlertCategory(uid, AlertCategory.Thirst); + _alerts.ClearAlertCategory(uid, component.ThirstyCategory); } switch (component.CurrentThirstThreshold) diff --git a/Content.Shared/Revenant/Components/RevenantComponent.cs b/Content.Shared/Revenant/Components/RevenantComponent.cs index 947c1a4b3fc..d7fb28ef136 100644 --- a/Content.Shared/Revenant/Components/RevenantComponent.cs +++ b/Content.Shared/Revenant/Components/RevenantComponent.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.FixedPoint; using Content.Shared.Store; using Content.Shared.Whitelist; @@ -200,6 +201,9 @@ public sealed partial class RevenantComponent : Component public EntityWhitelist? MalfunctionBlacklist; #endregion + [DataField] + public ProtoId EssenceAlert = "Essence"; + #region Visualizer [DataField("state")] public string State = "idle"; diff --git a/Content.Shared/Shuttles/Components/PilotComponent.cs b/Content.Shared/Shuttles/Components/PilotComponent.cs index 1a6927cf813..cb42db4436f 100644 --- a/Content.Shared/Shuttles/Components/PilotComponent.cs +++ b/Content.Shared/Shuttles/Components/PilotComponent.cs @@ -1,7 +1,9 @@ using System.Numerics; +using Content.Shared.Alert; using Content.Shared.Movement.Systems; using Robust.Shared.GameStates; using Robust.Shared.Map; +using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Shared.Shuttles.Components @@ -32,6 +34,9 @@ public sealed partial class PilotComponent : Component [ViewVariables] public ShuttleButtons HeldButtons = ShuttleButtons.None; + [DataField] + public ProtoId PilotingAlert = "PilotingShuttle"; + public override bool SendOnlyToOwner => true; } } diff --git a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs index 71d3a7bd166..e1776873da9 100644 --- a/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/BorgChassisComponent.cs @@ -1,6 +1,8 @@ -using Content.Shared.Whitelist; +using Content.Shared.Alert; +using Content.Shared.Whitelist; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Silicons.Borgs.Components; @@ -76,6 +78,12 @@ public sealed partial class BorgChassisComponent : Component [DataField("noMindState")] public string NoMindState = string.Empty; #endregion + + [DataField] + public ProtoId BatteryAlert = "BorgBattery"; + + [DataField] + public ProtoId NoBatteryAlert = "BorgBatteryNone"; } [Serializable, NetSerializable] diff --git a/Content.Shared/StatusEffect/StatusEffectPrototype.cs b/Content.Shared/StatusEffect/StatusEffectPrototype.cs index ae9e26879eb..8b1f84e4d81 100644 --- a/Content.Shared/StatusEffect/StatusEffectPrototype.cs +++ b/Content.Shared/StatusEffect/StatusEffectPrototype.cs @@ -10,7 +10,7 @@ public sealed partial class StatusEffectPrototype : IPrototype public string ID { get; private set; } = default!; [DataField("alert")] - public AlertType? Alert { get; private set; } + public ProtoId? Alert { get; private set; } /// /// Whether a status effect should be able to apply to any entity, diff --git a/Content.Shared/StatusEffect/StatusEffectsSystem.cs b/Content.Shared/StatusEffect/StatusEffectsSystem.cs index f3e3e12bd8c..9806077f9bb 100644 --- a/Content.Shared/StatusEffect/StatusEffectsSystem.cs +++ b/Content.Shared/StatusEffect/StatusEffectsSystem.cs @@ -219,7 +219,7 @@ public bool TryAddStatusEffect(EntityUid uid, string key, TimeSpan time, bool re /// This is mostly for stuns, since Stun and Knockdown share an alert key. Other times this pretty much /// will not be useful. /// - private (TimeSpan, TimeSpan)? GetAlertCooldown(EntityUid uid, AlertType alert, StatusEffectsComponent status) + private (TimeSpan, TimeSpan)? GetAlertCooldown(EntityUid uid, ProtoId alert, StatusEffectsComponent status) { (TimeSpan, TimeSpan)? maxCooldown = null; foreach (var kvp in status.ActiveEffects) diff --git a/Content.Shared/Weapons/Reflect/ReflectSystem.cs b/Content.Shared/Weapons/Reflect/ReflectSystem.cs index 36dbedb4cb1..03ad97edff2 100644 --- a/Content.Shared/Weapons/Reflect/ReflectSystem.cs +++ b/Content.Shared/Weapons/Reflect/ReflectSystem.cs @@ -42,6 +42,9 @@ public sealed class ReflectSystem : EntitySystem [Dependency] private readonly StandingStateSystem _standing = default!; [Dependency] private readonly AlertsSystem _alerts = default!; + [ValidatePrototypeId] + private const string DeflectingAlert = "Deflecting"; + public override void Initialize() { base.Initialize(); @@ -296,11 +299,11 @@ private void RefreshReflectUser(EntityUid user) private void EnableAlert(EntityUid alertee) { - _alerts.ShowAlert(alertee, AlertType.Deflecting); + _alerts.ShowAlert(alertee, DeflectingAlert); } private void DisableAlert(EntityUid alertee) { - _alerts.ClearAlert(alertee, AlertType.Deflecting); + _alerts.ClearAlert(alertee, DeflectingAlert); } } diff --git a/Content.Tests/Shared/Alert/AlertManagerTests.cs b/Content.Tests/Shared/Alert/AlertManagerTests.cs index 2d5f6af5a7f..c57df63d5b7 100644 --- a/Content.Tests/Shared/Alert/AlertManagerTests.cs +++ b/Content.Tests/Shared/Alert/AlertManagerTests.cs @@ -1,6 +1,5 @@ using System.IO; using Content.Client.Alerts; -using Content.Server.Alert; using Content.Shared.Alert; using NUnit.Framework; using Robust.Shared.GameObjects; @@ -45,15 +44,15 @@ public void TestAlertManager() prototypeManager.Initialize(); prototypeManager.LoadFromStream(new StringReader(PROTOTYPES)); - Assert.That(alertsSystem.TryGet(AlertType.LowPressure, out var lowPressure)); - Assert.That(lowPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.HighPressure, out var highPressure)); - Assert.That(highPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); + Assert.That(alertsSystem.TryGet("LowPressure", out var lowPressure)); + Assert.That(lowPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); + Assert.That(alertsSystem.TryGet("HighPressure", out var highPressure)); + Assert.That(highPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.LowPressure, out lowPressure)); - Assert.That(lowPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); - Assert.That(alertsSystem.TryGet(AlertType.HighPressure, out highPressure)); - Assert.That(highPressure.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); + Assert.That(alertsSystem.TryGet("LowPressure", out lowPressure)); + Assert.That(lowPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/lowpressure.png")))); + Assert.That(alertsSystem.TryGet("HighPressure", out highPressure)); + Assert.That(highPressure!.Icons[0], Is.EqualTo(new SpriteSpecifier.Texture(new ("/Textures/Interface/Alerts/Pressure/highpressure.png")))); } } } diff --git a/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs b/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs index 56f76d46a92..efcd59acbbb 100644 --- a/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs +++ b/Content.Tests/Shared/Alert/AlertOrderPrototypeTests.cs @@ -85,24 +85,24 @@ public void TestAlertOrderPrototype() var alerts = prototypeManager.EnumeratePrototypes(); // ensure they sort according to our expected criteria - var expectedOrder = new List(); - expectedOrder.Add(AlertType.Handcuffed); - expectedOrder.Add(AlertType.Ensnared); - expectedOrder.Add(AlertType.HighPressure); + var expectedOrder = new List(); + expectedOrder.Add("Handcuffed"); + expectedOrder.Add("Ensnared"); + expectedOrder.Add("HighPressure"); // stuff with only category + same category ordered by enum value - expectedOrder.Add(AlertType.Peckish); - expectedOrder.Add(AlertType.Hot); - expectedOrder.Add(AlertType.Stun); - expectedOrder.Add(AlertType.LowPressure); - expectedOrder.Add(AlertType.Cold); - // stuff at end of list ordered by enum value - expectedOrder.Add(AlertType.Weightless); - expectedOrder.Add(AlertType.PilotingShuttle); + expectedOrder.Add("Peckish"); + expectedOrder.Add("Hot"); + expectedOrder.Add("Stun"); + expectedOrder.Add("LowPressure"); + expectedOrder.Add("Cold"); + // stuff at end of list ordered by ID + expectedOrder.Add("PilotingShuttle"); + expectedOrder.Add("Weightless"); var actual = alerts.ToList(); actual.Sort(alertOrder); - Assert.That(actual.Select(a => a.AlertType).ToList(), Is.EqualTo(expectedOrder)); + Assert.That(actual.Select(a => a.ID).ToList(), Is.EqualTo(expectedOrder)); } } } diff --git a/Content.Tests/Shared/Alert/AlertPrototypeTests.cs b/Content.Tests/Shared/Alert/AlertPrototypeTests.cs index d95acb8aff4..43ae98b452b 100644 --- a/Content.Tests/Shared/Alert/AlertPrototypeTests.cs +++ b/Content.Tests/Shared/Alert/AlertPrototypeTests.cs @@ -39,9 +39,9 @@ public void OneTimeSetUp() [Test] public void TestAlertKey() { - Assert.That(new AlertKey(AlertType.HumanHealth, null), Is.Not.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); - Assert.That((new AlertKey(null, AlertCategory.Health)), Is.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); - Assert.That((new AlertKey(AlertType.Buckled, AlertCategory.Health)), Is.EqualTo(AlertKey.ForCategory(AlertCategory.Health))); + Assert.That(new AlertKey("HumanHealth", null), Is.Not.EqualTo(AlertKey.ForCategory("Health"))); + Assert.That((new AlertKey(null, "Health")), Is.EqualTo(AlertKey.ForCategory("Health"))); + Assert.That((new AlertKey("Buckled", "Health")), Is.EqualTo(AlertKey.ForCategory("Health"))); } [TestCase(0, "/Textures/Interface/Alerts/Human/human.rsi/human0.png")] diff --git a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs b/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs index 47ae3ef74a6..bcc32e13dee 100644 --- a/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs +++ b/Content.Tests/Shared/Alert/ServerAlertsComponentTests.cs @@ -15,6 +15,9 @@ namespace Content.Tests.Shared.Alert public sealed class ServerAlertsComponentTests : ContentUnitTest { const string PROTOTYPES = @" +- type: alertCategory + id: Pressure + - type: alert id: LowPressure category: Pressure @@ -49,10 +52,10 @@ public void ShowAlerts() var alertsComponent = new AlertsComponent(); alertsComponent = IoCManager.InjectDependencies(alertsComponent); - Assert.That(entManager.System().TryGet(AlertType.LowPressure, out var lowpressure)); - Assert.That(entManager.System().TryGet(AlertType.HighPressure, out var highpressure)); + Assert.That(entManager.System().TryGet("LowPressure", out var lowpressure)); + Assert.That(entManager.System().TryGet("HighPressure", out var highpressure)); - entManager.System().ShowAlert(alertsComponent.Owner, AlertType.LowPressure, null, null); + entManager.System().ShowAlert(alertsComponent.Owner, "LowPressure"); var getty = new ComponentGetState(); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); @@ -60,17 +63,17 @@ public void ShowAlerts() var alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState, Is.Not.Null); Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(lowpressure.AlertKey)); + Assert.That(alertState.Alerts.ContainsKey(lowpressure!.AlertKey)); - entManager.System().ShowAlert(alertsComponent.Owner, AlertType.HighPressure, null, null); + entManager.System().ShowAlert(alertsComponent.Owner, "HighPressure"); // Lazy entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; Assert.That(alertState.Alerts.Count, Is.EqualTo(1)); - Assert.That(alertState.Alerts.ContainsKey(highpressure.AlertKey)); + Assert.That(alertState.Alerts.ContainsKey(highpressure!.AlertKey)); - entManager.System().ClearAlertCategory(alertsComponent.Owner, AlertCategory.Pressure); + entManager.System().ClearAlertCategory(alertsComponent.Owner, "Pressure"); entManager.EventBus.RaiseComponentEvent(alertsComponent, getty); alertState = (AlertsComponent.AlertsComponent_AutoState) getty.State!; diff --git a/Resources/Prototypes/Alerts/categories.yml b/Resources/Prototypes/Alerts/categories.yml new file mode 100644 index 00000000000..2365422ed91 --- /dev/null +++ b/Resources/Prototypes/Alerts/categories.yml @@ -0,0 +1,35 @@ +- type: alertCategory + id: Pressure + +- type: alertCategory + id: Temperature + +- type: alertCategory + id: Breathing + +- type: alertCategory + id: Buckled + +- type: alertCategory + id: Health + +- type: alertCategory + id: Internals + +- type: alertCategory + id: Stamina + +- type: alertCategory + id: Piloting + +- type: alertCategory + id: Hunger + +- type: alertCategory + id: Thirst + +- type: alertCategory + id: Toxins + +- type: alertCategory + id: Battery From 5d5046746688639b95655dcb9cb3bab67484561b Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 24 May 2024 16:08:23 +1200 Subject: [PATCH 014/112] Content changes for engine delta-state PR (#28134) * Update GasTileOverlayState * Update DecalGridState * Update NavMapState * poke * poke2 * poke3 * Poke dem tests --- .../EntitySystems/GasTileOverlaySystem.cs | 39 ++++++++++------ Content.Client/Decals/DecalSystem.cs | 39 ++++++++++------ Content.Client/Pinpointer/NavMapSystem.cs | 41 +++++++++++------ .../Components/GasTileOverlayComponent.cs | 45 ++++++++---------- .../SharedGasTileOverlaySystem.cs | 2 +- Content.Shared/Decals/DecalGridComponent.cs | 35 ++++++-------- Content.Shared/Decals/SharedDecalSystem.cs | 2 +- .../Pinpointer/SharedNavMapSystem.cs | 46 ++++++++----------- 8 files changed, 129 insertions(+), 120 deletions(-) diff --git a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs index 78185ce6b0e..86cf0a9eb82 100644 --- a/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs +++ b/Content.Client/Atmos/EntitySystems/GasTileOverlaySystem.cs @@ -1,4 +1,5 @@ using Content.Client.Atmos.Overlays; +using Content.Shared.Atmos; using Content.Shared.Atmos.Components; using Content.Shared.Atmos.EntitySystems; using JetBrains.Annotations; @@ -36,28 +37,38 @@ public override void Shutdown() private void OnHandleState(EntityUid gridUid, GasTileOverlayComponent comp, ref ComponentHandleState args) { - if (args.Current is not GasTileOverlayState state) - return; + Dictionary modifiedChunks; - // is this a delta or full state? - if (!state.FullState) + switch (args.Current) { - foreach (var index in comp.Chunks.Keys) + // is this a delta or full state? + case GasTileOverlayDeltaState delta: { - if (!state.AllChunks!.Contains(index)) - comp.Chunks.Remove(index); + modifiedChunks = delta.ModifiedChunks; + foreach (var index in comp.Chunks.Keys) + { + if (!delta.AllChunks.Contains(index)) + comp.Chunks.Remove(index); + } + + break; } - } - else - { - foreach (var index in comp.Chunks.Keys) + case GasTileOverlayState state: { - if (!state.Chunks.ContainsKey(index)) - comp.Chunks.Remove(index); + modifiedChunks = state.Chunks; + foreach (var index in comp.Chunks.Keys) + { + if (!state.Chunks.ContainsKey(index)) + comp.Chunks.Remove(index); + } + + break; } + default: + return; } - foreach (var (index, data) in state.Chunks) + foreach (var (index, data) in modifiedChunks) { comp.Chunks[index] = data; } diff --git a/Content.Client/Decals/DecalSystem.cs b/Content.Client/Decals/DecalSystem.cs index 901ab270fb5..41e5f39c286 100644 --- a/Content.Client/Decals/DecalSystem.cs +++ b/Content.Client/Decals/DecalSystem.cs @@ -56,34 +56,43 @@ protected override void OnDecalRemoved(EntityUid gridId, uint decalId, DecalGrid private void OnHandleState(EntityUid gridUid, DecalGridComponent gridComp, ref ComponentHandleState args) { - if (args.Current is not DecalGridState state) - return; - // is this a delta or full state? _removedChunks.Clear(); + Dictionary modifiedChunks; - if (!state.FullState) + switch (args.Current) { - foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + case DecalGridDeltaState delta: { - if (!state.AllChunks!.Contains(key)) - _removedChunks.Add(key); + modifiedChunks = delta.ModifiedChunks; + foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + { + if (!delta.AllChunks.Contains(key)) + _removedChunks.Add(key); + } + + break; } - } - else - { - foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + case DecalGridState state: { - if (!state.Chunks.ContainsKey(key)) - _removedChunks.Add(key); + modifiedChunks = state.Chunks; + foreach (var key in gridComp.ChunkCollection.ChunkCollection.Keys) + { + if (!state.Chunks.ContainsKey(key)) + _removedChunks.Add(key); + } + + break; } + default: + return; } if (_removedChunks.Count > 0) RemoveChunks(gridUid, gridComp, _removedChunks); - if (state.Chunks.Count > 0) - UpdateChunks(gridUid, gridComp, state.Chunks); + if (modifiedChunks.Count > 0) + UpdateChunks(gridUid, gridComp, modifiedChunks); } private void OnChunkUpdate(DecalChunkUpdateEvent ev) diff --git a/Content.Client/Pinpointer/NavMapSystem.cs b/Content.Client/Pinpointer/NavMapSystem.cs index e33bc5d3291..9aeb792a429 100644 --- a/Content.Client/Pinpointer/NavMapSystem.cs +++ b/Content.Client/Pinpointer/NavMapSystem.cs @@ -14,27 +14,40 @@ public override void Initialize() private void OnHandleState(EntityUid uid, NavMapComponent component, ref ComponentHandleState args) { - if (args.Current is not NavMapComponentState state) - return; + Dictionary modifiedChunks; + Dictionary beacons; - if (!state.FullState) + switch (args.Current) { - foreach (var index in component.Chunks.Keys) + case NavMapDeltaState delta: { - if (!state.AllChunks!.Contains(index)) - component.Chunks.Remove(index); + modifiedChunks = delta.ModifiedChunks; + beacons = delta.Beacons; + foreach (var index in component.Chunks.Keys) + { + if (!delta.AllChunks!.Contains(index)) + component.Chunks.Remove(index); + } + + break; } - } - else - { - foreach (var index in component.Chunks.Keys) + case NavMapState state: { - if (!state.Chunks.ContainsKey(index)) - component.Chunks.Remove(index); + modifiedChunks = state.Chunks; + beacons = state.Beacons; + foreach (var index in component.Chunks.Keys) + { + if (!state.Chunks.ContainsKey(index)) + component.Chunks.Remove(index); + } + + break; } + default: + return; } - foreach (var (origin, chunk) in state.Chunks) + foreach (var (origin, chunk) in modifiedChunks) { var newChunk = new NavMapChunk(origin); Array.Copy(chunk, newChunk.TileData, chunk.Length); @@ -42,7 +55,7 @@ private void OnHandleState(EntityUid uid, NavMapComponent component, ref Compone } component.Beacons.Clear(); - foreach (var (nuid, beacon) in state.Beacons) + foreach (var (nuid, beacon) in beacons) { component.Beacons[nuid] = beacon; } diff --git a/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs b/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs index e72a1d67584..2c3149b11a8 100644 --- a/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs +++ b/Content.Shared/Atmos/Components/GasTileOverlayComponent.cs @@ -1,7 +1,6 @@ using Robust.Shared.GameStates; using Robust.Shared.Serialization; using Robust.Shared.Timing; -using Robust.Shared.Utility; namespace Content.Shared.Atmos.Components; @@ -24,55 +23,47 @@ public sealed partial class GasTileOverlayComponent : Component public GameTick ForceTick { get; set; } } - [Serializable, NetSerializable] -public sealed class GasTileOverlayState : ComponentState, IComponentDeltaState +public sealed class GasTileOverlayState(Dictionary chunks) : ComponentState { - public readonly Dictionary Chunks; - public bool FullState => AllChunks == null; - - // required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; + public readonly Dictionary Chunks = chunks; +} - public GasTileOverlayState(Dictionary chunks) - { - Chunks = chunks; - } +[Serializable, NetSerializable] +public sealed class GasTileOverlayDeltaState( + Dictionary modifiedChunks, + HashSet allChunks) + : ComponentState, IComponentDeltaState +{ + public readonly Dictionary ModifiedChunks = modifiedChunks; + public readonly HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(GasTileOverlayState state) { - DebugTools.Assert(!FullState); - var state = (GasTileOverlayState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { - if (!AllChunks!.Contains(key)) + if (!AllChunks.Contains(key)) state.Chunks.Remove(key); } - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { state.Chunks[chunk] = new(data); } } - public IComponentState CreateNewFullState(IComponentState fullState) + public GasTileOverlayState CreateNewFullState(GasTileOverlayState state) { - DebugTools.Assert(!FullState); - var state = (GasTileOverlayState) fullState; - DebugTools.Assert(state.FullState); - - var chunks = new Dictionary(state.Chunks.Count); + var chunks = new Dictionary(AllChunks.Count); - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { chunks[chunk] = new(data); } foreach (var (chunk, data) in state.Chunks) { - if (AllChunks!.Contains(chunk)) + if (AllChunks.Contains(chunk)) chunks.TryAdd(chunk, new(data)); } diff --git a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs index f468724db33..8e7dfdedaf9 100644 --- a/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs +++ b/Content.Shared/Atmos/EntitySystems/SharedGasTileOverlaySystem.cs @@ -55,7 +55,7 @@ private void OnGetState(EntityUid uid, GasTileOverlayComponent component, ref Co data[index] = chunk; } - args.State = new GasTileOverlayState(data) { AllChunks = new(component.Chunks.Keys) }; + args.State = new GasTileOverlayDeltaState(data, new(component.Chunks.Keys)); } public static Vector2i GetGasChunkIndices(Vector2i indices) diff --git a/Content.Shared/Decals/DecalGridComponent.cs b/Content.Shared/Decals/DecalGridComponent.cs index 8ac05cb280f..67a9c037696 100644 --- a/Content.Shared/Decals/DecalGridComponent.cs +++ b/Content.Shared/Decals/DecalGridComponent.cs @@ -62,46 +62,37 @@ public record DecalGridChunkCollection(Dictionary ChunkCol } [Serializable, NetSerializable] - public sealed class DecalGridState : ComponentState, IComponentDeltaState + public sealed class DecalGridState(Dictionary chunks) : ComponentState { - public Dictionary Chunks; - public bool FullState => AllChunks == null; - - // required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; + public Dictionary Chunks = chunks; + } - public DecalGridState(Dictionary chunks) - { - Chunks = chunks; - } + [Serializable, NetSerializable] + public sealed class DecalGridDeltaState(Dictionary modifiedChunks, HashSet allChunks) + : ComponentState, IComponentDeltaState + { + public Dictionary ModifiedChunks = modifiedChunks; + public HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(DecalGridState state) { - DebugTools.Assert(!FullState); - var state = (DecalGridState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { if (!AllChunks!.Contains(key)) state.Chunks.Remove(key); } - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { state.Chunks[chunk] = new(data); } } - public IComponentState CreateNewFullState(IComponentState fullState) + public DecalGridState CreateNewFullState(DecalGridState state) { - DebugTools.Assert(!FullState); - var state = (DecalGridState) fullState; - DebugTools.Assert(state.FullState); - var chunks = new Dictionary(state.Chunks.Count); - foreach (var (chunk, data) in Chunks) + foreach (var (chunk, data) in ModifiedChunks) { chunks[chunk] = new(data); } diff --git a/Content.Shared/Decals/SharedDecalSystem.cs b/Content.Shared/Decals/SharedDecalSystem.cs index 0665ccbf84b..0a2349ea299 100644 --- a/Content.Shared/Decals/SharedDecalSystem.cs +++ b/Content.Shared/Decals/SharedDecalSystem.cs @@ -49,7 +49,7 @@ private void OnGetState(EntityUid uid, DecalGridComponent component, ref Compone data[index] = chunk; } - args.State = new DecalGridState(data) { AllChunks = new(component.ChunkCollection.ChunkCollection.Keys) }; + args.State = new DecalGridDeltaState(data, new(component.ChunkCollection.ChunkCollection.Keys)); } private void OnGridInitialize(GridInitializeEvent msg) diff --git a/Content.Shared/Pinpointer/SharedNavMapSystem.cs b/Content.Shared/Pinpointer/SharedNavMapSystem.cs index ffe81c2d0ea..7c12321b5db 100644 --- a/Content.Shared/Pinpointer/SharedNavMapSystem.cs +++ b/Content.Shared/Pinpointer/SharedNavMapSystem.cs @@ -96,7 +96,7 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG chunks.Add(origin, chunk.TileData); } - args.State = new NavMapComponentState(chunks, component.Beacons); + args.State = new NavMapState(chunks, component.Beacons); return; } @@ -109,12 +109,7 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG chunks.Add(origin, chunk.TileData); } - args.State = new NavMapComponentState(chunks, component.Beacons) - { - // TODO NAVMAP cache a single AllChunks hashset in the component. - // Or maybe just only send them if a chunk gets removed. - AllChunks = new(component.Chunks.Keys), - }; + args.State = new NavMapDeltaState(chunks, component.Beacons, new(component.Chunks.Keys)); } #endregion @@ -122,32 +117,35 @@ private void OnGetState(EntityUid uid, NavMapComponent component, ref ComponentG #region: System messages [Serializable, NetSerializable] - protected sealed class NavMapComponentState( + protected sealed class NavMapState( Dictionary chunks, Dictionary beacons) - : ComponentState, IComponentDeltaState + : ComponentState { public Dictionary Chunks = chunks; public Dictionary Beacons = beacons; + } - // Required to infer deleted/missing chunks for delta states - public HashSet? AllChunks; - - public bool FullState => AllChunks == null; + [Serializable, NetSerializable] + protected sealed class NavMapDeltaState( + Dictionary modifiedChunks, + Dictionary beacons, + HashSet allChunks) + : ComponentState, IComponentDeltaState + { + public Dictionary ModifiedChunks = modifiedChunks; + public Dictionary Beacons = beacons; + public HashSet AllChunks = allChunks; - public void ApplyToFullState(IComponentState fullState) + public void ApplyToFullState(NavMapState state) { - DebugTools.Assert(!FullState); - var state = (NavMapComponentState) fullState; - DebugTools.Assert(state.FullState); - foreach (var key in state.Chunks.Keys) { if (!AllChunks!.Contains(key)) state.Chunks.Remove(key); } - foreach (var (index, data) in Chunks) + foreach (var (index, data) in ModifiedChunks) { if (!state.Chunks.TryGetValue(index, out var stateValue)) state.Chunks[index] = stateValue = new int[data.Length]; @@ -162,12 +160,8 @@ public void ApplyToFullState(IComponentState fullState) } } - public IComponentState CreateNewFullState(IComponentState fullState) + public NavMapState CreateNewFullState(NavMapState state) { - DebugTools.Assert(!FullState); - var state = (NavMapComponentState) fullState; - DebugTools.Assert(state.FullState); - var chunks = new Dictionary(state.Chunks.Count); foreach (var (index, data) in state.Chunks) { @@ -176,13 +170,13 @@ public IComponentState CreateNewFullState(IComponentState fullState) var newData = chunks[index] = new int[ArraySize]; - if (Chunks.TryGetValue(index, out var updatedData)) + if (ModifiedChunks.TryGetValue(index, out var updatedData)) Array.Copy(newData, updatedData, ArraySize); else Array.Copy(newData, data, ArraySize); } - return new NavMapComponentState(chunks, new(Beacons)); + return new NavMapState(chunks, new(Beacons)); } } From 01e7c9c37eaa34a4bc388f59eace26ab79684526 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 24 May 2024 16:11:45 +1200 Subject: [PATCH 015/112] Update engine to v223.0.0 (#28239) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index ec794ce4e46..6a6bfe33ca9 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit ec794ce4e4693069d3b3ebf7a88ead5ff2f860e0 +Subproject commit 6a6bfe33ca98dd3df6035ef4dcb7429f4dd5db66 From 76e13eed3595747135a8e0f4d668a9011d2ea06f Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 24 May 2024 17:03:03 +1200 Subject: [PATCH 016/112] Improve InteractionSystem range & BUI checks (#27999) * Improve InteractionSystem range & BUI checks * Ghost fixes * AAA * Fix test * fix nullable * revert to broadcast event * Fixes for eengine PR * Ah buckle code * ) --- .../UI/InstrumentBoundUserInterface.cs | 10 +- .../Interactable/InteractionSystem.cs | 22 +- Content.IntegrationTests/Tests/EntityTest.cs | 4 + .../Configurable/ConfigurationSystem.cs | 1 + .../Interaction/InteractionSystem.cs | 29 +- .../StationEvents/Events/ImmovableRodRule.cs | 4 +- .../Weapons/Melee/MeleeWeaponSystem.cs | 9 +- Content.Shared/Actions/SharedActionsSystem.cs | 8 +- .../Buckle/SharedBuckleSystem.Buckle.cs | 2 +- .../Interaction/SharedInteractionSystem.cs | 254 ++++++++++++------ .../Inventory/InventorySystem.Equip.cs | 6 +- .../MagicMirror/SharedMagicMirrorSystem.cs | 10 +- .../Movement/Pulling/Systems/PullingSystem.cs | 13 +- .../EntitySystems/SharedStorageSystem.cs | 2 +- .../UserInterface/ActivatableUIComponent.cs | 2 +- .../UserInterface/ActivatableUISystem.cs | 88 ++---- Content.Shared/Verbs/SharedVerbSystem.cs | 14 +- .../Fun/Instruments/base_instruments.yml | 2 +- 18 files changed, 232 insertions(+), 248 deletions(-) diff --git a/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs b/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs index 2a846ff708a..0f5729f55b1 100644 --- a/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs +++ b/Content.Client/Instruments/UI/InstrumentBoundUserInterface.cs @@ -37,14 +37,8 @@ public InstrumentBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, u protected override void ReceiveMessage(BoundUserInterfaceMessage message) { - switch (message) - { - case InstrumentBandResponseBuiMessage bandRx: - _bandMenu?.Populate(bandRx.Nearby, EntMan); - break; - default: - break; - } + if (message is InstrumentBandResponseBuiMessage bandRx) + _bandMenu?.Populate(bandRx.Nearby, EntMan); } protected override void Open() diff --git a/Content.Client/Interactable/InteractionSystem.cs b/Content.Client/Interactable/InteractionSystem.cs index 0af8830e9ac..ff0a607920f 100644 --- a/Content.Client/Interactable/InteractionSystem.cs +++ b/Content.Client/Interactable/InteractionSystem.cs @@ -4,24 +4,6 @@ namespace Content.Client.Interactable { - public sealed class InteractionSystem : SharedInteractionSystem - { - [Dependency] private readonly SharedContainerSystem _container = default!; - - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) - { - if (!EntityManager.EntityExists(target)) - return false; - - if (!_container.TryGetContainingContainer(target, out var container)) - return false; - - if (!HasComp(container.Owner)) - return false; - - // we don't check if the user can access the storage entity itself. This should be handed by the UI system. - // Need to return if UI is open or not - return true; - } - } + // TODO Remove Shared prefix + public sealed class InteractionSystem : SharedInteractionSystem; } diff --git a/Content.IntegrationTests/Tests/EntityTest.cs b/Content.IntegrationTests/Tests/EntityTest.cs index d3b1fb47221..54af64122be 100644 --- a/Content.IntegrationTests/Tests/EntityTest.cs +++ b/Content.IntegrationTests/Tests/EntityTest.cs @@ -350,8 +350,12 @@ public async Task AllComponentsOneToOneDeleteTest() "DebrisFeaturePlacerController", // Above. "LoadedChunk", // Worldgen chunk loading malding. "BiomeSelection", // Whaddya know, requires config. + "ActivatableUI", // Requires enum key }; + // TODO TESTS + // auto ignore any components that have a "required" data field. + await using var pair = await PoolManager.GetServerClient(); var server = pair.Server; var entityManager = server.ResolveDependency(); diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index 2683bf4e095..5f5f1ef7d16 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -24,6 +24,7 @@ public override void Initialize() private void OnInteractUsing(EntityUid uid, ConfigurationComponent component, InteractUsingEvent args) { + // TODO use activatable ui system if (args.Handled) return; diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 4eac7e9ef1d..9ac82b21858 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -7,31 +7,6 @@ namespace Content.Server.Interaction { - /// - /// Governs interactions during clicking on entities - /// - [UsedImplicitly] - public sealed partial class InteractionSystem : SharedInteractionSystem - { - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) - { - if (Deleted(target)) - return false; - - if (!_container.TryGetContainingContainer(target, out var container)) - return false; - - if (!TryComp(container.Owner, out StorageComponent? storage)) - return false; - - if (storage.Container?.ID != container.ID) - return false; - - // we don't check if the user can access the storage entity itself. This should be handed by the UI system. - return _uiSystem.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); - } - } + // TODO Remove Shared prefix + public sealed class InteractionSystem : SharedInteractionSystem; } diff --git a/Content.Server/StationEvents/Events/ImmovableRodRule.cs b/Content.Server/StationEvents/Events/ImmovableRodRule.cs index cacb839cd39..aa193f2f4cb 100644 --- a/Content.Server/StationEvents/Events/ImmovableRodRule.cs +++ b/Content.Server/StationEvents/Events/ImmovableRodRule.cs @@ -28,7 +28,9 @@ protected override void Started(EntityUid uid, ImmovableRodRuleComponent compone if (proto.TryGetComponent(out var rod) && proto.TryGetComponent(out var despawn)) { - TryFindRandomTile(out _, out _, out _, out var targetCoords); + if (!TryFindRandomTile(out _, out _, out _, out var targetCoords)) + return; + var speed = RobustRandom.NextFloat(rod.MinSpeed, rod.MaxSpeed); var angle = RobustRandom.NextAngle(); var direction = angle.ToVec(); diff --git a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs index 2612e99ec9a..190a2d0263e 100644 --- a/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs +++ b/Content.Server/Weapons/Melee/MeleeWeaponSystem.cs @@ -187,15 +187,10 @@ protected override bool InRange(EntityUid user, EntityUid target, float range, I if (session is { } pSession) { (targetCoordinates, targetLocalAngle) = _lag.GetCoordinatesAngle(target, pSession); - } - else - { - var xform = Transform(target); - targetCoordinates = xform.Coordinates; - targetLocalAngle = xform.LocalRotation; + return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); } - return Interaction.InRangeUnobstructed(user, target, targetCoordinates, targetLocalAngle, range); + return Interaction.InRangeUnobstructed(user, target, range); } protected override void DoDamageEffect(List targets, EntityUid? user, TransformComponent targetXform) diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 30687c93225..c92d67ba812 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -502,13 +502,7 @@ private bool ValidateEntityTargetBase(EntityUid user, EntityUid target, EntityTa return distance <= action.Range; } - if (_interactionSystem.InRangeUnobstructed(user, target, range: action.Range) - && _containerSystem.IsInSameOrParentContainer(user, target)) - { - return true; - } - - return _interactionSystem.CanAccessViaStorage(user, target); + return _interactionSystem.InRangeAndAccessible(user, target, range: action.Range); } public bool ValidateWorldTarget(EntityUid user, EntityCoordinates coords, Entity action) diff --git a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs index 4e94c6134b4..00040211e36 100644 --- a/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs +++ b/Content.Shared/Buckle/SharedBuckleSystem.Buckle.cs @@ -64,7 +64,7 @@ private void OnBuckleMove(EntityUid uid, BuckleComponent component, ref MoveEven return; var strapPosition = Transform(strapUid).Coordinates; - if (ev.NewPosition.InRange(EntityManager, _transform, strapPosition, strapComp.MaxBuckleDistance)) + if (ev.NewPosition.EntityId.IsValid() && ev.NewPosition.InRange(EntityManager, _transform, strapPosition, strapComp.MaxBuckleDistance)) return; TryUnbuckle(uid, uid, true, component); diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index c82a749755d..3324ce5b9b8 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1,11 +1,10 @@ using System.Diagnostics.CodeAnalysis; using System.Linq; using Content.Shared.ActionBlocker; -using Content.Shared.Administration; using Content.Shared.Administration.Logs; -using Content.Shared.Administration.Managers; using Content.Shared.CombatMode; using Content.Shared.Database; +using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Input; @@ -15,12 +14,13 @@ using Content.Shared.Inventory.Events; using Content.Shared.Item; using Content.Shared.Movement.Components; -using Content.Shared.Movement.Pulling.Components; using Content.Shared.Movement.Pulling.Systems; using Content.Shared.Physics; using Content.Shared.Popups; +using Content.Shared.Storage; using Content.Shared.Tag; using Content.Shared.Timing; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using Content.Shared.Wall; using JetBrains.Annotations; @@ -36,6 +36,7 @@ using Robust.Shared.Random; using Robust.Shared.Serialization; using Robust.Shared.Timing; +using Robust.Shared.Utility; #pragma warning disable 618 @@ -50,12 +51,11 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly ISharedAdminManager _adminManager = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly RotateToFaceSystem _rotateToFaceSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; - [Dependency] private readonly SharedPhysicsSystem _sharedBroadphaseSystem = default!; + [Dependency] private readonly SharedPhysicsSystem _broadphase = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SharedVerbSystem _verbSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; @@ -64,6 +64,18 @@ public abstract partial class SharedInteractionSystem : EntitySystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + + private EntityQuery _ignoreUiRangeQuery; + private EntityQuery _fixtureQuery; + private EntityQuery _itemQuery; + private EntityQuery _physicsQuery; + private EntityQuery _handsQuery; + private EntityQuery _relayQuery; + private EntityQuery _combatQuery; + private EntityQuery _wallMountQuery; + private EntityQuery _delayQuery; + private EntityQuery _uiQuery; private const CollisionGroup InRangeUnobstructedMask = CollisionGroup.Impassable | CollisionGroup.InteractImpassable; @@ -76,6 +88,17 @@ public abstract partial class SharedInteractionSystem : EntitySystem public override void Initialize() { + _ignoreUiRangeQuery = GetEntityQuery(); + _fixtureQuery = GetEntityQuery(); + _itemQuery = GetEntityQuery(); + _physicsQuery = GetEntityQuery(); + _handsQuery = GetEntityQuery(); + _relayQuery = GetEntityQuery(); + _combatQuery = GetEntityQuery(); + _wallMountQuery = GetEntityQuery(); + _delayQuery = GetEntityQuery(); + _uiQuery = GetEntityQuery(); + SubscribeLocalEvent(HandleUserInterfaceRangeCheck); SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); @@ -111,29 +134,57 @@ public override void Shutdown() /// private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) { - var user = ev.Actor; + _uiQuery.TryComp(ev.Target, out var uiComp); + if (!_actionBlockerSystem.CanInteract(ev.Actor, ev.Target)) + { + // We permit ghosts to open uis unless explicitly blocked + if (ev.Message is not OpenBoundInterfaceMessage || !HasComp(ev.Actor) || uiComp?.BlockSpectators == true) + { + ev.Cancel(); + return; + } + } + + var range = _ui.GetUiRange(ev.Target, ev.UiKey); - if (!_actionBlockerSystem.CanInteract(user, ev.Target)) + // As long as range>0, the UI frame updates should have auto-closed the UI if it is out of range. + DebugTools.Assert(range <= 0 || UiRangeCheck(ev.Actor, ev.Target, range)); + + if (range <= 0 && !IsAccessible(ev.Actor, ev.Target)) { ev.Cancel(); return; } - // Check if the bound entity is accessible. Note that we allow admins to ignore this restriction, so that - // they can fiddle with UI's that people can't normally interact with (e.g., placing things directly into - // other people's backpacks). - if (!_containerSystem.IsInSameOrParentContainer(user, ev.Target) - && !CanAccessViaStorage(user, ev.Target) - && !_adminManager.HasAdminFlag(user, AdminFlags.Admin)) + if (uiComp == null) + return; + + if (uiComp.SingleUser && uiComp.CurrentSingleUser != ev.Actor) { ev.Cancel(); return; } - if (!InRangeUnobstructed(user, ev.Target)) - { + if (!uiComp.RequireHands) + return; + + if (!_handsQuery.TryComp(ev.Actor, out var hands) || hands.Hands.Count == 0) ev.Cancel(); - } + } + + private bool UiRangeCheck(Entity user, Entity target, float range) + { + if (!Resolve(target, ref target.Comp)) + return false; + + if (user.Owner == target.Owner) + return true; + + // Fast check: if the user is the parent of the entity (e.g., holding it), we always assume that it is in range + if (target.Comp.ParentUid == user.Owner) + return true; + + return InRangeAndAccessible(user, target, range) || _ignoreUiRangeQuery.HasComp(user); } /// @@ -190,10 +241,7 @@ private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coor if (!InRangeUnobstructed(userEntity.Value, uid, popup: true)) return false; - if (!TryComp(uid, out PullableComponent? pull)) - return false; - - _pullSystem.TogglePull(uid, userEntity.Value, pull); + _pullSystem.TogglePull(uid, userEntity.Value); return false; } @@ -269,7 +317,7 @@ private bool ShouldCheckAccess(EntityUid user) public bool CombatModeCanHandInteract(EntityUid user, EntityUid? target) { // Always allow attack in these cases - if (target == null || !TryComp(user, out var hands) || hands.ActiveHand?.HeldEntity is not null) + if (target == null || !_handsQuery.TryComp(user, out var hands) || hands.ActiveHand?.HeldEntity is not null) return false; // Only eat input if: @@ -277,7 +325,7 @@ public bool CombatModeCanHandInteract(EntityUid user, EntityUid? target) // - Target doesn't cancel should-interact event // This is intended to allow items to be picked up in combat mode, // but to also allow items to force attacks anyway (like mobs which are items, e.g. mice) - if (!HasComp(target)) + if (!_itemQuery.HasComp(target)) return false; var combatEv = new CombatModeShouldHandInteractEvent(); @@ -307,7 +355,7 @@ public void UserInteraction( bool checkAccess = true, bool checkCanUse = true) { - if (TryComp(user, out var relay) && relay.RelayEntity is not null) + if (_relayQuery.TryComp(user, out var relay) && relay.RelayEntity is not null) { // TODO this needs to be handled better. This probably bypasses many complex can-interact checks in weird roundabout ways. if (_actionBlockerSystem.CanInteract(user, target)) @@ -321,7 +369,7 @@ public void UserInteraction( if (target != null && Deleted(target.Value)) return; - if (!altInteract && TryComp(user, out var combatMode) && combatMode.IsInCombatMode) + if (!altInteract && _combatQuery.TryComp(user, out var combatMode) && combatMode.IsInCombatMode) { if (!CombatModeCanHandInteract(user, target)) return; @@ -343,10 +391,7 @@ public void UserInteraction( // Check if interacted entity is in the same container, the direct child, or direct parent of the user. // Also checks if the item is accessible via some storage UI (e.g., open backpack) - if (checkAccess - && target != null - && !_containerSystem.IsInSameOrParentContainer(user, target.Value) - && !CanAccessViaStorage(user, target.Value)) + if (checkAccess && target != null && !IsAccessible(user, target.Value)) return; var inRangeUnobstructed = target == null @@ -354,7 +399,7 @@ public void UserInteraction( : !checkAccess || InRangeUnobstructed(user, target.Value); // permits interactions with wall mounted entities // Does the user have hands? - if (!TryComp(user, out var hands) || hands.ActiveHand == null) + if (!_handsQuery.TryComp(user, out var hands) || hands.ActiveHand == null) { var ev = new InteractNoHandEvent(user, target, coordinates); RaiseLocalEvent(user, ev); @@ -494,7 +539,7 @@ public float UnobstructedDistance( predicate ??= _ => false; var ray = new CollisionRay(origin.Position, dir.Normalized(), collisionMask); - var rayResults = _sharedBroadphaseSystem.IntersectRayWithPredicate(origin.MapId, ray, dir.Length(), predicate.Invoke, false).ToList(); + var rayResults = _broadphase.IntersectRayWithPredicate(origin.MapId, ray, dir.Length(), predicate.Invoke, false).ToList(); if (rayResults.Count == 0) return dir.Length(); @@ -557,23 +602,29 @@ public bool InRangeUnobstructed( } var ray = new CollisionRay(origin.Position, dir.Normalized(), (int) collisionMask); - var rayResults = _sharedBroadphaseSystem.IntersectRayWithPredicate(origin.MapId, ray, length, predicate.Invoke, false).ToList(); + var rayResults = _broadphase.IntersectRayWithPredicate(origin.MapId, ray, length, predicate.Invoke, false).ToList(); return rayResults.Count == 0; } public bool InRangeUnobstructed( - EntityUid origin, - EntityUid other, + Entity origin, + Entity other, float range = InteractionRange, CollisionGroup collisionMask = InRangeUnobstructedMask, Ignored? predicate = null, bool popup = false) { - if (!TryComp(other, out TransformComponent? otherXform)) + if (!Resolve(other, ref other.Comp)) return false; - return InRangeUnobstructed(origin, other, otherXform.Coordinates, otherXform.LocalRotation, range, collisionMask, predicate, + return InRangeUnobstructed(origin, + other, + other.Comp.Coordinates, + other.Comp.LocalRotation, + range, + collisionMask, + predicate, popup); } @@ -605,8 +656,8 @@ public bool InRangeUnobstructed( /// True if the two points are within a given range without being obstructed. /// public bool InRangeUnobstructed( - EntityUid origin, - EntityUid other, + Entity origin, + Entity other, EntityCoordinates otherCoordinates, Angle otherAngle, float range = InteractionRange, @@ -614,10 +665,10 @@ public bool InRangeUnobstructed( Ignored? predicate = null, bool popup = false) { - Ignored combinedPredicate = e => e == origin || (predicate?.Invoke(e) ?? false); + Ignored combinedPredicate = e => e == origin.Owner || (predicate?.Invoke(e) ?? false); var inRange = true; MapCoordinates originPos = default; - var targetPos = otherCoordinates.ToMap(EntityManager, _transform); + var targetPos = _transform.ToMapCoordinates(otherCoordinates); Angle targetRot = default; // So essentially: @@ -627,23 +678,30 @@ public bool InRangeUnobstructed( // Alternatively we could check centre distances first though // that means we wouldn't be able to easily check overlap interactions. if (range > 0f && - TryComp(origin, out var fixtureA) && + _fixtureQuery.TryComp(origin, out var fixtureA) && // These fixture counts are stuff that has the component but no fixtures for (e.g. buttons). // At least until they get removed. fixtureA.FixtureCount > 0 && - TryComp(other, out var fixtureB) && + _fixtureQuery.TryComp(other, out var fixtureB) && fixtureB.FixtureCount > 0 && - TryComp(origin, out TransformComponent? xformA)) + Resolve(origin, ref origin.Comp)) { - var (worldPosA, worldRotA) = xformA.GetWorldPositionRotation(); + var (worldPosA, worldRotA) = origin.Comp.GetWorldPositionRotation(); var xfA = new Transform(worldPosA, worldRotA); var parentRotB = _transform.GetWorldRotation(otherCoordinates.EntityId); var xfB = new Transform(targetPos.Position, parentRotB + otherAngle); // Different map or the likes. - if (!_sharedBroadphaseSystem.TryGetNearest(origin, other, - out _, out _, out var distance, - xfA, xfB, fixtureA, fixtureB)) + if (!_broadphase.TryGetNearest( + origin, + other, + out _, + out _, + out var distance, + xfA, + xfB, + fixtureA, + fixtureB)) { inRange = false; } @@ -665,15 +723,15 @@ public bool InRangeUnobstructed( else { // We'll still do the raycast from the centres but we'll bump the range as we know they're in range. - originPos = _transform.GetMapCoordinates(origin, xform: xformA); + originPos = _transform.GetMapCoordinates(origin, xform: origin.Comp); range = (originPos.Position - targetPos.Position).Length(); } } // No fixtures, e.g. wallmounts. else { - originPos = _transform.GetMapCoordinates(origin); - var otherParent = Transform(other).ParentUid; + originPos = _transform.GetMapCoordinates(origin, origin); + var otherParent = (other.Comp ?? Transform(other)).ParentUid; targetRot = otherParent.IsValid() ? Transform(otherParent).LocalRotation + otherAngle : otherAngle; } @@ -724,13 +782,13 @@ private Ignored GetPredicate( { HashSet ignored = new(); - if (HasComp(target) && TryComp(target, out PhysicsComponent? physics) && physics.CanCollide) + if (_itemQuery.HasComp(target) && _physicsQuery.TryComp(target, out var physics) && physics.CanCollide) { // If the target is an item, we ignore any colliding entities. Currently done so that if items get stuck // inside of walls, users can still pick them up. - ignored.UnionWith(_sharedBroadphaseSystem.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); + ignored.UnionWith(_broadphase.GetEntitiesIntersectingBody(target, (int) collisionMask, false, physics)); } - else if (TryComp(target, out WallMountComponent? wallMount)) + else if (_wallMountQuery.TryComp(target, out var wallMount)) { // wall-mount exemptions may be restricted to a specific angle range.da @@ -748,13 +806,7 @@ private Ignored GetPredicate( ignored.UnionWith(grid.GetAnchoredEntities(targetCoords)); } - Ignored combinedPredicate = e => - { - return e == target - || (predicate?.Invoke(e) ?? false) - || ignored.Contains(e); - }; - + Ignored combinedPredicate = e => e == target || (predicate?.Invoke(e) ?? false) || ignored.Contains(e); return combinedPredicate; } @@ -951,10 +1003,8 @@ public bool InteractionActivate( bool checkUseDelay = true, bool checkAccess = true) { - UseDelayComponent? delayComponent = null; - if (checkUseDelay - && TryComp(used, out delayComponent) - && _useDelay.IsDelayed((used, delayComponent))) + _delayQuery.TryComp(used, out var delayComponent); + if (checkUseDelay && delayComponent != null && _useDelay.IsDelayed((used, delayComponent))) return false; if (checkCanInteract && !_actionBlockerSystem.CanInteract(user, used)) @@ -965,11 +1015,11 @@ public bool InteractionActivate( // Check if interacted entity is in the same container, the direct child, or direct parent of the user. // This is bypassed IF the interaction happened through an item slot (e.g., backpack UI) - if (checkAccess && !_containerSystem.IsInSameOrParentContainer(user, used) && !CanAccessViaStorage(user, used)) + if (checkAccess && !IsAccessible(user, used)) return false; // Does the user have hands? - if (!HasComp(user)) + if (!_handsQuery.HasComp(user)) return false; var activateMsg = new ActivateInWorldEvent(user, used); @@ -979,7 +1029,9 @@ public bool InteractionActivate( DoContactInteraction(user, used, activateMsg); // Still need to call this even without checkUseDelay in case this gets relayed from Activate. - _useDelay.TryResetDelay(used, component: delayComponent); + if (delayComponent != null) + _useDelay.TryResetDelay(used, component: delayComponent); + if (!activateMsg.WasLogged) _adminLogger.Add(LogType.InteractActivate, LogImpact.Low, $"{ToPrettyString(user):user} activated {ToPrettyString(used):used}"); return true; @@ -1000,11 +1052,8 @@ public bool UseInHandInteraction( bool checkCanInteract = true, bool checkUseDelay = true) { - UseDelayComponent? delayComponent = null; - - if (checkUseDelay - && TryComp(used, out delayComponent) - && _useDelay.IsDelayed((used, delayComponent))) + _delayQuery.TryComp(used, out var delayComponent); + if (checkUseDelay && delayComponent != null && _useDelay.IsDelayed((used, delayComponent))) return true; // if the item is on cooldown, we consider this handled. if (checkCanInteract && !_actionBlockerSystem.CanInteract(user, used)) @@ -1066,11 +1115,60 @@ public void DroppedInteraction(EntityUid user, EntityUid item) } #endregion + /// + /// Check if a user can access a target (stored in the same containers) and is in range without obstructions. + /// + public bool InRangeAndAccessible( + Entity user, + Entity target, + float range = InteractionRange, + CollisionGroup collisionMask = InRangeUnobstructedMask, + Ignored? predicate = null) + { + if (user == target) + return true; + + if (!Resolve(user, ref user.Comp)) + return false; + + if (!Resolve(target, ref target.Comp)) + return false; + + return IsAccessible(user, target) && InRangeUnobstructed(user, target, range, collisionMask, predicate); + } + + /// + /// Check if a user can access a target or if they are stored in different containers. + /// + public bool IsAccessible(Entity user, Entity target) + { + if (_containerSystem.IsInSameOrParentContainer(user, target, out _, out var container)) + return true; + + return container != null && CanAccessViaStorage(user, target, container); + } + /// /// If a target is in range, but not in the same container as the user, it may be inside of a backpack. This /// checks if the user can access the item in these situations. /// - public abstract bool CanAccessViaStorage(EntityUid user, EntityUid target); + public bool CanAccessViaStorage(EntityUid user, EntityUid target) + { + if (!_containerSystem.TryGetContainingContainer(target, out var container)) + return false; + + return CanAccessViaStorage(user, target, container); + } + + /// + public bool CanAccessViaStorage(EntityUid user, EntityUid target, BaseContainer container) + { + if (StorageComponent.ContainerId != container.ID) + return false; + + // we don't check if the user can access the storage entity itself. This should be handed by the UI system. + return _ui.IsUiOpen(target, StorageComponent.StorageUiKey.Key, user); + } /// /// Checks whether an entity currently equipped by another player is accessible to some user. This shouldn't @@ -1151,19 +1249,15 @@ public void DoContactInteraction(EntityUid uidA, EntityUid? uidB, HandledEntityE RaiseLocalEvent(uidB.Value, new ContactInteractionEvent(uidA)); } + private void HandleUserInterfaceRangeCheck(ref BoundUserInterfaceCheckRangeEvent ev) { if (ev.Result == BoundUserInterfaceRangeResult.Fail) return; - if (InRangeUnobstructed(ev.Actor, ev.Target, ev.Data.InteractionRange)) - { - ev.Result = BoundUserInterfaceRangeResult.Pass; - } - else - { - ev.Result = BoundUserInterfaceRangeResult.Fail; - } + ev.Result = UiRangeCheck(ev.Actor!, ev.Target, ev.Data.InteractionRange) + ? BoundUserInterfaceRangeResult.Pass + : BoundUserInterfaceRangeResult.Fail; } } diff --git a/Content.Shared/Inventory/InventorySystem.Equip.cs b/Content.Shared/Inventory/InventorySystem.Equip.cs index 400dfb0beb3..7fd156213b4 100644 --- a/Content.Shared/Inventory/InventorySystem.Equip.cs +++ b/Content.Shared/Inventory/InventorySystem.Equip.cs @@ -210,11 +210,7 @@ public bool CanAccess(EntityUid actor, EntityUid target, EntityUid itemUid) return false; // Can the actor reach the item? - if (_interactionSystem.InRangeUnobstructed(actor, itemUid) && _containerSystem.IsInSameOrParentContainer(actor, itemUid)) - return true; - - // Is the item in an open storage UI, i.e., is the user quick-equipping from an open backpack? - if (_interactionSystem.CanAccessViaStorage(actor, itemUid)) + if (_interactionSystem.InRangeAndAccessible(actor, itemUid)) return true; // Is the actor currently stripping the target? Here we could check if the actor has the stripping UI open, but diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index 91059d60bfd..433ad6b4fc9 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Interaction; using Content.Shared.UserInterface; using Robust.Shared.Serialization; +using Robust.Shared.Utility; namespace Content.Shared.MagicMirror; @@ -21,10 +22,13 @@ public override void Initialize() private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) { - if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) - { + if (args.Result == BoundUserInterfaceRangeResult.Fail) + return; + + DebugTools.Assert(component.Target != null && Exists(component.Target)); + + if (!_interaction.InRangeUnobstructed(uid, component.Target.Value)) args.Result = BoundUserInterfaceRangeResult.Fail; - } } private void OnBeforeUIOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 2781c495298..3de71172c72 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -362,14 +362,17 @@ public bool CanPull(EntityUid puller, EntityUid pullableUid, PullerComponent? pu return !startPull.Cancelled && !getPulled.Cancelled; } - public bool TogglePull(EntityUid pullableUid, EntityUid pullerUid, PullableComponent pullable) + public bool TogglePull(Entity pullable, EntityUid pullerUid) { - if (pullable.Puller == pullerUid) + if (!Resolve(pullable, ref pullable.Comp, false)) + return false; + + if (pullable.Comp.Puller == pullerUid) { - return TryStopPull(pullableUid, pullable); + return TryStopPull(pullable, pullable.Comp); } - return TryStartPull(pullerUid, pullableUid, pullableComp: pullable); + return TryStartPull(pullerUid, pullable, pullableComp: pullable); } public bool TogglePull(EntityUid pullerUid, PullerComponent puller) @@ -377,7 +380,7 @@ public bool TogglePull(EntityUid pullerUid, PullerComponent puller) if (!TryComp(puller.Pulling, out var pullable)) return false; - return TogglePull(puller.Pulling.Value, pullerUid, pullable); + return TogglePull((puller.Pulling.Value, pullable), pullerUid); } public bool TryStartPull(EntityUid pullerUid, EntityUid pullableUid, diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index ea0c9632f0e..778e2b2e74e 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -1078,7 +1078,7 @@ public bool PlayerInsertHeldEntity(EntityUid uid, EntityUid player, StorageCompo /// true if inserted, false otherwise public bool PlayerInsertEntityInWorld(Entity uid, EntityUid player, EntityUid toInsert) { - if (!Resolve(uid, ref uid.Comp) || !_interactionSystem.InRangeUnobstructed(player, uid)) + if (!Resolve(uid, ref uid.Comp) || !_interactionSystem.InRangeUnobstructed(player, uid.Owner)) return false; if (!Insert(uid, toInsert, out _, user: player, uid.Comp)) diff --git a/Content.Shared/UserInterface/ActivatableUIComponent.cs b/Content.Shared/UserInterface/ActivatableUIComponent.cs index 3f83816b7de..93f05acac05 100644 --- a/Content.Shared/UserInterface/ActivatableUIComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIComponent.cs @@ -57,7 +57,7 @@ public sealed partial class ActivatableUIComponent : Component /// [ViewVariables(VVAccess.ReadWrite)] [DataField] - public bool AllowSpectator = true; + public bool BlockSpectators; /// /// Whether the item must be in the user's currently selected/active hand. diff --git a/Content.Shared/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs index a6d27ac5459..c1822c4ee33 100644 --- a/Content.Shared/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -8,7 +8,7 @@ using Content.Shared.Interaction.Events; using Content.Shared.Popups; using Content.Shared.Verbs; -using Robust.Shared.Containers; +using Robust.Shared.Utility; namespace Content.Shared.UserInterface; @@ -19,15 +19,12 @@ public sealed partial class ActivatableUISystem : EntitySystem [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedHandsSystem _hands = default!; - [Dependency] private readonly SharedContainerSystem _container = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; - - private readonly List _toClose = new(); public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnUseInHand); SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnInteractUsing); @@ -37,28 +34,24 @@ public override void Initialize() SubscribeLocalEvent>(GetActivationVerb); SubscribeLocalEvent>(GetVerb); - // TODO ActivatableUI - // Add UI-user component, and listen for user container changes. - // I.e., should lose a computer UI if a player gets shut into a locker. - SubscribeLocalEvent(OnGotInserted); - SubscribeLocalEvent(OnGotRemoved); - - SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); SubscribeLocalEvent(OnActionPerform); InitializePower(); } - private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) + private void OnStartup(Entity ent, ref ComponentStartup args) { - if (!TryComp(ev.Target, out ActivatableUIComponent? comp)) - return; - - if (!comp.RequireHands) + if (ent.Comp.Key == null) + { + Log.Error($"Missing UI Key for entity: {ToPrettyString(ent)}"); return; + } - if (!TryComp(ev.Actor, out HandsComponent? hands) || hands.Hands.Count == 0) - ev.Cancel(); + // TODO BUI + // set interaction range to zero to avoid constant range checks. + // + // if (ent.Comp.InHandsOnly && _uiSystem.TryGetInterfaceData(ent.Owner, ent.Comp.Key, out var data)) + // data.InteractionRange = 0; } private void OnActionPerform(EntityUid uid, UserInterfaceComponent component, OpenUiActionEvent args) @@ -77,9 +70,10 @@ private void GetActivationVerb(EntityUid uid, ActivatableUIComponent component, args.Verbs.Add(new ActivationVerb { - // TODO VERBS add "open UI" icon Act = () => InteractUI(args.User, uid, component), - Text = Loc.GetString(component.VerbText) + Text = Loc.GetString(component.VerbText), + // TODO VERB ICON find a better icon + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), }); } @@ -90,9 +84,10 @@ private void GetVerb(EntityUid uid, ActivatableUIComponent component, GetVerbsEv args.Verbs.Add(new Verb { - // TODO VERBS add "open UI" icon Act = () => InteractUI(args.User, uid, component), - Text = Loc.GetString(component.VerbText) + Text = Loc.GetString(component.VerbText), + // TODO VERB ICON find a better icon + Icon = new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), }); } @@ -119,7 +114,7 @@ private bool ShouldAddVerb(EntityUid uid, ActivatableUIComponent component, G } } - return args.CanInteract || component.AllowSpectator && HasComp(args.User); + return args.CanInteract || HasComp(args.User) && !component.BlockSpectators; } private void OnUseInHand(EntityUid uid, ActivatableUIComponent component, UseInHandEvent args) @@ -191,7 +186,7 @@ private bool InteractUI(EntityUid user, EntityUid uiEntity, ActivatableUICompone return true; } - if (!_blockerSystem.CanInteract(user, uiEntity) && (!aui.AllowSpectator || !HasComp(user))) + if (!_blockerSystem.CanInteract(user, uiEntity) && (!HasComp(user) || aui.BlockSpectators)) return false; if (aui.RequireHands) @@ -286,47 +281,4 @@ private void OnHandUnequipped(Entity ent, ref GotUnequip if (ent.Comp.RequireHands && ent.Comp.InHandsOnly) CloseAll(ent, ent); } - - private void OnGotInserted(Entity ent, ref EntGotInsertedIntoContainerMessage args) - { - CheckAccess((ent, ent)); - } - - private void OnGotRemoved(Entity ent, ref EntGotRemovedFromContainerMessage args) - { - CheckAccess((ent, ent)); - } - - public void CheckAccess(Entity ent) - { - if (!Resolve(ent, ref ent.Comp)) - return; - - if (ent.Comp.Key == null) - { - Log.Error($"Encountered null key in activatable ui on entity {ToPrettyString(ent)}"); - return; - } - - foreach (var user in _uiSystem.GetActors(ent.Owner, ent.Comp.Key)) - { - if (!_container.IsInSameOrParentContainer(user, ent) - && !_interaction.CanAccessViaStorage(user, ent)) - { - _toClose.Add(user); - continue; - - } - - if (!_interaction.InRangeUnobstructed(user, ent)) - _toClose.Add(user); - } - - foreach (var user in _toClose) - { - _uiSystem.CloseUi(ent.Owner, ent.Comp.Key, user); - } - - _toClose.Clear(); - } } diff --git a/Content.Shared/Verbs/SharedVerbSystem.cs b/Content.Shared/Verbs/SharedVerbSystem.cs index 60714aea8f3..e78fe98f4c3 100644 --- a/Content.Shared/Verbs/SharedVerbSystem.cs +++ b/Content.Shared/Verbs/SharedVerbSystem.cs @@ -72,19 +72,7 @@ public SortedSet GetLocalVerbs(EntityUid target, EntityUid user, List Date: Fri, 24 May 2024 05:04:10 +0000 Subject: [PATCH 017/112] 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 9ae89dad4a3..d330b043c61 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Plykiya - changes: - - message: Pre-filled syringes start in inject mode now. - type: Tweak - id: 6114 - time: '2024-03-09T10:19:03.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25881 - author: EmoGarbage404 changes: - message: Added a new "colorblind friendly" toggle in the accessibility menu. This @@ -3875,3 +3868,10 @@ id: 6613 time: '2024-05-23T20:27:45.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28226 +- author: ElectroJr + changes: + - message: Ghosts can once again open paper & other UIs + type: Fix + id: 6614 + time: '2024-05-24T05:03:03.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27999 From 926f72ee13ab3bea948d517f34957d0c75ccbe3a Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Fri, 24 May 2024 19:02:04 +1200 Subject: [PATCH 018/112] Update engine to v223.1.1 (#28245) * Update engine to v223.1.0 * Update engine to v223.1.1 --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 6a6bfe33ca9..c250010dada 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 6a6bfe33ca98dd3df6035ef4dcb7429f4dd5db66 +Subproject commit c250010dada8279a48f6861dc80c0eebafee3421 From b2ca9b6a9cafe1e6f630fc6f085393a367597da1 Mon Sep 17 00:00:00 2001 From: nikthechampiongr <32041239+nikthechampiongr@users.noreply.github.com> Date: Fri, 24 May 2024 14:44:42 +0000 Subject: [PATCH 019/112] Fix firelock prediction issues with periodic pulses of closing lights (#28227) * Fix firelock prediction issues with periodic pulses of closing lights For some reason this function was setting a time for the next state which was triggering the door system to try to close the firelock. This does not happen serverside because the function only fires from an event called clientside apparently. It appears to be an attempt to stop firelocks from closing instantly that did not function properly, and I cannot discern any other purpose. As such I have removed it. * Remove redundant serverside check This became redundant with commit 439a87f2 --- Content.Server/Doors/Systems/FirelockSystem.cs | 15 --------------- .../Doors/Components/FirelockComponent.cs | 2 -- .../Doors/Systems/SharedFirelockSystem.cs | 15 --------------- 3 files changed, 32 deletions(-) diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index 5ad86fb20aa..e2b8b5829d1 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -28,8 +28,6 @@ public override void Initialize() { base.Initialize(); - - SubscribeLocalEvent(OnBeforeDoorAutoclose); SubscribeLocalEvent(OnAtmosAlarm); SubscribeLocalEvent(PowerChanged); @@ -80,19 +78,6 @@ public override void Update(float frameTime) } } - private void OnBeforeDoorAutoclose(EntityUid uid, FirelockComponent component, BeforeDoorAutoCloseEvent args) - { - if (!this.IsPowered(uid, EntityManager)) - args.Cancel(); - - // Make firelocks autoclose, but only if the last alarm type it - // remembers was a danger. This is to prevent people from - // flooding hallways with endless bad air/fire. - if (component.AlarmAutoClose && - (_atmosAlarmable.TryGetHighestAlert(uid, out var alarm) && alarm != AtmosAlarmType.Danger || alarm == null)) - args.Cancel(); - } - private void OnAtmosAlarm(EntityUid uid, FirelockComponent component, AtmosAlarmEvent args) { if (!this.IsPowered(uid, EntityManager)) diff --git a/Content.Shared/Doors/Components/FirelockComponent.cs b/Content.Shared/Doors/Components/FirelockComponent.cs index ca62daaa0fd..3f7d6c3f704 100644 --- a/Content.Shared/Doors/Components/FirelockComponent.cs +++ b/Content.Shared/Doors/Components/FirelockComponent.cs @@ -19,8 +19,6 @@ public sealed partial class FirelockComponent : Component [DataField("lockedPryTimeModifier"), ViewVariables(VVAccess.ReadWrite)] public float LockedPryTimeModifier = 1.5f; - [DataField("autocloseDelay")] public TimeSpan AutocloseDelay = TimeSpan.FromSeconds(3f); - /// /// Maximum pressure difference before the firelock will refuse to open, in kPa. /// diff --git a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs index 7d033efdd40..47a29a4ba80 100644 --- a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs @@ -18,8 +18,6 @@ public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnUpdateState); - // Access/Prying SubscribeLocalEvent(OnBeforeDoorOpened); SubscribeLocalEvent(OnDoorGetPryTimeModifier); @@ -46,19 +44,6 @@ public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = n return _doorSystem.OnPartialClose(uid, door); } - private void OnUpdateState(EntityUid uid, FirelockComponent component, DoorStateChangedEvent args) - { - var ev = new BeforeDoorAutoCloseEvent(); - RaiseLocalEvent(uid, ev); - UpdateVisuals(uid, component, args); - if (ev.Cancelled) - { - return; - } - - _doorSystem.SetNextStateChange(uid, component.AutocloseDelay); - } - #region Access/Prying private void OnBeforeDoorOpened(EntityUid uid, FirelockComponent component, BeforeDoorOpenedEvent args) From aa09741a4143b469b78a7215def4f0fc5e5a068c Mon Sep 17 00:00:00 2001 From: PJBot Date: Fri, 24 May 2024 14:45:49 +0000 Subject: [PATCH 020/112] 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 d330b043c61..61b8e7ec78f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: EmoGarbage404 - changes: - - message: Added a new "colorblind friendly" toggle in the accessibility menu. This - allows you to toggle between a standard and colorblind-friendly palette for - things like progress bars and the medical HUD. - type: Add - - message: The medical HUD is now bright, even in low light levels. - type: Tweak - id: 6115 - time: '2024-03-09T11:43:20.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25318 - author: metalgearsloth changes: - message: Fix NPC mouse movement. @@ -3875,3 +3864,10 @@ id: 6614 time: '2024-05-24T05:03:03.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27999 +- author: nikthechampiongr + changes: + - message: Firelocks will no longer randomly pulse closing lights. + type: Fix + id: 6615 + time: '2024-05-24T14:44:42.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28227 From 98503fc793be26acde787a6ab765f38887d0ae78 Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Fri, 24 May 2024 15:57:02 -0400 Subject: [PATCH 021/112] Hotfix for crashes from bad item names (#28256) --- Content.Client/Examine/ExamineSystem.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Client/Examine/ExamineSystem.cs b/Content.Client/Examine/ExamineSystem.cs index 45db4efa53c..125ec62e492 100644 --- a/Content.Client/Examine/ExamineSystem.cs +++ b/Content.Client/Examine/ExamineSystem.cs @@ -239,8 +239,10 @@ public void OpenTooltip(EntityUid player, EntityUid target, bool centeredOnCurso if (knowTarget) { - var itemName = FormattedMessage.RemoveMarkup(Identity.Name(target, EntityManager, player)); - var labelMessage = FormattedMessage.FromMarkup($"[bold]{itemName}[/bold]"); + // TODO: FormattedMessage.RemoveMarkupPermissive + // var itemName = FormattedMessage.RemoveMarkupPermissive(Identity.Name(target, EntityManager, player)); + var itemName = FormattedMessage.FromMarkupPermissive(Identity.Name(target, EntityManager, player)).ToString(); + var labelMessage = FormattedMessage.FromMarkupPermissive($"[bold]{itemName}[/bold]"); var label = new RichTextLabel(); label.SetMessage(labelMessage); hBox.AddChild(label); From d0cf620a85bd14ce8bdc641f6dde1715e771879e Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sat, 25 May 2024 15:13:24 +1200 Subject: [PATCH 022/112] Fix weapon error logs (#28264) --- .../Weapons/Melee/SharedMeleeWeaponSystem.cs | 47 +++++++++---------- 1 file changed, 23 insertions(+), 24 deletions(-) diff --git a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs index 0fb6ac3eff9..7fc440db479 100644 --- a/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs +++ b/Content.Shared/Weapons/Melee/SharedMeleeWeaponSystem.cs @@ -174,49 +174,39 @@ private void OnStopAttack(StopAttackEvent msg, EntitySessionEventArgs args) private void OnLightAttack(LightAttackEvent msg, EntitySessionEventArgs args) { - var user = args.SenderSession.AttachedEntity; - - if (user == null) + if (args.SenderSession.AttachedEntity is not {} user) return; - if (!TryGetWeapon(user.Value, out var weaponUid, out var weapon) || + if (!TryGetWeapon(user, out var weaponUid, out var weapon) || weaponUid != GetEntity(msg.Weapon)) { return; } - AttemptAttack(args.SenderSession.AttachedEntity!.Value, weaponUid, weapon, msg, args.SenderSession); + AttemptAttack(user, weaponUid, weapon, msg, args.SenderSession); } private void OnHeavyAttack(HeavyAttackEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity == null) - { + if (args.SenderSession.AttachedEntity is not {} user) return; - } - if (!TryGetWeapon(args.SenderSession.AttachedEntity.Value, out var weaponUid, out var weapon) || + if (!TryGetWeapon(user, out var weaponUid, out var weapon) || weaponUid != GetEntity(msg.Weapon)) { return; } - AttemptAttack(args.SenderSession.AttachedEntity.Value, weaponUid, weapon, msg, args.SenderSession); + AttemptAttack(user, weaponUid, weapon, msg, args.SenderSession); } private void OnDisarmAttack(DisarmAttackEvent msg, EntitySessionEventArgs args) { - if (args.SenderSession.AttachedEntity == null) - { - return; - } - - if (!TryGetWeapon(args.SenderSession.AttachedEntity.Value, out var weaponUid, out var weapon)) - { + if (args.SenderSession.AttachedEntity is not {} user) return; - } - AttemptAttack(args.SenderSession.AttachedEntity.Value, weaponUid, weapon, msg, args.SenderSession); + if (TryGetWeapon(user, out var weaponUid, out var weapon)) + AttemptAttack(user, weaponUid, weapon, msg, args.SenderSession); } /// @@ -343,23 +333,32 @@ private bool AttemptAttack(EntityUid user, EntityUid weaponUid, MeleeWeaponCompo if (!CombatMode.IsInCombatMode(user)) return false; + EntityUid? target = null; switch (attack) { case LightAttackEvent light: - var lightTarget = GetEntity(light.Target); + if (light.Target != null && !TryGetEntity(light.Target, out target)) + { + // Target was lightly attacked & deleted. + return false; + } - if (!Blocker.CanAttack(user, lightTarget, (weaponUid, weapon))) + if (!Blocker.CanAttack(user, target, (weaponUid, weapon))) return false; // Can't self-attack if you're the weapon - if (weaponUid == lightTarget) + if (weaponUid == target) return false; break; case DisarmAttackEvent disarm: - var disarmTarget = GetEntity(disarm.Target); + if (disarm.Target != null && !TryGetEntity(disarm.Target, out target)) + { + // Target was lightly attacked & deleted. + return false; + } - if (!Blocker.CanAttack(user, disarmTarget, (weaponUid, weapon), true)) + if (!Blocker.CanAttack(user, target, (weaponUid, weapon), true)) return false; break; default: From a58323cca150af73814be6d4cb70741246289d54 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sat, 25 May 2024 21:49:46 +1200 Subject: [PATCH 023/112] Update engine to v223.1.2 (#28273) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index c250010dada..796abe12305 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit c250010dada8279a48f6861dc80c0eebafee3421 +Subproject commit 796abe1230554c31daffbfa6559a0a4bcf50b1af From 4735cb7d2df3b54e7213913532a67f64be4ed606 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 26 May 2024 08:03:05 +1200 Subject: [PATCH 024/112] Fix dud modular grenade visuals (#28265) --- .../Objects/Weapons/Throwable/grenades.yml | 3 +- .../Graphs/weapons/modular_grenade.yml | 30 ++++++++++++++++-- .../Weapons/Grenades/modular.rsi/meta.json | 6 +++- .../Grenades/modular.rsi/no-trigger.png | Bin 0 -> 347 bytes 4 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml index 0261bd8cadd..b1d260c3276 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Throwable/grenades.yml @@ -320,11 +320,12 @@ emptyCase: { state: empty } wiredCase: { state: wired } caseWithTrigger: { state: no-payload } + caseWithPayload: { state: no-trigger } grenade: { state: complete } enum.Trigger.TriggerVisuals.VisualState: enum.ConstructionVisuals.Layer: Primed: { state: primed } - Unprimed: { state: complete } + # Unprimed: - type: StaticPrice price: 25 diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml index 020be4e09c3..243a030c981 100644 --- a/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml +++ b/Resources/Prototypes/Recipes/Construction/Graphs/weapons/modular_grenade.yml @@ -12,7 +12,7 @@ doAfter: 1 - node: emptyCase - entity: ModularGrenade + entity: ModularGrenade actions: - !type:AppearanceChange edges: @@ -31,7 +31,7 @@ doAfter: 2 - node: wiredCase - entity: ModularGrenade + entity: ModularGrenade actions: - !type:AppearanceChange - !type:PlaySound @@ -50,6 +50,12 @@ store: payloadTrigger name: Trigger doAfter: 0.5 + - to: caseWithPayload + steps: + - tag: Payload + store: payload + name: Payload + doAfter: 0.5 - node: caseWithTrigger actions: @@ -71,6 +77,26 @@ name: Payload doAfter: 0.5 + - node: caseWithPayload + actions: + - !type:AppearanceChange + - !type:PlaySound + sound: /Audio/Machines/button.ogg + edges: + - to: wiredCase + steps: + - tool: Prying + doAfter: 0.5 + completed: + - !type:EmptyContainer + container: payload + - to: grenade + steps: + - component: PayloadTrigger + store: payloadTrigger + name: Trigger + doAfter: 0.5 + - node: grenade actions: - !type:AppearanceChange diff --git a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json index f23b6ec168d..b0b12127c59 100644 --- a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json +++ b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/29c0ed1b000619cb5398ef921000a8d4502ba0b6 and modified by Swept", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/29c0ed1b000619cb5398ef921000a8d4502ba0b6 and modified by Swept & ElectroSR", "size": { "x": 32, "y": 32 @@ -19,6 +19,10 @@ "name": "no-payload", "directions": 1 }, + { + "name": "no-trigger", + "directions": 1 + }, { "name": "complete", "directions": 1 diff --git a/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png b/Resources/Textures/Objects/Weapons/Grenades/modular.rsi/no-trigger.png new file mode 100644 index 0000000000000000000000000000000000000000..1be2cbc421b2add226c928b7612c9b856a09c276 GIT binary patch literal 347 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz#^NA%Cx&(BWL^R}Ea{HEjtmSN z`?>!lvI6;>1s;*b3=DjSL74G){)!Z!;0I3^$B+p3WC_;A2_iie2RN2`G8GjS{a@(Q z=H4$iF_n#H!Wzl6owH|4&)A=RU9U^#Aj{HDwiDBAYk!IOD7SO0Y^m*=uT?c;?&f zT^!F*VIz`Sv4yW`C8I|f!&b(Vd^Z&T&vMk`01F&gV7>`++5XhtJuoB4;ERwVPtKh^+&!ACD#s Date: Sat, 25 May 2024 20:04:12 +0000 Subject: [PATCH 025/112] 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 61b8e7ec78f..d3b1dfb4050 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Fix NPC mouse movement. - type: Fix - id: 6116 - time: '2024-03-10T15:41:42.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25965 - author: DoutorWhite changes: - message: Prevents rendering from crashing in certain scenarios @@ -3871,3 +3864,10 @@ id: 6615 time: '2024-05-24T14:44:42.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28227 +- author: ElectroJr + changes: + - message: Fixed modular grenade visuals getting stuck in an incorrect state. + type: Fix + id: 6616 + time: '2024-05-25T20:03:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28265 From 8619f241d4b44ff4e4bb40da83cc12334a966692 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Sat, 25 May 2024 13:07:37 -0700 Subject: [PATCH 026/112] Fix not networking whitelist and blacklist in storage component (#28238) --- .../Storage/EntitySystems/SharedStorageSystem.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 778e2b2e74e..18a8f20afc7 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -21,6 +21,7 @@ using Content.Shared.Storage.Components; using Content.Shared.Timing; using Content.Shared.Verbs; +using Content.Shared.Whitelist; using Robust.Shared.Audio.Systems; using Robust.Shared.Containers; using Robust.Shared.GameStates; @@ -151,7 +152,9 @@ private void OnStorageGetState(EntityUid uid, StorageComponent component, ref Co Grid = new List(component.Grid), MaxItemSize = component.MaxItemSize, StoredItems = storedItems, - SavedLocations = component.SavedLocations + SavedLocations = component.SavedLocations, + Whitelist = component.Whitelist, + Blacklist = component.Blacklist }; } @@ -163,6 +166,8 @@ private void OnStorageHandleState(EntityUid uid, StorageComponent component, ref component.Grid.Clear(); component.Grid.AddRange(state.Grid); component.MaxItemSize = state.MaxItemSize; + component.Whitelist = state.Whitelist; + component.Blacklist = state.Blacklist; component.StoredItems.Clear(); @@ -1490,5 +1495,9 @@ protected sealed class StorageComponentState : ComponentState public List Grid = new(); public ProtoId? MaxItemSize; + + public EntityWhitelist? Whitelist; + + public EntityWhitelist? Blacklist; } } From 37ad81c59ca04b10cdc420eb66ae7a9487ecdfaf Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 25 May 2024 20:08:15 +0000 Subject: [PATCH 027/112] fix id card console not updating records (#28237) * fix id card console not updating records * test --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- Content.Server/Access/Systems/IdCardConsoleSystem.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Content.Server/Access/Systems/IdCardConsoleSystem.cs b/Content.Server/Access/Systems/IdCardConsoleSystem.cs index e680b0c6f40..4e63c93a837 100644 --- a/Content.Server/Access/Systems/IdCardConsoleSystem.cs +++ b/Content.Server/Access/Systems/IdCardConsoleSystem.cs @@ -135,6 +135,8 @@ private void TryWriteToTargetId(EntityUid uid, _idCard.TryChangeJobDepartment(targetId, job); } + UpdateStationRecord(uid, targetId, newFullName, newJobTitle, job); + if (!newAccessList.TrueForAll(x => component.AccessLevels.Contains(x))) { _sawmill.Warning($"User {ToPrettyString(uid)} tried to write unknown access tag."); @@ -168,8 +170,6 @@ private void TryWriteToTargetId(EntityUid uid, This current implementation is pretty shit as it logs 27 entries (27 lines) if someone decides to give themselves AA*/ _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(player):player} has modified {ToPrettyString(targetId):entity} with the following accesses: [{string.Join(", ", addedTags.Union(removedTags))}] [{string.Join(", ", newAccessList)}]"); - - UpdateStationRecord(uid, targetId, newFullName, newJobTitle, job); } /// From cb17fe2845e59c1b55b9594a9ed8a2c2c8169bf4 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 25 May 2024 20:09:22 +0000 Subject: [PATCH 028/112] 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 d3b1dfb4050..22c9a547de7 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: DoutorWhite - changes: - - message: Prevents rendering from crashing in certain scenarios - type: Fix - id: 6117 - time: '2024-03-10T17:07:24.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25960 - author: nikthechampiongr changes: - message: Shields will no longer absorb asphyxiation damage, or any other damage @@ -3871,3 +3864,10 @@ id: 6616 time: '2024-05-25T20:03:05.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28265 +- author: deltanedas + changes: + - message: Fixed ID Cards not updating the manifest when changed. + type: Fix + id: 6617 + time: '2024-05-25T20:08:16.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28237 From f1c70d69f2669cac0bdbca758a9da3e7c3608cbc Mon Sep 17 00:00:00 2001 From: Vasilis Date: Sat, 25 May 2024 23:09:52 +0300 Subject: [PATCH 029/112] Remove the network tab (#28231) It is useless and bloat, if a user needs to change these settings they are free to modify their cvars manually via the clientconfig.toml file or via the cvar command. --- Content.Client/Options/UI/OptionsMenu.xaml | 1 - Content.Client/Options/UI/OptionsMenu.xaml.cs | 1 - .../Options/UI/Tabs/NetworkTab.xaml | 102 -------------- .../Options/UI/Tabs/NetworkTab.xaml.cs | 125 ------------------ 4 files changed, 229 deletions(-) delete mode 100644 Content.Client/Options/UI/Tabs/NetworkTab.xaml delete mode 100644 Content.Client/Options/UI/Tabs/NetworkTab.xaml.cs diff --git a/Content.Client/Options/UI/OptionsMenu.xaml b/Content.Client/Options/UI/OptionsMenu.xaml index ab3b88ca4e6..4f624c1bb69 100644 --- a/Content.Client/Options/UI/OptionsMenu.xaml +++ b/Content.Client/Options/UI/OptionsMenu.xaml @@ -7,6 +7,5 @@ - diff --git a/Content.Client/Options/UI/OptionsMenu.xaml.cs b/Content.Client/Options/UI/OptionsMenu.xaml.cs index c3a8e664705..35a3f751bbf 100644 --- a/Content.Client/Options/UI/OptionsMenu.xaml.cs +++ b/Content.Client/Options/UI/OptionsMenu.xaml.cs @@ -19,7 +19,6 @@ public OptionsMenu() Tabs.SetTabTitle(1, Loc.GetString("ui-options-tab-graphics")); Tabs.SetTabTitle(2, Loc.GetString("ui-options-tab-controls")); Tabs.SetTabTitle(3, Loc.GetString("ui-options-tab-audio")); - Tabs.SetTabTitle(4, Loc.GetString("ui-options-tab-network")); UpdateTabs(); } diff --git a/Content.Client/Options/UI/Tabs/NetworkTab.xaml b/Content.Client/Options/UI/Tabs/NetworkTab.xaml deleted file mode 100644 index d010f0bd314..00000000000 --- a/Content.Client/Options/UI/Tabs/NetworkTab.xaml +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - - - - - - - - - [RegisterComponent, Access(typeof(ThiefRuleSystem))] -public sealed partial class ThiefRuleComponent : Component -{ - [DataField] - public ProtoId BigObjectiveGroup = "ThiefBigObjectiveGroups"; - - [DataField] - public ProtoId SmallObjectiveGroup = "ThiefObjectiveGroups"; - - [DataField] - public ProtoId EscapeObjectiveGroup = "ThiefEscapeObjectiveGroups"; - - [DataField] - public float BigObjectiveChance = 0.7f; - - [DataField] - public float MaxObjectiveDifficulty = 2.5f; - - [DataField] - public int MaxStealObjectives = 10; -} +public sealed partial class ThiefRuleComponent : Component; diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs index b85019d8afa..62f92963aa7 100644 --- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs @@ -22,9 +22,6 @@ public sealed partial class TraitorRuleComponent : Component [DataField] public ProtoId SyndicateFaction = "Syndicate"; - [DataField] - public ProtoId ObjectiveGroup = "TraitorObjectiveGroups"; - [DataField] public ProtoId CodewordAdjectives = "adjectives"; @@ -72,7 +69,4 @@ public enum SelectionState /// [DataField] public int StartingBalance = 20; - - [DataField] - public int MaxDifficulty = 5; } diff --git a/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs b/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs index 81bdda706bd..0367aa1460c 100644 --- a/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GenericAntagRuleSystem.cs @@ -1,6 +1,8 @@ using Content.Server.GameTicking.Rules.Components; using Content.Server.Objectives; +using Content.Shared.Mind; using System.Diagnostics.CodeAnalysis; +using System.Linq; namespace Content.Server.GameTicking.Rules; @@ -47,7 +49,8 @@ public bool StartRule(string rule, EntityUid mindId, [NotNullWhen(true)] out Ent private void OnObjectivesTextGetInfo(EntityUid uid, GenericAntagRuleComponent comp, ref ObjectivesTextGetInfoEvent args) { - args.Minds = comp.Minds; + // just temporary until this is deleted + args.Minds = comp.Minds.Select(mindId => (mindId, Comp(mindId).CharacterName ?? "?")).ToList(); args.AgentName = Loc.GetString(comp.AgentName); } } diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index 083085fa0d8..faec4a9e9ca 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -24,7 +24,6 @@ public override void Initialize() SubscribeLocalEvent(AfterAntagSelected); SubscribeLocalEvent(OnGetBriefing); - SubscribeLocalEvent(OnObjectivesTextGetInfo); } private void AfterAntagSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) @@ -33,41 +32,9 @@ private void AfterAntagSelected(Entity ent, ref AfterAntagEn return; //Generate objectives - GenerateObjectives(mindId, mind, ent); _antag.SendBriefing(args.EntityUid, MakeBriefing(args.EntityUid), null, null); } - private void GenerateObjectives(EntityUid mindId, MindComponent mind, ThiefRuleComponent thiefRule) - { - // Give thieves their objectives - var difficulty = 0f; - - if (_random.Prob(thiefRule.BigObjectiveChance)) // 70% chance to 1 big objective (structure or animal) - { - var objective = _objectives.GetRandomObjective(mindId, mind, thiefRule.BigObjectiveGroup); - if (objective != null) - { - _mindSystem.AddObjective(mindId, mind, objective.Value); - difficulty += Comp(objective.Value).Difficulty; - } - } - - for (var i = 0; i < thiefRule.MaxStealObjectives && thiefRule.MaxObjectiveDifficulty > difficulty; i++) // Many small objectives - { - var objective = _objectives.GetRandomObjective(mindId, mind, thiefRule.SmallObjectiveGroup); - if (objective == null) - continue; - - _mindSystem.AddObjective(mindId, mind, objective.Value); - difficulty += Comp(objective.Value).Difficulty; - } - - //Escape target - var escapeObjective = _objectives.GetRandomObjective(mindId, mind, thiefRule.EscapeObjectiveGroup); - if (escapeObjective != null) - _mindSystem.AddObjective(mindId, mind, escapeObjective.Value); - } - //Add mind briefing private void OnGetBriefing(Entity thief, ref GetBriefingEvent args) { @@ -87,10 +54,4 @@ private string MakeBriefing(EntityUid thief) briefing += "\n \n" + Loc.GetString("thief-role-greeting-equipment") + "\n"; return briefing; } - - private void OnObjectivesTextGetInfo(Entity ent, ref ObjectivesTextGetInfoEvent args) - { - args.Minds = _antag.GetAntagMindEntityUids(ent.Owner); - args.AgentName = Loc.GetString("thief-round-end-agent-name"); - } } diff --git a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs index 1c894a460cc..29de85a42e5 100644 --- a/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/TraitorRuleSystem.cs @@ -31,15 +31,12 @@ public sealed class TraitorRuleSystem : GameRuleSystem [Dependency] private readonly SharedJobSystem _jobs = default!; [Dependency] private readonly ObjectivesSystem _objectives = default!; - public const int MaxPicks = 20; - public override void Initialize() { base.Initialize(); SubscribeLocalEvent(AfterEntitySelected); - SubscribeLocalEvent(OnObjectivesTextGetInfo); SubscribeLocalEvent(OnObjectivesTextPrepend); } @@ -67,7 +64,7 @@ private void MakeCodewords(TraitorRuleComponent component) } } - public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool giveUplink = true, bool giveObjectives = true) + public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool giveUplink = true) { //Grab the mind if it wasnt provided if (!_mindSystem.TryGetMind(traitor, out var mindId, out var mind)) @@ -112,37 +109,16 @@ public bool MakeTraitor(EntityUid traitor, TraitorRuleComponent component, bool _npcFaction.RemoveFaction(traitor, component.NanoTrasenFaction, false); _npcFaction.AddFaction(traitor, component.SyndicateFaction); - // Give traitors their objectives - if (giveObjectives) - { - var difficulty = 0f; - for (var pick = 0; pick < MaxPicks && component.MaxDifficulty > difficulty; pick++) - { - var objective = _objectives.GetRandomObjective(mindId, mind, component.ObjectiveGroup); - if (objective == null) - continue; - - _mindSystem.AddObjective(mindId, mind, objective.Value); - var adding = Comp(objective.Value).Difficulty; - difficulty += adding; - Log.Debug($"Added objective {ToPrettyString(objective):objective} with {adding} difficulty"); - } - } - return true; } - private void OnObjectivesTextGetInfo(EntityUid uid, TraitorRuleComponent comp, ref ObjectivesTextGetInfoEvent args) - { - args.Minds = _antag.GetAntagMindEntityUids(uid); - args.AgentName = Loc.GetString("traitor-round-end-agent-name"); - } - + // TODO: AntagCodewordsComponent private void OnObjectivesTextPrepend(EntityUid uid, TraitorRuleComponent comp, ref ObjectivesTextPrependEvent args) { args.Text += "\n" + Loc.GetString("traitor-round-end-codewords", ("codewords", string.Join(", ", comp.Codewords))); } + // TODO: figure out how to handle this? add priority to briefing event? private string GenerateBriefing(string[] codewords, Note[]? uplinkCode, string? objectiveIssuer = null) { var sb = new StringBuilder(); diff --git a/Content.Server/Objectives/ObjectivesSystem.cs b/Content.Server/Objectives/ObjectivesSystem.cs index 47fe4eb5f88..f8ecc22828e 100644 --- a/Content.Server/Objectives/ObjectivesSystem.cs +++ b/Content.Server/Objectives/ObjectivesSystem.cs @@ -36,14 +36,14 @@ public override void Initialize() private void OnRoundEndText(RoundEndTextAppendEvent ev) { // go through each gamerule getting data for the roundend summary. - var summaries = new Dictionary>>(); + var summaries = new Dictionary>>(); var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var gameRule)) { if (!_gameTicker.IsGameRuleAdded(uid, gameRule)) continue; - var info = new ObjectivesTextGetInfoEvent(new List(), string.Empty); + var info = new ObjectivesTextGetInfoEvent(new List<(EntityUid, string)>(), string.Empty); RaiseLocalEvent(uid, ref info); if (info.Minds.Count == 0) continue; @@ -51,7 +51,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) // first group the gamerules by their agents, for example 2 different dragons var agent = info.AgentName; if (!summaries.ContainsKey(agent)) - summaries[agent] = new Dictionary>(); + summaries[agent] = new Dictionary>(); var prepend = new ObjectivesTextPrependEvent(""); RaiseLocalEvent(uid, ref prepend); @@ -79,7 +79,7 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) foreach (var (_, minds) in summary) { total += minds.Count; - totalInCustody += minds.Where(m => IsInCustody(m)).Count(); + totalInCustody += minds.Where(pair => IsInCustody(pair.Item1)).Count(); } var result = new StringBuilder(); @@ -104,19 +104,16 @@ private void OnRoundEndText(RoundEndTextAppendEvent ev) } } - private void AddSummary(StringBuilder result, string agent, List minds) + private void AddSummary(StringBuilder result, string agent, List<(EntityUid, string)> minds) { var agentSummaries = new List<(string summary, float successRate, int completedObjectives)>(); - foreach (var mindId in minds) + foreach (var (mindId, name) in minds) { - if (!TryComp(mindId, out MindComponent? mind)) - continue; - - var title = GetTitle(mindId, mind); - if (title == null) + if (!TryComp(mindId, out var mind)) continue; + var title = GetTitle((mindId, mind), name); var custody = IsInCustody(mindId, mind) ? Loc.GetString("objectives-in-custody") : string.Empty; var objectives = mind.Objectives; @@ -238,34 +235,18 @@ private bool IsInCustody(EntityUid mindId, MindComponent? mind = null) /// /// Get the title for a player's mind used in round end. + /// Pass in the original entity name which is shown alongside username. /// - public string? GetTitle(EntityUid mindId, MindComponent? mind = null) + public string GetTitle(Entity mind, string name) { - if (!Resolve(mindId, ref mind)) - return null; - - var name = mind.CharacterName; - var username = (string?) null; - - if (mind.OriginalOwnerUserId != null && - _player.TryGetPlayerData(mind.OriginalOwnerUserId.Value, out var sessionData)) + if (Resolve(mind, ref mind.Comp) && + mind.Comp.OriginalOwnerUserId != null && + _player.TryGetPlayerData(mind.Comp.OriginalOwnerUserId.Value, out var sessionData)) { - username = sessionData.UserName; + var username = sessionData.UserName; + return Loc.GetString("objectives-player-user-named", ("user", username), ("name", name)); } - - if (username != null) - { - if (name != null) - return Loc.GetString("objectives-player-user-named", ("user", username), ("name", name)); - - return Loc.GetString("objectives-player-user", ("user", username)); - } - - // nothing to identify the player by, just give up - if (name == null) - return null; - return Loc.GetString("objectives-player-named", ("name", name)); } } @@ -279,7 +260,7 @@ private bool IsInCustody(EntityUid mindId, MindComponent? mind = null) /// The objectives system already checks if the game rule is added so you don't need to check that in this event's handler. /// [ByRefEvent] -public record struct ObjectivesTextGetInfoEvent(List Minds, string AgentName); +public record struct ObjectivesTextGetInfoEvent(List<(EntityUid, string)> Minds, string AgentName); /// /// Raised on the game rule before text for each agent's objectives is added, letting you prepend something. diff --git a/Resources/Locale/en-US/objectives/round-end.ftl b/Resources/Locale/en-US/objectives/round-end.ftl index b4314b2caff..3da81fc9640 100644 --- a/Resources/Locale/en-US/objectives/round-end.ftl +++ b/Resources/Locale/en-US/objectives/round-end.ftl @@ -6,7 +6,6 @@ objectives-round-end-result = {$count -> objectives-round-end-result-in-custody = {$custody} out of {$count} {MAKEPLURAL($agent)} were in custody. objectives-player-user-named = [color=White]{$name}[/color] ([color=gray]{$user}[/color]) -objectives-player-user = [color=gray]{$user}[/color] objectives-player-named = [color=White]{$name}[/color] objectives-no-objectives = {$custody}{$title} was a {$agent}. diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 3b9ad5aadf2..593122eee55 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -428,9 +428,9 @@ prototype: Nukeops - type: entity - id: SleeperAgentsRule - parent: BaseGameRule noSpawn: true + parent: BaseTraitorRule + id: SleeperAgentsRule components: - type: StationEvent earliestStart: 30 @@ -441,7 +441,6 @@ startAudio: path: /Audio/Announcements/intercept.ogg - type: AlertLevelInterceptionRule - - type: TraitorRule - type: AntagSelection definitions: - prefRoles: [ Traitor ] diff --git a/Resources/Prototypes/GameRules/midround.yml b/Resources/Prototypes/GameRules/midround.yml index 5a4cde31018..1b58ada6485 100644 --- a/Resources/Prototypes/GameRules/midround.yml +++ b/Resources/Prototypes/GameRules/midround.yml @@ -35,7 +35,19 @@ id: Thief components: - type: ThiefRule + - type: AntagObjectives + objectives: + - EscapeThiefShuttleObjective + - type: AntagRandomObjectives + sets: + - groups: ThiefBigObjectiveGroups + prob: 0.7 + maxPicks: 1 + - groups: ThiefObjectiveGroups + maxPicks: 10 + maxDifficulty: 2.5 - type: AntagSelection + agentName: thief-round-end-agent-name definitions: - prefRoles: [ Thief ] maxRange: @@ -53,14 +65,3 @@ prototype: Thief briefing: sound: "/Audio/Misc/thief_greeting.ogg" - -#- type: entity -# noSpawn: true -# parent: BaseGameRule -# id: Exterminator -# components: -# - type: GenericAntagRule -# agentName: terminator-round-end-agent-name -# objectives: -# - TerminateObjective -# - ShutDownObjective diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index d87e7ccbe76..be5f617c8dc 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -134,16 +134,30 @@ prototype: Nukeops - type: entity - id: Traitor + abstract: true parent: BaseGameRule + id: BaseTraitorRule + components: + - type: TraitorRule + # TODO: codewords in yml + # TODO: uplink in yml + - type: AntagRandomObjectives + sets: + - groups: TraitorObjectiveGroups + maxDifficulty: 5 + - type: AntagSelection + agentName: traitor-round-end-agent-name + +- type: entity noSpawn: true + parent: BaseTraitorRule + id: Traitor components: - type: GameRule minPlayers: 5 delay: min: 240 max: 420 - - type: TraitorRule - type: AntagSelection definitions: - prefRoles: [ Traitor ] diff --git a/Resources/Prototypes/Objectives/objectiveGroups.yml b/Resources/Prototypes/Objectives/objectiveGroups.yml index ff126eb5d16..bb74c92da3b 100644 --- a/Resources/Prototypes/Objectives/objectiveGroups.yml +++ b/Resources/Prototypes/Objectives/objectiveGroups.yml @@ -55,13 +55,6 @@ ThiefObjectiveGroupStructure: 0 #Temporarily disabled until obvious ways to steal structures are added ThiefObjectiveGroupAnimal: 2 -- type: weightedRandom - id: ThiefEscapeObjectiveGroups - weights: - ThiefObjectiveGroupEscape: 1 - - - - type: weightedRandom id: ThiefObjectiveGroupCollection weights: From 739c81c230ad4ae103b9a3b6a886cd7a46830361 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sat, 25 May 2024 20:15:56 +0000 Subject: [PATCH 031/112] move nukie profile loading into its own rule (#28208) * move profile loading out of nukeops rule * make BaseNukeopsRule and use AntagLoadProfileRule * untroll --------- Co-authored-by: deltanedas <@deltanedas:kde.org> --- .../Rules/AntagLoadProfileRuleSystem.cs | 39 +++++++++++++++++++ .../AntagLoadProfileRuleCOmponent.cs | 7 ++++ .../GameTicking/Rules/NukeopsRuleSystem.cs | 28 ------------- Resources/Prototypes/GameRules/events.yml | 4 +- Resources/Prototypes/GameRules/roundstart.yml | 16 ++++++-- 5 files changed, 60 insertions(+), 34 deletions(-) create mode 100644 Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs create mode 100644 Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs diff --git a/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs b/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs new file mode 100644 index 00000000000..fd3fb6cd655 --- /dev/null +++ b/Content.Server/GameTicking/Rules/AntagLoadProfileRuleSystem.cs @@ -0,0 +1,39 @@ +using Content.Server.Antag; +using Content.Server.GameTicking.Rules.Components; +using Content.Server.Humanoid; +using Content.Server.Preferences.Managers; +using Content.Shared.Humanoid; +using Content.Shared.Humanoid.Prototypes; +using Content.Shared.Preferences; +using Robust.Shared.Prototypes; + +namespace Content.Server.GameTicking.Rules; + +public sealed class AntagLoadProfileRuleSystem : GameRuleSystem +{ + [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; + [Dependency] private readonly IPrototypeManager _proto = default!; + [Dependency] private readonly IServerPreferencesManager _prefs = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnSelectEntity); + } + + private void OnSelectEntity(Entity ent, ref AntagSelectEntityEvent args) + { + if (args.Handled) + return; + + var profile = args.Session != null + ? _prefs.GetPreferences(args.Session.UserId).SelectedCharacter as HumanoidCharacterProfile + : HumanoidCharacterProfile.RandomWithSpecies(); + if (profile?.Species is not {} speciesId || !_proto.TryIndex(speciesId, out var species)) + species = _proto.Index(SharedHumanoidAppearanceSystem.DefaultSpecies); + + args.Entity = Spawn(species.Prototype); + _humanoid.LoadProfile(args.Entity.Value, profile); + } +} diff --git a/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs b/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs new file mode 100644 index 00000000000..5e58fd14fc0 --- /dev/null +++ b/Content.Server/GameTicking/Rules/Components/AntagLoadProfileRuleCOmponent.cs @@ -0,0 +1,7 @@ +namespace Content.Server.GameTicking.Rules.Components; + +/// +/// Makes this rules antags spawn a humanoid, either from the player's profile or a random one. +/// +[RegisterComponent] +public sealed partial class AntagLoadProfileRuleComponent : Component; diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index 232d24004b9..d6f1c3c619a 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -1,11 +1,9 @@ using Content.Server.Antag; using Content.Server.Communications; using Content.Server.GameTicking.Rules.Components; -using Content.Server.Humanoid; using Content.Server.Nuke; using Content.Server.NukeOps; using Content.Server.Popups; -using Content.Server.Preferences.Managers; using Content.Server.Roles; using Content.Server.RoundEnd; using Content.Server.Shuttles.Events; @@ -13,20 +11,16 @@ using Content.Server.Station.Components; using Content.Server.Store.Components; using Content.Server.Store.Systems; -using Content.Shared.Humanoid; -using Content.Shared.Humanoid.Prototypes; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.NPC.Components; using Content.Shared.NPC.Systems; using Content.Shared.Nuke; using Content.Shared.NukeOps; -using Content.Shared.Preferences; using Content.Shared.Store; using Content.Shared.Tag; using Content.Shared.Zombies; using Robust.Shared.Map; -using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Utility; using System.Linq; @@ -36,10 +30,7 @@ namespace Content.Server.GameTicking.Rules; public sealed class NukeopsRuleSystem : GameRuleSystem { - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; - [Dependency] private readonly IServerPreferencesManager _prefs = default!; [Dependency] private readonly EmergencyShuttleSystem _emergency = default!; - [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; [Dependency] private readonly NpcFactionSystem _npcFaction = default!; [Dependency] private readonly AntagSelectionSystem _antag = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; @@ -71,7 +62,6 @@ public override void Initialize() SubscribeLocalEvent(OnWarDeclared); SubscribeLocalEvent(OnShuttleCallAttempt); - SubscribeLocalEvent(OnAntagSelectEntity); SubscribeLocalEvent(OnAfterAntagEntSelected); } @@ -471,24 +461,6 @@ private void CheckRoundShouldEnd(Entity ent) nukeops.RoundEndBehavior = RoundEndBehavior.Nothing; } - // this should really go anywhere else but im tired. - private void OnAntagSelectEntity(Entity ent, ref AntagSelectEntityEvent args) - { - if (args.Handled) - return; - - var profile = args.Session != null - ? _prefs.GetPreferences(args.Session.UserId).SelectedCharacter as HumanoidCharacterProfile - : HumanoidCharacterProfile.RandomWithSpecies(); - if (!_prototypeManager.TryIndex(profile?.Species ?? SharedHumanoidAppearanceSystem.DefaultSpecies, out SpeciesPrototype? species)) - { - species = _prototypeManager.Index(SharedHumanoidAppearanceSystem.DefaultSpecies); - } - - args.Entity = Spawn(species.Prototype); - _humanoid.LoadProfile(args.Entity.Value, profile); - } - private void OnAfterAntagEntSelected(Entity ent, ref AfterAntagEntitySelectedEvent args) { if (ent.Comp.TargetStation is not { } station) diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 593122eee55..b1b48258bad 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -394,9 +394,9 @@ prototype: InitialInfected - type: entity - id: LoneOpsSpawn - parent: BaseGameRule noSpawn: true + parent: BaseNukeopsRule + id: LoneOpsSpawn components: - type: StationEvent earliestStart: 35 diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index be5f617c8dc..57e59f10e21 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -64,17 +64,25 @@ roundEndDelay: 10 - type: entity - id: Nukeops + abstract: true parent: BaseGameRule - noSpawn: true + id: BaseNukeopsRule components: - - type: GameRule - minPlayers: 20 - type: RandomMetadata #this generates the random operation name cuz it's cool. nameSegments: - operationPrefix - operationSuffix - type: NukeopsRule + - type: AntagSelection + - type: AntagLoadProfileRule + +- type: entity + noSpawn: true + parent: BaseNukeopsRule + id: Nukeops + components: + - type: GameRule + minPlayers: 20 - type: LoadMapRule gameMap: NukieOutpost - type: AntagSelection From 90d3699c1df2d0de21e887c893b9f17aaebcfced Mon Sep 17 00:00:00 2001 From: Repo <47093363+Titian3@users.noreply.github.com> Date: Sun, 26 May 2024 08:18:05 +1200 Subject: [PATCH 032/112] Fix gamerule display issues (#28178) * A comprehensive rule list for joining admins and mid round command to get rule list added * Fix up for when a rule is added vs started and some logging * fix command help localization, fix admin flags and spam anouncement. * Send admin message only to the joining player not all admins. * Bit better formatting in chat box --- Content.Server/Chat/Managers/ChatManager.cs | 8 ++ Content.Server/Chat/Managers/IChatManager.cs | 1 + .../GameTicking/GameTicker.GameRule.cs | 74 ++++++++++++++++++- .../GameTicking/GameTicker.Player.cs | 11 +++ .../GameTicking/Rules/SecretRuleSystem.cs | 1 - .../game-rules/gamerule-admin.ftl | 6 ++ .../game-ticking/game-rules/rule-secret.ftl | 2 - 7 files changed, 98 insertions(+), 5 deletions(-) create mode 100644 Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl delete mode 100644 Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl diff --git a/Content.Server/Chat/Managers/ChatManager.cs b/Content.Server/Chat/Managers/ChatManager.cs index 812aed80bd7..79683db6411 100644 --- a/Content.Server/Chat/Managers/ChatManager.cs +++ b/Content.Server/Chat/Managers/ChatManager.cs @@ -150,6 +150,14 @@ public void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist, Adm _adminLogger.Add(LogType.Chat, LogImpact.Low, $"Admin announcement: {message}"); } + public void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true) + { + var wrappedMessage = Loc.GetString("chat-manager-send-admin-announcement-wrap-message", + ("adminChannelName", Loc.GetString("chat-manager-admin-channel-name")), + ("message", FormattedMessage.EscapeText(message))); + ChatMessageToOne(ChatChannel.Admin, message, wrappedMessage, default, false, player.Channel); + } + public void SendAdminAlert(string message) { var clients = _adminManager.ActiveAdmins.Select(p => p.Channel); diff --git a/Content.Server/Chat/Managers/IChatManager.cs b/Content.Server/Chat/Managers/IChatManager.cs index 59945bf5ca6..c8c057a1ad7 100644 --- a/Content.Server/Chat/Managers/IChatManager.cs +++ b/Content.Server/Chat/Managers/IChatManager.cs @@ -23,6 +23,7 @@ public interface IChatManager void SendHookOOC(string sender, string message); void SendAdminAnnouncement(string message, AdminFlags? flagBlacklist = null, AdminFlags? flagWhitelist = null); + void SendAdminAnnouncementMessage(ICommonSession player, string message, bool suppressLog = true); void SendAdminAlert(string message); void SendAdminAlert(EntityUid player, string message); diff --git a/Content.Server/GameTicking/GameTicker.GameRule.cs b/Content.Server/GameTicking/GameTicker.GameRule.cs index f52a3cb296d..a6d0a4baf0a 100644 --- a/Content.Server/GameTicking/GameTicker.GameRule.cs +++ b/Content.Server/GameTicking/GameTicker.GameRule.cs @@ -1,6 +1,7 @@ using System.Linq; using Content.Server.Administration; using Content.Server.GameTicking.Components; +using Content.Server.GameTicking.Rules.Components; using Content.Shared.Administration; using Content.Shared.Database; using Content.Shared.Prototypes; @@ -42,6 +43,14 @@ private void InitializeGameRules() string.Empty, "cleargamerules", ClearGameRulesCommand); + + // List game rules command. + var localizedHelp = Loc.GetString("listgamerules-command-help"); + + _consoleHost.RegisterCommand("listgamerules", + string.Empty, + $"listgamerules - {localizedHelp}", + ListGameRuleCommand); } private void ShutdownGameRules() @@ -49,6 +58,7 @@ private void ShutdownGameRules() _consoleHost.UnregisterCommand("addgamerule"); _consoleHost.UnregisterCommand("endgamerule"); _consoleHost.UnregisterCommand("cleargamerules"); + _consoleHost.UnregisterCommand("listgamerules"); } /// @@ -64,6 +74,13 @@ public EntityUid AddGameRule(string ruleId) var ev = new GameRuleAddedEvent(ruleEntity, ruleId); RaiseLocalEvent(ruleEntity, ref ev, true); + + var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration(); + if (!HasComp(ruleEntity) && !HasComp(ruleEntity)) + { + _allPreviousGameRules.Add((currentTime, ruleId + " (Pending)")); + } + return ruleEntity; } @@ -110,7 +127,8 @@ public bool StartGameRule(EntityUid ruleEntity, GameRuleComponent? ruleData = nu if (delayTime > TimeSpan.Zero) { _sawmill.Info($"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); - _adminLogger.Add(LogType.EventStarted, $"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); + _adminLogger.Add(LogType.EventStarted, + $"Queued start for game rule {ToPrettyString(ruleEntity)} with delay {delayTime}"); var delayed = EnsureComp(ruleEntity); delayed.RuleStartTime = _gameTiming.CurTime + (delayTime); @@ -118,7 +136,20 @@ public bool StartGameRule(EntityUid ruleEntity, GameRuleComponent? ruleData = nu } } - _allPreviousGameRules.Add((RoundDuration(), id)); + var currentTime = RunLevel == GameRunLevel.PreRoundLobby ? TimeSpan.Zero : RoundDuration(); + + // Remove the first occurrence of the pending entry before adding the started entry + var pendingRuleIndex = _allPreviousGameRules.FindIndex(rule => rule.Item2 == id + " (Pending)"); + if (pendingRuleIndex >= 0) + { + _allPreviousGameRules.RemoveAt(pendingRuleIndex); + } + + if (!HasComp(ruleEntity) && !HasComp(ruleEntity)) + { + _allPreviousGameRules.Add((currentTime, id)); + } + _sawmill.Info($"Started game rule {ToPrettyString(ruleEntity)}"); _adminLogger.Add(LogType.EventStarted, $"Started game rule {ToPrettyString(ruleEntity)}"); @@ -296,6 +327,7 @@ private void AddGameRuleCommand(IConsoleShell shell, string argstr, string[] arg if (shell.Player != null) { _adminLogger.Add(LogType.EventStarted, $"{shell.Player} tried to add game rule [{rule}] via command"); + _chatManager.SendAdminAnnouncement(Loc.GetString("add-gamerule-admin", ("rule", rule), ("admin", shell.Player))); } else { @@ -306,6 +338,7 @@ private void AddGameRuleCommand(IConsoleShell shell, string argstr, string[] arg // Start rule if we're already in the middle of a round if(RunLevel == GameRunLevel.InRound) StartGameRule(ent); + } } @@ -349,5 +382,42 @@ private void ClearGameRulesCommand(IConsoleShell shell, string argstr, string[] ClearGameRules(); } + [AdminCommand(AdminFlags.Admin)] + private void ListGameRuleCommand(IConsoleShell shell, string argstr, string[] args) + { + _sawmill.Info($"{shell.Player} tried to get list of game rules via command"); + _adminLogger.Add(LogType.Action, $"{shell.Player} tried to get list of game rules via command"); + var message = GetGameRulesListMessage(false); + shell.WriteLine(message); + } + private string GetGameRulesListMessage(bool forChatWindow) + { + if (_allPreviousGameRules.Count > 0) + { + var sortedRules = _allPreviousGameRules.OrderBy(rule => rule.Item1).ToList(); + var message = "\n"; + + if (!forChatWindow) + { + var header = Loc.GetString("list-gamerule-admin-header"); + message += $"\n{header}\n"; + message += "|------------|------------------\n"; + } + + foreach (var (time, rule) in sortedRules) + { + var formattedTime = time.ToString(@"hh\:mm\:ss"); + message += $"| {formattedTime,-10} | {rule,-16} \n"; + } + + return message; + } + else + { + return Loc.GetString("list-gamerule-admin-no-rules"); + + } + } + #endregion } diff --git a/Content.Server/GameTicking/GameTicker.Player.cs b/Content.Server/GameTicking/GameTicker.Player.cs index c1388f62903..61cdf6f8553 100644 --- a/Content.Server/GameTicking/GameTicker.Player.cs +++ b/Content.Server/GameTicking/GameTicker.Player.cs @@ -1,4 +1,6 @@ +using System.Linq; using Content.Server.Database; +using Content.Shared.Administration; using Content.Shared.CCVar; using Content.Shared.GameTicking; using Content.Shared.GameWindow; @@ -196,6 +198,15 @@ public void PlayerJoinGame(ICommonSession session, bool silent = false) _playerGameStatuses[session.UserId] = PlayerGameStatus.JoinedGame; _db.AddRoundPlayers(RoundId, session.UserId); + if (_adminManager.HasAdminFlag(session, AdminFlags.Admin)) + { + if (_allPreviousGameRules.Count > 0) + { + var rulesMessage = GetGameRulesListMessage(true); + _chatManager.SendAdminAnnouncementMessage(session, Loc.GetString("starting-rule-selected-preset", ("preset", rulesMessage))); + } + } + RaiseNetworkEvent(new TickerJoinGameEvent(), session.Channel); } diff --git a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs index 95bf5986a5a..d25262b797a 100644 --- a/Content.Server/GameTicking/Rules/SecretRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/SecretRuleSystem.cs @@ -46,7 +46,6 @@ protected override void Added(EntityUid uid, SecretRuleComponent component, Game Log.Info($"Selected {preset.ID} as the secret preset."); _adminLogger.Add(LogType.EventStarted, $"Selected {preset.ID} as the secret preset."); - _chatManager.SendAdminAnnouncement(Loc.GetString("rule-secret-selected-preset", ("preset", preset.ID))); foreach (var rule in preset.Rules) { diff --git a/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl b/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl new file mode 100644 index 00000000000..3b31fe46630 --- /dev/null +++ b/Resources/Locale/en-US/game-ticking/game-rules/gamerule-admin.ftl @@ -0,0 +1,6 @@ +#When an admin adds a game rule +add-gamerule-admin = Game rule({$rule}) added - {$admin} +list-gamerule-admin-header = | Time | Rule added +list-gamerule-admin-no-rules = No game rules have been added. +starting-rule-selected-preset = Current gamerules in use: {$preset} +listgamerules-command-help = Lists all rules that have been added for the round so far. diff --git a/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl b/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl deleted file mode 100644 index c38220cca1d..00000000000 --- a/Resources/Locale/en-US/game-ticking/game-rules/rule-secret.ftl +++ /dev/null @@ -1,2 +0,0 @@ -# Sent to admin chat -rule-secret-selected-preset = Selected {$preset} for secret. From 7c9e5a0779e7d44f183575b1fce6ab95dc0c8996 Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 25 May 2024 23:18:40 +0300 Subject: [PATCH 033/112] Tomato killers don't kill the server anymore. (#28173) * tomato killer auto death * fix * Update miscellaneous.yml --- .../Entities/Mobs/NPCs/miscellaneous.yml | 27 ++++++++++++++++--- .../Entities/Objects/Consumable/Food/meat.yml | 4 +++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml index f77429d5978..e09d3917c75 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/miscellaneous.yml @@ -114,13 +114,22 @@ - trigger: !type:DamageTypeTrigger damageType: Blunt - damage: 100 + damage: 40 behaviors: - - !type:GibBehavior { } + - !type:SpawnEntitiesBehavior + spawn: + FoodMeatTomato: + min: 1 + max: 2 + - !type:DoActsBehavior + acts: ["Destruction"] + - !type:PlaySoundBehavior + sound: + collection: gib - type: MobThresholds thresholds: 0: Alive - 24: Dead + 35: Dead - type: Fixtures fixtures: fix1: @@ -136,7 +145,7 @@ hidden: true damage: groups: - Brute: 4 + Brute: 9 animation: WeaponArcBite - type: Climbing - type: NameIdentifier @@ -156,3 +165,13 @@ - type: Appearance - type: Produce seedId: killerTomato + - type: PassiveDamage # Slight passive damage. 35 hp \ 5 min \ 60 sec = 0.08 + allowedStates: + - Alive + - Dead + damageCap: 50 + damage: + types: + Blunt: 0.11 + - type: StaticPrice + price: 400 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml index 81c98750dc2..bb0f05c1814 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/meat.yml @@ -599,6 +599,8 @@ - type: SliceableFood count: 3 slice: FoodMeatTomatoCutlet + - type: StaticPrice + price: 100 - type: entity name: salami @@ -1270,6 +1272,8 @@ - type: Sprite state: salami-slice color: red + - type: StaticPrice + price: 30 - type: entity name: salami slice From bc5b92b8154669194f1973f3564a336e5deaa35c Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 25 May 2024 20:19:46 +0000 Subject: [PATCH 034/112] Automatic changelog update --- Resources/Changelog/Admin.yml | 11 +++++++++++ Resources/Changelog/Changelog.yml | 20 ++++++++++++-------- 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index f0bb5671028..879eaff2329 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -235,5 +235,16 @@ Entries: id: 29 time: '2024-05-19T23:04:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28107 +- author: Repo + changes: + - message: Added listgamerules command, lists all run game modes for the round. + type: Add + - message: Added admin anouncement for addgamerule + type: Add + - message: Gamemode now shows after starting round. + type: Fix + id: 30 + time: '2024-05-25T20:18:05.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28178 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index 22c9a547de7..1a290ea8c39 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: nikthechampiongr - changes: - - message: Shields will no longer absorb asphyxiation damage, or any other damage - they themselves can't take. - type: Fix - id: 6118 - time: '2024-03-11T01:55:19.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25972 - author: metalgearsloth changes: - message: Remove the buttons for generated debris from shuttle maps. @@ -3871,3 +3863,15 @@ id: 6617 time: '2024-05-25T20:08:16.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28237 +- author: TheShuEd + changes: + - message: 'Killer tomatoes got a small health and damage buff: 24 -> 35 hp and + 4->9 brute damage' + type: Tweak + - message: Killer tomatoes now die after 5 minutes of their existence + type: Tweak + - message: Killer tomatoes can now be profitably sold. + type: Add + id: 6618 + time: '2024-05-25T20:18:40.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28173 From de8b6631245cc6a7a3641f43b68c61e077a06bf8 Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Sat, 25 May 2024 23:20:43 +0300 Subject: [PATCH 035/112] Add direction relative to station for emergency shuttle's docking & nearby announcement (#28164) * Use nav beacon location for emergency shuttle's docking announcement Location of the shuttle relative to the nearest nav beacon in docking announcement message of the emergency shuttle * Add directions relative to station --- .../Shuttles/Systems/EmergencyShuttleSystem.cs | 11 ++++++++--- Resources/Locale/en-US/shuttles/emergency.ftl | 4 ++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index 2d8ae4b735e..e2b1ad32cd7 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -287,7 +287,8 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (TryComp(targetGrid.Value, out TransformComponent? targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir())), playDefaultSound: false); + var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location)), playDefaultSound: false); } // shuttle timers @@ -313,8 +314,12 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo } else { - var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("direction", location)), playDefaultSound: false); + if (TryComp(targetGrid.Value, out var targetXform)) + { + var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); + var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location)), playDefaultSound: false); + } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}"); // TODO: Need filter extensions or something don't blame me. diff --git a/Resources/Locale/en-US/shuttles/emergency.ftl b/Resources/Locale/en-US/shuttles/emergency.ftl index c7162911351..2fa3a7a1240 100644 --- a/Resources/Locale/en-US/shuttles/emergency.ftl +++ b/Resources/Locale/en-US/shuttles/emergency.ftl @@ -13,9 +13,9 @@ emergency-shuttle-command-launch-desc = Early launches the emergency shuttle if # Emergency shuttle emergency-shuttle-left = The Emergency Shuttle has left the station. Estimate {$transitTime} seconds until the shuttle arrives at CentCom. emergency-shuttle-launch-time = The emergency shuttle will launch in {$consoleAccumulator} seconds. -emergency-shuttle-docked = The Emergency Shuttle has docked with the station on the {$direction} side. It will leave in {$time} seconds. +emergency-shuttle-docked = The Emergency Shuttle has docked {$direction} of the station, {$location}. It will leave in {$time} seconds. emergency-shuttle-good-luck = The Emergency Shuttle is unable to find a station. Good luck. -emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped {$direction}. +emergency-shuttle-nearby = The Emergency Shuttle is unable to find a valid docking port. It has warped in {$direction} of the station, {$location}. # Emergency shuttle console popup / announcement emergency-shuttle-console-no-early-launches = Early launch is disabled From afb1acab10a5abc2ff954d08107c5e7866d3db8e Mon Sep 17 00:00:00 2001 From: Ed <96445749+TheShuEd@users.noreply.github.com> Date: Sat, 25 May 2024 23:22:34 +0300 Subject: [PATCH 036/112] Fix candles (firestack fading) (#28139) Update FlammableSystem.cs --- Content.Server/Atmos/EntitySystems/FlammableSystem.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs index e8721920dd8..b6e26435a75 100644 --- a/Content.Server/Atmos/EntitySystems/FlammableSystem.cs +++ b/Content.Server/Atmos/EntitySystems/FlammableSystem.cs @@ -447,7 +447,7 @@ public override void Update(float frameTime) _damageableSystem.TryChangeDamage(uid, flammable.Damage * flammable.FireStacks * ev.Multiplier, interruptsDoAfters: false); - AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable); + AdjustFireStacks(uid, flammable.FirestackFade * (flammable.Resisting ? 10f : 1f), flammable, flammable.OnFire); } else { From 93f289c7dc94e0aa280b1b8544f8b9ba575d5294 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sun, 26 May 2024 06:23:34 +1000 Subject: [PATCH 037/112] Fix water postshader (#28130) --- .../Movement/Systems/FloorOcclusionSystem.cs | 41 +++++++++++-------- .../Components/FloorOcclusionComponent.cs | 9 ++-- .../Systems/SharedFloorOcclusionSystem.cs | 24 +++++------ 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs index 5c75f25ca2d..44573f8e084 100644 --- a/Content.Client/Movement/Systems/FloorOcclusionSystem.cs +++ b/Content.Client/Movement/Systems/FloorOcclusionSystem.cs @@ -10,51 +10,56 @@ public sealed class FloorOcclusionSystem : SharedFloorOcclusionSystem { [Dependency] private readonly IPrototypeManager _proto = default!; + private EntityQuery _spriteQuery; + public override void Initialize() { base.Initialize(); + + _spriteQuery = GetEntityQuery(); + SubscribeLocalEvent(OnOcclusionStartup); + SubscribeLocalEvent(OnOcclusionShutdown); SubscribeLocalEvent(OnOcclusionAuto); } - private void OnOcclusionAuto(EntityUid uid, FloorOcclusionComponent component, ref AfterAutoHandleStateEvent args) + private void OnOcclusionAuto(Entity ent, ref AfterAutoHandleStateEvent args) { - SetEnabled(uid, component, component.Enabled); + SetShader(ent.Owner, ent.Comp.Enabled); } - private void OnOcclusionStartup(EntityUid uid, FloorOcclusionComponent component, ComponentStartup args) + private void OnOcclusionStartup(Entity ent, ref ComponentStartup args) { - if (component.Enabled && TryComp(uid, out var sprite)) - SetShader(sprite, true); + SetShader(ent.Owner, ent.Comp.Enabled); } - protected override void SetEnabled(EntityUid uid, FloorOcclusionComponent component, bool enabled) + private void OnOcclusionShutdown(Entity ent, ref ComponentShutdown args) { - if (component.Enabled == enabled) - return; - - base.SetEnabled(uid, component, enabled); - - if (!TryComp(uid, out var sprite)) - return; + SetShader(ent.Owner, false); + } - SetShader(sprite, enabled); + protected override void SetEnabled(Entity entity) + { + SetShader(entity.Owner, entity.Comp.Enabled); } - private void SetShader(SpriteComponent sprite, bool enabled) + private void SetShader(Entity sprite, bool enabled) { + if (!_spriteQuery.Resolve(sprite.Owner, ref sprite.Comp, false)) + return; + var shader = _proto.Index("HorizontalCut").Instance(); - if (sprite.PostShader is not null && sprite.PostShader != shader) + if (sprite.Comp.PostShader is not null && sprite.Comp.PostShader != shader) return; if (enabled) { - sprite.PostShader = shader; + sprite.Comp.PostShader = shader; } else { - sprite.PostShader = null; + sprite.Comp.PostShader = null; } } } diff --git a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs index aa9a1ced552..5d412f694a0 100644 --- a/Content.Shared/Movement/Components/FloorOcclusionComponent.cs +++ b/Content.Shared/Movement/Components/FloorOcclusionComponent.cs @@ -8,12 +8,9 @@ namespace Content.Shared.Movement.Components; [RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)] public sealed partial class FloorOcclusionComponent : Component { - /// - /// Is the shader currently enabled. - /// - [ViewVariables(VVAccess.ReadWrite), DataField("enabled"), AutoNetworkedField] - public bool Enabled; + [ViewVariables] + public bool Enabled => Colliding.Count > 0; - [DataField("colliding")] + [DataField, AutoNetworkedField] public List Colliding = new(); } diff --git a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs index 9d27ea42c63..6b7023a1c64 100644 --- a/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs +++ b/Content.Shared/Movement/Systems/SharedFloorOcclusionSystem.cs @@ -15,39 +15,37 @@ public override void Initialize() SubscribeLocalEvent(OnEndCollide); } - private void OnStartCollide(EntityUid uid, FloorOccluderComponent component, ref StartCollideEvent args) + private void OnStartCollide(Entity entity, ref StartCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion) || - occlusion.Colliding.Contains(uid)) + occlusion.Colliding.Contains(entity.Owner)) { return; } - SetEnabled(other, occlusion, true); - occlusion.Colliding.Add(uid); + occlusion.Colliding.Add(entity.Owner); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); } - private void OnEndCollide(EntityUid uid, FloorOccluderComponent component, ref EndCollideEvent args) + private void OnEndCollide(Entity entity, ref EndCollideEvent args) { var other = args.OtherEntity; if (!TryComp(other, out var occlusion)) return; - occlusion.Colliding.Remove(uid); + if (!occlusion.Colliding.Remove(entity.Owner)) + return; - if (occlusion.Colliding.Count == 0) - SetEnabled(other, occlusion, false); + Dirty(other, occlusion); + SetEnabled((other, occlusion)); } - protected virtual void SetEnabled(EntityUid uid, FloorOcclusionComponent component, bool enabled) + protected virtual void SetEnabled(Entity entity) { - if (component.Enabled == enabled) - return; - component.Enabled = enabled; - Dirty(uid, component); } } From ac08f0068fec2491b6558260a286d4c8213639ad Mon Sep 17 00:00:00 2001 From: PJBot Date: Sat, 25 May 2024 20:24:40 +0000 Subject: [PATCH 038/112] 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 1a290ea8c39..7880f0a8d13 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: metalgearsloth - changes: - - message: Remove the buttons for generated debris from shuttle maps. - type: Tweak - id: 6119 - time: '2024-03-11T02:11:46.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25897 - author: Errant changes: - message: Species info is now available in the Guidebook and in the character editor. @@ -3875,3 +3868,10 @@ id: 6618 time: '2024-05-25T20:18:40.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28173 +- author: metalgearsloth + changes: + - message: Fix water shader getting stuck on sometimes. + type: Fix + id: 6619 + time: '2024-05-25T20:23:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28130 From 229f6d697cd1234f1d187bce79f70fe098571285 Mon Sep 17 00:00:00 2001 From: eoineoineoin Date: Sat, 25 May 2024 21:26:48 +0100 Subject: [PATCH 039/112] Objects ordered through cargo system shouldn't start anchored (#28115) * Order normal space heater instead of anchored variant * Make sure ordered objects don't spawn anchored * Order space heater flatpack instead of a regular space heater * Remove obsolete TODO * Remove unnecessary name --------- Co-authored-by: Eoin Mcloughlin --- Content.Server/Cargo/Systems/CargoSystem.Orders.cs | 5 +++++ .../Prototypes/Catalog/Cargo/cargo_engineering.yml | 2 +- .../Prototypes/Catalog/Fills/Crates/engineering.yml | 10 ++++++++++ Resources/Prototypes/Catalog/Fills/Crates/engines.yml | 2 +- .../Prototypes/Entities/Objects/Devices/flatpack.yml | 9 +++++++++ 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 63556d2fbd7..c519362945e 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -20,6 +20,8 @@ namespace Content.Server.Cargo.Systems { public sealed partial class CargoSystem { + [Dependency] private readonly SharedTransformSystem _transformSystem = default!; + /// /// How much time to wait (in seconds) before increasing bank accounts balance. /// @@ -489,6 +491,9 @@ private bool FulfillOrder(CargoOrderData order, EntityCoordinates spawn, string? // Create the item itself var item = Spawn(order.ProductId, spawn); + // Ensure the item doesn't start anchored + _transformSystem.Unanchor(item, Transform(item)); + // Create a sheet of paper to write the order details on var printed = EntityManager.SpawnEntity(paperProto, spawn); if (TryComp(printed, out var paper)) diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml index 754e30f133a..7ca6af84518 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_engineering.yml @@ -133,7 +133,7 @@ icon: sprite: Structures/Piping/Atmospherics/Portable/portable_sheater.rsi state: sheaterOff - product: SpaceHeaterAnchored + product: CrateEngineeringSpaceHeater cost: 300 category: cargoproduct-category-name-engineering group: market diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml index 03c870fa580..26a8910c735 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engineering.yml @@ -194,3 +194,13 @@ contents: - id: WeaponParticleDecelerator amount: 3 + +- type: entity + id: CrateEngineeringSpaceHeater + parent: CrateEngineering + name: space heater crate + description: Contains a space heater for climate control. + components: + - type: StorageFill + contents: + - id: SpaceHeaterFlatpack diff --git a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml index 79698b550a7..c37b7b7535a 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/engines.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/engines.yml @@ -42,7 +42,7 @@ components: - type: StorageFill contents: - - id: EmitterFlatpack # TODO change to flatpack + - id: EmitterFlatpack - type: entity id: CrateEngineeringSingularityCollector diff --git a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml index 2aecd132880..e3e77d5c88e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/flatpack.yml @@ -195,3 +195,12 @@ - state: overlay color: "#cec8ac" - state: icon-default + +- type: entity + parent: BaseFlatpack + id: SpaceHeaterFlatpack + name: space heater flatpack + description: A flatpack used for constructing a space heater. + components: + - type: Flatpack + entity: SpaceHeaterAnchored From f84e87a010be663d7d3c045c50c4904a00417ca6 Mon Sep 17 00:00:00 2001 From: Ady4ik <141335742+Ady4ik@users.noreply.github.com> Date: Sun, 26 May 2024 00:07:18 +0300 Subject: [PATCH 040/112] Move PendingZombieComponent to Shared (#28143) * Move PendingZombieComponent to Shared * network me boy --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- .../Chemistry/ReagentEffects/CauseZombieInfection.cs | 1 + .../Chemistry/ReagentEffects/CureZombieInfection.cs | 1 + .../Zombies/PendingZombieComponent.cs | 5 +++-- 3 files changed, 5 insertions(+), 2 deletions(-) rename {Content.Server => Content.Shared}/Zombies/PendingZombieComponent.cs (94%) diff --git a/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs b/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs index 029b1495002..96c57f74653 100644 --- a/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs +++ b/Content.Server/Chemistry/ReagentEffects/CauseZombieInfection.cs @@ -2,6 +2,7 @@ using Content.Shared.Chemistry.Reagent; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Content.Shared.Zombies; namespace Content.Server.Chemistry.ReagentEffects; diff --git a/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs b/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs index d56fc115310..20e2c015c46 100644 --- a/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs +++ b/Content.Server/Chemistry/ReagentEffects/CureZombieInfection.cs @@ -2,6 +2,7 @@ using Content.Shared.Chemistry.Reagent; using Robust.Shared.Configuration; using Robust.Shared.Prototypes; +using Content.Shared.Zombies; namespace Content.Server.Chemistry.ReagentEffects; diff --git a/Content.Server/Zombies/PendingZombieComponent.cs b/Content.Shared/Zombies/PendingZombieComponent.cs similarity index 94% rename from Content.Server/Zombies/PendingZombieComponent.cs rename to Content.Shared/Zombies/PendingZombieComponent.cs index 811d3f96440..0fb61c84df1 100644 --- a/Content.Server/Zombies/PendingZombieComponent.cs +++ b/Content.Shared/Zombies/PendingZombieComponent.cs @@ -1,12 +1,13 @@ using Content.Shared.Damage; +using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -namespace Content.Server.Zombies; +namespace Content.Shared.Zombies; /// /// Temporary because diseases suck. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class PendingZombieComponent : Component { /// From 436344c36da8af99d70e2d3247f694d639160931 Mon Sep 17 00:00:00 2001 From: DrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com> Date: Sat, 25 May 2024 14:07:27 -0700 Subject: [PATCH 041/112] Make it possible to hide full health bars below a total damage threshold (#28127) * Make it possible to hide full health bars below a total damage threshold * Fix not setting state --- .../Overlays/EntityHealthBarOverlay.cs | 20 +++++++------- .../Damage/Components/DamageableComponent.cs | 26 +++++++++++-------- .../Damage/Systems/DamageableSystem.cs | 6 ++--- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/Content.Client/Overlays/EntityHealthBarOverlay.cs b/Content.Client/Overlays/EntityHealthBarOverlay.cs index c1c0ae93ec1..2b2ff14a22b 100644 --- a/Content.Client/Overlays/EntityHealthBarOverlay.cs +++ b/Content.Client/Overlays/EntityHealthBarOverlay.cs @@ -1,15 +1,14 @@ +using System.Numerics; +using Content.Client.UserInterface.Systems; using Content.Shared.Damage; using Content.Shared.FixedPoint; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; +using Content.Shared.StatusIcon.Components; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.Enums; -using System.Numerics; -using Content.Shared.StatusIcon.Components; -using Content.Client.UserInterface.Systems; -using Robust.Shared.Prototypes; using static Robust.Shared.Maths.Color; namespace Content.Client.Overlays; @@ -79,6 +78,10 @@ protected override void Draw(in OverlayDrawArgs args) continue; } + // we are all progressing towards death every day + if (CalcProgress(uid, mobStateComponent, damageableComponent, mobThresholdsComponent) is not { } deathProgress) + continue; + var worldPosition = _transform.GetWorldPosition(xform); var worldMatrix = Matrix3.CreateTranslation(worldPosition); @@ -91,10 +94,6 @@ protected override void Draw(in OverlayDrawArgs args) var widthOfMob = bounds.Width * EyeManager.PixelsPerMeter; var position = new Vector2(-widthOfMob / EyeManager.PixelsPerMeter / 2, yOffset / EyeManager.PixelsPerMeter); - - // we are all progressing towards death every day - (float ratio, bool inCrit) deathProgress = CalcProgress(uid, mobStateComponent, damageableComponent, mobThresholdsComponent); - var color = GetProgressColor(deathProgress.ratio, deathProgress.inCrit); // Hardcoded width of the progress bar because it doesn't match the texture. @@ -122,10 +121,13 @@ protected override void Draw(in OverlayDrawArgs args) /// /// Returns a ratio between 0 and 1, and whether the entity is in crit. /// - private (float, bool) CalcProgress(EntityUid uid, MobStateComponent component, DamageableComponent dmg, MobThresholdsComponent thresholds) + private (float ratio, bool inCrit)? CalcProgress(EntityUid uid, MobStateComponent component, DamageableComponent dmg, MobThresholdsComponent thresholds) { if (_mobStateSystem.IsAlive(uid, component)) { + if (dmg.HealthBarThreshold != null && dmg.TotalDamage < dmg.HealthBarThreshold) + return null; + if (!_mobThresholdSystem.TryGetThresholdForState(uid, MobState.Critical, out var threshold, thresholds) && !_mobThresholdSystem.TryGetThresholdForState(uid, MobState.Dead, out threshold, thresholds)) return (1, false); diff --git a/Content.Shared/Damage/Components/DamageableComponent.cs b/Content.Shared/Damage/Components/DamageableComponent.cs index be66d51e3bc..f8205568f10 100644 --- a/Content.Shared/Damage/Components/DamageableComponent.cs +++ b/Content.Shared/Damage/Components/DamageableComponent.cs @@ -5,8 +5,6 @@ using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Shared.Damage { @@ -18,7 +16,7 @@ namespace Content.Shared.Damage /// may also have resistances to certain damage types, defined via a . /// [RegisterComponent] - [NetworkedComponent()] + [NetworkedComponent] [Access(typeof(DamageableSystem), Other = AccessPermissions.ReadExecute)] public sealed partial class DamageableComponent : Component { @@ -26,8 +24,8 @@ public sealed partial class DamageableComponent : Component /// This specifies what damage types are supported by this component. /// If null, all damage types will be supported. /// - [DataField("damageContainer", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? DamageContainerID; + [DataField("damageContainer")] + public ProtoId? DamageContainerID; /// /// This will be applied to any damage that is dealt to this container, @@ -37,8 +35,8 @@ public sealed partial class DamageableComponent : Component /// Though DamageModifierSets can be deserialized directly, we only want to use the prototype version here /// to reduce duplication. /// - [DataField("damageModifierSet", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? DamageModifierSetId; + [DataField("damageModifierSet")] + public ProtoId? DamageModifierSetId; /// /// All the damage information is stored in this . @@ -46,7 +44,7 @@ public sealed partial class DamageableComponent : Component /// /// If this data-field is specified, this allows damageable components to be initialized with non-zero damage. /// - [DataField("damage", readOnly: true)] //todo remove this readonly when implementing writing to damagespecifier + [DataField(readOnly: true)] //todo remove this readonly when implementing writing to damagespecifier public DamageSpecifier Damage = new(); /// @@ -64,8 +62,8 @@ public sealed partial class DamageableComponent : Component [ViewVariables] public FixedPoint2 TotalDamage; - [DataField("radiationDamageTypes", customTypeSerializer: typeof(PrototypeIdListSerializer))] - public List RadiationDamageTypeIDs = new() { "Radiation" }; + [DataField("radiationDamageTypes")] + public List> RadiationDamageTypeIDs = new() { "Radiation" }; [DataField] public Dictionary> HealthIcons = new() @@ -77,6 +75,9 @@ public sealed partial class DamageableComponent : Component [DataField] public ProtoId RottingIcon = "HealthIconRotting"; + + [DataField] + public FixedPoint2? HealthBarThreshold; } [Serializable, NetSerializable] @@ -84,13 +85,16 @@ public sealed class DamageableComponentState : ComponentState { public readonly Dictionary DamageDict; public readonly string? ModifierSetId; + public readonly FixedPoint2? HealthBarThreshold; public DamageableComponentState( Dictionary damageDict, - string? modifierSetId) + string? modifierSetId, + FixedPoint2? healthBarThreshold) { DamageDict = damageDict; ModifierSetId = modifierSetId; + HealthBarThreshold = healthBarThreshold; } } } diff --git a/Content.Shared/Damage/Systems/DamageableSystem.cs b/Content.Shared/Damage/Systems/DamageableSystem.cs index 4aaf380c47d..3c3e1b736df 100644 --- a/Content.Shared/Damage/Systems/DamageableSystem.cs +++ b/Content.Shared/Damage/Systems/DamageableSystem.cs @@ -1,5 +1,4 @@ using System.Linq; -using Content.Shared.Administration.Logs; using Content.Shared.Damage.Prototypes; using Content.Shared.FixedPoint; using Content.Shared.Inventory; @@ -229,12 +228,12 @@ private void DamageableGetState(EntityUid uid, DamageableComponent component, re { if (_netMan.IsServer) { - args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId); + args.State = new DamageableComponentState(component.Damage.DamageDict, component.DamageModifierSetId, component.HealthBarThreshold); } else { // avoid mispredicting damage on newly spawned entities. - args.State = new DamageableComponentState(component.Damage.DamageDict.ShallowClone(), component.DamageModifierSetId); + args.State = new DamageableComponentState(component.Damage.DamageDict.ShallowClone(), component.DamageModifierSetId, component.HealthBarThreshold); } } @@ -268,6 +267,7 @@ private void DamageableHandleState(EntityUid uid, DamageableComponent component, } component.DamageModifierSetId = state.ModifierSetId; + component.HealthBarThreshold = state.HealthBarThreshold; // Has the damage actually changed? DamageSpecifier newDamage = new() { DamageDict = new(state.DamageDict) }; From d99e73ed92f06d22840e38a4e41ac8bfb8e93cdd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 25 May 2024 20:32:32 -0400 Subject: [PATCH 042/112] Update Credits (#28288) 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 172dd2ad37a..b7ec22c0b0d 100644 --- a/Resources/Credits/GitHub.txt +++ b/Resources/Credits/GitHub.txt @@ -1 +1 @@ -0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, casperr04, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, DuskyJay, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, KEEYNy, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, Subversionary, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, Theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem +0x6273, 2013HORSEMEATSCANDAL, 20kdc, 21Melkuu, 4dplanner, 612git, 778b, Ablankmann, Acruid, actioninja, adamsong, Admiral-Obvious-001, Adrian16199, Aerocrux, Aexxie, Afrokada, Agoichi, Ahion, AJCM-git, AjexRose, Alekshhh, AlexMorgan3817, AlexUm418, AlmondFlour, AlphaQwerty, Altoids1, amylizzle, ancientpower, ArchPigeon, Arendian, arimah, Arteben, AruMoon, as334, AsikKEsel, asperger-sind, aspiringLich, avghdev, AzzyIsNotHere, BananaFlambe, Baptr0b0t, BasedUser, beck-thompson, BellwetherLogic, BGare, bhenrich, BingoJohnson-zz, BismarckShuffle, Bixkitts, Blackern5000, Blazeror, blueDev2, Boaz1111, BobdaBiscuit, brainfood1183, Brandon-Huu, Bright0, brndd, BubblegumBlue, BYONDFuckery, c4llv07e, CakeQ, Callmore, CaptainSqrBeard, Carbonhell, CatTheSystem, Centronias, chairbender, Charlese2, Cheackraze, cheesePizza2, Chief-Engineer, chromiumboy, Chronophylos, Ciac32, clement-or, Clyybber, Cojoke-dot, ColdAutumnRain, collinlunn, ComicIronic, coolmankid12345, corentt, crazybrain23, creadth, CrigCrag, Crotalus, CrudeWax, CrzyPotato, Cyberboss, d34d10cc, Daemon, daerSeebaer, dahnte, dakamakat, dakimasu, DamianX, DangerRevolution, daniel-cr, Darkenson, DawBla, dch-GH, Deahaka, DEATHB4DEFEAT, DeathCamel58, deathride58, DebugOk, Decappi, deepdarkdepths, deepy, Delete69, deltanedas, DerbyX, DexlerXD, Doctor-Cpu, DoctorBeard, DogZeroX, dontbetank, Doru991, DoubleRiceEddiedd, DoutorWhite, DrMelon, DrSmugleaf, drteaspoon420, DTanxxx, DubiousDoggo, Duddino, DuskyJay, Dutch-VanDerLinde, Easypoller, eclips_e, EdenTheLiznerd, EEASAS, Efruit, ElectroSR, elthundercloud, Emisse, EmoGarbage404, Endecc, enumerate0, eoineoineoin, ERORR404V1, Errant-4, estacaoespacialpirata, exincore, exp111, Fahasor, FairlySadPanda, ficcialfaint, Fildrance, FillerVK, Fishfish458, Flareguy, FluffiestFloof, FluidRock, FoLoKe, fooberticus, Fortune117, freeman2651, Froffy025, Fromoriss, FungiFellow, GalacticChimp, gbasood, Geekyhobo, Genkail, Ghagliiarghii, Git-Nivrak, github-actions[bot], gituhabu, GNF54, Golinth, GoodWheatley, Gotimanga, graevy, GreyMario, gusxyz, Gyrandola, h3half, Hanzdegloker, Hardly3D, harikattar, Hebiman, Henry12116, HerCoyote23, hitomishirichan, Hmeister-real, HoofedEar, hord-brayden, hubismal, Hugal31, Huxellberger, Hyenh, iacore, IamVelcroboy, icekot8, igorsaux, ike709, Illiux, Ilya246, IlyaElDunaev, Injazz, Insineer, IntegerTempest, Interrobang01, IProduceWidgets, ItsMeThom, j-giebel, Jackal298, Jackrost, jamessimo, janekvap, Jark255, JerryImMouse, Jessetriesagain, jessicamaybe, Jezithyr, jicksaw, JiimBob, JoeHammad1844, joelhed, JohnGinnane, johnku1, joshepvodka, jproads, Jrpl, juliangiebel, JustArt1m, JustCone14, JustinTether, JustinTrotter, K-Dynamic, KaiShibaa, kalane15, kalanosh, KEEYNy, Kelrak, kerisargit, keronshb, KIBORG04, Killerqu00, KingFroozy, kira-er, Kit0vras, KittenColony, Ko4ergaPunk, komunre, koteq, Krunklehorn, Kukutis96513, kxvvv, Lamrr, LankLTE, lapatison, Leander-0, LetterN, Level10Cybermancer, lever1209, liltenhead, LittleBuilderJane, Lomcastar, LordCarve, LordEclipse, luckyshotpictures, Lukasz825700516, lunarcomets, luringens, lvvova1, lzimann, lzk228, MACMAN2003, Macoron, MagnusCrowe, ManelNavola, Mangohydra, Matz05, MehimoNemo, MeltedPixel, MemeProof, Menshin, Mervill, metalgearsloth, mhamsterr, MilenVolf, Minty642, Mirino97, mirrorcult, MishaUnity, MisterMecky, Mith-randalf, Moneyl, Moomoobeef, moony, Morb0, Mr0maks, musicmanvr, Myakot, Myctai, N3X15, Nairodian, Naive817, namespace-Memory, NickPowers43, nikthechampiongr, Nimfar11, Nirnael, nmajask, nok-ko, Nopey, notafet, notquitehadouken, noudoit, noverd, nuke-haus, NULL882, OctoRocket, OldDanceJacket, onoira, osjarw, Owai-Seek, pali6, Pangogie, patrikturi, PaulRitter, Peptide90, peptron1, Phantom-Lily, pigeonpeas, pissdemon, PixelTheKermit, PJB3005, Plykiya, pofitlo, pointer-to-null, PolterTzi, PoorMansDreams, potato1234x, ProfanedBane, PrPleGoo, ps3moira, Psychpsyo, psykzz, PuroSlavKing, PursuitInAshes, quatre, QuietlyWhisper, qwerltaz, Radosvik, Radrark, Rainbeon, Rainfey, Rane, ravage123321, rbertoche, Redict, RedlineTriad, RednoWCirabrab, RemberBM, RemieRichards, RemTim, rene-descartes2021, RiceMar1244, RieBi, Rinkashikachi, Rockdtben, rolfero, rosieposieeee, RumiTiger, Saakra, Samsterious, SaphireLattice, ScalyChimp, scrato, Scribbles0, Serkket, SethLafuente, ShadowCommander, Shadowtheprotogen546, shampunj, SignalWalker, Simyon264, Sirionaut, siyengar04, Skarletto, Skrauz, Skyedra, SlamBamActionman, slarticodefast, Slava0135, snebl, Snowni, snowsignal, SonicHDC, SoulFN, SoulSloth, SpaceManiac, SpeltIncorrectyl, SphiraI, spoogemonster, ssdaniel24, Stealthbomber16, StrawberryMoses, Subversionary, superjj18, SweptWasTaken, Szunti, takemysoult, TaralGit, Tayrtahn, tday93, TekuNut, TemporalOroboros, tentekal, Terraspark4941, tgrkzus, thatrandomcanadianguy, TheArturZh, theashtronaut, thedraccx, themias, theomund, theOperand, TheShuEd, TimrodDX, Titian3, tkdrg, tmtmtl30, TokenStyle, tom-leys, tomasalves8, Tomeno, tosatur, TsjipTsjip, Tunguso4ka, TurboTrackerss14, Tyler-IN, Tyzemol, UbaserB, UBlueberry, UKNOWH, Uriende, UristMcDorf, Vaaankas, Varen, VasilisThePikachu, veliebm, Veritius, Vermidia, Verslebas, VigersRay, Visne, volundr-, Voomra, Vordenburg, vulppine, wafehling, waylon531, weaversam8, whateverusername0, Willhelm53, wixoaGit, WlarusFromDaSpace, wrexbe, xRiriq, yathxyz, Ygg01, YotaXP, YuriyKiss, zach-hill, Zandario, Zap527, Zealith-Gamer, ZelteHonor, zerorulez, zionnBE, zlodo, ZNixian, ZoldorfTheWizard, Zumorica, Zymem From 6574c9b7c31dc05831a95ddf121f2c29d9479fa4 Mon Sep 17 00:00:00 2001 From: Errant <35878406+Errant-4@users.noreply.github.com> Date: Sun, 26 May 2024 03:17:01 +0200 Subject: [PATCH 043/112] Changing hands unwields item (#28161) Unhand me, fiend --- Content.Shared/Wieldable/WieldableSystem.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index cee6c65fa11..c09044f84b4 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -41,6 +41,7 @@ public override void Initialize() SubscribeLocalEvent(OnItemLeaveHand); SubscribeLocalEvent(OnVirtualItemDeleted); SubscribeLocalEvent>(AddToggleWieldVerb); + SubscribeLocalEvent(OnDeselectWieldable); SubscribeLocalEvent(OnMeleeAttempt); SubscribeLocalEvent(OnShootAttempt); @@ -91,6 +92,14 @@ private void OnGunWielded(EntityUid uid, GunWieldBonusComponent component, ref I _gun.RefreshModifiers(uid); } + private void OnDeselectWieldable(EntityUid uid, WieldableComponent component, HandDeselectedEvent args) + { + if (!component.Wielded) + return; + + TryUnwield(uid, component, args.User); + } + private void OnGunRefreshModifiers(Entity bonus, ref GunRefreshModifiersEvent args) { if (TryComp(bonus, out WieldableComponent? wield) && From d5aae7a48b67d1d14322a2b5ae9fff2c4f0b9bd0 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 26 May 2024 01:18:07 +0000 Subject: [PATCH 044/112] 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 7880f0a8d13..4ec38486dac 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Errant - changes: - - message: Species info is now available in the Guidebook and in the character editor. - type: Add - id: 6120 - time: '2024-03-11T03:01:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25844 - author: Dygon changes: - message: 'The following criminal record statuses have been added: Suspect, Discharged, @@ -3875,3 +3868,10 @@ id: 6619 time: '2024-05-25T20:23:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28130 +- author: Errant + changes: + - message: Changing hands while wielding an item will now immediately unwield it. + type: Tweak + id: 6620 + time: '2024-05-26T01:17:01.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28161 From 12841da9a1de8e552df1117d945dd2b189ffcc4d Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 26 May 2024 14:11:37 +1200 Subject: [PATCH 045/112] Fix storage UI interactions (#28291) * Fix storage UI interactions * Add VV support --- .../UserInterface/Systems/Storage/Controls/ItemGridPiece.cs | 4 +++- Content.Shared/Interaction/SharedInteractionSystem.cs | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs index f436cc8c39b..dd9986e4c6e 100644 --- a/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs +++ b/Content.Client/UserInterface/Systems/Storage/Controls/ItemGridPiece.cs @@ -9,7 +9,7 @@ namespace Content.Client.UserInterface.Systems.Storage.Controls; -public sealed class ItemGridPiece : Control +public sealed class ItemGridPiece : Control, IEntityControl { private readonly IEntityManager _entityManager; private readonly StorageUIController _storageController; @@ -287,6 +287,8 @@ public static Vector2 GetCenterOffset(Entity entity, ItemStorage var actualSize = new Vector2(boxSize.X + 1, boxSize.Y + 1); return actualSize * new Vector2i(8, 8); } + + public EntityUid? UiEntity => Entity; } public enum ItemGridPieceMarks diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 3324ce5b9b8..6f6777ee964 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -1167,7 +1167,7 @@ public bool CanAccessViaStorage(EntityUid user, EntityUid target, BaseContainer return false; // we don't check if the user can access the storage entity itself. This should be handed by the UI system. - return _ui.IsUiOpen(target, StorageComponent.StorageUiKey.Key, user); + return _ui.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); } /// From b8020776cc9eb9e8f6b487e5ba34f87d144b3b24 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 26 May 2024 02:12:43 +0000 Subject: [PATCH 046/112] 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 4ec38486dac..36276ccfcef 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,15 +1,4 @@ Entries: -- author: Dygon - changes: - - message: 'The following criminal record statuses have been added: Suspect, Discharged, - Paroled.' - type: Add - - message: Security huds now show an icon on entities that have a visible name linked - to a criminal record. - type: Add - id: 6121 - time: '2024-03-11T03:12:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25192 - author: Lank changes: - message: The detective is no longer independent, and again works under Security. @@ -3875,3 +3864,10 @@ id: 6620 time: '2024-05-26T01:17:01.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28161 +- author: ElectroJr + changes: + - message: Fixed being unable to interact with items via storage UIs + type: Fix + id: 6621 + time: '2024-05-26T02:11:37.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28291 From a38e6475cb5d0505771ec827bcd9b4336a0392ae Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 26 May 2024 15:18:27 +1200 Subject: [PATCH 047/112] Fix stripping not marking interactions as handled (#28292) --- Content.Server/Strip/StrippableSystem.cs | 33 ++----------------- .../Strip/SharedStrippableSystem.cs | 27 +++++++++++++-- 2 files changed, 26 insertions(+), 34 deletions(-) diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 6f0a1ecb328..397396de501 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.Administration.Logs; using Content.Server.Ensnaring; -using Content.Shared.CombatMode; using Content.Shared.Cuffs; using Content.Shared.Cuffs.Components; using Content.Shared.Database; @@ -10,7 +9,6 @@ using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.IdentityManagement; -using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Inventory; using Content.Shared.Inventory.VirtualItem; @@ -18,7 +16,6 @@ using Content.Shared.Strip; using Content.Shared.Strip.Components; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Utility; @@ -28,7 +25,6 @@ public sealed class StrippableSystem : SharedStrippableSystem { [Dependency] private readonly InventorySystem _inventorySystem = default!; [Dependency] private readonly EnsnareableSystem _ensnaringSystem = default!; - [Dependency] private readonly UserInterfaceSystem _userInterfaceSystem = default!; [Dependency] private readonly SharedCuffableSystem _cuffableSystem = default!; [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; @@ -45,7 +41,6 @@ public override void Initialize() SubscribeLocalEvent>(AddStripVerb); SubscribeLocalEvent>(AddStripExamineVerb); - SubscribeLocalEvent(OnActivateInWorld); // BUI SubscribeLocalEvent(OnStripButtonPressed); @@ -68,7 +63,7 @@ private void AddStripVerb(EntityUid uid, StrippableComponent component, GetVerbs { Text = Loc.GetString("strip-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), + Act = () => TryOpenStrippingUi(args.User, (uid, component), true), }; args.Verbs.Add(verb); @@ -86,37 +81,13 @@ private void AddStripExamineVerb(EntityUid uid, StrippableComponent component, G { Text = Loc.GetString("strip-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new("/Textures/Interface/VerbIcons/outfit.svg.192dpi.png")), - Act = () => StartOpeningStripper(args.User, (uid, component), true), + Act = () => TryOpenStrippingUi(args.User, (uid, component), true), Category = VerbCategory.Examine, }; args.Verbs.Add(verb); } - private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) - { - if (args.Target == args.User) - return; - - if (!HasComp(args.User)) - return; - - StartOpeningStripper(args.User, (uid, component)); - } - - public override void StartOpeningStripper(EntityUid user, Entity strippable, bool openInCombat = false) - { - base.StartOpeningStripper(user, strippable, openInCombat); - - if (TryComp(user, out var mode) && mode.IsInCombatMode && !openInCombat) - return; - - if (HasComp(user)) - { - _userInterfaceSystem.OpenUi(strippable.Owner, StrippingUiKey.Key, user); - } - } - private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { if (args.Actor is not { Valid: true } user || diff --git a/Content.Shared/Strip/SharedStrippableSystem.cs b/Content.Shared/Strip/SharedStrippableSystem.cs index 59b24ec943e..075cf81a4cb 100644 --- a/Content.Shared/Strip/SharedStrippableSystem.cs +++ b/Content.Shared/Strip/SharedStrippableSystem.cs @@ -1,17 +1,31 @@ +using Content.Shared.CombatMode; using Content.Shared.DragDrop; using Content.Shared.Hands.Components; +using Content.Shared.Interaction; using Content.Shared.Strip.Components; namespace Content.Shared.Strip; public abstract class SharedStrippableSystem : EntitySystem { + [Dependency] private readonly SharedUserInterfaceSystem _ui = default!; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCanDropOn); SubscribeLocalEvent(OnCanDrop); SubscribeLocalEvent(OnDragDrop); + SubscribeLocalEvent(OnActivateInWorld); + } + + private void OnActivateInWorld(EntityUid uid, StrippableComponent component, ActivateInWorldEvent args) + { + if (args.Handled || args.Target == args.User) + return; + + if (TryOpenStrippingUi(args.User, (uid, component))) + args.Handled = true; } public (TimeSpan Time, bool Stealth) GetStripTimeModifiers(EntityUid user, EntityUid target, TimeSpan initialTime) @@ -29,13 +43,20 @@ private void OnDragDrop(EntityUid uid, StrippableComponent component, ref DragDr if (args.Handled || args.Target != args.User) return; - StartOpeningStripper(args.User, (uid, component)); - args.Handled = true; + if (TryOpenStrippingUi(args.User, (uid, component))) + args.Handled = true; } - public virtual void StartOpeningStripper(EntityUid user, Entity component, bool openInCombat = false) + public bool TryOpenStrippingUi(EntityUid user, Entity target, bool openInCombat = false) { + if (!openInCombat && TryComp(user, out var mode) && mode.IsInCombatMode) + return false; + + if (!HasComp(user)) + return false; + _ui.OpenUi(target.Owner, StrippingUiKey.Key, user); + return true; } private void OnCanDropOn(EntityUid uid, StrippingComponent component, ref CanDropTargetEvent args) From b177fb8179eaf7a3b1c9fc9dabe36835e582cd06 Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Sun, 26 May 2024 15:20:29 +1200 Subject: [PATCH 048/112] Make NetworkConfigurator use BoundUserInterfaceCheckRangeEvent (#28293) --- .../Systems/NetworkConfiguratorSystem.cs | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 34601241585..402d005dd47 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -63,9 +63,21 @@ public override void Initialize() SubscribeLocalEvent(OnToggleLinks); SubscribeLocalEvent(OnConfigButtonPressed); + SubscribeLocalEvent(OnUiRangeCheck); + SubscribeLocalEvent(OnComponentRemoved); } + private void OnUiRangeCheck(Entity ent, ref BoundUserInterfaceCheckRangeEvent args) + { + if (ent.Comp.ActiveDeviceList == null || args.Result == BoundUserInterfaceRangeResult.Fail) + return; + + DebugTools.Assert(Exists(ent.Comp.ActiveDeviceList)); + if (!_interactionSystem.InRangeUnobstructed(args.Actor!, ent.Comp.ActiveDeviceList.Value)) + args.Result = BoundUserInterfaceRangeResult.Fail; + } + private void OnShutdown(EntityUid uid, NetworkConfiguratorComponent component, ComponentShutdown args) { ClearDevices(uid, component); @@ -75,23 +87,6 @@ private void OnShutdown(EntityUid uid, NetworkConfiguratorComponent component, C component.ActiveDeviceList = null; } - public override void Update(float frameTime) - { - base.Update(frameTime); - - var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var component)) - { - if (component.ActiveDeviceList != null - && EntityManager.EntityExists(component.ActiveDeviceList.Value) - && _interactionSystem.InRangeUnobstructed(uid, component.ActiveDeviceList.Value)) - continue; - - //The network configurator is a handheld device. There can only ever be an ui session open for the player holding the device. - _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); - } - } - private void OnMapInit(EntityUid uid, NetworkConfiguratorComponent component, MapInitEvent args) { UpdateListUiState(uid, component); From d747fa98f8d62344aeab379731c43335341bfc16 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 26 May 2024 00:46:41 -0400 Subject: [PATCH 049/112] actually fix magic mirrors (#28282) --- .../MagicMirror/MagicMirrorSystem.cs | 32 +++++-------------- .../MagicMirror/SharedMagicMirrorSystem.cs | 21 ++++++++++-- 2 files changed, 26 insertions(+), 27 deletions(-) diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index fc1bff97566..8d8a6bfa3b4 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -1,7 +1,6 @@ using System.Linq; using Content.Server.DoAfter; using Content.Server.Humanoid; -using Content.Shared.UserInterface; using Content.Shared.DoAfter; using Content.Shared.Humanoid; using Content.Shared.Humanoid.Markings; @@ -24,7 +23,6 @@ public sealed class MagicMirrorSystem : SharedMagicMirrorSystem public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnOpenUIAttempt); Subs.BuiEvents(MagicMirrorUiKey.Key, subs => @@ -36,7 +34,6 @@ public override void Initialize() subs.Event(OnTryMagicMirrorRemoveSlot); }); - SubscribeLocalEvent(OnMagicMirrorInteract); SubscribeLocalEvent(OnSelectSlotDoAfter); SubscribeLocalEvent(OnChangeColorDoAfter); @@ -44,23 +41,6 @@ public override void Initialize() SubscribeLocalEvent(OnAddSlotDoAfter); } - private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) - { - if (!args.CanReach || args.Target == null) - return; - - if (!_uiSystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) - return; - - UpdateInterface(mirror.Owner, args.Target.Value, mirror.Comp); - } - - private void OnOpenUIAttempt(EntityUid uid, MagicMirrorComponent mirror, ActivatableUIOpenAttemptEvent args) - { - if (!HasComp(args.User)) - args.Cancel(); - } - private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, MagicMirrorSelectMessage message) { if (component.Target is not { } target) @@ -83,7 +63,8 @@ private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); @@ -137,7 +118,8 @@ private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent com BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; } @@ -189,7 +171,8 @@ private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent comp BreakOnDamage = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); @@ -241,7 +224,8 @@ private void OnTryMagicMirrorAddSlot(EntityUid uid, MagicMirrorComponent compone BreakOnMove = true, BreakOnHandChange = false, NeedHand = true - }, out var doAfterId); + }, + out var doAfterId); component.DoAfter = doAfterId; _audio.PlayPvs(component.ChangeHairSound, uid); diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index 433ad6b4fc9..ea96d504c6e 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -11,15 +11,27 @@ namespace Content.Shared.MagicMirror; public abstract class SharedMagicMirrorSystem : EntitySystem { [Dependency] private readonly SharedInteractionSystem _interaction = default!; - [Dependency] protected readonly SharedUserInterfaceSystem _uiSystem = default!; + [Dependency] protected readonly SharedUserInterfaceSystem UISystem = default!; public override void Initialize() { base.Initialize(); + SubscribeLocalEvent(OnMagicMirrorInteract); SubscribeLocalEvent(OnBeforeUIOpen); SubscribeLocalEvent(OnMirrorRangeCheck); } + private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) + { + if (!args.CanReach || args.Target == null) + return; + + if (!UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) + return; + + UpdateInterface(mirror, args.Target.Value, mirror); + } + private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) { if (args.Result == BoundUserInterfaceRangeResult.Fail) @@ -33,7 +45,9 @@ private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, r private void OnBeforeUIOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) { - ent.Comp.Target ??= args.User; + if (args.User != ent.Comp.Target && ent.Comp.Target != null) + return; + UpdateInterface(ent, args.User, ent); } @@ -41,6 +55,7 @@ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMi { if (!TryComp(targetUid, out var humanoid)) return; + component.Target ??= targetUid; var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings) ? new List(hairMarkings) @@ -59,7 +74,7 @@ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMi // TODO: Component states component.Target = targetUid; - _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + UISystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); Dirty(mirrorUid, component); } } From af10de61d313ae539ce24933b2986ee63a8f6a07 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 26 May 2024 04:47:47 +0000 Subject: [PATCH 050/112] 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 36276ccfcef..0f5bddbcdbe 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Lank - changes: - - message: The detective is no longer independent, and again works under Security. - type: Tweak - id: 6122 - time: '2024-03-11T03:33:08.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25986 - author: pigeonpeas changes: - message: added new expedition ambience @@ -3871,3 +3864,10 @@ id: 6621 time: '2024-05-26T02:11:37.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28291 +- author: EmoGarbage404 + changes: + - message: Properly fix magic mirrors + type: Fix + id: 6622 + time: '2024-05-26T04:46:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28282 From 492ccc93d01647b586755da27f88f4cbb62e7ccc Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Sun, 26 May 2024 05:14:29 +0000 Subject: [PATCH 051/112] fix antag selection being evil (#28197) * fix antag selection being evil * fix test * untroll the other tests * remove role timer troll * Allow tests to modify antag preferences * Fix antag selection * Misc test fixes * Add AntagPreferenceTest * Fix lazy mistakes * Test cleanup * Try stop players in lobbies from being assigned mid-round antags * ranting * I am going insane --------- Co-authored-by: deltanedas <@deltanedas:kde.org> Co-authored-by: ElectroJr --- .../Pair/TestPair.Helpers.cs | 28 +++++++ Content.IntegrationTests/PoolManager.cs | 4 +- .../Tests/GameRules/AntagPreferenceTest.cs | 76 +++++++++++++++++++ .../Tests/GameRules/NukeOpsTest.cs | 4 + .../Click/InteractionSystemTests.cs | 1 - .../Tests/ResettingEntitySystemTests.cs | 3 - .../Antag/AntagSelectionSystem.API.cs | 9 +++ Content.Server/Antag/AntagSelectionSystem.cs | 72 +++++++++--------- .../GameTicking/GameTicker.RoundFlow.cs | 2 +- .../Managers/IServerPreferencesManager.cs | 2 + .../Managers/ServerPreferencesManager.cs | 30 ++++---- Content.Shared/Antag/AntagAcceptability.cs | 8 ++ Content.Shared/Roles/Jobs/SharedJobSystem.cs | 4 +- 13 files changed, 182 insertions(+), 61 deletions(-) create mode 100644 Content.IntegrationTests/Tests/GameRules/AntagPreferenceTest.cs diff --git a/Content.IntegrationTests/Pair/TestPair.Helpers.cs b/Content.IntegrationTests/Pair/TestPair.Helpers.cs index 0ea6d3e2dcc..cc83232a066 100644 --- a/Content.IntegrationTests/Pair/TestPair.Helpers.cs +++ b/Content.IntegrationTests/Pair/TestPair.Helpers.cs @@ -2,6 +2,9 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Content.Server.Preferences.Managers; +using Content.Shared.Preferences; +using Content.Shared.Roles; using Robust.Shared.GameObjects; using Robust.Shared.Map; using Robust.Shared.Prototypes; @@ -128,4 +131,29 @@ public List GetPrototypesWithComponent( return list; } + + /// + /// Helper method for enabling or disabling a antag role + /// + public async Task SetAntagPref(ProtoId id, bool value) + { + var prefMan = Server.ResolveDependency(); + + var prefs = prefMan.GetPreferences(Client.User!.Value); + // what even is the point of ICharacterProfile if we always cast it to HumanoidCharacterProfile to make it usable? + var profile = (HumanoidCharacterProfile) prefs.SelectedCharacter; + + Assert.That(profile.AntagPreferences.Contains(id), Is.EqualTo(!value)); + var newProfile = profile.WithAntagPreference(id, value); + + await Server.WaitPost(() => + { + prefMan.SetProfile(Client.User.Value, prefs.SelectedCharacterIndex, newProfile).Wait(); + }); + + // And why the fuck does it always create a new preference and profile object instead of just reusing them? + var newPrefs = prefMan.GetPreferences(Client.User.Value); + var newProf = (HumanoidCharacterProfile) newPrefs.SelectedCharacter; + Assert.That(newProf.AntagPreferences.Contains(id), Is.EqualTo(value)); + } } diff --git a/Content.IntegrationTests/PoolManager.cs b/Content.IntegrationTests/PoolManager.cs index 25e6c7ef26f..3b49ffcf847 100644 --- a/Content.IntegrationTests/PoolManager.cs +++ b/Content.IntegrationTests/PoolManager.cs @@ -65,11 +65,11 @@ public static partial class PoolManager options.BeforeStart += () => { + // Server-only systems (i.e., systems that subscribe to events with server-only components) var entSysMan = IoCManager.Resolve(); - entSysMan.LoadExtraSystemType(); - entSysMan.LoadExtraSystemType(); entSysMan.LoadExtraSystemType(); entSysMan.LoadExtraSystemType(); + IoCManager.Resolve().GetSawmill("loc").Level = LogLevel.Error; IoCManager.Resolve() .OnValueChanged(RTCVars.FailureLogLevel, value => logHandler.FailureLevel = value, true); diff --git a/Content.IntegrationTests/Tests/GameRules/AntagPreferenceTest.cs b/Content.IntegrationTests/Tests/GameRules/AntagPreferenceTest.cs new file mode 100644 index 00000000000..662ea3b9747 --- /dev/null +++ b/Content.IntegrationTests/Tests/GameRules/AntagPreferenceTest.cs @@ -0,0 +1,76 @@ +#nullable enable +using System.Collections.Generic; +using System.Linq; +using Content.Server.Antag; +using Content.Server.Antag.Components; +using Content.Server.GameTicking; +using Content.Shared.GameTicking; +using Robust.Shared.GameObjects; +using Robust.Shared.Player; +using Robust.Shared.Random; + +namespace Content.IntegrationTests.Tests.GameRules; + +// Once upon a time, players in the lobby weren't ever considered eligible for antag roles. +// Lets not let that happen again. +[TestFixture] +public sealed class AntagPreferenceTest +{ + [Test] + public async Task TestLobbyPlayersValid() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + DummyTicker = false, + Connected = true, + InLobby = true + }); + + var server = pair.Server; + var client = pair.Client; + var ticker = server.System(); + var sys = server.System(); + + // Initially in the lobby + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); + Assert.That(client.AttachedEntity, Is.Null); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + + EntityUid uid = default; + await server.WaitPost(() => uid = server.EntMan.Spawn("Traitor")); + var rule = new Entity(uid, server.EntMan.GetComponent(uid)); + var def = rule.Comp.Definitions.Single(); + + // IsSessionValid & IsEntityValid are preference agnostic and should always be true for players in the lobby. + // Though maybe that will change in the future, but then GetPlayerPool() needs to be updated to reflect that. + Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True); + Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True); + + // By default, traitor/antag preferences are disabled, so the pool should be empty. + var sessions = new List{pair.Player!}; + var pool = sys.GetPlayerPool(rule, sessions, def); + Assert.That(pool.Count, Is.EqualTo(0)); + + // Opt into the traitor role. + await pair.SetAntagPref("Traitor", true); + + Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True); + Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True); + pool = sys.GetPlayerPool(rule, sessions, def); + Assert.That(pool.Count, Is.EqualTo(1)); + pool.TryPickAndTake(pair.Server.ResolveDependency(), out var picked); + Assert.That(picked, Is.EqualTo(pair.Player)); + Assert.That(sessions.Count, Is.EqualTo(1)); + + // opt back out + await pair.SetAntagPref("Traitor", false); + + Assert.That(sys.IsSessionValid(rule, pair.Player, def), Is.True); + Assert.That(sys.IsEntityValid(client.AttachedEntity, def), Is.True); + pool = sys.GetPlayerPool(rule, sessions, def); + Assert.That(pool.Count, Is.EqualTo(0)); + + await server.WaitPost(() => server.EntMan.DeleteEntity(uid)); + await pair.CleanReturnAsync(); + } +} diff --git a/Content.IntegrationTests/Tests/GameRules/NukeOpsTest.cs b/Content.IntegrationTests/Tests/GameRules/NukeOpsTest.cs index 5bada98a3aa..3a77834b725 100644 --- a/Content.IntegrationTests/Tests/GameRules/NukeOpsTest.cs +++ b/Content.IntegrationTests/Tests/GameRules/NukeOpsTest.cs @@ -58,6 +58,9 @@ public async Task TryStopNukeOpsFromConstantlyFailing() Assert.That(client.AttachedEntity, Is.Null); Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + // Opt into the nukies role. + await pair.SetAntagPref("NukeopsCommander", true); + // There are no grids or maps Assert.That(entMan.Count(), Is.Zero); Assert.That(entMan.Count(), Is.Zero); @@ -198,6 +201,7 @@ public async Task TryStopNukeOpsFromConstantlyFailing() ticker.SetGamePreset((GamePresetPrototype?)null); server.CfgMan.SetCVar(CCVars.GridFill, false); + await pair.SetAntagPref("NukeopsCommander", false); await pair.CleanReturnAsync(); } } diff --git a/Content.IntegrationTests/Tests/Interaction/Click/InteractionSystemTests.cs b/Content.IntegrationTests/Tests/Interaction/Click/InteractionSystemTests.cs index 317aa10400b..4415eddf376 100644 --- a/Content.IntegrationTests/Tests/Interaction/Click/InteractionSystemTests.cs +++ b/Content.IntegrationTests/Tests/Interaction/Click/InteractionSystemTests.cs @@ -407,7 +407,6 @@ await server.WaitAssertion(() => await pair.CleanReturnAsync(); } - [Reflect(false)] public sealed class TestInteractionSystem : EntitySystem { public EntityEventHandler? InteractUsingEvent; diff --git a/Content.IntegrationTests/Tests/ResettingEntitySystemTests.cs b/Content.IntegrationTests/Tests/ResettingEntitySystemTests.cs index d5c2a9124dd..40457f54883 100644 --- a/Content.IntegrationTests/Tests/ResettingEntitySystemTests.cs +++ b/Content.IntegrationTests/Tests/ResettingEntitySystemTests.cs @@ -9,7 +9,6 @@ namespace Content.IntegrationTests.Tests [TestOf(typeof(RoundRestartCleanupEvent))] public sealed class ResettingEntitySystemTests { - [Reflect(false)] public sealed class TestRoundRestartCleanupEvent : EntitySystem { public bool HasBeenReset { get; set; } @@ -49,8 +48,6 @@ await server.WaitAssertion(() => system.HasBeenReset = false; - Assert.That(system.HasBeenReset, Is.False); - gameTicker.RestartRound(); Assert.That(system.HasBeenReset); diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index d8554e3fb22..3b5855cdf95 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -27,6 +27,11 @@ public bool TryGetNextAvailableDefinition(Entity ent, if (mindCount >= totalTargetCount) return false; + // TODO ANTAG fix this + // If here are two definitions with 1/10 and 10/10 slots filled, this will always return the second definition + // even though it has already met its target + // AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA I fucking hate game ticker code. + // It needs to track selected minds for each definition independently. foreach (var def in ent.Comp.Definitions) { var target = GetTargetAntagCount(ent, null, def); @@ -64,6 +69,10 @@ public int GetTargetAntagCount(Entity ent, AntagSelecti /// public int GetTargetAntagCount(Entity ent, AntagSelectionPlayerPool? pool, AntagSelectionDefinition def) { + // TODO ANTAG + // make pool non-nullable + // Review uses and ensure that people are INTENTIONALLY including players in the lobby if this is a mid-round + // antag selection. var poolSize = pool?.Count ?? _playerManager.Sessions .Count(s => s.State.Status is not SessionStatus.Disconnected and not SessionStatus.Zombie); diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 1d1783ed875..5b6c891ddfc 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -14,6 +14,7 @@ using Content.Server.Shuttles.Components; using Content.Server.Station.Systems; using Content.Shared.Antag; +using Content.Shared.GameTicking; using Content.Shared.Ghost; using Content.Shared.Humanoid; using Content.Shared.Players; @@ -25,6 +26,7 @@ using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Random; +using Robust.Shared.Utility; namespace Content.Server.Antag; @@ -85,10 +87,9 @@ private void OnPlayerSpawning(RulePlayerSpawningEvent args) continue; if (comp.SelectionsComplete) - return; + continue; ChooseAntags((uid, comp), pool); - comp.SelectionsComplete = true; foreach (var session in comp.SelectedSessions) { @@ -106,11 +107,7 @@ private void OnJobsAssigned(RulePlayerJobsAssignedEvent args) if (comp.SelectionTime != AntagSelectionTime.PostPlayerSpawn) continue; - if (comp.SelectionsComplete) - continue; - - ChooseAntags((uid, comp)); - comp.SelectionsComplete = true; + ChooseAntags((uid, comp), args.Players); } } @@ -126,12 +123,18 @@ private void OnSpawnComplete(PlayerSpawnCompleteEvent args) var query = QueryActiveRules(); while (query.MoveNext(out var uid, out _, out var antag, out _)) { + // TODO ANTAG + // what why aasdiuhasdopiuasdfhksad + // stop this insanity please + // probability of antag assignment shouldn't depend on the order in which rules are returned by the query. if (!RobustRandom.Prob(LateJoinRandomChance)) continue; if (!antag.Definitions.Any(p => p.LateJoinAdditional)) continue; + DebugTools.AssertEqual(antag.SelectionTime, AntagSelectionTime.PostPlayerSpawn); + if (!TryGetNextAvailableDefinition((uid, antag), out var def)) continue; @@ -164,43 +167,40 @@ protected override void Started(EntityUid uid, AntagSelectionComponent component { base.Started(uid, component, gameRule, args); - if (component.SelectionsComplete) - return; - + // If the round has not yet started, we defer antag selection until roundstart if (GameTicker.RunLevel != GameRunLevel.InRound) return; - if (GameTicker.RunLevel == GameRunLevel.InRound && component.SelectionTime == AntagSelectionTime.PrePlayerSpawn) + if (component.SelectionsComplete) return; - ChooseAntags((uid, component)); - component.SelectionsComplete = true; - } + var players = _playerManager.Sessions + .Where(x => GameTicker.PlayerGameStatuses[x.UserId] == PlayerGameStatus.JoinedGame) + .ToList(); - /// - /// Chooses antagonists from the current selection of players - /// - public void ChooseAntags(Entity ent) - { - var sessions = _playerManager.Sessions.ToList(); - ChooseAntags(ent, sessions); + ChooseAntags((uid, component), players); } /// /// Chooses antagonists from the given selection of players /// - public void ChooseAntags(Entity ent, List pool) + public void ChooseAntags(Entity ent, IList pool) { + if (ent.Comp.SelectionsComplete) + return; + foreach (var def in ent.Comp.Definitions) { ChooseAntags(ent, pool, def); } + + ent.Comp.SelectionsComplete = true; } /// /// Chooses antagonists from the given selection of players for the given antag definition. /// - public void ChooseAntags(Entity ent, List pool, AntagSelectionDefinition def) + public void ChooseAntags(Entity ent, IList pool, AntagSelectionDefinition def) { var playerPool = GetPlayerPool(ent, pool, def); var count = GetTargetAntagCount(ent, playerPool, def); @@ -324,20 +324,15 @@ public void MakeAntag(Entity ent, ICommonSession? sessi /// /// Gets an ordered player pool based on player preferences and the antagonist definition. /// - public AntagSelectionPlayerPool GetPlayerPool(Entity ent, List sessions, AntagSelectionDefinition def) + public AntagSelectionPlayerPool GetPlayerPool(Entity ent, IList sessions, AntagSelectionDefinition def) { var preferredList = new List(); var fallbackList = new List(); - var unwantedList = new List(); - var invalidList = new List(); foreach (var session in sessions) { if (!IsSessionValid(ent, session, def) || !IsEntityValid(session.AttachedEntity, def)) - { - invalidList.Add(session); continue; - } var pref = (HumanoidCharacterProfile) _pref.GetPreferences(session.UserId).SelectedCharacter; if (def.PrefRoles.Count != 0 && pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p))) @@ -348,13 +343,9 @@ public AntagSelectionPlayerPool GetPlayerPool(Entity en { fallbackList.Add(session); } - else - { - unwantedList.Add(session); - } } - return new AntagSelectionPlayerPool(new() { preferredList, fallbackList, unwantedList, invalidList }); + return new AntagSelectionPlayerPool(new() { preferredList, fallbackList }); } /// @@ -365,14 +356,18 @@ public bool IsSessionValid(Entity ent, ICommonSession? if (session == null) return true; - mind ??= session.GetMind(); - if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) return false; if (ent.Comp.SelectedSessions.Contains(session)) return false; + mind ??= session.GetMind(); + + // If the player has not spawned in as any entity (e.g., in the lobby), they can be given an antag role/entity. + if (mind == null) + return true; + //todo: we need some way to check that we're not getting the same role twice. (double picking thieves or zombies through midrounds) switch (def.MultiAntagSetting) @@ -401,10 +396,11 @@ public bool IsSessionValid(Entity ent, ICommonSession? /// /// Checks if a given entity (mind/session not included) is valid for a given antagonist. /// - private bool IsEntityValid(EntityUid? entity, AntagSelectionDefinition def) + public bool IsEntityValid(EntityUid? entity, AntagSelectionDefinition def) { + // If the player has not spawned in as any entity (e.g., in the lobby), they can be given an antag role/entity. if (entity == null) - return false; + return true; if (HasComp(entity)) return false; diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index df597e69b2f..6eb42b65c03 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -795,7 +795,7 @@ public RulePlayerSpawningEvent(List playerPool, IReadOnlyDiction } /// - /// Event raised after players were assigned jobs by the GameTicker. + /// Event raised after players were assigned jobs by the GameTicker and have been spawned in. /// You can give on-station people special roles by listening to this event. /// public sealed class RulePlayerJobsAssignedEvent diff --git a/Content.Server/Preferences/Managers/IServerPreferencesManager.cs b/Content.Server/Preferences/Managers/IServerPreferencesManager.cs index 63c267f154a..cdb53bb4be7 100644 --- a/Content.Server/Preferences/Managers/IServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/IServerPreferencesManager.cs @@ -20,5 +20,7 @@ public interface IServerPreferencesManager PlayerPreferences? GetPreferencesOrNull(NetUserId? userId); IEnumerable> GetSelectedProfilesForPlayers(List userIds); bool HavePreferencesLoaded(ICommonSession session); + + Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile); } } diff --git a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs index 1aad61715bb..e32af589e95 100644 --- a/Content.Server/Preferences/Managers/ServerPreferencesManager.cs +++ b/Content.Server/Preferences/Managers/ServerPreferencesManager.cs @@ -29,11 +29,14 @@ public sealed class ServerPreferencesManager : IServerPreferencesManager [Dependency] private readonly IServerDbManager _db = default!; [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IDependencyCollection _dependencies = default!; + [Dependency] private readonly ILogManager _log = default!; // Cache player prefs on the server so we don't need as much async hell related to them. private readonly Dictionary _cachedPlayerPrefs = new(); + private ISawmill _sawmill = default!; + private int MaxCharacterSlots => _cfg.GetCVar(CCVars.GameMaxCharacterSlots); public void Init() @@ -42,6 +45,7 @@ public void Init() _netManager.RegisterNetMessage(HandleSelectCharacterMessage); _netManager.RegisterNetMessage(HandleUpdateCharacterMessage); _netManager.RegisterNetMessage(HandleDeleteCharacterMessage); + _sawmill = _log.GetSawmill("prefs"); } private async void HandleSelectCharacterMessage(MsgSelectCharacter message) @@ -78,27 +82,25 @@ private async void HandleSelectCharacterMessage(MsgSelectCharacter message) private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message) { - var slot = message.Slot; - var profile = message.Profile; var userId = message.MsgChannel.UserId; - if (profile == null) - { - Logger.WarningS("prefs", - $"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {slot}."); - return; - } + // ReSharper disable once ConditionIsAlwaysTrueOrFalseAccordingToNullableAPIContract + if (message.Profile == null) + _sawmill.Error($"User {userId} sent a {nameof(MsgUpdateCharacter)} with a null profile in slot {message.Slot}."); + else + await SetProfile(userId, message.Slot, message.Profile); + } + public async Task SetProfile(NetUserId userId, int slot, ICharacterProfile profile) + { if (!_cachedPlayerPrefs.TryGetValue(userId, out var prefsData) || !prefsData.PrefsLoaded) { - Logger.WarningS("prefs", $"User {userId} tried to modify preferences before they loaded."); + _sawmill.Error($"Tried to modify user {userId} preferences before they loaded."); return; } if (slot < 0 || slot >= MaxCharacterSlots) - { return; - } var curPrefs = prefsData.Prefs!; var session = _playerManager.GetSessionById(userId); @@ -112,10 +114,8 @@ private async void HandleUpdateCharacterMessage(MsgUpdateCharacter message) prefsData.Prefs = new PlayerPreferences(profiles, slot, curPrefs.AdminOOCColor); - if (ShouldStorePrefs(message.MsgChannel.AuthType)) - { - await _db.SaveCharacterSlotAsync(message.MsgChannel.UserId, message.Profile, message.Slot); - } + if (ShouldStorePrefs(session.Channel.AuthType)) + await _db.SaveCharacterSlotAsync(userId, profile, slot); } private async void HandleDeleteCharacterMessage(MsgDeleteCharacter message) diff --git a/Content.Shared/Antag/AntagAcceptability.cs b/Content.Shared/Antag/AntagAcceptability.cs index 02d0b5f58fe..f56be975033 100644 --- a/Content.Shared/Antag/AntagAcceptability.cs +++ b/Content.Shared/Antag/AntagAcceptability.cs @@ -22,6 +22,14 @@ public enum AntagAcceptability public enum AntagSelectionTime : byte { + /// + /// Antag roles are assigned before players are assigned jobs and spawned in. + /// This prevents antag selection from happening if the round is on-going. + /// PrePlayerSpawn, + + /// + /// Antag roles get assigned after players have been assigned jobs and have spawned in. + /// PostPlayerSpawn } diff --git a/Content.Shared/Roles/Jobs/SharedJobSystem.cs b/Content.Shared/Roles/Jobs/SharedJobSystem.cs index 04ac45c4c5f..fcf76052785 100644 --- a/Content.Shared/Roles/Jobs/SharedJobSystem.cs +++ b/Content.Shared/Roles/Jobs/SharedJobSystem.cs @@ -146,8 +146,10 @@ public string MindTryGetJobName([NotNullWhen(true)] EntityUid? mindId) public bool CanBeAntag(ICommonSession player) { + // If the player does not have any mind associated with them (e.g., has not spawned in or is in the lobby), then + // they are eligible to be given an antag role/entity. if (_playerSystem.ContentData(player) is not { Mind: { } mindId }) - return false; + return true; if (!MindTryGetJob(mindId, out _, out var prototype)) return true; From 0be71c400d9e5585a9f3572788479df1bf9c4fcd Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 26 May 2024 05:15:35 +0000 Subject: [PATCH 052/112] 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 0f5bddbcdbe..a26b705a35f 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: pigeonpeas - changes: - - message: added new expedition ambience - type: Add - id: 6123 - time: '2024-03-11T06:56:01.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25983 - author: Ilya246 changes: - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities @@ -3871,3 +3864,10 @@ id: 6622 time: '2024-05-26T04:46:41.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28282 +- author: deltanedas + changes: + - message: Fixed being picked for antag roles while in the lobby or not opted in. + type: Fix + id: 6623 + time: '2024-05-26T05:14:29.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28197 From 2586427c5211323ae49b387b51edc5a56255b169 Mon Sep 17 00:00:00 2001 From: "Mr. 27" <45323883+Dutch-VanDerLinde@users.noreply.github.com> Date: Sun, 26 May 2024 10:48:34 -0400 Subject: [PATCH 053/112] Fix hypodarts not injecting with people that have ANY outerclothing (#28301) Update darts.yml --- Resources/Prototypes/Entities/Objects/Fun/darts.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/Resources/Prototypes/Entities/Objects/Fun/darts.yml b/Resources/Prototypes/Entities/Objects/Fun/darts.yml index 4c7ae68420b..36c841995e5 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/darts.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/darts.yml @@ -126,6 +126,7 @@ maxVol: 7 - type: SolutionInjectOnEmbed transferAmount: 7 + blockSlots: NONE solution: melee - type: SolutionTransfer maxTransferAmount: 7 From fed072ee202512b6010a315cbe1ff260fddf5709 Mon Sep 17 00:00:00 2001 From: PJBot Date: Sun, 26 May 2024 14:49:40 +0000 Subject: [PATCH 054/112] 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 a26b705a35f..80f1972d560 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: Ilya246 - changes: - - message: The biomass reclaimer may now reclaim plants, and inserting smaller entities - into it is now faster. - type: Tweak - id: 6124 - time: '2024-03-11T21:59:21.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23731 - author: SlamBamActionman changes: - message: Moths eating lizard plushies will now start to Weh! @@ -3871,3 +3863,10 @@ id: 6623 time: '2024-05-26T05:14:29.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28197 +- author: Dutch-VanDerLinde + changes: + - message: Fix hypodarts not injecting into people with outerclothing equipped. + type: Fix + id: 6624 + time: '2024-05-26T14:48:34.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28301 From cba23487d3df52fbd14aec5a30d3ac90ca942f88 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Sun, 26 May 2024 16:07:16 -0400 Subject: [PATCH 055/112] fix borg ui mispredict opening (#28305) move borg ui junk to shared --- .../ActivatableUIRequiresLockSystem.cs | 43 ------------------- Content.Server/Silicons/Borgs/BorgSystem.cs | 9 ---- Content.Server/Wires/WiresSystem.cs | 23 ---------- .../ActivatableUIRequiresLockComponent.cs | 10 +++-- Content.Shared/Lock/LockSystem.cs | 26 +++++++++++ .../Silicons/Borgs/SharedBorgSystem.cs | 11 ++++- .../ActivatableUIRequiresPanelComponent.cs | 8 ++-- Content.Shared/Wires/SharedWiresSystem.cs | 22 ++++++++++ 8 files changed, 69 insertions(+), 83 deletions(-) delete mode 100644 Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs rename {Content.Server/Lock/Components => Content.Shared/Lock}/ActivatableUIRequiresLockComponent.cs (66%) rename {Content.Server => Content.Shared}/Wires/ActivatableUIRequiresPanelComponent.cs (71%) diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs deleted file mode 100644 index 04f8e2eb54c..00000000000 --- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Content.Server.Lock.Components; -using Content.Server.Popups; -using Content.Shared.UserInterface; -using Content.Shared.Lock; -using Content.Server.UserInterface; -using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; - -namespace Content.Server.Lock.EntitySystems; -public sealed class ActivatableUIRequiresLockSystem : EntitySystem -{ - [Dependency] private readonly ActivatableUISystem _activatableUI = default!; - [Dependency] private readonly PopupSystem _popupSystem = default!; - - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(OnUIOpenAttempt); - SubscribeLocalEvent(LockToggled); - } - - private void OnUIOpenAttempt(EntityUid uid, ActivatableUIRequiresLockComponent component, ActivatableUIOpenAttemptEvent args) - { - if (args.Cancelled) - return; - - if (TryComp(uid, out var lockComp) && lockComp.Locked != component.requireLocked) - { - args.Cancel(); - if (lockComp.Locked) - _popupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User); - } - } - - private void LockToggled(EntityUid uid, ActivatableUIRequiresLockComponent component, LockToggledEvent args) - { - if (!TryComp(uid, out var lockComp) || lockComp.Locked == component.requireLocked) - return; - - _activatableUI.CloseAll(uid); - } -} - diff --git a/Content.Server/Silicons/Borgs/BorgSystem.cs b/Content.Server/Silicons/Borgs/BorgSystem.cs index 97adfd00eb4..082e38921a2 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Explosion.EntitySystems; using Content.Server.Hands.Systems; using Content.Server.PowerCell; -using Content.Shared.UserInterface; using Content.Shared.Access.Systems; using Content.Shared.Alert; using Content.Shared.Database; @@ -70,7 +69,6 @@ public override void Initialize() SubscribeLocalEvent(OnMobStateChanged); SubscribeLocalEvent(OnPowerCellChanged); SubscribeLocalEvent(OnPowerCellSlotEmpty); - SubscribeLocalEvent(OnUIOpenAttempt); SubscribeLocalEvent(OnGetDeadIC); SubscribeLocalEvent(OnBrainMindAdded); @@ -214,13 +212,6 @@ private void OnPowerCellSlotEmpty(EntityUid uid, BorgChassisComponent component, UpdateUI(uid, component); } - private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) - { - // borgs can't view their own ui - if (args.User == uid) - args.Cancel(); - } - private void OnGetDeadIC(EntityUid uid, BorgChassisComponent component, ref GetCharactedDeadIcEvent args) { args.Dead = true; diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index c643759f504..944b0a0e250 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -4,27 +4,23 @@ using Content.Server.Construction; using Content.Server.Construction.Components; using Content.Server.Power.Components; -using Content.Server.UserInterface; using Content.Shared.DoAfter; using Content.Shared.GameTicking; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Popups; using Content.Shared.Tools.Components; -using Content.Shared.UserInterface; using Content.Shared.Wires; using Robust.Server.GameObjects; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.Wires; public sealed class WiresSystem : SharedWiresSystem { [Dependency] private readonly IPrototypeManager _protoMan = default!; - [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; @@ -52,8 +48,6 @@ public override void Initialize() SubscribeLocalEvent(OnTimedWire); SubscribeLocalEvent(OnWiresPowered); SubscribeLocalEvent(OnDoAfter); - SubscribeLocalEvent(OnAttemptOpenActivatableUI); - SubscribeLocalEvent(OnActivatableUIPanelChanged); SubscribeLocalEvent(SetWiresPanelSecurity); } @@ -473,23 +467,6 @@ private void OnPanelChanged(Entity ent, ref PanelChangedEvent ar _uiSystem.CloseUi(ent.Owner, WiresUiKey.Key); } - private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) - { - if (args.Cancelled || !TryComp(uid, out var wires)) - return; - - if (component.RequireOpen != wires.Open) - args.Cancel(); - } - - private void OnActivatableUIPanelChanged(EntityUid uid, ActivatableUIRequiresPanelComponent component, ref PanelChangedEvent args) - { - if (args.Open == component.RequireOpen) - return; - - _activatableUI.CloseAll(uid); - } - private void OnMapInit(EntityUid uid, WiresComponent component, MapInitEvent args) { if (!string.IsNullOrEmpty(component.LayoutId)) diff --git a/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs b/Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs similarity index 66% rename from Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs rename to Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs index dac677c1c27..7d701ffd874 100644 --- a/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs +++ b/Content.Shared/Lock/ActivatableUIRequiresLockComponent.cs @@ -1,15 +1,17 @@ -namespace Content.Server.Lock.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Lock; /// /// This is used for activatable UIs that require the entity to have a lock in a certain state. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, Access(typeof(LockSystem))] public sealed partial class ActivatableUIRequiresLockComponent : Component { /// /// TRUE: the lock must be locked to access the UI. /// FALSE: the lock must be unlocked to access the UI. /// - [DataField("requireLocked"), ViewVariables(VVAccess.ReadWrite)] - public bool requireLocked = false; + [DataField] + public bool RequireLocked; } diff --git a/Content.Shared/Lock/LockSystem.cs b/Content.Shared/Lock/LockSystem.cs index 4115358d9d7..36ac5f025b1 100644 --- a/Content.Shared/Lock/LockSystem.cs +++ b/Content.Shared/Lock/LockSystem.cs @@ -10,6 +10,7 @@ using Content.Shared.Popups; using Content.Shared.Storage; using Content.Shared.Storage.Components; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using Content.Shared.Wires; using JetBrains.Annotations; @@ -25,6 +26,7 @@ namespace Content.Shared.Lock; public sealed class LockSystem : EntitySystem { [Dependency] private readonly AccessReaderSystem _accessReader = default!; + [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPopupSystem _sharedPopupSystem = default!; @@ -48,6 +50,9 @@ public override void Initialize() SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnAttemptChangePanel); SubscribeLocalEvent(OnUnanchorAttempt); + + SubscribeLocalEvent(OnUIOpenAttempt); + SubscribeLocalEvent(LockToggled); } private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args) @@ -349,5 +354,26 @@ private void OnUnanchorAttempt(Entity ent, ref Unanch args.User); args.Cancel(); } + + private void OnUIOpenAttempt(EntityUid uid, ActivatableUIRequiresLockComponent component, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled) + return; + + if (TryComp(uid, out var lockComp) && lockComp.Locked != component.RequireLocked) + { + args.Cancel(); + if (lockComp.Locked) + _sharedPopupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User); + } + } + + private void LockToggled(EntityUid uid, ActivatableUIRequiresLockComponent component, LockToggledEvent args) + { + if (!TryComp(uid, out var lockComp) || lockComp.Locked == component.RequireLocked) + return; + + _activatableUI.CloseAll(uid); + } } diff --git a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs index 0431d95a42f..2983c0d642f 100644 --- a/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs +++ b/Content.Shared/Silicons/Borgs/SharedBorgSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Popups; using Content.Shared.PowerCell.Components; using Content.Shared.Silicons.Borgs.Components; +using Content.Shared.UserInterface; using Content.Shared.Wires; using Robust.Shared.Containers; @@ -30,7 +31,8 @@ public override void Initialize() SubscribeLocalEvent(OnInserted); SubscribeLocalEvent(OnRemoved); SubscribeLocalEvent(OnRefreshMovementSpeedModifiers); - + SubscribeLocalEvent(OnUIOpenAttempt); + InitializeRelay(); } @@ -75,6 +77,13 @@ private void OnStartup(EntityUid uid, BorgChassisComponent component, ComponentS component.ModuleContainer = Container.EnsureContainer(uid, component.ModuleContainerId, containerManager); } + private void OnUIOpenAttempt(EntityUid uid, BorgChassisComponent component, ActivatableUIOpenAttemptEvent args) + { + // borgs can't view their own ui + if (args.User == uid) + args.Cancel(); + } + protected virtual void OnInserted(EntityUid uid, BorgChassisComponent component, EntInsertedIntoContainerMessage args) { diff --git a/Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs b/Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs similarity index 71% rename from Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs rename to Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs index f92df3d3d59..6e8fff6e49c 100644 --- a/Content.Server/Wires/ActivatableUIRequiresPanelComponent.cs +++ b/Content.Shared/Wires/ActivatableUIRequiresPanelComponent.cs @@ -1,15 +1,17 @@ -namespace Content.Server.Wires; +using Robust.Shared.GameStates; + +namespace Content.Shared.Wires; /// /// This is used for activatable UIs that require the entity to have a panel in a certain state. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, Access(typeof(SharedWiresSystem))] public sealed partial class ActivatableUIRequiresPanelComponent : Component { /// /// TRUE: the panel must be open to access the UI. /// FALSE: the panel must be closed to access the UI. /// - [DataField("requireOpen"), ViewVariables(VVAccess.ReadWrite)] + [DataField] public bool RequireOpen = true; } diff --git a/Content.Shared/Wires/SharedWiresSystem.cs b/Content.Shared/Wires/SharedWiresSystem.cs index b4b0768e0f7..d84766a5fc6 100644 --- a/Content.Shared/Wires/SharedWiresSystem.cs +++ b/Content.Shared/Wires/SharedWiresSystem.cs @@ -3,6 +3,7 @@ using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Tools.Systems; +using Content.Shared.UserInterface; using Robust.Shared.Audio.Systems; namespace Content.Shared.Wires; @@ -10,6 +11,7 @@ namespace Content.Shared.Wires; public abstract class SharedWiresSystem : EntitySystem { [Dependency] protected readonly ISharedAdminLogManager AdminLogger = default!; + [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] protected readonly SharedAppearanceSystem Appearance = default!; [Dependency] protected readonly SharedAudioSystem Audio = default!; [Dependency] protected readonly SharedToolSystem Tool = default!; @@ -21,6 +23,9 @@ public override void Initialize() SubscribeLocalEvent(OnPanelDoAfter); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnExamine); + + SubscribeLocalEvent(OnAttemptOpenActivatableUI); + SubscribeLocalEvent(OnActivatableUIPanelChanged); } private void OnPanelDoAfter(EntityUid uid, WiresPanelComponent panel, WirePanelDoAfterEvent args) @@ -132,4 +137,21 @@ public bool IsPanelOpen(Entity entity) return entity.Comp.Open; } + + private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled || !TryComp(uid, out var wires)) + return; + + if (component.RequireOpen != wires.Open) + args.Cancel(); + } + + private void OnActivatableUIPanelChanged(EntityUid uid, ActivatableUIRequiresPanelComponent component, ref PanelChangedEvent args) + { + if (args.Open == component.RequireOpen) + return; + + _activatableUI.CloseAll(uid); + } } From af70b9a3c78046f7f680e5c35a298ebc1747eadd Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 27 May 2024 10:11:17 +1000 Subject: [PATCH 056/112] Selectively revert PullController (#28126) I am leaving the issues open and have updated #26547 with more info on what we should do long-term. This is just to bandaid the short-term complaining. --- .../Movement/Components/PullMoverComponent.cs | 13 + .../Components/PullMovingComponent.cs | 14 + .../Movement/Systems/PullController.cs | 318 ++++++++++++++++++ .../Pulling/Components/PullerComponent.cs | 2 +- .../Movement/Pulling/Systems/PullingSystem.cs | 44 --- 5 files changed, 346 insertions(+), 45 deletions(-) create mode 100644 Content.Server/Movement/Components/PullMoverComponent.cs create mode 100644 Content.Server/Movement/Components/PullMovingComponent.cs create mode 100644 Content.Server/Movement/Systems/PullController.cs diff --git a/Content.Server/Movement/Components/PullMoverComponent.cs b/Content.Server/Movement/Components/PullMoverComponent.cs new file mode 100644 index 00000000000..19a01c6b17d --- /dev/null +++ b/Content.Server/Movement/Components/PullMoverComponent.cs @@ -0,0 +1,13 @@ +namespace Content.Server.Movement.Components; + +/// +/// Added to an entity that is ctrl-click moving their pulled object. +/// +/// +/// This just exists so we don't have MoveEvent subs going off for every single mob constantly. +/// +[RegisterComponent] +public sealed partial class PullMoverComponent : Component +{ + +} diff --git a/Content.Server/Movement/Components/PullMovingComponent.cs b/Content.Server/Movement/Components/PullMovingComponent.cs new file mode 100644 index 00000000000..32c50d657ad --- /dev/null +++ b/Content.Server/Movement/Components/PullMovingComponent.cs @@ -0,0 +1,14 @@ +using Robust.Shared.Map; + +namespace Content.Server.Movement.Components; + +/// +/// Added when an entity is being ctrl-click moved when pulled. +/// +[RegisterComponent] +public sealed partial class PullMovingComponent : Component +{ + // Not serialized to indicate THIS CODE SUCKS, fix pullcontroller first + [ViewVariables] + public EntityCoordinates MovingTo; +} diff --git a/Content.Server/Movement/Systems/PullController.cs b/Content.Server/Movement/Systems/PullController.cs new file mode 100644 index 00000000000..72110ff67d2 --- /dev/null +++ b/Content.Server/Movement/Systems/PullController.cs @@ -0,0 +1,318 @@ +using System.Numerics; +using Content.Server.Movement.Components; +using Content.Server.Physics.Controllers; +using Content.Shared.ActionBlocker; +using Content.Shared.Gravity; +using Content.Shared.Input; +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Events; +using Content.Shared.Movement.Pulling.Systems; +using Content.Shared.Rotatable; +using Robust.Server.Physics; +using Robust.Shared.Containers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Map; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Components; +using Robust.Shared.Physics.Controllers; +using Robust.Shared.Physics.Dynamics.Joints; +using Robust.Shared.Player; +using Robust.Shared.Timing; + +namespace Content.Server.Movement.Systems; + +public sealed class PullController : VirtualController +{ + /* + * This code is awful. If you try to tweak this without refactoring it I'm gonna revert it. + */ + + // Parameterization for pulling: + // Speeds. Note that the speed is mass-independent (multiplied by mass). + // Instead, tuning to mass is done via the mass values below. + // Note that setting the speed too high results in overshoots (stabilized by drag, but bad) + private const float AccelModifierHigh = 15f; + private const float AccelModifierLow = 60.0f; + // High/low-mass marks. Curve is constant-lerp-constant, i.e. if you can even pull an item, + // you'll always get at least AccelModifierLow and no more than AccelModifierHigh. + private const float AccelModifierHighMass = 70.0f; // roundstart saltern emergency closet + private const float AccelModifierLowMass = 5.0f; // roundstart saltern emergency crowbar + // Used to control settling (turns off pulling). + private const float MaximumSettleVelocity = 0.1f; + private const float MaximumSettleDistance = 0.1f; + // Settle shutdown control. + // Mustn't be too massive, as that causes severe mispredicts *and can prevent it ever resolving*. + // Exists to bleed off "I pulled my crowbar" overshoots. + // Minimum velocity for shutdown to be necessary. This prevents stuff getting stuck b/c too much shutdown. + private const float SettleMinimumShutdownVelocity = 0.25f; + // Distance in which settle shutdown multiplier is at 0. It then scales upwards linearly with closer distances. + private const float SettleShutdownDistance = 1.0f; + // Velocity change of -LinearVelocity * frameTime * this + private const float SettleShutdownMultiplier = 20.0f; + + // How much you must move for the puller movement check to actually hit. + private const float MinimumMovementDistance = 0.005f; + + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; + [Dependency] private readonly SharedContainerSystem _container = default!; + [Dependency] private readonly SharedGravitySystem _gravity = default!; + + /// + /// If distance between puller and pulled entity lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with small distance jittering + /// + private const float ThresholdRotDistance = 1; + + /// + /// If difference between puller and pulled angle lower that this threshold, + /// pulled entity will not change its rotation. + /// Helps with diagonal movement jittering + /// As of further adjustments, should divide cleanly into 90 degrees + /// + private const float ThresholdRotAngle = 22.5f; + + private EntityQuery _physicsQuery; + private EntityQuery _pullableQuery; + private EntityQuery _pullerQuery; + private EntityQuery _xformQuery; + + public override void Initialize() + { + CommandBinds.Builder + .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) + .Register(); + + _physicsQuery = GetEntityQuery(); + _pullableQuery = GetEntityQuery(); + _pullerQuery = GetEntityQuery(); + _xformQuery = GetEntityQuery(); + + UpdatesAfter.Add(typeof(MoverController)); + SubscribeLocalEvent(OnPullStop); + SubscribeLocalEvent(OnPullerMove); + + base.Initialize(); + } + + public override void Shutdown() + { + base.Shutdown(); + CommandBinds.Unregister(); + } + + private void OnPullStop(Entity ent, ref PullStoppedMessage args) + { + RemCompDeferred(ent); + } + + private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) + { + if (session?.AttachedEntity is not { } player || + !player.IsValid()) + { + return false; + } + + if (!_pullerQuery.TryComp(player, out var pullerComp)) + return false; + + var pulled = pullerComp.Pulling; + + if (!_pullableQuery.TryComp(pulled, out var pullable)) + return false; + + if (_container.IsEntityInContainer(player)) + return false; + + // Cooldown buddy + if (_timing.CurTime < pullerComp.NextThrow) + return false; + + pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; + + // Cap the distance + var range = 2f; + var fromUserCoords = coords.WithEntityId(player, EntityManager); + var userCoords = new EntityCoordinates(player, Vector2.Zero); + + if (!coords.InRange(EntityManager, TransformSystem, userCoords, range)) + { + var direction = fromUserCoords.Position - userCoords.Position; + + // TODO: Joint API not ass + // with that being said I think throwing is the way to go but. + if (pullable.PullJointId != null && + TryComp(player, out JointComponent? joint) && + joint.GetJoints.TryGetValue(pullable.PullJointId, out var pullJoint) && + pullJoint is DistanceJoint distance) + { + range = MathF.Max(0.01f, distance.MaxLength - 0.01f); + } + + fromUserCoords = new EntityCoordinates(player, direction.Normalized() * (range - 0.01f)); + coords = fromUserCoords.WithEntityId(coords.EntityId); + } + + EnsureComp(player); + var moving = EnsureComp(pulled!.Value); + moving.MovingTo = coords; + return false; + } + + private void OnPullerMove(EntityUid uid, PullMoverComponent component, ref MoveEvent args) + { + if (!_pullerQuery.TryComp(uid, out var puller)) + return; + + if (puller.Pulling is not { } pullable) + return; + + UpdatePulledRotation(uid, pullable); + + // WHY + if (args.NewPosition.EntityId == args.OldPosition.EntityId && + (args.NewPosition.Position - args.OldPosition.Position).LengthSquared() < + MinimumMovementDistance * MinimumMovementDistance) + { + return; + } + + if (_physicsQuery.TryComp(uid, out var physics)) + PhysicsSystem.WakeBody(uid, body: physics); + + StopMove(uid, pullable); + } + + private void StopMove(Entity mover, Entity moving) + { + RemCompDeferred(mover.Owner); + RemCompDeferred(moving.Owner); + } + + private void UpdatePulledRotation(EntityUid puller, EntityUid pulled) + { + // TODO: update once ComponentReference works with directed event bus. + if (!TryComp(pulled, out RotatableComponent? rotatable)) + return; + + if (!rotatable.RotateWhilePulling) + return; + + var pulledXform = _xformQuery.GetComponent(pulled); + var pullerXform = _xformQuery.GetComponent(puller); + + var pullerData = TransformSystem.GetWorldPositionRotation(pullerXform); + var pulledData = TransformSystem.GetWorldPositionRotation(pulledXform); + + var dir = pullerData.WorldPosition - pulledData.WorldPosition; + if (dir.LengthSquared() > ThresholdRotDistance * ThresholdRotDistance) + { + var oldAngle = pulledData.WorldRotation; + var newAngle = Angle.FromWorldVec(dir); + + var diff = newAngle - oldAngle; + if (Math.Abs(diff.Degrees) > ThresholdRotAngle / 2f) + { + // Ok, so this bit is difficult because ideally it would look like it's snapping to sane angles. + // Otherwise PIANO DOOR STUCK! happens. + // But it also needs to work with station rotation / align to the local parent. + // So... + var baseRotation = pulledData.WorldRotation - pulledXform.LocalRotation; + var localRotation = newAngle - baseRotation; + var localRotationSnapped = Angle.FromDegrees(Math.Floor((localRotation.Degrees / ThresholdRotAngle) + 0.5f) * ThresholdRotAngle); + TransformSystem.SetLocalRotation(pulled, localRotationSnapped, pulledXform); + } + } + } + + public override void UpdateBeforeSolve(bool prediction, float frameTime) + { + base.UpdateBeforeSolve(prediction, frameTime); + var movingQuery = EntityQueryEnumerator(); + + while (movingQuery.MoveNext(out var pullableEnt, out var mover, out var pullable, out var pullableXform)) + { + if (!mover.MovingTo.IsValid(EntityManager)) + { + RemCompDeferred(pullableEnt); + continue; + } + + if (pullable.Puller is not {Valid: true} puller) + continue; + + var pullerXform = _xformQuery.Get(puller); + var pullerPosition = TransformSystem.GetMapCoordinates(pullerXform); + + var movingTo = mover.MovingTo.ToMap(EntityManager, TransformSystem); + + if (movingTo.MapId != pullerPosition.MapId) + { + RemCompDeferred(pullableEnt); + continue; + } + + if (!TryComp(pullableEnt, out var physics) || + physics.BodyType == BodyType.Static || + movingTo.MapId != pullableXform.MapID) + { + RemCompDeferred(pullableEnt); + continue; + } + + var movingPosition = movingTo.Position; + var ownerPosition = TransformSystem.GetWorldPosition(pullableXform); + + var diff = movingPosition - ownerPosition; + var diffLength = diff.Length(); + + if (diffLength < MaximumSettleDistance && physics.LinearVelocity.Length() < MaximumSettleVelocity) + { + PhysicsSystem.SetLinearVelocity(pullableEnt, Vector2.Zero, body: physics); + RemCompDeferred(pullableEnt); + continue; + } + + var impulseModifierLerp = Math.Min(1.0f, Math.Max(0.0f, (physics.Mass - AccelModifierLowMass) / (AccelModifierHighMass - AccelModifierLowMass))); + var impulseModifier = MathHelper.Lerp(AccelModifierLow, AccelModifierHigh, impulseModifierLerp); + var multiplier = diffLength < 1 ? impulseModifier * diffLength : impulseModifier; + // Note the implication that the real rules of physics don't apply to pulling control. + var accel = diff.Normalized() * multiplier; + // Now for the part where velocity gets shutdown... + if (diffLength < SettleShutdownDistance && physics.LinearVelocity.Length() >= SettleMinimumShutdownVelocity) + { + // Shutdown velocity increases as we get closer to centre + var scaling = (SettleShutdownDistance - diffLength) / SettleShutdownDistance; + accel -= physics.LinearVelocity * SettleShutdownMultiplier * scaling; + } + + PhysicsSystem.WakeBody(pullableEnt, body: physics); + + var impulse = accel * physics.Mass * frameTime; + PhysicsSystem.ApplyLinearImpulse(pullableEnt, impulse, body: physics); + + // if the puller is weightless or can't move, then we apply the inverse impulse (Newton's third law). + // doing it under gravity produces an unsatisfying wiggling when pulling. + // If player can't move, assume they are on a chair and we need to prevent pull-moving. + if (_gravity.IsWeightless(puller) && pullerXform.Comp.GridUid == null || !_actionBlockerSystem.CanMove(puller)) + { + PhysicsSystem.WakeBody(puller); + PhysicsSystem.ApplyLinearImpulse(puller, -impulse); + } + } + + // Cleanup PullMover + var moverQuery = EntityQueryEnumerator(); + + while (moverQuery.MoveNext(out var uid, out _, out var puller)) + { + if (!HasComp(puller.Pulling)) + { + RemCompDeferred(uid); + continue; + } + } + } +} diff --git a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs index 061ec13ed2a..f47ae32f90b 100644 --- a/Content.Shared/Movement/Pulling/Components/PullerComponent.cs +++ b/Content.Shared/Movement/Pulling/Components/PullerComponent.cs @@ -18,7 +18,7 @@ public sealed partial class PullerComponent : Component /// Next time the puller can throw what is being pulled. /// Used to avoid spamming it for infinite spin + velocity. /// - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField, Access(Other = AccessPermissions.ReadWriteExecute)] public TimeSpan NextThrow; [DataField] diff --git a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs index 3de71172c72..225810daed2 100644 --- a/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs +++ b/Content.Shared/Movement/Pulling/Systems/PullingSystem.cs @@ -43,8 +43,6 @@ public sealed class PullingSystem : EntitySystem [Dependency] private readonly SharedHandsSystem _handsSystem = default!; [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly SharedTransformSystem _xformSys = default!; - [Dependency] private readonly ThrowingSystem _throwing = default!; public override void Initialize() { @@ -66,7 +64,6 @@ public override void Initialize() SubscribeLocalEvent(OnDropHandItems); CommandBinds.Builder - .Bind(ContentKeyFunctions.MovePulledObject, new PointerInputCmdHandler(OnRequestMovePulledObject)) .Bind(ContentKeyFunctions.ReleasePulledObject, InputCmdHandler.FromDelegate(OnReleasePulledObject, handle: false)) .Register(); } @@ -245,47 +242,6 @@ public bool IsPulled(EntityUid uid, PullableComponent? component = null) return Resolve(uid, ref component, false) && component.BeingPulled; } - private bool OnRequestMovePulledObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid) - { - if (session?.AttachedEntity is not { } player || - !player.IsValid()) - { - return false; - } - - if (!TryComp(player, out var pullerComp)) - return false; - - var pulled = pullerComp.Pulling; - - if (!HasComp(pulled)) - return false; - - if (_containerSystem.IsEntityInContainer(player)) - return false; - - // Cooldown buddy - if (_timing.CurTime < pullerComp.NextThrow) - return false; - - pullerComp.NextThrow = _timing.CurTime + pullerComp.ThrowCooldown; - - // Cap the distance - const float range = 2f; - var fromUserCoords = coords.WithEntityId(player, EntityManager); - var userCoords = new EntityCoordinates(player, Vector2.Zero); - - if (!userCoords.InRange(EntityManager, _xformSys, fromUserCoords, range)) - { - var userDirection = fromUserCoords.Position - userCoords.Position; - fromUserCoords = userCoords.Offset(userDirection.Normalized() * range); - } - - Dirty(player, pullerComp); - _throwing.TryThrow(pulled.Value, fromUserCoords, user: player, strength: 4f, animated: false, recoil: false, playSound: false, doSpin: false); - return false; - } - public bool IsPulling(EntityUid puller, PullerComponent? component = null) { return Resolve(puller, ref component, false) && component.Pulling != null; From 642bcffbaf7a25a95454b2052282cb7980fd0491 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 27 May 2024 00:12:24 +0000 Subject: [PATCH 057/112] 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 80f1972d560..31c41b9ed5b 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Moths eating lizard plushies will now start to Weh! - type: Tweak - id: 6125 - time: '2024-03-11T23:05:25.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26003 - author: Ubaser changes: - message: Unpressurized areas now deal heat damage along with blunt. @@ -3870,3 +3863,10 @@ id: 6624 time: '2024-05-26T14:48:34.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28301 +- author: metalgearsloth + changes: + - message: Selectively revert pulling throwing for the short-term. + type: Tweak + id: 6625 + time: '2024-05-27T00:11:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28126 From 5a59c6f262eaaf4fd5da12dbef4f88f89898fe45 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Mon, 27 May 2024 18:04:34 +1000 Subject: [PATCH 058/112] Add loadout group check (#28311) Forgot to add it back in one of the rewrites. --- Content.Shared/Preferences/Loadouts/RoleLoadout.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs index 40e13f0edfa..479974893ce 100644 --- a/Content.Shared/Preferences/Loadouts/RoleLoadout.cs +++ b/Content.Shared/Preferences/Loadouts/RoleLoadout.cs @@ -78,12 +78,20 @@ public void EnsureValid(HumanoidCharacterProfile profile, ICommonSession session { var loadout = loadouts[i]; + // Old prototype or otherwise invalid. if (!protoManager.TryIndex(loadout.Prototype, out var loadoutProto)) { loadouts.RemoveAt(i); continue; } + // Malicious client maybe, check the group even has it. + if (!groupProto.Loadouts.Contains(loadout.Prototype)) + { + loadouts.RemoveAt(i); + continue; + } + // Validate the loadout can be applied (e.g. points). if (!IsValid(profile, session, loadout.Prototype, collection, out _)) { From 224af2af0eefce38d2ab1c3e87b01fbe6d913b20 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 27 May 2024 11:50:05 -0400 Subject: [PATCH 059/112] fix mirror server crashes (#28318) --- .../MagicMirror/SharedMagicMirrorSystem.cs | 25 +++++++++++++------ .../Entities/Structures/Wallmounts/mirror.yml | 1 + 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index ea96d504c6e..789b484cfd3 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -4,7 +4,6 @@ using Content.Shared.Interaction; using Content.Shared.UserInterface; using Robust.Shared.Serialization; -using Robust.Shared.Utility; namespace Content.Shared.MagicMirror; @@ -18,6 +17,7 @@ public override void Initialize() base.Initialize(); SubscribeLocalEvent(OnMagicMirrorInteract); SubscribeLocalEvent(OnBeforeUIOpen); + SubscribeLocalEvent(OnAttemptOpenUI); SubscribeLocalEvent(OnMirrorRangeCheck); } @@ -26,10 +26,8 @@ private void OnMagicMirrorInteract(Entity mirror, ref Afte if (!args.CanReach || args.Target == null) return; - if (!UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) - return; - UpdateInterface(mirror, args.Target.Value, mirror); + UISystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User); } private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) @@ -37,17 +35,27 @@ private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, r if (args.Result == BoundUserInterfaceRangeResult.Fail) return; - DebugTools.Assert(component.Target != null && Exists(component.Target)); + if (component.Target == null || !Exists(component.Target)) + { + component.Target = null; + args.Result = BoundUserInterfaceRangeResult.Fail; + return; + } if (!_interaction.InRangeUnobstructed(uid, component.Target.Value)) args.Result = BoundUserInterfaceRangeResult.Fail; } - private void OnBeforeUIOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) + private void OnAttemptOpenUI(EntityUid uid, MagicMirrorComponent component, ref ActivatableUIOpenAttemptEvent args) { - if (args.User != ent.Comp.Target && ent.Comp.Target != null) - return; + var user = component.Target ?? args.User; + if (!HasComp(user)) + args.Cancel(); + } + + private void OnBeforeUIOpen(Entity ent, ref BeforeActivatableUIOpenEvent args) + { UpdateInterface(ent, args.User, ent); } @@ -55,6 +63,7 @@ protected void UpdateInterface(EntityUid mirrorUid, EntityUid targetUid, MagicMi { if (!TryComp(targetUid, out var humanoid)) return; + component.Target ??= targetUid; var hair = humanoid.MarkingSet.TryGetCategory(MarkingCategories.Hair, out var hairMarkings) diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml index 1fe3318ef55..27b8390add2 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml @@ -19,6 +19,7 @@ changeSlotTime: 0 - type: ActivatableUI key: enum.MagicMirrorUiKey.Key + singleUser: true - type: UserInterface interfaces: enum.MagicMirrorUiKey.Key: From cf8fcb170a185c06c966c1a1dcf7eec7ada52745 Mon Sep 17 00:00:00 2001 From: Pieter-Jan Briers Date: Mon, 27 May 2024 23:52:23 +0200 Subject: [PATCH 060/112] Remove bogus C# finalizers (#28315) Begging people to learn how this programming language works before throwing random syntax into a file. None of these finalizers ever worked. I also checked whether they were memory leaks and needed *proper* shutdown logic, but they're all instantiated-once UI controls that last for the entire lifetime of the program so it's probably fine. --- Content.Client/Interaction/DragDropHelper.cs | 5 ----- .../Systems/Actions/Controls/ActionButtonContainer.cs | 5 ----- .../Systems/Inventory/Controls/ItemSlotButtonContainer.cs | 5 ----- 3 files changed, 15 deletions(-) diff --git a/Content.Client/Interaction/DragDropHelper.cs b/Content.Client/Interaction/DragDropHelper.cs index abe35bf6d9a..e453dfd74bf 100644 --- a/Content.Client/Interaction/DragDropHelper.cs +++ b/Content.Client/Interaction/DragDropHelper.cs @@ -73,11 +73,6 @@ public DragDropHelper(OnBeginDrag onBeginDrag, OnContinueDrag onContinueDrag, On _cfg.OnValueChanged(CCVars.DragDropDeadZone, SetDeadZone, true); } - ~DragDropHelper() - { - _cfg.UnsubValueChanged(CCVars.DragDropDeadZone, SetDeadZone); - } - /// /// Tell the helper that the mouse button was pressed down on /// a target, thus a drag has the possibility to begin for this target. diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs index c5f8adbdea3..38c08dc4721 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs @@ -119,9 +119,4 @@ public IEnumerable GetButtons() yield return button; } } - - ~ActionButtonContainer() - { - UserInterfaceManager.GetUIController().RemoveActionContainer(); - } } diff --git a/Content.Client/UserInterface/Systems/Inventory/Controls/ItemSlotButtonContainer.cs b/Content.Client/UserInterface/Systems/Inventory/Controls/ItemSlotButtonContainer.cs index 78c3b40adac..7a027fc4f81 100644 --- a/Content.Client/UserInterface/Systems/Inventory/Controls/ItemSlotButtonContainer.cs +++ b/Content.Client/UserInterface/Systems/Inventory/Controls/ItemSlotButtonContainer.cs @@ -22,9 +22,4 @@ public ItemSlotButtonContainer() { _inventoryController = UserInterfaceManager.GetUIController(); } - - ~ItemSlotButtonContainer() - { - _inventoryController.RemoveSlotGroup(SlotGroup); - } } From 7309704ace2017e701e1b566359d012067c4107a Mon Sep 17 00:00:00 2001 From: Flareguy <78941145+Flareguy@users.noreply.github.com> Date: Mon, 27 May 2024 16:59:10 -0500 Subject: [PATCH 061/112] Cleans up some entity-related spawnmenu stuff (#28234) * cleans up a lot of stuff in the spawnmenu * skibidi dode * spawners update * Revert "spawners update" This reverts commit bc27d9f556b29f6fb1f89cebbe0ac37e28319fd0. --- .../Prototypes/Entities/Effects/mobspawn.yml | 4 + .../Prototypes/Entities/Effects/wallspawn.yml | 9 ++ .../Devices/Circuitboards/Machine/cannons.yml | 92 +++++++++++++++++++ .../Circuitboards/Machine/production.yml | 86 ----------------- .../Entities/Structures/Shuttles/cannons.yml | 9 +- 5 files changed, 113 insertions(+), 87 deletions(-) create mode 100644 Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml diff --git a/Resources/Prototypes/Entities/Effects/mobspawn.yml b/Resources/Prototypes/Entities/Effects/mobspawn.yml index fb59aa3fc46..2fad68d7f2c 100644 --- a/Resources/Prototypes/Entities/Effects/mobspawn.yml +++ b/Resources/Prototypes/Entities/Effects/mobspawn.yml @@ -1,6 +1,7 @@ - type: entity id: MobSpawnCrabQuartz name: mobspawner quartzcrab + noSpawn: True components: - type: Transform anchored: True @@ -30,6 +31,7 @@ id: MobSpawnCrabIron parent: MobSpawnCrabQuartz name: mobspawner ironcrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi @@ -41,6 +43,7 @@ id: MobSpawnCrabSilver parent: MobSpawnCrabQuartz name: mobspawner silvercrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi @@ -52,6 +55,7 @@ id: MobSpawnCrabUranium parent: MobSpawnCrabQuartz name: mobspawner uraniumcrab + noSpawn: True components: - type: Sprite sprite: /Textures/Effects/mobspawn.rsi diff --git a/Resources/Prototypes/Entities/Effects/wallspawn.yml b/Resources/Prototypes/Entities/Effects/wallspawn.yml index f1bd236a8ab..7213763c469 100644 --- a/Resources/Prototypes/Entities/Effects/wallspawn.yml +++ b/Resources/Prototypes/Entities/Effects/wallspawn.yml @@ -1,5 +1,6 @@ - type: entity id: WallSpawnAsteroid + noSpawn: True components: - type: Transform anchored: True @@ -28,6 +29,7 @@ - type: entity id: WallSpawnAsteroidUraniumCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockUraniumCrab @@ -35,6 +37,7 @@ - type: entity id: WallSpawnAsteroidUranium parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockUranium @@ -42,6 +45,7 @@ - type: entity id: WallSpawnAsteroidQuartzCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockQuartzCrab @@ -49,6 +53,7 @@ - type: entity id: WallSpawnAsteroidQuartz parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockQuartz @@ -56,6 +61,7 @@ - type: entity id: WallSpawnAsteroidSilverCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockSilverCrab @@ -63,6 +69,7 @@ - type: entity id: WallSpawnAsteroidSilver parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockSilver @@ -70,6 +77,7 @@ - type: entity id: WallSpawnAsteroidIronCrab parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockTinCrab @@ -77,6 +85,7 @@ - type: entity id: WallSpawnAsteroidIron parent: WallSpawnAsteroid + noSpawn: True components: - type: SpawnOnDespawn prototype: AsteroidRockTin \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml new file mode 100644 index 00000000000..6db7f4b385e --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/cannons.yml @@ -0,0 +1,92 @@ +# Most of these have DO NOT MAP, since stations are completely unequipped to deal with ship combat + these are basically placeholder. + +- type: entity + id: ShuttleGunSvalinnMachineGunCircuitboard + parent: BaseMachineCircuitboard + name: LSE-400c "Svalinn machine gun" machine board + description: A machine printed circuit board for an LSE-400c "Svalinn machine gun" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunSvalinnMachineGun + requirements: + MatterBin: 2 + Manipulator: 4 + materialRequirements: + Steel: 5 + CableHV: 5 + +- type: entity + id: ShuttleGunPerforatorCircuitboard + parent: BaseMachineCircuitboard + name: LSE-1200c "Perforator" machine board + description: A machine printed circuit board for an LSE-1200c "Perforator" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunPerforator + requirements: + MatterBin: 4 + Manipulator: 6 + materialRequirements: + Steel: 10 + CableHV: 5 + +- type: entity + id: ShuttleGunFriendshipCircuitboard + parent: BaseMachineCircuitboard + name: EXP-320g "Friendship" machine board + description: A machine printed circuit board for an EXP-320g "Friendship" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunFriendship + requirements: + MatterBin: 3 + Manipulator: 2 + materialRequirements: + Steel: 7 + CableHV: 5 + +- type: entity + id: ShuttleGunDusterCircuitboard + parent: BaseMachineCircuitboard + name: EXP-2100g "Duster" machine board + description: A machine printed circuit board for an EXP-2100g "Duster" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunDuster + requirements: + MatterBin: 6 + Manipulator: 4 + materialRequirements: + Steel: 10 + CableHV: 5 + Uranium: 2 + +- type: entity + id: ShuttleGunKineticCircuitboard + parent: BaseMachineCircuitboard + name: PTK-800 "Matter Dematerializer" machine board + description: A machine printed circuit board for an PTK-800 "Matter Dematerializer" + suffix: DO NOT MAP, Machine Board + components: + - type: Sprite + state: security + - type: MachineBoard + prototype: ShuttleGunKinetic + requirements: + MatterBin: 2 + Manipulator: 3 + materialRequirements: + Steel: 5 + CableHV: 2 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml index 7f25d00a05f..587e56865b4 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Circuitboards/Machine/production.yml @@ -1277,92 +1277,6 @@ CableHV: 5 Uranium: 2 -- type: entity - id: ShuttleGunSvalinnMachineGunCircuitboard - parent: BaseMachineCircuitboard - name: LSE-400c "Svalinn machine gun" machine board - description: A machine printed circuit board for an LSE-400c "Svalinn machine gun" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunSvalinnMachineGun - requirements: - MatterBin: 2 - Manipulator: 4 - materialRequirements: - Steel: 5 - CableHV: 5 - -- type: entity - id: ShuttleGunPerforatorCircuitboard - parent: BaseMachineCircuitboard - name: LSE-1200c "Perforator" machine board - description: A machine printed circuit board for an LSE-1200c "Perforator" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunPerforator - requirements: - MatterBin: 4 - Manipulator: 6 - materialRequirements: - Steel: 10 - CableHV: 5 - -- type: entity - id: ShuttleGunFriendshipCircuitboard - parent: BaseMachineCircuitboard - name: EXP-320g "Friendship" machine board - description: A machine printed circuit board for an EXP-320g "Friendship" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunFriendship - requirements: - MatterBin: 3 - Manipulator: 2 - materialRequirements: - Steel: 7 - CableHV: 5 - -- type: entity - id: ShuttleGunDusterCircuitboard - parent: BaseMachineCircuitboard - name: EXP-2100g "Duster" machine board - description: A machine printed circuit board for an EXP-2100g "Duster" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunDuster - requirements: - MatterBin: 6 - Manipulator: 4 - materialRequirements: - Steel: 10 - CableHV: 5 - Uranium: 2 - -- type: entity - id: ShuttleGunKineticCircuitboard - parent: BaseMachineCircuitboard - name: PTK-800 "Matter Dematerializer" machine board - description: A machine printed circuit board for an PTK-800 "Matter Dematerializer" - components: - - type: Sprite - state: security - - type: MachineBoard - prototype: ShuttleGunKinetic - requirements: - MatterBin: 2 - Manipulator: 3 - materialRequirements: - Steel: 5 - CableHV: 2 - - type: entity parent: BaseMachineCircuitboard id: ReagentGrinderIndustrialMachineCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml b/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml index 3368e2d7ee0..08eff29c81b 100644 --- a/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml +++ b/Resources/Prototypes/Entities/Structures/Shuttles/cannons.yml @@ -1,3 +1,5 @@ +# Most of these have DO NOT MAP, since stations are completely unequipped to deal with ship combat + these are basically placeholder. + - type: entity id: ShuttleGunBase name: shittle gun @@ -58,7 +60,8 @@ id: ShuttleGunSvalinnMachineGun parent: [ ShuttleGunBase, ConstructibleMachine] name: LSE-400c "Svalinn machine gun" - description: Basic stationary laser unit. Effective against live targets and electronics. Uses regular power cells to fire, and has an extremely high rate of fire + description: Basic stationary laser unit. Effective against live targets and electronics. Uses regular power cells to fire, and has an extremely high rate of fire. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/laser.rsi @@ -112,6 +115,7 @@ parent: [ ShuttleGunBase, ConstructibleMachine] name: LSE-1200c "Perforator" description: Advanced stationary laser unit. Annihilates electronics and is extremely dangerous to health! Uses the power cage to fire. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/laser.rsi @@ -167,6 +171,7 @@ parent: [ShuttleGunBase, ConstructibleMachine] name: EXP-320g "Friendship" description: A small stationary grenade launcher that holds 2 grenades. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/launcher.rsi @@ -220,6 +225,7 @@ parent: [ShuttleGunBase, ConstructibleMachine] name: EXP-2100g "Duster" description: A powerful stationary grenade launcher. A cartridge is required for use. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/launcher.rsi @@ -317,6 +323,7 @@ parent: [ ShuttleGunBase, ConstructibleMachine] name: PTK-800 "Matter Dematerializer" description: Salvage stationary mining turret. Gradually accumulates charges on its own, extremely effective for asteroid excavation. + suffix: DO NOT MAP components: - type: Sprite sprite: Objects/Weapons/Guns/Shuttles/kinetic.rsi From 984af3584f3c54037c0571db6fe35098884a5b00 Mon Sep 17 00:00:00 2001 From: alex-georgeff <54858069+taurie@users.noreply.github.com> Date: Mon, 27 May 2024 18:00:19 -0400 Subject: [PATCH 062/112] Rewords plant/effect descriptions for clarity (#28156) (#28169) * Rewords plant/effect descriptions for clarity (#28156) * Forgot Robust Harvest. * Update Resources/Locale/en-US/guidebook/chemistry/effects.ftl --------- Co-authored-by: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> --- Resources/Locale/en-US/guidebook/chemistry/effects.ftl | 6 +++--- Resources/Locale/en-US/reagents/meta/botany.ftl | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl index 5579c95e9df..1dacebd1349 100644 --- a/Resources/Locale/en-US/guidebook/chemistry/effects.ftl +++ b/Resources/Locale/en-US/guidebook/chemistry/effects.ftl @@ -365,9 +365,9 @@ reagent-effect-guidebook-plant-cryoxadone = reagent-effect-guidebook-plant-phalanximine = { $chance -> - [1] Makes - *[other] make - } a plant not viable due to mutation viable again + [1] Restores + *[other] restore + } viability to a plant rendered nonviable by a mutation reagent-effect-guidebook-plant-diethylamine = { $chance -> diff --git a/Resources/Locale/en-US/reagents/meta/botany.ftl b/Resources/Locale/en-US/reagents/meta/botany.ftl index 912ded5cf29..c7101c23279 100644 --- a/Resources/Locale/en-US/reagents/meta/botany.ftl +++ b/Resources/Locale/en-US/reagents/meta/botany.ftl @@ -11,7 +11,7 @@ reagent-name-plant-b-gone = plant-B-gone reagent-desc-plant-b-gone = A harmful toxic mixture to kill plantlife. Very effective against kudzu. reagent-name-robust-harvest = robust harvest -reagent-desc-robust-harvest = A highly effective fertilizer, with a limited potency-boosting effect on plants. Be careful with it's usage since using too much has a chance to reduce the plant yield. It has a positive effect on dionas. +reagent-desc-robust-harvest = A highly effective fertilizer with a limited potency-boosting effect on plants. Use it cautiously, as excessive application can reduce plant yield. It has a particularly beneficial effect on dionas. reagent-name-weed-killer = weed killer reagent-desc-weed-killer = A mixture that targets weeds. Very effective against kudzu. While useful it slowly poisons plants with toxins, be careful when using it. From 44b93e68ee0d6eb98933b4c8520e7e8e966cce35 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 27 May 2024 18:37:27 -0400 Subject: [PATCH 063/112] Prevent stacking pipes (#28308) * prevent stacking pipes * access * notafet review * notafet review pt. 2 * not the actual fix --- .../PipeRestrictOverlapComponent.cs | 9 ++ .../PipeRestrictOverlapSystem.cs | 123 ++++++++++++++++++ .../ConstructionSystem.Initial.cs | 39 +++--- .../NodeContainer/Nodes/PipeNode.cs | 16 +-- .../conditions/no-unstackable-in-tile.ftl | 1 + .../Structures/Piping/Atmospherics/binary.yml | 1 + .../Structures/Piping/Atmospherics/pipes.yml | 1 + .../Structures/Piping/Atmospherics/unary.yml | 2 + .../Structures/Power/Generation/teg.yml | 1 + 9 files changed, 170 insertions(+), 23 deletions(-) create mode 100644 Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs create mode 100644 Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs diff --git a/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs b/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs new file mode 100644 index 00000000000..49e1a8c94d3 --- /dev/null +++ b/Content.Server/Atmos/Components/PipeRestrictOverlapComponent.cs @@ -0,0 +1,9 @@ +using Content.Server.Atmos.EntitySystems; + +namespace Content.Server.Atmos.Components; + +/// +/// This is used for restricting anchoring pipes so that they do not overlap. +/// +[RegisterComponent, Access(typeof(PipeRestrictOverlapSystem))] +public sealed partial class PipeRestrictOverlapComponent : Component; diff --git a/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs new file mode 100644 index 00000000000..c2ff87ca79c --- /dev/null +++ b/Content.Server/Atmos/EntitySystems/PipeRestrictOverlapSystem.cs @@ -0,0 +1,123 @@ +using System.Linq; +using Content.Server.Atmos.Components; +using Content.Server.NodeContainer; +using Content.Server.NodeContainer.Nodes; +using Content.Server.Popups; +using Content.Shared.Atmos; +using Content.Shared.Construction.Components; +using JetBrains.Annotations; +using Robust.Server.GameObjects; +using Robust.Shared.Map.Components; + +namespace Content.Server.Atmos.EntitySystems; + +/// +/// This handles restricting pipe-based entities from overlapping outlets/inlets with other entities. +/// +public sealed class PipeRestrictOverlapSystem : EntitySystem +{ + [Dependency] private readonly MapSystem _map = default!; + [Dependency] private readonly PopupSystem _popup = default!; + [Dependency] private readonly TransformSystem _xform = default!; + + private readonly List _anchoredEntities = new(); + private EntityQuery _nodeContainerQuery; + + /// + public override void Initialize() + { + SubscribeLocalEvent(OnAnchorStateChanged); + SubscribeLocalEvent(OnAnchorAttempt); + + _nodeContainerQuery = GetEntityQuery(); + } + + private void OnAnchorStateChanged(Entity ent, ref AnchorStateChangedEvent args) + { + if (!args.Anchored) + return; + + if (HasComp(ent) && CheckOverlap(ent)) + { + _popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent); + _xform.Unanchor(ent, Transform(ent)); + } + } + + private void OnAnchorAttempt(Entity ent, ref AnchorAttemptEvent args) + { + if (args.Cancelled) + return; + + if (!_nodeContainerQuery.TryComp(ent, out var node)) + return; + + var xform = Transform(ent); + if (CheckOverlap((ent, node, xform))) + { + _popup.PopupEntity(Loc.GetString("pipe-restrict-overlap-popup-blocked", ("pipe", ent.Owner)), ent, args.User); + args.Cancel(); + } + } + + [PublicAPI] + public bool CheckOverlap(EntityUid uid) + { + if (!_nodeContainerQuery.TryComp(uid, out var node)) + return false; + + return CheckOverlap((uid, node, Transform(uid))); + } + + public bool CheckOverlap(Entity ent) + { + if (ent.Comp2.GridUid is not { } grid || !TryComp(grid, out var gridComp)) + return false; + + var indices = _map.TileIndicesFor(grid, gridComp, ent.Comp2.Coordinates); + _anchoredEntities.Clear(); + _map.GetAnchoredEntities((grid, gridComp), indices, _anchoredEntities); + + foreach (var otherEnt in _anchoredEntities) + { + // this should never actually happen but just for safety + if (otherEnt == ent.Owner) + continue; + + if (!_nodeContainerQuery.TryComp(otherEnt, out var otherComp)) + continue; + + if (PipeNodesOverlap(ent, (otherEnt, otherComp, Transform(otherEnt)))) + return true; + } + + return false; + } + + public bool PipeNodesOverlap(Entity ent, Entity other) + { + var entDirs = GetAllDirections(ent).ToList(); + var otherDirs = GetAllDirections(other).ToList(); + + foreach (var dir in entDirs) + { + foreach (var otherDir in otherDirs) + { + if ((dir & otherDir) != 0) + return true; + } + } + + return false; + + IEnumerable GetAllDirections(Entity pipe) + { + foreach (var node in pipe.Comp1.Nodes.Values) + { + // we need to rotate the pipe manually like this because the rotation doesn't update for pipes that are unanchored. + if (node is PipeNode pipeNode) + yield return pipeNode.OriginalPipeDirection.RotatePipeDirection(pipe.Comp2.LocalRotation); + } + } + } +} diff --git a/Content.Server/Construction/ConstructionSystem.Initial.cs b/Content.Server/Construction/ConstructionSystem.Initial.cs index 17ed5c90f4d..04d3722c66c 100644 --- a/Content.Server/Construction/ConstructionSystem.Initial.cs +++ b/Content.Server/Construction/ConstructionSystem.Initial.cs @@ -15,6 +15,7 @@ using Content.Shared.Inventory; using Content.Shared.Storage; using Robust.Shared.Containers; +using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Timing; @@ -91,7 +92,14 @@ private IEnumerable EnumerateNearby(EntityUid user) } // LEGACY CODE. See warning at the top of the file! - private async Task Construct(EntityUid user, string materialContainer, ConstructionGraphPrototype graph, ConstructionGraphEdge edge, ConstructionGraphNode targetNode) + private async Task Construct( + EntityUid user, + string materialContainer, + ConstructionGraphPrototype graph, + ConstructionGraphEdge edge, + ConstructionGraphNode targetNode, + EntityCoordinates coords, + Angle angle = default) { // We need a place to hold our construction items! var container = _container.EnsureContainer(user, materialContainer, out var existed); @@ -261,7 +269,7 @@ void ShutdownContainers() } var newEntityProto = graph.Nodes[edge.Target].Entity.GetId(null, user, new(EntityManager)); - var newEntity = EntityManager.SpawnEntity(newEntityProto, EntityManager.GetComponent(user).Coordinates); + var newEntity = Spawn(newEntityProto, _transformSystem.ToMapCoordinates(coords), rotation: angle); if (!TryComp(newEntity, out ConstructionComponent? construction)) { @@ -376,7 +384,13 @@ public async Task TryStartItemConstruction(string prototype, EntityUid use } } - if (await Construct(user, "item_construction", constructionGraph, edge, targetNode) is not { Valid: true } item) + if (await Construct( + user, + "item_construction", + constructionGraph, + edge, + targetNode, + Transform(user).Coordinates) is not { Valid: true } item) return false; // Just in case this is a stack, attempt to merge it. If it isn't a stack, this will just normally pick up @@ -511,23 +525,18 @@ void Cleanup() return; } - if (await Construct(user, (ev.Ack + constructionPrototype.GetHashCode()).ToString(), constructionGraph, - edge, targetNode) is not {Valid: true} structure) + if (await Construct(user, + (ev.Ack + constructionPrototype.GetHashCode()).ToString(), + constructionGraph, + edge, + targetNode, + GetCoordinates(ev.Location), + constructionPrototype.CanRotate ? ev.Angle : Angle.Zero) is not {Valid: true} structure) { Cleanup(); return; } - // We do this to be able to move the construction to its proper position in case it's anchored... - // Oh wow transform anchoring is amazing wow I love it!!!! - // ikr - var xform = Transform(structure); - var wasAnchored = xform.Anchored; - xform.Anchored = false; - xform.Coordinates = GetCoordinates(ev.Location); - xform.LocalRotation = constructionPrototype.CanRotate ? ev.Angle : Angle.Zero; - xform.Anchored = wasAnchored; - RaiseNetworkEvent(new AckStructureConstructionMessage(ev.Ack, GetNetEntity(structure))); _adminLogger.Add(LogType.Construction, LogImpact.Low, $"{ToPrettyString(user):player} has turned a {ev.PrototypeName} construction ghost into {ToPrettyString(structure)} at {Transform(structure).Coordinates}"); Cleanup(); diff --git a/Content.Server/NodeContainer/Nodes/PipeNode.cs b/Content.Server/NodeContainer/Nodes/PipeNode.cs index 861f3eea98d..31ee5712493 100644 --- a/Content.Server/NodeContainer/Nodes/PipeNode.cs +++ b/Content.Server/NodeContainer/Nodes/PipeNode.cs @@ -20,7 +20,7 @@ public partial class PipeNode : Node, IGasMixtureHolder, IRotatableNode /// The directions in which this pipe can connect to other pipes around it. /// [DataField("pipeDirection")] - private PipeDirection _originalPipeDirection; + public PipeDirection OriginalPipeDirection; /// /// The *current* pipe directions (accounting for rotation) @@ -110,26 +110,26 @@ public override void Initialize(EntityUid owner, IEntityManager entMan) return; var xform = entMan.GetComponent(owner); - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(xform.LocalRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(xform.LocalRotation); } bool IRotatableNode.RotateNode(in MoveEvent ev) { - if (_originalPipeDirection == PipeDirection.Fourway) + if (OriginalPipeDirection == PipeDirection.Fourway) return false; // update valid pipe direction if (!RotationsEnabled) { - if (CurrentPipeDirection == _originalPipeDirection) + if (CurrentPipeDirection == OriginalPipeDirection) return false; - CurrentPipeDirection = _originalPipeDirection; + CurrentPipeDirection = OriginalPipeDirection; return true; } var oldDirection = CurrentPipeDirection; - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(ev.NewRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(ev.NewRotation); return oldDirection != CurrentPipeDirection; } @@ -142,12 +142,12 @@ public override void OnAnchorStateChanged(IEntityManager entityManager, bool anc if (!RotationsEnabled) { - CurrentPipeDirection = _originalPipeDirection; + CurrentPipeDirection = OriginalPipeDirection; return; } var xform = entityManager.GetComponent(Owner); - CurrentPipeDirection = _originalPipeDirection.RotatePipeDirection(xform.LocalRotation); + CurrentPipeDirection = OriginalPipeDirection.RotatePipeDirection(xform.LocalRotation); } public override IEnumerable GetReachableNodes(TransformComponent xform, diff --git a/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl b/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl index 37ce0de9e8e..715825e801c 100644 --- a/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl +++ b/Resources/Locale/en-US/construction/conditions/no-unstackable-in-tile.ftl @@ -1 +1,2 @@ construction-step-condition-no-unstackable-in-tile = You cannot make a stack of similar devices. +pipe-restrict-overlap-popup-blocked = { CAPITALIZE(THE($pipe))} doesn't fit over the other pipes! diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index fa5804c6452..213b0b893d9 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -358,6 +358,7 @@ - type: PipeColorVisuals - type: Rotatable - type: GasRecycler + - type: PipeRestrictOverlap - type: NodeContainer nodes: inlet: diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml index 0025fc5ae1b..c2fc4e0565b 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/pipes.yml @@ -51,6 +51,7 @@ - type: Appearance - type: PipeColorVisuals - type: NodeContainer + - type: PipeRestrictOverlap - type: AtmosUnsafeUnanchor - type: AtmosPipeColor - type: Tag diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index c0664602b49..d301f43c788 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -246,6 +246,7 @@ key: enum.ThermomachineUiKey.Key - type: WiresPanel - type: WiresVisuals + - type: PipeRestrictOverlap - type: NodeContainer nodes: pipe: @@ -420,6 +421,7 @@ - type: GasCondenser - type: AtmosPipeColor - type: AtmosDevice + - type: PipeRestrictOverlap - type: ApcPowerReceiver powerLoad: 10000 - type: Machine diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml index 9a378c26a44..78d979ab8eb 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/teg.yml @@ -176,6 +176,7 @@ nodeGroupID: Teg - type: AtmosUnsafeUnanchor + - type: PipeRestrictOverlap - type: TegCirculator - type: StealTarget stealGroup: Teg From ab3abfde17c22b507f6d28c40206b832b89185db Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 27 May 2024 22:38:34 +0000 Subject: [PATCH 064/112] 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 31c41b9ed5b..e45f9d83ccf 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: Ubaser - changes: - - message: Unpressurized areas now deal heat damage along with blunt. - type: Tweak - id: 6126 - time: '2024-03-12T02:38:40.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25770 - author: nikthechampiongr changes: - message: Recyclers now leave logs when they gib people. @@ -3870,3 +3863,12 @@ id: 6625 time: '2024-05-27T00:11:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28126 +- author: EmoGarbage404 + changes: + - message: Multiple pipes facing the same direction can no longer be placed on the + same tile. You can still have overlapping straight pipes or corners going in + opposite directions. + type: Fix + id: 6626 + time: '2024-05-27T22:37:27.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28308 From 0805637807776872ec39dec47f51b278b55dde0c Mon Sep 17 00:00:00 2001 From: Emisse <99158783+Emisse@users.noreply.github.com> Date: Mon, 27 May 2024 16:40:00 -0600 Subject: [PATCH 065/112] derotate train atm until i redo its atmos (#28328) webedit webedit webedit --- Resources/Prototypes/Maps/Pools/default.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Resources/Prototypes/Maps/Pools/default.yml b/Resources/Prototypes/Maps/Pools/default.yml index 245ccce4b7b..5c6b0eee0d7 100644 --- a/Resources/Prototypes/Maps/Pools/default.yml +++ b/Resources/Prototypes/Maps/Pools/default.yml @@ -15,4 +15,4 @@ - Saltern - Packed - Reach - - Train + #- Train From 5f533e8753a81a543fba843b83e96b505f7e9f2e Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 27 May 2024 22:41:06 +0000 Subject: [PATCH 066/112] Automatic changelog update --- Resources/Changelog/Changelog.yml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index e45f9d83ccf..4dbcc6de133 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,13 +1,4 @@ Entries: -- author: nikthechampiongr - changes: - - message: Recyclers now leave logs when they gib people. - type: Add - - message: People sending a broadcast in the communications console now leave logs. - type: Add - id: 6127 - time: '2024-03-12T10:57:05.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26008 - author: ShadowCommander changes: - message: Fixed arrivals shuttle not docking with the station when it was slowly @@ -3872,3 +3863,10 @@ id: 6626 time: '2024-05-27T22:37:27.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28308 +- author: Emisse + changes: + - message: Derotate Train temporarily + type: Tweak + id: 6627 + time: '2024-05-27T22:40:00.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28328 From 217d081b29f7c15dccfa43d43d5f83121b75370b Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 27 May 2024 18:43:17 -0400 Subject: [PATCH 067/112] Fix under-selecting antags (#28327) Fix under selecting antags --- .../Antag/AntagSelectionSystem.API.cs | 23 +++++++++++++++---- Content.Server/Antag/AntagSelectionSystem.cs | 2 +- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.API.cs b/Content.Server/Antag/AntagSelectionSystem.API.cs index 3b5855cdf95..16d83c4f3fc 100644 --- a/Content.Server/Antag/AntagSelectionSystem.API.cs +++ b/Content.Server/Antag/AntagSelectionSystem.API.cs @@ -52,12 +52,26 @@ public bool TryGetNextAvailableDefinition(Entity ent, /// Gets the number of antagonists that should be present for a given rule based on the provided pool. /// A null pool will simply use the player count. /// - public int GetTargetAntagCount(Entity ent, AntagSelectionPlayerPool? pool = null) + public int GetTargetAntagCount(Entity ent, int? playerCount = null) { var count = 0; foreach (var def in ent.Comp.Definitions) { - count += GetTargetAntagCount(ent, pool, def); + count += GetTargetAntagCount(ent, playerCount, def); + } + + return count; + } + + public int GetTotalPlayerCount(IList pool) + { + var count = 0; + foreach (var session in pool) + { + if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) + continue; + + count++; } return count; @@ -67,14 +81,13 @@ public int GetTargetAntagCount(Entity ent, AntagSelecti /// Gets the number of antagonists that should be present for a given antag definition based on the provided pool. /// A null pool will simply use the player count. /// - public int GetTargetAntagCount(Entity ent, AntagSelectionPlayerPool? pool, AntagSelectionDefinition def) + public int GetTargetAntagCount(Entity ent, int? playerCount, AntagSelectionDefinition def) { // TODO ANTAG // make pool non-nullable // Review uses and ensure that people are INTENTIONALLY including players in the lobby if this is a mid-round // antag selection. - var poolSize = pool?.Count ?? _playerManager.Sessions - .Count(s => s.State.Status is not SessionStatus.Disconnected and not SessionStatus.Zombie); + var poolSize = playerCount ?? GetTotalPlayerCount(_playerManager.Sessions); // factor in other definitions' affect on the count. var countOffset = 0; diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index 5b6c891ddfc..a86611bedb3 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -203,7 +203,7 @@ public void ChooseAntags(Entity ent, IList ent, IList pool, AntagSelectionDefinition def) { var playerPool = GetPlayerPool(ent, pool, def); - var count = GetTargetAntagCount(ent, playerPool, def); + var count = GetTargetAntagCount(ent, GetTotalPlayerCount(pool), def); for (var i = 0; i < count; i++) { From 056097e4815001f6f39e18c0de8ec05df3b23d77 Mon Sep 17 00:00:00 2001 From: PJBot Date: Mon, 27 May 2024 22:44:23 +0000 Subject: [PATCH 068/112] 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 4dbcc6de133..98ec517a502 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: ShadowCommander - changes: - - message: Fixed arrivals shuttle not docking with the station when it was slowly - spinning. - type: Fix - id: 6128 - time: '2024-03-12T12:57:35.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26033 - author: liltenhead changes: - message: Buffed the zombie virus to do purely poison damage, and more likely to @@ -3870,3 +3862,10 @@ id: 6627 time: '2024-05-27T22:40:00.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28328 +- author: EmoGarbage404 + changes: + - message: Fixed not enough antags being selected for gamemodes. + type: Fix + id: 6628 + time: '2024-05-27T22:43:17.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28327 From 5ac66306711e5e3424f84946482b33e20f9936ae Mon Sep 17 00:00:00 2001 From: Kara Date: Mon, 27 May 2024 16:09:40 -0700 Subject: [PATCH 069/112] Update engine to 223.2.0 (#28329) --- RobustToolbox | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RobustToolbox b/RobustToolbox index 796abe12305..721408bb373 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit 796abe1230554c31daffbfa6559a0a4bcf50b1af +Subproject commit 721408bb37317e7a66cd34655e068369c47912ac From 4e09743d44d2d81d6f34d11cefcbacb39b6aa9d0 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 27 May 2024 20:04:32 -0400 Subject: [PATCH 070/112] remove firefighting remote and bolting firelocks (#28330) remove firefighting remote --- Resources/Prototypes/Access/engineering.yml | 6 ------ .../Catalog/Fills/Lockers/engineer.yml | 2 -- .../Entities/Objects/Devices/door_remote.yml | 18 ------------------ .../Structures/Doors/Firelocks/firelock.yml | 3 --- Resources/migration.yml | 3 +++ 5 files changed, 3 insertions(+), 29 deletions(-) diff --git a/Resources/Prototypes/Access/engineering.yml b/Resources/Prototypes/Access/engineering.yml index 94901fdf7af..f2f79fa805f 100644 --- a/Resources/Prototypes/Access/engineering.yml +++ b/Resources/Prototypes/Access/engineering.yml @@ -16,9 +16,3 @@ - ChiefEngineer - Engineering - Atmospherics - -- type: accessGroup - id: FireFight - tags: - - Engineering - - Atmospherics diff --git a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml index d9d9071d444..1bf7a9443b5 100644 --- a/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml +++ b/Resources/Prototypes/Catalog/Fills/Lockers/engineer.yml @@ -94,7 +94,6 @@ - id: GasAnalyzer - id: MedkitOxygenFilled - id: HolofanProjector - - id: DoorRemoteFirefight - id: RCD - id: RCDAmmo @@ -111,7 +110,6 @@ - id: GasAnalyzer - id: MedkitOxygenFilled - id: HolofanProjector - - id: DoorRemoteFirefight - id: RCD - id: RCDAmmo diff --git a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml index 25ac56a6dab..a368ec2b65d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/door_remote.yml @@ -142,24 +142,6 @@ groups: - Engineering -- type: entity - parent: DoorRemoteDefault - id: DoorRemoteFirefight - name: fire-fighting door remote - description: A gadget which can open and bolt FireDoors remotely. - components: - - type: Sprite - layers: - - state: door_remotebase - - state: door_remotelightscolour - color: "#ff9900" - - state: door_remotescreencolour - color: "#e02020" - - - type: Access - groups: - - FireFight - - type: entity parent: DoorRemoteDefault id: DoorRemoteAll diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index 860db862aee..c098409f3aa 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -105,9 +105,6 @@ arc: 360 - type: StaticPrice price: 150 - - type: DoorBolt - - type: AccessReader - access: [ [ "Engineering" ] ] - type: PryUnpowered pryModifier: 0.5 diff --git a/Resources/migration.yml b/Resources/migration.yml index c19f1408707..cf1a0f7a602 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -342,3 +342,6 @@ chem_master: ChemMaster # 2024-05-21 CrateJanitorExplosive: ClosetJanitorBombFilled + +# 2024-05-27 +DoorRemoteFirefight: null From a57b4ff520bef91365dba5912f5a996c4dd1ac7c Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 28 May 2024 00:05:38 +0000 Subject: [PATCH 071/112] 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 98ec517a502..7fa7746b62e 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: liltenhead - changes: - - message: Buffed the zombie virus to do purely poison damage, and more likely to - spread the infection per bite. - type: Tweak - id: 6129 - time: '2024-03-12T18:44:09.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25954 - author: UnicornOnLSD changes: - message: brought back the classic crew cut as an alternative to the current one @@ -3869,3 +3861,10 @@ id: 6628 time: '2024-05-27T22:43:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28327 +- author: EmoGarbage404 + changes: + - message: Removed the fire-fighting remote. + type: Remove + id: 6629 + time: '2024-05-28T00:04:32.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28330 From 0a0c0f37a1d331f26dd2c709ab02da6af3a6c48c Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Tue, 28 May 2024 02:46:54 +0200 Subject: [PATCH 072/112] Add popup for owner when inserting item in hand (#28032) --- Content.Server/Strip/StrippableSystem.cs | 3 +++ Resources/Locale/en-US/strip/strippable-component.ftl | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 397396de501..ded9eab3eb2 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -413,6 +413,9 @@ private void StartStripInsertHand( var (time, stealth) = GetStripTimeModifiers(user, target, targetStrippable.HandStripDelay); + if (!stealth) + _popupSystem.PopupEntity(Loc.GetString("strippable-component-alert-owner-insert-hand", ("user", Identity.Entity(user, EntityManager)), ("item", user.Comp.ActiveHandEntity!.Value)), target, target, PopupType.Large); + var prefix = stealth ? "stealthily " : ""; _adminLogger.Add(LogType.Stripping, LogImpact.Low, $"{ToPrettyString(user):actor} is trying to {prefix}place the item {ToPrettyString(held):item} in {ToPrettyString(target):target}'s hands"); diff --git a/Resources/Locale/en-US/strip/strippable-component.ftl b/Resources/Locale/en-US/strip/strippable-component.ftl index 7654b20b03f..ee37a5e90c1 100644 --- a/Resources/Locale/en-US/strip/strippable-component.ftl +++ b/Resources/Locale/en-US/strip/strippable-component.ftl @@ -9,6 +9,7 @@ strippable-component-cannot-drop-message = {$owner} cannot drop that! strippable-component-alert-owner = {$user} is removing your {$item}! strippable-component-alert-owner-hidden = You feel someone fumbling in your {$slot}! strippable-component-alert-owner-insert = {$user} is putting {$item} on you! +strippable-component-alert-owner-insert-hand = {$user} is putting {$item} in your hand! # generic warning for when a user interacts with your equipped items. strippable-component-alert-owner-interact = {$user} is fumbling around with your {$item}! @@ -19,4 +20,4 @@ strip-verb-get-data-text = Strip ## UI strippable-bound-user-interface-stripping-menu-title = {$ownerName}'s inventory -strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints \ No newline at end of file +strippable-bound-user-interface-stripping-menu-ensnare-button = Remove Leg Restraints From b95df6530dec1a5b62f340d5717587e9ca8332df Mon Sep 17 00:00:00 2001 From: Ghagliiarghii <68826635+Ghagliiarghii@users.noreply.github.com> Date: Mon, 27 May 2024 20:51:30 -0400 Subject: [PATCH 073/112] Update Antagonists Guidebook Sections (#27931) * Update MinorAntagonists.xml Flesh out the Rat King and Space Dragon sections of MinorAntagonists.xml in the guidebook. * Rope the rest of the Guidebook Antag Entries into this (except Zombies they were fine) - Also fix two typos I discovered during research * oops missed a hyphen * Sydnicate :despair: * AUTOTELL ON -> OPERATIVES --- .../Entities/Objects/Misc/implanters.yml | 2 +- .../Objects/Misc/subdermal_implants.yml | 2 +- Resources/Prototypes/Objectives/ninja.yml | 2 +- .../Guidebook/Antagonist/MinorAntagonists.xml | 28 ++++++---- .../Antagonist/Nuclear Operatives.xml | 41 +++++++------- .../Guidebook/Antagonist/Revolutionaries.xml | 17 +++--- .../Guidebook/Antagonist/SpaceNinja.xml | 29 +++++----- .../Guidebook/Antagonist/Traitors.xml | 54 ++++++++++--------- 8 files changed, 96 insertions(+), 79 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml index c09deb13071..532bcadeb53 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/implanters.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/implanters.yml @@ -246,7 +246,7 @@ - type: entity id: MindShieldImplanter - name: mind-shield implanter + name: mindshield implanter parent: BaseImplantOnlyImplanter components: - type: Implanter diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index a0f5e254d5f..c92985c2cba 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -317,7 +317,7 @@ - type: entity parent: BaseSubdermalImplant id: MindShieldImplant - name: mind-shield implant + name: mindshield implant description: This implant will ensure loyalty to Nanotrasen and prevent mind control devices. noSpawn: true components: diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index 0203059c2c4..bc17992e90d 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -4,7 +4,7 @@ id: BaseNinjaObjective components: - type: Objective - # difficulty isn't used all since objectives are picked + # difficulty isn't used since all objectives are picked difficulty: 1.5 issuer: spiderclan - type: RoleRequirement diff --git a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml index 8d96573a3d0..1a3486b301b 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/MinorAntagonists.xml @@ -27,22 +27,21 @@ # Rat King - - + - A Rat King is a giant rat capable of setting a nest and creating rats to do their bidding (usually to get food). + A Rat King is a gigantic rat capable of eating an enormous amount of food, scampering under doors and tables, and raising an army of rats to defend them and do their bidding. ## Abilities - Abilities come at a cost to the Rat King's hunger. Simply eating replenishes it. + Abilities come at the cost of some of the Rat King's hunger. Eat to replenish it. - - Raise an Army of [color=#a4885c]Rat Servants[/color]. - - Conjure a cloud of ammonia. + - Raise an Army of [color=#a4885c]Rat Servants[/color]. You may command these [color=#a4885c]Rat Servants[/color] to stay in place, follow you, attack a target of your choice, or attack indiscriminately. + - Conjure a cloud of [color=#77b58e]ammonia[/color]. Note that [color=#77b58e]ammonia[/color] is mildly poisonous to others, but heals rats. # Space Dragon @@ -50,11 +49,13 @@ - A Space Dragon is a giant dragon that creates space carp rifts and eats the crew. + A Space Dragon is a giant extradimensional dragon that creates space carp rifts and eats the crew. ## Abilities - - Devour critical or dead victims. + - Devour critical or dead victims to heal slightly, or devour infrastructure such as doors, windows, and walls. + + - Breathe out a powerful flaming sphere which will explode periodically along a straight flight path and explode when it hits something, igniting things along the way. Be careful, your carps are not immune to the Dragon's Breath! @@ -62,6 +63,15 @@ - - Summon a Carp Rift that periodically spawns [color=#a4885c]Space Carp[/color]. + - Summon a Carp Rift that periodically spawns [color=#a4885c]Space Carp[/color]. + + ## Carp Rifts + + - Space Dragons may have up to three Carp Rifts active at any given time. + - Carp Rifts spawn a [color=#a4885c]Space Carp[/color] every thirty seconds while active. + - Rifts charge with extradimensional energy over a period of five minutes and are vulnerable during this time. Protect them! The space dragon will suffer a temporary debilitating feedback effect in the event that its rifts are destroyed before they are done charging. + - You may only charge one rift at any given time. + - After the rifts are done charging, they are invulnerable and will continue to spawn [color=#a4885c]Space Carp[/color] so long as the Dragon lives. + - If a period of five minutes passes since the appearance of the Space Dragon or the last time a Carp Rift was charging and unless the Space Dragon already controls the maximum of three Carp Rifts, the Space Dragon will disappear. diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml b/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml index f3ced7eeda3..f6b91745710 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Nuclear Operatives.xml @@ -1,24 +1,24 @@ # Nuclear Operatives - AUTOTELL ON STANDBY. YOUR OBJECTIVES ARE SIMPLE. DELIVER THE PAYLOAD AND GET OUT BEFORE THE PAYLOAD DETONATES. BEGIN MISSION. + OPERATIVES STANDBY. YOUR OBJECTIVES ARE SIMPLE. DELIVER THE PAYLOAD AND GET OUT BEFORE THE PAYLOAD DETONATES. BEGIN MISSION. If you hear this message then congratulations! You have just been chosen to be a nuclear operative for the syndicate. You have one goal, to blow up the space station with a nuclear fission explosive. ## Operatives Your team may contain varying amounts of three different roles: - - The [color=#a4885c]Nukie Commander[/color] wears the unique commander’s hardsuit, and will create or approve of the battle plan. + - The [color=#a4885c]Syndicate Commander[/color] wears the unique commander’s hardsuit and will create or approve of the battle plan. - - The [color=#a4885c]Nukie Agent[/color] wears the blood-red medic hardsuit, and can act as a combat medic for the mission. + - The [color=#a4885c]Syndicate Agent[/color] wears the blood-red medic hardsuit and can act as a combat medic for the mission. - - Regular [color=#a4885c]Nuclear Operatives[/color], who have the normal blood red hardsuit. + - Regular [color=#a4885c]Nuclear Operatives[/color] who have the normal blood red hardsuit. @@ -27,7 +27,7 @@ ## Preparation - Taking on a whole station in a fight is a difficult job, luckily you are well prepared for the job. Every operative has an [color=#a4885c]Uplink[/color]. It comes with 40 [color=#a4885c]Telecrystals[/color], which you can use to purchase gear. What you get depends on the strategy picked by your commander or voted for by the team. Only your commander and agent will have passenger access, but no external airlock access. This means you will need something to hack or blast your way onto the station. In general you should need some weapons, something to breach doors, and utility/healing. + Taking on a whole station in a fight is a difficult job, luckily you are well prepared for the job. Every operative has an [color=#a4885c]Uplink[/color]. It comes with 40 [color=#a4885c]Telecrystals[/color], which you can use to purchase gear. What you get depends on the strategy picked by your commander or voted for by the team. Only your commander and agent will have passenger access, but no external airlock access. This means you will need something to hack or blast your way onto the station. In general, you will need some weapons to protect yourself and kill the crew, something to breach doors to get where you need to go, utility items to make your job easier, and healing to not die. @@ -35,9 +35,14 @@ ## Getting to the Station - After gearing up and creating a plan, grab a jetpack from your armory and go with your other operatives to the [color=#a4885c]Nukie Shuttle[/color]. Here you will find some extra explosives and tools, as well as your nuke and nuke codes. + After gearing up and creating a plan, grab a jetpack from your armory and go with your other operatives to the [color=#a4885c]Syndicate Shuttle[/color]. Here you will find some extra explosives and tools, as well as your nuke and nuke codes. You will find an [color=#a4885c]IFF Console[/color] on the shuttle, it allows you to hide from other ships and mass scanners. Make sure that [color=#a4885c]Show IFF[/color] and [color=#a4885c]Show Vessel[/color] are toggled off to hide your shuttle from the crew. When everyone is ready, FTL to the station and fly to it with a jetpack. Don't forget the nuclear fission explosive on your ship if you are going to use it, and definitely don't forget the nuke codes or pinpointer. + + + + + ## The Disk You will notice that each operative starts with a [color=#a4885c]Pinpointer[/color]. This device is one of the most important items to the mission, and you should keep it with you at all times. Turn on the pinpointer when you arrive at the station and it will always point to the [color=#a4885c]Nuke Disk[/color], your next objective. @@ -51,7 +56,7 @@ ## The Nuke - On your shuttle you will find one of two [color=#a4885c]Nuclear Fission Explosives[/color] and a paper with the nuke codes. The paper will tell you which explosive it corresponds to. If the ID is the same as the one on your nuke, the codes will only work for it. If it is not, then they will only work for the explosive in the station's vault. + On your shuttle, you will find one of two [color=#a4885c]Nuclear Fission Explosives[/color] and a paper with the nuke codes. The paper will tell you which explosive it corresponds to. If the ID is the same as the one on your nuke, the codes will only work for it. If it is not, then they will only work for the explosive in the station's vault. Once you acquire the nuke disk, put it into the nuke and use the code to arm it. It takes 30 seconds for a crewmember to disarm it, and it will count down from 300. Be prepared to defend the nuke for as long as possible, remember that escaping alive isn't necessary, but recommended. @@ -61,28 +66,26 @@ ## Victories - The “victor” of the round is announced on the round end screen, as well as how much they won by. The scale of the victory depends on circumstances at the end of the round. + The “victor” of the round is announced on the round end screen, as well as by how much they won by. The scale of the victory depends on the circumstances at the end of the round. [color=#a4885c]Syndicate Major Victory[/color] - - The nuke detonates on station - - The crew escapes on the evac shuttle, but the nuke was armed - - The nuke was armed and delivered to central command on the evac shuttle + - The nuke detonates on the station + - The crew escapes on the evac shuttle, but the nuke is still armed + - The nuke is armed and delivered to central command on the evac shuttle [color=#a4885c]Syndicate Minor Victory[/color] - - The crew escapes on evac, but every nukie survives - - The crew escapes and some nukies die, but the crew loses the disk + - The crew escapes on evac, but every nuclear operative survives + - The crew escapes and some nuclear operatives die, but the crew loses the disk [color=#a4885c]Neutral Victory[/color] - - The nuke detonates off station + - The nuke detonates off the station [color=#a4885c]Crew Minor Victory[/color] - - The crew escapes on evac and some nukies die, but the crew keeps the disk + - The crew escapes on evac and some nuclear operatives die, but the crew keeps the disk [color=#a4885c]Crew Major Victory[/color] - All nuclear operatives die - - The crew blow up the nukie outpost with the nuke + - The crew blow up the nuclear operative outpost with the nuke - If you feel that you won't be able to completely win as crew or nukie, consider these options for a compromise. + If you feel that you won't be able to completely win as Crew or Nuclear Operatives, consider these options for a compromise. - - diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml b/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml index 4b1c2e67d6b..343a1c37bf5 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Revolutionaries.xml @@ -1,7 +1,7 @@ # Revolutionaries - - Revolutionaries are antagonists that are sponsored by the Syndicate to take over the station. + - Revolutionaries are antagonists who are sponsored by the Syndicate to take over the station. ## Head Revolutionaries @@ -10,7 +10,7 @@ - [color=#5e9cff]Head Revolutionaries[/color] are chosen at the start of the shift and are tasked with taking over the station by killing, exiling or cuffing all of the Command staff. Head Revolutionaries will be given a [color=#a4885c]Flash[/color] and a pair of [color=#a4885c]Sunglasses[/color] to aid them. + [color=#5e9cff]Head Revolutionaries[/color] are chosen at the start of the shift and are tasked with taking over the station by killing, exiling, or cuffing all of the Command staff. Head Revolutionaries will be given a [color=#a4885c]Flash[/color] and a pair of [color=#a4885c]Sunglasses[/color] to aid them. ## Conversion @@ -18,7 +18,7 @@ - You can convert crew members by using a [color=#a4885c]Flash[/color] in [color=#ff0000]harm mode[/color] and attacking someone with it. Any flash can be used for conversion, but remember that flashes have limited charges. + You can convert crew members to [color=#ff0000]Revolutionaries[/color] by using a [color=#a4885c]Flash[/color] in [color=#ff0000]harm mode[/color] and attacking someone with it. Any flash can be used for conversion, but remember that flashes have limited charges. @@ -26,22 +26,23 @@ - However, things such as [color=#a4885c]Sunglasses[/color] and [color=#a4885c]Welding Masks[/color] offer flash protection and people wearing these will not be able to be converted. + However, gear providing flash protection such as [color=#a4885c]Sunglasses[/color] and [color=#a4885c]Welding Masks[/color] will also block your flashes, and crew wearing these will not be able to be converted. - While not flash protection, a [color=#a4885c]MindShield Implant[/color] will prevent the implanted person from being converted into a revolutionary. Assume all of [color=#a4885c]Security[/color] and [color=#a4885c]Command[/color] are implanted already. + While not flash protection, a [color=#a4885c]MindShield Implant[/color] will prevent the implanted person from being converted into a revolutionary. Assume all of [color=#a4885c]Security[/color] and [color=#a4885c]Command[/color] are implanted already. + Additionally, a [color=#a4885c]MindShield Implanter[/color] used on a [color=#ff0000]Revolutionary[/color] will de-convert them and they will no longer be loyal to your cause. If a [color=#a4885c]MindShield Implanter[/color] is used on a [color=#5e9cff]Head Revolutionary[/color], it will be destroyed but this will reveal you so be careful! ## Revolutionary - A [color=#ff0000]Revolutionary[/color] is the result of being converted by a [color=#5e9cff]Head Revolutionary[/color]. Revolutionaries are underlings of the Head Revolutionaries and should follow orders given by them and prioritize their well-being over anything else because if they die you will lose. + A [color=#ff0000]Revolutionary[/color] is the result of being converted by a [color=#5e9cff]Head Revolutionary[/color]. Revolutionaries are underlings of the Head Revolutionaries and should follow orders given by them and prioritize their well-being over anything else because if the [color=#5e9cff]Head Revolutionaries[/color] die the Revolution will fail. Keep in mind that you can't convert others as a regular revolutionary, only your boss can do that. ## Objectives - You must eliminate, exile or arrest all of the following Command staff on station in no particular order. + You must eliminate, exile, or arrest all of the following Command staff on station in no particular order. - Captain - Head of Personnel - Chief Engineer @@ -51,4 +52,4 @@ - Chief Medical Officer Remember, your objective is to take over the station and not to destroy it so try to minimize damage where possible. Viva la revolución! - + \ No newline at end of file diff --git a/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml b/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml index f088b9f27b1..496c00e6c33 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/SpaceNinja.xml @@ -1,15 +1,15 @@ # Space Ninja - The [color=#66FF00]Space Ninja[/color] is a ghost role randomly available mid-late game. If you pick it you will be given your gear, your objectives and the greeting. + The [color=#66FF00]Space Ninja[/color] is a ghost role randomly available mid-late game. If you pick it you will be given your gear, your objectives, and the greeting. You are a ninja, but in space. [color=#66FF00]The Spider Clan[/color] has sent you to the station to wreak all kinds of havoc, and you are equipped to keep it silent-but-deadly. - Whether you mercilessly pick off the station's crew one by one, or assassinate the clown over and over, your discipline has taught you that [color=#66FF00]your objectives must be at least attempted[/color]. For honor! + Whether you mercilessly pick off the station's crew one by one or assassinate the clown over and over, your discipline has taught you that [color=#66FF00]your objectives must be at least attempted[/color]. For honor! # Equipment - You begin implanted with a [color=#a4885c]death acidifier[/color], so if you are KIA or decide to commit seppuku you will leave behind one final gift to the janitor and all your precious equipment is kept out of enemy hands. + You begin implanted with a [color=#a4885c]death acidifier[/color], so if you are KIA or decide to commit seppuku you will leave behind one final gift to the janitor, and all your precious equipment is kept out of enemy hands. Your bag is full of tools for more subtle sabotage, along with a survival box if you need a snack. @@ -25,7 +25,7 @@ Your suit requires power to function. Its [color=#a4885c]internal battery[/color] can be replaced by clicking on it with another one, and [color=#a4885c]higher capacity batteries[/color] mean a [color=#a4885c]highly effective ninja[/color]. You can see the current charge by examining the suit or in a sweet battery alert at the top right of your screen. - If you run out of power and need to recharge your battery, just use your gloves to drain an APC, substation or a SMES. + If you run out of power and need to recharge your battery, just use your gloves to drain an APC, substation, or SMES. ## Ninja Gloves @@ -33,16 +33,16 @@ [color=#66FF00]These bad boys are your bread and butter.[/color] - They are made from [color=#a4885c]insulated nanomachines[/color] to assist you in gracefully breaking and entering into your destination without leaving behind fingerprints. + They are made from [color=#a4885c]insulated nanomachines[/color] to assist you in gracefully breaking into destinations without leaving behind fingerprints. You have an action to toggle gloves. When the gloves are turned on, they allow you to use [color=#a4885c]special abilities[/color], which are triggered by interacting with things with an empty hand and with combat mode disabled. Your glove abilities include: - Emagging an unlimited number of doors. - - Draining power from transformers such as APCs, substations or SMESes. The higher the voltage, the more efficient the draining is. + - Draining power from transformers such as APCs, substations, or SMESes. The higher the voltage, the more efficient the draining is. - You can shock any mob, stunning and slightly damaging them. - - You can download technologies from a R&D server for one of your objectives. - - You can hack a communications console to call in a threat. + - You can download technologies from an R&D server for one of your objectives. + - You can hack a communications console to call in a [textlink="threat" link="MinorAntagonists"]. ## Energy Katana @@ -52,7 +52,7 @@ Deals a lot of damage and can be recalled at will, costing suit power proportional to the distance teleported. While in hand you can [color=#a4885c]teleport[/color] to anywhere that you can see, meaning most doors and windows, but not past solid walls. - This has a limited number of charges which regenerate slowly, so keep a charge or two spare incase you need a quick getaway. + This has a limited number of charges which regenerate slowly, so keep a charge or two spare in case you need a quick getaway. ## Spider Clan Charge @@ -71,10 +71,11 @@ # Objectives - - Download X research nodes: Use your gloves on an R&D server with a number of unlocked technologies - - Doorjack X doors on the station: Use your gloves to emag a number of doors. - - Detonate the spider clan charge: Plant your spider clan charge at a random location and watch it go boom. - - Call in a threat: Use your gloves on a communications console. + - Download \[9-13\] research nodes: Use your gloves on an R&D server with a number of unlocked technologies + - Doorjack \[15-40\] doors on the station: Use your gloves to emag a number of doors. + - Detonate the spider clan charge: Plant your spider clan charge at the specified location and watch it go boom! + - Call in a [textlink="threat" link="MinorAntagonists"]: Use your gloves on a communications console. + - Set everyone to wanted: Use your gloves on a criminal records console. - Survive: Don't die. - + \ No newline at end of file diff --git a/Resources/ServerInfo/Guidebook/Antagonist/Traitors.xml b/Resources/ServerInfo/Guidebook/Antagonist/Traitors.xml index 002ee56d115..a8fe4cef180 100644 --- a/Resources/ServerInfo/Guidebook/Antagonist/Traitors.xml +++ b/Resources/ServerInfo/Guidebook/Antagonist/Traitors.xml @@ -10,7 +10,7 @@ - - The [color=#a4885c]Uplink[/color] is the most important tool as a Traitor, as it can purchase tools and weapons with [color=#a4885c]telecrystals[/color](TC). + - The [color=#a4885c]Uplink[/color] is the most important tool for a Traitor, as it can purchase tools and weapons with [color=#a4885c]telecrystals[/color](TC). @@ -22,16 +22,23 @@ Make sure to relock your [color=#a4885c]PDA[/color] to prevent anyone else from seeing it! - Various gear include: - - - - - + + + + + + + + + + + + ## Objectives - - When becoming a Traitor, you will have a list of objectives, ranging from escape alive, stealing something, and killing someone. Using the [color=#a4885c]Uplink[/color] will help you with most of these tasks. + - When becoming a Traitor, you will have a list of objectives, ranging from escaping alive, stealing something, and killing someone. Using the [color=#a4885c]Uplink[/color] will help you with most of these tasks. ## List of Possible Tasks @@ -40,30 +47,25 @@ - Kill or maroon a randomly selected department head. - Keep a randomly selected traitor alive. - Escape on the evacuation shuttle alive and uncuffed. - - Help a randomly selected traitor finish 2/3 of their objectives. + - Help a randomly selected traitor finish half of their objectives. - Die a glorious death. - - Steal the Captain's [color=#a4885c]ID Card[/color]. + - Steal the Captain's [color=#a4885c]ID Card[/color], [color=#a4885c]Antique Laser Pistol[/color], [color=#a4885c]Jetpack[/color], or [color=#a4885c]Nuke Disk[/color]. - - - Steal the Captain's [color=#a4885c]Antique Laser Pistol[/color]. - - - - - Steal the Captain's [color=#a4885c]Jetpack[/color]. + + - - - Steal the Chief Medical Officer's [color=#a4885c]Hypospray[/color]. + + + - Steal the Chief Medical Officer's [color=#a4885c]Hypospray[/color] or [color=#a4885c]Handheld Crew Monitor[/color]. + - - Steal the Research Director's [color=#a4885c]Hardsuit[/color]. + - Steal the Research Director's [color=#a4885c]Hardsuit[/color] or [color=#a4885c]Hand Teleporter[/color]. - - - Steal the Research Director's [color=#a4885c]Hand Teleporter[/color]. - - Steal the Head of Security's [color=#a4885c]Secret Documents[/color]. @@ -74,14 +76,14 @@ - - Steal the [color=#a4885c]Nuke Disk[/color]. + - Steal the Quartermaster's [color=#a4885c]Requisition Digi-Board[/color]. - + - - Steal [color=#a4885c]Corgi Meat[/color]. + - Steal the Head of Personnel's dog, Ian's [color=#a4885c]Corgi Meat[/color]. - + - + \ No newline at end of file From c740fbc68c0fe8aa8519009fee72b88cb17188eb Mon Sep 17 00:00:00 2001 From: slarticodefast <161409025+slarticodefast@users.noreply.github.com> Date: Tue, 28 May 2024 02:51:50 +0200 Subject: [PATCH 074/112] Cargo bounty corrections (#28255) cargo bounty corrections --- .../Cargo/Systems/CargoSystem.Bounty.cs | 4 ++- .../Cargo/Prototypes/CargoBountyPrototype.cs | 8 ++++- .../Prototypes/Catalog/Bounties/bounties.yml | 15 +++++++++ .../Objects/Consumable/Food/Baked/bread.yml | 18 ++++++++--- .../Objects/Consumable/Food/Baked/cake.yml | 32 +++++++++++++++++++ .../Objects/Consumable/Food/Baked/misc.yml | 9 ++++-- .../Objects/Consumable/Food/Baked/pie.yml | 10 ++++++ .../Objects/Consumable/Food/Baked/pizza.yml | 12 ++++++- .../Objects/Consumable/Food/ingredients.yml | 18 +++++++++++ .../Objects/Consumable/Food/produce.yml | 13 ++++++++ Resources/Prototypes/tags.yml | 12 +++++-- 11 files changed, 138 insertions(+), 13 deletions(-) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index e132e4f12a3..0fcfd160bb3 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -11,6 +11,7 @@ using Content.Shared.Database; using Content.Shared.NameIdentifier; using Content.Shared.Stacks; +using Content.Shared.Whitelist; using JetBrains.Annotations; using Robust.Server.Containers; using Robust.Shared.Containers; @@ -23,6 +24,7 @@ public sealed partial class CargoSystem { [Dependency] private readonly ContainerSystem _container = default!; [Dependency] private readonly NameIdentifierSystem _nameIdentifier = default!; + [Dependency] private readonly EntityWhitelistSystem _whitelistSys = default!; [ValidatePrototypeId] private const string BountyNameIdentifierGroup = "Bounty"; @@ -311,7 +313,7 @@ public bool IsBountyComplete(HashSet entities, IEnumerable(); foreach (var entity in entities) { - if (!entry.Whitelist.IsValid(entity, EntityManager)) + if (!_whitelistSys.IsValid(entry.Whitelist, entity) || (entry.Blacklist != null && _whitelistSys.IsValid(entry.Blacklist, entity))) continue; count += _stackQuery.CompOrNull(entity)?.Count ?? 1; diff --git a/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs b/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs index bf4907b0dd4..b40b03672ef 100644 --- a/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs +++ b/Content.Shared/Cargo/Prototypes/CargoBountyPrototype.cs @@ -31,7 +31,7 @@ public sealed partial class CargoBountyPrototype : IPrototype /// /// The entries that must be satisfied for the cargo bounty to be complete. /// - [DataField( required: true)] + [DataField(required: true)] public List Entries = new(); /// @@ -50,6 +50,12 @@ public readonly partial record struct CargoBountyItemEntry() [DataField(required: true)] public EntityWhitelist Whitelist { get; init; } = default!; + /// + /// A blacklist that can be used to exclude items in the whitelist. + /// + [DataField] + public EntityWhitelist? Blacklist { get; init; } = null; + // todo: implement some kind of simple generic condition system /// diff --git a/Resources/Prototypes/Catalog/Bounties/bounties.yml b/Resources/Prototypes/Catalog/Bounties/bounties.yml index 3c1bd02fcfc..bedfe442872 100644 --- a/Resources/Prototypes/Catalog/Bounties/bounties.yml +++ b/Resources/Prototypes/Catalog/Bounties/bounties.yml @@ -309,6 +309,9 @@ whitelist: tags: - Pie + blacklist: + tags: + - Slice - type: cargoBounty id: BountyPrisonUniform @@ -541,6 +544,12 @@ whitelist: tags: - Fruit + blacklist: + tags: + - Slice + - Cake + - Pie + - Bread - type: cargoBounty id: BountyVegetable @@ -552,6 +561,12 @@ whitelist: tags: - Vegetable + blacklist: + tags: + - Slice + - Cake + - Pie + - Bread - type: cargoBounty id: BountyChili diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml index 7600882925a..12a6e2a246b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/bread.yml @@ -34,7 +34,9 @@ flavors: - bread - type: Tag - tags: [] #override bread + tags: + - Bread + - Slice - type: SolutionContainerManager solutions: food: @@ -116,6 +118,8 @@ - type: Tag tags: - Fruit + - Bread + - Slice - type: entity name: cornbread @@ -274,6 +278,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: mimana bread @@ -418,6 +424,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: spider meat bread @@ -476,6 +484,8 @@ - type: Tag tags: - Meat + - Bread + - Slice - type: entity name: tofu bread @@ -585,6 +595,8 @@ - type: Tag tags: - Meat + - Bread + - Slice # Other than bread/slices @@ -594,9 +606,6 @@ id: FoodBreadBaguette description: Bon appétit! components: - - type: Tag - tags: - - Baguette - type: Sprite state: baguette - type: SliceableFood @@ -824,6 +833,7 @@ tags: - VimPilot - DoorBumpOpener + - Bread - type: CanEscapeInventory baseResistTime: 2 - type: Puller diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml index c939dec52c6..922d4938885 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/cake.yml @@ -23,6 +23,9 @@ Quantity: 5 - type: Item size: Normal + - type: Tag + tags: + - Cake - type: entity parent: FoodCakeBase @@ -45,6 +48,10 @@ Quantity: 1 - type: Item size: Tiny + - type: Tag + tags: + - Cake + - Slice # Custom Cake Example @@ -63,6 +70,7 @@ slice: FoodCakeBlueberrySlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -78,7 +86,9 @@ color: blue - type: Tag tags: + - Cake - Fruit + - Slice # Cake @@ -203,6 +213,7 @@ slice: FoodCakeOrangeSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -214,7 +225,9 @@ state: orange-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, oranges. - type: entity @@ -229,6 +242,7 @@ slice: FoodCakeLimeSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -240,7 +254,9 @@ state: lime-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, limes. - type: entity @@ -255,6 +271,7 @@ slice: FoodCakeLemonSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -266,7 +283,9 @@ state: lemon-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, lemons. - type: entity @@ -296,6 +315,7 @@ Quantity: 5 - type: Tag tags: + - Cake - Fruit - type: entity @@ -323,7 +343,9 @@ Quantity: 1 - type: Tag tags: + - Cake - Fruit + - Slice - type: entity name: chocolate cake @@ -379,6 +401,7 @@ slice: FoodCakeAppleSlice - type: Tag tags: + - Cake - Fruit - type: entity @@ -391,7 +414,9 @@ state: apple-slice - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, slime. - type: entity @@ -436,6 +461,7 @@ Quantity: 11 - type: Tag tags: + - Cake - Fruit - type: entity @@ -457,7 +483,9 @@ Quantity: 2.2 - type: Tag tags: + - Cake - Fruit + - Slice # Tastes like sweetness, cake, pumpkin. - type: entity @@ -686,6 +714,7 @@ tags: - VimPilot - DoorBumpOpener + - Cake - type: CanEscapeInventory baseResistTime: 2 - type: Puller @@ -752,3 +781,6 @@ color: "#FFFF00" radius: 1.4 energy: 1.4 + - type: Tag + tags: + - Slice diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml index b1bbdfb5305..fde181d8b9b 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/misc.yml @@ -163,9 +163,6 @@ # Nuggets -- type: Tag - id: Nugget - - type: entity name: chicken nugget parent: FoodBakedBase @@ -530,6 +527,9 @@ Quantity: 5 - ReagentId: Theobromine Quantity: 3 + - type: Tag + tags: + - Slice - type: entity name: special brownies @@ -585,6 +585,9 @@ Quantity: 3 - ReagentId: THC Quantity: 25 + - type: Tag + tags: + - Slice - type: entity name: onion rings diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml index 8cd1c5dfab6..f97d87a9c50 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pie.yml @@ -52,6 +52,10 @@ Quantity: 1.2 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Pie + - Slice # Pie @@ -94,6 +98,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, apple. - type: entity @@ -182,6 +187,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, cream, banana. - type: entity @@ -224,6 +230,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, blackberries. - type: entity @@ -263,6 +270,7 @@ tags: - Fruit - Pie + - Slice # Tastes like pie, cherries. - type: entity @@ -302,6 +310,7 @@ tags: - Meat - Pie + - Slice # Tastes like pie, meat. - type: entity @@ -342,6 +351,7 @@ tags: - Meat - Pie + - Slice # Tastes like pie, meat, acid. - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml index bdce1d44086..154f34063c8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Baked/pizza.yml @@ -59,6 +59,7 @@ tags: - Pizza - ReptilianFood + - Slice # Pizza @@ -135,6 +136,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, meat. - type: entity @@ -291,6 +293,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, meat, laziness. - type: entity @@ -391,6 +394,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, sausage, sass. - type: entity @@ -411,9 +415,13 @@ - state: pineapple - type: SliceableFood slice: FoodPizzaPineappleSlice + - type: Tag + tags: + - Meat + - Pizza - type: entity - name: slice of pineapple pizza + name: slice of Hawaiian pizza parent: FoodPizzaSliceBase id: FoodPizzaPineappleSlice description: A slice of joy/sin. @@ -432,6 +440,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, pineapple, ham. #TODO: This is a meme pizza from /tg/. It has specially coded mechanics. @@ -504,6 +513,7 @@ tags: - Meat - Pizza + - Slice # Tastes like crust, tomato, cheese, pepperoni, 9 millimeter bullets. #TODO: Make this do poison damage and make cut pizza slices eventually rot into this. diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml index 1df6615a9fb..dcf2f3355ce 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/ingredients.yml @@ -302,6 +302,9 @@ - dough - type: Sprite state: dough-slice + - type: Tag + tags: + - Slice - type: entity name: cornmeal dough @@ -331,6 +334,9 @@ - dough - type: Sprite state: cornmealdough-slice + - type: Tag + tags: + - Slice - type: entity name: tortilla dough @@ -363,6 +369,9 @@ - type: Construction graph: Tortilla node: start + - type: Tag + tags: + - Slice - type: entity name: flattened tortilla dough @@ -503,6 +512,9 @@ reagents: - ReagentId: Nutriment Quantity: 5 + - type: Tag + tags: + - Slice - type: entity name: chèvre log @@ -550,6 +562,9 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 0.2 + - type: Tag + tags: + - Slice - type: entity name: tofu @@ -595,6 +610,9 @@ Quantity: 3 - ReagentId: Nutriment Quantity: 2 + - type: Tag + tags: + - Slice - type: entity name: burned mess diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml index 888e4e4e353..a74e3450e94 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/produce.yml @@ -1065,6 +1065,9 @@ state: slice - type: Extractable grindableSolutionName: food + - type: Tag + tags: + - Slice - type: entity name: pineapple slice @@ -1085,6 +1088,7 @@ - type: Tag tags: - Fruit + - Slice - type: entity name: onion slice @@ -1108,6 +1112,10 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Vegetable + - Slice - type: entity name: red onion slice @@ -1131,6 +1139,10 @@ Quantity: 1 - ReagentId: Vitamin Quantity: 1 + - type: Tag + tags: + - Vegetable + - Slice - type: entity name: chili pepper @@ -1650,6 +1662,7 @@ - type: Tag tags: - Fruit + - Slice - type: entity name: grapes diff --git a/Resources/Prototypes/tags.yml b/Resources/Prototypes/tags.yml index 253aa485653..439ad47c0f8 100644 --- a/Resources/Prototypes/tags.yml +++ b/Resources/Prototypes/tags.yml @@ -27,9 +27,6 @@ - type: Tag id: ATVKeys -- type: Tag - id: Baguette - - type: Tag id: Balloon @@ -258,6 +255,9 @@ - type: Tag id: CableCoil +- type: Tag + id: Cake + - type: Tag id: CaneBlade @@ -926,6 +926,9 @@ - type: Tag id: NozzleBackTank +- type: Tag + id: Nugget # for chicken nuggets + - type: Tag id: NukeOpsUplink @@ -1122,6 +1125,9 @@ - type: Tag id: Skewer +- type: Tag + id: Slice # sliced fruit, vegetables, pizza etc. + - type: Tag id: SmallAIChip From a269f9bb9e722b3eaad0689fab4ba1600aeb76f0 Mon Sep 17 00:00:00 2001 From: Nemanja <98561806+EmoGarbage404@users.noreply.github.com> Date: Mon, 27 May 2024 20:52:56 -0400 Subject: [PATCH 075/112] Small anomaly behavior fix (#28290) * Small anomaly behavior fix * well put together code --- Content.Server/Anomaly/AnomalySystem.cs | 25 ++++++++----------- .../Effects/ShuffleParticlesAnomalySystem.cs | 20 +++++++-------- .../Anomaly/Components/AnomalyComponent.cs | 9 ++++--- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/Content.Server/Anomaly/AnomalySystem.cs b/Content.Server/Anomaly/AnomalySystem.cs index 73658a0320e..3e9760a056c 100644 --- a/Content.Server/Anomaly/AnomalySystem.cs +++ b/Content.Server/Anomaly/AnomalySystem.cs @@ -18,8 +18,6 @@ using Robust.Shared.Physics.Events; using Robust.Shared.Prototypes; using Robust.Shared.Random; -using Robust.Shared.Serialization.Manager; -using System.Linq; namespace Content.Server.Anomaly; @@ -69,20 +67,21 @@ private void OnMapInit(Entity anomaly, ref MapInitEvent args) ChangeAnomalyStability(anomaly, Random.NextFloat(anomaly.Comp.InitialStabilityRange.Item1 , anomaly.Comp.InitialStabilityRange.Item2), anomaly.Comp); ChangeAnomalySeverity(anomaly, Random.NextFloat(anomaly.Comp.InitialSeverityRange.Item1, anomaly.Comp.InitialSeverityRange.Item2), anomaly.Comp); - ShuffleParticlesEffect(anomaly.Comp); + ShuffleParticlesEffect(anomaly); anomaly.Comp.Continuity = _random.NextFloat(anomaly.Comp.MinContituty, anomaly.Comp.MaxContituty); SetBehavior(anomaly, GetRandomBehavior()); } - public void ShuffleParticlesEffect(AnomalyComponent anomaly) + public void ShuffleParticlesEffect(Entity anomaly) { var particles = new List { AnomalousParticleType.Delta, AnomalousParticleType.Epsilon, AnomalousParticleType.Zeta, AnomalousParticleType.Sigma }; - anomaly.SeverityParticleType = Random.PickAndTake(particles); - anomaly.DestabilizingParticleType = Random.PickAndTake(particles); - anomaly.WeakeningParticleType = Random.PickAndTake(particles); - anomaly.TransformationParticleType = Random.PickAndTake(particles); + anomaly.Comp.SeverityParticleType = Random.PickAndTake(particles); + anomaly.Comp.DestabilizingParticleType = Random.PickAndTake(particles); + anomaly.Comp.WeakeningParticleType = Random.PickAndTake(particles); + anomaly.Comp.TransformationParticleType = Random.PickAndTake(particles); + Dirty(anomaly); } private void OnShutdown(Entity anomaly, ref ComponentShutdown args) @@ -198,14 +197,12 @@ private void SetBehavior(Entity anomaly, ProtoId anomaly, ProtoId behaviorProto) @@ -213,7 +210,7 @@ private void RemoveBehavior(Entity anomaly, ProtoId(OnStartCollide); } - private void OnStartCollide(EntityUid uid, ShuffleParticlesAnomalyComponent shuffle, StartCollideEvent args) + private void OnStartCollide(Entity ent, ref StartCollideEvent args) { - if (!TryComp(uid, out var anomaly)) + if (!TryComp(ent, out var anomaly)) return; - if (shuffle.ShuffleOnParticleHit && _random.Prob(shuffle.Prob)) - _anomaly.ShuffleParticlesEffect(anomaly); - - if (!TryComp(args.OtherEntity, out var particle)) + if (!HasComp(args.OtherEntity)) return; + + if (ent.Comp.ShuffleOnParticleHit && _random.Prob(ent.Comp.Prob)) + _anomaly.ShuffleParticlesEffect((ent, anomaly)); } - private void OnPulse(EntityUid uid, ShuffleParticlesAnomalyComponent shuffle, AnomalyPulseEvent args) + private void OnPulse(Entity ent, ref AnomalyPulseEvent args) { - if (!TryComp(uid, out var anomaly)) + if (!TryComp(ent, out var anomaly)) return; - if (shuffle.ShuffleOnPulse && _random.Prob(shuffle.Prob)) + if (ent.Comp.ShuffleOnPulse && _random.Prob(ent.Comp.Prob)) { - _anomaly.ShuffleParticlesEffect(anomaly); + _anomaly.ShuffleParticlesEffect((ent, anomaly)); } } } diff --git a/Content.Shared/Anomaly/Components/AnomalyComponent.cs b/Content.Shared/Anomaly/Components/AnomalyComponent.cs index 3878aeb81cb..88e942ec507 100644 --- a/Content.Shared/Anomaly/Components/AnomalyComponent.cs +++ b/Content.Shared/Anomaly/Components/AnomalyComponent.cs @@ -152,25 +152,25 @@ public sealed partial class AnomalyComponent : Component /// /// The particle type that increases the severity of the anomaly. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType SeverityParticleType; /// /// The particle type that destabilizes the anomaly. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType DestabilizingParticleType; /// /// The particle type that weakens the anomalys health. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType WeakeningParticleType; /// /// The particle type that change anomaly behaviour. /// - [DataField] + [DataField, AutoNetworkedField] public AnomalousParticleType TransformationParticleType; #region Points and Vessels @@ -317,6 +317,7 @@ public sealed partial class AnomalyComponent : Component /// /// Event broadcast when an anomaly's behavior is changed. +/// This is raised after the relevant components are applied /// [ByRefEvent] public readonly record struct AnomalyBehaviorChangedEvent(EntityUid Anomaly, ProtoId? Old, ProtoId? New); From ac6c9bc47661b88091e7cecfa2c2112efe368975 Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 28 May 2024 00:52:57 +0000 Subject: [PATCH 076/112] 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 7fa7746b62e..4291972e775 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,12 +1,4 @@ Entries: -- author: UnicornOnLSD - changes: - - message: brought back the classic crew cut as an alternative to the current one - ! - type: Add - id: 6130 - time: '2024-03-12T18:47:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25935 - author: FungiFellow changes: - message: Added Improvised Shotgun Shell Recipe @@ -3868,3 +3860,10 @@ id: 6629 time: '2024-05-28T00:04:32.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28330 +- author: slarticodefast + changes: + - message: Corrected some cargo bounties. + type: Fix + id: 6630 + time: '2024-05-28T00:51:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28255 From b0afbf6a3e15f1beaac9227e0ea11a571c9db7cb Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 28 May 2024 07:52:30 +0000 Subject: [PATCH 077/112] saltern cryo untroll (#28333) Co-authored-by: deltanedas <@deltanedas:kde.org> --- Resources/Maps/saltern.yml | 1792 +++++++++++++++++++----------------- 1 file changed, 932 insertions(+), 860 deletions(-) diff --git a/Resources/Maps/saltern.yml b/Resources/Maps/saltern.yml index b9690eb37d2..3f2bd76d4fc 100644 --- a/Resources/Maps/saltern.yml +++ b/Resources/Maps/saltern.yml @@ -241,1071 +241,1144 @@ entities: data: tiles: -4,-4: - 0: 65535 + 0: 61695 + -4,-5: + 0: 62457 + -5,-4: + 0: 61695 -4,-3: - 0: 65535 + 0: 47871 -4,-2: - 0: 16383 + 0: 12731 1: 49152 + -5,-2: + 0: 47935 + -5,-1: + 0: 65528 -4,-1: - 0: 65523 + 0: 61056 1: 12 + -4,0: + 0: 61695 -3,-4: - 0: 65535 + 0: 54527 -3,-3: - 0: 65535 + 0: 3581 -3,-2: - 0: 36863 + 0: 247 1: 28672 -3,-1: 1: 7 - 0: 65528 + 0: 65280 + -3,-5: + 0: 61695 + -3,0: + 0: 61695 -2,-4: - 0: 65535 + 0: 53503 -2,-3: - 0: 65535 + 0: 65529 -2,-2: - 0: 65535 + 0: 65520 -2,-1: 0: 65535 + -2,-5: + 0: 64541 + -2,0: + 0: 63487 -1,-4: - 0: 65535 + 0: 53503 -1,-3: - 0: 65535 + 0: 48124 -1,-2: - 0: 65535 + 0: 65520 -1,-1: 0: 65535 - -4,0: - 0: 65535 + -1,-5: + 0: 65285 + -1,0: + 0: 61695 + 0,-4: + 0: 52991 + 0,-3: + 0: 56573 + 0,-2: + 0: 56796 + 0,-1: + 0: 65533 + -5,0: + 0: 63743 -4,1: - 0: 65535 + 0: 49407 + -5,1: + 0: 255 -4,2: - 0: 65535 + 0: 57245 + -5,2: + 0: 53247 -4,3: - 0: 65535 - -3,0: - 0: 65535 + 0: 61424 + -5,3: + 0: 16241 + -4,4: + 0: 61070 -3,1: - 0: 65535 + 0: 41215 -3,2: - 0: 65535 + 0: 65450 -3,3: - 0: 65535 - -2,0: - 0: 65535 + 0: 64988 + -3,4: + 0: 55757 -2,1: - 0: 65535 + 0: 56575 -2,2: - 0: 65535 + 0: 65485 -2,3: - 0: 65535 - -1,0: - 0: 65535 + 0: 32767 + -2,4: + 0: 4215 -1,1: - 0: 65535 + 0: 58623 -1,2: - 0: 65535 + 0: 16142 -1,3: - 0: 65535 - 0,-4: - 0: 65535 - 0,-3: - 0: 65535 - 0,-2: - 0: 65535 - 0,-1: - 0: 65535 + 0: 3003 + -1,4: + 0: 4095 + 0,0: + 0: 64733 + 0,1: + 0: 56575 + 0,2: + 0: 56797 + 0,3: + 0: 52701 + 0,-5: + 0: 65263 1,-4: - 0: 65535 + 0: 7099 1,-3: - 0: 65535 + 0: 53725 1,-2: - 0: 65535 + 0: 56605 1,-1: - 0: 65535 + 0: 65533 + 1,-5: + 0: 47935 + 1,0: + 0: 61917 2,-4: - 0: 65535 + 0: 10231 2,-3: - 0: 65535 + 0: 65278 2,-2: - 0: 65535 + 0: 65390 2,-1: 0: 65535 + 2,-5: + 0: 30511 + 2,0: + 0: 61695 3,-4: - 0: 65535 + 0: 4095 3,-3: - 0: 65535 + 0: 57309 3,-2: - 0: 65535 + 0: 56781 3,-1: + 0: 64985 + 3,-5: + 0: 65295 + 3,0: + 0: 61661 + 4,-4: + 0: 61007 + 4,-3: 0: 65535 - 0,0: - 0: 65535 - 0,1: - 0: 65535 - 0,2: - 0: 65535 - 0,3: - 0: 65535 - 1,0: + 4,-2: 0: 65535 + 4,-1: + 0: 65523 + 0,4: + 0: 61166 1,1: - 0: 65535 + 0: 55807 1,2: - 0: 65535 + 0: 56797 1,3: - 0: 65535 - 2,0: - 0: 65535 + 0: 7665 + 1,4: + 0: 48123 2,1: - 0: 65535 + 0: 29439 2,2: - 0: 65535 + 0: 30583 2,3: - 0: 65535 - 3,0: - 0: 65535 + 0: 3953 + 2,4: + 0: 63351 3,1: 0: 65535 3,2: - 0: 65535 + 0: 65530 3,3: - 0: 65535 + 0: 65295 + 3,4: + 0: 32767 4,0: - 0: 65535 + 0: 61695 4,1: - 0: 65535 + 0: 53759 4,2: - 0: 65535 + 0: 65500 4,3: - 0: 65535 + 0: 53709 + 4,4: + 0: 4573 + 2: 16384 5,0: - 0: 65535 + 0: 62190 5,1: - 0: 65535 + 0: 61695 5,2: 0: 65535 5,3: - 0: 65535 + 0: 62463 + 5,4: + 0: 30719 + 5,-1: + 0: 61152 6,0: - 0: 65535 + 0: 63726 6,1: - 0: 65535 + 0: 3839 6,2: - 0: 65535 + 0: 7677 6,3: - 0: 65535 + 0: 54495 + 6,4: + 0: 64767 7,0: - 0: 65535 + 0: 63547 7,1: - 0: 65535 + 0: 3067 7,2: - 0: 65535 + 0: 35771 7,3: + 0: 40159 + 7,4: + 0: 55739 + 7,-1: + 0: 36590 + 8,0: + 0: 65327 + 8,1: + 0: 12287 + 8,2: 0: 65535 - 0,4: + 8,3: 0: 65535 0,5: - 0: 65535 + 0: 55535 + -1,5: + 0: 58623 0,6: - 0: 65535 + 0: 51711 + -1,6: + 0: 3822 0,7: - 0: 65535 - 1,4: - 0: 65535 + 0: 65503 + -1,7: + 0: 61166 + 0,8: + 0: 15 + 2: 3840 1,5: - 0: 65535 + 0: 53439 1,6: - 0: 65535 + 0: 7421 1,7: - 0: 65535 - 2,4: - 0: 65535 + 0: 65503 + 1,8: + 0: 15 + 2: 40704 2,5: - 0: 65535 + 0: 53367 2,6: - 0: 65535 + 0: 1405 2,7: - 0: 65535 - 3,4: - 0: 65535 + 0: 4915 + 2: 34944 + 2,8: + 2: 36 3,5: - 0: 32767 + 0: 4181 3,6: - 0: 30583 + 0: 4881 + 4,5: + 0: 273 + 2: 17476 -8,0: - 0: 65535 + 0: 61678 + -9,0: + 0: 64413 -8,1: - 0: 65535 + 0: 53503 + -9,1: + 0: 46079 -8,2: - 0: 65535 + 0: 56796 + -9,2: + 0: 35835 -8,3: - 0: 65535 + 0: 4081 + -9,3: + 0: 16315 + -8,4: + 0: 477 + 2: 49152 -7,0: - 0: 65535 + 0: 64671 -7,1: - 0: 65535 + 0: 40191 -7,2: - 0: 65535 + 0: 49087 -7,3: - 0: 65535 + 0: 20472 + -7,4: + 0: 58983 + -7,-1: + 0: 52732 -6,0: - 0: 65535 + 0: 62363 -6,1: - 0: 65535 + 0: 5119 -6,2: - 0: 65535 + 0: 6007 -6,3: - 0: 65535 - -5,0: - 0: 65535 - -5,1: - 0: 65535 - -5,2: - 0: 65535 - -5,3: - 0: 65535 - 4,-4: - 0: 65535 - 4,-3: - 0: 65535 - 4,-2: - 0: 65535 - 4,-1: - 0: 65535 + 0: 4092 + -6,-1: + 0: 48051 + -6,4: + 0: 61567 + -5,4: + 0: 30527 + 4,-5: + 0: 61152 5,-4: - 0: 65535 + 0: 3777 5,-3: - 0: 65535 + 0: 3823 5,-2: - 0: 65535 - 5,-1: - 0: 65535 + 0: 61182 + 5,-5: + 0: 56774 6,-4: - 0: 65535 + 0: 53230 6,-3: - 0: 65535 + 0: 35769 6,-2: - 0: 65535 + 0: 56797 6,-1: - 0: 65535 + 0: 4092 + 6,-5: + 0: 65524 + 7,-2: + 0: 57599 7,-4: - 0: 13107 + 2: 8738 7,-3: - 0: 65535 - 7,-2: - 0: 65535 - 7,-1: + 0: 3808 + 8,-3: + 0: 4024 + 8,-2: + 0: 62207 + 8,-1: 0: 65535 0,-8: - 0: 65535 + 0: 64977 + -1,-8: + 0: 61166 0,-7: - 0: 65535 + 0: 56829 + -1,-7: + 0: 53247 0,-6: - 0: 65535 - 0,-5: - 0: 65535 + 0: 65532 + 0,-9: + 0: 53192 + 2: 39 1,-8: - 0: 65535 + 0: 56784 1,-7: - 0: 65535 + 0: 57343 1,-6: - 0: 65535 - 1,-5: - 0: 65535 + 0: 45981 + 1,-9: + 0: 5937 2,-8: - 0: 65535 + 0: 15353 2,-7: 0: 65535 2,-6: - 0: 65535 - 2,-5: - 0: 65535 + 0: 61695 + 2,-9: + 0: 13107 + 2: 128 3,-8: - 0: 65535 + 0: 52637 3,-7: - 0: 65535 + 0: 64925 3,-6: - 0: 65535 - 3,-5: - 0: 65535 + 0: 64733 + 4,-8: + 0: 39299 + 2: 17484 4,-7: - 0: 65535 + 0: 65289 + 2: 4 4,-6: - 0: 65535 - 4,-5: - 0: 65535 + 0: 61152 + 4,-9: + 2: 17476 + 0: 34952 + 5,-8: + 2: 21855 + 0: 43680 5,-7: - 0: 65535 + 2: 5 + 0: 63242 + 5,-9: + 2: 21845 + 0: 43690 5,-6: - 0: 65535 - 5,-5: - 0: 65535 - 6,-5: - 0: 65535 + 0: 26214 + 6,-8: + 2: 21855 + 0: 43680 + 6,-7: + 2: 5 + 0: 56586 + 6,-6: + 0: 61919 + 6,-9: + 2: 21845 + 0: 43690 + 7,-8: + 2: 4383 + 0: 8736 + 7,-7: + 2: 8749 + 0: 2 7,-5: - 0: 65535 - -4,4: - 0: 65535 + 0: 3846 + 7,-9: + 2: 4369 + 0: 8738 + 7,-6: + 2: 1570 + 8,-8: + 2: 1 + 8,-7: + 2: 15 + 0: 65280 + 8,-6: + 0: 13119 + 2: 2048 + 8,-5: + 0: 3891 -4,5: - 0: 65535 + 0: 238 -4,6: - 0: 65535 - -3,4: - 0: 65535 + 0: 255 + 2: 61440 + -5,6: + 0: 238 + 2: 61440 + -4,7: + 2: 2289 + -5,7: + 2: 240 -3,5: - 0: 65535 + 0: 3295 -3,6: - 0: 49151 - -2,4: - 0: 65535 + 0: 255 + 2: 12288 + -3,7: + 2: 8816 + -3,8: + 2: 3086 -2,5: - 0: 65535 + 0: 52701 -2,6: - 0: 65535 - -1,4: - 0: 65535 - -1,5: - 0: 65535 - -1,6: - 0: 65535 - -1,7: - 0: 65535 - -5,4: - 0: 65535 - -5,5: - 0: 65535 - -5,6: - 0: 65535 + 0: 63743 + -2,7: + 0: 255 -1,8: - 0: 36847 - 4,4: - 0: 65535 - 0,8: - 0: 4095 - 1,8: - 0: 40959 - 2,8: - 0: 55 - 8,0: - 0: 65535 - 8,1: - 0: 65535 - 8,2: - 0: 65535 - 8,3: - 0: 65535 + 0: 8 + 2: 36640 + -9,4: + 0: 7400 + -8,5: + 2: 8879 + 0: 21840 + -9,5: + 2: 43692 + 0: 21840 + -8,6: + 2: 41519 + 0: 21840 + -9,6: + 2: 43695 + 0: 21840 + -8,7: + 2: 242 + -9,7: + 2: 240 + -7,6: + 2: 62465 + 0: 14 + -7,7: + 2: 16 + -7,5: + 0: 1038 + -6,5: + 0: 65319 + -6,6: + 0: 255 + -6,7: + 2: 240 + -5,5: + 0: 26215 + -2,8: + 2: 7967 + -1,9: + 2: 142 + 0,9: + 2: 15 + 4,6: + 2: 4 + 0: 34816 + 5,5: + 0: 30583 + 5,6: + 0: 65319 + 5,7: + 0: 5 + 6,5: + 0: 255 + 2: 53248 + 6,6: + 2: 35049 + 7,5: + 0: 36063 + 2: 4096 + 7,6: + 2: 53196 + 7,7: + 2: 12 + 8,4: + 0: 4351 + 2: 57344 + 8,5: + 0: 272 + 4: 17472 + 8,6: + 2: 65345 + 8,7: + 2: 61167 + 1,9: + 2: 15 + 2,9: + 2: 1 9,0: - 0: 65535 + 0: 65102 9,1: - 0: 65535 + 0: 3839 9,2: - 0: 65535 + 0: 61917 9,3: 0: 65535 + 9,4: + 0: 255 + 2: 61440 + 9,-1: + 0: 60942 10,0: - 0: 65535 + 0: 65481 10,1: - 0: 65535 + 0: 53247 10,2: - 0: 65535 + 0: 62717 10,3: 0: 65535 + 10,-1: + 0: 48015 + 10,4: + 0: 255 + 2: 61440 11,0: - 0: 65535 + 0: 65520 11,1: - 0: 65535 + 0: 53759 11,2: - 0: 16383 - 2: 49152 + 0: 4319 + 3: 49152 11,3: - 0: 65331 - 2: 204 + 0: 61457 + 3: 204 + 11,-1: + 0: 30583 + 11,4: + 0: 255 + 2: 61440 12,0: - 0: 65535 + 0: 65527 12,1: - 0: 65535 + 0: 28791 12,2: - 0: 4095 - 2: 61440 + 0: 119 + 3: 28672 12,3: - 2: 255 - 0: 65280 - 8,-3: - 0: 65535 - 8,-2: - 0: 65535 - 8,-1: + 3: 119 + 0: 61440 + 12,-1: + 0: 29311 + 12,4: + 0: 255 + 2: 61440 + 13,0: + 0: 49080 + 13,1: + 0: 48058 + 13,2: + 2: 13104 + 0: 34826 + 13,3: + 2: 35059 + 0: 12288 + 13,-1: + 0: 14119 + 13,4: + 0: 51 + 2: 63624 + 14,0: 0: 65535 + 14,1: + 0: 64319 + 14,2: + 0: 15235 + 14,3: + 2: 248 + 15,0: + 0: 7441 + 15,1: + 0: 12545 + 2: 49344 + 15,2: + 0: 272 + 15,3: + 2: 9023 + 15,4: + 2: 8754 + 16,0: + 0: 256 + 2: 40601 + 16,1: + 2: 40857 + 16,3: + 2: 255 + 8,-4: + 2: 8738 + 0: 34952 + 9,-4: + 0: 56789 9,-3: - 0: 65535 + 0: 26485 9,-2: - 0: 65535 - 9,-1: - 0: 65535 - 10,-2: - 0: 65535 - 10,-1: - 0: 65535 + 0: 58999 + 9,-5: + 0: 18176 10,-4: - 0: 65521 + 0: 65024 10,-3: - 0: 65535 + 0: 65520 + 10,-2: + 0: 63743 11,-4: - 0: 63472 + 0: 13056 + 2: 128 11,-3: - 0: 65535 + 0: 43946 11,-2: + 0: 30250 + 12,-4: + 2: 1265 + 12,-3: 0: 65535 - 11,-1: - 0: 65535 + 12,-2: + 0: 65359 + -4,-8: + 0: 4016 + -4,-9: + 2: 28672 + 0: 127 + -5,-8: + 0: 7091 -4,-7: - 0: 65535 + 0: 32631 + -5,-7: + 0: 7647 -4,-6: - 0: 65535 - -4,-5: - 0: 65535 - -4,-8: - 0: 65535 + 0: 14193 + -5,-6: + 0: 56797 + -5,-5: + 0: 64729 -3,-8: 0: 65535 -3,-7: - 0: 65535 + 0: 16383 -3,-6: - 0: 65535 - -3,-5: - 0: 65535 + 0: 65530 + -3,-9: + 0: 50519 -2,-8: - 0: 65535 + 0: 32767 -2,-7: - 0: 65535 + 0: 1919 -2,-6: - 0: 65535 - -2,-5: - 0: 65535 - -1,-8: - 0: 65535 - -1,-7: - 0: 65535 + 0: 57309 + -2,-9: + 0: 61440 + 2: 47 -1,-6: - 0: 65535 - -1,-5: - 0: 65535 + 0: 5489 + -8,-8: + 0: 3 + 2: 8 + -8,-9: + 0: 12288 + 2: 35056 + -9,-8: + 0: 65356 + 2: 1 + -8,-7: + 0: 240 + -9,-7: + 0: 13311 + 2: 32768 + -8,-6: + 2: 1520 + -9,-6: + 2: 29832 + 0: 3 + -8,-5: + 0: 48123 + -9,-5: + 0: 43008 + 2: 4 + -8,-4: + 0: 35771 + -7,-7: + 0: 33008 + 2: 8192 -7,-5: - 0: 65535 + 0: 61951 + -7,-4: + 0: 36317 + -7,-6: + 2: 546 + 0: 2184 + -7,-8: + 2: 68 + -7,-9: + 2: 17408 + 0: 32768 + -6,-8: + 0: 34955 + 2: 8704 + -6,-7: + 0: 47352 + -6,-6: + 0: 35835 -6,-5: - 0: 65535 - -5,-5: - 0: 65535 - -5,-7: - 0: 65535 - -5,-6: - 0: 65535 - -8,-4: - 0: 65535 + 0: 61691 + -6,-9: + 0: 61440 + 2: 34 + -6,-4: + 0: 62463 + -5,-9: + 0: 12799 + 2: 32768 + -9,-4: + 0: 34952 + 2: 800 -8,-3: - 0: 65535 + 0: 65039 + -9,-3: + 0: 56797 -8,-2: - 0: 65535 + 0: 60942 + -9,-2: + 0: 56829 + -9,-1: + 0: 56797 -8,-1: - 0: 65535 - -7,-4: - 0: 65535 + 0: 3808 -7,-3: - 0: 65535 + 0: 64907 -7,-2: - 0: 65535 - -7,-1: - 0: 65535 - -6,-4: - 0: 65535 + 0: 57293 -6,-3: - 0: 65535 + 0: 63291 -6,-2: - 0: 65535 - -6,-1: - 0: 65535 - -5,-4: - 0: 65535 + 0: 30583 -5,-3: - 0: 65535 - -5,-2: - 0: 65535 - -5,-1: - 0: 65535 + 0: 28791 + -12,0: + 0: 2056 -11,0: - 0: 65535 - -11,1: - 0: 65262 + 0: 3855 + -12,1: + 2: 2056 + -12,2: + 0: 2056 -11,2: - 0: 65535 + 0: 3855 + -12,3: + 2: 136 + -11,1: + 2: 546 + 0: 2184 + -11,3: + 2: 58030 + -11,4: + 2: 70 -10,0: 0: 65535 -10,1: 0: 65535 -10,2: - 0: 65535 - -9,0: - 0: 65535 - -9,1: - 0: 65535 - -9,2: - 0: 65535 - -9,3: - 0: 65535 - -10,-2: - 0: 65535 + 0: 36863 + -10,3: + 0: 61166 -10,-1: - 0: 65535 - -10,-3: - 0: 65535 - -9,-3: - 0: 65535 - -9,-2: - 0: 65535 - -9,-1: - 0: 65535 - -9,-4: - 0: 65519 - 12,-4: - 0: 62705 - 12,-3: - 0: 65535 - 12,-2: - 0: 65535 - 12,-1: - 0: 65535 - 13,-4: - 0: 63720 + 0: 61134 + -10,4: + 0: 61154 + -12,-3: + 0: 4095 + -13,-3: + 0: 4095 + -12,-4: + 0: 32768 + -11,-3: + 0: 4095 + -12,-2: + 2: 136 + -11,-2: + 2: 15 + 0: 60928 + -12,-1: + 2: 2184 + -11,-1: + 0: 14 + 2: 3584 + -10,-3: + 0: 53247 + -10,-2: + 2: 1 + 0: 65228 + -10,-4: + 2: 3720 + -10,-5: + 2: 32776 + 12,-5: + 2: 61440 + 0: 127 13,-3: - 0: 65535 + 0: 48059 13,-2: - 0: 65535 - 13,-1: - 0: 65535 - 10,-8: - 0: 34816 + 0: 63243 + 13,-4: + 2: 2280 + 13,-5: + 2: 35304 + 14,-4: + 2: 1039 + 14,-3: + 0: 13107 + 2: 128 + 14,-2: + 0: 65283 + 14,-1: + 0: 4095 + 14,-5: + 2: 17476 + 15,-4: + 2: 8739 + 15,-3: + 2: 12914 + 15,-2: + 0: 4352 + 2: 14 + 15,-1: + 0: 273 + 2: 52224 + 15,-5: + 2: 8704 + 16,-2: + 2: 61455 + 16,-1: + 2: 40857 + 9,-7: + 2: 15 + 0: 65280 + 9,-6: + 0: 15 + 2: 3840 10,-7: - 0: 65535 + 2: 7 + 0: 65280 10,-6: - 0: 36863 - 10,-5: - 0: 8 - 11,-8: - 0: 65532 + 0: 15 + 2: 34560 + 10,-8: + 2: 34816 11,-7: - 0: 65535 + 0: 65534 11,-6: - 0: 65535 + 0: 61183 + 10,-5: + 2: 8 + 11,-8: + 2: 52 + 0: 59392 11,-5: - 0: 36095 + 2: 33840 + 0: 8 12,-8: - 0: 65535 + 0: 65392 12,-7: 0: 65535 12,-6: 0: 65535 - 12,-5: - 0: 65535 + 20,-2: + 2: 8739 + 19,-2: + 2: 28687 + 20,-1: + 2: 26146 + 20,0: + 2: 8230 + 19,0: + 2: 20292 + 20,1: + 2: 9830 + 20,2: + 2: 8738 + 20,3: + 2: 3 + 19,3: + 2: 127 13,-8: - 0: 65393 + 2: 34913 + 0: 12288 13,-7: - 0: 65535 + 0: 65395 13,-6: - 0: 65535 - 13,-5: - 0: 35327 - 14,-8: - 0: 17476 + 0: 13183 + 2: 32768 14,-7: - 0: 30581 + 2: 26213 14,-6: - 0: 17783 - 14,-5: - 0: 17476 + 2: 17766 + 14,-8: + 2: 17476 14,-9: - 0: 17476 - 6,-7: - 0: 65535 - 6,-6: - 0: 65535 - 7,-7: - 0: 48063 - 7,-6: - 0: 65467 - -7,4: - 0: 65535 - -7,5: - 0: 61183 - -6,4: - 0: 65535 - -6,5: - 0: 65535 - 4,5: - 0: 53247 - 4,-8: - 0: 65535 - 5,-8: - 0: 65535 - 6,-8: - 0: 65535 - 7,-8: - 0: 13119 - -8,4: - 0: 65535 - -8,5: - 0: 30719 - -8,6: - 0: 63359 - -7,6: - 0: 64751 - -6,6: - 0: 4095 + 2: 17476 + -11,5: + 2: 35916 -10,5: - 0: 56799 + 2: 39296 + 0: 17488 + -11,6: + 2: 2184 -10,6: - 0: 56799 - -9,5: - 0: 65535 - -9,6: - 0: 65535 - -9,4: - 0: 65535 - 3,-9: - 0: 62836 - 4,-9: - 0: 64716 - 6,4: - 0: 65535 - 7,4: - 0: 65535 - 7,5: - 0: 65535 - 7,6: - 0: 53196 - 8,4: - 0: 65535 - 8,5: - 0: 48063 - 3: 17472 - 8,6: - 0: 65359 - 9,4: - 0: 65535 - 9,5: - 0: 43695 - 4: 4368 - 2: 17472 - 9,6: - 0: 7951 - 10,4: - 0: 65535 - 10,5: - 0: 43695 - 2: 4368 - 5: 17472 - 11,4: - 0: 65535 - 11,5: - 0: 43695 - 2: 21840 - 12,4: - 0: 65535 - 12,5: - 0: 13183 - 13,4: - 0: 65535 - 13,5: - 0: 1 - -8,7: - 0: 242 - 8,-8: - 0: 1 - 8,-7: - 0: 65535 - 8,-10: - 0: 240 - -10,4: - 0: 65535 + 0: 21569 + 2: 35230 -10,7: - 0: 192 - -9,7: - 0: 240 + 2: 192 + 0,-12: + 2: 79 + 0: 12288 + -1,-12: + 2: 79 + 0: 32768 + 0,-11: + 0: 29107 + -1,-11: + 0: 2047 + 0,-10: + 0: 247 + 2: 16384 + -1,-10: + 0: 255 + 2: 36864 + -1,-9: + 2: 313 + 1,-12: + 2: 4375 + 1,-11: + 0: 3536 + 1,-10: + 0: 3831 + 2,-11: + 0: 65520 + 2,-10: + 0: 14196 + 2,-12: + 2: 44800 + 3,-12: + 2: 768 + 3,-10: + 2: 18240 + 3,-9: + 2: 1396 5,-10: - 0: 17648 - 5,-9: - 0: 65535 + 2: 17648 6,-10: - 0: 240 - 6,-9: - 0: 65535 + 2: 240 7,-10: - 0: 240 - 7,-9: - 0: 13107 + 2: 240 + 8,-10: + 2: 240 + 8,8: + 2: 65534 + 9,5: + 5: 4368 + 3: 17472 + 9,6: + 2: 7936 + 10,5: + 3: 4368 + 6: 17472 10,6: - 0: 3855 + 2: 3840 + 11,5: + 3: 21840 11,6: - 0: 3871 + 2: 3856 + 12,5: + 2: 65535 12,6: - 0: 15 - 6,5: - 0: 57343 - 14,-4: - 0: 29711 - 14,-3: - 0: 30711 - 14,-2: - 0: 65527 - 5,4: - 0: 65535 - 5,5: - 0: 65535 - 5,7: - 0: 15 - 5,6: - 0: 65535 - 6,7: - 0: 1 - 6,6: - 0: 39417 - 2,-9: - 0: 63479 - 15,-4: - 0: 8739 - 15,-5: - 0: 8704 - 3,7: - 0: 3 - -4,7: - 0: 2289 - -3,7: - 0: 11000 - -2,7: - 0: 4095 - -7,7: - 0: 16 - -6,7: - 0: 240 - -5,7: - 0: 240 - -1,9: - 0: 142 - 0,9: - 0: 15 - 1,9: - 0: 15 - 13,0: - 0: 65535 - 13,1: - 0: 65535 - 13,2: - 0: 65535 - 13,3: - 0: 65535 - 14,0: - 0: 65535 - 14,2: - 0: 65535 - 14,1: - 0: 65535 - 14,3: - 0: 255 - -8,-5: - 0: 65535 - -5,-8: - 0: 65535 - -11,3: - 0: 58030 - -10,3: - 0: 65535 - 14,-1: - 0: 65535 - 15,-3: - 0: 12914 - -11,4: - 0: 70 - 0,-9: - 0: 65519 - 1,-9: - 0: 65535 + 2: 15 + 13,5: + 2: 39321 13,6: - 0: 15 - 14,6: - 0: 7 + 2: 15 14,4: - 0: 28672 + 2: 28672 + 14,6: + 2: 7 14,5: - 0: 17476 - -1,-9: - 0: 61753 - 15,0: - 0: 16179 - 15,1: - 0: 62451 - 15,2: - 0: 62259 - 8,-4: - 0: 61166 - 9,-4: - 0: 65535 - 15,-2: - 0: 13310 - 15,-1: - 0: 65331 - 8,-6: - 0: 32767 - 8,-5: - 0: 65527 - 9,-7: - 0: 65535 - 9,-6: - 0: 4095 - 9,-5: - 0: 65520 - 20,-2: - 0: 13107 - 20,-1: - 0: 30515 - 20,0: - 0: 12599 - 20,1: - 0: 14199 - 20,2: - 0: 13107 - 2,-10: - 0: 65535 - 3,-10: - 0: 18241 + 2: 17484 + 15,5: + 2: 35 + -4,-10: + 0: 6143 + -5,-10: + 0: 14472 + 2: 2 + -3,-10: + 0: 29949 + -3,-11: + 2: 304 + 0: 34944 -2,-10: - 0: 32767 - -2,-9: - 0: 65327 - -1,-10: - 0: 40959 - 16,-2: - 0: 61695 - 16,-1: - 0: 40857 + 0: 1019 + -2,-11: + 2: 544 + 0: 2176 + 16,-3: + 2: 61440 17,-2: - 0: 63731 + 2: 63491 17,-1: - 0: 36744 + 2: 36744 18,-2: - 0: 61694 + 2: 61454 18,-1: - 0: 36744 - 19,-2: - 0: 28927 + 2: 36744 + 17,0: + 2: 36744 + 18,-3: + 2: 32768 + 19,-3: + 2: 28672 19,-1: - 0: 18244 - 16,0: - 0: 40857 - 16,1: - 0: 40857 + 2: 18244 + 18,0: + 2: 36744 16,2: - 0: 61689 - 17,0: - 0: 36744 + 2: 249 17,1: - 0: 36744 + 2: 36744 17,2: - 0: 63736 - 18,0: - 0: 36744 + 2: 2296 + 17,3: + 2: 3 18,1: - 0: 36744 + 2: 36744 18,2: - 0: 61688 - 19,0: - 0: 20292 + 2: 248 + 18,3: + 2: 142 19,1: - 0: 18244 + 2: 18244 19,2: - 0: 61556 + 2: 116 14,-10: - 0: 17520 + 2: 17520 9,-10: - 0: 16 - -8,-8: - 0: 4479 - -8,-7: - 0: 4095 - -7,-7: - 0: 61439 - -6,-7: - 0: 65535 - -6,-8: - 0: 61183 - -6,-6: - 0: 65535 + 2: 16 -11,-8: - 0: 60074 + 2: 60074 -11,-7: - 0: 2730 + 2: 2730 -10,-8: - 0: 65262 + 2: 12846 + 0: 34816 -10,-7: - 0: 61166 + 2: 8738 + 0: 34952 -10,-6: - 0: 58094 - -9,-8: - 0: 65535 - -9,-7: - 0: 65535 - -9,-6: - 0: 62719 - -9,-10: - 0: 63728 + 2: 57890 + 0: 8 -9,-9: - 0: 65528 + 2: 4600 + 0: 49152 + -9,-10: + 2: 63728 -8,-10: - 0: 28784 - -8,-9: - 0: 65520 - -8,-6: - 0: 62960 - -6,-9: - 0: 65450 - -5,-9: - 0: 65535 - -7,-6: - 0: 65262 - -12,0: - 0: 34952 - -12,1: - 0: 34824 - -12,2: - 0: 34952 - -12,3: - 0: 136 - -12,-1: - 0: 34952 - -11,-1: - 0: 65279 - -11,-4: - 0: 61440 - -11,-3: - 0: 65535 - -11,-2: - 0: 65535 - -10,-4: - 0: 65160 - 0,-10: - 0: 20479 - 1,-10: - 0: 65535 - -5,-10: - 0: 65486 - -7,-8: - 0: 204 - -4,-9: - 0: 65535 - -3,-9: - 0: 65535 - -7,-9: - 0: 52224 - 7,7: - 0: 12 - 8,7: - 0: 61167 - 8,8: - 0: 65534 - 8,9: - 0: 3839 - 4,6: - 0: 52428 - 4,7: - 0: 12 - -3,8: - 0: 3086 - -2,8: - 0: 7967 - -11,5: - 0: 35916 - -11,6: - 0: 2184 - -12,-4: - 0: 61440 - -12,-3: - 0: 65535 - -12,-2: - 0: 136 - -10,-5: - 0: 32776 - -9,-5: - 0: 65484 - 0,-12: - 0: 30543 - 0,-11: - 0: 65535 - 1,-12: - 0: 4375 - 1,-11: - 0: 65535 - 2,-12: - 0: 44800 - 2,-11: - 0: 65535 - 3,-12: - 0: 768 - 3,-11: - 0: 4369 - -4,-11: - 0: 61440 - -4,-10: - 0: 65535 - -3,-11: - 0: 65008 - -3,-10: - 0: 65535 - -2,-12: - 0: 32768 - -2,-11: - 0: 65532 - -1,-12: - 0: 64591 - -1,-11: - 0: 65535 + 2: 28784 -6,-11: - 0: 8192 + 2: 8192 -6,-10: - 0: 60078 - -5,-11: - 0: 49152 + 2: 25262 + 8,9: + 2: 2815 9,8: - 0: 4368 + 2: 4368 9,9: - 0: 17 - 2,9: - 0: 1 + 2: 17 -14,-3: - 0: 61166 - -14,-4: - 0: 49152 + 0: 3272 -13,-4: - 0: 61440 - -13,-3: - 0: 65535 - 15,3: - 0: 31 - 20,3: - 0: 3 - 16,-3: - 0: 61440 - 18,-3: - 0: 32768 - 19,-3: - 0: 28672 - 16,3: - 0: 255 - 17,3: - 0: 3 - 18,3: - 0: 142 - 19,3: - 0: 127 + 0: 4096 uniqueMixes: - volume: 2500 temperature: 293.15 @@ -1337,6 +1410,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + immutable: True + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -26130,18 +26218,6 @@ entities: - type: Transform pos: -48.183727,-9.500211 parent: 31 -- proto: chem_master - entities: - - uid: 606 - components: - - type: Transform - pos: 19.5,-0.5 - parent: 31 - - uid: 5075 - components: - - type: Transform - pos: 15.5,1.5 - parent: 31 - proto: ChemDispenser entities: - uid: 5076 @@ -26161,6 +26237,18 @@ entities: - type: Transform pos: 18.5,1.5 parent: 31 +- proto: ChemMaster + entities: + - uid: 606 + components: + - type: Transform + pos: 19.5,-0.5 + parent: 31 + - uid: 5075 + components: + - type: Transform + pos: 15.5,1.5 + parent: 31 - proto: ChessBoard entities: - uid: 841 @@ -27734,14 +27822,6 @@ entities: - type: Transform pos: 8.5,30.5 parent: 31 -- proto: ComputerFrame - entities: - - uid: 7085 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 10.5,-16.5 - parent: 31 - proto: ComputerId entities: - uid: 810 @@ -34314,12 +34394,6 @@ entities: parent: 31 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 2227 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 9.5,-17.5 - parent: 31 - uid: 2417 components: - type: Transform @@ -42265,6 +42339,12 @@ entities: parent: 31 - type: AtmosPipeColor color: '#0055CCFF' + - uid: 2227 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 9.5,-17.5 + parent: 31 - uid: 2282 components: - type: Transform @@ -43171,11 +43251,15 @@ entities: - uid: 10912 components: - type: Transform + anchored: False rot: 1.5707963267948966 rad pos: 53.5,-7.5 parent: 31 - type: AtmosPipeColor color: '#990000FF' + - type: Physics + canCollide: True + bodyType: Dynamic - uid: 10931 components: - type: Transform @@ -43473,9 +43557,11 @@ entities: - uid: 2215 components: - type: Transform - rot: 1.5707963267948966 rad - pos: 7.5,-17.5 + rot: -1.5707963267948966 rad + pos: 10.5,-17.5 parent: 31 + - type: GasThermoMachine + targetTemperature: 150 - proto: GasThermoMachineHeater entities: - uid: 8861 @@ -49186,13 +49272,6 @@ entities: - type: Transform pos: 14.5,0.5 parent: 31 -- proto: MachineFrame - entities: - - uid: 7464 - components: - - type: Transform - pos: 10.5,-17.5 - parent: 31 - proto: MachineFrameDestroyed entities: - uid: 9667 @@ -57149,7 +57228,7 @@ entities: - type: Transform pos: -6.517076,-41.294003 parent: 31 -- proto: soda_dispenser +- proto: SodaDispenser entities: - uid: 1418 components: @@ -60963,13 +61042,6 @@ entities: - type: Transform pos: 48.60447,5.4525433 parent: 31 -- proto: UnfinishedMachineFrame - entities: - - uid: 7105 - components: - - type: Transform - pos: 10.5,-15.5 - parent: 31 - proto: UniformPrinter entities: - uid: 8408 From dc895feab3a6f105be81c37a2a7ab9bf4f2d838b Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Tue, 28 May 2024 09:52:59 +0200 Subject: [PATCH 078/112] Fix unlocked locker on Omega (#28247) --- Resources/Maps/omega.yml | 6002 +------------------------------------- 1 file changed, 57 insertions(+), 5945 deletions(-) diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index bf3ee069976..07ebb24b9da 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -37,12 +37,13 @@ entities: - type: MetaData - type: Transform - type: Map + mapPaused: True - type: PhysicsMap + - type: GridTree + - type: MovedGrids - type: Broadphase - type: OccluderTree - type: LoadedMap - - type: GridTree - - type: MovedGrids - uid: 4812 components: - type: MetaData @@ -3786,7 +3787,8 @@ entities: -9,2: 0: 65535 -9,3: - 0: 65535 + 2: 1 + 0: 65534 -8,0: 0: 65535 -8,-2: @@ -4217,8 +4219,6 @@ entities: - 8806 - 5025 - 6554 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4982 components: - type: Transform @@ -4229,16 +4229,12 @@ entities: devices: - 4941 - 4875 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6692 components: - type: Transform rot: -1.5707963267948966 rad pos: -23.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7234 components: - type: Transform @@ -4249,8 +4245,6 @@ entities: devices: - 4890 - 4876 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7236 components: - type: Transform @@ -4261,8 +4255,6 @@ entities: devices: - 8838 - 8836 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7241 components: - type: Transform @@ -4272,16 +4264,12 @@ entities: devices: - 6686 - 7227 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7249 components: - type: Transform rot: 1.5707963267948966 rad pos: -11.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7284 components: - type: Transform @@ -4292,8 +4280,6 @@ entities: - 12226 - 1853 - 1852 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12171 components: - type: Transform @@ -4305,8 +4291,6 @@ entities: - 12170 - 12027 - 12026 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12173 components: - type: Transform @@ -4318,8 +4302,6 @@ entities: - 12028 - 12025 - 12172 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12174 components: - type: Transform @@ -4331,8 +4313,6 @@ entities: - 12175 - 12029 - 12024 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12176 components: - type: Transform @@ -4343,8 +4323,6 @@ entities: - 12177 - 12032 - 12033 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12178 components: - type: Transform @@ -4361,8 +4339,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12182 components: - type: Transform @@ -4371,8 +4347,6 @@ entities: - type: DeviceList devices: - 12181 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12183 components: - type: Transform @@ -4389,8 +4363,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12186 components: - type: Transform @@ -4406,8 +4378,6 @@ entities: - 12185 - 3708 - 8787 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12190 components: - type: Transform @@ -4420,8 +4390,6 @@ entities: - 8691 - 12034 - 11962 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12193 components: - type: Transform @@ -4441,8 +4409,6 @@ entities: - 12189 - 12197 - 12196 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12198 components: - type: Transform @@ -4456,8 +4422,6 @@ entities: - 12197 - 1685 - 1686 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12202 components: - type: Transform @@ -4475,8 +4439,6 @@ entities: - 12204 - 12039 - 12040 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12206 components: - type: Transform @@ -4489,8 +4451,6 @@ entities: - 12205 - 8562 - 8563 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12209 components: - type: Transform @@ -4515,8 +4475,6 @@ entities: - 7873 - 7887 - 7886 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12213 components: - type: Transform @@ -4527,8 +4485,6 @@ entities: - 7905 - 7907 - 12214 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12215 components: - type: Transform @@ -4541,8 +4497,6 @@ entities: - 12212 - 7906 - 7908 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12219 components: - type: Transform @@ -4553,8 +4507,6 @@ entities: - 12218 - 7858 - 7856 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12220 components: - type: Transform @@ -4569,8 +4521,6 @@ entities: - 12222 - 8307 - 8306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12223 components: - type: Transform @@ -4585,8 +4535,6 @@ entities: - 12225 - 1817 - 1816 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12228 components: - type: Transform @@ -4600,8 +4548,6 @@ entities: - 1928 - 2474 - 2441 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12232 components: - type: Transform @@ -4615,8 +4561,6 @@ entities: - 2472 - 2442 - 2475 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12234 components: - type: Transform @@ -4635,8 +4579,6 @@ entities: - 2448 - 2446 - 2445 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12240 components: - type: Transform @@ -4651,8 +4593,6 @@ entities: - 2071 - 2072 - 2073 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12245 components: - type: Transform @@ -4669,8 +4609,6 @@ entities: - 2782 - 1770 - 3782 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12249 components: - type: Transform @@ -4688,8 +4626,6 @@ entities: - 2786 - 4439 - 4440 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12252 components: - type: Transform @@ -4702,8 +4638,6 @@ entities: - 12254 - 3021 - 3024 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12256 components: - type: Transform @@ -4717,8 +4651,6 @@ entities: - 3017 - 3019 - 12257 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12258 components: - type: Transform @@ -4730,8 +4662,6 @@ entities: - 12259 - 3001 - 2983 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12260 components: - type: Transform @@ -4742,8 +4672,6 @@ entities: - 3814 - 12261 - 3944 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12262 components: - type: Transform @@ -4755,8 +4683,6 @@ entities: - 3816 - 12263 - 3841 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12265 components: - type: Transform @@ -4768,8 +4694,6 @@ entities: - 3813 - 12264 - 3835 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12266 components: - type: Transform @@ -4780,8 +4704,6 @@ entities: - 3815 - 3838 - 12267 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12272 components: - type: Transform @@ -4797,8 +4719,6 @@ entities: - 4117 - 4442 - 4441 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12275 components: - type: Transform @@ -4812,8 +4732,6 @@ entities: - 4425 - 4380 - 4381 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12278 components: - type: Transform @@ -4826,8 +4744,6 @@ entities: - 4424 - 4444 - 4443 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12282 components: - type: Transform @@ -4838,8 +4754,6 @@ entities: - 4226 - 12281 - 4231 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12283 components: - type: Transform @@ -4851,8 +4765,6 @@ entities: - 4205 - 12284 - 4203 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12285 components: - type: Transform @@ -4867,8 +4779,6 @@ entities: - 6414 - 6417 - 6416 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12289 components: - type: Transform @@ -4888,8 +4798,6 @@ entities: - 12288 - 6420 - 6419 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12293 components: - type: Transform @@ -4904,8 +4812,6 @@ entities: - 12295 - 12038 - 12037 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12296 components: - type: Transform @@ -4916,8 +4822,6 @@ entities: - 1511 - 12297 - 1512 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12299 components: - type: Transform @@ -4930,8 +4834,6 @@ entities: - 858 - 857 - 848 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12302 components: - type: Transform @@ -4958,8 +4860,6 @@ entities: - 817 - 816 - 864 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12304 components: - type: Transform @@ -4970,8 +4870,6 @@ entities: - 877 - 885 - 12303 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12307 components: - type: Transform @@ -4982,8 +4880,6 @@ entities: - 847 - 846 - 12306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12308 components: - type: Transform @@ -4997,8 +4893,6 @@ entities: - 784 - 835 - 814 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12311 components: - type: Transform @@ -5013,8 +4907,6 @@ entities: - 1938 - 710 - 711 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12316 components: - type: Transform @@ -5044,8 +4936,6 @@ entities: - 328 - 3582 - 2759 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12319 components: - type: Transform @@ -5066,8 +4956,6 @@ entities: - 8591 - 8758 - 8770 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12322 components: - type: Transform @@ -5083,8 +4971,6 @@ entities: - 5222 - 5224 - 5225 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12325 components: - type: Transform @@ -5095,8 +4981,6 @@ entities: - 6842 - 6839 - 12326 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12327 components: - type: Transform @@ -5107,16 +4991,12 @@ entities: - 6841 - 6840 - 12328 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12330 components: - type: Transform rot: 3.141592653589793 rad pos: -9.5,-29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12341 components: - type: Transform @@ -5129,8 +5009,6 @@ entities: - 12343 - 7380 - 7382 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12344 components: - type: Transform @@ -5141,8 +5019,6 @@ entities: - 7088 - 7087 - 12345 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12346 components: - type: Transform @@ -5153,8 +5029,6 @@ entities: - 5700 - 5697 - 12347 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12350 components: - type: Transform @@ -5165,8 +5039,6 @@ entities: - 5699 - 5698 - 12349 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12352 components: - type: Transform @@ -5177,8 +5049,6 @@ entities: - 5715 - 5716 - 12351 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12353 components: - type: Transform @@ -5191,8 +5061,6 @@ entities: - 12355 - 5718 - 5719 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12356 components: - type: Transform @@ -5202,8 +5070,6 @@ entities: - type: DeviceList devices: - 12357 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12358 components: - type: Transform @@ -5214,8 +5080,6 @@ entities: - 5765 - 5763 - 12359 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12361 components: - type: Transform @@ -5226,8 +5090,6 @@ entities: - 5766 - 5764 - 12360 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12362 components: - type: Transform @@ -5238,8 +5100,6 @@ entities: - 12363 - 9007 - 8991 - - type: AtmosDevice - joinedGrid: 4812 - proto: AirAlarmElectronics entities: - uid: 10719 @@ -5259,77 +5119,55 @@ entities: - type: Transform pos: 15.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9041 components: - type: Transform pos: -34.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9671 components: - type: Transform pos: -31.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9672 components: - type: Transform pos: -31.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12398 components: - type: Transform pos: -34.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12399 components: - type: Transform pos: -34.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Airlock entities: - uid: 1531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,0.5 parent: 4812 - uid: 1534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,3.5 parent: 4812 - uid: 4116 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,7.5 parent: 4812 - uid: 6694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-34.5 parent: 4812 - uid: 7025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-34.5 parent: 4812 @@ -5361,22 +5199,16 @@ entities: entities: - uid: 8862 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-36.5 parent: 4812 - uid: 9563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-0.5 parent: 4812 - uid: 9566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,2.5 parent: 4812 @@ -5384,8 +5216,6 @@ entities: entities: - uid: 325 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,7.5 parent: 4812 @@ -5427,15 +5257,11 @@ entities: entities: - uid: 2419 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,26.5 parent: 4812 - uid: 2463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,28.5 parent: 4812 @@ -5471,22 +5297,17 @@ entities: - uid: 329 components: - type: MetaData - flags: PvsPriority name: Chaplain's Room - type: Transform pos: -25.5,-36.5 parent: 4812 - uid: 6792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-36.5 parent: 4812 - uid: 6793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-34.5 parent: 4812 @@ -5494,8 +5315,6 @@ entities: entities: - uid: 6617 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-19.5 parent: 4812 @@ -5576,15 +5395,11 @@ entities: entities: - uid: 5174 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,23.5 parent: 4812 - uid: 11928 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,18.5 parent: 4812 @@ -5592,15 +5407,11 @@ entities: entities: - uid: 5358 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-13.5 parent: 4812 - uid: 5359 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-17.5 parent: 4812 @@ -5630,106 +5441,76 @@ entities: entities: - uid: 901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,9.5 parent: 4812 - uid: 3726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,2.5 parent: 4812 - uid: 4370 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,0.5 parent: 4812 - uid: 4371 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,3.5 parent: 4812 - uid: 5912 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-32.5 parent: 4812 - uid: 6885 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-32.5 parent: 4812 - uid: 7956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,7.5 parent: 4812 - uid: 9564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-4.5 parent: 4812 - uid: 9663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-8.5 parent: 4812 - uid: 9664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-8.5 parent: 4812 - uid: 9888 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-12.5 parent: 4812 - uid: 9958 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-20.5 parent: 4812 - uid: 10165 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-23.5 parent: 4812 - uid: 11386 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-37.5 parent: 4812 - uid: 11688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 6.5,4.5 @@ -5919,50 +5700,36 @@ entities: entities: - uid: 2737 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,31.5 parent: 4812 - uid: 2814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,33.5 parent: 4812 - uid: 3349 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,10.5 parent: 4812 - uid: 3350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,10.5 parent: 4812 - uid: 3686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,44.5 parent: 4812 - uid: 3687 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,45.5 parent: 4812 - uid: 10405 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-22.5 parent: 4812 @@ -5970,8 +5737,6 @@ entities: entities: - uid: 3119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,35.5 parent: 4812 @@ -5979,8 +5744,6 @@ entities: entities: - uid: 716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-4.5 parent: 4812 @@ -6147,15 +5910,11 @@ entities: entities: - uid: 2461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,27.5 parent: 4812 - uid: 2462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,28.5 parent: 4812 @@ -6170,22 +5929,16 @@ entities: entities: - uid: 7934 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,25.5 parent: 4812 - uid: 7936 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,21.5 parent: 4812 - uid: 8242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,27.5 parent: 4812 @@ -6205,8 +5958,6 @@ entities: entities: - uid: 720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-10.5 parent: 4812 @@ -6221,15 +5972,11 @@ entities: entities: - uid: 7949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,6.5 parent: 4812 - uid: 8686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,0.5 parent: 4812 @@ -6237,8 +5984,6 @@ entities: entities: - uid: 324 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,7.5 parent: 4812 @@ -6246,8 +5991,6 @@ entities: entities: - uid: 2418 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,24.5 parent: 4812 @@ -6255,8 +5998,6 @@ entities: entities: - uid: 2741 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,24.5 parent: 4812 @@ -6264,15 +6005,11 @@ entities: entities: - uid: 6790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-31.5 parent: 4812 - uid: 6791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-31.5 parent: 4812 @@ -6280,8 +6017,6 @@ entities: entities: - uid: 7932 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,21.5 parent: 4812 @@ -6289,29 +6024,21 @@ entities: entities: - uid: 8683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-10.5 parent: 4812 - uid: 8684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-10.5 parent: 4812 - uid: 8685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-6.5 parent: 4812 - uid: 9830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-15.5 parent: 4812 @@ -6331,8 +6058,6 @@ entities: entities: - uid: 309 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-4.5 parent: 4812 @@ -6340,8 +6065,6 @@ entities: entities: - uid: 719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-5.5 parent: 4812 @@ -6349,15 +6072,11 @@ entities: entities: - uid: 717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-1.5 parent: 4812 - uid: 718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-6.5 parent: 4812 @@ -6365,246 +6084,176 @@ entities: entities: - uid: 336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-8.5 parent: 4812 - uid: 337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-3.5 parent: 4812 - uid: 338 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,2.5 parent: 4812 - uid: 339 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,13.5 parent: 4812 - uid: 340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,14.5 parent: 4812 - uid: 341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,10.5 parent: 4812 - uid: 342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-4.5 parent: 4812 - uid: 343 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-10.5 parent: 4812 - uid: 344 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,3.5 parent: 4812 - uid: 1252 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,2.5 parent: 4812 - uid: 2882 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,21.5 parent: 4812 - uid: 4372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,3.5 parent: 4812 - uid: 4374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,10.5 parent: 4812 - uid: 4375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,0.5 parent: 4812 - uid: 4376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-7.5 parent: 4812 - uid: 4377 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-7.5 parent: 4812 - uid: 5392 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-13.5 parent: 4812 - uid: 5399 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-27.5 parent: 4812 - uid: 5838 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-30.5 parent: 4812 - uid: 6982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-33.5 parent: 4812 - uid: 7054 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-21.5 parent: 4812 - uid: 7954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,8.5 parent: 4812 - uid: 8681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-11.5 parent: 4812 - uid: 8848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-31.5 parent: 4812 - uid: 8861 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-26.5 parent: 4812 - uid: 8866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-34.5 parent: 4812 - uid: 8867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-39.5 parent: 4812 - uid: 10157 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-22.5 parent: 4812 - uid: 10487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-26.5 parent: 4812 - uid: 11300 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-35.5 parent: 4812 - uid: 11326 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-34.5 parent: 4812 - uid: 11350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-34.5 parent: 4812 - uid: 11434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-35.5 parent: 4812 - uid: 11676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-37.5 parent: 4812 - uid: 11802 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-2.5 parent: 4812 @@ -6612,15 +6261,11 @@ entities: entities: - uid: 6788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-23.5 parent: 4812 - uid: 7336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-29.5 parent: 4812 @@ -6628,29 +6273,21 @@ entities: entities: - uid: 5497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-15.5 parent: 4812 - uid: 5498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-29.5 parent: 4812 - uid: 5499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-29.5 parent: 4812 - uid: 5787 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-29.5 parent: 4812 @@ -6658,8 +6295,6 @@ entities: entities: - uid: 7806 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,9.5 parent: 4812 @@ -6667,8 +6302,6 @@ entities: entities: - uid: 714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,10.5 parent: 4812 @@ -6708,29 +6341,21 @@ entities: entities: - uid: 7410 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-26.5 parent: 4812 - uid: 7414 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-17.5 parent: 4812 - uid: 7415 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-19.5 parent: 4812 - uid: 7416 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-13.5 parent: 4812 @@ -6745,8 +6370,6 @@ entities: entities: - uid: 2817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,28.5 parent: 4812 @@ -6766,8 +6389,6 @@ entities: entities: - uid: 2921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,14.5 parent: 4812 @@ -6832,36 +6453,26 @@ entities: entities: - uid: 5396 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-20.5 parent: 4812 - uid: 5484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-21.5 parent: 4812 - uid: 5485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-21.5 parent: 4812 - uid: 5486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-20.5 parent: 4812 - uid: 5487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-24.5 parent: 4812 @@ -6916,8 +6527,6 @@ entities: entities: - uid: 6675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-20.5 parent: 4812 @@ -6925,15 +6534,11 @@ entities: entities: - uid: 713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-0.5 parent: 4812 - uid: 886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,2.5 parent: 4812 @@ -6953,8 +6558,6 @@ entities: entities: - uid: 3771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-33.5 parent: 4812 @@ -7638,3046 +7241,2176 @@ entities: entities: - uid: 2840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,34.5 parent: 4812 - uid: 3012 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,37.5 parent: 4812 - uid: 3044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,38.5 parent: 4812 - uid: 3045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,38.5 parent: 4812 - uid: 3295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,36.5 parent: 4812 - uid: 3353 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,34.5 parent: 4812 - uid: 3372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,33.5 parent: 4812 - uid: 3373 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,31.5 parent: 4812 - uid: 3374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,37.5 parent: 4812 - uid: 3375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,35.5 parent: 4812 - uid: 3376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,33.5 parent: 4812 - uid: 3394 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,32.5 parent: 4812 - uid: 3395 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,32.5 parent: 4812 - uid: 3396 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,33.5 parent: 4812 - uid: 3397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,35.5 parent: 4812 - uid: 3398 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,38.5 parent: 4812 - uid: 3399 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,36.5 parent: 4812 - uid: 3400 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,34.5 parent: 4812 - uid: 3427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,32.5 parent: 4812 - uid: 3433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,36.5 parent: 4812 - uid: 3440 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,32.5 parent: 4812 - uid: 3450 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,32.5 parent: 4812 - uid: 3459 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,37.5 parent: 4812 - uid: 3460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,38.5 parent: 4812 - uid: 3461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,35.5 parent: 4812 - uid: 3579 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,37.5 parent: 4812 - uid: 3583 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,42.5 parent: 4812 - uid: 3584 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,42.5 parent: 4812 - uid: 3585 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,42.5 parent: 4812 - uid: 3586 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,41.5 parent: 4812 - uid: 3587 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,42.5 parent: 4812 - uid: 3588 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,41.5 parent: 4812 - uid: 3589 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,42.5 parent: 4812 - uid: 3590 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,41.5 parent: 4812 - uid: 3591 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,41.5 parent: 4812 - uid: 3592 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,41.5 parent: 4812 - uid: 3593 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,41.5 parent: 4812 - uid: 3594 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,41.5 parent: 4812 - uid: 3595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,40.5 parent: 4812 - uid: 3596 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,40.5 parent: 4812 - uid: 3597 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,40.5 parent: 4812 - uid: 3598 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,43.5 parent: 4812 - uid: 3599 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,44.5 parent: 4812 - uid: 3600 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,45.5 parent: 4812 - uid: 3601 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,47.5 parent: 4812 - uid: 3602 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,47.5 parent: 4812 - uid: 3603 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,48.5 parent: 4812 - uid: 3604 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,49.5 parent: 4812 - uid: 3605 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,49.5 parent: 4812 - uid: 3606 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,48.5 parent: 4812 - uid: 3607 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,48.5 parent: 4812 - uid: 3608 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,48.5 parent: 4812 - uid: 3609 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,49.5 parent: 4812 - uid: 3610 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,49.5 parent: 4812 - uid: 3612 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,49.5 parent: 4812 - uid: 3613 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,50.5 parent: 4812 - uid: 3614 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,50.5 parent: 4812 - uid: 3615 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,51.5 parent: 4812 - uid: 3616 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,50.5 parent: 4812 - uid: 3617 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,51.5 parent: 4812 - uid: 3618 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,51.5 parent: 4812 - uid: 3619 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,51.5 parent: 4812 - uid: 3620 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,53.5 parent: 4812 - uid: 3621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,52.5 parent: 4812 - uid: 3622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,52.5 parent: 4812 - uid: 3623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,50.5 parent: 4812 - uid: 3624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,53.5 parent: 4812 - uid: 3625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,53.5 parent: 4812 - uid: 3626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,54.5 parent: 4812 - uid: 3627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,54.5 parent: 4812 - uid: 3628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,55.5 parent: 4812 - uid: 3629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,56.5 parent: 4812 - uid: 3630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,57.5 parent: 4812 - uid: 3631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,57.5 parent: 4812 - uid: 3632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,56.5 parent: 4812 - uid: 3633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,57.5 parent: 4812 - uid: 3634 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,58.5 parent: 4812 - uid: 3635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,58.5 parent: 4812 - uid: 3636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,59.5 parent: 4812 - uid: 3637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,59.5 parent: 4812 - uid: 3638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,60.5 parent: 4812 - uid: 3639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,59.5 parent: 4812 - uid: 3640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,60.5 parent: 4812 - uid: 3641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,59.5 parent: 4812 - uid: 3642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,60.5 parent: 4812 - uid: 3643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,59.5 parent: 4812 - uid: 3644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,60.5 parent: 4812 - uid: 3645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,59.5 parent: 4812 - uid: 3646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,58.5 parent: 4812 - uid: 3647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,59.5 parent: 4812 - uid: 3648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,58.5 parent: 4812 - uid: 3649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,58.5 parent: 4812 - uid: 3650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,57.5 parent: 4812 - uid: 3651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,57.5 parent: 4812 - uid: 3652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,56.5 parent: 4812 - uid: 3653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,56.5 parent: 4812 - uid: 3654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,55.5 parent: 4812 - uid: 3655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,54.5 parent: 4812 - uid: 3656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,54.5 parent: 4812 - uid: 3657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,53.5 parent: 4812 - uid: 3658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,52.5 parent: 4812 - uid: 3659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,52.5 parent: 4812 - uid: 3660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,51.5 parent: 4812 - uid: 3661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,50.5 parent: 4812 - uid: 3662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,50.5 parent: 4812 - uid: 3663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,49.5 parent: 4812 - uid: 3664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,49.5 parent: 4812 - uid: 3665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,48.5 parent: 4812 - uid: 3666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,47.5 parent: 4812 - uid: 3667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,47.5 parent: 4812 - uid: 3668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,46.5 parent: 4812 - uid: 3669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,48.5 parent: 4812 - uid: 3670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,48.5 parent: 4812 - uid: 3671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,48.5 parent: 4812 - uid: 3672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,49.5 parent: 4812 - uid: 3673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,51.5 parent: 4812 - uid: 3676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,49.5 parent: 4812 - uid: 3679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,52.5 parent: 4812 - uid: 3680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,53.5 parent: 4812 - uid: 3681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,54.5 parent: 4812 - uid: 3682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,55.5 parent: 4812 - uid: 3683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,55.5 parent: 4812 - uid: 3684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,56.5 parent: 4812 - uid: 3685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,57.5 parent: 4812 - uid: 3976 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,27.5 parent: 4812 - uid: 5032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,32.5 parent: 4812 - uid: 5625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-18.5 parent: 4812 - uid: 5626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-20.5 parent: 4812 - uid: 5627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-19.5 parent: 4812 - uid: 5808 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-20.5 parent: 4812 - uid: 5809 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-21.5 parent: 4812 - uid: 5810 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-21.5 parent: 4812 - uid: 5811 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-20.5 parent: 4812 - uid: 5812 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-21.5 parent: 4812 - uid: 5813 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-22.5 parent: 4812 - uid: 5814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-23.5 parent: 4812 - uid: 5815 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-23.5 parent: 4812 - uid: 5816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-24.5 parent: 4812 - uid: 5817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-24.5 parent: 4812 - uid: 5818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-24.5 parent: 4812 - uid: 5819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-29.5 parent: 4812 - uid: 5820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-28.5 parent: 4812 - uid: 5821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-27.5 parent: 4812 - uid: 5822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-26.5 parent: 4812 - uid: 5823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-25.5 parent: 4812 - uid: 5824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-28.5 parent: 4812 - uid: 5825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-27.5 parent: 4812 - uid: 5827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-25.5 parent: 4812 - uid: 5828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-25.5 parent: 4812 - uid: 5829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-26.5 parent: 4812 - uid: 5830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 39.5,-27.5 parent: 4812 - uid: 5831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 40.5,-27.5 parent: 4812 - uid: 5832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 40.5,-26.5 parent: 4812 - uid: 5839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-17.5 parent: 4812 - uid: 6332 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-21.5 parent: 4812 - uid: 8458 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,36.5 parent: 4812 - uid: 8459 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,35.5 parent: 4812 - uid: 8460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,34.5 parent: 4812 - uid: 8461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,33.5 parent: 4812 - uid: 8462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,32.5 parent: 4812 - uid: 8463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,30.5 parent: 4812 - uid: 8464 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,31.5 parent: 4812 - uid: 8465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,31.5 parent: 4812 - uid: 8466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,31.5 parent: 4812 - uid: 8467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,31.5 parent: 4812 - uid: 8468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,31.5 parent: 4812 - uid: 8469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,31.5 parent: 4812 - uid: 8470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,31.5 parent: 4812 - uid: 8471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,31.5 parent: 4812 - uid: 8472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,31.5 parent: 4812 - uid: 8473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,32.5 parent: 4812 - uid: 8474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,32.5 parent: 4812 - uid: 8475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,32.5 parent: 4812 - uid: 8476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,32.5 parent: 4812 - uid: 8479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,32.5 parent: 4812 - uid: 8480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,33.5 parent: 4812 - uid: 8483 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,33.5 parent: 4812 - uid: 8484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,33.5 parent: 4812 - uid: 8485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,34.5 parent: 4812 - uid: 8486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,34.5 parent: 4812 - uid: 8487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,34.5 parent: 4812 - uid: 8488 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,34.5 parent: 4812 - uid: 8489 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,34.5 parent: 4812 - uid: 8490 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,35.5 parent: 4812 - uid: 8491 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,35.5 parent: 4812 - uid: 8492 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,35.5 parent: 4812 - uid: 8493 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,36.5 parent: 4812 - uid: 8494 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,36.5 parent: 4812 - uid: 8495 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,37.5 parent: 4812 - uid: 8496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,38.5 parent: 4812 - uid: 8497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,38.5 parent: 4812 - uid: 8498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,30.5 parent: 4812 - uid: 8499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,33.5 parent: 4812 - uid: 8500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,34.5 parent: 4812 - uid: 8501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,34.5 parent: 4812 - uid: 8502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,34.5 parent: 4812 - uid: 8503 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,34.5 parent: 4812 - uid: 8504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,35.5 parent: 4812 - uid: 8505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,35.5 parent: 4812 - uid: 8506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,37.5 parent: 4812 - uid: 8507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,37.5 parent: 4812 - uid: 8508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,38.5 parent: 4812 - uid: 8509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,38.5 parent: 4812 - uid: 8510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,38.5 parent: 4812 - uid: 8511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,38.5 parent: 4812 - uid: 8512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,39.5 parent: 4812 - uid: 8513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,39.5 parent: 4812 - uid: 8514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,39.5 parent: 4812 - uid: 8515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,39.5 parent: 4812 - uid: 8516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,34.5 parent: 4812 - uid: 8517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,34.5 parent: 4812 - uid: 8518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,34.5 parent: 4812 - uid: 8519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,34.5 parent: 4812 - uid: 8520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,34.5 parent: 4812 - uid: 8521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,35.5 parent: 4812 - uid: 8522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,36.5 parent: 4812 - uid: 8523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,36.5 parent: 4812 - uid: 8524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,35.5 parent: 4812 - uid: 8525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,35.5 parent: 4812 - uid: 9621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-34.5 parent: 4812 - uid: 9622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-33.5 parent: 4812 - uid: 9623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-33.5 parent: 4812 - uid: 9624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-32.5 parent: 4812 - uid: 9630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-29.5 parent: 4812 - uid: 9631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-30.5 parent: 4812 - uid: 9632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-29.5 parent: 4812 - uid: 9633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-28.5 parent: 4812 - uid: 9637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-26.5 parent: 4812 - uid: 9638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-38.5 parent: 4812 - uid: 9639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-39.5 parent: 4812 - uid: 9640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-39.5 parent: 4812 - uid: 9641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-39.5 parent: 4812 - uid: 9642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-39.5 parent: 4812 - uid: 9643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-40.5 parent: 4812 - uid: 10417 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-20.5 parent: 4812 - uid: 10418 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-20.5 parent: 4812 - uid: 10419 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-20.5 parent: 4812 - uid: 10420 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-20.5 parent: 4812 - uid: 10421 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-19.5 parent: 4812 - uid: 10422 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-19.5 parent: 4812 - uid: 10423 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-19.5 parent: 4812 - uid: 10424 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-18.5 parent: 4812 - uid: 10425 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-18.5 parent: 4812 - uid: 10426 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-18.5 parent: 4812 - uid: 10427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-17.5 parent: 4812 - uid: 10428 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-16.5 parent: 4812 - uid: 10429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-15.5 parent: 4812 - uid: 10430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-15.5 parent: 4812 - uid: 10431 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-15.5 parent: 4812 - uid: 10432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-15.5 parent: 4812 - uid: 10433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-15.5 parent: 4812 - uid: 10434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-15.5 parent: 4812 - uid: 10435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-15.5 parent: 4812 - uid: 10436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-15.5 parent: 4812 - uid: 10437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-15.5 parent: 4812 - uid: 10438 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-15.5 parent: 4812 - uid: 10439 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-16.5 parent: 4812 - uid: 10443 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-16.5 parent: 4812 - uid: 10444 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-16.5 parent: 4812 - uid: 10447 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-16.5 parent: 4812 - uid: 10448 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-17.5 parent: 4812 - uid: 10449 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-17.5 parent: 4812 - uid: 10452 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-17.5 parent: 4812 - uid: 10453 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-17.5 parent: 4812 - uid: 10454 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-17.5 parent: 4812 - uid: 10455 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-17.5 parent: 4812 - uid: 10456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-17.5 parent: 4812 - uid: 10457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-18.5 parent: 4812 - uid: 10458 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-18.5 parent: 4812 - uid: 10460 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,29.5 parent: 4812 - uid: 10461 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-19.5 parent: 4812 - uid: 10462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-19.5 parent: 4812 - uid: 10463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,28.5 parent: 4812 - uid: 10464 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-14.5 parent: 4812 - uid: 10465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-13.5 parent: 4812 - uid: 10466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-12.5 parent: 4812 - uid: 10467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-11.5 parent: 4812 - uid: 10468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-10.5 parent: 4812 - uid: 10469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-9.5 parent: 4812 - uid: 10470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-8.5 parent: 4812 - uid: 10472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-10.5 parent: 4812 - uid: 10473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-11.5 parent: 4812 - uid: 10474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,28.5 parent: 4812 - uid: 10475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-13.5 parent: 4812 - uid: 10476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-14.5 parent: 4812 - uid: 10477 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-15.5 parent: 4812 - uid: 10478 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-13.5 parent: 4812 - uid: 10479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-12.5 parent: 4812 - uid: 10480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-11.5 parent: 4812 - uid: 10481 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-10.5 parent: 4812 - uid: 10482 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-9.5 parent: 4812 - uid: 10483 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-7.5 parent: 4812 - uid: 10484 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -57.5,-8.5 parent: 4812 - uid: 10485 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -58.5,-8.5 parent: 4812 - uid: 10486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-2.5 parent: 4812 - uid: 10926 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,14.5 parent: 4812 - uid: 10927 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,15.5 parent: 4812 - uid: 10928 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,16.5 parent: 4812 - uid: 10929 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,17.5 parent: 4812 - uid: 10941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,24.5 parent: 4812 - uid: 10942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,25.5 parent: 4812 - uid: 10943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,26.5 parent: 4812 - uid: 10944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,27.5 parent: 4812 - uid: 10945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,24.5 parent: 4812 - uid: 10947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,26.5 parent: 4812 - uid: 10948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,27.5 parent: 4812 - uid: 10949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,28.5 parent: 4812 - uid: 10950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,29.5 parent: 4812 - uid: 10951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,30.5 parent: 4812 - uid: 10952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,31.5 parent: 4812 - uid: 10953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,32.5 parent: 4812 - uid: 10954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,33.5 parent: 4812 - uid: 10955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,32.5 parent: 4812 - uid: 10956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,31.5 parent: 4812 - uid: 10957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,30.5 parent: 4812 - uid: 10963 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,24.5 parent: 4812 - uid: 10965 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,15.5 parent: 4812 - uid: 10966 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,16.5 parent: 4812 - uid: 10967 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,17.5 parent: 4812 - uid: 10969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,19.5 parent: 4812 - uid: 10970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,20.5 parent: 4812 - uid: 10971 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,21.5 parent: 4812 - uid: 10972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,22.5 parent: 4812 - uid: 10973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,23.5 parent: 4812 - uid: 10974 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,24.5 parent: 4812 - uid: 10975 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,24.5 parent: 4812 - uid: 10977 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,24.5 parent: 4812 - uid: 10982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,23.5 parent: 4812 - uid: 10983 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,18.5 parent: 4812 - uid: 10984 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,31.5 parent: 4812 - uid: 10986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,33.5 parent: 4812 - uid: 10987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,33.5 parent: 4812 - uid: 10988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,33.5 parent: 4812 - uid: 10990 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,32.5 parent: 4812 - uid: 10991 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,31.5 parent: 4812 - uid: 10992 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,30.5 parent: 4812 - uid: 10993 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,29.5 parent: 4812 - uid: 10994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,28.5 parent: 4812 - uid: 10995 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,27.5 parent: 4812 - uid: 10999 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,26.5 parent: 4812 - uid: 11000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,27.5 parent: 4812 - uid: 11001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,28.5 parent: 4812 - uid: 11002 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,29.5 parent: 4812 - uid: 11003 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,30.5 parent: 4812 - uid: 11004 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,31.5 parent: 4812 - uid: 11005 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,32.5 parent: 4812 - uid: 11009 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,17.5 parent: 4812 - uid: 11010 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,18.5 parent: 4812 - uid: 11011 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,19.5 parent: 4812 - uid: 11012 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,20.5 parent: 4812 - uid: 11013 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,21.5 parent: 4812 - uid: 11014 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,24.5 parent: 4812 - uid: 11016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,24.5 parent: 4812 - uid: 11017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,25.5 parent: 4812 - uid: 11018 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,26.5 parent: 4812 - uid: 11019 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,21.5 parent: 4812 - uid: 11020 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,22.5 parent: 4812 - uid: 11021 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,23.5 parent: 4812 - uid: 11022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,24.5 parent: 4812 - uid: 11023 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,25.5 parent: 4812 - uid: 11024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,26.5 parent: 4812 - uid: 11025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,25.5 parent: 4812 - uid: 11026 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,26.5 parent: 4812 - uid: 11027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,27.5 parent: 4812 - uid: 11028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,28.5 parent: 4812 - uid: 11029 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,29.5 parent: 4812 - uid: 11616 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-30.5 parent: 4812 - uid: 11621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-39.5 parent: 4812 - uid: 11622 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-41.5 parent: 4812 - uid: 11623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-41.5 parent: 4812 - uid: 11624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-41.5 parent: 4812 - uid: 11625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-41.5 parent: 4812 - uid: 11626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-39.5 parent: 4812 - uid: 11627 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-39.5 parent: 4812 - uid: 11628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-40.5 parent: 4812 - uid: 11629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-40.5 parent: 4812 - uid: 11630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-41.5 parent: 4812 - uid: 11631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-42.5 parent: 4812 - uid: 11632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-40.5 parent: 4812 - uid: 11633 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-41.5 parent: 4812 - uid: 11634 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-40.5 parent: 4812 - uid: 11635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-42.5 parent: 4812 - uid: 11636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-42.5 parent: 4812 - uid: 11637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-43.5 parent: 4812 - uid: 11638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-43.5 parent: 4812 - uid: 11639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-43.5 parent: 4812 - uid: 11640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-44.5 parent: 4812 - uid: 11641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-44.5 parent: 4812 - uid: 11643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-44.5 parent: 4812 - uid: 11644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-44.5 parent: 4812 - uid: 11645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-44.5 parent: 4812 - uid: 11647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-45.5 parent: 4812 - uid: 11648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-45.5 parent: 4812 - uid: 11649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-45.5 parent: 4812 - uid: 11650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-45.5 parent: 4812 - uid: 11651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-45.5 parent: 4812 - uid: 11652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-45.5 parent: 4812 - uid: 11653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-46.5 parent: 4812 - uid: 11654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-46.5 parent: 4812 - uid: 11655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-46.5 parent: 4812 - uid: 11656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-46.5 parent: 4812 - uid: 11657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-46.5 parent: 4812 - uid: 11658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-46.5 parent: 4812 - uid: 11659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-44.5 parent: 4812 - uid: 11660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-43.5 parent: 4812 - uid: 11663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-38.5 parent: 4812 - uid: 11664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-41.5 parent: 4812 - uid: 11665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-42.5 parent: 4812 - uid: 11666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-43.5 parent: 4812 - uid: 11667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-44.5 parent: 4812 - uid: 11668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-44.5 parent: 4812 - uid: 11669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-43.5 parent: 4812 - uid: 11670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-42.5 parent: 4812 - uid: 11679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-38.5 parent: 4812 - uid: 11680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-43.5 parent: 4812 - uid: 11681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-44.5 parent: 4812 - uid: 11682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-44.5 parent: 4812 - uid: 11683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-43.5 parent: 4812 - uid: 11684 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-38.5 parent: 4812 - uid: 11686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-38.5 parent: 4812 - uid: 11689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-43.5 parent: 4812 - uid: 11690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-42.5 parent: 4812 - uid: 11691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-40.5 parent: 4812 - uid: 11695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-42.5 parent: 4812 - uid: 11696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-42.5 parent: 4812 - uid: 11697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-43.5 parent: 4812 - uid: 11698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-43.5 parent: 4812 - uid: 11699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-42.5 parent: 4812 - uid: 11700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-42.5 parent: 4812 - uid: 11701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-42.5 parent: 4812 - uid: 11702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-40.5 parent: 4812 - uid: 11703 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-39.5 parent: 4812 - uid: 11704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-38.5 parent: 4812 - uid: 11705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-41.5 parent: 4812 - uid: 12144 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-25.5 parent: 4812 @@ -10685,8 +9418,6 @@ entities: entities: - uid: 12146 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-3.5 parent: 4812 @@ -11056,8 +9787,6 @@ entities: rot: 3.141592653589793 rad pos: -29.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Beaker entities: - uid: 9030 @@ -11293,22 +10022,16 @@ entities: entities: - uid: 729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,18.5 parent: 4812 - uid: 771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,18.5 parent: 4812 - uid: 2864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,24.5 parent: 4812 @@ -11317,8 +10040,6 @@ entities: - 2938 - uid: 2866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,28.5 parent: 4812 @@ -11327,8 +10048,6 @@ entities: - 2938 - uid: 5573 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-30.5 parent: 4812 @@ -11337,8 +10056,6 @@ entities: - 6690 - uid: 5574 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-29.5 parent: 4812 @@ -11347,8 +10064,6 @@ entities: - 6690 - uid: 5575 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-28.5 parent: 4812 @@ -11357,8 +10072,6 @@ entities: - 6690 - uid: 5794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-27.5 parent: 4812 @@ -11367,8 +10080,6 @@ entities: - 6218 - uid: 5795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-26.5 parent: 4812 @@ -11377,8 +10088,6 @@ entities: - 6218 - uid: 5796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-25.5 parent: 4812 @@ -11387,8 +10096,6 @@ entities: - 6218 - uid: 9496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,18.5 parent: 4812 @@ -11402,22 +10109,30 @@ entities: - type: Transform pos: 27.5,-0.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 5026 components: - type: Transform rot: -1.5707963267948966 rad pos: -9.5,-47.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 8399 components: - type: Transform pos: -26.5,32.5 parent: 4812 + - type: SpamEmitSound + enabled: False - uid: 10853 components: - type: Transform pos: -22.5,5.5 parent: 4812 + - type: SpamEmitSound + enabled: False - proto: BookAtmosAirAlarms entities: - uid: 865 @@ -11446,33 +10161,29 @@ entities: - type: Transform pos: -25.436514,-18.48842 parent: 4812 -- proto: BookDetective +- proto: BookRandom entities: - - uid: 5387 + - uid: 7161 components: - type: Transform - pos: 17.568647,-11.417019 + pos: -30.557493,-18.387486 parent: 4812 -- proto: BookEscalation +- proto: BookRandomStory entities: - - uid: 12421 + - uid: 5387 components: - type: Transform - pos: -30.59653,-19.308746 + pos: 17.568647,-11.417019 parent: 4812 -- proto: BookEscalationSecurity - entities: - uid: 10446 components: - type: Transform pos: -30.424656,-19.480621 parent: 4812 -- proto: BookRandom - entities: - - uid: 7161 + - uid: 12421 components: - type: Transform - pos: -30.557493,-18.387486 + pos: -30.59653,-19.308746 parent: 4812 - proto: BooksBag entities: @@ -11485,78 +10196,56 @@ entities: entities: - uid: 1952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,25.5 parent: 4812 - uid: 5374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-18.5 parent: 4812 - uid: 7000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-32.5 parent: 4812 - uid: 7001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-36.5 parent: 4812 - uid: 7005 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-38.5 parent: 4812 - uid: 7130 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-22.5 parent: 4812 - uid: 7131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-21.5 parent: 4812 - uid: 7172 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-39.5 parent: 4812 - uid: 8391 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,32.5 parent: 4812 - uid: 8392 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,29.5 parent: 4812 - uid: 11352 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-32.5 parent: 4812 @@ -11564,113 +10253,81 @@ entities: entities: - uid: 4816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-20.5 parent: 4812 - uid: 4817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-18.5 parent: 4812 - uid: 4818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-18.5 parent: 4812 - uid: 4819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-20.5 parent: 4812 - uid: 4820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-20.5 parent: 4812 - uid: 4821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-20.5 parent: 4812 - uid: 4822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-18.5 parent: 4812 - uid: 4823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-20.5 parent: 4812 - uid: 4824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-18.5 parent: 4812 - uid: 4825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-18.5 parent: 4812 - uid: 4835 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-14.5 parent: 4812 - uid: 4836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-14.5 parent: 4812 - uid: 4837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-16.5 parent: 4812 - uid: 4839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-19.5 parent: 4812 - uid: 4840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-18.5 parent: 4812 - uid: 4841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-17.5 parent: 4812 @@ -26916,8 +25573,6 @@ entities: - type: Transform pos: -53.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: Carpet entities: - uid: 1739 @@ -29683,18 +28338,6 @@ entities: - type: Transform pos: -17.5785,-25.512428 parent: 4812 -- proto: chem_master - entities: - - uid: 6606 - components: - - type: Transform - pos: -8.5,-15.5 - parent: 4812 - - uid: 6607 - components: - - type: Transform - pos: -12.5,-17.5 - parent: 4812 - proto: ChemDispenser entities: - uid: 6604 @@ -29726,6 +28369,18 @@ entities: - type: Transform pos: -10.5,-18.5 parent: 4812 +- proto: ChemMaster + entities: + - uid: 6606 + components: + - type: Transform + pos: -8.5,-15.5 + parent: 4812 + - uid: 6607 + components: + - type: Transform + pos: -12.5,-17.5 + parent: 4812 - proto: ChessBoard entities: - uid: 11880 @@ -31862,25 +30517,13 @@ entities: - type: Transform pos: -44.4085,-23.673323 parent: 4812 -- proto: ClothingHeadHatFlowerCrown +- proto: ClothingHeadHatFlowerWreath entities: - uid: 7254 components: - type: Transform pos: -24.594517,-34.532703 parent: 4812 -- proto: ClothingHeadHatHairflower - entities: - - uid: 2716 - components: - - type: Transform - pos: -5.180887,24.379204 - parent: 4812 - - uid: 12475 - components: - - type: Transform - pos: -24.401733,-34.40146 - parent: 4812 - proto: ClothingHeadHatHardhatOrange entities: - uid: 12119 @@ -31920,8 +30563,6 @@ entities: entities: - uid: 10924 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -32159,8 +30800,6 @@ entities: entities: - uid: 10922 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -32283,8 +30922,6 @@ entities: entities: - uid: 6765 components: - - type: MetaData - flags: InContainer - type: Transform parent: 3441 - type: Physics @@ -32481,8 +31118,6 @@ entities: entities: - uid: 10923 components: - - type: MetaData - flags: InContainer - type: Transform parent: 10921 - type: Physics @@ -33904,6 +32539,9 @@ entities: - type: Transform pos: -3.5,26.5 parent: 4812 + - type: SingletonDeviceNetServer + active: False + available: False - proto: Crowbar entities: - uid: 3469 @@ -33966,15 +32604,11 @@ entities: - type: Transform pos: -15.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7219 components: - type: Transform pos: -13.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: CryoxadoneBeakerSmall entities: - uid: 3269 @@ -37321,8 +35955,6 @@ entities: entities: - uid: 4992 components: - - type: MetaData - flags: InContainer - type: Transform parent: 4991 - type: Physics @@ -37331,8 +35963,6 @@ entities: entities: - uid: 6663 components: - - type: MetaData - flags: InContainer - type: Transform parent: 6662 - type: Physics @@ -37341,8 +35971,6 @@ entities: entities: - uid: 7268 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7267 - type: Physics @@ -37351,8 +35979,6 @@ entities: entities: - uid: 7291 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7290 - type: Physics @@ -37361,8 +35987,6 @@ entities: entities: - uid: 331 components: - - type: MetaData - flags: InContainer - type: Transform parent: 330 - type: Physics @@ -37371,8 +35995,6 @@ entities: entities: - uid: 7248 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7247 - type: Physics @@ -37381,8 +36003,6 @@ entities: entities: - uid: 7269 components: - - type: MetaData - flags: InContainer - type: Transform parent: 7267 - type: Physics @@ -37613,8 +36233,6 @@ entities: - type: DeviceList devices: - 5039 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4979 components: - type: Transform @@ -37627,16 +36245,12 @@ entities: - 5047 - 6553 - 8806 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6781 components: - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8804 components: - type: Transform @@ -37650,8 +36264,6 @@ entities: - 4920 - 8838 - 8836 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10750 components: - type: Transform @@ -37666,8 +36278,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12180 components: - type: Transform @@ -37682,8 +36292,6 @@ entities: - 10754 - 10755 - 10756 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12187 components: - type: Transform @@ -37697,8 +36305,6 @@ entities: - 12189 - 12188 - 12185 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12191 components: - type: Transform @@ -37709,8 +36315,6 @@ entities: devices: - 12192 - 8691 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12194 components: - type: Transform @@ -37728,8 +36332,6 @@ entities: - 12189 - 12197 - 12196 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12199 components: - type: Transform @@ -37741,8 +36343,6 @@ entities: - 12200 - 12196 - 12197 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12203 components: - type: Transform @@ -37759,8 +36359,6 @@ entities: - 8155 - 12205 - 12204 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12207 components: - type: Transform @@ -37771,8 +36369,6 @@ entities: - 12208 - 12204 - 12205 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12210 components: - type: Transform @@ -37785,8 +36381,6 @@ entities: - 12212 - 7782 - 7783 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12217 components: - type: Transform @@ -37797,8 +36391,6 @@ entities: devices: - 12216 - 12212 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12221 components: - type: Transform @@ -37811,8 +36403,6 @@ entities: - 2693 - 2695 - 12222 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12224 components: - type: Transform @@ -37825,8 +36415,6 @@ entities: - 2782 - 2783 - 12225 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12229 components: - type: Transform @@ -37838,8 +36426,6 @@ entities: - 12230 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12233 components: - type: Transform @@ -37851,8 +36437,6 @@ entities: - 12231 - 2473 - 2472 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12235 components: - type: Transform @@ -37866,8 +36450,6 @@ entities: - 2472 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12236 components: - type: Transform @@ -37881,8 +36463,6 @@ entities: - 2472 - 2231 - 1928 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12238 components: - type: Transform @@ -37894,8 +36474,6 @@ entities: - 2476 - 963 - 12239 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12241 components: - type: Transform @@ -37905,8 +36483,6 @@ entities: devices: - 12242 - 1927 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12244 components: - type: Transform @@ -37921,8 +36497,6 @@ entities: - 963 - 2783 - 2782 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12246 components: - type: Transform @@ -37935,8 +36509,6 @@ entities: - 2853 - 12247 - 3257 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12250 components: - type: Transform @@ -37952,8 +36524,6 @@ entities: - 2853 - 2787 - 2786 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12253 components: - type: Transform @@ -37964,8 +36534,6 @@ entities: devices: - 3257 - 12254 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12273 components: - type: Transform @@ -37979,8 +36547,6 @@ entities: - 12274 - 4122 - 4117 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12276 components: - type: Transform @@ -37991,8 +36557,6 @@ entities: - 12277 - 4424 - 4425 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12280 components: - type: Transform @@ -38004,8 +36568,6 @@ entities: - 12279 - 4425 - 4424 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12286 components: - type: Transform @@ -38019,8 +36581,6 @@ entities: - 4426 - 6415 - 6414 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12290 components: - type: Transform @@ -38038,8 +36598,6 @@ entities: - 6414 - 6415 - 12288 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12291 components: - type: Transform @@ -38052,8 +36610,6 @@ entities: - 12292 - 6494 - 6495 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12294 components: - type: Transform @@ -38067,8 +36623,6 @@ entities: - 6500 - 6499 - 12295 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12301 components: - type: Transform @@ -38090,8 +36644,6 @@ entities: - 353 - 352 - 350 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12305 components: - type: Transform @@ -38108,8 +36660,6 @@ entities: - 352 - 350 - 12306 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12310 components: - type: Transform @@ -38121,8 +36671,6 @@ entities: - 782 - 783 - 784 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12312 components: - type: Transform @@ -38135,8 +36683,6 @@ entities: - 1940 - 1939 - 1938 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12314 components: - type: Transform @@ -38168,8 +36714,6 @@ entities: - 6655 - 4980 - 7198 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12317 components: - type: Transform @@ -38188,8 +36732,6 @@ entities: - 8591 - 8758 - 8770 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12320 components: - type: Transform @@ -38201,8 +36743,6 @@ entities: - 12321 - 5072 - 5071 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12342 components: - type: Transform @@ -38214,8 +36754,6 @@ entities: - 6585 - 6584 - 12343 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12348 components: - type: Transform @@ -38227,8 +36765,6 @@ entities: - 12347 - 5791 - 5792 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12354 components: - type: Transform @@ -38240,8 +36776,6 @@ entities: - 5600 - 5599 - 12355 - - type: AtmosDevice - joinedGrid: 4812 - proto: FireAxeCabinetFilled entities: - uid: 6784 @@ -39705,6 +38239,18 @@ entities: - type: Transform pos: 9.469537,-39.368214 parent: 4812 +- proto: FoodPoppy + entities: + - uid: 2716 + components: + - type: Transform + pos: -5.180887,24.379204 + parent: 4812 + - uid: 12475 + components: + - type: Transform + pos: -24.401733,-34.40146 + parent: 4812 - proto: FoodSnackCheesie entities: - uid: 1775 @@ -39763,8 +38309,6 @@ entities: rot: 1.5707963267948966 rad pos: -13.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasFilterFlipped @@ -39774,8 +38318,6 @@ entities: - type: Transform pos: -47.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9170 @@ -39783,36 +38325,26 @@ entities: - type: Transform pos: -47.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9171 components: - type: Transform pos: -47.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9172 components: - type: Transform pos: -47.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9173 components: - type: Transform pos: -47.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9174 components: - type: Transform pos: -47.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerCarbonDioxide entities: - uid: 9452 @@ -39820,8 +38352,6 @@ entities: - type: Transform pos: -52.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerNitrogen entities: - uid: 9449 @@ -39829,8 +38359,6 @@ entities: - type: Transform pos: -52.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerOxygen entities: - uid: 9451 @@ -39838,8 +38366,6 @@ entities: - type: Transform pos: -52.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMinerWaterVapor entities: - uid: 9454 @@ -39847,8 +38373,6 @@ entities: - type: Transform pos: -52.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasMixerFlipped entities: - uid: 8550 @@ -39856,8 +38380,6 @@ entities: - type: Transform pos: -45.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8552 components: - type: Transform @@ -39867,8 +38389,6 @@ entities: - type: GasMixer inletTwoConcentration: 0.22000003 inletOneConcentration: 0.78 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#03FDC3FF' - uid: 9236 @@ -39876,29 +38396,21 @@ entities: - type: Transform pos: -45.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9237 components: - type: Transform pos: -45.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9247 components: - type: Transform pos: -45.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9261 components: - type: Transform pos: -45.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasOutletInjector entities: - uid: 4002 @@ -39907,56 +38419,42 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4445 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4446 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4478 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4479 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4497 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4826 components: - type: Transform rot: 1.5707963267948966 rad pos: -51.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasPassiveGate entities: - uid: 5801 @@ -39965,8 +38463,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,-19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8979 @@ -39975,8 +38471,6 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-33.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasPassiveVent @@ -39987,47 +38481,35 @@ entities: rot: 3.141592653589793 rad pos: 6.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 863 components: - type: Transform rot: 3.141592653589793 rad pos: 7.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 3817 components: - type: Transform rot: -1.5707963267948966 rad pos: 17.5,46.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5596 components: - type: Transform rot: 1.5707963267948966 rad pos: 23.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9005 components: - type: Transform rot: 3.141592653589793 rad pos: -40.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9168 components: - type: Transform pos: -49.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9199 @@ -40036,69 +38518,51 @@ entities: rot: 3.141592653589793 rad pos: -53.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9200 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9201 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9202 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9203 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9204 components: - type: Transform rot: 3.141592653589793 rad pos: -53.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9264 components: - type: Transform pos: -47.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9494 components: - type: Transform pos: -45.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9495 components: - type: Transform pos: -43.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasPipeBend entities: - uid: 560 @@ -52101,16 +50565,12 @@ entities: - type: Transform pos: -29.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 3467 components: - type: Transform rot: 1.5707963267948966 rad pos: -34.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3710 @@ -52119,8 +50579,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3711 @@ -52129,8 +50587,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3712 @@ -52139,8 +50595,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3839 @@ -52149,8 +50603,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5593 @@ -52159,40 +50611,30 @@ entities: rot: -1.5707963267948966 rad pos: 29.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5594 components: - type: Transform rot: -1.5707963267948966 rad pos: 29.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8839 components: - type: Transform rot: 3.141592653589793 rad pos: -12.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9037 components: - type: Transform rot: 3.141592653589793 rad pos: -33.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9548 components: - type: Transform rot: -1.5707963267948966 rad pos: -41.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9549 @@ -52201,8 +50643,6 @@ entities: rot: -1.5707963267948966 rad pos: -41.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9550 @@ -52211,8 +50651,6 @@ entities: rot: -1.5707963267948966 rad pos: -41.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - proto: GasPressurePump @@ -52223,8 +50661,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,46.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4929 @@ -52234,8 +50670,6 @@ entities: - type: Transform pos: -12.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5583 @@ -52244,24 +50678,18 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5584 components: - type: Transform rot: 1.5707963267948966 rad pos: 25.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8773 components: - type: Transform rot: -1.5707963267948966 rad pos: -39.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9115 @@ -52270,16 +50698,12 @@ entities: rot: 1.5707963267948966 rad pos: -47.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9131 components: - type: Transform rot: 1.5707963267948966 rad pos: -39.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 9206 @@ -52288,47 +50712,35 @@ entities: rot: 1.5707963267948966 rad pos: -47.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9212 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9218 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9224 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9230 components: - type: Transform rot: 1.5707963267948966 rad pos: -47.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9513 components: - type: Transform pos: -43.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - uid: 9543 @@ -52336,8 +50748,6 @@ entities: - type: Transform pos: -42.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GasThermoMachineFreezer @@ -52347,30 +50757,22 @@ entities: - type: Transform pos: 7.5,-5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5803 components: - type: Transform pos: 12.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 7245 components: - type: Transform rot: 3.141592653589793 rad pos: -14.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9551 components: - type: Transform pos: -41.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasThermoMachineHeater entities: - uid: 9552 @@ -52378,8 +50780,6 @@ entities: - type: Transform pos: -41.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: GasValve entities: - uid: 5591 @@ -52388,16 +50788,12 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 5592 components: - type: Transform rot: 1.5707963267948966 rad pos: 28.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9039 components: - type: Transform @@ -52406,8 +50802,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - uid: 9164 components: - type: Transform @@ -52416,8 +50810,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 9544 @@ -52428,8 +50820,6 @@ entities: parent: 4812 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#947507FF' - proto: GasVentPump @@ -52440,8 +50830,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 710 @@ -52450,8 +50838,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 817 @@ -52460,8 +50846,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 818 @@ -52470,8 +50854,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 835 @@ -52479,8 +50861,6 @@ entities: - type: Transform pos: 5.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 838 @@ -52489,8 +50869,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 846 @@ -52499,8 +50877,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 847 @@ -52509,8 +50885,6 @@ entities: rot: -1.5707963267948966 rad pos: 6.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 848 @@ -52518,8 +50892,6 @@ entities: - type: Transform pos: -17.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 849 @@ -52527,8 +50899,6 @@ entities: - type: Transform pos: -10.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 864 @@ -52537,8 +50907,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 871 @@ -52547,8 +50915,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 877 @@ -52557,8 +50923,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1511 @@ -52566,8 +50930,6 @@ entities: - type: Transform pos: -22.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1685 @@ -52575,8 +50937,6 @@ entities: - type: Transform pos: -21.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1770 @@ -52585,8 +50945,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1814 @@ -52595,8 +50953,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1817 @@ -52605,8 +50961,6 @@ entities: rot: 3.141592653589793 rad pos: -0.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 1852 @@ -52614,8 +50968,6 @@ entities: - type: Transform pos: -3.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2071 @@ -52624,8 +50976,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2072 @@ -52633,8 +50983,6 @@ entities: - type: Transform pos: 8.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2429 @@ -52643,8 +50991,6 @@ entities: rot: 1.5707963267948966 rad pos: -14.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2430 @@ -52652,8 +50998,6 @@ entities: - type: Transform pos: -13.5,28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2443 @@ -52662,8 +51006,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2444 @@ -52672,8 +51014,6 @@ entities: rot: -1.5707963267948966 rad pos: -7.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2445 @@ -52681,8 +51021,6 @@ entities: - type: Transform pos: -5.5,34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2446 @@ -52690,8 +51028,6 @@ entities: - type: Transform pos: 0.5,34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2474 @@ -52700,8 +51036,6 @@ entities: rot: -1.5707963267948966 rad pos: -7.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2475 @@ -52710,8 +51044,6 @@ entities: rot: 1.5707963267948966 rad pos: 2.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2842 @@ -52720,8 +51052,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2966 @@ -52730,8 +51060,6 @@ entities: rot: 1.5707963267948966 rad pos: 23.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2969 @@ -52740,8 +51068,6 @@ entities: rot: -1.5707963267948966 rad pos: 26.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 2983 @@ -52749,8 +51075,6 @@ entities: - type: Transform pos: 15.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3019 @@ -52759,8 +51083,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3020 @@ -52769,8 +51091,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3023 @@ -52779,8 +51099,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3024 @@ -52789,8 +51107,6 @@ entities: rot: 1.5707963267948966 rad pos: 14.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3026 @@ -52799,8 +51115,6 @@ entities: rot: 3.141592653589793 rad pos: 15.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3206 @@ -52809,8 +51123,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3708 @@ -52819,8 +51131,6 @@ entities: rot: -1.5707963267948966 rad pos: -31.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3781 @@ -52828,8 +51138,6 @@ entities: - type: Transform pos: -1.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3834 @@ -52838,8 +51146,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3835 @@ -52848,8 +51154,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3838 @@ -52857,8 +51161,6 @@ entities: - type: Transform pos: 8.5,51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3841 @@ -52867,8 +51169,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 3944 @@ -52877,8 +51177,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,43.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4196 @@ -52886,8 +51184,6 @@ entities: - type: Transform pos: 30.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4197 @@ -52896,8 +51192,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4198 @@ -52906,8 +51200,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4199 @@ -52916,8 +51208,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4200 @@ -52926,8 +51216,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4201 @@ -52936,8 +51224,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4203 @@ -52946,8 +51232,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,-0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4231 @@ -52956,8 +51240,6 @@ entities: rot: 1.5707963267948966 rad pos: 22.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4380 @@ -52966,8 +51248,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,-3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4440 @@ -52976,8 +51256,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4441 @@ -52986,8 +51264,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4444 @@ -52996,8 +51272,6 @@ entities: rot: 1.5707963267948966 rad pos: 24.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4464 @@ -53006,8 +51280,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4890 @@ -53016,8 +51288,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 4941 @@ -53026,8 +51296,6 @@ entities: rot: -1.5707963267948966 rad pos: -15.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5033 @@ -53036,8 +51304,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5222 @@ -53046,8 +51312,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-52.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5225 @@ -53056,8 +51320,6 @@ entities: rot: 1.5707963267948966 rad pos: -11.5,-41.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5697 @@ -53065,8 +51327,6 @@ entities: - type: Transform pos: 4.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5698 @@ -53075,8 +51335,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5714 @@ -53085,8 +51343,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5715 @@ -53095,8 +51351,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5718 @@ -53105,8 +51359,6 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,-19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5734 @@ -53115,8 +51367,6 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5763 @@ -53124,8 +51374,6 @@ entities: - type: Transform pos: 27.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5764 @@ -53134,8 +51382,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 5802 @@ -53144,15 +51390,11 @@ entities: rot: -1.5707963267948966 rad pos: 13.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6416 components: - type: Transform pos: 8.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6419 @@ -53161,8 +51403,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6461 @@ -53170,8 +51410,6 @@ entities: - type: Transform pos: -1.5,-31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6471 @@ -53179,8 +51417,6 @@ entities: - type: Transform pos: -2.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6554 @@ -53188,8 +51424,6 @@ entities: - type: Transform pos: -16.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6686 @@ -53198,8 +51432,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6821 @@ -53208,8 +51440,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-35.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6840 @@ -53218,8 +51448,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,-36.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 6842 @@ -53227,8 +51455,6 @@ entities: - type: Transform pos: -19.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7087 @@ -53237,8 +51463,6 @@ entities: rot: 3.141592653589793 rad pos: -25.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7323 @@ -53247,8 +51471,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7379 @@ -53257,8 +51479,6 @@ entities: rot: 1.5707963267948966 rad pos: -10.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7380 @@ -53266,8 +51486,6 @@ entities: - type: Transform pos: -9.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7856 @@ -53275,8 +51493,6 @@ entities: - type: Transform pos: -26.5,30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7857 @@ -53285,8 +51501,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7871 @@ -53295,8 +51509,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7872 @@ -53305,8 +51517,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7886 @@ -53315,8 +51525,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7905 @@ -53325,8 +51533,6 @@ entities: rot: 1.5707963267948966 rad pos: -36.5,10.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7906 @@ -53334,8 +51540,6 @@ entities: - type: Transform pos: -35.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7910 @@ -53344,8 +51548,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7911 @@ -53354,8 +51556,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 7912 @@ -53364,8 +51564,6 @@ entities: rot: -1.5707963267948966 rad pos: -28.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8238 @@ -53373,8 +51571,6 @@ entities: - type: Transform pos: -23.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8240 @@ -53383,8 +51579,6 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8300 @@ -53393,8 +51587,6 @@ entities: rot: -1.5707963267948966 rad pos: -19.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8306 @@ -53403,8 +51595,6 @@ entities: rot: -1.5707963267948966 rad pos: -22.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8318 @@ -53413,8 +51603,6 @@ entities: rot: 3.141592653589793 rad pos: -13.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8562 @@ -53422,8 +51610,6 @@ entities: - type: Transform pos: -18.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8838 @@ -53432,8 +51618,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 8991 @@ -53442,31 +51626,23 @@ entities: rot: 3.141592653589793 rad pos: -39.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8992 components: - type: Transform rot: 3.141592653589793 rad pos: -36.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8993 components: - type: Transform rot: 3.141592653589793 rad pos: -34.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10757 components: - type: Transform pos: -38.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 11962 @@ -53475,8 +51651,6 @@ entities: rot: -1.5707963267948966 rad pos: -32.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12027 @@ -53485,8 +51659,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12028 @@ -53495,8 +51667,6 @@ entities: rot: 3.141592653589793 rad pos: -49.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12029 @@ -53505,8 +51675,6 @@ entities: rot: 1.5707963267948966 rad pos: -53.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12030 @@ -53514,8 +51682,6 @@ entities: - type: Transform pos: -49.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12032 @@ -53523,8 +51689,6 @@ entities: - type: Transform pos: -44.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12035 @@ -53533,8 +51697,6 @@ entities: rot: -1.5707963267948966 rad pos: -32.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12037 @@ -53542,8 +51704,6 @@ entities: - type: Transform pos: -16.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12039 @@ -53552,8 +51712,6 @@ entities: rot: 3.141592653589793 rad pos: -23.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - uid: 12041 @@ -53562,8 +51720,6 @@ entities: rot: -1.5707963267948966 rad pos: -25.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#0335FCFF' - proto: GasVentScrubber @@ -53574,8 +51730,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 814 @@ -53584,8 +51738,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 815 @@ -53594,8 +51746,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 816 @@ -53604,8 +51754,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 857 @@ -53614,8 +51762,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 858 @@ -53623,8 +51769,6 @@ entities: - type: Transform pos: -10.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 885 @@ -53633,8 +51777,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1512 @@ -53643,8 +51785,6 @@ entities: rot: 3.141592653589793 rad pos: -21.5,-7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1686 @@ -53653,8 +51793,6 @@ entities: rot: 3.141592653589793 rad pos: -21.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1813 @@ -53663,8 +51801,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1816 @@ -53673,8 +51809,6 @@ entities: rot: 3.141592653589793 rad pos: -4.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 1853 @@ -53682,8 +51816,6 @@ entities: - type: Transform pos: -1.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2073 @@ -53691,8 +51823,6 @@ entities: - type: Transform pos: 6.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2074 @@ -53701,8 +51831,6 @@ entities: rot: -1.5707963267948966 rad pos: 7.5,24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2439 @@ -53711,8 +51839,6 @@ entities: rot: 3.141592653589793 rad pos: -12.5,23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2440 @@ -53720,8 +51846,6 @@ entities: - type: Transform pos: -12.5,28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2441 @@ -53730,8 +51854,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2442 @@ -53740,8 +51862,6 @@ entities: rot: -1.5707963267948966 rad pos: 3.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2447 @@ -53750,8 +51870,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2448 @@ -53760,8 +51878,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5,31.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 2963 @@ -53770,8 +51886,6 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,14.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3001 @@ -53779,8 +51893,6 @@ entities: - type: Transform pos: 16.5,29.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3016 @@ -53789,8 +51901,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3017 @@ -53799,8 +51909,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3021 @@ -53809,8 +51917,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3022 @@ -53819,8 +51925,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3027 @@ -53829,8 +51933,6 @@ entities: rot: 3.141592653589793 rad pos: 19.5,13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3782 @@ -53838,8 +51940,6 @@ entities: - type: Transform pos: 10.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3813 @@ -53848,8 +51948,6 @@ entities: rot: 3.141592653589793 rad pos: 7.5,44.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3814 @@ -53858,8 +51956,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,43.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3815 @@ -53867,8 +51963,6 @@ entities: - type: Transform pos: 12.5,51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 3816 @@ -53877,8 +51971,6 @@ entities: rot: 3.141592653589793 rad pos: 13.5,45.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4205 @@ -53887,8 +51979,6 @@ entities: rot: 3.141592653589793 rad pos: 28.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4214 @@ -53897,8 +51987,6 @@ entities: rot: 3.141592653589793 rad pos: 28.5,-8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4226 @@ -53906,8 +51994,6 @@ entities: - type: Transform pos: 24.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4381 @@ -53915,8 +52001,6 @@ entities: - type: Transform pos: 17.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4439 @@ -53925,8 +52009,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4442 @@ -53935,8 +52017,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4443 @@ -53945,8 +52025,6 @@ entities: rot: -1.5707963267948966 rad pos: 25.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4465 @@ -53955,8 +52033,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4875 @@ -53964,8 +52040,6 @@ entities: - type: Transform pos: -15.5,-15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 4876 @@ -53974,8 +52048,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5025 @@ -53983,8 +52055,6 @@ entities: - type: Transform pos: -18.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5223 @@ -53993,8 +52063,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-51.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5224 @@ -54003,8 +52071,6 @@ entities: rot: -1.5707963267948966 rad pos: -10.5,-42.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5699 @@ -54013,8 +52079,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,-24.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5700 @@ -54022,8 +52086,6 @@ entities: - type: Transform pos: 3.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5716 @@ -54032,8 +52094,6 @@ entities: rot: -1.5707963267948966 rad pos: 12.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5717 @@ -54042,8 +52102,6 @@ entities: rot: 3.141592653589793 rad pos: 8.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5719 @@ -54052,8 +52110,6 @@ entities: rot: 1.5707963267948966 rad pos: 9.5,-18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5735 @@ -54061,8 +52117,6 @@ entities: - type: Transform pos: 27.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5765 @@ -54071,8 +52125,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,-27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5766 @@ -54081,8 +52133,6 @@ entities: rot: -1.5707963267948966 rad pos: 33.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 5805 @@ -54091,8 +52141,6 @@ entities: rot: 1.5707963267948966 rad pos: 13.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6253 @@ -54101,8 +52149,6 @@ entities: rot: 3.141592653589793 rad pos: -26.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6417 @@ -54111,8 +52157,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6420 @@ -54121,8 +52165,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6455 @@ -54131,8 +52173,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-35.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6472 @@ -54141,8 +52181,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6687 @@ -54151,8 +52189,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6838 @@ -54161,8 +52197,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-36.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6839 @@ -54170,8 +52204,6 @@ entities: - type: Transform pos: -18.5,-33.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 6841 @@ -54180,8 +52212,6 @@ entities: rot: 3.141592653589793 rad pos: -22.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7088 @@ -54190,8 +52220,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7227 @@ -54200,8 +52228,6 @@ entities: rot: 1.5707963267948966 rad pos: -20.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7325 @@ -54210,8 +52236,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,-26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7381 @@ -54220,8 +52244,6 @@ entities: rot: 1.5707963267948966 rad pos: -12.5,-20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7382 @@ -54229,8 +52251,6 @@ entities: - type: Transform pos: -11.5,-17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7858 @@ -54238,8 +52258,6 @@ entities: - type: Transform pos: -30.5,30.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7873 @@ -54248,8 +52266,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7874 @@ -54258,8 +52274,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,19.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7887 @@ -54268,8 +52282,6 @@ entities: rot: -1.5707963267948966 rad pos: -26.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7907 @@ -54278,8 +52290,6 @@ entities: rot: 1.5707963267948966 rad pos: -36.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7908 @@ -54287,8 +52297,6 @@ entities: - type: Transform pos: -34.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7909 @@ -54297,8 +52305,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,15.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7913 @@ -54307,8 +52313,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,18.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 7914 @@ -54317,8 +52321,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8239 @@ -54326,8 +52328,6 @@ entities: - type: Transform pos: -22.5,27.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8241 @@ -54336,8 +52336,6 @@ entities: rot: 1.5707963267948966 rad pos: -23.5,22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8307 @@ -54345,8 +52343,6 @@ entities: - type: Transform pos: -21.5,20.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8317 @@ -54355,8 +52351,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,16.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8563 @@ -54365,8 +52359,6 @@ entities: rot: 3.141592653589793 rad pos: -18.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8787 @@ -54375,8 +52367,6 @@ entities: rot: 1.5707963267948966 rad pos: -31.5,-2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8836 @@ -54385,8 +52375,6 @@ entities: rot: -1.5707963267948966 rad pos: -16.5,-25.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 8994 @@ -54395,32 +52383,24 @@ entities: rot: -1.5707963267948966 rad pos: -33.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9006 components: - type: Transform rot: 3.141592653589793 rad pos: -37.5,-37.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9007 components: - type: Transform rot: 1.5707963267948966 rad pos: -38.5,-34.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10758 components: - type: Transform rot: 3.141592653589793 rad pos: -38.5,0.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12023 @@ -54428,8 +52408,6 @@ entities: - type: Transform pos: -48.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12024 @@ -54438,8 +52416,6 @@ entities: rot: 1.5707963267948966 rad pos: -53.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12025 @@ -54448,8 +52424,6 @@ entities: rot: 3.141592653589793 rad pos: -48.5,-13.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12026 @@ -54458,8 +52432,6 @@ entities: rot: -1.5707963267948966 rad pos: -42.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12033 @@ -54467,8 +52439,6 @@ entities: - type: Transform pos: -40.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12034 @@ -54477,8 +52447,6 @@ entities: rot: 3.141592653589793 rad pos: -30.5,-6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12036 @@ -54486,8 +52454,6 @@ entities: - type: Transform pos: -30.5,2.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12038 @@ -54496,8 +52462,6 @@ entities: rot: 3.141592653589793 rad pos: -14.5,-12.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12040 @@ -54505,8 +52469,6 @@ entities: - type: Transform pos: -24.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12042 @@ -54515,8 +52477,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12044 @@ -54525,8 +52485,6 @@ entities: rot: 1.5707963267948966 rad pos: -26.5,-11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - uid: 12418 @@ -54535,8 +52493,6 @@ entities: rot: 1.5707963267948966 rad pos: -2.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - type: AtmosPipeColor color: '#FF1212FF' - proto: GeneratorBasic15kW @@ -57741,43 +55697,31 @@ entities: entities: - uid: 1846 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,21.5 parent: 4812 - uid: 3287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,6.5 parent: 4812 - uid: 3688 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,45.5 parent: 4812 - uid: 3689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,45.5 parent: 4812 - uid: 3690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,47.5 parent: 4812 - uid: 9886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-12.5 parent: 4812 @@ -59707,16 +57651,14 @@ entities: - type: Transform pos: -35.5,12.5 parent: 4812 - - type: Lock - locked: False - type: EntityStorage air: volume: 200 immutable: False temperature: 293.14957 moles: - - 1.6033952 - - 6.031821 + - 1.8742619 + - 7.050795 - 0 - 0 - 0 @@ -60156,8 +58098,6 @@ entities: entities: - uid: 12381 components: - - type: MetaData - flags: InContainer - type: Transform parent: 9099 - type: Physics @@ -60288,43 +58228,31 @@ entities: - type: Transform pos: 15.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6327 components: - type: Transform pos: 25.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9448 components: - type: Transform pos: -53.5,1.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9667 components: - type: Transform pos: -33.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9668 components: - type: Transform pos: -33.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 11786 components: - type: Transform pos: 21.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: NuclearBomb entities: - uid: 1854 @@ -60390,80 +58318,63 @@ entities: - type: Transform pos: 9.5,17.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 4603 components: - type: Transform pos: 14.5,11.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6328 components: - type: Transform pos: 26.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 8849 components: - type: Transform pos: -13.5,-28.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9450 components: - type: Transform pos: -53.5,3.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9669 components: - type: Transform pos: -32.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9670 components: - type: Transform pos: -32.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10740 components: - type: Transform pos: -46.5,-9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10878 components: - type: Transform pos: -34.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 10917 components: - type: Transform pos: -47.5,-23.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 11787 components: - type: Transform pos: 20.5,-32.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: OxygenTankFilled entities: + - uid: 11791 + components: + - type: Transform + pos: 19.452671,-32.41012 + parent: 4812 - uid: 11792 components: - type: Transform @@ -60905,43 +58816,31 @@ entities: entities: - uid: 1767 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -2.5035148,7.4145155 parent: 4812 - uid: 3963 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 9.496426,48.542255 parent: 4812 - uid: 6307 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 26.432638,-19.383717 parent: 4812 - uid: 7142 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.490486,-14.614019 parent: 4812 - uid: 10864 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -22.475502,3.5391276 parent: 4812 - uid: 10865 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 6.426591,-28.501112 parent: 4812 @@ -61037,8 +58936,6 @@ entities: - type: Transform pos: -53.5,9.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: PlasticFlapsAirtightClear entities: - uid: 2779 @@ -61932,8 +59829,6 @@ entities: entities: - uid: 1515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-5.5 parent: 4812 @@ -61941,8 +59836,6 @@ entities: powerLoad: 0 - uid: 1516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-5.5 parent: 4812 @@ -61950,8 +59843,6 @@ entities: powerLoad: 0 - uid: 1517 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -7.5,-8.5 @@ -61960,8 +59851,6 @@ entities: powerLoad: 0 - uid: 1518 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -18.5,-8.5 @@ -61970,8 +59859,6 @@ entities: powerLoad: 0 - uid: 1665 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,10.5 @@ -61980,8 +59867,6 @@ entities: powerLoad: 0 - uid: 1666 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,10.5 @@ -61990,8 +59875,6 @@ entities: powerLoad: 0 - uid: 1667 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,1.5 @@ -62000,8 +59883,6 @@ entities: powerLoad: 0 - uid: 1668 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,1.5 @@ -62010,8 +59891,6 @@ entities: powerLoad: 0 - uid: 1669 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,-4.5 @@ -62020,8 +59899,6 @@ entities: powerLoad: 0 - uid: 1670 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,-4.5 @@ -62030,8 +59907,6 @@ entities: powerLoad: 0 - uid: 1671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,9.5 parent: 4812 @@ -62039,8 +59914,6 @@ entities: powerLoad: 0 - uid: 1672 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 2.5,-3.5 @@ -62049,8 +59922,6 @@ entities: powerLoad: 0 - uid: 1673 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,0.5 @@ -62059,8 +59930,6 @@ entities: powerLoad: 0 - uid: 1975 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 5.5,15.5 @@ -62069,8 +59938,6 @@ entities: powerLoad: 0 - uid: 1983 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 9.5,15.5 @@ -62079,8 +59946,6 @@ entities: powerLoad: 0 - uid: 2541 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 10.5,29.5 @@ -62089,8 +59954,6 @@ entities: powerLoad: 0 - uid: 2542 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 8.5,29.5 @@ -62099,8 +59962,6 @@ entities: powerLoad: 0 - uid: 2543 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -15.5,27.5 @@ -62109,8 +59970,6 @@ entities: powerLoad: 0 - uid: 2544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,22.5 parent: 4812 @@ -62118,8 +59977,6 @@ entities: powerLoad: 0 - uid: 2545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,26.5 parent: 4812 @@ -62127,8 +59984,6 @@ entities: powerLoad: 0 - uid: 2622 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,28.5 @@ -62137,8 +59992,6 @@ entities: powerLoad: 0 - uid: 2623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,24.5 parent: 4812 @@ -62146,8 +59999,6 @@ entities: powerLoad: 0 - uid: 2624 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 3.5,28.5 @@ -62156,8 +60007,6 @@ entities: powerLoad: 0 - uid: 2625 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -8.5,28.5 @@ -62166,8 +60015,6 @@ entities: powerLoad: 0 - uid: 2626 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -7.5,23.5 @@ -62176,8 +60023,6 @@ entities: powerLoad: 0 - uid: 2627 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 2.5,23.5 @@ -62186,8 +60031,6 @@ entities: powerLoad: 0 - uid: 2628 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,34.5 parent: 4812 @@ -62195,8 +60038,6 @@ entities: powerLoad: 0 - uid: 2629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,34.5 parent: 4812 @@ -62204,8 +60045,6 @@ entities: powerLoad: 0 - uid: 2630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,35.5 parent: 4812 @@ -62213,8 +60052,6 @@ entities: powerLoad: 0 - uid: 2631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,35.5 parent: 4812 @@ -62222,8 +60059,6 @@ entities: powerLoad: 0 - uid: 2687 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,31.5 @@ -62232,8 +60067,6 @@ entities: powerLoad: 0 - uid: 2688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,31.5 @@ -62242,8 +60075,6 @@ entities: powerLoad: 0 - uid: 2689 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,18.5 @@ -62252,8 +60083,6 @@ entities: powerLoad: 0 - uid: 2690 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,18.5 @@ -62262,8 +60091,6 @@ entities: powerLoad: 0 - uid: 2691 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -0.5,13.5 @@ -62272,8 +60099,6 @@ entities: powerLoad: 0 - uid: 2692 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -4.5,14.5 @@ -62282,8 +60107,6 @@ entities: powerLoad: 0 - uid: 2694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,20.5 parent: 4812 @@ -62291,8 +60114,6 @@ entities: powerLoad: 0 - uid: 2696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,20.5 parent: 4812 @@ -62300,8 +60121,6 @@ entities: powerLoad: 0 - uid: 2733 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 0.5,24.5 @@ -62310,8 +60129,6 @@ entities: powerLoad: 0 - uid: 2734 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -5.5,24.5 @@ -62320,8 +60137,6 @@ entities: powerLoad: 0 - uid: 2776 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 15.5,31.5 @@ -62330,8 +60145,6 @@ entities: powerLoad: 0 - uid: 2784 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,20.5 parent: 4812 @@ -62339,8 +60152,6 @@ entities: powerLoad: 0 - uid: 2785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,20.5 parent: 4812 @@ -62348,8 +60159,6 @@ entities: powerLoad: 0 - uid: 3216 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,17.5 @@ -62358,8 +60167,6 @@ entities: powerLoad: 0 - uid: 3217 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,13.5 @@ -62368,8 +60175,6 @@ entities: powerLoad: 0 - uid: 3218 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 23.5,12.5 @@ -62378,8 +60183,6 @@ entities: powerLoad: 0 - uid: 3219 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,21.5 parent: 4812 @@ -62387,8 +60190,6 @@ entities: powerLoad: 0 - uid: 3220 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,27.5 parent: 4812 @@ -62396,8 +60197,6 @@ entities: powerLoad: 0 - uid: 3221 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 17.5,23.5 @@ -62406,8 +60205,6 @@ entities: powerLoad: 0 - uid: 3965 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,56.5 parent: 4812 @@ -62415,8 +60212,6 @@ entities: powerLoad: 0 - uid: 3966 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,50.5 parent: 4812 @@ -62424,8 +60219,6 @@ entities: powerLoad: 0 - uid: 3967 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 13.5,54.5 @@ -62434,8 +60227,6 @@ entities: powerLoad: 0 - uid: 3968 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 13.5,50.5 @@ -62444,8 +60235,6 @@ entities: powerLoad: 0 - uid: 3969 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 7.5,50.5 @@ -62454,8 +60243,6 @@ entities: powerLoad: 0 - uid: 3970 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 7.5,54.5 @@ -62464,8 +60251,6 @@ entities: powerLoad: 0 - uid: 3971 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 10.5,43.5 @@ -62474,8 +60259,6 @@ entities: powerLoad: 0 - uid: 3972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,47.5 parent: 4812 @@ -62483,8 +60266,6 @@ entities: powerLoad: 0 - uid: 3973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,47.5 parent: 4812 @@ -62492,8 +60273,6 @@ entities: powerLoad: 0 - uid: 4468 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,12.5 @@ -62502,8 +60281,6 @@ entities: powerLoad: 0 - uid: 4469 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,4.5 @@ -62512,8 +60289,6 @@ entities: powerLoad: 0 - uid: 4470 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,-5.5 @@ -62522,8 +60297,6 @@ entities: powerLoad: 0 - uid: 4471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-2.5 parent: 4812 @@ -62531,8 +60304,6 @@ entities: powerLoad: 0 - uid: 4472 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 29.5,-9.5 @@ -62541,8 +60312,6 @@ entities: powerLoad: 0 - uid: 4473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,4.5 parent: 4812 @@ -62550,8 +60319,6 @@ entities: powerLoad: 0 - uid: 4474 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 27.5,-5.5 @@ -62560,8 +60327,6 @@ entities: powerLoad: 0 - uid: 4475 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 27.5,0.5 @@ -62570,8 +60335,6 @@ entities: powerLoad: 0 - uid: 4476 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 24.5,-7.5 @@ -62580,39 +60343,29 @@ entities: powerLoad: 0 - uid: 4952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-25.5 parent: 4812 - uid: 4953 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -19.5,-23.5 parent: 4812 - uid: 4954 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -10.5,-27.5 parent: 4812 - uid: 4986 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -12.5,-27.5 parent: 4812 - uid: 5067 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,-53.5 @@ -62621,8 +60374,6 @@ entities: powerLoad: 0 - uid: 5068 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -10.5,-40.5 @@ -62631,8 +60382,6 @@ entities: powerLoad: 0 - uid: 5069 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-45.5 parent: 4812 @@ -62640,8 +60389,6 @@ entities: powerLoad: 0 - uid: 5070 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-45.5 parent: 4812 @@ -62649,8 +60396,6 @@ entities: powerLoad: 0 - uid: 5283 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-34.5 parent: 4812 @@ -62658,8 +60403,6 @@ entities: powerLoad: 0 - uid: 5284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-34.5 parent: 4812 @@ -62667,8 +60410,6 @@ entities: powerLoad: 0 - uid: 6258 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-14.5 @@ -62677,8 +60418,6 @@ entities: powerLoad: 0 - uid: 6259 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 7.5,-18.5 @@ -62687,8 +60426,6 @@ entities: powerLoad: 0 - uid: 6260 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-17.5 parent: 4812 @@ -62696,8 +60433,6 @@ entities: powerLoad: 0 - uid: 6261 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 6.5,-28.5 @@ -62706,8 +60441,6 @@ entities: powerLoad: 0 - uid: 6262 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-23.5 parent: 4812 @@ -62715,8 +60448,6 @@ entities: powerLoad: 0 - uid: 6263 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 11.5,-27.5 @@ -62725,8 +60456,6 @@ entities: powerLoad: 0 - uid: 6264 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 16.5,-25.5 @@ -62735,8 +60464,6 @@ entities: powerLoad: 0 - uid: 6265 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 9.5,-27.5 @@ -62745,8 +60472,6 @@ entities: powerLoad: 0 - uid: 6266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-20.5 parent: 4812 @@ -62754,8 +60479,6 @@ entities: powerLoad: 0 - uid: 6267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-20.5 parent: 4812 @@ -62763,8 +60486,6 @@ entities: powerLoad: 0 - uid: 6268 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 9.5,-16.5 @@ -62773,8 +60494,6 @@ entities: powerLoad: 0 - uid: 6269 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 23.5,-28.5 @@ -62783,8 +60502,6 @@ entities: powerLoad: 0 - uid: 6270 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 28.5,-30.5 @@ -62793,8 +60510,6 @@ entities: powerLoad: 0 - uid: 6271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-22.5 parent: 4812 @@ -62802,8 +60517,6 @@ entities: powerLoad: 0 - uid: 6272 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 21.5,-26.5 @@ -62812,8 +60525,6 @@ entities: powerLoad: 0 - uid: 6273 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 21.5,-22.5 @@ -62822,8 +60533,6 @@ entities: powerLoad: 0 - uid: 6274 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 24.5,-19.5 @@ -62832,8 +60541,6 @@ entities: powerLoad: 0 - uid: 6275 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 28.5,-19.5 @@ -62842,8 +60549,6 @@ entities: powerLoad: 0 - uid: 6276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-23.5 parent: 4812 @@ -62851,8 +60556,6 @@ entities: powerLoad: 0 - uid: 6277 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: 31.5,-28.5 @@ -62861,8 +60564,6 @@ entities: powerLoad: 0 - uid: 6478 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -1.5,-26.5 @@ -62871,8 +60572,6 @@ entities: powerLoad: 0 - uid: 7019 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-34.5 @@ -62881,8 +60580,6 @@ entities: powerLoad: 0 - uid: 7024 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -26.5,-32.5 @@ -62891,45 +60588,33 @@ entities: powerLoad: 0 - uid: 7028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-15.5 parent: 4812 - uid: 7053 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -22.5,-28.5 parent: 4812 - uid: 7288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-20.5 parent: 4812 - uid: 7367 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -17.5,-25.5 parent: 4812 - uid: 7397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-22.5 parent: 4812 - uid: 7582 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-20.5 parent: 4812 @@ -62937,8 +60622,6 @@ entities: powerLoad: 0 - uid: 7583 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -10.5,-18.5 @@ -62947,8 +60630,6 @@ entities: powerLoad: 0 - uid: 7621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-21.5 parent: 4812 @@ -62956,8 +60637,6 @@ entities: powerLoad: 0 - uid: 7622 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -2.5,-19.5 @@ -62966,8 +60645,6 @@ entities: powerLoad: 0 - uid: 7623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-11.5 parent: 4812 @@ -62975,8 +60652,6 @@ entities: powerLoad: 0 - uid: 7624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-11.5 parent: 4812 @@ -62984,8 +60659,6 @@ entities: powerLoad: 0 - uid: 7625 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 0.5,-30.5 @@ -62994,8 +60667,6 @@ entities: powerLoad: 0 - uid: 7626 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -5.5,-30.5 @@ -63004,8 +60675,6 @@ entities: powerLoad: 0 - uid: 7627 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 0.5,-23.5 @@ -63014,8 +60683,6 @@ entities: powerLoad: 0 - uid: 7628 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -5.5,-23.5 @@ -63024,8 +60691,6 @@ entities: powerLoad: 0 - uid: 7629 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-11.5 parent: 4812 @@ -63033,8 +60698,6 @@ entities: powerLoad: 0 - uid: 7630 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-11.5 parent: 4812 @@ -63042,8 +60705,6 @@ entities: powerLoad: 0 - uid: 7631 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-11.5 parent: 4812 @@ -63051,8 +60712,6 @@ entities: powerLoad: 0 - uid: 7632 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-11.5 parent: 4812 @@ -63060,8 +60719,6 @@ entities: powerLoad: 0 - uid: 8141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,12.5 parent: 4812 @@ -63069,8 +60726,6 @@ entities: powerLoad: 0 - uid: 8142 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -31.5,16.5 @@ -63079,8 +60734,6 @@ entities: powerLoad: 0 - uid: 8143 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -33.5,16.5 @@ -63089,8 +60742,6 @@ entities: powerLoad: 0 - uid: 8144 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,12.5 @@ -63099,8 +60750,6 @@ entities: powerLoad: 0 - uid: 8145 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -36.5,19.5 @@ -63109,8 +60758,6 @@ entities: powerLoad: 0 - uid: 8247 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -19.5,28.5 @@ -63119,16 +60766,12 @@ entities: powerLoad: 0 - uid: 8251 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -24.5,-27.5 parent: 4812 - uid: 8269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,25.5 parent: 4812 @@ -63136,8 +60779,6 @@ entities: powerLoad: 0 - uid: 8304 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -22.5,18.5 @@ -63146,8 +60787,6 @@ entities: powerLoad: 0 - uid: 8305 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -16.5,15.5 @@ -63156,8 +60795,6 @@ entities: powerLoad: 0 - uid: 8603 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,12.5 parent: 4812 @@ -63165,8 +60802,6 @@ entities: powerLoad: 0 - uid: 8604 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -18.5,7.5 @@ -63175,8 +60810,6 @@ entities: powerLoad: 0 - uid: 9017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-33.5 parent: 4812 @@ -63184,8 +60817,6 @@ entities: powerLoad: 0 - uid: 9311 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,1.5 @@ -63194,8 +60825,6 @@ entities: powerLoad: 0 - uid: 9312 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,3.5 @@ -63204,8 +60833,6 @@ entities: powerLoad: 0 - uid: 9313 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,5.5 @@ -63214,8 +60841,6 @@ entities: powerLoad: 0 - uid: 9314 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,7.5 @@ -63224,8 +60849,6 @@ entities: powerLoad: 0 - uid: 9315 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,9.5 @@ -63234,8 +60857,6 @@ entities: powerLoad: 0 - uid: 9316 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -53.5,11.5 @@ -63244,8 +60865,6 @@ entities: powerLoad: 0 - uid: 9317 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,0.5 @@ -63254,8 +60873,6 @@ entities: powerLoad: 0 - uid: 9318 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,4.5 @@ -63264,8 +60881,6 @@ entities: powerLoad: 0 - uid: 9319 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,8.5 @@ -63274,8 +60889,6 @@ entities: powerLoad: 0 - uid: 9320 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -49.5,12.5 @@ -63284,8 +60897,6 @@ entities: powerLoad: 0 - uid: 9706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,14.5 parent: 4812 @@ -63293,8 +60904,6 @@ entities: powerLoad: 0 - uid: 9707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,14.5 parent: 4812 @@ -63302,8 +60911,6 @@ entities: powerLoad: 0 - uid: 9819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,5.5 parent: 4812 @@ -63311,8 +60918,6 @@ entities: powerLoad: 0 - uid: 9820 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -41.5,10.5 @@ -63321,8 +60926,6 @@ entities: powerLoad: 0 - uid: 9821 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -41.5,0.5 @@ -63331,8 +60934,6 @@ entities: powerLoad: 0 - uid: 9822 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -28.5,1.5 @@ -63341,8 +60942,6 @@ entities: powerLoad: 0 - uid: 9823 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -34.5,1.5 @@ -63351,8 +60950,6 @@ entities: powerLoad: 0 - uid: 10660 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -52.5,-10.5 @@ -63361,8 +60958,6 @@ entities: powerLoad: 0 - uid: 10661 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -54.5,-10.5 @@ -63371,8 +60966,6 @@ entities: powerLoad: 0 - uid: 10680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-6.5 parent: 4812 @@ -63380,8 +60973,6 @@ entities: powerLoad: 0 - uid: 10681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-11.5 parent: 4812 @@ -63389,8 +60980,6 @@ entities: powerLoad: 0 - uid: 10682 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-10.5 parent: 4812 @@ -63398,8 +60987,6 @@ entities: powerLoad: 0 - uid: 10684 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -42.5,-18.5 @@ -63408,8 +60995,6 @@ entities: powerLoad: 0 - uid: 10686 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,-5.5 @@ -63418,8 +61003,6 @@ entities: powerLoad: 0 - uid: 10687 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -28.5,-9.5 @@ -63428,8 +61011,6 @@ entities: powerLoad: 0 - uid: 10688 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,-2.5 @@ -63438,8 +61019,6 @@ entities: powerLoad: 0 - uid: 10689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-0.5 parent: 4812 @@ -63447,8 +61026,6 @@ entities: powerLoad: 0 - uid: 10690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,8.5 parent: 4812 @@ -63456,8 +61033,6 @@ entities: powerLoad: 0 - uid: 10691 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -22.5,13.5 @@ -63466,8 +61041,6 @@ entities: powerLoad: 0 - uid: 10692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-1.5 parent: 4812 @@ -63475,8 +61048,6 @@ entities: powerLoad: 0 - uid: 10693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-5.5 parent: 4812 @@ -63484,8 +61055,6 @@ entities: powerLoad: 0 - uid: 10694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-6.5 parent: 4812 @@ -63493,8 +61062,6 @@ entities: powerLoad: 0 - uid: 10695 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -45.5,-14.5 @@ -63503,8 +61070,6 @@ entities: powerLoad: 0 - uid: 10920 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -25.5,-9.5 @@ -63513,8 +61078,6 @@ entities: powerLoad: 0 - uid: 11246 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 4.5,-37.5 @@ -63523,8 +61086,6 @@ entities: powerLoad: 0 - uid: 11247 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 4.5,-41.5 @@ -63533,8 +61094,6 @@ entities: powerLoad: 0 - uid: 11248 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 14.5,-37.5 @@ -63543,8 +61102,6 @@ entities: powerLoad: 0 - uid: 11916 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -17.5,1.5 @@ -63553,8 +61110,6 @@ entities: powerLoad: 0 - uid: 11917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,5.5 parent: 4812 @@ -63562,8 +61117,6 @@ entities: powerLoad: 0 - uid: 11918 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -21.5,-1.5 @@ -63572,8 +61125,6 @@ entities: powerLoad: 0 - uid: 11920 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 3.141592653589793 rad pos: -9.5,-35.5 @@ -63582,8 +61133,6 @@ entities: powerLoad: 0 - uid: 11921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-14.5 parent: 4812 @@ -63591,8 +61140,6 @@ entities: powerLoad: 0 - uid: 11923 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,5.5 parent: 4812 @@ -63600,8 +61147,6 @@ entities: powerLoad: 0 - uid: 11924 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: -33.5,-7.5 @@ -63610,8 +61155,6 @@ entities: powerLoad: 0 - uid: 11926 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: -38.5,-7.5 @@ -63620,8 +61163,6 @@ entities: powerLoad: 0 - uid: 11961 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,17.5 parent: 4812 @@ -67594,8 +65135,6 @@ entities: parent: 4812 - uid: 11812 components: - - type: MetaData - flags: InContainer - type: Transform parent: 11811 - type: Physics @@ -69099,29 +66638,21 @@ entities: entities: - uid: 933 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -6.5,-7.5 parent: 4812 - uid: 7186 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,-26.5 parent: 4812 - uid: 9020 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -40.5,-33.5 parent: 4812 - uid: 11100 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 10.5,-43.5 parent: 4812 @@ -69190,7 +66721,7 @@ entities: - type: Transform pos: -15.503267,29.527489 parent: 4812 -- proto: soda_dispenser +- proto: SodaDispenser entities: - uid: 364 components: @@ -69739,23 +67270,6 @@ entities: - type: Transform pos: -43.5,6.5 parent: 4812 -- proto: SpawnMobDrone - entities: - - uid: 11933 - components: - - type: Transform - pos: -13.5,16.5 - parent: 4812 - - uid: 11934 - components: - - type: Transform - pos: -12.5,16.5 - parent: 4812 - - uid: 11935 - components: - - type: Transform - pos: -11.5,16.5 - parent: 4812 - proto: SpawnMobFoxRenault entities: - uid: 2621 @@ -70208,20 +67722,6 @@ entities: - type: Transform pos: -34.5,15.5 parent: 4812 -- proto: SpawnVehicleJanicart - entities: - - uid: 1481 - components: - - type: Transform - pos: -22.5,-6.5 - parent: 4812 -- proto: SpawnVehicleSecway - entities: - - uid: 8348 - components: - - type: Transform - pos: -31.5,19.5 - parent: 4812 - proto: Spoon entities: - uid: 1774 @@ -70413,57 +67913,41 @@ entities: - type: Transform pos: 23.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 6326 components: - type: Transform pos: 24.5,-22.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9553 components: - type: Transform pos: -41.5,6.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9554 components: - type: Transform pos: -41.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9555 components: - type: Transform pos: -41.5,8.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9665 components: - type: Transform pos: -34.5,4.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 9666 components: - type: Transform pos: -34.5,5.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - uid: 12462 components: - type: Transform pos: -36.5,26.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: SubstationBasic entities: - uid: 897 @@ -73157,57 +70641,41 @@ entities: entities: - uid: 4859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-13.5 parent: 4812 - uid: 5015 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-13.5 parent: 4812 - uid: 6679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-16.5 parent: 4812 - uid: 6693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-35.5 parent: 4812 - uid: 6757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-37.5 parent: 4812 - uid: 6758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-35.5 parent: 4812 - uid: 7192 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-17.5 parent: 4812 - uid: 7193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-15.5 parent: 4812 @@ -73543,26 +71011,10 @@ entities: - type: Transform pos: -38.5,-33.5 parent: 4812 -- proto: VehicleKeyJanicart - entities: - - uid: 1482 - components: - - type: Transform - pos: -22.528929,-6.6977267 - parent: 4812 -- proto: VehicleKeySecway - entities: - - uid: 8349 - components: - - type: Transform - pos: -31.5,20.5 - parent: 4812 - proto: VendingBarDrobe entities: - uid: 1647 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 5.5,6.5 parent: 4812 @@ -73570,8 +71022,6 @@ entities: entities: - uid: 9572 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.5,2.5 parent: 4812 @@ -73579,22 +71029,16 @@ entities: entities: - uid: 12 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 4.5,6.5 parent: 4812 - uid: 2606 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -15.5,25.5 parent: 4812 - uid: 10494 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -38.5,-22.5 parent: 4812 @@ -73602,8 +71046,6 @@ entities: entities: - uid: 3230 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 14.5,19.5 parent: 4812 @@ -73611,8 +71053,6 @@ entities: entities: - uid: 2510 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 10.5,26.5 parent: 4812 @@ -73620,22 +71060,16 @@ entities: entities: - uid: 923 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-6.5 parent: 4812 - uid: 4538 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 23.5,-6.5 parent: 4812 - uid: 6422 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 2.5,-32.5 parent: 4812 @@ -73643,8 +71077,6 @@ entities: entities: - uid: 7036 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -27.5,-35.5 parent: 4812 @@ -73652,8 +71084,6 @@ entities: entities: - uid: 1539 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 7.5,-3.5 parent: 4812 @@ -73661,8 +71091,6 @@ entities: entities: - uid: 1124 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 3.5,-3.5 parent: 4812 @@ -73670,8 +71098,6 @@ entities: entities: - uid: 6608 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -12.5,-15.5 parent: 4812 @@ -73679,8 +71105,6 @@ entities: entities: - uid: 741 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -10.5,-14.5 parent: 4812 @@ -73689,7 +71113,6 @@ entities: - uid: 917 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -6.5,9.5 @@ -73697,7 +71120,6 @@ entities: - uid: 2672 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 0.5,28.5 @@ -73705,7 +71127,6 @@ entities: - uid: 4536 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 21.5,-4.5 @@ -73713,7 +71134,6 @@ entities: - uid: 5372 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: 18.5,-18.5 @@ -73721,7 +71141,6 @@ entities: - uid: 8268 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -23.5,25.5 @@ -73729,7 +71148,6 @@ entities: - uid: 9077 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -30.5,-28.5 @@ -73737,7 +71155,6 @@ entities: - uid: 10873 components: - type: MetaData - flags: SessionSpecific name: cigarette machine - type: Transform pos: -27.5,7.5 @@ -73746,8 +71163,6 @@ entities: entities: - uid: 10850 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -23.5,-1.5 parent: 4812 @@ -73756,7 +71171,6 @@ entities: - uid: 918 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 0.5,10.5 @@ -73764,7 +71178,6 @@ entities: - uid: 1797 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -5.5,16.5 @@ -73772,7 +71185,6 @@ entities: - uid: 2671 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -5.5,28.5 @@ -73780,7 +71192,6 @@ entities: - uid: 4537 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 23.5,-5.5 @@ -73788,7 +71199,6 @@ entities: - uid: 6356 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: 9.5,-28.5 @@ -73796,7 +71206,6 @@ entities: - uid: 10741 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -45.5,-5.5 @@ -73804,7 +71213,6 @@ entities: - uid: 12150 components: - type: MetaData - flags: SessionSpecific name: Hot drinks machine - type: Transform pos: -27.5,-12.5 @@ -73813,15 +71221,11 @@ entities: entities: - uid: 4533 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 13.5,2.5 parent: 4812 - uid: 5061 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -9.5,-46.5 parent: 4812 @@ -73829,8 +71233,6 @@ entities: entities: - uid: 9584 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-3.5 parent: 4812 @@ -73845,8 +71247,6 @@ entities: entities: - uid: 5361 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 20.5,-14.5 parent: 4812 @@ -73855,7 +71255,6 @@ entities: - uid: 1552 components: - type: MetaData - flags: SessionSpecific name: Dinnerware - type: Transform pos: 2.5,-3.5 @@ -73864,8 +71263,6 @@ entities: entities: - uid: 919 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,11.5 parent: 4812 @@ -73873,8 +71270,6 @@ entities: entities: - uid: 12516 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -38.5,-7.5 parent: 4812 @@ -73882,8 +71277,6 @@ entities: entities: - uid: 9722 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -31.5,-5.5 parent: 4812 @@ -73891,8 +71284,6 @@ entities: entities: - uid: 7070 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -30.5,-14.5 parent: 4812 @@ -73900,8 +71291,6 @@ entities: entities: - uid: 2607 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -14.5,-18.5 parent: 4812 @@ -73909,8 +71298,6 @@ entities: entities: - uid: 1565 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 6.5,-3.5 parent: 4812 @@ -73918,8 +71305,6 @@ entities: entities: - uid: 1094 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,-7.5 parent: 4812 @@ -73927,8 +71312,6 @@ entities: entities: - uid: 1480 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -20.5,-9.5 parent: 4812 @@ -73936,8 +71319,6 @@ entities: entities: - uid: 8275 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -16.5,17.5 parent: 4812 @@ -73945,8 +71326,6 @@ entities: entities: - uid: 7188 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-28.5 parent: 4812 @@ -73954,8 +71333,6 @@ entities: entities: - uid: 7399 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-25.5 parent: 4812 @@ -73963,15 +71340,11 @@ entities: entities: - uid: 1092 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -7.5,-5.5 parent: 4812 - uid: 11785 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 25.5,-32.5 parent: 4812 @@ -73979,8 +71352,6 @@ entities: entities: - uid: 6223 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 11.5,-26.5 parent: 4812 @@ -73988,8 +71359,6 @@ entities: entities: - uid: 737 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 4.5,-23.5 parent: 4812 @@ -73998,7 +71367,6 @@ entities: - uid: 3434 components: - type: MetaData - flags: SessionSpecific name: Salvage Equipment - type: Transform pos: 23.5,16.5 @@ -74007,8 +71375,6 @@ entities: entities: - uid: 5513 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 25.5,-26.5 parent: 4812 @@ -74016,15 +71382,11 @@ entities: entities: - uid: 8342 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -31.5,13.5 parent: 4812 - uid: 8420 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -36.5,12.5 parent: 4812 @@ -74032,15 +71394,11 @@ entities: entities: - uid: 6439 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -3.5,-29.5 parent: 4812 - uid: 12506 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -34.5,10.5 parent: 4812 @@ -74048,8 +71406,6 @@ entities: entities: - uid: 1091 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -8.5,-5.5 parent: 4812 @@ -74057,8 +71413,6 @@ entities: entities: - uid: 6240 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -29.5,32.5 parent: 4812 @@ -74066,22 +71420,16 @@ entities: entities: - uid: 920 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 0.5,-7.5 parent: 4812 - uid: 4530 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 13.5,1.5 parent: 4812 - uid: 5060 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -9.5,-45.5 parent: 4812 @@ -74089,8 +71437,6 @@ entities: entities: - uid: 11780 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 29.5,-32.5 parent: 4812 @@ -74098,8 +71444,6 @@ entities: entities: - uid: 6165 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -28.5,32.5 parent: 4812 @@ -74108,7 +71452,6 @@ entities: - uid: 739 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: 7.5,15.5 @@ -74116,7 +71459,6 @@ entities: - uid: 9577 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -31.5,1.5 @@ -74125,15 +71467,12 @@ entities: entities: - uid: 732 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: 9.5,14.5 parent: 4812 - uid: 6312 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: 26.5,-26.5 @@ -74141,7 +71480,6 @@ entities: - uid: 10708 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -35.5,-9.5 @@ -74149,7 +71487,6 @@ entities: - uid: 12113 components: - type: MetaData - flags: SessionSpecific name: tank dispenser - type: Transform pos: -42.5,-3.5 @@ -74158,15 +71495,11 @@ entities: entities: - uid: 1692 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -7.5,1.5 parent: 4812 - uid: 9045 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -26.5,-39.5 parent: 4812 @@ -74174,8 +71507,6 @@ entities: entities: - uid: 8578 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -18.5,7.5 parent: 4812 @@ -74183,8 +71514,6 @@ entities: entities: - uid: 8871 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -37.5,-33.5 parent: 4812 @@ -74192,15 +71521,11 @@ entities: entities: - uid: 8577 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -19.5,7.5 parent: 4812 - uid: 9723 components: - - type: MetaData - flags: SessionSpecific - type: Transform pos: -32.5,-5.5 parent: 4812 @@ -74243,6848 +71568,4894 @@ entities: entities: - uid: 32 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,15.5 parent: 4812 - uid: 35 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,15.5 parent: 4812 - uid: 122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,18.5 parent: 4812 - uid: 123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,18.5 parent: 4812 - uid: 124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,15.5 parent: 4812 - uid: 125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,18.5 parent: 4812 - uid: 126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,18.5 parent: 4812 - uid: 127 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,15.5 parent: 4812 - uid: 138 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,18.5 parent: 4812 - uid: 160 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,18.5 parent: 4812 - uid: 170 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,17.5 parent: 4812 - uid: 171 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,16.5 parent: 4812 - uid: 172 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,15.5 parent: 4812 - uid: 173 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,14.5 parent: 4812 - uid: 174 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,13.5 parent: 4812 - uid: 176 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,18.5 parent: 4812 - uid: 297 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,17.5 parent: 4812 - uid: 298 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,16.5 parent: 4812 - uid: 299 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,15.5 parent: 4812 - uid: 300 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,14.5 parent: 4812 - uid: 301 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,14.5 parent: 4812 - uid: 302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,14.5 parent: 4812 - uid: 303 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,14.5 parent: 4812 - uid: 304 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,14.5 parent: 4812 - uid: 305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,14.5 parent: 4812 - uid: 306 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,14.5 parent: 4812 - uid: 721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,14.5 parent: 4812 - uid: 722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,13.5 parent: 4812 - uid: 724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,13.5 parent: 4812 - uid: 725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,13.5 parent: 4812 - uid: 726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,13.5 parent: 4812 - uid: 727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,13.5 parent: 4812 - uid: 728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,13.5 parent: 4812 - uid: 772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,18.5 parent: 4812 - uid: 773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,18.5 parent: 4812 - uid: 1819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,21.5 parent: 4812 - uid: 1820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,21.5 parent: 4812 - uid: 1821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,21.5 parent: 4812 - uid: 1822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,21.5 parent: 4812 - uid: 1823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,22.5 parent: 4812 - uid: 1824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,23.5 parent: 4812 - uid: 1825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,24.5 parent: 4812 - uid: 1826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,25.5 parent: 4812 - uid: 1827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,26.5 parent: 4812 - uid: 1828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,27.5 parent: 4812 - uid: 1829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,21.5 parent: 4812 - uid: 1830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,21.5 parent: 4812 - uid: 1831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,21.5 parent: 4812 - uid: 1832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,21.5 parent: 4812 - uid: 1833 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,22.5 parent: 4812 - uid: 1834 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,23.5 parent: 4812 - uid: 1836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,25.5 parent: 4812 - uid: 1837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,26.5 parent: 4812 - uid: 1838 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,27.5 parent: 4812 - uid: 1839 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,27.5 parent: 4812 - uid: 1840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,27.5 parent: 4812 - uid: 1841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,27.5 parent: 4812 - uid: 1842 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,27.5 parent: 4812 - uid: 1857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,31.5 parent: 4812 - uid: 1859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,31.5 parent: 4812 - uid: 1861 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,31.5 parent: 4812 - uid: 1862 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,31.5 parent: 4812 - uid: 1863 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,33.5 parent: 4812 - uid: 1864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,33.5 parent: 4812 - uid: 1865 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,35.5 parent: 4812 - uid: 1866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,35.5 parent: 4812 - uid: 1867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,36.5 parent: 4812 - uid: 1868 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,36.5 parent: 4812 - uid: 1885 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,33.5 parent: 4812 - uid: 1886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,33.5 parent: 4812 - uid: 1887 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,32.5 parent: 4812 - uid: 1888 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,31.5 parent: 4812 - uid: 1889 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,30.5 parent: 4812 - uid: 1890 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,30.5 parent: 4812 - uid: 1891 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,30.5 parent: 4812 - uid: 1892 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,30.5 parent: 4812 - uid: 1893 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,21.5 parent: 4812 - uid: 1894 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,22.5 parent: 4812 - uid: 1895 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,23.5 parent: 4812 - uid: 1896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,21.5 parent: 4812 - uid: 1899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,27.5 parent: 4812 - uid: 1900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,28.5 parent: 4812 - uid: 1901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,29.5 parent: 4812 - uid: 1903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,22.5 parent: 4812 - uid: 1904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,23.5 parent: 4812 - uid: 1905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,24.5 parent: 4812 - uid: 1906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,25.5 parent: 4812 - uid: 1907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,26.5 parent: 4812 - uid: 1908 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,27.5 parent: 4812 - uid: 1909 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,28.5 parent: 4812 - uid: 1910 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,29.5 parent: 4812 - uid: 1911 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,30.5 parent: 4812 - uid: 1912 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,31.5 parent: 4812 - uid: 1913 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,31.5 parent: 4812 - uid: 1914 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,31.5 parent: 4812 - uid: 1915 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,30.5 parent: 4812 - uid: 1916 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,30.5 parent: 4812 - uid: 1920 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,23.5 parent: 4812 - uid: 1921 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,23.5 parent: 4812 - uid: 1922 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,23.5 parent: 4812 - uid: 1923 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,21.5 parent: 4812 - uid: 1946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,25.5 parent: 4812 - uid: 1947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,26.5 parent: 4812 - uid: 1948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,21.5 parent: 4812 - uid: 1949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,21.5 parent: 4812 - uid: 1950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,21.5 parent: 4812 - uid: 1951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,21.5 parent: 4812 - uid: 1954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,21.5 parent: 4812 - uid: 1955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,21.5 parent: 4812 - uid: 1956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,30.5 parent: 4812 - uid: 1957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,30.5 parent: 4812 - uid: 1958 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,30.5 parent: 4812 - uid: 1959 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,30.5 parent: 4812 - uid: 1960 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,30.5 parent: 4812 - uid: 1961 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,30.5 parent: 4812 - uid: 1967 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,27.5 parent: 4812 - uid: 1968 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,28.5 parent: 4812 - uid: 1969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,29.5 parent: 4812 - uid: 1970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,29.5 parent: 4812 - uid: 1971 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,28.5 parent: 4812 - uid: 1972 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,27.5 parent: 4812 - uid: 1973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,26.5 parent: 4812 - uid: 1974 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,25.5 parent: 4812 - uid: 1976 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,23.5 parent: 4812 - uid: 1977 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,22.5 parent: 4812 - uid: 2075 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,24.5 parent: 4812 - uid: 2609 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,21.5 parent: 4812 - uid: 2612 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,21.5 parent: 4812 - uid: 2746 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,36.5 parent: 4812 - uid: 2747 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,28.5 parent: 4812 - uid: 2748 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,29.5 parent: 4812 - uid: 2749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,30.5 parent: 4812 - uid: 2750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,31.5 parent: 4812 - uid: 2753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,33.5 parent: 4812 - uid: 2755 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,23.5 parent: 4812 - uid: 2756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,36.5 parent: 4812 - uid: 2757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,32.5 parent: 4812 - uid: 2758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,33.5 parent: 4812 - uid: 2766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,32.5 parent: 4812 - uid: 2767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,35.5 parent: 4812 - uid: 2769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,32.5 parent: 4812 - uid: 2774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,29.5 parent: 4812 - uid: 2778 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,34.5 parent: 4812 - uid: 2820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,33.5 parent: 4812 - uid: 2822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,22.5 parent: 4812 - uid: 2824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,28.5 parent: 4812 - uid: 2825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,29.5 parent: 4812 - uid: 2828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,28.5 parent: 4812 - uid: 2829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,20.5 parent: 4812 - uid: 2830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,18.5 parent: 4812 - uid: 2831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,17.5 parent: 4812 - uid: 2841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,35.5 parent: 4812 - uid: 2896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,12.5 parent: 4812 - uid: 2897 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,11.5 parent: 4812 - uid: 2898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,11.5 parent: 4812 - uid: 2899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,11.5 parent: 4812 - uid: 2900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,11.5 parent: 4812 - uid: 2901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,11.5 parent: 4812 - uid: 2903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,16.5 parent: 4812 - uid: 2904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,17.5 parent: 4812 - uid: 2905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,17.5 parent: 4812 - uid: 2906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,17.5 parent: 4812 - uid: 2942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,29.5 parent: 4812 - uid: 3006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,22.5 parent: 4812 - uid: 3042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,23.5 parent: 4812 - uid: 3118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,34.5 parent: 4812 - uid: 3150 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,33.5 parent: 4812 - uid: 3189 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,36.5 parent: 4812 - uid: 3193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,33.5 parent: 4812 - uid: 3212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,9.5 parent: 4812 - uid: 3288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,6.5 parent: 4812 - uid: 3352 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,9.5 parent: 4812 - uid: 3355 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,9.5 parent: 4812 - uid: 3356 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,9.5 parent: 4812 - uid: 3357 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,9.5 parent: 4812 - uid: 3391 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,6.5 parent: 4812 - uid: 3428 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,37.5 parent: 4812 - uid: 3429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,37.5 parent: 4812 - uid: 3430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,36.5 parent: 4812 - uid: 3431 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,36.5 parent: 4812 - uid: 3432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,37.5 parent: 4812 - uid: 3436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,33.5 parent: 4812 - uid: 3437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,31.5 parent: 4812 - uid: 3486 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,43.5 parent: 4812 - uid: 3487 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,44.5 parent: 4812 - uid: 3488 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,45.5 parent: 4812 - uid: 3489 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,46.5 parent: 4812 - uid: 3490 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,47.5 parent: 4812 - uid: 3491 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,48.5 parent: 4812 - uid: 3492 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,43.5 parent: 4812 - uid: 3493 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,43.5 parent: 4812 - uid: 3494 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,43.5 parent: 4812 - uid: 3495 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,43.5 parent: 4812 - uid: 3496 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,42.5 parent: 4812 - uid: 3497 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,42.5 parent: 4812 - uid: 3498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,42.5 parent: 4812 - uid: 3499 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,42.5 parent: 4812 - uid: 3500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,42.5 parent: 4812 - uid: 3501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,43.5 parent: 4812 - uid: 3502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,43.5 parent: 4812 - uid: 3504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,43.5 parent: 4812 - uid: 3505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,43.5 parent: 4812 - uid: 3506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,44.5 parent: 4812 - uid: 3507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,46.5 parent: 4812 - uid: 3508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,44.5 parent: 4812 - uid: 3509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,45.5 parent: 4812 - uid: 3510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,46.5 parent: 4812 - uid: 3511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,47.5 parent: 4812 - uid: 3512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,47.5 parent: 4812 - uid: 3513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,47.5 parent: 4812 - uid: 3514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,48.5 parent: 4812 - uid: 3515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,48.5 parent: 4812 - uid: 3516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,49.5 parent: 4812 - uid: 3517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,50.5 parent: 4812 - uid: 3518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,51.5 parent: 4812 - uid: 3519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,52.5 parent: 4812 - uid: 3520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,53.5 parent: 4812 - uid: 3521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,54.5 parent: 4812 - uid: 3522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,55.5 parent: 4812 - uid: 3523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,55.5 parent: 4812 - uid: 3524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,56.5 parent: 4812 - uid: 3525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,56.5 parent: 4812 - uid: 3526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,57.5 parent: 4812 - uid: 3527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,57.5 parent: 4812 - uid: 3528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,58.5 parent: 4812 - uid: 3529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,58.5 parent: 4812 - uid: 3530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,58.5 parent: 4812 - uid: 3531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,58.5 parent: 4812 - uid: 3532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,58.5 parent: 4812 - uid: 3533 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,57.5 parent: 4812 - uid: 3534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,57.5 parent: 4812 - uid: 3535 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,56.5 parent: 4812 - uid: 3536 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,56.5 parent: 4812 - uid: 3537 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,55.5 parent: 4812 - uid: 3538 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,55.5 parent: 4812 - uid: 3539 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,55.5 parent: 4812 - uid: 3540 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,54.5 parent: 4812 - uid: 3541 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,53.5 parent: 4812 - uid: 3542 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,52.5 parent: 4812 - uid: 3543 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,51.5 parent: 4812 - uid: 3544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,50.5 parent: 4812 - uid: 3545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,49.5 parent: 4812 - uid: 3546 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,48.5 parent: 4812 - uid: 3547 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,57.5 parent: 4812 - uid: 3548 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,57.5 parent: 4812 - uid: 3549 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,57.5 parent: 4812 - uid: 3550 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,56.5 parent: 4812 - uid: 3551 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,56.5 parent: 4812 - uid: 3552 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,48.5 parent: 4812 - uid: 3553 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,48.5 parent: 4812 - uid: 3554 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,48.5 parent: 4812 - uid: 3555 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,48.5 parent: 4812 - uid: 3556 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,48.5 parent: 4812 - uid: 3557 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,48.5 parent: 4812 - uid: 3558 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,47.5 parent: 4812 - uid: 3559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,47.5 parent: 4812 - uid: 3560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,44.5 parent: 4812 - uid: 3561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,46.5 parent: 4812 - uid: 3562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,47.5 parent: 4812 - uid: 3563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,46.5 parent: 4812 - uid: 3564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,44.5 parent: 4812 - uid: 3565 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,47.5 parent: 4812 - uid: 3566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,49.5 parent: 4812 - uid: 3567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,50.5 parent: 4812 - uid: 3568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,51.5 parent: 4812 - uid: 3569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,52.5 parent: 4812 - uid: 3570 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,53.5 parent: 4812 - uid: 3571 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,54.5 parent: 4812 - uid: 3572 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,54.5 parent: 4812 - uid: 3573 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,53.5 parent: 4812 - uid: 3574 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,52.5 parent: 4812 - uid: 3575 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,51.5 parent: 4812 - uid: 3576 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,50.5 parent: 4812 - uid: 3577 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,49.5 parent: 4812 - uid: 3691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,54.5 parent: 4812 - uid: 3692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,54.5 parent: 4812 - uid: 3693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,52.5 parent: 4812 - uid: 3694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,51.5 parent: 4812 - uid: 3695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,51.5 parent: 4812 - uid: 3696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,51.5 parent: 4812 - uid: 3697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,52.5 parent: 4812 - uid: 3717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,3.5 parent: 4812 - uid: 3718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,3.5 parent: 4812 - uid: 3719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,4.5 parent: 4812 - uid: 3720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,5.5 parent: 4812 - uid: 3721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,2.5 parent: 4812 - uid: 3722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,7.5 parent: 4812 - uid: 3723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,2.5 parent: 4812 - uid: 3724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,3.5 parent: 4812 - uid: 3725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,4.5 parent: 4812 - uid: 3727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,2.5 parent: 4812 - uid: 3728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,8.5 parent: 4812 - uid: 3729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,6.5 parent: 4812 - uid: 3730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,2.5 parent: 4812 - uid: 3731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,2.5 parent: 4812 - uid: 3990 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,8.5 parent: 4812 - uid: 3991 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,7.5 parent: 4812 - uid: 3992 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,6.5 parent: 4812 - uid: 3993 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,5.5 parent: 4812 - uid: 3994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,5.5 parent: 4812 - uid: 3995 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,5.5 parent: 4812 - uid: 3996 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,5.5 parent: 4812 - uid: 3997 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,5.5 parent: 4812 - uid: 3998 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,5.5 parent: 4812 - uid: 3999 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,5.5 parent: 4812 - uid: 4000 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,5.5 parent: 4812 - uid: 4001 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,5.5 parent: 4812 - uid: 4081 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-4.5 parent: 4812 - uid: 4082 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-4.5 parent: 4812 - uid: 4083 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-4.5 parent: 4812 - uid: 4084 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-5.5 parent: 4812 - uid: 4085 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-5.5 parent: 4812 - uid: 4086 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-4.5 parent: 4812 - uid: 4087 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-10.5 parent: 4812 - uid: 4088 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-10.5 parent: 4812 - uid: 4089 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-10.5 parent: 4812 - uid: 4090 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-10.5 parent: 4812 - uid: 4091 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-10.5 parent: 4812 - uid: 4092 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-10.5 parent: 4812 - uid: 4093 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-9.5 parent: 4812 - uid: 4094 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-8.5 parent: 4812 - uid: 4095 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-8.5 parent: 4812 - uid: 4096 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-8.5 parent: 4812 - uid: 4097 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-8.5 parent: 4812 - uid: 4098 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-8.5 parent: 4812 - uid: 4101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-8.5 parent: 4812 - uid: 4102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-8.5 parent: 4812 - uid: 4103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-8.5 parent: 4812 - uid: 4104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-8.5 parent: 4812 - uid: 4105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-8.5 parent: 4812 - uid: 4106 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-9.5 parent: 4812 - uid: 4107 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-10.5 parent: 4812 - uid: 4108 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-6.5 parent: 4812 - uid: 4109 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-6.5 parent: 4812 - uid: 4638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-36.5 parent: 4812 - uid: 4639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-36.5 parent: 4812 - uid: 4640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-36.5 parent: 4812 - uid: 4641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-36.5 parent: 4812 - uid: 4642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-36.5 parent: 4812 - uid: 4643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-36.5 parent: 4812 - uid: 4681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-40.5 parent: 4812 - uid: 4685 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-53.5 parent: 4812 - uid: 4686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-53.5 parent: 4812 - uid: 4693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-39.5 parent: 4812 - uid: 4694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-37.5 parent: 4812 - uid: 4696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-40.5 parent: 4812 - uid: 4789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-29.5 parent: 4812 - uid: 4790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-29.5 parent: 4812 - uid: 4791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-30.5 parent: 4812 - uid: 4792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-31.5 parent: 4812 - uid: 4828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,23.5 parent: 4812 - uid: 4829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,23.5 parent: 4812 - uid: 4830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,23.5 parent: 4812 - uid: 4831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,23.5 parent: 4812 - uid: 4832 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,23.5 parent: 4812 - uid: 4886 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,23.5 parent: 4812 - uid: 4887 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,22.5 parent: 4812 - uid: 4898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,21.5 parent: 4812 - uid: 4917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-29.5 parent: 4812 - uid: 4936 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-27.5 parent: 4812 - uid: 5016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-24.5 parent: 4812 - uid: 5027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,19.5 parent: 4812 - uid: 5042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-59.5 parent: 4812 - uid: 5126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,20.5 parent: 4812 - uid: 5285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-24.5 parent: 4812 - uid: 5286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-23.5 parent: 4812 - uid: 5287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-23.5 parent: 4812 - uid: 5288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-23.5 parent: 4812 - uid: 5289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-23.5 parent: 4812 - uid: 5290 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-24.5 parent: 4812 - uid: 5291 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-25.5 parent: 4812 - uid: 5292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-26.5 parent: 4812 - uid: 5293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-30.5 parent: 4812 - uid: 5294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-30.5 parent: 4812 - uid: 5295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-29.5 parent: 4812 - uid: 5296 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-30.5 parent: 4812 - uid: 5297 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-30.5 parent: 4812 - uid: 5298 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-29.5 parent: 4812 - uid: 5299 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-28.5 parent: 4812 - uid: 5312 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-13.5 parent: 4812 - uid: 5314 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-13.5 parent: 4812 - uid: 5316 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-13.5 parent: 4812 - uid: 5330 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-13.5 parent: 4812 - uid: 5331 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-19.5 parent: 4812 - uid: 5332 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-19.5 parent: 4812 - uid: 5336 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-19.5 parent: 4812 - uid: 5337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-19.5 parent: 4812 - uid: 5395 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-22.5 parent: 4812 - uid: 5397 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-22.5 parent: 4812 - uid: 5398 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-18.5 parent: 4812 - uid: 5400 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-19.5 parent: 4812 - uid: 5401 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-17.5 parent: 4812 - uid: 5402 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-16.5 parent: 4812 - uid: 5403 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-16.5 parent: 4812 - uid: 5404 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-16.5 parent: 4812 - uid: 5405 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-16.5 parent: 4812 - uid: 5406 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-16.5 parent: 4812 - uid: 5407 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-13.5 parent: 4812 - uid: 5408 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-14.5 parent: 4812 - uid: 5409 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-13.5 parent: 4812 - uid: 5410 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-13.5 parent: 4812 - uid: 5411 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-13.5 parent: 4812 - uid: 5412 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-17.5 parent: 4812 - uid: 5413 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-19.5 parent: 4812 - uid: 5414 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-22.5 parent: 4812 - uid: 5432 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-24.5 parent: 4812 - uid: 5433 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-28.5 parent: 4812 - uid: 5434 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-29.5 parent: 4812 - uid: 5435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-29.5 parent: 4812 - uid: 5436 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-29.5 parent: 4812 - uid: 5437 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-29.5 parent: 4812 - uid: 5438 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-29.5 parent: 4812 - uid: 5439 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-29.5 parent: 4812 - uid: 5440 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-29.5 parent: 4812 - uid: 5441 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-29.5 parent: 4812 - uid: 5442 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-29.5 parent: 4812 - uid: 5443 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-29.5 parent: 4812 - uid: 5444 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-29.5 parent: 4812 - uid: 5445 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-29.5 parent: 4812 - uid: 5446 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-29.5 parent: 4812 - uid: 5447 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-28.5 parent: 4812 - uid: 5448 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-27.5 parent: 4812 - uid: 5449 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-26.5 parent: 4812 - uid: 5450 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-25.5 parent: 4812 - uid: 5451 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-26.5 parent: 4812 - uid: 5452 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-23.5 parent: 4812 - uid: 5453 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-22.5 parent: 4812 - uid: 5454 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-22.5 parent: 4812 - uid: 5455 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-22.5 parent: 4812 - uid: 5456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-22.5 parent: 4812 - uid: 5469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-17.5 parent: 4812 - uid: 5470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-18.5 parent: 4812 - uid: 5471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-19.5 parent: 4812 - uid: 5473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-22.5 parent: 4812 - uid: 5479 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-27.5 parent: 4812 - uid: 5480 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-27.5 parent: 4812 - uid: 5500 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-29.5 parent: 4812 - uid: 5501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-22.5 parent: 4812 - uid: 5502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-22.5 parent: 4812 - uid: 5505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-21.5 parent: 4812 - uid: 5506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-21.5 parent: 4812 - uid: 5510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-21.5 parent: 4812 - uid: 5511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-19.5 parent: 4812 - uid: 5512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-27.5 parent: 4812 - uid: 5515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-27.5 parent: 4812 - uid: 5516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-27.5 parent: 4812 - uid: 5517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-27.5 parent: 4812 - uid: 5518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-28.5 parent: 4812 - uid: 5519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-28.5 parent: 4812 - uid: 5520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-30.5 parent: 4812 - uid: 5521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-30.5 parent: 4812 - uid: 5522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-31.5 parent: 4812 - uid: 5523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 25.5,-31.5 parent: 4812 - uid: 5524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-31.5 parent: 4812 - uid: 5525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-31.5 parent: 4812 - uid: 5526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-31.5 parent: 4812 - uid: 5527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-31.5 parent: 4812 - uid: 5528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-31.5 parent: 4812 - uid: 5529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-31.5 parent: 4812 - uid: 5530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-21.5 parent: 4812 - uid: 5531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-20.5 parent: 4812 - uid: 5532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-19.5 parent: 4812 - uid: 5556 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-31.5 parent: 4812 - uid: 5557 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-31.5 parent: 4812 - uid: 5558 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-31.5 parent: 4812 - uid: 5559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-31.5 parent: 4812 - uid: 5560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-30.5 parent: 4812 - uid: 5561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-29.5 parent: 4812 - uid: 5568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-22.5 parent: 4812 - uid: 5569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-21.5 parent: 4812 - uid: 5595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,18.5 parent: 4812 - uid: 5769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-29.5 parent: 4812 - uid: 5770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-29.5 parent: 4812 - uid: 5772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-29.5 parent: 4812 - uid: 5773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-29.5 parent: 4812 - uid: 5774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-29.5 parent: 4812 - uid: 5775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-28.5 parent: 4812 - uid: 5776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-27.5 parent: 4812 - uid: 5777 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-26.5 parent: 4812 - uid: 5778 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-25.5 parent: 4812 - uid: 5779 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-24.5 parent: 4812 - uid: 5780 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-23.5 parent: 4812 - uid: 5781 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-22.5 parent: 4812 - uid: 5785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-22.5 parent: 4812 - uid: 5786 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-22.5 parent: 4812 - uid: 5826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-59.5 parent: 4812 - uid: 5904 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-30.5 parent: 4812 - uid: 5905 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-31.5 parent: 4812 - uid: 5906 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-30.5 parent: 4812 - uid: 5907 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-31.5 parent: 4812 - uid: 5908 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 17.5,-32.5 parent: 4812 - uid: 5909 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 16.5,-32.5 parent: 4812 - uid: 5910 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 13.5,-32.5 parent: 4812 - uid: 5911 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: 1.5707963267948966 rad pos: 14.5,-32.5 parent: 4812 - uid: 6546 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-26.5 parent: 4812 - uid: 6547 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-25.5 parent: 4812 - uid: 6559 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-13.5 parent: 4812 - uid: 6560 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-18.5 parent: 4812 - uid: 6561 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-16.5 parent: 4812 - uid: 6562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-14.5 parent: 4812 - uid: 6563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-13.5 parent: 4812 - uid: 6564 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-19.5 parent: 4812 - uid: 6565 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-19.5 parent: 4812 - uid: 6566 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-19.5 parent: 4812 - uid: 6567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-17.5 parent: 4812 - uid: 6568 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-15.5 parent: 4812 - uid: 6569 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-13.5 parent: 4812 - uid: 6696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-37.5 parent: 4812 - uid: 6697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-37.5 parent: 4812 - uid: 6698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-37.5 parent: 4812 - uid: 6699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-38.5 parent: 4812 - uid: 6700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-39.5 parent: 4812 - uid: 6701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-40.5 parent: 4812 - uid: 6702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-40.5 parent: 4812 - uid: 6704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-40.5 parent: 4812 - uid: 6705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-40.5 parent: 4812 - uid: 6706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-40.5 parent: 4812 - uid: 6707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-40.5 parent: 4812 - uid: 6759 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-29.5 parent: 4812 - uid: 6760 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-30.5 parent: 4812 - uid: 6761 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-31.5 parent: 4812 - uid: 6762 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-32.5 parent: 4812 - uid: 6763 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-33.5 parent: 4812 - uid: 6900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-33.5 parent: 4812 - uid: 6901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-33.5 parent: 4812 - uid: 7281 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-28.5 parent: 4812 - uid: 7289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-29.5 parent: 4812 - uid: 7292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-29.5 parent: 4812 - uid: 7293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-29.5 parent: 4812 - uid: 7294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-29.5 parent: 4812 - uid: 7337 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-24.5 parent: 4812 - uid: 7635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,30.5 parent: 4812 - uid: 7636 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,29.5 parent: 4812 - uid: 7637 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,30.5 parent: 4812 - uid: 7638 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,30.5 parent: 4812 - uid: 7639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,30.5 parent: 4812 - uid: 7640 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,29.5 parent: 4812 - uid: 7641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,21.5 parent: 4812 - uid: 7642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,22.5 parent: 4812 - uid: 7643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,23.5 parent: 4812 - uid: 7644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,24.5 parent: 4812 - uid: 7645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,26.5 parent: 4812 - uid: 7646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,27.5 parent: 4812 - uid: 7647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,28.5 parent: 4812 - uid: 7648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,30.5 parent: 4812 - uid: 7649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,29.5 parent: 4812 - uid: 7650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,29.5 parent: 4812 - uid: 7651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,29.5 parent: 4812 - uid: 7652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,21.5 parent: 4812 - uid: 7653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,21.5 parent: 4812 - uid: 7654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,22.5 parent: 4812 - uid: 7656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,24.5 parent: 4812 - uid: 7657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,25.5 parent: 4812 - uid: 7658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,26.5 parent: 4812 - uid: 7659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,27.5 parent: 4812 - uid: 7660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,28.5 parent: 4812 - uid: 7661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,32.5 parent: 4812 - uid: 7662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,33.5 parent: 4812 - uid: 7663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,33.5 parent: 4812 - uid: 7664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,33.5 parent: 4812 - uid: 7670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,33.5 parent: 4812 - uid: 7671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,33.5 parent: 4812 - uid: 7672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,33.5 parent: 4812 - uid: 7673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,33.5 parent: 4812 - uid: 7674 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,28.5 parent: 4812 - uid: 7675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,29.5 parent: 4812 - uid: 7676 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,30.5 parent: 4812 - uid: 7677 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,31.5 parent: 4812 - uid: 7678 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,32.5 parent: 4812 - uid: 7679 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,28.5 parent: 4812 - uid: 7680 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,21.5 parent: 4812 - uid: 7681 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,21.5 parent: 4812 - uid: 7686 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,21.5 parent: 4812 - uid: 7687 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,21.5 parent: 4812 - uid: 7688 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,21.5 parent: 4812 - uid: 7689 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,23.5 parent: 4812 - uid: 7690 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,25.5 parent: 4812 - uid: 7691 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,25.5 parent: 4812 - uid: 7692 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,22.5 parent: 4812 - uid: 7693 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,25.5 parent: 4812 - uid: 7694 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,25.5 parent: 4812 - uid: 7695 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,21.5 parent: 4812 - uid: 7696 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,27.5 parent: 4812 - uid: 7697 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,26.5 parent: 4812 - uid: 7698 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,25.5 parent: 4812 - uid: 7699 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,24.5 parent: 4812 - uid: 7700 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,25.5 parent: 4812 - uid: 7701 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,26.5 parent: 4812 - uid: 7702 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,27.5 parent: 4812 - uid: 7703 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,28.5 parent: 4812 - uid: 7704 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,28.5 parent: 4812 - uid: 7705 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,28.5 parent: 4812 - uid: 7706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,28.5 parent: 4812 - uid: 7707 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,28.5 parent: 4812 - uid: 7712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,9.5 parent: 4812 - uid: 7713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,9.5 parent: 4812 - uid: 7714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,9.5 parent: 4812 - uid: 7715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,9.5 parent: 4812 - uid: 7718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,18.5 parent: 4812 - uid: 7719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,15.5 parent: 4812 - uid: 7720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,15.5 parent: 4812 - uid: 7721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,15.5 parent: 4812 - uid: 7722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,15.5 parent: 4812 - uid: 7723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,12.5 parent: 4812 - uid: 7724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,12.5 parent: 4812 - uid: 7732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,18.5 parent: 4812 - uid: 7733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,22.5 parent: 4812 - uid: 7734 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,22.5 parent: 4812 - uid: 7735 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,22.5 parent: 4812 - uid: 7736 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,22.5 parent: 4812 - uid: 7737 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,18.5 parent: 4812 - uid: 7738 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,19.5 parent: 4812 - uid: 7739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,20.5 parent: 4812 - uid: 7740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,18.5 parent: 4812 - uid: 7743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,16.5 parent: 4812 - uid: 7744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,13.5 parent: 4812 - uid: 7749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,9.5 parent: 4812 - uid: 7750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,9.5 parent: 4812 - uid: 7751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,9.5 parent: 4812 - uid: 7753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,9.5 parent: 4812 - uid: 7754 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,9.5 parent: 4812 - uid: 7755 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,9.5 parent: 4812 - uid: 7756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,21.5 parent: 4812 - uid: 7757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,22.5 parent: 4812 - uid: 7758 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,17.5 parent: 4812 - uid: 7759 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,16.5 parent: 4812 - uid: 7760 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,15.5 parent: 4812 - uid: 7761 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,14.5 parent: 4812 - uid: 7762 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,13.5 parent: 4812 - uid: 7763 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,13.5 parent: 4812 - uid: 7765 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,13.5 parent: 4812 - uid: 7766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,13.5 parent: 4812 - uid: 7767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,13.5 parent: 4812 - uid: 7768 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,9.5 parent: 4812 - uid: 7769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,9.5 parent: 4812 - uid: 7770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,9.5 parent: 4812 - uid: 7771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,9.5 parent: 4812 - uid: 7772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,9.5 parent: 4812 - uid: 7773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,9.5 parent: 4812 - uid: 7774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,10.5 parent: 4812 - uid: 7775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,11.5 parent: 4812 - uid: 7776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,12.5 parent: 4812 - uid: 7937 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,6.5 parent: 4812 - uid: 7938 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,6.5 parent: 4812 - uid: 7939 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,6.5 parent: 4812 - uid: 7940 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,6.5 parent: 4812 - uid: 7941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,6.5 parent: 4812 - uid: 7942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,6.5 parent: 4812 - uid: 7943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,6.5 parent: 4812 - uid: 7944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,6.5 parent: 4812 - uid: 7945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,6.5 parent: 4812 - uid: 7946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,6.5 parent: 4812 - uid: 7947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,6.5 parent: 4812 - uid: 7948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,6.5 parent: 4812 - uid: 7950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,6.5 parent: 4812 - uid: 7951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,7.5 parent: 4812 - uid: 7952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,8.5 parent: 4812 - uid: 7955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,8.5 parent: 4812 - uid: 8621 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,0.5 parent: 4812 - uid: 8623 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,0.5 parent: 4812 - uid: 8624 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,0.5 parent: 4812 - uid: 8625 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,1.5 parent: 4812 - uid: 8626 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,5.5 parent: 4812 - uid: 8635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,0.5 parent: 4812 - uid: 8639 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,4.5 parent: 4812 - uid: 8641 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-0.5 parent: 4812 - uid: 8642 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-1.5 parent: 4812 - uid: 8643 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-2.5 parent: 4812 - uid: 8644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-3.5 parent: 4812 - uid: 8645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-4.5 parent: 4812 - uid: 8646 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-5.5 parent: 4812 - uid: 8647 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-6.5 parent: 4812 - uid: 8648 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-4.5 parent: 4812 - uid: 8649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-4.5 parent: 4812 - uid: 8650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-4.5 parent: 4812 - uid: 8651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-4.5 parent: 4812 - uid: 8652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-5.5 parent: 4812 - uid: 8653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-9.5 parent: 4812 - uid: 8654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-10.5 parent: 4812 - uid: 8655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-10.5 parent: 4812 - uid: 8656 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-10.5 parent: 4812 - uid: 8657 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-10.5 parent: 4812 - uid: 8658 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-10.5 parent: 4812 - uid: 8659 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-10.5 parent: 4812 - uid: 8660 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-10.5 parent: 4812 - uid: 8661 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-9.5 parent: 4812 - uid: 8662 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-7.5 parent: 4812 - uid: 8663 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-6.5 parent: 4812 - uid: 8664 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-10.5 parent: 4812 - uid: 8665 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-10.5 parent: 4812 - uid: 8666 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-9.5 parent: 4812 - uid: 8667 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-7.5 parent: 4812 - uid: 8668 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-6.5 parent: 4812 - uid: 8669 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-5.5 parent: 4812 - uid: 8670 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-4.5 parent: 4812 - uid: 8671 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-3.5 parent: 4812 - uid: 8672 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-2.5 parent: 4812 - uid: 8673 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-1.5 parent: 4812 - uid: 8674 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-0.5 parent: 4812 - uid: 8675 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,0.5 parent: 4812 - uid: 8712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-0.5 parent: 4812 - uid: 8713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-0.5 parent: 4812 - uid: 8714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-0.5 parent: 4812 - uid: 8715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-1.5 parent: 4812 - uid: 8716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-2.5 parent: 4812 - uid: 8717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-3.5 parent: 4812 - uid: 8718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-4.5 parent: 4812 - uid: 8719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-4.5 parent: 4812 - uid: 8720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-4.5 parent: 4812 - uid: 8724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-4.5 parent: 4812 - uid: 8726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-2.5 parent: 4812 - uid: 8727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-1.5 parent: 4812 - uid: 8728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-0.5 parent: 4812 - uid: 8729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-0.5 parent: 4812 - uid: 8730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-0.5 parent: 4812 - uid: 8731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-0.5 parent: 4812 - uid: 8732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-0.5 parent: 4812 - uid: 8733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-4.5 parent: 4812 - uid: 8751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-3.5 parent: 4812 - uid: 8789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-41.5 parent: 4812 - uid: 8790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-41.5 parent: 4812 - uid: 8791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-41.5 parent: 4812 - uid: 8793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-41.5 parent: 4812 - uid: 8794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-41.5 parent: 4812 - uid: 8795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-41.5 parent: 4812 - uid: 8796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-41.5 parent: 4812 - uid: 8797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-40.5 parent: 4812 - uid: 8798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-39.5 parent: 4812 - uid: 8799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-38.5 parent: 4812 - uid: 8800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-38.5 parent: 4812 - uid: 8801 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-38.5 parent: 4812 - uid: 8802 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-38.5 parent: 4812 - uid: 8809 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-38.5 parent: 4812 - uid: 8811 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-36.5 parent: 4812 - uid: 8812 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-34.5 parent: 4812 - uid: 8813 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-33.5 parent: 4812 - uid: 8814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-32.5 parent: 4812 - uid: 8815 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-35.5 parent: 4812 - uid: 8816 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-37.5 parent: 4812 - uid: 8817 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-36.5 parent: 4812 - uid: 8818 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-35.5 parent: 4812 - uid: 8819 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-34.5 parent: 4812 - uid: 8820 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-35.5 parent: 4812 - uid: 8821 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-35.5 parent: 4812 - uid: 8822 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-34.5 parent: 4812 - uid: 8823 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-32.5 parent: 4812 - uid: 8824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-32.5 parent: 4812 - uid: 8825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-32.5 parent: 4812 - uid: 8826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-32.5 parent: 4812 - uid: 8827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-32.5 parent: 4812 - uid: 8828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-32.5 parent: 4812 - uid: 8829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-32.5 parent: 4812 - uid: 8830 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-32.5 parent: 4812 - uid: 8831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-32.5 parent: 4812 - uid: 8873 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-11.5 parent: 4812 - uid: 8874 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-12.5 parent: 4812 - uid: 8875 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-13.5 parent: 4812 - uid: 8876 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-14.5 parent: 4812 - uid: 8877 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-15.5 parent: 4812 - uid: 9022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,2.5 parent: 4812 - uid: 9091 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,12.5 parent: 4812 - uid: 9092 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,11.5 parent: 4812 - uid: 9093 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,10.5 parent: 4812 - uid: 9094 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,9.5 parent: 4812 - uid: 9095 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,8.5 parent: 4812 - uid: 9096 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,7.5 parent: 4812 - uid: 9097 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,6.5 parent: 4812 - uid: 9098 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,5.5 parent: 4812 - uid: 9100 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,3.5 parent: 4812 - uid: 9101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,2.5 parent: 4812 - uid: 9102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,1.5 parent: 4812 - uid: 9103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,12.5 parent: 4812 - uid: 9104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,11.5 parent: 4812 - uid: 9105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,10.5 parent: 4812 - uid: 9106 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,9.5 parent: 4812 - uid: 9107 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,8.5 parent: 4812 - uid: 9108 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,7.5 parent: 4812 - uid: 9109 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,6.5 parent: 4812 - uid: 9110 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,5.5 parent: 4812 - uid: 9111 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,4.5 parent: 4812 - uid: 9112 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,3.5 parent: 4812 - uid: 9113 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,2.5 parent: 4812 - uid: 9114 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,1.5 parent: 4812 - uid: 9139 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,0.5 parent: 4812 - uid: 9140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,0.5 parent: 4812 - uid: 9141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,0.5 parent: 4812 - uid: 9142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,0.5 parent: 4812 - uid: 9143 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,0.5 parent: 4812 - uid: 9144 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,0.5 parent: 4812 - uid: 9239 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,6.5 parent: 4812 - uid: 9240 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,4.5 parent: 4812 - uid: 9242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,2.5 parent: 4812 - uid: 9243 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,2.5 parent: 4812 - uid: 9244 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,6.5 parent: 4812 - uid: 9245 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,2.5 parent: 4812 - uid: 9248 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,6.5 parent: 4812 - uid: 9256 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,4.5 parent: 4812 - uid: 9258 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,4.5 parent: 4812 - uid: 9260 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,4.5 parent: 4812 - uid: 9265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,6.5 parent: 4812 - uid: 9266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,8.5 parent: 4812 - uid: 9267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,8.5 parent: 4812 - uid: 9268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,8.5 parent: 4812 - uid: 9269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,8.5 parent: 4812 - uid: 9270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,10.5 parent: 4812 - uid: 9271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,10.5 parent: 4812 - uid: 9272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,10.5 parent: 4812 - uid: 9273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,10.5 parent: 4812 - uid: 9274 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,12.5 parent: 4812 - uid: 9275 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,12.5 parent: 4812 - uid: 9276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,12.5 parent: 4812 - uid: 9277 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,12.5 parent: 4812 - uid: 9284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-5.5 parent: 4812 - uid: 9285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-3.5 parent: 4812 - uid: 9286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-2.5 parent: 4812 - uid: 9469 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,18.5 parent: 4812 - uid: 9470 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,18.5 parent: 4812 - uid: 9471 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,18.5 parent: 4812 - uid: 9472 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,18.5 parent: 4812 - uid: 9473 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,15.5 parent: 4812 - uid: 9474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,15.5 parent: 4812 - uid: 9511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,13.5 parent: 4812 - uid: 9517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-5.5 parent: 4812 - uid: 9518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-5.5 parent: 4812 - uid: 9519 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-5.5 parent: 4812 - uid: 9520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-3.5 parent: 4812 - uid: 9521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-5.5 parent: 4812 - uid: 9522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-3.5 parent: 4812 - uid: 9579 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-32.5 parent: 4812 - uid: 9590 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-25.5 parent: 4812 - uid: 9591 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-24.5 parent: 4812 - uid: 9592 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-24.5 parent: 4812 - uid: 9594 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-24.5 parent: 4812 - uid: 9595 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-25.5 parent: 4812 - uid: 9596 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-26.5 parent: 4812 - uid: 9597 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-26.5 parent: 4812 - uid: 9598 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-26.5 parent: 4812 - uid: 9604 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-24.5 parent: 4812 - uid: 9605 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-24.5 parent: 4812 - uid: 9606 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-24.5 parent: 4812 - uid: 9607 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -56.5,-21.5 parent: 4812 - uid: 9644 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-56.5 parent: 4812 - uid: 9645 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-56.5 parent: 4812 - uid: 9824 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-16.5 parent: 4812 - uid: 9825 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-17.5 parent: 4812 - uid: 9826 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-18.5 parent: 4812 - uid: 9827 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-19.5 parent: 4812 - uid: 9828 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-19.5 parent: 4812 - uid: 9829 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-15.5 parent: 4812 - uid: 9831 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-15.5 parent: 4812 - uid: 9836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-10.5 parent: 4812 - uid: 9837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-5.5 parent: 4812 - uid: 9840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-14.5 parent: 4812 - uid: 9841 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-15.5 parent: 4812 - uid: 9842 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-5.5 parent: 4812 - uid: 9844 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-6.5 parent: 4812 - uid: 9845 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-7.5 parent: 4812 - uid: 9846 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-14.5 parent: 4812 - uid: 9847 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-13.5 parent: 4812 - uid: 9848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-12.5 parent: 4812 - uid: 9849 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-11.5 parent: 4812 - uid: 9850 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-10.5 parent: 4812 - uid: 9851 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-9.5 parent: 4812 - uid: 9852 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-8.5 parent: 4812 - uid: 9853 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-14.5 parent: 4812 - uid: 9854 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-14.5 parent: 4812 - uid: 9855 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-14.5 parent: 4812 - uid: 9856 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-14.5 parent: 4812 - uid: 9857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-14.5 parent: 4812 - uid: 9858 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-14.5 parent: 4812 - uid: 9859 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-14.5 parent: 4812 - uid: 9860 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-14.5 parent: 4812 - uid: 9864 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-10.5 parent: 4812 - uid: 9865 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-9.5 parent: 4812 - uid: 9866 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-8.5 parent: 4812 - uid: 9867 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-7.5 parent: 4812 - uid: 9868 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-6.5 parent: 4812 - uid: 9873 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-9.5 parent: 4812 - uid: 9876 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-10.5 parent: 4812 - uid: 9890 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-9.5 parent: 4812 - uid: 9891 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-10.5 parent: 4812 - uid: 9895 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-14.5 parent: 4812 - uid: 9896 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-9.5 parent: 4812 - uid: 9900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-9.5 parent: 4812 - uid: 9901 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-19.5 parent: 4812 - uid: 9902 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -40.5,-19.5 parent: 4812 - uid: 9903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-19.5 parent: 4812 - uid: 9904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-19.5 parent: 4812 - uid: 9905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-19.5 parent: 4812 - uid: 9906 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-18.5 parent: 4812 - uid: 9907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-17.5 parent: 4812 - uid: 9908 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-16.5 parent: 4812 - uid: 9939 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -55.5,-21.5 parent: 4812 - uid: 9940 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-21.5 parent: 4812 - uid: 9941 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -53.5,-21.5 parent: 4812 - uid: 9942 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -52.5,-21.5 parent: 4812 - uid: 9943 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -51.5,-21.5 parent: 4812 - uid: 9944 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-21.5 parent: 4812 - uid: 9945 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-21.5 parent: 4812 - uid: 9946 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-21.5 parent: 4812 - uid: 9947 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-21.5 parent: 4812 - uid: 9948 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-21.5 parent: 4812 - uid: 9949 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-16.5 parent: 4812 - uid: 9950 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-17.5 parent: 4812 - uid: 9951 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-18.5 parent: 4812 - uid: 9952 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-18.5 parent: 4812 - uid: 9953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -48.5,-18.5 parent: 4812 - uid: 9954 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-18.5 parent: 4812 - uid: 9955 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-19.5 parent: 4812 - uid: 9956 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-20.5 parent: 4812 - uid: 9957 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -46.5,-19.5 parent: 4812 - uid: 10635 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-10.5 parent: 4812 - uid: 10964 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-37.5 parent: 4812 - uid: 10989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-41.5 parent: 4812 - uid: 11006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-40.5 parent: 4812 - uid: 11007 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-39.5 parent: 4812 - uid: 11008 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-38.5 parent: 4812 - uid: 11030 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-42.5 parent: 4812 - uid: 11031 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-43.5 parent: 4812 - uid: 11032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-43.5 parent: 4812 - uid: 11033 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-43.5 parent: 4812 - uid: 11034 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-43.5 parent: 4812 - uid: 11035 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-44.5 parent: 4812 - uid: 11036 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-45.5 parent: 4812 - uid: 11037 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-45.5 parent: 4812 - uid: 11038 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-45.5 parent: 4812 - uid: 11039 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-45.5 parent: 4812 - uid: 11040 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-45.5 parent: 4812 - uid: 11041 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-45.5 parent: 4812 - uid: 11042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-43.5 parent: 4812 - uid: 11043 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-44.5 parent: 4812 - uid: 11044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-43.5 parent: 4812 - uid: 11045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-43.5 parent: 4812 - uid: 11046 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-43.5 parent: 4812 - uid: 11110 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-43.5 parent: 4812 - uid: 11111 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-42.5 parent: 4812 - uid: 11112 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-41.5 parent: 4812 - uid: 11113 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-40.5 parent: 4812 - uid: 11114 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-39.5 parent: 4812 - uid: 11115 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-38.5 parent: 4812 - uid: 11116 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-37.5 parent: 4812 - uid: 11117 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-36.5 parent: 4812 - uid: 11118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-35.5 parent: 4812 - uid: 11119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-30.5 parent: 4812 - uid: 11120 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-31.5 parent: 4812 - uid: 11125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-39.5 parent: 4812 - uid: 11128 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-39.5 parent: 4812 - uid: 11131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-39.5 parent: 4812 - uid: 11132 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-37.5 parent: 4812 - uid: 11133 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-37.5 parent: 4812 - uid: 11134 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-38.5 parent: 4812 - uid: 11135 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-35.5 parent: 4812 - uid: 11136 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-38.5 parent: 4812 - uid: 11137 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-38.5 parent: 4812 - uid: 11138 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-37.5 parent: 4812 - uid: 11140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-37.5 parent: 4812 - uid: 11142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-39.5 parent: 4812 - uid: 11263 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-37.5 parent: 4812 - uid: 11264 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-37.5 parent: 4812 - uid: 11265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-36.5 parent: 4812 - uid: 11340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-35.5 parent: 4812 - uid: 11341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-34.5 parent: 4812 - uid: 11342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 38.5,-33.5 parent: 4812 - uid: 11344 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-31.5 parent: 4812 - uid: 11345 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-31.5 parent: 4812 - uid: 11371 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-39.5 parent: 4812 - uid: 11372 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-40.5 parent: 4812 - uid: 11373 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-40.5 parent: 4812 - uid: 11374 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-40.5 parent: 4812 - uid: 11375 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-40.5 parent: 4812 - uid: 11376 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 31.5,-40.5 parent: 4812 - uid: 11377 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-40.5 parent: 4812 - uid: 11378 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-40.5 parent: 4812 - uid: 11379 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-39.5 parent: 4812 - uid: 11380 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-38.5 parent: 4812 - uid: 11381 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-37.5 parent: 4812 - uid: 11382 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 28.5,-37.5 parent: 4812 @@ -81092,4217 +76463,3013 @@ entities: entities: - uid: 1 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-9.5 parent: 4812 - uid: 2 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,-10.5 parent: 4812 - uid: 3 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-4.5 parent: 4812 - uid: 4 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-3.5 parent: 4812 - uid: 5 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,0.5 parent: 4812 - uid: 6 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,1.5 parent: 4812 - uid: 7 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,1.5 parent: 4812 - uid: 8 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,3.5 parent: 4812 - uid: 9 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,9.5 parent: 4812 - uid: 10 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,8.5 parent: 4812 - uid: 11 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,4.5 parent: 4812 - uid: 13 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,5.5 parent: 4812 - uid: 14 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,5.5 parent: 4812 - uid: 15 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,5.5 parent: 4812 - uid: 16 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,5.5 parent: 4812 - uid: 17 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,5.5 parent: 4812 - uid: 18 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,6.5 parent: 4812 - uid: 19 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,8.5 parent: 4812 - uid: 20 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,9.5 parent: 4812 - uid: 21 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,10.5 parent: 4812 - uid: 22 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,10.5 parent: 4812 - uid: 23 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,10.5 parent: 4812 - uid: 24 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,10.5 parent: 4812 - uid: 25 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,10.5 parent: 4812 - uid: 26 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,10.5 parent: 4812 - uid: 27 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,10.5 parent: 4812 - uid: 28 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,10.5 parent: 4812 - uid: 29 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,11.5 parent: 4812 - uid: 30 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,12.5 parent: 4812 - uid: 31 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,12.5 parent: 4812 - uid: 33 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,15.5 parent: 4812 - uid: 34 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,14.5 parent: 4812 - uid: 36 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,15.5 parent: 4812 - uid: 37 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,13.5 parent: 4812 - uid: 38 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 0.5,12.5 parent: 4812 - uid: 39 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,12.5 parent: 4812 - uid: 40 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,11.5 parent: 4812 - uid: 41 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,10.5 parent: 4812 - uid: 42 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-9.5 parent: 4812 - uid: 43 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-9.5 parent: 4812 - uid: 44 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-10.5 parent: 4812 - uid: 45 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-7.5 parent: 4812 - uid: 46 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-6.5 parent: 4812 - uid: 47 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,-5.5 parent: 4812 - uid: 48 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-10.5 parent: 4812 - uid: 49 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-9.5 parent: 4812 - uid: 50 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -5.5,-8.5 parent: 4812 - uid: 51 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-8.5 parent: 4812 - uid: 52 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-4.5 parent: 4812 - uid: 53 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-2.5 parent: 4812 - uid: 54 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,-1.5 parent: 4812 - uid: 55 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,0.5 parent: 4812 - uid: 56 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,1.5 parent: 4812 - uid: 57 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -6.5,2.5 parent: 4812 - uid: 58 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,2.5 parent: 4812 - uid: 59 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,10.5 parent: 4812 - uid: 60 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,10.5 parent: 4812 - uid: 61 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,10.5 parent: 4812 - uid: 62 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,10.5 parent: 4812 - uid: 63 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,9.5 parent: 4812 - uid: 64 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,8.5 parent: 4812 - uid: 65 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,7.5 parent: 4812 - uid: 66 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,6.5 parent: 4812 - uid: 67 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,5.5 parent: 4812 - uid: 68 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,4.5 parent: 4812 - uid: 69 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,3.5 parent: 4812 - uid: 70 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,2.5 parent: 4812 - uid: 71 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,1.5 parent: 4812 - uid: 72 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,0.5 parent: 4812 - uid: 73 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-0.5 parent: 4812 - uid: 74 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-1.5 parent: 4812 - uid: 75 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-2.5 parent: 4812 - uid: 76 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-2.5 parent: 4812 - uid: 77 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-2.5 parent: 4812 - uid: 78 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-2.5 parent: 4812 - uid: 79 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,-2.5 parent: 4812 - uid: 80 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,2.5 parent: 4812 - uid: 81 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -10.5,2.5 parent: 4812 - uid: 82 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-0.5 parent: 4812 - uid: 83 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,0.5 parent: 4812 - uid: 84 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,1.5 parent: 4812 - uid: 85 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,1.5 parent: 4812 - uid: 86 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,1.5 parent: 4812 - uid: 87 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,1.5 parent: 4812 - uid: 88 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-2.5 parent: 4812 - uid: 89 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-3.5 parent: 4812 - uid: 90 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-4.5 parent: 4812 - uid: 91 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-4.5 parent: 4812 - uid: 92 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-4.5 parent: 4812 - uid: 93 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-4.5 parent: 4812 - uid: 94 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-4.5 parent: 4812 - uid: 95 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-4.5 parent: 4812 - uid: 96 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-7.5 parent: 4812 - uid: 97 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-7.5 parent: 4812 - uid: 98 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-7.5 parent: 4812 - uid: 99 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-8.5 parent: 4812 - uid: 100 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-8.5 parent: 4812 - uid: 101 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-8.5 parent: 4812 - uid: 102 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-8.5 parent: 4812 - uid: 103 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-8.5 parent: 4812 - uid: 104 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-7.5 parent: 4812 - uid: 105 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-5.5 parent: 4812 - uid: 139 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-10.5 parent: 4812 - uid: 140 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-10.5 parent: 4812 - uid: 141 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-10.5 parent: 4812 - uid: 142 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-10.5 parent: 4812 - uid: 143 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-10.5 parent: 4812 - uid: 145 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,-10.5 parent: 4812 - uid: 146 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-10.5 parent: 4812 - uid: 147 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-9.5 parent: 4812 - uid: 148 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-8.5 parent: 4812 - uid: 149 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-7.5 parent: 4812 - uid: 150 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-6.5 parent: 4812 - uid: 151 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-5.5 parent: 4812 - uid: 152 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-4.5 parent: 4812 - uid: 153 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-3.5 parent: 4812 - uid: 154 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-2.5 parent: 4812 - uid: 155 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-1.5 parent: 4812 - uid: 156 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-0.5 parent: 4812 - uid: 157 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,0.5 parent: 4812 - uid: 158 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,1.5 parent: 4812 - uid: 159 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,2.5 parent: 4812 - uid: 161 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,4.5 parent: 4812 - uid: 162 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,5.5 parent: 4812 - uid: 163 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,6.5 parent: 4812 - uid: 164 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,7.5 parent: 4812 - uid: 165 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,8.5 parent: 4812 - uid: 166 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,9.5 parent: 4812 - uid: 167 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,10.5 parent: 4812 - uid: 168 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,11.5 parent: 4812 - uid: 169 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,12.5 parent: 4812 - uid: 177 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,13.5 parent: 4812 - uid: 180 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,15.5 parent: 4812 - uid: 181 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,18.5 parent: 4812 - uid: 182 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,17.5 parent: 4812 - uid: 183 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,18.5 parent: 4812 - uid: 185 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,18.5 parent: 4812 - uid: 186 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,12.5 parent: 4812 - uid: 189 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,7.5 parent: 4812 - uid: 190 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,6.5 parent: 4812 - uid: 191 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,6.5 parent: 4812 - uid: 192 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,6.5 parent: 4812 - uid: 193 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,6.5 parent: 4812 - uid: 194 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,5.5 parent: 4812 - uid: 195 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-1.5 parent: 4812 - uid: 196 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-2.5 parent: 4812 - uid: 197 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-2.5 parent: 4812 - uid: 198 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-3.5 parent: 4812 - uid: 199 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-5.5 parent: 4812 - uid: 200 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-6.5 parent: 4812 - uid: 201 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-5.5 parent: 4812 - uid: 202 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-7.5 parent: 4812 - uid: 203 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-8.5 parent: 4812 - uid: 204 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-9.5 parent: 4812 - uid: 205 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-10.5 parent: 4812 - uid: 206 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-10.5 parent: 4812 - uid: 207 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-10.5 parent: 4812 - uid: 208 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-10.5 parent: 4812 - uid: 209 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-10.5 parent: 4812 - uid: 210 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-10.5 parent: 4812 - uid: 211 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-10.5 parent: 4812 - uid: 212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-10.5 parent: 4812 - uid: 213 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-10.5 parent: 4812 - uid: 214 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-10.5 parent: 4812 - uid: 225 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-9.5 parent: 4812 - uid: 226 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-8.5 parent: 4812 - uid: 227 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-7.5 parent: 4812 - uid: 228 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-6.5 parent: 4812 - uid: 229 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-5.5 parent: 4812 - uid: 230 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-5.5 parent: 4812 - uid: 231 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-5.5 parent: 4812 - uid: 232 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-4.5 parent: 4812 - uid: 233 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -8.5,-4.5 parent: 4812 - uid: 234 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -9.5,-4.5 parent: 4812 - uid: 235 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-4.5 parent: 4812 - uid: 236 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-4.5 parent: 4812 - uid: 237 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-4.5 parent: 4812 - uid: 238 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-4.5 parent: 4812 - uid: 239 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-4.5 parent: 4812 - uid: 240 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-4.5 parent: 4812 - uid: 241 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-4.5 parent: 4812 - uid: 242 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-4.5 parent: 4812 - uid: 243 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-4.5 parent: 4812 - uid: 244 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-2.5 parent: 4812 - uid: 245 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-2.5 parent: 4812 - uid: 246 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-2.5 parent: 4812 - uid: 247 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-2.5 parent: 4812 - uid: 248 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-2.5 parent: 4812 - uid: 249 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-2.5 parent: 4812 - uid: 250 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-2.5 parent: 4812 - uid: 262 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,6.5 parent: 4812 - uid: 263 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,6.5 parent: 4812 - uid: 264 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,6.5 parent: 4812 - uid: 265 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,6.5 parent: 4812 - uid: 266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,6.5 parent: 4812 - uid: 267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,6.5 parent: 4812 - uid: 268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,6.5 parent: 4812 - uid: 269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,6.5 parent: 4812 - uid: 270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,3.5 parent: 4812 - uid: 271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,4.5 parent: 4812 - uid: 272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,5.5 parent: 4812 - uid: 273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,3.5 parent: 4812 - uid: 274 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,3.5 parent: 4812 - uid: 275 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,4.5 parent: 4812 - uid: 276 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,5.5 parent: 4812 - uid: 279 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-1.5 parent: 4812 - uid: 280 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-0.5 parent: 4812 - uid: 281 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,0.5 parent: 4812 - uid: 282 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,0.5 parent: 4812 - uid: 283 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-1.5 parent: 4812 - uid: 284 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-0.5 parent: 4812 - uid: 285 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,0.5 parent: 4812 - uid: 286 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,7.5 parent: 4812 - uid: 287 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,8.5 parent: 4812 - uid: 288 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,9.5 parent: 4812 - uid: 289 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,11.5 parent: 4812 - uid: 290 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,12.5 parent: 4812 - uid: 291 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,13.5 parent: 4812 - uid: 292 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,13.5 parent: 4812 - uid: 293 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,13.5 parent: 4812 - uid: 294 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,13.5 parent: 4812 - uid: 295 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,13.5 parent: 4812 - uid: 296 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,13.5 parent: 4812 - uid: 318 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 1.5,4.5 parent: 4812 - uid: 429 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,9.5 parent: 4812 - uid: 898 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,7.5 parent: 4812 - uid: 899 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,8.5 parent: 4812 - uid: 900 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,9.5 parent: 4812 - uid: 1253 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,1.5 parent: 4812 - uid: 1917 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,29.5 parent: 4812 - uid: 1918 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 9.5,27.5 parent: 4812 - uid: 1919 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,27.5 parent: 4812 - uid: 1978 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,26.5 parent: 4812 - uid: 1979 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,26.5 parent: 4812 - uid: 1980 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,25.5 parent: 4812 - uid: 1981 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,27.5 parent: 4812 - uid: 1982 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,29.5 parent: 4812 - uid: 2738 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,21.5 parent: 4812 - uid: 2739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,22.5 parent: 4812 - uid: 2740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,23.5 parent: 4812 - uid: 2742 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,25.5 parent: 4812 - uid: 2743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,26.5 parent: 4812 - uid: 2744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,27.5 parent: 4812 - uid: 2745 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,28.5 parent: 4812 - uid: 2788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,16.5 parent: 4812 - uid: 2789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,18.5 parent: 4812 - uid: 2790 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,16.5 parent: 4812 - uid: 2791 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,16.5 parent: 4812 - uid: 2792 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,12.5 parent: 4812 - uid: 2793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,12.5 parent: 4812 - uid: 2794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,12.5 parent: 4812 - uid: 2795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,12.5 parent: 4812 - uid: 2796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,12.5 parent: 4812 - uid: 2797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,12.5 parent: 4812 - uid: 2798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,12.5 parent: 4812 - uid: 2799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,12.5 parent: 4812 - uid: 2800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,12.5 parent: 4812 - uid: 2851 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,22.5 parent: 4812 - uid: 3348 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,11.5 parent: 4812 - uid: 3351 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,11.5 parent: 4812 - uid: 3354 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,9.5 parent: 4812 - uid: 3435 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,33.5 parent: 4812 - uid: 3462 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,34.5 parent: 4812 - uid: 3463 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,33.5 parent: 4812 - uid: 3474 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,44.5 parent: 4812 - uid: 3475 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,41.5 parent: 4812 - uid: 3476 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,40.5 parent: 4812 - uid: 3980 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,37.5 parent: 4812 - uid: 3981 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,33.5 parent: 4812 - uid: 3983 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,8.5 parent: 4812 - uid: 3984 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,6.5 parent: 4812 - uid: 3985 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,5.5 parent: 4812 - uid: 3986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,9.5 parent: 4812 - uid: 3987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,9.5 parent: 4812 - uid: 3988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,9.5 parent: 4812 - uid: 3989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,9.5 parent: 4812 - uid: 4006 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,5.5 parent: 4812 - uid: 4013 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-31.5 parent: 4812 - uid: 4014 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -43.5,-31.5 parent: 4812 - uid: 4015 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,3.5 parent: 4812 - uid: 4016 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,1.5 parent: 4812 - uid: 4017 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,1.5 parent: 4812 - uid: 4018 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,0.5 parent: 4812 - uid: 4019 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,0.5 parent: 4812 - uid: 4020 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,0.5 parent: 4812 - uid: 4021 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,0.5 parent: 4812 - uid: 4022 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,1.5 parent: 4812 - uid: 4023 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,2.5 parent: 4812 - uid: 4024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,3.5 parent: 4812 - uid: 4025 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,4.5 parent: 4812 - uid: 4026 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,5.5 parent: 4812 - uid: 4027 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,5.5 parent: 4812 - uid: 4028 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,5.5 parent: 4812 - uid: 4029 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,5.5 parent: 4812 - uid: 4030 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,6.5 parent: 4812 - uid: 4031 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,7.5 parent: 4812 - uid: 4032 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,8.5 parent: 4812 - uid: 4033 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,2.5 parent: 4812 - uid: 4034 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,1.5 parent: 4812 - uid: 4035 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,0.5 parent: 4812 - uid: 4036 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-0.5 parent: 4812 - uid: 4037 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-1.5 parent: 4812 - uid: 4038 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-0.5 parent: 4812 - uid: 4039 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-1.5 parent: 4812 - uid: 4040 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-1.5 parent: 4812 - uid: 4041 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-1.5 parent: 4812 - uid: 4042 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-1.5 parent: 4812 - uid: 4043 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 19.5,-1.5 parent: 4812 - uid: 4044 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-1.5 parent: 4812 - uid: 4045 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-1.5 parent: 4812 - uid: 4046 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-1.5 parent: 4812 - uid: 4047 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-1.5 parent: 4812 - uid: 4049 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,0.5 parent: 4812 - uid: 4118 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-6.5 parent: 4812 - uid: 4119 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-5.5 parent: 4812 - uid: 4120 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,0.5 parent: 4812 - uid: 4121 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,1.5 parent: 4812 - uid: 4123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-4.5 parent: 4812 - uid: 4124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-4.5 parent: 4812 - uid: 4125 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-5.5 parent: 4812 - uid: 4126 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-5.5 parent: 4812 - uid: 4127 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-6.5 parent: 4812 - uid: 4128 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-5.5 parent: 4812 - uid: 4129 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-5.5 parent: 4812 - uid: 4130 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-4.5 parent: 4812 - uid: 4131 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 15.5,-4.5 parent: 4812 - uid: 4132 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-6.5 parent: 4812 - uid: 4133 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-10.5 parent: 4812 - uid: 4649 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-14.5 parent: 4812 - uid: 4650 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-14.5 parent: 4812 - uid: 4651 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-20.5 parent: 4812 - uid: 4652 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -1.5,-20.5 parent: 4812 - uid: 4653 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -2.5,-20.5 parent: 4812 - uid: 4654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -3.5,-20.5 parent: 4812 - uid: 4655 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-20.5 parent: 4812 - uid: 4717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-26.5 parent: 4812 - uid: 4756 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-28.5 parent: 4812 - uid: 4757 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-29.5 parent: 4812 - uid: 4783 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-35.5 parent: 4812 - uid: 4784 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-34.5 parent: 4812 - uid: 4785 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-33.5 parent: 4812 - uid: 4786 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 2.5,-33.5 parent: 4812 - uid: 4787 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -0.5,-33.5 parent: 4812 - uid: 4788 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -4.5,-33.5 parent: 4812 - uid: 4793 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-33.5 parent: 4812 - uid: 4794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-33.5 parent: 4812 - uid: 4795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-36.5 parent: 4812 - uid: 4797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-29.5 parent: 4812 - uid: 4814 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-28.5 parent: 4812 - uid: 4916 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-24.5 parent: 4812 - uid: 4918 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-25.5 parent: 4812 - uid: 4919 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-26.5 parent: 4812 - uid: 4922 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-28.5 parent: 4812 - uid: 4937 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-29.5 parent: 4812 - uid: 5024 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-19.5 parent: 4812 - uid: 5050 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-25.5 parent: 4812 - uid: 5333 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-13.5 parent: 4812 - uid: 5334 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-14.5 parent: 4812 - uid: 5335 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-13.5 parent: 4812 - uid: 5338 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-19.5 parent: 4812 - uid: 5339 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-19.5 parent: 4812 - uid: 5340 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-18.5 parent: 4812 - uid: 5341 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-16.5 parent: 4812 - uid: 5342 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-15.5 parent: 4812 - uid: 5390 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-13.5 parent: 4812 - uid: 5425 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-19.5 parent: 4812 - uid: 5426 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-19.5 parent: 4812 - uid: 5427 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-19.5 parent: 4812 - uid: 5430 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-14.5 parent: 4812 - uid: 5457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-27.5 parent: 4812 - uid: 5465 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-22.5 parent: 4812 - uid: 5466 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-22.5 parent: 4812 - uid: 5467 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-22.5 parent: 4812 - uid: 5468 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-27.5 parent: 4812 - uid: 5562 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-23.5 parent: 4812 - uid: 5563 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-27.5 parent: 4812 - uid: 5567 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-28.5 parent: 4812 - uid: 5619 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-16.5 parent: 4812 - uid: 5620 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 8.5,-18.5 parent: 4812 - uid: 5836 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-32.5 parent: 4812 - uid: 5837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 3.5,-31.5 parent: 4812 - uid: 6498 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-12.5 parent: 4812 - uid: 6501 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-13.5 parent: 4812 - uid: 6502 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-13.5 parent: 4812 - uid: 6503 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-13.5 parent: 4812 - uid: 6504 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-13.5 parent: 4812 - uid: 6505 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-14.5 parent: 4812 - uid: 6506 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-15.5 parent: 4812 - uid: 6507 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-16.5 parent: 4812 - uid: 6508 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-17.5 parent: 4812 - uid: 6509 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-18.5 parent: 4812 - uid: 6510 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-19.5 parent: 4812 - uid: 6511 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-20.5 parent: 4812 - uid: 6512 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-21.5 parent: 4812 - uid: 6513 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-21.5 parent: 4812 - uid: 6514 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-21.5 parent: 4812 - uid: 6515 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-21.5 parent: 4812 - uid: 6516 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-21.5 parent: 4812 - uid: 6517 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-21.5 parent: 4812 - uid: 6518 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-21.5 parent: 4812 - uid: 6520 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-21.5 parent: 4812 - uid: 6521 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-20.5 parent: 4812 - uid: 6522 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-20.5 parent: 4812 - uid: 6523 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-22.5 parent: 4812 - uid: 6524 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-23.5 parent: 4812 - uid: 6525 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-24.5 parent: 4812 - uid: 6526 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-24.5 parent: 4812 - uid: 6527 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-24.5 parent: 4812 - uid: 6528 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-24.5 parent: 4812 - uid: 6529 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-24.5 parent: 4812 - uid: 6530 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-23.5 parent: 4812 - uid: 6531 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-22.5 parent: 4812 - uid: 6532 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-21.5 parent: 4812 - uid: 6533 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-20.5 parent: 4812 - uid: 6534 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-19.5 parent: 4812 - uid: 6535 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-18.5 parent: 4812 - uid: 6536 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-17.5 parent: 4812 - uid: 6537 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-16.5 parent: 4812 - uid: 6538 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-15.5 parent: 4812 - uid: 6539 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-14.5 parent: 4812 - uid: 6540 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-13.5 parent: 4812 - uid: 6541 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-13.5 parent: 4812 - uid: 6542 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-13.5 parent: 4812 - uid: 6543 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -30.5,-13.5 parent: 4812 - uid: 6544 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-13.5 parent: 4812 - uid: 6545 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-20.5 parent: 4812 - uid: 6549 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-13.5 parent: 4812 - uid: 6654 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-24.5 parent: 4812 - uid: 6683 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-24.5 parent: 4812 - uid: 6711 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-37.5 parent: 4812 - uid: 6712 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-37.5 parent: 4812 - uid: 6713 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-38.5 parent: 4812 - uid: 6714 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-39.5 parent: 4812 - uid: 6715 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-38.5 parent: 4812 - uid: 6716 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-38.5 parent: 4812 - uid: 6717 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-38.5 parent: 4812 - uid: 6718 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-38.5 parent: 4812 - uid: 6719 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-37.5 parent: 4812 - uid: 6720 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-36.5 parent: 4812 - uid: 6721 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-35.5 parent: 4812 - uid: 6722 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-34.5 parent: 4812 - uid: 6723 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-35.5 parent: 4812 - uid: 6724 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-34.5 parent: 4812 - uid: 6725 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-33.5 parent: 4812 - uid: 6726 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-32.5 parent: 4812 - uid: 6727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-34.5 parent: 4812 - uid: 6728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-34.5 parent: 4812 - uid: 6729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -24.5,-33.5 parent: 4812 - uid: 6730 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-34.5 parent: 4812 - uid: 6731 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-34.5 parent: 4812 - uid: 6732 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-33.5 parent: 4812 - uid: 6733 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-32.5 parent: 4812 - uid: 6734 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-31.5 parent: 4812 - uid: 6739 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-32.5 parent: 4812 - uid: 6740 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-33.5 parent: 4812 - uid: 6741 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-33.5 parent: 4812 - uid: 6742 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-32.5 parent: 4812 - uid: 6743 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-31.5 parent: 4812 - uid: 6744 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-31.5 parent: 4812 - uid: 6745 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-31.5 parent: 4812 - uid: 6746 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-31.5 parent: 4812 - uid: 6747 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-32.5 parent: 4812 - uid: 6748 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-31.5 parent: 4812 - uid: 6749 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-31.5 parent: 4812 - uid: 6750 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-31.5 parent: 4812 - uid: 6751 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-31.5 parent: 4812 - uid: 6752 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-31.5 parent: 4812 - uid: 6753 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-31.5 parent: 4812 - uid: 6766 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -12.5,-29.5 parent: 4812 - uid: 6767 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-29.5 parent: 4812 - uid: 6768 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-29.5 parent: 4812 - uid: 6769 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-29.5 parent: 4812 - uid: 6770 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-29.5 parent: 4812 - uid: 6771 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-29.5 parent: 4812 - uid: 6772 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-29.5 parent: 4812 - uid: 6773 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-29.5 parent: 4812 - uid: 6774 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-29.5 parent: 4812 - uid: 6775 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-29.5 parent: 4812 - uid: 6776 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -22.5,-29.5 parent: 4812 - uid: 6789 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,-22.5 parent: 4812 - uid: 7060 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,-19.5 parent: 4812 - uid: 7063 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-15.5 parent: 4812 - uid: 7184 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-23.5 parent: 4812 - uid: 7185 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-24.5 parent: 4812 - uid: 7187 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,-31.5 parent: 4812 - uid: 7194 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -23.5,-27.5 parent: 4812 - uid: 7195 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -7.5,-28.5 parent: 4812 - uid: 7212 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-24.5 parent: 4812 - uid: 7213 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-24.5 parent: 4812 - uid: 7215 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-25.5 parent: 4812 - uid: 7217 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-27.5 parent: 4812 - uid: 7218 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -11.5,-28.5 parent: 4812 - uid: 7235 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -18.5,-19.5 parent: 4812 - uid: 7246 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-18.5 parent: 4812 - uid: 7314 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-25.5 parent: 4812 - uid: 7315 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -44.5,-25.5 parent: 4812 - uid: 7317 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-29.5 parent: 4812 - uid: 7318 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-31.5 parent: 4812 - uid: 7319 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -17.5,-14.5 parent: 4812 - uid: 7320 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -16.5,-14.5 parent: 4812 - uid: 7321 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-14.5 parent: 4812 - uid: 7322 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,-14.5 parent: 4812 - uid: 7727 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,18.5 parent: 4812 - uid: 7728 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,18.5 parent: 4812 - uid: 7729 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -27.5,18.5 parent: 4812 - uid: 7953 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,7.5 parent: 4812 - uid: 8162 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,26.5 parent: 4812 - uid: 8163 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,26.5 parent: 4812 - uid: 8164 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -20.5,28.5 parent: 4812 - uid: 8456 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,37.5 parent: 4812 - uid: 8457 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -26.5,37.5 parent: 4812 - uid: 8833 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-37.5 parent: 4812 - uid: 8834 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-34.5 parent: 4812 - uid: 8835 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-34.5 parent: 4812 - uid: 8837 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-32.5 parent: 4812 - uid: 8840 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-40.5 parent: 4812 - uid: 8852 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-28.5 parent: 4812 - uid: 8854 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-26.5 parent: 4812 - uid: 8855 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-26.5 parent: 4812 - uid: 8856 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-26.5 parent: 4812 - uid: 8857 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-26.5 parent: 4812 - uid: 8903 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-26.5 parent: 4812 - uid: 8904 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-27.5 parent: 4812 - uid: 8905 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-25.5 parent: 4812 - uid: 8907 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-23.5 parent: 4812 - uid: 9968 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-29.5 parent: 4812 - uid: 9969 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-30.5 parent: 4812 - uid: 9970 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-30.5 parent: 4812 - uid: 9973 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-30.5 parent: 4812 - uid: 9985 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-22.5 parent: 4812 - uid: 9986 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-21.5 parent: 4812 - uid: 9987 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-25.5 parent: 4812 - uid: 9988 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-24.5 parent: 4812 - uid: 9989 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-23.5 parent: 4812 - uid: 9994 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -38.5,-21.5 parent: 4812 - uid: 10153 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -54.5,-23.5 parent: 4812 - uid: 10155 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -49.5,-23.5 parent: 4812 - uid: 10156 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -50.5,-23.5 parent: 4812 - uid: 10224 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-22.5 parent: 4812 - uid: 10404 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -47.5,-28.5 parent: 4812 - uid: 10613 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-24.5 parent: 4812 - uid: 10614 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-23.5 parent: 4812 - uid: 11049 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-39.5 parent: 4812 - uid: 11050 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-39.5 parent: 4812 - uid: 11051 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-39.5 parent: 4812 - uid: 11052 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-39.5 parent: 4812 - uid: 11053 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-35.5 parent: 4812 - uid: 11054 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-35.5 parent: 4812 - uid: 11055 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-35.5 parent: 4812 - uid: 11056 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-35.5 parent: 4812 - uid: 11057 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 7.5,-31.5 parent: 4812 - uid: 11058 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 6.5,-31.5 parent: 4812 - uid: 11059 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 5.5,-31.5 parent: 4812 - uid: 11060 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 4.5,-31.5 parent: 4812 - uid: 11061 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-35.5 parent: 4812 - uid: 11062 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-35.5 parent: 4812 - uid: 11063 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-35.5 parent: 4812 - uid: 11064 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-35.5 parent: 4812 - uid: 11066 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 10.5,-39.5 parent: 4812 - uid: 11067 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 11.5,-39.5 parent: 4812 - uid: 11068 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 12.5,-39.5 parent: 4812 - uid: 11069 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 13.5,-39.5 parent: 4812 - uid: 11070 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 14.5,-39.5 parent: 4812 - uid: 11121 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-35.5 parent: 4812 - uid: 11122 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 36.5,-35.5 parent: 4812 - uid: 11123 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-35.5 parent: 4812 - uid: 11124 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-35.5 parent: 4812 - uid: 11266 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-36.5 parent: 4812 - uid: 11267 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-35.5 parent: 4812 - uid: 11268 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 22.5,-35.5 parent: 4812 - uid: 11269 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 21.5,-35.5 parent: 4812 - uid: 11270 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 20.5,-35.5 parent: 4812 - uid: 11271 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 18.5,-35.5 parent: 4812 - uid: 11272 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 17.5,-35.5 parent: 4812 - uid: 11273 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 16.5,-35.5 parent: 4812 - uid: 11302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 27.5,-34.5 parent: 4812 - uid: 11303 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 26.5,-34.5 parent: 4812 - uid: 11304 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 23.5,-34.5 parent: 4812 - uid: 11305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 24.5,-34.5 parent: 4812 - uid: 11348 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-33.5 parent: 4812 - uid: 11349 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-32.5 parent: 4812 - uid: 11366 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-38.5 parent: 4812 - uid: 11367 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 35.5,-37.5 parent: 4812 - uid: 11368 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 33.5,-35.5 parent: 4812 - uid: 11369 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 32.5,-35.5 parent: 4812 - uid: 11370 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-36.5 parent: 4812 - uid: 11383 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 29.5,-35.5 parent: 4812 - uid: 11384 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-35.5 parent: 4812 - uid: 11385 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 34.5,-37.5 parent: 4812 - uid: 11389 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 30.5,-37.5 parent: 4812 - uid: 11475 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 5.5,3.5 parent: 4812 - uid: 11646 components: - - type: MetaData - flags: PvsPriority - type: Transform rot: -1.5707963267948966 rad pos: 6.5,3.5 parent: 4812 - uid: 11706 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: 37.5,-42.5 parent: 4812 - uid: 11794 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -15.5,1.5 parent: 4812 - uid: 11795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,1.5 parent: 4812 - uid: 11796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,1.5 parent: 4812 - uid: 11797 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,0.5 parent: 4812 - uid: 11798 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-0.5 parent: 4812 - uid: 11799 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-1.5 parent: 4812 - uid: 11800 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,-2.5 parent: 4812 - uid: 11801 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -14.5,-2.5 parent: 4812 - uid: 11848 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -13.5,12.5 parent: 4812 @@ -85310,148 +79477,106 @@ entities: entities: - uid: 7302 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-29.5 parent: 4812 - uid: 7305 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -41.5,-26.5 parent: 4812 - uid: 7312 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-25.5 parent: 4812 - uid: 7313 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -42.5,-30.5 parent: 4812 - uid: 7316 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -45.5,-25.5 parent: 4812 - uid: 7335 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -25.5,-31.5 parent: 4812 - uid: 7350 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -29.5,-33.5 parent: 4812 - uid: 7351 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -28.5,-32.5 parent: 4812 - uid: 7353 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -33.5,-30.5 parent: 4812 - uid: 7354 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -32.5,-30.5 parent: 4812 - uid: 7355 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-29.5 parent: 4812 - uid: 7356 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -31.5,-27.5 parent: 4812 - uid: 7357 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-30.5 parent: 4812 - uid: 7358 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-28.5 parent: 4812 - uid: 7359 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -39.5,-24.5 parent: 4812 - uid: 7360 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-30.5 parent: 4812 - uid: 7361 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-30.5 parent: 4812 - uid: 7362 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -35.5,-22.5 parent: 4812 - uid: 7363 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -36.5,-21.5 parent: 4812 - uid: 7364 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -37.5,-21.5 parent: 4812 - uid: 7365 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -34.5,-13.5 parent: 4812 @@ -85880,8 +80005,6 @@ entities: - type: Transform pos: -53.5,7.5 parent: 4812 - - type: AtmosDevice - joinedGrid: 4812 - proto: WeaponCapacitorRecharger entities: - uid: 2515 @@ -86820,15 +80943,11 @@ entities: entities: - uid: 6795 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -19.5,-37.5 parent: 4812 - uid: 6796 components: - - type: MetaData - flags: PvsPriority - type: Transform pos: -21.5,-39.5 parent: 4812 @@ -86874,11 +80993,4 @@ entities: - type: Transform pos: 26.494213,-35.426273 parent: 4812 -- proto: YellowOxygenTankFilled - entities: - - uid: 11791 - components: - - type: Transform - pos: 19.452671,-32.41012 - parent: 4812 ... From 4cec8110b0112b37971d6bac2da3593dd014b61c Mon Sep 17 00:00:00 2001 From: Repo <47093363+Titian3@users.noreply.github.com> Date: Wed, 29 May 2024 02:02:15 +1200 Subject: [PATCH 079/112] Fix wall vending machines spawning items in walls. (#28279) * Find spawning of wall vending machines. * Review fixes --- .../VendingMachines/VendingMachineSystem.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 723b9de6267..63ec8f2c24b 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -19,6 +19,7 @@ using Content.Shared.Throwing; using Content.Shared.UserInterface; using Content.Shared.VendingMachines; +using Content.Shared.Wall; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Prototypes; @@ -39,6 +40,8 @@ public sealed class VendingMachineSystem : SharedVendingMachineSystem [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly SpeakOnUIClosedSystem _speakOnUIClosed = default!; + private const float WallVendEjectDistanceFromWall = 1f; + public override void Initialize() { base.Initialize(); @@ -384,7 +387,20 @@ private void EjectItem(EntityUid uid, VendingMachineComponent? vendComponent = n return; } - var ent = Spawn(vendComponent.NextItemToEject, Transform(uid).Coordinates); + // Default spawn coordinates + var spawnCoordinates = Transform(uid).Coordinates; + + //Make sure the wallvends spawn outside of the wall. + + if (TryComp(uid, out var wallMountComponent)) + { + + var offset = wallMountComponent.Direction.ToWorldVec() * WallVendEjectDistanceFromWall; + spawnCoordinates = spawnCoordinates.Offset(offset); + } + + var ent = Spawn(vendComponent.NextItemToEject, spawnCoordinates); + if (vendComponent.ThrowNextItem) { var range = vendComponent.NonLimitedEjectRange; From 691450974d16d4a723a1640dfcc2b33ac21d0bdb Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 28 May 2024 14:03:22 +0000 Subject: [PATCH 080/112] 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 4291972e775..1dcd2315575 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: FungiFellow - changes: - - message: Added Improvised Shotgun Shell Recipe - type: Add - id: 6131 - time: '2024-03-12T23:52:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25545 - author: NakataRin changes: - message: Skeletons can only spawn with 10 people on the server now. @@ -3867,3 +3860,10 @@ id: 6630 time: '2024-05-28T00:51:50.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28255 +- author: Repo + changes: + - message: NanoMed, wall vends will spawn items the correct direction. + type: Fix + id: 6631 + time: '2024-05-28T14:02:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28279 From 5172114dbbe4ca95ad54c57a2d7be3fa3700838c Mon Sep 17 00:00:00 2001 From: MilenVolf <63782763+MilenVolf@users.noreply.github.com> Date: Tue, 28 May 2024 17:23:05 +0300 Subject: [PATCH 081/112] Localize emergency shuttle's direction for announcements (#28340) Localize emergency shuttle direction --- Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs index e2b1ad32cd7..45397ede088 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.cs @@ -22,6 +22,7 @@ using Content.Shared.Database; using Content.Shared.DeviceNetwork; using Content.Shared.GameTicking; +using Content.Shared.Localizations; using Content.Shared.Shuttles.Components; using Content.Shared.Shuttles.Events; using Content.Shared.Tag; @@ -287,8 +288,9 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (TryComp(targetGrid.Value, out TransformComponent? targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); + var direction = ContentLocalizationManager.FormatDirection(angle.GetDir()); var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location)), playDefaultSound: false); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-docked", ("time", $"{_consoleAccumulator:0}"), ("direction", direction), ("location", location)), playDefaultSound: false); } // shuttle timers @@ -317,8 +319,9 @@ public void CallEmergencyShuttle(EntityUid stationUid, StationEmergencyShuttleCo if (TryComp(targetGrid.Value, out var targetXform)) { var angle = _dock.GetAngle(stationShuttle.EmergencyShuttle.Value, xform, targetGrid.Value, targetXform, xformQuery); + var direction = ContentLocalizationManager.FormatDirection(angle.GetDir()); var location = FormattedMessage.RemoveMarkup(_navMap.GetNearestBeaconString((stationShuttle.EmergencyShuttle.Value, xform))); - _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("time", $"{_consoleAccumulator:0}"), ("direction", angle.GetDir()), ("location", location)), playDefaultSound: false); + _chatSystem.DispatchStationAnnouncement(stationUid, Loc.GetString("emergency-shuttle-nearby", ("time", $"{_consoleAccumulator:0}"), ("direction", direction), ("location", location)), playDefaultSound: false); } _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle {ToPrettyString(stationUid)} unable to find a valid docking port for {ToPrettyString(stationUid)}"); From 5141a95ed2ba53a0e91131dd1654f5f6cb3b8515 Mon Sep 17 00:00:00 2001 From: S1rFl0 <49481675+S1rFl0@users.noreply.github.com> Date: Tue, 28 May 2024 16:43:12 +0200 Subject: [PATCH 082/112] Fix some grammar and spelling mistakes (#28350) Fix some wacky grammar and spelling mistakes --- .../Locale/en-US/interaction/interaction-popup-component.ftl | 2 +- .../Prototypes/Entities/Clothing/OuterClothing/softsuits.yml | 2 +- .../Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl index 4929b11b1cd..7db99c3d0ae 100644 --- a/Resources/Locale/en-US/interaction/interaction-popup-component.ftl +++ b/Resources/Locale/en-US/interaction/interaction-popup-component.ftl @@ -51,7 +51,7 @@ petting-failure-dragon = You raise your hand, but as {THE($target)} roars, you d petting-failure-hamster = You reach out to pet {THE($target)}, but {SUBJECT($target)} attempts to bite your finger and only your quick reflexes save you from an almost fatal injury. petting-failure-bear = You reach out to pet {THE($target)}, but {SUBJECT($target)} growls, making you think twice. petting-failure-monkey = You reach out to pet {THE($target)}, but {SUBJECT($target)} almost bites your fingers! -petting-failure-nymph = You reach out to pet {THE($target)}, but {POSS-ADJ($target)} moves their branches away. +petting-failure-nymph = You reach out to pet {THE($target)}, but {SUBJECT($target)} move their branches away. petting-failure-shadow = You're trying to pet {THE($target)}, but your hand passes through the cold darkness of his body. ## Petting silicons diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml index 58faf268470..9db1ea2216c 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/softsuits.yml @@ -37,7 +37,7 @@ parent: ClothingOuterEVASuitBase id: ClothingOuterSuitEmergency name: emergency EVA suit - description: An emergency EVA suit with a built-in helmet. It's horribly slow and lacking in temperature protection, but enough to bide you time from the harsh vaccuum of space. + description: An emergency EVA suit with a built-in helmet. It's horribly slow and lacking in temperature protection, but enough to buy you time from the harsh vaccuum of space. components: - type: Sprite sprite: Clothing/OuterClothing/Suits/eva_emergency.rsi diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml index a19ed1951e4..b8cd6b8b25e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Shotguns/shotguns.yml @@ -201,7 +201,7 @@ deconstructionTarget: null - type: entity - name: sawn-off shogun + name: sawn-off shotgun parent: WeaponShotgunSawn id: WeaponShotgunSawnEmpty description: Groovy! Uses .50 shotgun shells. From e4f1201b4c7869611f09e8e98b3fb94112b6c685 Mon Sep 17 00:00:00 2001 From: ShadowCommander <10494922+ShadowCommander@users.noreply.github.com> Date: Tue, 28 May 2024 07:59:13 -0700 Subject: [PATCH 083/112] Add pressure and temperature warning text to firelocks (#28341) --- Content.Server/Doors/Systems/FirelockSystem.cs | 2 +- .../Doors/Systems/SharedFirelockSystem.cs | 14 ++++++++++++++ .../Locale/en-US/atmos/firelock-component.ftl | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Content.Server/Doors/Systems/FirelockSystem.cs b/Content.Server/Doors/Systems/FirelockSystem.cs index e2b8b5829d1..c7da404fe88 100644 --- a/Content.Server/Doors/Systems/FirelockSystem.cs +++ b/Content.Server/Doors/Systems/FirelockSystem.cs @@ -69,7 +69,7 @@ public override void Update(float frameTime) && xformQuery.TryGetComponent(uid, out var xform) && appearanceQuery.TryGetComponent(uid, out var appearance)) { - var (fire, pressure) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); + var (pressure, fire) = CheckPressureAndFire(uid, firelock, xform, airtight, airtightQuery); _appearance.SetData(uid, DoorVisuals.ClosedLights, fire || pressure, appearance); firelock.Temperature = fire; firelock.Pressure = pressure; diff --git a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs index 47a29a4ba80..4afe26039ba 100644 --- a/Content.Shared/Doors/Systems/SharedFirelockSystem.cs +++ b/Content.Shared/Doors/Systems/SharedFirelockSystem.cs @@ -1,5 +1,6 @@ using Content.Shared.Access.Systems; using Content.Shared.Doors.Components; +using Content.Shared.Examine; using Content.Shared.Popups; using Content.Shared.Prying.Components; using Robust.Shared.Timing; @@ -26,6 +27,8 @@ public override void Initialize() // Visuals SubscribeLocalEvent(UpdateVisuals); SubscribeLocalEvent(UpdateVisuals); + + SubscribeLocalEvent(OnExamined); } public bool EmergencyPressureStop(EntityUid uid, FirelockComponent? firelock = null, DoorComponent? door = null) @@ -107,4 +110,15 @@ private void UpdateVisuals(EntityUid uid, } #endregion + + private void OnExamined(Entity ent, ref ExaminedEvent args) + { + using (args.PushGroup(nameof(FirelockComponent))) + { + if (ent.Comp.Pressure) + args.PushMarkup(Loc.GetString("firelock-component-examine-pressure-warning")); + if (ent.Comp.Temperature) + args.PushMarkup(Loc.GetString("firelock-component-examine-temperature-warning")); + } + } } diff --git a/Resources/Locale/en-US/atmos/firelock-component.ftl b/Resources/Locale/en-US/atmos/firelock-component.ftl index fc375183e97..81f7e58462a 100644 --- a/Resources/Locale/en-US/atmos/firelock-component.ftl +++ b/Resources/Locale/en-US/atmos/firelock-component.ftl @@ -1,2 +1,4 @@ firelock-component-is-holding-pressure-message = A gush of air blows in your face... Maybe you should reconsider. -firelock-component-is-holding-fire-message = A gush of warm air blows in your face... Maybe you should reconsider. \ No newline at end of file +firelock-component-is-holding-fire-message = A gush of warm air blows in your face... Maybe you should reconsider. +firelock-component-examine-pressure-warning = The [color=red]extreme pressure[/color] differential warning is active. +firelock-component-examine-temperature-warning = The [color=red]extreme temperature[/color] warning is active. From 4f14d9698b815c0e0b4816558d9f78057a46a04c Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 28 May 2024 15:00:19 +0000 Subject: [PATCH 084/112] 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 1dcd2315575..60412578e47 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: NakataRin - changes: - - message: Skeletons can only spawn with 10 people on the server now. - type: Tweak - id: 6132 - time: '2024-03-13T01:00:15.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26050 - author: SlamBamActionman changes: - message: Syndicate implanters can no longer be recycled. @@ -3867,3 +3860,10 @@ id: 6631 time: '2024-05-28T14:02:15.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28279 +- author: ShadowCommander + changes: + - message: Added pressure and temperature warnings to firelock examine text. + type: Add + id: 6632 + time: '2024-05-28T14:59:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28341 From bec21d443ffd6737fecf8612391466a7c38a0b4f Mon Sep 17 00:00:00 2001 From: lzk <124214523+lzk228@users.noreply.github.com> Date: Tue, 28 May 2024 17:01:19 +0200 Subject: [PATCH 085/112] Fix paper scrap layers + cleanup paper.yml (#28299) Fix paper scrap + cleanup paper.yml --- .../Entities/Objects/Misc/paper.yml | 46 ++++--------------- 1 file changed, 8 insertions(+), 38 deletions(-) diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 05a0b9d3455..1c8d8754884 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -79,9 +79,14 @@ description: 'A crumpled up piece of white paper.' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: scrap + - state: paper_words + map: ["enum.PaperVisualLayers.Writing"] + visible: false + - state: paper_stamp-generic + map: ["enum.PaperVisualLayers.Stamp"] + visible: false - type: entity name: office paper @@ -102,7 +107,6 @@ description: 'The readout of a device forgotten to time' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper_dotmatrix - state: paper_dotmatrix_words @@ -133,7 +137,6 @@ description: "A page of the captain's journal. In luxurious lavender." components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#e6e6fa" @@ -160,7 +163,6 @@ description: 'A single unit of bureaucracy.' components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#9ef5ff" @@ -190,7 +192,6 @@ description: A paper label designating a crate as containing a bounty. Selling a crate with this label will fulfill the bounty. components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#f7e574" @@ -230,7 +231,6 @@ escapeFormatting: false content: book-cnc-sheet - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: paper color: "#cccccc" @@ -254,18 +254,11 @@ id: PaperWritten noSpawn: true components: - - type: Paper - type: Sprite layers: # Changing it here is fine - if the PaperStatus key is actually added, # something happened, so that ought to override this either way. - state: paper_words - - type: ActivatableUI - key: enum.PaperUiKey.Key - - type: UserInterface - interfaces: - enum.PaperUiKey.Key: - type: PaperBoundUserInterface - type: entity parent: Paper @@ -274,7 +267,6 @@ components: - type: NukeCodePaper allNukesAvailable: true - - type: Paper - type: entity parent: NukeCodePaper @@ -346,7 +338,6 @@ suffix: Red components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#cc2323" @@ -358,7 +349,6 @@ suffix: Blue components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#355d99" @@ -370,7 +360,6 @@ suffix: Yellow components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#b38e3c" @@ -382,7 +371,6 @@ suffix: White components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-white - state: folder-base @@ -393,7 +381,6 @@ suffix: Grey components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#999999" @@ -405,7 +392,6 @@ suffix: Black components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#3f3f3f" @@ -417,7 +403,6 @@ suffix: Green components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-colormap color: "#43bc38" @@ -431,7 +416,6 @@ description: CentCom's miserable little pile of secrets! components: - type: Sprite - sprite: Objects/Misc/bureaucracy.rsi layers: - state: folder-centcom - state: folder-base @@ -514,15 +498,12 @@ - state: clipboard_over - type: Item sprite: Objects/Misc/cc-clipboard.rsi - size: Small - type: Clothing - slots: [belt] - quickEquip: false sprite: Objects/Misc/cc-clipboard.rsi - type: entity id: BoxFolderQmClipboard - parent: BoxFolderBase + parent: BoxFolderClipboard name: requisition digi-board description: A bulky electric clipboard, filled with shipping orders and financing details. With so many compromising documents, you ought to keep this safe. components: @@ -537,11 +518,6 @@ map: ["qm_clipboard_pen"] visible: false - state: qm_clipboard_over - - type: ContainerContainer - containers: - storagebase: !type:Container - ents: [] - pen_slot: !type:ContainerSlot {} - type: ItemSlots slots: pen_slot: @@ -554,18 +530,13 @@ sprite: Objects/Misc/qm_clipboard.rsi size: Normal - type: Clothing - slots: [belt] - quickEquip: false sprite: Objects/Misc/qm_clipboard.rsi - type: Storage grid: - 0,0,4,3 quickInsert: true - whitelist: - tags: - - Document - type: StorageFill - contents: [] #to override base folder fill + contents: [] #to override base clipboard fill - type: ItemMapper mapLayers: qm_clipboard_paper: @@ -587,7 +558,6 @@ enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: MeleeWeapon - wideAnimationRotation: 180 damage: types: Blunt: 10 From 229c3cd729e1e928961d6130f54e139f12a50b75 Mon Sep 17 00:00:00 2001 From: deltanedas <39013340+deltanedas@users.noreply.github.com> Date: Tue, 28 May 2024 15:35:08 +0000 Subject: [PATCH 086/112] missing nukies can be filled in by ghost roles (#28316) --- Content.Server/Antag/AntagSelectionSystem.cs | 12 +++++++-- .../Components/AntagSelectionComponent.cs | 1 + .../Entities/Markers/Spawners/ghost_roles.yml | 27 +++++++++++++++++++ Resources/Prototypes/GameRules/roundstart.yml | 8 +++--- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index a86611bedb3..b42831cbde8 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -205,16 +205,24 @@ public void ChooseAntags(Entity ent, IList /// Whether or not players should be picked to inhabit this antag or not. + /// If no players are left and is set, it will make a ghost role. /// [DataField] public bool PickPlayer = true; diff --git a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml index 25d1330d06b..7942d26f321 100644 --- a/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml +++ b/Resources/Prototypes/Entities/Markers/Spawners/ghost_roles.yml @@ -102,6 +102,33 @@ - sprite: Structures/Wallmounts/signs.rsi state: radiation +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsCommander + components: + - type: GhostRole + name: roles-antag-nuclear-operative-commander-name + description: roles-antag-nuclear-operative-commander-objective + +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsMedic + components: + - type: GhostRole + name: roles-antag-nuclear-operative-agent-name + description: roles-antag-nuclear-operative-agent-objective + +- type: entity + noSpawn: true + parent: SpawnPointLoneNukeOperative + id: SpawnPointNukeopsOperative + components: + - type: GhostRole + name: roles-antag-nuclear-operative-name + description: roles-antag-nuclear-operative-objective + - type: entity parent: MarkerBase id: SpawnPointGhostDragon diff --git a/Resources/Prototypes/GameRules/roundstart.yml b/Resources/Prototypes/GameRules/roundstart.yml index 57e59f10e21..93350163f68 100644 --- a/Resources/Prototypes/GameRules/roundstart.yml +++ b/Resources/Prototypes/GameRules/roundstart.yml @@ -90,8 +90,7 @@ definitions: - prefRoles: [ NukeopsCommander ] fallbackRoles: [ Nukeops, NukeopsMedic ] - max: 1 - playerRatio: 10 + spawnerPrototype: SpawnPointNukeopsCommander startingGear: SyndicateCommanderGearFull components: - type: NukeOperative @@ -107,8 +106,7 @@ prototype: NukeopsCommander - prefRoles: [ NukeopsMedic ] fallbackRoles: [ Nukeops, NukeopsCommander ] - max: 1 - playerRatio: 10 + spawnerPrototype: SpawnPointNukeopsMedic startingGear: SyndicateOperativeMedicFull components: - type: NukeOperative @@ -124,7 +122,7 @@ prototype: NukeopsMedic - prefRoles: [ Nukeops ] fallbackRoles: [ NukeopsCommander, NukeopsMedic ] - min: 0 + spawnerPrototype: SpawnPointNukeopsOperative max: 3 playerRatio: 10 startingGear: SyndicateOperativeGearFull From 1777eea9a42a8bdbc4a865327bb9ef3e10fe57de Mon Sep 17 00:00:00 2001 From: PJBot Date: Tue, 28 May 2024 15:36:14 +0000 Subject: [PATCH 087/112] 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 60412578e47..91fd512c01c 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,11 +1,4 @@ Entries: -- author: SlamBamActionman - changes: - - message: Syndicate implanters can no longer be recycled. - type: Tweak - id: 6133 - time: '2024-03-13T02:02:36.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/26047 - author: Gyrandola changes: - message: Adding Sky Blue carpets to tables no longer results in red carpet ones. @@ -3867,3 +3860,10 @@ id: 6632 time: '2024-05-28T14:59:13.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/28341 +- author: deltanedas + changes: + - message: Nukies will have ghost roles opened if not enough people can be picked. + type: Tweak + id: 6633 + time: '2024-05-28T15:35:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/28316 From eb3f27526bc8748a45c3f56de97a982747e51842 Mon Sep 17 00:00:00 2001 From: Repo <47093363+Titian3@users.noreply.github.com> Date: Wed, 29 May 2024 06:00:42 +1200 Subject: [PATCH 088/112] Fix late join & observe to de-admin admins. (#28319) --- Content.Client/Lobby/UI/ObserveWarningWindow.xaml | 5 +++-- .../Lobby/UI/ObserveWarningWindow.xaml.cs | 13 +++++++++++++ .../GameTicking/Commands/JoinGameCommand.cs | 11 +++++++++++ .../GameTicking/Commands/ObserveCommand.cs | 9 +++++++++ .../en-US/lobby/ui/observe-warning-window.ftl | 2 ++ 5 files changed, 38 insertions(+), 2 deletions(-) diff --git a/Content.Client/Lobby/UI/ObserveWarningWindow.xaml b/Content.Client/Lobby/UI/ObserveWarningWindow.xaml index 3fe8e83f57d..2feac5792a1 100644 --- a/Content.Client/Lobby/UI/ObserveWarningWindow.xaml +++ b/Content.Client/Lobby/UI/ObserveWarningWindow.xaml @@ -4,10 +4,11 @@