diff --git a/Content.Client/Access/IdCardSystem.cs b/Content.Client/Access/IdCardSystem.cs index fcf2bf57de..e0c02976f7 100644 --- a/Content.Client/Access/IdCardSystem.cs +++ b/Content.Client/Access/IdCardSystem.cs @@ -2,6 +2,4 @@ namespace Content.Client.Access; -public sealed class IdCardSystem : SharedIdCardSystem -{ -} +public sealed class IdCardSystem : SharedIdCardSystem; diff --git a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs index 73f18aec8d..c3fac8cb92 100644 --- a/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs +++ b/Content.Client/Access/UI/AgentIDCardBoundUserInterface.cs @@ -40,9 +40,9 @@ namespace Content.Client.Access.UI SendMessage(new AgentIDCardJobChangedMessage(newJob)); } - public void OnJobIconChanged(string newJobIcon) + public void OnJobIconChanged(string newJobIconId) { - SendMessage(new AgentIDCardJobIconChangedMessage(newJobIcon)); + SendMessage(new AgentIDCardJobIconChangedMessage(newJobIconId)); } /// @@ -57,7 +57,7 @@ namespace Content.Client.Access.UI _window.SetCurrentName(cast.CurrentName); _window.SetCurrentJob(cast.CurrentJob); - _window.SetAllowedIcons(cast.Icons); + _window.SetAllowedIcons(cast.Icons, cast.CurrentJobIconId); } protected override void Dispose(bool disposing) diff --git a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs index beca0c41ba..9a38c0c485 100644 --- a/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs +++ b/Content.Client/Access/UI/AgentIDCardWindow.xaml.cs @@ -38,7 +38,7 @@ namespace Content.Client.Access.UI JobLineEdit.OnFocusExit += e => OnJobChanged?.Invoke(e.Text); } - public void SetAllowedIcons(HashSet icons) + public void SetAllowedIcons(HashSet icons, string currentJobIconId) { IconGrid.DisposeAllChildren(); @@ -79,6 +79,10 @@ namespace Content.Client.Access.UI jobIconButton.AddChild(jobIconTexture); jobIconButton.OnPressed += _ => _bui.OnJobIconChanged(jobIcon.ID); IconGrid.AddChild(jobIconButton); + + if (jobIconId.Equals(currentJobIconId)) + jobIconButton.Pressed = true; + i++; } } diff --git a/Content.Client/Administration/Components/HeadstandComponent.cs b/Content.Client/Administration/Components/HeadstandComponent.cs index d95e74576b..a4e3bfc5aa 100644 --- a/Content.Client/Administration/Components/HeadstandComponent.cs +++ b/Content.Client/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Client/Administration/Components/KillSignComponent.cs b/Content.Client/Administration/Components/KillSignComponent.cs index 1cf47b93ff..91c44ef3f2 100644 --- a/Content.Client/Administration/Components/KillSignComponent.cs +++ b/Content.Client/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Client/Audio/Jukebox/JukeboxSystem.cs b/Content.Client/Audio/Jukebox/JukeboxSystem.cs index 53bde82a78..dd4a5bbb9b 100644 --- a/Content.Client/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Client/Audio/Jukebox/JukeboxSystem.cs @@ -11,6 +11,7 @@ public sealed class JukeboxSystem : SharedJukeboxSystem [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!; [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; public override void Initialize() { @@ -35,13 +36,10 @@ public sealed class JukeboxSystem : SharedJukeboxSystem var query = AllEntityQuery(); - while (query.MoveNext(out _, out var ui)) + while (query.MoveNext(out var uid, out _, out var ui)) { - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { + if (!_uiSystem.TryGetOpenUi((uid, ui), JukeboxUiKey.Key, out var bui)) continue; - } bui.PopulateMusic(); } @@ -49,15 +47,9 @@ public sealed class JukeboxSystem : SharedJukeboxSystem private void OnJukeboxAfterState(Entity ent, ref AfterAutoHandleStateEvent args) { - if (!TryComp(ent, out UserInterfaceComponent? ui)) + if (!_uiSystem.TryGetOpenUi(ent.Owner, JukeboxUiKey.Key, out var bui)) return; - if (!ui.OpenInterfaces.TryGetValue(JukeboxUiKey.Key, out var baseBui) || - baseBui is not JukeboxBoundUserInterface bui) - { - return; - } - bui.Reload(); } diff --git a/Content.Client/Clothing/ClientClothingSystem.cs b/Content.Client/Clothing/ClientClothingSystem.cs index 377bd3f2a7..438902c97b 100644 --- a/Content.Client/Clothing/ClientClothingSystem.cs +++ b/Content.Client/Clothing/ClientClothingSystem.cs @@ -11,6 +11,7 @@ using Content.Shared.Item; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.ResourceManagement; +using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.TypeSerializers.Implementations; using Robust.Shared.Utility; using static Robust.Client.GameObjects.SpriteComponent; @@ -53,6 +54,7 @@ public sealed class ClientClothingSystem : ClothingSystem }; [Dependency] private readonly IResourceCache _cache = default!; + [Dependency] private readonly ISerializationManager _serialization = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; public override void Initialize() @@ -272,6 +274,7 @@ public sealed class ClientClothingSystem : ClothingSystem // temporary, until layer draw depths get added. Basically: a layer with the key "slot" is being used as a // bookmark to determine where in the list of layers we should insert the clothing layers. bool slotLayerExists = sprite.LayerMapTryGet(slot, out var index); + var displacementData = inventory.Displacements.GetValueOrDefault(slot); // add the new layers foreach (var (key, layerData) in ev.Layers) @@ -311,10 +314,29 @@ public sealed class ClientClothingSystem : ClothingSystem // Sprite layer redactor when // Sprite "redactor" just a week away. if (slot == Jumpsuit) - layerData.Shader ??= "StencilDraw"; + layerData.Shader ??= inventory.JumpsuitShader; sprite.LayerSetData(index, layerData); layer.Offset += slotDef.Offset; + + if (displacementData != null) + { + var displacementKey = $"{key}-displacement"; + if (!revealedLayers.Add(displacementKey)) + { + Log.Warning($"Duplicate key for clothing visuals DISPLACEMENT: {displacementKey}."); + continue; + } + + var displacementLayer = _serialization.CreateCopy(displacementData.Layer, notNullableOverride: true); + displacementLayer.CopyToShaderParameters!.LayerKey = key; + + // Add before main layer for this item. + sprite.AddLayer(displacementLayer, index); + sprite.LayerMapSet(displacementKey, index); + + revealedLayers.Add(displacementKey); + } } RaiseLocalEvent(equipment, new EquipmentVisualsUpdatedEvent(equipee, slot, revealedLayers), true); diff --git a/Content.Client/Extinguisher/FireExtinguisherComponent.cs b/Content.Client/Extinguisher/FireExtinguisherComponent.cs index 126c172924..324b05a93d 100644 --- a/Content.Client/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Client/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Client.Extinguisher; -[NetworkedComponent, RegisterComponent] -public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent -{ -} +[RegisterComponent] +public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent; diff --git a/Content.Client/GameTicking/Managers/ClientGameTicker.cs b/Content.Client/GameTicking/Managers/ClientGameTicker.cs index f62f99c6df..309db2eb4e 100644 --- a/Content.Client/GameTicking/Managers/ClientGameTicker.cs +++ b/Content.Client/GameTicking/Managers/ClientGameTicker.cs @@ -7,7 +7,7 @@ using Content.Shared.GameWindow; using JetBrains.Annotations; using Robust.Client.Graphics; using Robust.Client.State; -using Robust.Shared.Utility; +using Robust.Client.UserInterface; namespace Content.Client.GameTicking.Managers { @@ -18,16 +18,11 @@ namespace Content.Client.GameTicking.Managers [Dependency] private readonly IClientAdminManager _admin = default!; [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly SharedMapSystem _map = default!; + [Dependency] private readonly IUserInterfaceManager _userInterfaceManager = default!; - [ViewVariables] private bool _initialized; private Dictionary> _jobsAvailable = new(); private Dictionary _stationNames = new(); - /// - /// The current round-end window. Could be used to support re-opening the window after closing it. - /// - private RoundEndSummaryWindow? _window; - [ViewVariables] public bool AreWeReady { get; private set; } [ViewVariables] public bool IsGameStarted { get; private set; } [ViewVariables] public string? RestartSound { get; private set; } @@ -152,12 +147,7 @@ namespace Content.Client.GameTicking.Managers // Force an update in the event of this song being the same as the last. RestartSound = message.RestartSound; - // Don't open duplicate windows (mainly for replays). - if (_window?.RoundId == message.RoundId) - return; - - //This is not ideal at all, but I don't see an immediately better fit anywhere else. - _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager); + _userInterfaceManager.GetUIController().OpenRoundEndSummaryWindow(message); } } } diff --git a/Content.Client/Input/ContentContexts.cs b/Content.Client/Input/ContentContexts.cs index 2e888b3df9..8a7ca3b773 100644 --- a/Content.Client/Input/ContentContexts.cs +++ b/Content.Client/Input/ContentContexts.cs @@ -38,6 +38,7 @@ namespace Content.Client.Input common.AddFunction(ContentKeyFunctions.ZoomIn); common.AddFunction(ContentKeyFunctions.ResetZoom); common.AddFunction(ContentKeyFunctions.InspectEntity); + common.AddFunction(ContentKeyFunctions.ToggleRoundEndSummaryWindow); // Not in engine, because engine cannot check for sanbox/admin status before starting placement. common.AddFunction(ContentKeyFunctions.EditorCopyObject); diff --git a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs index bfbf2efe4f..f6979bf8d7 100644 --- a/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs +++ b/Content.Client/MagicMirror/MagicMirrorBoundUserInterface.cs @@ -72,9 +72,6 @@ public sealed class MagicMirrorBoundUserInterface : BoundUserInterface if (!disposing) return; - if (_window != null) - _window.OnClose -= Close; - _window?.Dispose(); } } diff --git a/Content.Client/MagicMirror/MagicMirrorSystem.cs b/Content.Client/MagicMirror/MagicMirrorSystem.cs new file mode 100644 index 0000000000..9b0b1dea0b --- /dev/null +++ b/Content.Client/MagicMirror/MagicMirrorSystem.cs @@ -0,0 +1,8 @@ +using Content.Shared.MagicMirror; + +namespace Content.Client.MagicMirror; + +public sealed class MagicMirrorSystem : SharedMagicMirrorSystem +{ + +} diff --git a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs index 264c297b63..80c98f143b 100644 --- a/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs +++ b/Content.Client/NetworkConfigurator/NetworkConfiguratorBoundUserInterface.cs @@ -88,6 +88,7 @@ public sealed class NetworkConfiguratorBoundUserInterface : BoundUserInterface base.Dispose(disposing); if (!disposing) return; + _linkMenu?.Dispose(); _listMenu?.Dispose(); _configurationMenu?.Dispose(); } diff --git a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs index aca9efcfe2..a575f1ba51 100644 --- a/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs +++ b/Content.Client/Options/UI/Tabs/KeyRebindTab.xaml.cs @@ -215,6 +215,7 @@ namespace Content.Client.Options.UI.Tabs AddButton(ContentKeyFunctions.OpenInventoryMenu); AddButton(ContentKeyFunctions.OpenAHelp); AddButton(ContentKeyFunctions.OpenActionsMenu); + AddButton(ContentKeyFunctions.ToggleRoundEndSummaryWindow); AddButton(ContentKeyFunctions.OpenEntitySpawnWindow); AddButton(ContentKeyFunctions.OpenSandboxWindow); AddButton(ContentKeyFunctions.OpenTileSpawnWindow); diff --git a/Content.Client/PDA/PdaBoundUserInterface.cs b/Content.Client/PDA/PdaBoundUserInterface.cs index ef9d6e8b9b..07352b512b 100644 --- a/Content.Client/PDA/PdaBoundUserInterface.cs +++ b/Content.Client/PDA/PdaBoundUserInterface.cs @@ -21,7 +21,6 @@ namespace Content.Client.PDA protected override void Open() { base.Open(); - SendMessage(new PdaRequestUpdateInterfaceMessage()); _menu = new PdaMenu(); _menu.OpenCenteredLeft(); _menu.OnClose += Close; @@ -32,17 +31,17 @@ namespace Content.Client.PDA _menu.EjectIdButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaIdSlotId)); }; _menu.EjectPenButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPenSlotId)); }; _menu.EjectPaiButton.OnPressed += _ => { - SendMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); + SendPredictedMessage(new ItemSlotButtonPressedEvent(PdaComponent.PdaPaiSlotId)); }; _menu.ActivateMusicButton.OnPressed += _ => diff --git a/Content.Client/Paper/PaperComponent.cs b/Content.Client/Paper/PaperComponent.cs index d197cd3721..1dc827bf7e 100644 --- a/Content.Client/Paper/PaperComponent.cs +++ b/Content.Client/Paper/PaperComponent.cs @@ -1,9 +1,6 @@ using Content.Shared.Paper; -using Robust.Shared.GameStates; namespace Content.Client.Paper; -[NetworkedComponent, RegisterComponent] -public sealed partial class PaperComponent : SharedPaperComponent -{ -} +[RegisterComponent] +public sealed partial class PaperComponent : SharedPaperComponent; diff --git a/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs new file mode 100644 index 0000000000..60ed8d87b9 --- /dev/null +++ b/Content.Client/Power/ActivatableUIRequiresPowerSystem.cs @@ -0,0 +1,21 @@ +using Content.Shared.Power.Components; +using Content.Shared.UserInterface; +using Content.Shared.Wires; + +namespace Content.Client.Power; + +public sealed class ActivatableUIRequiresPowerSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnActivate); + } + + private void OnActivate(EntityUid uid, ActivatableUIRequiresPowerComponent component, ActivatableUIOpenAttemptEvent args) + { + // Client can't predict the power properly at the moment so rely upon the server to do it. + args.Cancel(); + } +} diff --git a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs index 213eb0b662..70b7608f6d 100644 --- a/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs +++ b/Content.Client/Preferences/UI/HumanoidProfileEditor.xaml.cs @@ -697,6 +697,20 @@ namespace Content.Client.Preferences.UI var color = SkinColor.TintedHues(_rgbSkinColorSelector.Color); + CMarkings.CurrentSkinColor = color; + Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); + break; + } + case HumanoidSkinColor.VoxFeathers: + { + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + var color = SkinColor.ClosestVoxColor(_rgbSkinColorSelector.Color); + CMarkings.CurrentSkinColor = color; Profile = Profile.WithCharacterAppearance(Profile.Appearance.WithSkinColor(color)); break; @@ -908,6 +922,18 @@ namespace Content.Client.Preferences.UI _rgbSkinColorSelector.Color = Profile.Appearance.SkinColor; break; } + case HumanoidSkinColor.VoxFeathers: + { + if (!_rgbSkinColorContainer.Visible) + { + _skinColor.Visible = false; + _rgbSkinColorContainer.Visible = true; + } + + _rgbSkinColorSelector.Color = SkinColor.ClosestVoxColor(Profile.Appearance.SkinColor); + + break; + } } } diff --git a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs index 2ee7e30ec9..24f0e8a1d3 100644 --- a/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs +++ b/Content.Client/Replay/Spectator/ReplaySpectatorSystem.Position.cs @@ -198,6 +198,13 @@ public sealed partial class ReplaySpectatorSystem if (args.Transform.MapUid != null || args.OldMapId == MapId.Nullspace) return; + if (_spectatorData != null) + { + // Currently scrubbing/setting the replay tick + // the observer will get respawned once the state was applied + return; + } + // The entity being spectated from was moved to null-space. // This was probably because they were spectating some entity in a client-side replay that left PVS range. // Simple respawn the ghost. diff --git a/Content.Client/RoundEnd/RoundEndSummaryUIController.cs b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs new file mode 100644 index 0000000000..cf824833ef --- /dev/null +++ b/Content.Client/RoundEnd/RoundEndSummaryUIController.cs @@ -0,0 +1,51 @@ +using Content.Client.GameTicking.Managers; +using Content.Shared.GameTicking; +using Content.Shared.Input; +using JetBrains.Annotations; +using Robust.Client.Input; +using Robust.Client.UserInterface.Controllers; +using Robust.Shared.Input.Binding; +using Robust.Shared.Player; + +namespace Content.Client.RoundEnd; + +[UsedImplicitly] +public sealed class RoundEndSummaryUIController : UIController, + IOnSystemLoaded +{ + [Dependency] private readonly IInputManager _input = default!; + + private RoundEndSummaryWindow? _window; + + private void ToggleScoreboardWindow(ICommonSession? session = null) + { + if (_window == null) + return; + + if (_window.IsOpen) + { + _window.Close(); + } + else + { + _window.OpenCenteredRight(); + _window.MoveToFront(); + } + } + + public void OpenRoundEndSummaryWindow(RoundEndMessageEvent message) + { + // Don't open duplicate windows (mainly for replays). + if (_window?.RoundId == message.RoundId) + return; + + _window = new RoundEndSummaryWindow(message.GamemodeTitle, message.RoundEndText, + message.RoundDuration, message.RoundId, message.AllPlayersEndInfo, EntityManager); + } + + public void OnSystemLoaded(ClientGameTicker system) + { + _input.SetInputCommand(ContentKeyFunctions.ToggleRoundEndSummaryWindow, + InputCmdHandler.FromDelegate(ToggleScoreboardWindow)); + } +} diff --git a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs index 5b73c77934..9c9f83a427 100644 --- a/Content.Client/RoundEnd/RoundEndSummaryWindow.cs +++ b/Content.Client/RoundEnd/RoundEndSummaryWindow.cs @@ -2,7 +2,6 @@ using System.Linq; using System.Numerics; using Content.Client.Message; using Content.Shared.GameTicking; -using Robust.Client.GameObjects; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Shared.Utility; diff --git a/Content.Client/Storage/StorageBoundUserInterface.cs b/Content.Client/Storage/StorageBoundUserInterface.cs index f7fdbb8367..899df30f7f 100644 --- a/Content.Client/Storage/StorageBoundUserInterface.cs +++ b/Content.Client/Storage/StorageBoundUserInterface.cs @@ -17,6 +17,14 @@ public sealed class StorageBoundUserInterface : BoundUserInterface _storage = _entManager.System(); } + protected override void Open() + { + base.Open(); + + if (_entManager.TryGetComponent(Owner, out var comp)) + _storage.OpenStorageWindow((Owner, comp)); + } + protected override void Dispose(bool disposing) { base.Dispose(disposing); @@ -25,16 +33,5 @@ public sealed class StorageBoundUserInterface : BoundUserInterface _storage.CloseStorageWindow(Owner); } - - protected override void ReceiveMessage(BoundUserInterfaceMessage message) - { - base.ReceiveMessage(message); - - if (message is StorageModifyWindowMessage) - { - if (_entManager.TryGetComponent(Owner, out var comp)) - _storage.OpenStorageWindow((Owner, comp)); - } - } } diff --git a/Content.Client/Storage/Systems/StorageSystem.cs b/Content.Client/Storage/Systems/StorageSystem.cs index 2728bfa9e8..8bf0dcd981 100644 --- a/Content.Client/Storage/Systems/StorageSystem.cs +++ b/Content.Client/Storage/Systems/StorageSystem.cs @@ -111,7 +111,7 @@ public sealed class StorageSystem : SharedStorageSystem if (!Resolve(entity, ref entity.Comp, false)) return; - if (entity.Comp.OpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui) + if (entity.Comp.ClientOpenInterfaces.GetValueOrDefault(StorageComponent.StorageUiKey.Key) is not { } bui) return; bui.Close(); diff --git a/Content.Client/Strip/StrippableSystem.cs b/Content.Client/Strip/StrippableSystem.cs index c5083d2204..23f38e9d51 100644 --- a/Content.Client/Strip/StrippableSystem.cs +++ b/Content.Client/Strip/StrippableSystem.cs @@ -35,7 +35,7 @@ public sealed class StrippableSystem : SharedStrippableSystem if (!TryComp(uid, out UserInterfaceComponent? uiComp)) return; - foreach (var ui in uiComp.OpenInterfaces.Values) + foreach (var ui in uiComp.ClientOpenInterfaces.Values) { if (ui is StrippableBoundUserInterface stripUi) stripUi.DirtyMenu(); diff --git a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs index 9423f7288d..af93033a9d 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Controls/AlertControl.cs @@ -117,8 +117,7 @@ namespace Content.Client.UserInterface.Systems.Alerts.Controls protected override void Dispose(bool disposing) { base.Dispose(disposing); - - _entityManager.DeleteEntity(_spriteViewEntity); + _entityManager.QueueDeleteEntity(_spriteViewEntity); } } diff --git a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs index 189de50407..a1a494c47b 100644 --- a/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs +++ b/Content.Client/UserInterface/Systems/Alerts/Widgets/AlertsUI.xaml.cs @@ -97,7 +97,8 @@ public sealed partial class AlertsUI : UIWidget } else { - if (existingAlertControl != null) AlertContainer.Children.Remove(existingAlertControl); + if (existingAlertControl != null) + AlertContainer.Children.Remove(existingAlertControl); // this is a new alert + alert key or just a different alert with the same // key, create the control and add it in the appropriate order diff --git a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs index 99d7bc77b8..9ee429ba7e 100644 --- a/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs +++ b/Content.Client/UserInterface/Systems/Hands/HandsUIController.cs @@ -22,6 +22,7 @@ public sealed class HandsUIController : UIController, IOnStateEntered _handsContainers = new(); private readonly Dictionary _handContainerIndices = new(); @@ -450,15 +451,15 @@ public sealed class HandsUIController : UIController, IOnStateEntered + /// Test that a nuke ops gamemode can start after failing to start once. + /// + [Test] + public async Task FailAndStartTest() + { + await using var pair = await PoolManager.GetServerClient(new PoolSettings + { + Dirty = true, + DummyTicker = false, + Connected = true, + InLobby = true + }); + + var server = pair.Server; + var client = pair.Client; + var entMan = server.EntMan; + var ticker = server.System(); + server.System().Run = true; + + Assert.That(server.CfgMan.GetCVar(CCVars.GridFill), Is.False); + Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyFallbackEnabled), Is.True); + Assert.That(server.CfgMan.GetCVar(CCVars.GameLobbyDefaultPreset), Is.EqualTo("secret")); + server.CfgMan.SetCVar(CCVars.GridFill, true); + server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, false); + server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "TestPreset"); + + // 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)); + + // Try to start nukeops without readying up + await pair.WaitCommand("setgamepreset TestPresetTenPlayers"); + await pair.WaitCommand("startround"); + await pair.RunTicksSync(10); + + // Game should not have started + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.PreRoundLobby)); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.NotReadyToPlay)); + Assert.That(!client.EntMan.EntityExists(client.AttachedEntity)); + var player = pair.Player!.AttachedEntity; + Assert.That(!entMan.EntityExists(player)); + + // Ready up and start nukeops + await pair.WaitClientCommand("toggleready True"); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.ReadyToPlay)); + await pair.WaitCommand("setgamepreset TestPreset"); + await pair.WaitCommand("startround"); + await pair.RunTicksSync(10); + + // Game should have started + Assert.That(ticker.RunLevel, Is.EqualTo(GameRunLevel.InRound)); + Assert.That(ticker.PlayerGameStatuses[client.User!.Value], Is.EqualTo(PlayerGameStatus.JoinedGame)); + Assert.That(client.EntMan.EntityExists(client.AttachedEntity)); + player = pair.Player!.AttachedEntity!.Value; + Assert.That(entMan.EntityExists(player)); + + ticker.SetGamePreset((GamePresetPrototype?)null); + server.CfgMan.SetCVar(CCVars.GridFill, false); + server.CfgMan.SetCVar(CCVars.GameLobbyFallbackEnabled, true); + server.CfgMan.SetCVar(CCVars.GameLobbyDefaultPreset, "secret"); + server.System().Run = false; + await pair.CleanReturnAsync(); + } +} + +public sealed class TestRuleSystem : EntitySystem +{ + public bool Run; + + public override void Initialize() + { + SubscribeLocalEvent(OnRoundStartAttempt); + } + + private void OnRoundStartAttempt(RoundStartAttemptEvent args) + { + if (!Run) + return; + + if (args.Forced || args.Cancelled) + return; + + var query = EntityQueryEnumerator(); + while (query.MoveNext(out _, out _, out var gameRule)) + { + var minPlayers = gameRule.MinPlayers; + if (args.Players.Length >= minPlayers) + continue; + + args.Cancel(); + } + } +} + +[RegisterComponent] +public sealed partial class TestRuleComponent : Component; diff --git a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs index d45290c866..95cf8a06df 100644 --- a/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs +++ b/Content.IntegrationTests/Tests/Interaction/InteractionTest.Helpers.cs @@ -820,7 +820,7 @@ public abstract partial class InteractionTest return false; } - if (!ui.OpenInterfaces.TryGetValue(key, out bui)) + if (!ui.ClientOpenInterfaces.TryGetValue(key, out bui)) { if (shouldSucceed) Assert.Fail($"Entity {SEntMan.ToPrettyString(SEntMan.GetEntity(target.Value))} does not have an open bui with key {key.GetType()}.{key}."); diff --git a/Content.IntegrationTests/Tests/Power/PowerTest.cs b/Content.IntegrationTests/Tests/Power/PowerTest.cs index a6af3e6a65..a94e94489c 100644 --- a/Content.IntegrationTests/Tests/Power/PowerTest.cs +++ b/Content.IntegrationTests/Tests/Power/PowerTest.cs @@ -143,8 +143,8 @@ namespace Content.IntegrationTests.Tests.Power anchored: true - type: UserInterface interfaces: - - key: enum.ApcUiKey.Key - type: ApcBoundUserInterface + enum.ApcUiKey.Key: + type: ApcBoundUserInterface - type: AccessReader access: [['Engineering']] diff --git a/Content.Server/Access/Systems/AccessOverriderSystem.cs b/Content.Server/Access/Systems/AccessOverriderSystem.cs index 25f2e4c1b0..bc038fe4ff 100644 --- a/Content.Server/Access/Systems/AccessOverriderSystem.cs +++ b/Content.Server/Access/Systems/AccessOverriderSystem.cs @@ -68,16 +68,13 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem private void OnDoAfter(EntityUid uid, AccessOverriderComponent component, AccessOverriderDoAfterEvent args) { - if (!TryComp(args.User, out ActorComponent? actor)) - return; - if (args.Handled || args.Cancelled) return; if (args.Args.Target != null) { component.TargetAccessReaderId = args.Args.Target.Value; - _userInterface.TryOpen(uid, AccessOverriderUiKey.Key, actor.PlayerSession); + _userInterface.OpenUi(uid, AccessOverriderUiKey.Key, args.User); UpdateUserInterface(uid, component, args); } @@ -94,7 +91,7 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem private void OnWriteToTargetAccessReaderIdMessage(EntityUid uid, AccessOverriderComponent component, WriteToTargetAccessReaderIdMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; TryWriteToTargetAccessReaderId(uid, args.AccessList, player, component); @@ -154,22 +151,19 @@ public sealed class AccessOverriderSystem : SharedAccessOverriderSystem targetLabel, targetLabelColor); - _userInterface.TrySetUiState(uid, AccessOverriderUiKey.Key, newState); + _userInterface.SetUiState(uid, AccessOverriderUiKey.Key, newState); } private List> ConvertAccessHashSetsToList(List>> accessHashsets) { - List> accessList = new List>(); + var accessList = new List>(); - if (accessHashsets != null && accessHashsets.Any()) + if (accessHashsets.Count <= 0) + return accessList; + + foreach (var hashSet in accessHashsets) { - foreach (HashSet> hashSet in accessHashsets) - { - foreach (ProtoId hash in hashSet.ToArray()) - { - accessList.Add(hash); - } - } + accessList.AddRange(hashSet); } return accessList; diff --git a/Content.Server/Access/Systems/AgentIDCardSystem.cs b/Content.Server/Access/Systems/AgentIDCardSystem.cs index bd4d3b3f23..d5e9dc357d 100644 --- a/Content.Server/Access/Systems/AgentIDCardSystem.cs +++ b/Content.Server/Access/Systems/AgentIDCardSystem.cs @@ -61,14 +61,14 @@ namespace Content.Server.Access.Systems private void AfterUIOpen(EntityUid uid, AgentIDCardComponent component, AfterActivatableUIOpenEvent args) { - if (!_uiSystem.TryGetUi(uid, AgentIDCardUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(uid, AgentIDCardUiKey.Key)) return; if (!TryComp(uid, out var idCard)) return; - var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", component.Icons); - _uiSystem.SetUiState(ui, state, args.Session); + var state = new AgentIDCardBoundUserInterfaceState(idCard.FullName ?? "", idCard.JobTitle ?? "", idCard.JobIcon ?? "", component.Icons); + _uiSystem.SetUiState(uid, AgentIDCardUiKey.Key, state); } private void OnJobChanged(EntityUid uid, AgentIDCardComponent comp, AgentIDCardJobChangedMessage args) @@ -94,7 +94,7 @@ namespace Content.Server.Access.Systems return; } - if (!_prototypeManager.TryIndex(args.JobIcon, out var jobIcon)) + if (!_prototypeManager.TryIndex(args.JobIconId, out var jobIcon)) { return; } diff --git a/Content.Server/Access/Systems/IdCardConsoleSystem.cs b/Content.Server/Access/Systems/IdCardConsoleSystem.cs index db8b9d036e..e680b0c6f4 100644 --- a/Content.Server/Access/Systems/IdCardConsoleSystem.cs +++ b/Content.Server/Access/Systems/IdCardConsoleSystem.cs @@ -41,7 +41,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem private void OnWriteToTargetIdMessage(EntityUid uid, IdCardConsoleComponent component, WriteToTargetIdMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; TryWriteToTargetId(uid, args.FullName, args.JobTitle, args.AccessList, args.JobPrototype, player, component); @@ -104,7 +104,7 @@ public sealed class IdCardConsoleSystem : SharedIdCardConsoleSystem Name(targetId)); } - _userInterface.TrySetUiState(uid, IdCardConsoleUiKey.Key, newState); + _userInterface.SetUiState(uid, IdCardConsoleUiKey.Key, newState); } /// diff --git a/Content.Server/Access/Systems/IdCardSystem.cs b/Content.Server/Access/Systems/IdCardSystem.cs index 6b3d8db595..9cd9976cea 100644 --- a/Content.Server/Access/Systems/IdCardSystem.cs +++ b/Content.Server/Access/Systems/IdCardSystem.cs @@ -7,8 +7,6 @@ using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Database; using Content.Shared.Popups; -using Content.Shared.Roles; -using Content.Shared.StatusIcon; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -20,20 +18,13 @@ public sealed class IdCardSystem : SharedIdCardSystem [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IAdminLogManager _adminLogger = default!; - [Dependency] private readonly MetaDataSystem _metaSystem = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnMicrowaved); } - private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args) - { - UpdateEntityName(uid, id); - } - private void OnMicrowaved(EntityUid uid, IdCardComponent component, BeingMicrowavedEvent args) { if (TryComp(uid, out var access)) @@ -81,143 +72,4 @@ public sealed class IdCardSystem : SharedIdCardSystem $"{ToPrettyString(args.Microwave)} added {random.ID} access to {ToPrettyString(uid):entity}"); } } - - /// - /// Attempts to change the job title of a card. - /// Returns true/false. - /// - /// - /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. - /// - public bool TryChangeJobTitle(EntityUid uid, string? jobTitle, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - return false; - - if (!string.IsNullOrWhiteSpace(jobTitle)) - { - jobTitle = jobTitle.Trim(); - - if (jobTitle.Length > IdCardConsoleComponent.MaxJobTitleLength) - jobTitle = jobTitle[..IdCardConsoleComponent.MaxJobTitleLength]; - } - else - { - jobTitle = null; - } - - if (id.JobTitle == jobTitle) - return true; - id.JobTitle = jobTitle; - Dirty(uid, id); - UpdateEntityName(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the job title of {ToPrettyString(uid):entity} to {jobTitle} "); - } - return true; - } - - public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - { - return false; - } - - if (id.JobIcon == jobIcon.ID) - { - return true; - } - - id.JobIcon = jobIcon.ID; - Dirty(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the job icon of {ToPrettyString(uid):entity} to {jobIcon} "); - } - - return true; - } - - public bool TryChangeJobDepartment(EntityUid uid, JobPrototype job, IdCardComponent? id = null) - { - if (!Resolve(uid, ref id)) - return false; - - id.JobDepartments.Clear(); - foreach (var department in _prototypeManager.EnumeratePrototypes()) - { - if (department.Roles.Contains(job.ID)) - id.JobDepartments.Add("department-" + department.ID); - } - - Dirty(uid, id); - - return true; - } - - /// - /// Attempts to change the full name of a card. - /// Returns true/false. - /// - /// - /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. - /// - public bool TryChangeFullName(EntityUid uid, string? fullName, IdCardComponent? id = null, EntityUid? player = null) - { - if (!Resolve(uid, ref id)) - return false; - - if (!string.IsNullOrWhiteSpace(fullName)) - { - fullName = fullName.Trim(); - if (fullName.Length > IdCardConsoleComponent.MaxFullNameLength) - fullName = fullName[..IdCardConsoleComponent.MaxFullNameLength]; - } - else - { - fullName = null; - } - - if (id.FullName == fullName) - return true; - id.FullName = fullName; - Dirty(uid, id); - UpdateEntityName(uid, id); - - if (player != null) - { - _adminLogger.Add(LogType.Identity, LogImpact.Low, - $"{ToPrettyString(player.Value):player} has changed the name of {ToPrettyString(uid):entity} to {fullName} "); - } - return true; - } - - /// - /// Changes the name of the id's owner. - /// - /// - /// If either or is empty, it's replaced by placeholders. - /// If both are empty, the original entity's name is restored. - /// - private void UpdateEntityName(EntityUid uid, IdCardComponent? id = null) - { - if (!Resolve(uid, ref id)) - return; - - var jobSuffix = string.IsNullOrWhiteSpace(id.JobTitle) ? string.Empty : $" ({id.JobTitle})"; - - var val = string.IsNullOrWhiteSpace(id.FullName) - ? Loc.GetString("access-id-card-component-owner-name-job-title-text", - ("jobSuffix", jobSuffix)) - : Loc.GetString("access-id-card-component-owner-full-name-job-title-text", - ("fullName", id.FullName), - ("jobSuffix", jobSuffix)); - _metaSystem.SetEntityName(uid, val); - } } diff --git a/Content.Server/Administration/Components/HeadstandComponent.cs b/Content.Server/Administration/Components/HeadstandComponent.cs index 8472b5ad36..2ab097fad4 100644 --- a/Content.Server/Administration/Components/HeadstandComponent.cs +++ b/Content.Server/Administration/Components/HeadstandComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Administration.Components; -[RegisterComponent, NetworkedComponent] +[RegisterComponent] public sealed partial class HeadstandComponent : SharedHeadstandComponent { diff --git a/Content.Server/Administration/Components/KillSignComponent.cs b/Content.Server/Administration/Components/KillSignComponent.cs index e29ce202dd..11479c32fc 100644 --- a/Content.Server/Administration/Components/KillSignComponent.cs +++ b/Content.Server/Administration/Components/KillSignComponent.cs @@ -3,6 +3,5 @@ using Robust.Shared.GameStates; namespace Content.Server.Administration.Components; -[NetworkedComponent, RegisterComponent] -public sealed partial class KillSignComponent : SharedKillSignComponent -{ } +[RegisterComponent] +public sealed partial class KillSignComponent : SharedKillSignComponent; diff --git a/Content.Server/Administration/Systems/AdminVerbSystem.cs b/Content.Server/Administration/Systems/AdminVerbSystem.cs index f5b237b449..5bb75b4c99 100644 --- a/Content.Server/Administration/Systems/AdminVerbSystem.cs +++ b/Content.Server/Administration/Systems/AdminVerbSystem.cs @@ -463,7 +463,7 @@ namespace Content.Server.Administration.Systems Text = Loc.GetString("configure-verb-get-data-text"), Icon = new SpriteSpecifier.Texture(new ("/Textures/Interface/VerbIcons/settings.svg.192dpi.png")), Category = VerbCategory.Debug, - Act = () => _uiSystem.TryOpen(args.Target, ConfigurationUiKey.Key, actor.PlayerSession) + Act = () => _uiSystem.OpenUi(args.Target, ConfigurationUiKey.Key, actor.PlayerSession) }; args.Verbs.Add(verb); } diff --git a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs index 048f59b8d3..232b4b7eda 100644 --- a/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs +++ b/Content.Server/Advertise/EntitySystems/SpeakOnUIClosedSystem.cs @@ -4,6 +4,7 @@ using Content.Server.UserInterface; using Content.Shared.Advertise; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent; namespace Content.Server.Advertise; diff --git a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs index 5bf78bde85..1b323d6643 100644 --- a/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs +++ b/Content.Server/Ame/EntitySystems/AmeControllerSystem.cs @@ -129,11 +129,11 @@ public sealed class AmeControllerSystem : EntitySystem if (!Resolve(uid, ref controller)) return; - if (!_userInterfaceSystem.TryGetUi(uid, AmeControllerUiKey.Key, out var bui)) + if (!_userInterfaceSystem.HasUi(uid, AmeControllerUiKey.Key)) return; var state = GetUiState(uid, controller); - _userInterfaceSystem.SetUiState(bui, state); + _userInterfaceSystem.SetUiState(uid, AmeControllerUiKey.Key, state); controller.NextUIUpdate = _gameTiming.CurTime + controller.UpdateUIPeriod; } @@ -324,7 +324,7 @@ public sealed class AmeControllerSystem : EntitySystem private void OnUiButtonPressed(EntityUid uid, AmeControllerComponent comp, UiButtonPressedMessage msg) { - var user = msg.Session.AttachedEntity; + var user = msg.Actor; if (!Exists(user)) return; @@ -334,7 +334,7 @@ public sealed class AmeControllerSystem : EntitySystem _ => true, }; - if (!PlayerCanUseController(uid, user!.Value, needsPower, comp)) + if (!PlayerCanUseController(uid, user, needsPower, comp)) return; _audioSystem.PlayPvs(comp.ClickSound, uid, AudioParams.Default.WithVolume(-2f)); diff --git a/Content.Server/Anomaly/AnomalySystem.Generator.cs b/Content.Server/Anomaly/AnomalySystem.Generator.cs index 7aa1a8935f..056a985cbe 100644 --- a/Content.Server/Anomaly/AnomalySystem.Generator.cs +++ b/Content.Server/Anomaly/AnomalySystem.Generator.cs @@ -61,7 +61,7 @@ public sealed partial class AnomalySystem var materialAmount = _material.GetMaterialAmount(uid, component.RequiredMaterial); var state = new AnomalyGeneratorUserInterfaceState(component.CooldownEndTime, materialAmount, component.MaterialPerAnomaly); - _ui.TrySetUiState(uid, AnomalyGeneratorUiKey.Key, state); + _ui.SetUiState(uid, AnomalyGeneratorUiKey.Key, state); } public void TryGeneratorCreateAnomaly(EntityUid uid, AnomalyGeneratorComponent? component = null) diff --git a/Content.Server/Anomaly/AnomalySystem.Scanner.cs b/Content.Server/Anomaly/AnomalySystem.Scanner.cs index bce508903d..39c0d08b55 100644 --- a/Content.Server/Anomaly/AnomalySystem.Scanner.cs +++ b/Content.Server/Anomaly/AnomalySystem.Scanner.cs @@ -31,7 +31,8 @@ public sealed partial class AnomalySystem { if (component.ScannedAnomaly != args.Anomaly) continue; - _ui.TryCloseAll(uid, AnomalyScannerUiKey.Key); + + _ui.CloseUi(uid, AnomalyScannerUiKey.Key); } } @@ -108,7 +109,7 @@ public sealed partial class AnomalySystem Popup.PopupEntity(Loc.GetString("anomaly-scanner-component-scan-complete"), uid); UpdateScannerWithNewAnomaly(uid, args.Args.Target.Value, component); - if (TryComp(args.Args.User, out var actor)) _ui.TryOpen(uid, AnomalyScannerUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, AnomalyScannerUiKey.Key, args.User); args.Handled = true; } @@ -123,7 +124,7 @@ public sealed partial class AnomalySystem nextPulse = anomalyComponent.NextPulseTime; var state = new AnomalyScannerUserInterfaceState(GetScannerMessage(component), nextPulse); - _ui.TrySetUiState(uid, AnomalyScannerUiKey.Key, state); + _ui.SetUiState(uid, AnomalyScannerUiKey.Key, state); } public void UpdateScannerWithNewAnomaly(EntityUid scanner, EntityUid anomaly, AnomalyScannerComponent? scannerComp = null, AnomalyComponent? anomalyComp = null) diff --git a/Content.Server/Antag/AntagSelectionPlayerPool.cs b/Content.Server/Antag/AntagSelectionPlayerPool.cs index 054292dcf9..87873e96d1 100644 --- a/Content.Server/Antag/AntagSelectionPlayerPool.cs +++ b/Content.Server/Antag/AntagSelectionPlayerPool.cs @@ -5,15 +5,13 @@ using Robust.Shared.Random; namespace Content.Server.Antag; -public sealed class AntagSelectionPlayerPool(params List[] sessions) +public sealed class AntagSelectionPlayerPool (List> orderedPools) { - private readonly List> _orderedPools = sessions.ToList(); - public bool TryPickAndTake(IRobustRandom random, [NotNullWhen(true)] out ICommonSession? session) { session = null; - foreach (var pool in _orderedPools) + foreach (var pool in orderedPools) { if (pool.Count == 0) continue; @@ -25,5 +23,5 @@ public sealed class AntagSelectionPlayerPool(params List[] sessi return session != null; } - public int Count => _orderedPools.Sum(p => p.Count); + public int Count => orderedPools.Sum(p => p.Count); } diff --git a/Content.Server/Antag/AntagSelectionSystem.cs b/Content.Server/Antag/AntagSelectionSystem.cs index eb68e077b1..6bfb7394f5 100644 --- a/Content.Server/Antag/AntagSelectionSystem.cs +++ b/Content.Server/Antag/AntagSelectionSystem.cs @@ -35,7 +35,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem + /// Tries to makes a given player into the specified antagonist. + /// + public bool TryMakeAntag(Entity ent, ICommonSession? session, AntagSelectionDefinition def, bool ignoreSpawner = false) + { + if (!IsSessionValid(ent, session, def) || + !IsEntityValid(session?.AttachedEntity, def)) + { + return false; + } + + MakeAntag(ent, session, def, ignoreSpawner); + return true; + } + /// /// Makes a given player into the specified antagonist. /// @@ -262,7 +277,6 @@ public sealed partial class AntagSelectionSystem : GameRuleSystem public AntagSelectionPlayerPool GetPlayerPool(Entity ent, List sessions, AntagSelectionDefinition def) { - var primaryList = new List(); - var secondaryList = new List(); - var fallbackList = new List(); - var rawList = new List(); + var preferredList = new List(); + var secondBestList = new List(); + var unwantedList = new List(); + var invalidList = new List(); foreach (var session in sessions) { if (!IsSessionValid(ent, session, def) || !IsEntityValid(session.AttachedEntity, def)) { - rawList.Add(session); + 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))) + if (def.PrefRoles.Count != 0 && pref.AntagPreferences.Any(p => def.PrefRoles.Contains(p))) { - primaryList.Add(session); + preferredList.Add(session); } - else if (def.PrefRoles.Count == 0 || pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p))) + else if (def.FallbackRoles.Count != 0 && pref.AntagPreferences.Any(p => def.FallbackRoles.Contains(p))) { - secondaryList.Add(session); + secondBestList.Add(session); } else { - fallbackList.Add(session); + unwantedList.Add(session); } } - return new AntagSelectionPlayerPool(primaryList, secondaryList, fallbackList, rawList); + return new AntagSelectionPlayerPool(new() { preferredList, secondBestList, unwantedList, invalidList }); } /// /// Checks if a given session is valid for an antagonist. /// - public bool IsSessionValid(Entity ent, ICommonSession session, AntagSelectionDefinition def, EntityUid? mind = null) + public bool IsSessionValid(Entity ent, ICommonSession? session, AntagSelectionDefinition def, EntityUid? mind = null) { + if (session == null) + return true; + mind ??= session.GetMind(); if (session.Status is SessionStatus.Disconnected or SessionStatus.Zombie) diff --git a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs index ef69600783..cd22f1f6d3 100644 --- a/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs +++ b/Content.Server/Arcade/BlockGame/BlockGame.Ui.cs @@ -157,39 +157,37 @@ public sealed partial class BlockGame /// The message to broadcase to all players/spectators. private void SendMessage(BoundUserInterfaceMessage message) { - if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, message); + _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message); } /// /// Handles sending a message to a specific player/spectator. /// /// The message to send to a specific player/spectator. - /// The target recipient. - private void SendMessage(BoundUserInterfaceMessage message, ICommonSession session) + /// The target recipient. + private void SendMessage(BoundUserInterfaceMessage message, EntityUid actor) { - if (_uiSystem.TryGetUi(_owner, BlockGameUiKey.Key, out var bui)) - _uiSystem.TrySendUiMessage(bui, message, session); + _uiSystem.ServerSendUiMessage(_entityManager.GetEntity(message.Entity), BlockGameUiKey.Key, message, actor); } /// /// Handles sending the current state of the game to a player that has just opened the UI. /// - /// The target recipient. - public void UpdateNewPlayerUI(ICommonSession session) + /// The target recipient. + public void UpdateNewPlayerUI(EntityUid actor) { if (_gameOver) { - SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), session); + SendMessage(new BlockGameMessages.BlockGameGameOverScreenMessage(Points, _highScorePlacement?.LocalPlacement, _highScorePlacement?.GlobalPlacement), actor); return; } if (Paused) - SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), session); + SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Pause, Started), actor); else - SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), session); + SendMessage(new BlockGameMessages.BlockGameSetScreenMessage(BlockGameMessages.BlockGameScreen.Game, Started), actor); - FullUpdate(session); + FullUpdate(actor); } /// @@ -209,14 +207,14 @@ public sealed partial class BlockGame /// Handles broadcasting the full player-visible game state to a specific player/spectator. /// /// The target recipient. - private void FullUpdate(ICommonSession session) + private void FullUpdate(EntityUid actor) { - UpdateFieldUI(session); - SendNextPieceUpdate(session); - SendHoldPieceUpdate(session); - SendLevelUpdate(session); - SendPointsUpdate(session); - SendHighscoreUpdate(session); + UpdateFieldUI(actor); + SendNextPieceUpdate(actor); + SendHoldPieceUpdate(actor); + SendLevelUpdate(actor); + SendPointsUpdate(actor); + SendHighscoreUpdate(actor); } /// @@ -234,14 +232,13 @@ public sealed partial class BlockGame /// /// Handles broadcasting the current location of all of the blocks in the playfield + the active piece to a specific player/spectator. /// - /// The target recipient. - public void UpdateFieldUI(ICommonSession session) + public void UpdateFieldUI(EntityUid actor) { if (!Started) return; var computedField = ComputeField(); - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(computedField.ToArray(), BlockGameMessages.BlockGameVisualType.GameField), actor); } /// @@ -282,10 +279,9 @@ public sealed partial class BlockGame /// /// Broadcasts the state of the next queued piece to a specific viewer. /// - /// The target recipient. - private void SendNextPieceUpdate(ICommonSession session) + private void SendNextPieceUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(NextPiece.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.NextBlock), actor); } /// @@ -302,13 +298,12 @@ public sealed partial class BlockGame /// /// Broadcasts the state of the currently held piece to a specific viewer. /// - /// The target recipient. - private void SendHoldPieceUpdate(ICommonSession session) + private void SendHoldPieceUpdate(EntityUid actor) { if (HeldPiece.HasValue) - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(HeldPiece.Value.BlocksForPreview(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor); else - SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), session); + SendMessage(new BlockGameMessages.BlockGameVisualUpdateMessage(Array.Empty(), BlockGameMessages.BlockGameVisualType.HoldBlock), actor); } /// @@ -322,10 +317,9 @@ public sealed partial class BlockGame /// /// Broadcasts the current game level to a specific viewer. /// - /// The target recipient. - private void SendLevelUpdate(ICommonSession session) + private void SendLevelUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), session); + SendMessage(new BlockGameMessages.BlockGameLevelUpdateMessage(Level), actor); } /// @@ -339,10 +333,9 @@ public sealed partial class BlockGame /// /// Broadcasts the current game score to a specific viewer. /// - /// The target recipient. - private void SendPointsUpdate(ICommonSession session) + private void SendPointsUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), session); + SendMessage(new BlockGameMessages.BlockGameScoreUpdateMessage(Points), actor); } /// @@ -356,9 +349,8 @@ public sealed partial class BlockGame /// /// Broadcasts the current game high score positions to a specific viewer. /// - /// The target recipient. - private void SendHighscoreUpdate(ICommonSession session) + private void SendHighscoreUpdate(EntityUid actor) { - SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), session); + SendMessage(new BlockGameMessages.BlockGameHighScoreUpdateMessage(_arcadeSystem.GetLocalHighscores(), _arcadeSystem.GetGlobalHighscores()), actor); } } diff --git a/Content.Server/Arcade/BlockGame/BlockGame.cs b/Content.Server/Arcade/BlockGame/BlockGame.cs index 3af1828d56..82063b6443 100644 --- a/Content.Server/Arcade/BlockGame/BlockGame.cs +++ b/Content.Server/Arcade/BlockGame/BlockGame.cs @@ -9,8 +9,8 @@ public sealed partial class BlockGame { [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly IRobustRandom _random = default!; - private readonly ArcadeSystem _arcadeSystem = default!; - private readonly UserInterfaceSystem _uiSystem = default!; + private readonly ArcadeSystem _arcadeSystem; + private readonly UserInterfaceSystem _uiSystem; /// /// What entity is currently hosting this game of NT-BG. @@ -78,7 +78,7 @@ public sealed partial class BlockGame _gameOver = true; if (_entityManager.TryGetComponent(_owner, out var cabinet) - && _entityManager.TryGetComponent(cabinet.Player?.AttachedEntity, out var meta)) + && _entityManager.TryGetComponent(cabinet.Player, out var meta)) { _highScorePlacement = _arcadeSystem.RegisterHighScore(meta.EntityName, Points); SendHighscoreUpdate(); diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs index 5613d91544..75952b0a33 100644 --- a/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs +++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeComponent.cs @@ -13,10 +13,10 @@ public sealed partial class BlockGameArcadeComponent : Component /// /// The player currently playing the active session of NT-BG. /// - public ICommonSession? Player = null; + public EntityUid? Player = null; /// /// The players currently viewing (but not playing) the active session of NT-BG. /// - public readonly List Spectators = new(); + public readonly List Spectators = new(); } diff --git a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs index ad65c5cca6..561cad8d7e 100644 --- a/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs +++ b/Content.Server/Arcade/BlockGame/BlockGameArcadeSystem.cs @@ -37,14 +37,12 @@ public sealed class BlockGameArcadeSystem : EntitySystem } } - private void UpdatePlayerStatus(EntityUid uid, ICommonSession session, PlayerBoundUserInterface? bui = null, BlockGameArcadeComponent? blockGame = null) + private void UpdatePlayerStatus(EntityUid uid, EntityUid actor, BlockGameArcadeComponent? blockGame = null) { if (!Resolve(uid, ref blockGame)) return; - if (bui == null && !_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out bui)) - return; - _uiSystem.TrySendUiMessage(bui, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == session), session); + _uiSystem.ServerSendUiMessage(uid, BlockGameUiKey.Key, new BlockGameMessages.BlockGameUserStatusMessage(blockGame.Player == actor), actor); } private void OnComponentInit(EntityUid uid, BlockGameArcadeComponent component, ComponentInit args) @@ -54,33 +52,21 @@ public sealed class BlockGameArcadeSystem : EntitySystem private void OnAfterUIOpen(EntityUid uid, BlockGameArcadeComponent component, AfterActivatableUIOpenEvent args) { - if (!TryComp(args.User, out var actor)) - return; - if (!_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui)) - return; - - var session = actor.PlayerSession; - if (!bui.SubscribedSessions.Contains(session)) - return; - if (component.Player == null) - component.Player = session; + component.Player = args.Actor; else - component.Spectators.Add(session); + component.Spectators.Add(args.Actor); - UpdatePlayerStatus(uid, session, bui, component); - component.Game?.UpdateNewPlayerUI(session); + UpdatePlayerStatus(uid, args.Actor, component); + component.Game?.UpdateNewPlayerUI(args.Actor); } private void OnAfterUiClose(EntityUid uid, BlockGameArcadeComponent component, BoundUIClosedEvent args) { - if (args.Session is not { } session) - return; - - if (component.Player != session) + if (component.Player != args.Actor) { - component.Spectators.Remove(session); - UpdatePlayerStatus(uid, session, blockGame: component); + component.Spectators.Remove(args.Actor); + UpdatePlayerStatus(uid, args.Actor, blockGame: component); return; } @@ -88,11 +74,11 @@ public sealed class BlockGameArcadeSystem : EntitySystem if (component.Spectators.Count > 0) { component.Player = component.Spectators[0]; - component.Spectators.Remove(component.Player); - UpdatePlayerStatus(uid, component.Player, blockGame: component); + component.Spectators.Remove(component.Player.Value); + UpdatePlayerStatus(uid, component.Player.Value, blockGame: component); } - UpdatePlayerStatus(uid, temp, blockGame: component); + UpdatePlayerStatus(uid, temp.Value, blockGame: component); } private void OnBlockPowerChanged(EntityUid uid, BlockGameArcadeComponent component, ref PowerChangedEvent args) @@ -100,8 +86,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem if (args.Powered) return; - if (_uiSystem.TryGetUi(uid, BlockGameUiKey.Key, out var bui)) - _uiSystem.CloseAll(bui); + _uiSystem.CloseUi(uid, BlockGameUiKey.Key); component.Player = null; component.Spectators.Clear(); } @@ -112,7 +97,7 @@ public sealed class BlockGameArcadeSystem : EntitySystem return; if (!BlockGameUiKey.Key.Equals(msg.UiKey)) return; - if (msg.Session != component.Player) + if (msg.Actor != component.Player) return; if (msg.PlayerAction == BlockGamePlayerAction.NewGame) diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs index f60d88ebf7..f7758f11f1 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainArcadeSystem.cs @@ -90,12 +90,10 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem _audioSystem.PlayPvs(component.NewGameSound, uid, AudioParams.Default.WithVolume(-4f)); component.Game = new SpaceVillainGame(uid, component, this); - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage()); break; case PlayerAction.RequestData: - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out bui)) - _uiSystem.SendUiMessage(bui, component.Game.GenerateMetaDataMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, component.Game.GenerateMetaDataMessage()); break; } } @@ -110,7 +108,6 @@ public sealed partial class SpaceVillainArcadeSystem : EntitySystem if (TryComp(uid, out var power) && power.Powered) return; - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.CloseAll(bui); + _uiSystem.CloseUi(uid, SpaceVillainArcadeUiKey.Key); } } diff --git a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs index 890e9888a7..ebcfb8e3f6 100644 --- a/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs +++ b/Content.Server/Arcade/SpaceVillainGame/SpaceVillainGame.Ui.cs @@ -9,8 +9,7 @@ public sealed partial class SpaceVillainGame /// private void UpdateUi(EntityUid uid, bool metadata = false) { - if (_uiSystem.TryGetUi(uid, SpaceVillainArcadeUiKey.Key, out var bui)) - _uiSystem.SendUiMessage(bui, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage()); + _uiSystem.ServerSendUiMessage(uid, SpaceVillainArcadeUiKey.Key, metadata ? GenerateMetaDataMessage() : GenerateUpdateMessage()); } private void UpdateUi(EntityUid uid, string message1, string message2, bool metadata = false) diff --git a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs index 1f5ca80935..15e1dde4ec 100644 --- a/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasAnalyzerSystem.cs @@ -118,8 +118,7 @@ namespace Content.Server.Atmos.EntitySystems if (!Resolve(uid, ref component)) return; - if (user != null && TryComp(user, out var actor)) - _userInterface.TryClose(uid, GasAnalyzerUiKey.Key, actor.PlayerSession); + _userInterface.CloseUi(uid, GasAnalyzerUiKey.Key, user); component.Enabled = false; Dirty(uid, component); @@ -132,8 +131,6 @@ namespace Content.Server.Atmos.EntitySystems /// private void OnDisabledMessage(EntityUid uid, GasAnalyzerComponent component, GasAnalyzerDisableMessage message) { - if (message.Session.AttachedEntity is not { Valid: true }) - return; DisableAnalyzer(uid, component); } @@ -142,10 +139,7 @@ namespace Content.Server.Atmos.EntitySystems if (!Resolve(uid, ref component, false)) return; - if (!TryComp(user, out var actor)) - return; - - _userInterface.TryOpen(uid, GasAnalyzerUiKey.Key, actor.PlayerSession); + _userInterface.OpenUi(uid, GasAnalyzerUiKey.Key, user); } /// @@ -242,7 +236,7 @@ namespace Content.Server.Atmos.EntitySystems if (gasMixList.Count == 0) return false; - _userInterface.TrySendUiMessage(uid, GasAnalyzerUiKey.Key, + _userInterface.ServerSendUiMessage(uid, GasAnalyzerUiKey.Key, new GasAnalyzerUserMessage(gasMixList.ToArray(), component.Target != null ? Name(component.Target.Value) : string.Empty, GetNetEntity(component.Target) ?? NetEntity.Invalid, diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index dd84756e45..07594820fc 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -75,7 +75,7 @@ namespace Content.Server.Atmos.EntitySystems public void UpdateUserInterface(Entity ent, bool initialUpdate = false) { var (owner, component) = ent; - _ui.TrySetUiState(owner, SharedGasTankUiKey.Key, + _ui.SetUiState(owner, SharedGasTankUiKey.Key, new GasTankBoundUserInterfaceState { TankPressure = component.Air?.Pressure ?? 0, diff --git a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs index 7030d607a6..93f704fe21 100644 --- a/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs +++ b/Content.Server/Atmos/Monitor/Components/AirAlarmComponent.cs @@ -24,8 +24,6 @@ public sealed partial class AirAlarmComponent : Component public readonly Dictionary ScrubberData = new(); public readonly Dictionary SensorData = new(); - public HashSet ActivePlayers = new(); - public bool CanSync = true; /// diff --git a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs index 2922d0796a..881f54512a 100644 --- a/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs +++ b/Content.Server/Atmos/Monitor/Systems/AirAlarmSystem.cs @@ -223,8 +223,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnClose(EntityUid uid, AirAlarmComponent component, BoundUIClosedEvent args) { - component.ActivePlayers.Remove(args.Session.UserId); - if (component.ActivePlayers.Count == 0) + if (!_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key)) RemoveActiveInterface(uid); } @@ -247,9 +246,6 @@ public sealed class AirAlarmSystem : EntitySystem private void OnActivate(EntityUid uid, AirAlarmComponent component, ActivateInWorldEvent args) { - if (!TryComp(args.User, out var actor)) - return; - if (TryComp(uid, out var panel) && panel.Open) { args.Handled = false; @@ -259,10 +255,7 @@ public sealed class AirAlarmSystem : EntitySystem if (!this.IsPowered(uid, EntityManager)) return; - var ui = _ui.GetUiOrNull(uid, SharedAirAlarmInterfaceKey.Key); - if (ui != null) - _ui.OpenUi(ui, actor.PlayerSession); - component.ActivePlayers.Add(actor.PlayerSession.UserId); + _ui.OpenUi(uid, SharedAirAlarmInterfaceKey.Key, args.User); AddActiveInterface(uid); SyncAllDevices(uid); UpdateUI(uid, component); @@ -270,7 +263,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnResyncAll(EntityUid uid, AirAlarmComponent component, AirAlarmResyncAllDevicesMessage args) { - if (!AccessCheck(uid, args.Session.AttachedEntity, component)) + if (!AccessCheck(uid, args.Actor, component)) { return; } @@ -285,7 +278,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateAlarmMode(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmModeMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component)) + if (AccessCheck(uid, args.Actor, component)) { var addr = string.Empty; if (TryComp(uid, out var netConn)) @@ -309,7 +302,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateThreshold(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateAlarmThresholdMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component)) + if (AccessCheck(uid, args.Actor, component)) SetThreshold(uid, args.Address, args.Type, args.Threshold, args.Gas); else UpdateUI(uid, component); @@ -317,7 +310,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnUpdateDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmUpdateDeviceDataMessage args) { - if (AccessCheck(uid, args.Session.AttachedEntity, component) + if (AccessCheck(uid, args.Actor, component) && _deviceList.ExistsInDeviceList(uid, args.Address)) { SetDeviceData(uid, args.Address, args.Data); @@ -330,7 +323,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnCopyDeviceData(EntityUid uid, AirAlarmComponent component, AirAlarmCopyDeviceDataMessage args) { - if (!AccessCheck(uid, args.Session.AttachedEntity, component)) + if (!AccessCheck(uid, args.Actor, component)) { UpdateUI(uid, component); return; @@ -377,7 +370,7 @@ public sealed class AirAlarmSystem : EntitySystem private void OnAtmosAlarm(EntityUid uid, AirAlarmComponent component, AtmosAlarmEvent args) { - if (component.ActivePlayers.Count != 0) + if (_ui.IsUiOpen(uid, SharedAirAlarmInterfaceKey.Key)) { SyncAllDevices(uid); } @@ -571,7 +564,7 @@ public sealed class AirAlarmSystem : EntitySystem /// private void ForceCloseAllInterfaces(EntityUid uid) { - _ui.TryCloseAll(uid, SharedAirAlarmInterfaceKey.Key); + _ui.CloseUi(uid, SharedAirAlarmInterfaceKey.Key); } private void OnAtmosUpdate(EntityUid uid, AirAlarmComponent alarm, ref AtmosDeviceUpdateEvent args) @@ -639,7 +632,7 @@ public sealed class AirAlarmSystem : EntitySystem highestAlarm = AtmosAlarmType.Normal; } - _ui.TrySetUiState( + _ui.SetUiState( uid, SharedAirAlarmInterfaceKey.Key, new AirAlarmUIState(devNet.Address, deviceCount, pressure, temperature, dataToSend, alarm.CurrentMode, alarm.CurrentTab, highestAlarm.Value, alarm.AutoMode)); diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs index af25d04df9..83b7b67ba4 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasPressurePumpSystem.cs @@ -98,7 +98,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems UpdateAppearance(uid, pump); DirtyUI(uid, pump); - _userInterfaceSystem.TryCloseAll(uid, GasPressurePumpUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasPressurePumpUiKey.Key); } private void OnPumpActivate(EntityUid uid, GasPressurePumpComponent pump, ActivateInWorldEvent args) @@ -108,7 +108,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasPressurePumpUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasPressurePumpUiKey.Key, actor.PlayerSession); DirtyUI(uid, pump); } else @@ -123,7 +123,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, pump); UpdateAppearance(uid, pump); } @@ -132,7 +132,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.TargetPressure = Math.Clamp(args.Pressure, 0f, Atmospherics.MaxOutputPressure); _adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); + $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); DirtyUI(uid, pump); } @@ -142,7 +142,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (!Resolve(uid, ref pump)) return; - _userInterfaceSystem.TrySetUiState(uid, GasPressurePumpUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasPressurePumpUiKey.Key, new GasPressurePumpBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, pump.TargetPressure, pump.Enabled)); } diff --git a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs index e4767c4061..cbcd1f4fa3 100644 --- a/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs +++ b/Content.Server/Atmos/Piping/Binary/EntitySystems/GasVolumePumpSystem.cs @@ -128,7 +128,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems UpdateAppearance(uid, pump); DirtyUI(uid, pump); - _userInterfaceSystem.TryCloseAll(uid, GasVolumePumpUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasVolumePumpUiKey.Key); } private void OnPumpActivate(EntityUid uid, GasVolumePumpComponent pump, ActivateInWorldEvent args) @@ -138,7 +138,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasVolumePumpUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasVolumePumpUiKey.Key, actor.PlayerSession); DirtyUI(uid, pump); } else @@ -153,7 +153,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, pump); UpdateAppearance(uid, pump); } @@ -162,7 +162,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems { pump.TransferRate = Math.Clamp(args.TransferRate, 0f, pump.MaxTransferRate); _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); + $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.TransferRate}"); DirtyUI(uid, pump); } @@ -171,7 +171,7 @@ namespace Content.Server.Atmos.Piping.Binary.EntitySystems if (!Resolve(uid, ref pump)) return; - _userInterfaceSystem.TrySetUiState(uid, GasVolumePumpUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasVolumePumpUiKey.Key, new GasVolumePumpBoundUserInterfaceState(Name(uid), pump.TransferRate, pump.Enabled)); } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs index c0c2b930f6..007d304e98 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasFilterSystem.cs @@ -94,7 +94,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems _ambientSoundSystem.SetAmbience(uid, false); DirtyUI(uid, filter); - _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key); } private void OnFilterActivate(EntityUid uid, GasFilterComponent filter, ActivateInWorldEvent args) @@ -104,7 +104,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (EntityManager.GetComponent(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasFilterUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasFilterUiKey.Key, actor.PlayerSession); DirtyUI(uid, filter); } else @@ -120,7 +120,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (!Resolve(uid, ref filter)) return; - _userInterfaceSystem.TrySetUiState(uid, GasFilterUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasFilterUiKey.Key, new GasFilterBoundUserInterfaceState(MetaData(uid).EntityName, filter.TransferRate, filter.Enabled, filter.FilteredGas)); } @@ -136,7 +136,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, filter); UpdateAppearance(uid, filter); } @@ -145,7 +145,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.TransferRate = Math.Clamp(args.Rate, 0f, filter.MaxTransferRate); _adminLogger.Add(LogType.AtmosVolumeChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}"); + $"{ToPrettyString(args.Actor):player} set the transfer rate on {ToPrettyString(uid):device} to {args.Rate}"); DirtyUI(uid, filter); } @@ -158,7 +158,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.FilteredGas = parsedGas; _adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}"); + $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to {parsedGas.ToString()}"); DirtyUI(uid, filter); } else @@ -170,7 +170,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { filter.FilteredGas = null; _adminLogger.Add(LogType.AtmosFilterChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the filter on {ToPrettyString(uid):device} to none"); + $"{ToPrettyString(args.Actor):player} set the filter on {ToPrettyString(uid):device} to none"); DirtyUI(uid, filter); } } diff --git a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs index 4d7fc134c7..4ab8572843 100644 --- a/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs +++ b/Content.Server/Atmos/Piping/Trinary/EntitySystems/GasMixerSystem.cs @@ -134,7 +134,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems DirtyUI(uid, mixer); UpdateAppearance(uid, mixer); - _userInterfaceSystem.TryCloseAll(uid, GasFilterUiKey.Key); + _userInterfaceSystem.CloseUi(uid, GasFilterUiKey.Key); } private void OnMixerActivate(EntityUid uid, GasMixerComponent mixer, ActivateInWorldEvent args) @@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (Transform(uid).Anchored) { - _userInterfaceSystem.TryOpen(uid, GasMixerUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, GasMixerUiKey.Key, actor.PlayerSession); DirtyUI(uid, mixer); } else @@ -160,7 +160,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems if (!Resolve(uid, ref mixer)) return; - _userInterfaceSystem.TrySetUiState(uid, GasMixerUiKey.Key, + _userInterfaceSystem.SetUiState(uid, GasMixerUiKey.Key, new GasMixerBoundUserInterfaceState(EntityManager.GetComponent(uid).EntityName, mixer.TargetPressure, mixer.Enabled, mixer.InletOneConcentration)); } @@ -176,7 +176,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { mixer.Enabled = args.Enabled; _adminLogger.Add(LogType.AtmosPowerChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); + $"{ToPrettyString(args.Actor):player} set the power on {ToPrettyString(uid):device} to {args.Enabled}"); DirtyUI(uid, mixer); UpdateAppearance(uid, mixer); } @@ -185,7 +185,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems { mixer.TargetPressure = Math.Clamp(args.Pressure, 0f, mixer.MaxTargetPressure); _adminLogger.Add(LogType.AtmosPressureChanged, LogImpact.Medium, - $"{ToPrettyString(args.Session.AttachedEntity!.Value):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); + $"{ToPrettyString(args.Actor):player} set the pressure on {ToPrettyString(uid):device} to {args.Pressure}kPa"); DirtyUI(uid, mixer); } @@ -196,7 +196,7 @@ namespace Content.Server.Atmos.Piping.Trinary.EntitySystems mixer.InletOneConcentration = nodeOne; mixer.InletTwoConcentration = 1.0f - mixer.InletOneConcentration; _adminLogger.Add(LogType.AtmosRatioChanged, LogImpact.Medium, - $"{EntityManager.ToPrettyString(args.Session.AttachedEntity!.Value):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}"); + $"{EntityManager.ToPrettyString(args.Actor):player} set the ratio on {EntityManager.ToPrettyString(uid):device} to {mixer.InletOneConcentration}:{mixer.InletTwoConcentration}"); DirtyUI(uid, mixer); } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs index bdc9e76538..e279db09aa 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasCanisterSystem.cs @@ -96,7 +96,7 @@ public sealed class GasCanisterSystem : EntitySystem tankPressure = tankComponent.Air.Pressure; } - _ui.TrySetUiState(uid, GasCanisterUiKey.Key, + _ui.SetUiState(uid, GasCanisterUiKey.Key, new GasCanisterBoundUserInterfaceState(Name(uid), canister.Air.Pressure, portStatus, tankLabel, tankPressure, canister.ReleasePressure, canister.ReleaseValve, canister.MinReleasePressure, canister.MaxReleasePressure)); @@ -104,19 +104,19 @@ public sealed class GasCanisterSystem : EntitySystem private void OnHoldingTankEjectMessage(EntityUid uid, GasCanisterComponent canister, GasCanisterHoldingTankEjectMessage args) { - if (canister.GasTankSlot.Item == null || args.Session.AttachedEntity == null) + if (canister.GasTankSlot.Item == null) return; var item = canister.GasTankSlot.Item; - _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Session.AttachedEntity); - _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}"); + _slots.TryEjectToHands(uid, canister.GasTankSlot, args.Actor); + _adminLogger.Add(LogType.CanisterTankEjected, LogImpact.Medium, $"Player {ToPrettyString(args.Actor):player} ejected tank {ToPrettyString(item):tank} from {ToPrettyString(uid):canister}"); } private void OnCanisterChangeReleasePressure(EntityUid uid, GasCanisterComponent canister, GasCanisterChangeReleasePressureMessage args) { var pressure = Math.Clamp(args.Pressure, canister.MinReleasePressure, canister.MaxReleasePressure); - _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}"); + _adminLogger.Add(LogType.CanisterPressure, LogImpact.Medium, $"{ToPrettyString(args.Actor):player} set the release pressure on {ToPrettyString(uid):canister} to {args.Pressure}"); canister.ReleasePressure = pressure; DirtyUI(uid, canister); @@ -129,14 +129,14 @@ public sealed class GasCanisterSystem : EntitySystem impact = canister.GasTankSlot.HasItem ? LogImpact.Medium : LogImpact.High; var containedGasDict = new Dictionary(); - var containedGasArray = Gas.GetValues(typeof(Gas)); + var containedGasArray = Enum.GetValues(typeof(Gas)); for (int i = 0; i < containedGasArray.Length; i++) { containedGasDict.Add((Gas)i, canister.Air[i]); } - _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Session.AttachedEntity.GetValueOrDefault()):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]"); + _adminLogger.Add(LogType.CanisterValve, impact, $"{ToPrettyString(args.Actor):player} set the valve on {ToPrettyString(uid):canister} to {args.Valve:valveState} while it contained [{string.Join(", ", containedGasDict)}]"); canister.ReleaseValve = args.Valve; DirtyUI(uid, canister); @@ -212,7 +212,7 @@ public sealed class GasCanisterSystem : EntitySystem if (args.Handled) return; - _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession); args.Handled = true; } @@ -224,7 +224,7 @@ public sealed class GasCanisterSystem : EntitySystem if (CheckLocked(uid, component, args.User)) return; - _ui.TryOpen(uid, GasCanisterUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, GasCanisterUiKey.Key, actor.PlayerSession); args.Handled = true; } diff --git a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs index 9b61044f03..827ba0bda5 100644 --- a/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs +++ b/Content.Server/Atmos/Piping/Unary/EntitySystems/GasThermoMachineSystem.cs @@ -144,7 +144,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems private void OnToggleMessage(EntityUid uid, GasThermoMachineComponent thermoMachine, GasThermomachineToggleMessage args) { var powerState = _power.TogglePower(uid); - _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Session.AttachedEntity)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); + _adminLogger.Add(LogType.AtmosPowerChanged, $"{ToPrettyString(args.Actor)} turned {(powerState ? "On" : "Off")} {ToPrettyString(uid)}"); DirtyUI(uid, thermoMachine); } @@ -155,7 +155,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems else thermoMachine.TargetTemperature = MathF.Max(args.Temperature, thermoMachine.MinTemperature); thermoMachine.TargetTemperature = MathF.Max(thermoMachine.TargetTemperature, Atmospherics.TCMB); - _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Session.AttachedEntity)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}"); + _adminLogger.Add(LogType.AtmosTemperatureChanged, $"{ToPrettyString(args.Actor)} set temperature on {ToPrettyString(uid)} to {thermoMachine.TargetTemperature}"); DirtyUI(uid, thermoMachine); } @@ -168,8 +168,8 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems if (!Resolve(uid, ref powerReceiver)) return; - _userInterfaceSystem.TrySetUiState(uid, ThermomachineUiKey.Key, - new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine)), null, ui); + _userInterfaceSystem.SetUiState(uid, ThermomachineUiKey.Key, + new GasThermomachineBoundUserInterfaceState(thermoMachine.MinTemperature, thermoMachine.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, IsHeater(thermoMachine))); } private void OnExamined(EntityUid uid, GasThermoMachineComponent thermoMachine, ExaminedEvent args) diff --git a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs index fff15f696c..cbf63f5404 100644 --- a/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs +++ b/Content.Server/Atmos/Portable/SpaceHeaterSystem.cs @@ -163,7 +163,7 @@ public sealed class SpaceHeaterSystem : EntitySystem { return; } - _userInterfaceSystem.TrySetUiState(uid, SpaceHeaterUiKey.Key, + _userInterfaceSystem.SetUiState(uid, SpaceHeaterUiKey.Key, new SpaceHeaterBoundUserInterfaceState(spaceHeater.MinTemperature, spaceHeater.MaxTemperature, thermoMachine.TargetTemperature, !powerReceiver.PowerDisabled, spaceHeater.Mode, spaceHeater.PowerLevel)); } diff --git a/Content.Server/Audio/Jukebox/JukeboxSystem.cs b/Content.Server/Audio/Jukebox/JukeboxSystem.cs index bfb9b2099a..cc9235e3d7 100644 --- a/Content.Server/Audio/Jukebox/JukeboxSystem.cs +++ b/Content.Server/Audio/Jukebox/JukeboxSystem.cs @@ -5,6 +5,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Audio.Components; using Robust.Shared.Audio.Systems; +using Robust.Shared.Player; using Robust.Shared.Prototypes; using JukeboxComponent = Content.Shared.Audio.Jukebox.JukeboxComponent; @@ -66,8 +67,11 @@ public sealed class JukeboxSystem : SharedJukeboxSystem private void OnJukeboxSetTime(EntityUid uid, JukeboxComponent component, JukeboxSetTimeMessage args) { - var offset = (args.Session.Channel.Ping * 1.5f) / 1000f; - Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset); + if (TryComp(args.Actor, out ActorComponent? actorComp)) + { + var offset = actorComp.PlayerSession.Channel.Ping * 1.5f / 1000f; + Audio.SetPlaybackPosition(component.AudioStream, args.SongTime + offset); + } } private void OnPowerChanged(Entity entity, ref PowerChangedEvent args) diff --git a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs index 2e7f8c4235..1369fa20f1 100644 --- a/Content.Server/Bed/Cryostorage/CryostorageSystem.cs +++ b/Content.Server/Bed/Cryostorage/CryostorageSystem.cs @@ -79,9 +79,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem private void OnRemoveItemBuiMessage(Entity ent, ref CryostorageRemoveItemBuiMessage args) { var (_, comp) = ent; - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - + var attachedEntity = args.Actor; var cryoContained = GetEntity(args.StoredEntity); if (!comp.StoredPlayers.Contains(cryoContained) || !IsInPausedMap(cryoContained)) @@ -114,6 +112,7 @@ public sealed class CryostorageSystem : SharedCryostorageSystem AdminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(attachedEntity):player} removed item {ToPrettyString(entity)} from cryostorage-contained player " + $"{ToPrettyString(cryoContained):player}, stored in cryostorage {ToPrettyString(ent)}"); + _container.TryRemoveFromContainer(entity.Value); _transform.SetCoordinates(entity.Value, Transform(attachedEntity).Coordinates); _hands.PickupOrDrop(attachedEntity, entity.Value); @@ -122,8 +121,8 @@ public sealed class CryostorageSystem : SharedCryostorageSystem private void UpdateCryostorageUIState(Entity ent) { - var state = new CryostorageBuiState(GetAllContainedData(ent).ToList()); - _ui.TrySetUiState(ent, CryostorageUIKey.Key, state); + var state = new CryostorageBuiState(GetAllContainedData(ent)); + _ui.SetUiState(ent.Owner, CryostorageUIKey.Key, state); } private void OnPlayerSpawned(Entity ent, ref PlayerSpawnCompleteEvent args) @@ -293,12 +292,17 @@ public sealed class CryostorageSystem : SharedCryostorageSystem _chatManager.ChatMessageToOne(ChatChannel.Server, msg, msg, uid, false, actor.PlayerSession.Channel); } - private IEnumerable GetAllContainedData(Entity ent) + private List GetAllContainedData(Entity ent) { + var data = new List(); + data.EnsureCapacity(ent.Comp.StoredPlayers.Count); + foreach (var contained in ent.Comp.StoredPlayers) { - yield return GetContainedData(contained); + data.Add(GetContainedData(contained)); } + + return data; } private CryostorageContainedPlayerData GetContainedData(EntityUid uid) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs index 22e5c67e17..e132e4f12a 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Bounty.cs @@ -52,7 +52,7 @@ public sealed partial class CargoSystem return; var untilNextSkip = bountyDb.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip)); + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(bountyDb.Bounties, untilNextSkip)); } private void OnPrintLabelMessage(EntityUid uid, CargoBountyConsoleComponent component, BountyPrintLabelMessage args) @@ -83,7 +83,7 @@ public sealed partial class CargoSystem if (!TryGetBountyFromId(station, args.BountyId, out var bounty)) return; - if (args.Session.AttachedEntity is not { Valid: true } mob) + if (args.Actor is not { Valid: true } mob) return; if (TryComp(uid, out var accessReaderComponent) && @@ -99,7 +99,7 @@ public sealed partial class CargoSystem FillBountyDatabase(station); db.NextSkipTime = _timing.CurTime + db.SkipDelay; var untilNextSkip = db.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); _audio.PlayPvs(component.SkipSound, uid); } @@ -462,10 +462,12 @@ public sealed partial class CargoSystem { if (_station.GetOwningStation(uid) is not { } station || !TryComp(station, out var db)) + { continue; + } var untilNextSkip = db.NextSkipTime - _timing.CurTime; - _uiSystem.TrySetUiState(uid, CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip), ui: ui); + _uiSystem.SetUiState((uid, ui), CargoConsoleUiKey.Bounty, new CargoBountyConsoleState(db.Bounties, untilNextSkip)); } } diff --git a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs index 13a1d3d565..63556d2fbd 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Orders.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Orders.cs @@ -102,12 +102,12 @@ namespace Content.Server.Cargo.Systems private void OnApproveOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleApproveOrderMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; if (!_accessReaderSystem.IsAllowed(player, uid)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-order-not-allowed")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-order-not-allowed")); PlayDenySound(uid, component); return; } @@ -119,7 +119,7 @@ namespace Content.Server.Cargo.Systems !TryComp(station, out StationDataComponent? stationData) || !TryGetOrderDatabase(station, out var orderDatabase)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-station-not-found")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-station-not-found")); PlayDenySound(uid, component); return; } @@ -134,7 +134,7 @@ namespace Content.Server.Cargo.Systems // Invalid order if (!_protoMan.HasIndex(order.ProductId)) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-invalid-product")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-invalid-product")); PlayDenySound(uid, component); return; } @@ -145,7 +145,7 @@ namespace Content.Server.Cargo.Systems // Too many orders, avoid them getting spammed in the UI. if (amount >= capacity) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-too-many")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-too-many")); PlayDenySound(uid, component); return; } @@ -156,7 +156,7 @@ namespace Content.Server.Cargo.Systems if (cappedAmount != order.OrderQuantity) { order.OrderQuantity = cappedAmount; - ConsolePopup(args.Session, Loc.GetString("cargo-console-snip-snip")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-snip-snip")); PlayDenySound(uid, component); } @@ -165,7 +165,7 @@ namespace Content.Server.Cargo.Systems // Not enough balance if (cost > bank.Balance) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost))); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-insufficient-funds", ("cost", cost))); PlayDenySound(uid, component); return; } @@ -180,7 +180,7 @@ namespace Content.Server.Cargo.Systems if (ev.FulfillmentEntity == null) { - ConsolePopup(args.Session, Loc.GetString("cargo-console-unfulfilled")); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-unfulfilled")); PlayDenySound(uid, component); return; } @@ -200,7 +200,7 @@ namespace Content.Server.Cargo.Systems ("approverJob", approverJob), ("cost", cost)); _radio.SendRadioMessage(uid, message, component.AnnouncementChannel, uid, escapeMarkup: false); - ConsolePopup(args.Session, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName))); + ConsolePopup(args.Actor, Loc.GetString("cargo-console-trade-station", ("destination", MetaData(ev.FulfillmentEntity.Value).EntityName))); // Log order approval _adminLogger.Add(LogType.Action, LogImpact.Low, @@ -271,7 +271,7 @@ namespace Content.Server.Cargo.Systems private void OnAddOrderMessage(EntityUid uid, CargoOrderConsoleComponent component, CargoConsoleAddOrderMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) return; if (args.Amount <= 0) @@ -319,9 +319,9 @@ namespace Content.Server.Cargo.Systems !TryComp(station, out var orderDatabase) || !TryComp(station, out var bankAccount)) return; - if (_uiSystem.TryGetUi(consoleUid, CargoConsoleUiKey.Orders, out var bui)) + if (_uiSystem.HasUi(consoleUid, CargoConsoleUiKey.Orders)) { - _uiSystem.SetUiState(bui, new CargoConsoleInterfaceState( + _uiSystem.SetUiState(consoleUid, CargoConsoleUiKey.Orders, new CargoConsoleInterfaceState( MetaData(station.Value).EntityName, GetOutstandingOrderCount(orderDatabase), orderDatabase.Capacity, @@ -331,9 +331,9 @@ namespace Content.Server.Cargo.Systems } } - private void ConsolePopup(ICommonSession session, string text) + private void ConsolePopup(EntityUid actor, string text) { - _popup.PopupCursor(text, session); + _popup.PopupCursor(text, actor); } private void PlayDenySound(EntityUid uid, CargoOrderConsoleComponent component) diff --git a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs index aa2614cdb8..e9f6d00822 100644 --- a/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs +++ b/Content.Server/Cargo/Systems/CargoSystem.Shuttle.cs @@ -54,21 +54,20 @@ public sealed partial class CargoSystem private void UpdatePalletConsoleInterface(EntityUid uid) { - var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale); if (Transform(uid).GridUid is not EntityUid gridUid) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState(0, 0, false)); return; } GetPalletGoods(gridUid, out var toSell, out var amount); - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState((int) amount, toSell.Count, true)); } private void OnPalletUIOpen(EntityUid uid, CargoPalletConsoleComponent component, BoundUIOpenedEvent args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; @@ -86,7 +85,7 @@ public sealed partial class CargoSystem private void OnPalletAppraise(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletAppraiseMessage args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; @@ -108,8 +107,8 @@ public sealed partial class CargoSystem var orders = GetProjectedOrders(station ?? EntityUid.Invalid, orderDatabase, shuttle); var shuttleName = orderDatabase?.Shuttle != null ? MetaData(orderDatabase.Shuttle.Value).EntityName : string.Empty; - if (_uiSystem.TryGetUi(uid, CargoConsoleUiKey.Shuttle, out var bui)) - _uiSystem.SetUiState(bui, new CargoShuttleConsoleBoundUserInterfaceState( + if (_uiSystem.HasUi(uid, CargoConsoleUiKey.Shuttle)) + _uiSystem.SetUiState(uid, CargoConsoleUiKey.Shuttle, new CargoShuttleConsoleBoundUserInterfaceState( station != null ? MetaData(station.Value).EntityName : Loc.GetString("cargo-shuttle-console-station-unknown"), string.IsNullOrEmpty(shuttleName) ? Loc.GetString("cargo-shuttle-console-shuttle-not-found") : shuttleName, orders @@ -314,17 +313,16 @@ public sealed partial class CargoSystem private void OnPalletSale(EntityUid uid, CargoPalletConsoleComponent component, CargoPalletSellMessage args) { - var player = args.Session.AttachedEntity; + var player = args.Actor; if (player == null) return; - var bui = _uiSystem.GetUi(uid, CargoPalletConsoleUiKey.Sale); var xform = Transform(uid); if (xform.GridUid is not EntityUid gridUid) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, CargoPalletConsoleUiKey.Sale, new CargoPalletConsoleInterfaceState(0, 0, false)); return; } diff --git a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs index 4a76aef911..7896a7822e 100644 --- a/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs +++ b/Content.Server/CartridgeLoader/CartridgeLoaderSystem.cs @@ -103,12 +103,12 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem if (!Resolve(loaderUid, ref loader)) return; - if (!_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui)) + if (!_userInterfaceSystem.HasUi(loaderUid, loader.UiKey)) return; var programs = GetAvailablePrograms(loaderUid, loader); var state = new CartridgeLoaderUiState(programs, GetNetEntity(loader.ActiveProgram)); - _userInterfaceSystem.SetUiState(ui, state, session); + _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state); } /// @@ -127,8 +127,8 @@ public sealed class CartridgeLoaderSystem : SharedCartridgeLoaderSystem if (!Resolve(loaderUid, ref loader)) return; - if (_userInterfaceSystem.TryGetUi(loaderUid, loader.UiKey, out var ui)) - _userInterfaceSystem.SetUiState(ui, state, session); + if (_userInterfaceSystem.HasUi(loaderUid, loader.UiKey)) + _userInterfaceSystem.SetUiState(loaderUid, loader.UiKey, state); } /// diff --git a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs index ab91044574..289db75981 100644 --- a/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ChemMasterSystem.cs @@ -80,7 +80,7 @@ namespace Content.Server.Chemistry.EntitySystems chemMaster.Mode, BuildInputContainerInfo(inputContainer), BuildOutputContainerInfo(outputContainer), bufferReagents, bufferCurrentVolume, chemMaster.PillType, chemMaster.PillDosageLimit, updateLabel); - _userInterfaceSystem.TrySetUiState(owner, ChemMasterUiKey.Key, state); + _userInterfaceSystem.SetUiState(owner, ChemMasterUiKey.Key, state); } private void OnSetModeMessage(Entity chemMaster, ref ChemMasterSetModeMessage message) @@ -179,7 +179,7 @@ namespace Content.Server.Chemistry.EntitySystems private void OnCreatePillsMessage(Entity chemMaster, ref ChemMasterCreatePillsMessage message) { - var user = message.Session.AttachedEntity; + var user = message.Actor; var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName); if (maybeContainer is not { Valid: true } container || !TryComp(container, out StorageComponent? storage)) @@ -218,18 +218,9 @@ namespace Content.Server.Chemistry.EntitySystems pill.PillType = chemMaster.Comp.PillType; Dirty(item, pill); - if (user.HasValue) - { - // Log pill creation by a user - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(user.Value):user} printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); - } - else - { - // Log pill creation by magic? This should never happen... right? - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Unknown printed {ToPrettyString(item):pill} {SolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); - } + // Log pill creation by a user + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(user):user} printed {ToPrettyString(item):pill} {SharedSolutionContainerSystem.ToPrettyString(itemSolution.Comp.Solution)}"); } UpdateUiState(chemMaster); @@ -238,7 +229,7 @@ namespace Content.Server.Chemistry.EntitySystems private void OnOutputToBottleMessage(Entity chemMaster, ref ChemMasterOutputToBottleMessage message) { - var user = message.Session.AttachedEntity; + var user = message.Actor; var maybeContainer = _itemSlotsSystem.GetItemOrNull(chemMaster, SharedChemMaster.OutputSlotName); if (maybeContainer is not { Valid: true } container || !_solutionContainerSystem.TryGetSolution(container, SharedChemMaster.BottleSolutionName, out var soln, out var solution)) @@ -260,18 +251,9 @@ namespace Content.Server.Chemistry.EntitySystems _labelSystem.Label(container, message.Label); _solutionContainerSystem.TryAddSolution(soln.Value, withdrawal); - if (user.HasValue) - { - // Log bottle creation by a user - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(user.Value):user} bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}"); - } - else - { - // Log bottle creation by magic? This should never happen... right? - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Unknown bottled {ToPrettyString(container):bottle} {SolutionContainerSystem.ToPrettyString(solution)}"); - } + // Log bottle creation by a user + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(user):user} bottled {ToPrettyString(container):bottle} {SharedSolutionContainerSystem.ToPrettyString(solution)}"); UpdateUiState(chemMaster); ClickSound(chemMaster); diff --git a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs index d6433da56a..3bcdd4b964 100644 --- a/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs +++ b/Content.Server/Chemistry/EntitySystems/ReagentDispenserSystem.cs @@ -62,7 +62,7 @@ namespace Content.Server.Chemistry.EntitySystems var inventory = GetInventory(reagentDispenser); var state = new ReagentDispenserBoundUserInterfaceState(outputContainerInfo, GetNetEntity(outputContainer), inventory, reagentDispenser.Comp.DispenseAmount); - _userInterfaceSystem.TrySetUiState(reagentDispenser, ReagentDispenserUiKey.Key, state); + _userInterfaceSystem.SetUiState(reagentDispenser.Owner, ReagentDispenserUiKey.Key, state); } private ContainerInfo? BuildOutputContainerInfo(EntityUid? container) diff --git a/Content.Server/Cloning/CloningConsoleSystem.cs b/Content.Server/Cloning/CloningConsoleSystem.cs index 4176806639..950a6599a8 100644 --- a/Content.Server/Cloning/CloningConsoleSystem.cs +++ b/Content.Server/Cloning/CloningConsoleSystem.cs @@ -135,17 +135,17 @@ namespace Content.Server.Cloning public void UpdateUserInterface(EntityUid consoleUid, CloningConsoleComponent consoleComponent) { - if (!_uiSystem.TryGetUi(consoleUid, CloningConsoleUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(consoleUid, CloningConsoleUiKey.Key)) return; if (!_powerReceiverSystem.IsPowered(consoleUid)) { - _uiSystem.CloseAll(ui); + _uiSystem.CloseUis(consoleUid); return; } var newState = GetUserInterfaceState(consoleComponent); - _uiSystem.SetUiState(ui, newState); + _uiSystem.SetUiState(consoleUid, CloningConsoleUiKey.Key, newState); } public void TryClone(EntityUid uid, EntityUid cloningPodUid, EntityUid scannerUid, CloningPodComponent? cloningPod = null, MedicalScannerComponent? scannerComp = null, CloningConsoleComponent? consoleComponent = null) diff --git a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs index 23b772d99c..feb3428884 100644 --- a/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs +++ b/Content.Server/Clothing/Systems/ChameleonClothingSystem.cs @@ -64,7 +64,7 @@ public sealed class ChameleonClothingSystem : SharedChameleonClothingSystem return; var state = new ChameleonBoundUserInterfaceState(component.Slot, component.Default); - _uiSystem.TrySetUiState(uid, ChameleonUiKey.Key, state); + _uiSystem.SetUiState(uid, ChameleonUiKey.Key, state); } /// diff --git a/Content.Server/Communications/CommunicationsConsoleSystem.cs b/Content.Server/Communications/CommunicationsConsoleSystem.cs index 6475e1a6d7..61a18fe3d5 100644 --- a/Content.Server/Communications/CommunicationsConsoleSystem.cs +++ b/Content.Server/Communications/CommunicationsConsoleSystem.cs @@ -82,8 +82,8 @@ namespace Content.Server.Communications comp.UIUpdateAccumulator -= UIUpdateInterval; - if (_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out var ui) && ui.SubscribedSessions.Count > 0) - UpdateCommsConsoleInterface(uid, comp, ui); + if (_uiSystem.IsUiOpen(uid, CommunicationsConsoleUiKey.Key)) + UpdateCommsConsoleInterface(uid, comp); } base.Update(frameTime); @@ -136,11 +136,8 @@ namespace Content.Server.Communications /// /// Updates the UI for a particular comms console. /// - public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp, PlayerBoundUserInterface? ui = null) + public void UpdateCommsConsoleInterface(EntityUid uid, CommunicationsConsoleComponent comp) { - if (ui == null && !_uiSystem.TryGetUi(uid, CommunicationsConsoleUiKey.Key, out ui)) - return; - var stationUid = _stationSystem.GetOwningStation(uid); List? levels = null; string currentLevel = default!; @@ -168,7 +165,7 @@ namespace Content.Server.Communications } } - _uiSystem.SetUiState(ui, new CommunicationsConsoleInterfaceState( + _uiSystem.SetUiState(uid, CommunicationsConsoleUiKey.Key, new CommunicationsConsoleInterfaceState( CanAnnounce(comp), CanCallOrRecall(comp), levels, @@ -219,12 +216,12 @@ namespace Content.Server.Communications private void OnSelectAlertLevelMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleSelectAlertLevelMessage message) { - if (message.Session.AttachedEntity is not { Valid: true } mob) + if (message.Actor is not { Valid: true } mob) return; if (!CanUse(mob, uid)) { - _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Session, PopupType.Medium); + _popupSystem.PopupCursor(Loc.GetString("comms-console-permission-denied"), message.Actor, PopupType.Medium); return; } @@ -241,7 +238,7 @@ namespace Content.Server.Communications var maxLength = _cfg.GetCVar(CCVars.ChatMaxAnnouncementLength); var msg = SharedChatSystem.SanitizeAnnouncement(message.Message, maxLength); var author = Loc.GetString("comms-console-announcement-unknown-sender"); - if (message.Session.AttachedEntity is { Valid: true } mob) + if (message.Actor is { Valid: true } mob) { if (!CanAnnounce(comp)) { @@ -250,7 +247,7 @@ namespace Content.Server.Communications if (!CanUse(mob, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } @@ -263,7 +260,7 @@ namespace Content.Server.Communications comp.AnnouncementCooldownRemaining = comp.Delay; UpdateCommsConsoleInterface(uid, comp); - var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Session.AttachedEntity); + var ev = new CommunicationConsoleAnnouncementEvent(uid, comp, msg, message.Actor); RaiseLocalEvent(ref ev); // allow admemes with vv @@ -275,15 +272,14 @@ namespace Content.Server.Communications { _chatSystem.DispatchGlobalAnnouncement(msg, title, announcementSound: comp.Sound, colorOverride: comp.Color); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following global announcement: {msg}"); - + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following global announcement: {msg}"); return; } + _chatSystem.DispatchStationAnnouncement(uid, msg, title, colorOverride: comp.Color); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following station announcement: {msg}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following station announcement: {msg}"); + } private void OnBroadcastMessage(EntityUid uid, CommunicationsConsoleComponent component, CommunicationsConsoleBroadcastMessage message) @@ -298,8 +294,7 @@ namespace Content.Server.Communications _deviceNetworkSystem.QueuePacket(uid, null, payload, net.TransmitFrequency); - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} has sent the following broadcast: {message.Message:msg}"); + _adminLogger.Add(LogType.DeviceNetwork, LogImpact.Low, $"{ToPrettyString(message.Actor):player} has sent the following broadcast: {message.Message:msg}"); } private void OnCallShuttleMessage(EntityUid uid, CommunicationsConsoleComponent comp, CommunicationsConsoleCallEmergencyShuttleMessage message) @@ -307,12 +302,11 @@ namespace Content.Server.Communications if (!CanCallOrRecall(comp)) return; - if (message.Session.AttachedEntity is not { Valid: true } mob) - return; + var mob = message.Actor; if (!CanUse(mob, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } @@ -320,7 +314,7 @@ namespace Content.Server.Communications RaiseLocalEvent(ref ev); if (ev.Cancelled) { - _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Session); + _popupSystem.PopupEntity(ev.Reason ?? Loc.GetString("comms-console-shuttle-unavailable"), uid, message.Actor); return; } @@ -333,17 +327,14 @@ namespace Content.Server.Communications if (!CanCallOrRecall(comp)) return; - if (message.Session.AttachedEntity is not { Valid: true } mob) - return; - - if (!CanUse(mob, uid)) + if (!CanUse(message.Actor, uid)) { - _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("comms-console-permission-denied"), uid, message.Actor); return; } _roundEndSystem.CancelRoundEndCountdown(uid); - _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(mob):player} has recalled the shuttle."); + _adminLogger.Add(LogType.Action, LogImpact.Extreme, $"{ToPrettyString(message.Actor):player} has recalled the shuttle."); } } diff --git a/Content.Server/Configurable/ConfigurationSystem.cs b/Content.Server/Configurable/ConfigurationSystem.cs index eb31149eca..2683bf4e09 100644 --- a/Content.Server/Configurable/ConfigurationSystem.cs +++ b/Content.Server/Configurable/ConfigurationSystem.cs @@ -30,10 +30,7 @@ public sealed class ConfigurationSystem : EntitySystem if (!TryComp(args.Used, out ToolComponent? tool) || !tool.Qualities.Contains(component.QualityNeeded)) return; - if (!TryComp(args.User, out ActorComponent? actor)) - return; - - args.Handled = _uiSystem.TryOpen(uid, ConfigurationUiKey.Key, actor.PlayerSession); + args.Handled = _uiSystem.TryOpenUi(uid, ConfigurationUiKey.Key, args.User); } private void OnStartup(EntityUid uid, ConfigurationComponent component, ComponentStartup args) @@ -43,8 +40,8 @@ public sealed class ConfigurationSystem : EntitySystem private void UpdateUi(EntityUid uid, ConfigurationComponent component) { - if (_uiSystem.TryGetUi(uid, ConfigurationUiKey.Key, out var ui)) - _uiSystem.SetUiState(ui, new ConfigurationBoundUserInterfaceState(component.Config)); + if (_uiSystem.HasUi(uid, ConfigurationUiKey.Key)) + _uiSystem.SetUiState(uid, ConfigurationUiKey.Key, new ConfigurationBoundUserInterfaceState(component.Config)); } private void OnUpdate(EntityUid uid, ConfigurationComponent component, ConfigurationUpdatedMessage args) diff --git a/Content.Server/Construction/ConstructionSystem.Guided.cs b/Content.Server/Construction/ConstructionSystem.Guided.cs index fe7f9152c0..e096bc02c3 100644 --- a/Content.Server/Construction/ConstructionSystem.Guided.cs +++ b/Content.Server/Construction/ConstructionSystem.Guided.cs @@ -41,6 +41,18 @@ namespace Content.Server.Construction component.Node == component.DeconstructionNode) return; + if (!_prototypeManager.TryIndex(component.Graph, out ConstructionGraphPrototype? graph)) + return; + + if (component.DeconstructionNode == null) + return; + + if (GetCurrentNode(uid, component) is not {} currentNode) + return; + + if (graph.Path(currentNode.Name, component.DeconstructionNode) is not {} path || path.Length == 0) + return; + Verb verb = new(); //verb.Category = VerbCategories.Construction; //TODO VERBS add more construction verbs? Until then, removing construction category diff --git a/Content.Server/Crayon/CrayonSystem.cs b/Content.Server/Crayon/CrayonSystem.cs index 32bb96e9e2..07a13d8a34 100644 --- a/Content.Server/Crayon/CrayonSystem.cs +++ b/Content.Server/Crayon/CrayonSystem.cs @@ -90,19 +90,14 @@ public sealed class CrayonSystem : SharedCrayonSystem if (args.Handled) return; - if (!TryComp(args.User, out var actor) || - !_uiSystem.TryGetUi(uid, SharedCrayonComponent.CrayonUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(uid, SharedCrayonComponent.CrayonUiKey.Key)) { return; } - _uiSystem.ToggleUi(ui, actor.PlayerSession); - if (ui.SubscribedSessions.Contains(actor.PlayerSession)) - { - // Tell the user interface the selected stuff - _uiSystem.SetUiState(ui, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); - } + _uiSystem.TryToggleUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); + _uiSystem.SetUiState(uid, SharedCrayonComponent.CrayonUiKey.Key, new CrayonBoundUserInterfaceState(component.SelectedState, component.SelectableColor, component.Color)); args.Handled = true; } @@ -140,8 +135,8 @@ public sealed class CrayonSystem : SharedCrayonSystem private void OnCrayonDropped(EntityUid uid, CrayonComponent component, DroppedEvent args) { - if (TryComp(args.User, out var actor)) - _uiSystem.TryClose(uid, SharedCrayonComponent.CrayonUiKey.Key, actor.PlayerSession); + // TODO: Use the existing event. + _uiSystem.CloseUi(uid, SharedCrayonComponent.CrayonUiKey.Key, args.User); } private void UseUpCrayon(EntityUid uid, EntityUid user) diff --git a/Content.Server/CrewManifest/CrewManifestSystem.cs b/Content.Server/CrewManifest/CrewManifestSystem.cs index 8b4cbac5c1..e742456015 100644 --- a/Content.Server/CrewManifest/CrewManifestSystem.cs +++ b/Content.Server/CrewManifest/CrewManifestSystem.cs @@ -100,12 +100,12 @@ public sealed class CrewManifestSystem : EntitySystem return; var owningStation = _stationSystem.GetOwningStation(uid); - if (owningStation == null || ev.Session is not { } session) + if (owningStation == null || !TryComp(ev.Actor, out ActorComponent? actorComp)) { return; } - CloseEui(owningStation.Value, session, uid); + CloseEui(owningStation.Value, actorComp.PlayerSession, uid); } /// @@ -136,12 +136,12 @@ public sealed class CrewManifestSystem : EntitySystem { Log.Error( "{User} tried to open crew manifest from wrong UI: {Key}. Correct owned is {ExpectedKey}", - msg.Session, msg.UiKey, component.OwnerKey); + msg.Actor, msg.UiKey, component.OwnerKey); return; } var owningStation = _stationSystem.GetOwningStation(uid); - if (owningStation == null || msg.Session is not { } session) + if (owningStation == null || !TryComp(msg.Actor, out ActorComponent? actorComp)) { return; } @@ -151,7 +151,7 @@ public sealed class CrewManifestSystem : EntitySystem return; } - OpenEui(owningStation.Value, session, uid); + OpenEui(owningStation.Value, actorComp.PlayerSession, uid); } /// diff --git a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs index fe53ea268c..4389c68c04 100644 --- a/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs +++ b/Content.Server/CriminalRecords/Systems/CriminalRecordsConsoleSystem.cs @@ -77,7 +77,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS msg.Status == SecurityStatus.Suspected != (msg.Reason != null)) return; - if (!CheckSelected(ent, msg.Session, out var mob, out var key)) + if (!CheckSelected(ent, msg.Actor, out var mob, out var key)) return; if (!_stationRecords.TryGetRecord(key.Value, out var record) || record.Status == msg.Status) @@ -150,7 +150,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS private void OnAddHistory(Entity ent, ref CriminalRecordAddHistory msg) { - if (!CheckSelected(ent, msg.Session, out _, out var key)) + if (!CheckSelected(ent, msg.Actor, out _, out var key)) return; var line = msg.Line.Trim(); @@ -167,7 +167,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS private void OnDeleteHistory(Entity ent, ref CriminalRecordDeleteHistory msg) { - if (!CheckSelected(ent, msg.Session, out _, out var key)) + if (!CheckSelected(ent, msg.Actor, out _, out var key)) return; if (!_criminalRecords.TryDeleteHistory(key.Value, msg.Index)) @@ -185,7 +185,7 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS if (!TryComp(owningStation, out var stationRecords)) { - _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState()); + _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, new CriminalRecordsConsoleState()); return; } @@ -201,24 +201,22 @@ public sealed class CriminalRecordsConsoleSystem : SharedCriminalRecordsConsoleS state.SelectedKey = id; } - _ui.TrySetUiState(uid, CriminalRecordsConsoleKey.Key, state); + _ui.SetUiState(uid, CriminalRecordsConsoleKey.Key, state); } /// /// Boilerplate that most actions use, if they require that a record be selected. /// Obviously shouldn't be used for selecting records. /// - private bool CheckSelected(Entity ent, ICommonSession session, + private bool CheckSelected(Entity ent, EntityUid user, [NotNullWhen(true)] out EntityUid? mob, [NotNullWhen(true)] out StationRecordKey? key) { key = null; mob = null; - if (session.AttachedEntity is not { } user) - return false; if (!_access.IsAllowed(user, ent)) { - _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, session); + _popup.PopupEntity(Loc.GetString("criminal-records-permission-denied"), ent, user); return false; } diff --git a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs index 0e214ee865..14e0c75d96 100644 --- a/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs +++ b/Content.Server/DeviceLinking/Systems/SignalTimerSystem.cs @@ -48,9 +48,9 @@ public sealed class SignalTimerSystem : EntitySystem { var time = TryComp(uid, out var active) ? active.TriggerTime : TimeSpan.Zero; - if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui)) + if (_ui.HasUi(uid, SignalTimerUiKey.Key)) { - _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(component.Label, + _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(component.Label, TimeSpan.FromSeconds(component.Delay).Minutes.ToString("D2"), TimeSpan.FromSeconds(component.Delay).Seconds.ToString("D2"), component.CanEditLabel, @@ -70,9 +70,9 @@ public sealed class SignalTimerSystem : EntitySystem _audio.PlayPvs(signalTimer.DoneSound, uid); _signalSystem.InvokePort(uid, signalTimer.TriggerPort); - if (_ui.TryGetUi(uid, SignalTimerUiKey.Key, out var bui)) + if (_ui.HasUi(uid, SignalTimerUiKey.Key)) { - _ui.SetUiState(bui, new SignalTimerBoundUserInterfaceState(signalTimer.Label, + _ui.SetUiState(uid, SignalTimerUiKey.Key, new SignalTimerBoundUserInterfaceState(signalTimer.Label, TimeSpan.FromSeconds(signalTimer.Delay).Minutes.ToString("D2"), TimeSpan.FromSeconds(signalTimer.Delay).Seconds.ToString("D2"), signalTimer.CanEditLabel, @@ -117,10 +117,7 @@ public sealed class SignalTimerSystem : EntitySystem /// The entity that is interacted with. private bool IsMessageValid(EntityUid uid, BoundUserInterfaceMessage message) { - if (message.Session.AttachedEntity is not { Valid: true } mob) - return false; - - if (!_accessReader.IsAllowed(mob, uid)) + if (!_accessReader.IsAllowed(message.Actor, uid)) return false; return true; diff --git a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs index 02c6538158..3460124158 100644 --- a/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/NetworkConfiguratorSystem.cs @@ -62,7 +62,6 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem SubscribeLocalEvent(OnClearLinks); SubscribeLocalEvent(OnToggleLinks); SubscribeLocalEvent(OnConfigButtonPressed); - SubscribeLocalEvent(OnUiOpenAttempt); SubscribeLocalEvent(OnComponentRemoved); } @@ -89,7 +88,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem continue; //The network configurator is a handheld device. There can only ever be an ui session open for the player holding the device. - _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure); + _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); } } @@ -215,7 +214,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem private void OnComponentRemoved(EntityUid uid, DeviceListComponent component, ComponentRemove args) { - _uiSystem.TryCloseAll(uid, NetworkConfiguratorUiKey.Configure); + _uiSystem.CloseUi(uid, NetworkConfiguratorUiKey.Configure); } /// @@ -433,7 +432,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem return; - _uiSystem.TryOpen(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession); + _uiSystem.OpenUi(configuratorUid, NetworkConfiguratorUiKey.Link, actor.PlayerSession); configurator.DeviceLinkTarget = targetUid; @@ -464,7 +463,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem var sinkAddress = Resolve(sinkUid, ref sinkNetworkComponent, false) ? sinkNetworkComponent.Address : ""; var state = new DeviceLinkUserInterfaceState(sources, sinks, links, sourceAddress, sinkAddress, defaults); - _uiSystem.TrySetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state); + _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Link, state); } /// @@ -478,7 +477,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (Delay(configurator)) return; - if (!targetUid.HasValue || !TryComp(userUid, out ActorComponent? actor) || !AccessCheck(targetUid.Value, userUid, configurator)) + if (!targetUid.HasValue || !AccessCheck(targetUid.Value, userUid, configurator)) return; if (!TryComp(targetUid, out DeviceListComponent? list)) @@ -488,14 +487,13 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem configurator.ActiveDeviceList = targetUid; Dirty(configuratorUid, configurator); - if (!_uiSystem.TryGetUi(configuratorUid, NetworkConfiguratorUiKey.Configure, out var bui)) - return; - - if (_uiSystem.OpenUi(bui, actor.PlayerSession)) - _uiSystem.SetUiState(bui, new DeviceListUserInterfaceState( + if (_uiSystem.TryOpenUi(configuratorUid, NetworkConfiguratorUiKey.Configure, userUid)) + { + _uiSystem.SetUiState(configuratorUid, NetworkConfiguratorUiKey.Configure, new DeviceListUserInterfaceState( _deviceListSystem.GetDeviceList(configurator.ActiveDeviceList.Value) .Select(v => (v.Key, MetaData(v.Value).EntityName)).ToHashSet() )); + } } /// @@ -523,8 +521,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem component.Devices.Remove(invalidDevice); } - if (_uiSystem.TryGetUi(uid, NetworkConfiguratorUiKey.List, out var bui)) - _uiSystem.SetUiState(bui, new NetworkConfiguratorUserInterfaceState(devices)); + _uiSystem.SetUiState(uid, NetworkConfiguratorUiKey.List, new NetworkConfiguratorUserInterfaceState(devices)); } /// @@ -565,10 +562,10 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem /// private void OnRemoveDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorRemoveDeviceMessage args) { - if (component.Devices.TryGetValue(args.Address, out var removedDevice) && args.Session.AttachedEntity != null) + if (component.Devices.TryGetValue(args.Address, out var removedDevice)) { _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}"); + $"{ToPrettyString(args.Actor):actor} removed buffered device {ToPrettyString(removedDevice):subject} from {ToPrettyString(uid):tool}"); } component.Devices.Remove(args.Address); @@ -583,10 +580,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem /// private void OnClearDevice(EntityUid uid, NetworkConfiguratorComponent component, NetworkConfiguratorClearDevicesMessage args) { - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared buffered devices from {ToPrettyString(uid):tool}"); - + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared buffered devices from {ToPrettyString(uid):tool}"); ClearDevices(uid, component); UpdateListUiState(uid, component); @@ -609,9 +604,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (!configurator.ActiveDeviceLink.HasValue || !configurator.DeviceLinkTarget.HasValue) return; - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared links between {ToPrettyString(configurator.ActiveDeviceLink.Value):subject} and {ToPrettyString(configurator.DeviceLinkTarget.Value):subject2} with {ToPrettyString(uid):tool}"); if (HasComp(configurator.ActiveDeviceLink) && HasComp(configurator.DeviceLinkTarget)) { @@ -649,7 +643,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink)) { _deviceLinkSystem.ToggleLink( - args.Session.AttachedEntity, + args.Actor, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Source, args.Sink, @@ -660,7 +654,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink)) { _deviceLinkSystem.ToggleLink( - args.Session.AttachedEntity, + args.Actor, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Source, args.Sink, @@ -687,7 +681,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (TryComp(configurator.ActiveDeviceLink, out DeviceLinkSourceComponent? activeSource) && TryComp(configurator.DeviceLinkTarget, out DeviceLinkSinkComponent? targetSink)) { _deviceLinkSystem.SaveLinks( - args.Session.AttachedEntity, + args.Actor, configurator.ActiveDeviceLink.Value, configurator.DeviceLinkTarget.Value, args.Links, @@ -705,7 +699,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem else if (TryComp(configurator.DeviceLinkTarget, out DeviceLinkSourceComponent? targetSource) && TryComp(configurator.ActiveDeviceLink, out DeviceLinkSinkComponent? activeSink)) { _deviceLinkSystem.SaveLinks( - args.Session.AttachedEntity, + args.Actor, configurator.DeviceLinkTarget.Value, configurator.ActiveDeviceLink.Value, args.Links, @@ -735,29 +729,25 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem switch (args.ButtonKey) { case NetworkConfiguratorButtonKey.Set: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} set device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values)); break; case NetworkConfiguratorButtonKey.Add: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added device links to {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet(component.Devices.Values), true); break; case NetworkConfiguratorButtonKey.Clear: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} cleared device links from {ToPrettyString(component.ActiveDeviceList.Value):subject} with {ToPrettyString(uid):tool}"); result = _deviceListSystem.UpdateDeviceList(component.ActiveDeviceList.Value, new HashSet()); break; case NetworkConfiguratorButtonKey.Copy: - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}"); + _adminLogger.Add(LogType.DeviceLinking, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} copied devices from {ToPrettyString(component.ActiveDeviceList.Value):subject} to {ToPrettyString(uid):tool}"); ClearDevices(uid, component); @@ -783,8 +773,8 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem _ => "error" }; - _popupSystem.PopupCursor(Loc.GetString(resultText), args.Session, PopupType.Medium); - _uiSystem.TrySetUiState( + _popupSystem.PopupCursor(Loc.GetString(resultText), args.Actor, PopupType.Medium); + _uiSystem.SetUiState( uid, NetworkConfiguratorUiKey.Configure, new DeviceListUserInterfaceState( diff --git a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs index 001abad3dc..8e9c9e4ba7 100644 --- a/Content.Server/Disposal/Mailing/MailingUnitSystem.cs +++ b/Content.Server/Disposal/Mailing/MailingUnitSystem.cs @@ -159,8 +159,7 @@ public sealed class MailingUnitSystem : EntitySystem args.Handled = true; UpdateTargetList(uid, component); - if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui)) - _userInterfaceSystem.OpenUi(bui, actor.PlayerSession); + _userInterfaceSystem.OpenUi(uid, MailingUnitUiKey.Key, actor.PlayerSession); } /// @@ -178,8 +177,7 @@ public sealed class MailingUnitSystem : EntitySystem return; var state = new MailingUnitBoundUserInterfaceState(component.DisposalUnitInterfaceState, component.Target, component.TargetList, component.Tag); - if (_userInterfaceSystem.TryGetUi(uid, MailingUnitUiKey.Key, out var bui)) - _userInterfaceSystem.SetUiState(bui, state); + _userInterfaceSystem.SetUiState(uid, MailingUnitUiKey.Key, state); } private void OnTargetSelected(EntityUid uid, MailingUnitComponent component, TargetSelectedMessage args) diff --git a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs index 6c0bced53e..f0f6e9142c 100644 --- a/Content.Server/Disposal/Tube/DisposalTubeSystem.cs +++ b/Content.Server/Disposal/Tube/DisposalTubeSystem.cs @@ -101,8 +101,9 @@ namespace Content.Server.Disposal.Tube /// A user interface message from the client. private void OnUiAction(EntityUid uid, DisposalRouterComponent router, SharedDisposalRouterComponent.UiActionMessage msg) { - if (!EntityManager.EntityExists(msg.Session.AttachedEntity)) + if (!EntityManager.EntityExists(msg.Actor)) return; + if (TryComp(uid, out var physBody) && physBody.BodyType != BodyType.Static) return; @@ -279,9 +280,9 @@ namespace Content.Server.Disposal.Tube private void OnOpenTaggerUI(EntityUid uid, DisposalTaggerComponent tagger, BoundUIOpenedEvent args) { - if (_uiSystem.TryGetUi(uid, DisposalTaggerUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, DisposalTaggerUiKey.Key)) { - _uiSystem.SetUiState(bui, + _uiSystem.SetUiState(uid, DisposalTaggerUiKey.Key, new DisposalTaggerUserInterfaceState(tagger.Tag)); } } @@ -292,13 +293,9 @@ namespace Content.Server.Disposal.Tube /// Returns a private void UpdateRouterUserInterface(EntityUid uid, DisposalRouterComponent router) { - var bui = _uiSystem.GetUiOrNull(uid, DisposalRouterUiKey.Key); - if (bui == null) - return; - if (router.Tags.Count <= 0) { - _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState("")); + _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState("")); return; } @@ -312,7 +309,7 @@ namespace Content.Server.Disposal.Tube taglist.Remove(taglist.Length - 2, 2); - _uiSystem.SetUiState(bui, new DisposalRouterUserInterfaceState(taglist.ToString())); + _uiSystem.SetUiState(uid, DisposalRouterUiKey.Key, new DisposalRouterUserInterfaceState(taglist.ToString())); } private void OnAnchorChange(EntityUid uid, DisposalTubeComponent component, ref AnchorStateChangedEvent args) diff --git a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs index ba84546258..416e0744b5 100644 --- a/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs +++ b/Content.Server/Disposal/Unit/EntitySystems/DisposalUnitSystem.cs @@ -143,6 +143,9 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem return; } + if (!CanInsert(uid, component, args.User)) + return; + // Add verb to climb inside of the unit, Verb verb = new() { @@ -219,7 +222,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem #region UI Handlers private void OnUiButtonPressed(EntityUid uid, SharedDisposalUnitComponent component, SharedDisposalUnitComponent.UiButtonPressedMessage args) { - if (args.Session.AttachedEntity is not { Valid: true } player) + if (args.Actor is not { Valid: true } player) { return; } @@ -235,7 +238,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} hit flush button on {ToPrettyString(uid)}, it's now {(component.Engaged ? "on" : "off")}"); break; case SharedDisposalUnitComponent.UiButton.Power: - _power.TogglePower(uid, user: args.Session.AttachedEntity); + _power.TogglePower(uid, user: args.Actor); break; default: throw new ArgumentOutOfRangeException($"{ToPrettyString(player):player} attempted to hit a nonexistant button on {ToPrettyString(uid)}"); @@ -268,7 +271,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem } args.Handled = true; - _ui.TryOpen(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); } private void OnAfterInteractUsing(EntityUid uid, SharedDisposalUnitComponent component, AfterInteractUsingEvent args) @@ -597,7 +600,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem var compState = GetState(uid, component); var stateString = Loc.GetString($"disposal-unit-state-{compState}"); var state = new SharedDisposalUnitComponent.DisposalUnitBoundUserInterfaceState(Name(uid), stateString, EstimatedFullPressure(uid, component), powered, component.Engaged); - _ui.TrySetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); + _ui.SetUiState(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, state); var stateUpdatedEvent = new DisposalUnitUIStateUpdatedEvent(state); RaiseLocalEvent(uid, stateUpdatedEvent); @@ -802,10 +805,7 @@ public sealed class DisposalUnitSystem : SharedDisposalUnitSystem QueueAutomaticEngage(uid, component); - if (TryComp(inserted, out ActorComponent? actor)) - { - _ui.TryClose(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, actor.PlayerSession); - } + _ui.CloseUi(uid, SharedDisposalUnitComponent.DisposalUnitUiKey.Key, inserted); // Maybe do pullable instead? Eh still fine. Joints.RecursiveClearJoints(inserted); diff --git a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs index 56e8bd50b3..af9ccadd91 100644 --- a/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs +++ b/Content.Server/Doors/Electronics/Systems/DoorElectronicsSystem.cs @@ -39,7 +39,7 @@ public sealed class DoorElectronicsSystem : EntitySystem } var state = new DoorElectronicsConfigurationState(accesses); - _uiSystem.TrySetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state); + _uiSystem.SetUiState(uid, DoorElectronicsConfigurationUiKey.Key, state); } private void OnChangeConfiguration( diff --git a/Content.Server/Extinguisher/FireExtinguisherComponent.cs b/Content.Server/Extinguisher/FireExtinguisherComponent.cs index fe10b4a574..991fc76c62 100644 --- a/Content.Server/Extinguisher/FireExtinguisherComponent.cs +++ b/Content.Server/Extinguisher/FireExtinguisherComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Extinguisher; -[NetworkedComponent, RegisterComponent] +[RegisterComponent] [Access(typeof(FireExtinguisherSystem))] public sealed partial class FireExtinguisherComponent : SharedFireExtinguisherComponent { diff --git a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs index b51efc2f5e..7b937cf0d8 100644 --- a/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs +++ b/Content.Server/Eye/Blinding/ActivatableUIRequiresVisionSystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Eye.Blinding.Components; using Content.Shared.Eye.Blinding.Systems; using Robust.Shared.Player; using Robust.Server.GameObjects; +using Robust.Shared.Collections; namespace Content.Server.Eye.Blinding; @@ -37,24 +38,19 @@ public sealed class ActivatableUIRequiresVisionSystem : EntitySystem if (!args.Blind) return; - if (!TryComp(uid, out var actor)) - return; + var toClose = new ValueList<(EntityUid Entity, Enum Key)>(); - var uiList = _userInterfaceSystem.GetAllUIsForSession(actor.PlayerSession); - if (uiList == null) - return; - - Queue closeList = new(); // foreach collection modified moment - - foreach (var ui in uiList) + foreach (var bui in _userInterfaceSystem.GetActorUis(uid)) { - if (HasComp(ui.Owner)) - closeList.Enqueue(ui); + if (HasComp(bui.Entity)) + { + toClose.Add(bui); + } } - foreach (var ui in closeList) + foreach (var bui in toClose) { - _userInterfaceSystem.CloseUi(ui, actor.PlayerSession); + _userInterfaceSystem.CloseUi(bui.Entity, bui.Key, uid); } } } diff --git a/Content.Server/Fax/FaxSystem.cs b/Content.Server/Fax/FaxSystem.cs index 3ff139466f..f492595444 100644 --- a/Content.Server/Fax/FaxSystem.cs +++ b/Content.Server/Fax/FaxSystem.cs @@ -51,7 +51,7 @@ public sealed class FaxSystem : EntitySystem /// [ValidatePrototypeId] private const string DefaultPaperPrototypeId = "Paper"; - + [ValidatePrototypeId] private const string OfficePaperPrototypeId = "PaperOffice"; @@ -318,7 +318,7 @@ public sealed class FaxSystem : EntitySystem private void OnSendButtonPressed(EntityUid uid, FaxMachineComponent component, FaxSendMessage args) { - Send(uid, component, args.Session.AttachedEntity); + Send(uid, component, args.Actor); } private void OnRefreshButtonPressed(EntityUid uid, FaxMachineComponent component, FaxRefreshMessage args) @@ -358,7 +358,7 @@ public sealed class FaxSystem : EntitySystem component.SendTimeoutRemaining <= 0 && component.InsertingTimeRemaining <= 0; var state = new FaxUiState(component.FaxName, component.KnownFaxes, canSend, canCopy, isPaperInserted, component.DestinationFaxAddress); - _userInterface.TrySetUiState(uid, FaxUiKey.Key, state); + _userInterface.SetUiState(uid, FaxUiKey.Key, state); } /// @@ -410,19 +410,15 @@ public sealed class FaxSystem : EntitySystem prototype = DefaultPaperPrototypeId; var name = Loc.GetString("fax-machine-printed-paper-name"); - + var printout = new FaxPrintout(args.Content, name, prototype); component.PrintingQueue.Enqueue(printout); component.SendTimeoutRemaining += component.SendTimeout; UpdateUserInterface(uid, component); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); - else - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"Someone added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added print job to {ToPrettyString(uid):tool} with text: {args.Content}"); } /// @@ -457,9 +453,8 @@ public sealed class FaxSystem : EntitySystem UpdateUserInterface(uid, component); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}"); + _adminLogger.Add(LogType.Action, LogImpact.Low, + $"{ToPrettyString(args.Actor):actor} added copy job to {ToPrettyString(uid):tool} with text: {ToPrettyString(component.PaperSlot.Item):subject}"); } /// diff --git a/Content.Server/Fluids/EntitySystems/SpraySystem.cs b/Content.Server/Fluids/EntitySystems/SpraySystem.cs index f7621aec62..40f19aff2b 100644 --- a/Content.Server/Fluids/EntitySystems/SpraySystem.cs +++ b/Content.Server/Fluids/EntitySystems/SpraySystem.cs @@ -144,7 +144,7 @@ public sealed class SpraySystem : EntitySystem _audio.PlayPvs(entity.Comp.SpraySound, entity, entity.Comp.SpraySound.Params.WithVariation(0.125f)); - _useDelay.SetDelay((entity, useDelay), TimeSpan.FromSeconds(cooldownTime)); + _useDelay.SetLength((entity, useDelay), TimeSpan.FromSeconds(cooldownTime)); _useDelay.TryResetDelay((entity, useDelay)); } } diff --git a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs index 729b7304fa..5e2a562577 100644 --- a/Content.Server/Forensics/Systems/ForensicScannerSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicScannerSystem.cs @@ -52,8 +52,7 @@ namespace Content.Server.Forensics component.PrintCooldown, component.PrintReadyAt); - if (!_uiSystem.TrySetUiState(uid, ForensicScannerUiKey.Key, state)) - Log.Warning($"{ToPrettyString(uid)} was unable to set UI state."); + _uiSystem.SetUiState(uid, ForensicScannerUiKey.Key, state); } private void OnDoAfter(EntityUid uid, ForensicScannerComponent component, DoAfterEvent args) @@ -163,23 +162,14 @@ namespace Content.Server.Forensics private void OpenUserInterface(EntityUid user, Entity scanner) { - if (!TryComp(user, out var actor)) - return; - UpdateUserInterface(scanner, scanner.Comp); - _uiSystem.TryOpen(scanner, ForensicScannerUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(scanner.Owner, ForensicScannerUiKey.Key, user); } private void OnPrint(EntityUid uid, ForensicScannerComponent component, ForensicScannerPrintMessage args) { - if (!args.Session.AttachedEntity.HasValue) - { - Log.Warning($"{ToPrettyString(uid)} got OnPrint without Session.AttachedEntity"); - return; - } - - var user = args.Session.AttachedEntity.Value; + var user = args.Actor; if (_gameTiming.CurTime < component.PrintReadyAt) { @@ -191,7 +181,7 @@ namespace Content.Server.Forensics // Spawn a piece of paper. var printed = EntityManager.SpawnEntity(component.MachineOutput, Transform(uid).Coordinates); - _handsSystem.PickupOrDrop(args.Session.AttachedEntity, printed, checkActionBlocker: false); + _handsSystem.PickupOrDrop(args.Actor, printed, checkActionBlocker: false); if (!HasComp(printed)) { @@ -240,9 +230,6 @@ namespace Content.Server.Forensics private void OnClear(EntityUid uid, ForensicScannerComponent component, ForensicScannerClearMessage args) { - if (!args.Session.AttachedEntity.HasValue) - return; - component.Fingerprints = new(); component.Fibers = new(); component.DNAs = new(); diff --git a/Content.Server/GameTicking/GameTicker.RoundFlow.cs b/Content.Server/GameTicking/GameTicker.RoundFlow.cs index 792d838169..83d8390dd4 100644 --- a/Content.Server/GameTicking/GameTicker.RoundFlow.cs +++ b/Content.Server/GameTicking/GameTicker.RoundFlow.cs @@ -245,7 +245,10 @@ namespace Content.Server.GameTicking var origReadyPlayers = readyPlayers.ToArray(); if (!StartPreset(origReadyPlayers, force)) + { + _startingRound = false; return; + } // MapInitialize *before* spawning players, our codebase is too shit to do it afterwards... _mapManager.DoMapInitialize(DefaultMap); diff --git a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs index ea5c9a830b..0db9d195dc 100644 --- a/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/TraitorRuleComponent.cs @@ -71,5 +71,5 @@ public sealed partial class TraitorRuleComponent : Component public int StartingBalance = 20; [DataField] - public int MaxDifficulty = 20; + public int MaxDifficulty = 5; } diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs index 4534333417..27a9edbad7 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.Utility.cs @@ -16,6 +16,14 @@ public abstract partial class GameRuleSystem where T: IComponent return EntityQueryEnumerator(); } + /// + /// Queries all gamerules, regardless of if they're active or not. + /// + protected EntityQueryEnumerator QueryAllRules() + { + return EntityQueryEnumerator(); + } + /// /// Utility function for finding a random event-eligible station entity /// diff --git a/Content.Server/GameTicking/Rules/GameRuleSystem.cs b/Content.Server/GameTicking/Rules/GameRuleSystem.cs index bcad146c22..c167ae7b6c 100644 --- a/Content.Server/GameTicking/Rules/GameRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/GameRuleSystem.cs @@ -34,8 +34,8 @@ public abstract partial class GameRuleSystem : EntitySystem where T : ICompon if (args.Forced || args.Cancelled) return; - var query = QueryActiveRules(); - while (query.MoveNext(out var uid, out _, out _, out var gameRule)) + var query = QueryAllRules(); + while (query.MoveNext(out var uid, out _, out var gameRule)) { var minPlayers = gameRule.MinPlayers; if (args.Players.Length >= minPlayers) diff --git a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs index 2f8b9dc927..232d24004b 100644 --- a/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/NukeopsRuleSystem.cs @@ -344,7 +344,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem var timeRemain = nukeops.WarNukieArriveDelay + Timing.CurTime; ev.DeclaratorEntity.Comp.ShuttleDisabledTime = timeRemain; - DistributeExtraTc(nukeops); + DistributeExtraTc((uid, nukeops)); } } } @@ -371,7 +371,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem return WarConditionStatus.YesWar; } - private void DistributeExtraTc(NukeopsRuleComponent nukieRule) + private void DistributeExtraTc(Entity nukieRule) { var enumerator = EntityQueryEnumerator(); while (enumerator.MoveNext(out var uid, out var component)) @@ -379,13 +379,13 @@ public sealed class NukeopsRuleSystem : GameRuleSystem if (!_tag.HasTag(uid, NukeOpsUplinkTagPrototype)) continue; - if (GetOutpost(uid) is not {} outpost) + if (GetOutpost(nukieRule.Owner) is not { } outpost) continue; if (Transform(uid).MapID != Transform(outpost).MapID) // Will receive bonus TC only on their start outpost continue; - _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.WarTcAmountPerNukie } }, uid, component); + _store.TryAddCurrency(new () { { TelecrystalCurrencyPrototype, nukieRule.Comp.WarTcAmountPerNukie } }, uid, component); var msg = Loc.GetString("store-currency-war-boost-given", ("target", uid)); _popupSystem.PopupEntity(msg, uid); @@ -510,7 +510,7 @@ public sealed class NukeopsRuleSystem : GameRuleSystem if (!Resolve(ent, ref ent.Comp, false)) return null; - return ent.Comp.MapGrids.FirstOrNull(); + return ent.Comp.MapGrids.Where(e => HasComp(e) && !HasComp(e)).FirstOrNull(); } /// diff --git a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs index b778f7c645..083085fa0d 100644 --- a/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ThiefRuleSystem.cs @@ -34,6 +34,7 @@ public sealed class ThiefRuleSystem : GameRuleSystem //Generate objectives GenerateObjectives(mindId, mind, ent); + _antag.SendBriefing(args.EntityUid, MakeBriefing(args.EntityUid), null, null); } private void GenerateObjectives(EntityUid mindId, MindComponent mind, ThiefRuleComponent thiefRule) diff --git a/Content.Server/Gateway/Systems/GatewaySystem.cs b/Content.Server/Gateway/Systems/GatewaySystem.cs index 7ebc751dd2..6ed28d71a7 100644 --- a/Content.Server/Gateway/Systems/GatewaySystem.cs +++ b/Content.Server/Gateway/Systems/GatewaySystem.cs @@ -129,7 +129,7 @@ public sealed class GatewaySystem : EntitySystem unlockTime ); - _ui.TrySetUiState(uid, GatewayUiKey.Key, state); + _ui.SetUiState(uid, GatewayUiKey.Key, state); } private void UpdateAppearance(EntityUid uid) @@ -139,12 +139,14 @@ public sealed class GatewaySystem : EntitySystem private void OnOpenPortal(EntityUid uid, GatewayComponent comp, GatewayOpenPortalMessage args) { - if (args.Session.AttachedEntity == null || GetNetEntity(uid) == args.Destination || + if (GetNetEntity(uid) == args.Destination || !comp.Enabled || !comp.Interactable) + { return; + } // if the gateway has an access reader check it before allowing opening - var user = args.Session.AttachedEntity.Value; + var user = args.Actor; if (CheckAccess(user, uid, comp)) return; diff --git a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs index 4cdab6ce07..6c2a6986fc 100644 --- a/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs +++ b/Content.Server/Ghost/Roles/Components/GhostRoleMobSpawnerComponent.cs @@ -1,5 +1,4 @@ using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Ghost.Roles.Components { @@ -10,17 +9,22 @@ namespace Content.Server.Ghost.Roles.Components [Access(typeof(GhostRoleSystem))] public sealed partial class GhostRoleMobSpawnerComponent : Component { - [ViewVariables(VVAccess.ReadWrite)] [DataField("deleteOnSpawn")] + [DataField] public bool DeleteOnSpawn = true; - [ViewVariables(VVAccess.ReadWrite)] [DataField("availableTakeovers")] + [DataField] public int AvailableTakeovers = 1; [ViewVariables] public int CurrentTakeovers = 0; - [ViewVariables(VVAccess.ReadWrite)] - [DataField("prototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? Prototype { get; private set; } + [DataField] + public EntProtoId? Prototype; + + /// + /// If this ghostrole spawner has multiple selectable ghostrole prototypes. + /// + [DataField] + public List SelectablePrototypes = []; } } diff --git a/Content.Server/Ghost/Roles/GhostRoleSystem.cs b/Content.Server/Ghost/Roles/GhostRoleSystem.cs index 0649e68a31..e7495020c8 100644 --- a/Content.Server/Ghost/Roles/GhostRoleSystem.cs +++ b/Content.Server/Ghost/Roles/GhostRoleSystem.cs @@ -23,6 +23,10 @@ using Robust.Shared.Enums; using Robust.Shared.Player; using Robust.Shared.Random; using Robust.Shared.Utility; +using Content.Server.Popups; +using Content.Shared.Verbs; +using Robust.Shared.Prototypes; +using Robust.Shared.Collections; namespace Content.Server.Ghost.Roles { @@ -37,6 +41,8 @@ namespace Content.Server.Ghost.Roles [Dependency] private readonly TransformSystem _transform = default!; [Dependency] private readonly SharedMindSystem _mindSystem = default!; [Dependency] private readonly SharedRoleSystem _roleSystem = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly IPrototypeManager _prototype = default!; private uint _nextRoleIdentifier; private bool _needsUpdateGhostRoleCount = true; @@ -63,6 +69,7 @@ namespace Content.Server.Ghost.Roles SubscribeLocalEvent(OnUnpaused); SubscribeLocalEvent(OnSpawnerTakeRole); SubscribeLocalEvent(OnTakeoverTakeRole); + SubscribeLocalEvent>(OnVerb); _playerManager.PlayerStatusChanged += PlayerStatusChanged; } @@ -74,11 +81,11 @@ namespace Content.Server.Ghost.Roles switch (args.NewMobState) { case MobState.Alive: - { - if (!ghostRole.Taken) - RegisterGhostRole((component, ghostRole)); - break; - } + { + if (!ghostRole.Taken) + RegisterGhostRole((component, ghostRole)); + break; + } case MobState.Critical: case MobState.Dead: UnregisterGhostRole((component, ghostRole)); @@ -100,11 +107,11 @@ namespace Content.Server.Ghost.Roles public void OpenEui(ICommonSession session) { - if (session.AttachedEntity is not {Valid: true} attached || + if (session.AttachedEntity is not { Valid: true } attached || !EntityManager.HasComponent(attached)) return; - if(_openUis.ContainsKey(session)) + if (_openUis.ContainsKey(session)) CloseEui(session); var eui = _openUis[session] = new GhostRolesEui(); @@ -250,7 +257,7 @@ namespace Content.Server.Ghost.Roles if (metaQuery.GetComponent(uid).EntityPaused) continue; - roles.Add(new GhostRoleInfo {Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements}); + roles.Add(new GhostRoleInfo { Identifier = id, Name = role.RoleName, Description = role.RoleDescription, Rules = role.RoleRules, Requirements = role.Requirements }); } return roles.ToArray(); @@ -407,6 +414,63 @@ namespace Content.Server.Ghost.Roles args.TookRole = true; } + + private void OnVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, GetVerbsEvent args) + { + var prototypes = component.SelectablePrototypes; + if (prototypes.Count < 1) + return; + + if (!args.CanAccess || !args.CanInteract || args.Hands == null) + return; + + var verbs = new ValueList(); + + foreach (var prototypeID in prototypes) + { + if (_prototype.TryIndex(prototypeID, out var prototype)) + { + var verb = CreateVerb(uid, component, args.User, prototype); + verbs.Add(verb); + } + } + + args.Verbs.UnionWith(verbs); + } + + private Verb CreateVerb(EntityUid uid, GhostRoleMobSpawnerComponent component, EntityUid userUid, GhostRolePrototype prototype) + { + var verbText = Loc.GetString(prototype.Name); + + return new Verb() + { + Text = verbText, + Disabled = component.Prototype == prototype.EntityPrototype, + Category = VerbCategory.SelectType, + Act = () => SetMode(uid, prototype, verbText, component, userUid) + }; + } + + public void SetMode(EntityUid uid, GhostRolePrototype prototype, string verbText, GhostRoleMobSpawnerComponent? component, EntityUid? userUid = null) + { + if (!Resolve(uid, ref component)) + return; + + var ghostrolecomp = EnsureComp(uid); + + component.Prototype = prototype.EntityPrototype; + ghostrolecomp.RoleName = verbText; + ghostrolecomp.RoleDescription = prototype.Description; + ghostrolecomp.RoleRules = prototype.Rules; + + // Dirty(ghostrolecomp); + + if (userUid != null) + { + var msg = Loc.GetString("ghostrole-spawner-select", ("mode", verbText)); + _popupSystem.PopupEntity(msg, uid, userUid.Value); + } + } } [AnyCommand] @@ -417,7 +481,7 @@ namespace Content.Server.Ghost.Roles public string Help => $"{Command}"; public void Execute(IConsoleShell shell, string argStr, string[] args) { - if(shell.Player != null) + if (shell.Player != null) EntitySystem.Get().OpenEui(shell.Player); else shell.WriteLine("You can only open the ghost roles UI on a client."); diff --git a/Content.Server/Gravity/GravityGeneratorSystem.cs b/Content.Server/Gravity/GravityGeneratorSystem.cs index b0c4bb56ff..8e4da75fac 100644 --- a/Content.Server/Gravity/GravityGeneratorSystem.cs +++ b/Content.Server/Gravity/GravityGeneratorSystem.cs @@ -131,13 +131,13 @@ namespace Content.Server.Gravity } private void SetSwitchedOn(EntityUid uid, GravityGeneratorComponent component, bool on, - ApcPowerReceiverComponent? powerReceiver = null, ICommonSession? session = null) + ApcPowerReceiverComponent? powerReceiver = null, EntityUid? user = null) { if (!Resolve(uid, ref powerReceiver)) return; - if (session is { AttachedEntity: { } }) - _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{session:player} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}"); + if (user != null) + _adminLogger.Add(LogType.Action, on ? LogImpact.Medium : LogImpact.High, $"{ToPrettyString(user)} set ${ToPrettyString(uid):target} to {(on ? "on" : "off")}"); component.SwitchedOn = on; UpdatePowerState(component, powerReceiver); @@ -154,7 +154,7 @@ namespace Content.Server.Gravity private void UpdateUI(Entity ent, float chargeRate) { var (_, component, powerReceiver) = ent; - if (!_uiSystem.IsUiOpen(ent, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key)) + if (!_uiSystem.IsUiOpen(ent.Owner, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key)) return; var chargeTarget = chargeRate < 0 ? 0 : component.MaxCharge; @@ -189,8 +189,8 @@ namespace Content.Server.Gravity chargeEta ); - _uiSystem.TrySetUiState( - ent, + _uiSystem.SetUiState( + ent.Owner, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, state); @@ -209,9 +209,6 @@ namespace Content.Server.Gravity private void OnInteractHand(EntityUid uid, GravityGeneratorComponent component, InteractHandEvent args) { - if (!EntityManager.TryGetComponent(args.User, out ActorComponent? actor)) - return; - ApcPowerReceiverComponent? powerReceiver = default!; if (!Resolve(uid, ref powerReceiver)) return; @@ -220,7 +217,7 @@ namespace Content.Server.Gravity if (!component.Intact || powerReceiver.PowerReceived < component.IdlePowerUse) return; - _uiSystem.TryOpen(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(uid, SharedGravityGeneratorComponent.GravityGeneratorUiKey.Key, args.User); component.NeedUIUpdate = true; } @@ -287,7 +284,7 @@ namespace Content.Server.Gravity GravityGeneratorComponent component, SharedGravityGeneratorComponent.SwitchGeneratorMessage args) { - SetSwitchedOn(uid, component, args.On, session:args.Session); + SetSwitchedOn(uid, component, args.On, user: args.Actor); } } } diff --git a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs index 336116e78b..7744d16151 100644 --- a/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs +++ b/Content.Server/Humanoid/Systems/HumanoidAppearanceSystem.Modifier.cs @@ -32,8 +32,8 @@ public sealed partial class HumanoidAppearanceSystem Icon = new SpriteSpecifier.Rsi(new("/Textures/Mobs/Customization/reptilian_parts.rsi"), "tail_smooth"), Act = () => { - _uiSystem.TryOpen(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession); - _uiSystem.TrySetUiState( + _uiSystem.OpenUi(uid, HumanoidMarkingModifierKey.Key, actor.PlayerSession); + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, @@ -48,8 +48,7 @@ public sealed partial class HumanoidAppearanceSystem private void OnBaseLayersSet(EntityUid uid, HumanoidAppearanceComponent component, HumanoidMarkingModifierBaseLayersSetMessage message) { - if (message.Session is not { } player - || !_adminManager.HasAdminFlag(player, AdminFlags.Fun)) + if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun)) { return; } @@ -67,7 +66,7 @@ public sealed partial class HumanoidAppearanceSystem if (message.ResendState) { - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, @@ -81,8 +80,7 @@ public sealed partial class HumanoidAppearanceSystem private void OnMarkingsSet(EntityUid uid, HumanoidAppearanceComponent component, HumanoidMarkingModifierMarkingSetMessage message) { - if (message.Session is not { } player - || !_adminManager.HasAdminFlag(player, AdminFlags.Fun)) + if (!_adminManager.HasAdminFlag(message.Actor, AdminFlags.Fun)) { return; } @@ -92,7 +90,7 @@ public sealed partial class HumanoidAppearanceSystem if (message.ResendState) { - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, HumanoidMarkingModifierKey.Key, new HumanoidMarkingModifierState(component.MarkingSet, component.Species, diff --git a/Content.Server/Instruments/InstrumentComponent.cs b/Content.Server/Instruments/InstrumentComponent.cs index 1b7913386d..db9dbb375b 100644 --- a/Content.Server/Instruments/InstrumentComponent.cs +++ b/Content.Server/Instruments/InstrumentComponent.cs @@ -1,6 +1,7 @@ using Content.Server.UserInterface; using Content.Shared.Instruments; using Robust.Shared.Player; +using ActivatableUIComponent = Content.Shared.UserInterface.ActivatableUIComponent; namespace Content.Server.Instruments; @@ -16,9 +17,9 @@ public sealed partial class InstrumentComponent : SharedInstrumentComponent [ViewVariables] public uint LastSequencerTick = 0; // TODO Instruments: Make this ECS - public ICommonSession? InstrumentPlayer => + public EntityUid? InstrumentPlayer => _entMan.GetComponentOrNull(Owner)?.CurrentSingleUser - ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession; + ?? _entMan.GetComponentOrNull(Owner)?.PlayerSession.AttachedEntity; } [RegisterComponent] diff --git a/Content.Server/Instruments/InstrumentSystem.cs b/Content.Server/Instruments/InstrumentSystem.cs index 8dd9644e3c..f5a6713886 100644 --- a/Content.Server/Instruments/InstrumentSystem.cs +++ b/Content.Server/Instruments/InstrumentSystem.cs @@ -111,7 +111,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; instrument.Playing = true; @@ -125,7 +125,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; Clean(uid, instrument); @@ -142,7 +142,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; if (master != null) @@ -174,7 +174,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem if (!TryComp(uid, out InstrumentComponent? instrument)) return; - if (args.SenderSession != instrument.InstrumentPlayer) + if (args.SenderSession.AttachedEntity != instrument.InstrumentPlayer) return; if (msg.Channel == RobustMidiEvent.PercussionChannel && !instrument.AllowPercussion) @@ -194,8 +194,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem private void OnBoundUIClosed(EntityUid uid, InstrumentComponent component, BoundUIClosedEvent args) { if (HasComp(uid) - && _bui.TryGetUi(uid, args.UiKey, out var bui) - && bui.SubscribedSessions.Count == 0) + && !_bui.IsUiOpen(uid, args.UiKey)) { RemComp(uid); } @@ -232,7 +231,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem var instrumentQuery = EntityManager.GetEntityQuery(); if (!TryComp(uid, out InstrumentComponent? originInstrument) - || originInstrument.InstrumentPlayer?.AttachedEntity is not {} originPlayer) + || originInstrument.InstrumentPlayer is not {} originPlayer) return Array.Empty<(NetEntity, string)>(); // It's probably faster to get all possible active instruments than all entities in range @@ -247,7 +246,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem continue; // We want to use the instrument player's name. - if (instrument.InstrumentPlayer?.AttachedEntity is not {} playerUid) + if (instrument.InstrumentPlayer is not {} playerUid) continue; // Maybe a bit expensive but oh well GetBands is queued and has a timer anyway. @@ -298,7 +297,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem return; if (!instrument.Playing - || args.SenderSession != instrument.InstrumentPlayer + || args.SenderSession.AttachedEntity != instrument.InstrumentPlayer || instrument.InstrumentPlayer == null || args.SenderSession.AttachedEntity is not { } attached) { @@ -374,8 +373,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem var entity = GetEntity(request.Entity); var nearby = GetBands(entity); - _bui.TrySendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby), - request.Session); + _bui.ServerSendUiMessage(entity, request.UiKey, new InstrumentBandResponseBuiMessage(nearby), request.Actor); } _bandRequestQueue.Clear(); @@ -413,7 +411,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem (instrument.BatchesDropped >= MaxMidiBatchesDropped || instrument.LaggedBatches >= MaxMidiLaggedBatches)) { - if (instrument.InstrumentPlayer?.AttachedEntity is {Valid: true} mob) + if (instrument.InstrumentPlayer is {Valid: true} mob) { _stuns.TryParalyze(mob, TimeSpan.FromSeconds(1), true); @@ -423,7 +421,7 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem // Just in case Clean(uid); - _bui.TryCloseAll(uid, InstrumentUiKey.Key); + _bui.CloseUi(uid, InstrumentUiKey.Key); } instrument.Timer += frameTime; @@ -437,13 +435,12 @@ public sealed partial class InstrumentSystem : SharedInstrumentSystem } } - public void ToggleInstrumentUi(EntityUid uid, ICommonSession session, InstrumentComponent? component = null) + public void ToggleInstrumentUi(EntityUid uid, EntityUid actor, InstrumentComponent? component = null) { if (!Resolve(uid, ref component)) return; - if (_bui.TryGetUi(uid, InstrumentUiKey.Key, out var bui)) - _bui.ToggleUi(bui, session); + _bui.TryToggleUi(uid, InstrumentUiKey.Key, actor); } public override bool ResolveInstrument(EntityUid uid, ref SharedInstrumentComponent? component) diff --git a/Content.Server/Interaction/InteractionSystem.cs b/Content.Server/Interaction/InteractionSystem.cs index 203781bcda..4eac7e9ef1 100644 --- a/Content.Server/Interaction/InteractionSystem.cs +++ b/Content.Server/Interaction/InteractionSystem.cs @@ -16,13 +16,6 @@ namespace Content.Server.Interaction [Dependency] private readonly SharedContainerSystem _container = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - public override void Initialize() - { - base.Initialize(); - - SubscribeLocalEvent(HandleUserInterfaceRangeCheck); - } - public override bool CanAccessViaStorage(EntityUid user, EntityUid target) { if (Deleted(target)) @@ -37,26 +30,8 @@ namespace Content.Server.Interaction if (storage.Container?.ID != container.ID) return false; - if (!TryComp(user, out ActorComponent? actor)) - 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.SessionHasOpenUi(container.Owner, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - } - - private void HandleUserInterfaceRangeCheck(ref BoundUserInterfaceCheckRangeEvent ev) - { - if (ev.Player.AttachedEntity is not { } user || ev.Result == BoundUserInterfaceRangeResult.Fail) - return; - - if (InRangeUnobstructed(user, ev.Target, ev.UserInterface.InteractionRange)) - { - ev.Result = BoundUserInterfaceRangeResult.Pass; - } - else - { - ev.Result = BoundUserInterfaceRangeResult.Fail; - } + return _uiSystem.IsUiOpen(container.Owner, StorageComponent.StorageUiKey.Key, user); } } } diff --git a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs index 212383c463..fa5c5dad2a 100644 --- a/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/MicrowaveSystem.cs @@ -79,7 +79,7 @@ namespace Content.Server.Kitchen.EntitySystems SubscribeLocalEvent(OnSignalReceived); - SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Session.AttachedEntity)); + SubscribeLocalEvent((u, c, m) => Wzhzhzh(u, c, m.Actor)); SubscribeLocalEvent(OnEjectMessage); SubscribeLocalEvent(OnEjectIndex); SubscribeLocalEvent(OnSelectTime); @@ -355,11 +355,7 @@ namespace Content.Server.Kitchen.EntitySystems public void UpdateUserInterfaceState(EntityUid uid, MicrowaveComponent component) { - var ui = _userInterface.GetUiOrNull(uid, MicrowaveUiKey.Key); - if (ui == null) - return; - - _userInterface.SetUiState(ui, new MicrowaveUpdateUserInterfaceState( + _userInterface.SetUiState(uid, MicrowaveUiKey.Key, new MicrowaveUpdateUserInterfaceState( GetNetEntityArray(component.Storage.ContainedEntities.ToArray()), HasComp(uid), component.CurrentCookTimeButtonIndex, diff --git a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs index e8ee453986..81001f0932 100644 --- a/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs +++ b/Content.Server/Kitchen/EntitySystems/ReagentGrinderSystem.cs @@ -127,7 +127,7 @@ namespace Content.Server.Kitchen.EntitySystems _solutionContainersSystem.TryAddSolution(containerSoln.Value, solution); } - _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key, + _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkCompleteMessage()); UpdateUiState(uid); @@ -228,7 +228,7 @@ namespace Content.Server.Kitchen.EntitySystems GetNetEntityArray(inputContainer.ContainedEntities.ToArray()), containerSolution?.Contents.ToArray() ); - _userInterfaceSystem.TrySetUiState(uid, ReagentGrinderUiKey.Key, state); + _userInterfaceSystem.SetUiState(uid, ReagentGrinderUiKey.Key, state); } private void OnStartMessage(Entity entity, ref ReagentGrinderStartMessage message) @@ -305,7 +305,7 @@ namespace Content.Server.Kitchen.EntitySystems reagentGrinder.AudioStream = _audioSystem.PlayPvs(sound, uid, AudioParams.Default.WithPitchScale(1 / reagentGrinder.WorkTimeMultiplier)).Value.Entity; //slightly higher pitched - _userInterfaceSystem.TrySendUiMessage(uid, ReagentGrinderUiKey.Key, + _userInterfaceSystem.ServerSendUiMessage(uid, ReagentGrinderUiKey.Key, new ReagentGrinderWorkStartedMessage(program)); } diff --git a/Content.Server/Labels/Label/HandLabelerSystem.cs b/Content.Server/Labels/Label/HandLabelerSystem.cs index dc7b9de0f8..84c41b0db5 100644 --- a/Content.Server/Labels/Label/HandLabelerSystem.cs +++ b/Content.Server/Labels/Label/HandLabelerSystem.cs @@ -90,7 +90,7 @@ namespace Content.Server.Labels private void OnHandLabelerLabelChanged(EntityUid uid, HandLabelerComponent handLabeler, HandLabelerLabelChangedMessage args) { - if (args.Session.AttachedEntity is not {Valid: true} player) + if (args.Actor is not {Valid: true} player) return; var label = args.Label.Trim(); @@ -109,7 +109,7 @@ namespace Content.Server.Labels if (!Resolve(uid, ref handLabeler)) return; - _userInterfaceSystem.TrySetUiState(uid, HandLabelerUiKey.Key, + _userInterfaceSystem.SetUiState(uid, HandLabelerUiKey.Key, new HandLabelerBoundUserInterfaceState(handLabeler.AssignedLabel)); } } diff --git a/Content.Server/Lathe/LatheSystem.cs b/Content.Server/Lathe/LatheSystem.cs index 06d1b463ec..f56737a5a5 100644 --- a/Content.Server/Lathe/LatheSystem.cs +++ b/Content.Server/Lathe/LatheSystem.cs @@ -226,11 +226,10 @@ namespace Content.Server.Lathe if (!Resolve(uid, ref component)) return; - var ui = _uiSys.GetUi(uid, LatheUiKey.Key); var producing = component.CurrentRecipe ?? component.Queue.FirstOrDefault(); var state = new LatheUpdateState(GetAvailableRecipes(uid, component), component.Queue, producing); - _uiSys.SetUiState(ui, state); + _uiSys.SetUiState(uid, LatheUiKey.Key, state); } private void OnGetRecipes(EntityUid uid, TechnologyDatabaseComponent component, LatheGetRecipesEvent args) @@ -337,10 +336,10 @@ namespace Content.Server.Lathe else break; } - if (count > 0 && args.Session.AttachedEntity != null) + if (count > 0) { _adminLogger.Add(LogType.Action, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}"); + $"{ToPrettyString(args.Actor):player} queued {count} {recipe.Name} at {ToPrettyString(uid):lathe}"); } } TryStartProducing(uid, component); diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs index dfe398ebaf..04f8e2eb54 100644 --- a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs +++ b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs @@ -3,6 +3,7 @@ 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 diff --git a/Content.Server/MagicMirror/MagicMirrorSystem.cs b/Content.Server/MagicMirror/MagicMirrorSystem.cs index 9ffd9a07a9..84f1f1c3e5 100644 --- a/Content.Server/MagicMirror/MagicMirrorSystem.cs +++ b/Content.Server/MagicMirror/MagicMirrorSystem.cs @@ -16,13 +16,12 @@ namespace Content.Server.MagicMirror; /// /// Allows humanoids to change their appearance mid-round. /// -public sealed class MagicMirrorSystem : EntitySystem +public sealed class MagicMirrorSystem : SharedMagicMirrorSystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; [Dependency] private readonly MarkingManager _markings = default!; [Dependency] private readonly HumanoidAppearanceSystem _humanoid = default!; - [Dependency] private readonly SharedInteractionSystem _interaction = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; public override void Initialize() @@ -32,7 +31,7 @@ public sealed class MagicMirrorSystem : EntitySystem Subs.BuiEvents(MagicMirrorUiKey.Key, subs => { - subs.Event(OnUIClosed); + subs.Event(OnUiClosed); subs.Event(OnMagicMirrorSelect); subs.Event(OnTryMagicMirrorChangeColor); subs.Event(OnTryMagicMirrorAddSlot); @@ -45,16 +44,6 @@ public sealed class MagicMirrorSystem : EntitySystem SubscribeLocalEvent(OnChangeColorDoAfter); SubscribeLocalEvent(OnRemoveSlotDoAfter); SubscribeLocalEvent(OnAddSlotDoAfter); - - SubscribeLocalEvent(OnMirrorRangeCheck); - } - - private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) - { - if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) - { - args.Result = BoundUserInterfaceRangeResult.Fail; - } } private void OnMagicMirrorInteract(Entity mirror, ref AfterInteractEvent args) @@ -62,10 +51,7 @@ public sealed class MagicMirrorSystem : EntitySystem if (!args.CanReach || args.Target == null) return; - if (!TryComp(args.User, out var actor)) - return; - - if (!_uiSystem.TryOpen(mirror.Owner, MagicMirrorUiKey.Key, actor.PlayerSession)) + if (!_uiSystem.TryOpenUi(mirror.Owner, MagicMirrorUiKey.Key, args.User)) return; UpdateInterface(mirror.Owner, args.Target.Value, mirror.Comp); @@ -79,7 +65,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnMagicMirrorSelect(EntityUid uid, MagicMirrorComponent component, MagicMirrorSelectMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -92,7 +78,7 @@ public sealed class MagicMirrorSystem : EntitySystem Marking = message.Marking, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.SelectSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.SelectSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, BreakOnDamage = true, @@ -134,7 +120,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnTryMagicMirrorChangeColor(EntityUid uid, MagicMirrorComponent component, MagicMirrorChangeColorMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -147,7 +133,7 @@ public sealed class MagicMirrorSystem : EntitySystem Colors = message.Colors, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.ChangeSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.ChangeSlotTime, doAfter, uid, target: target, used: uid) { BreakOnDamage = true, BreakOnMove = true, @@ -187,7 +173,7 @@ public sealed class MagicMirrorSystem : EntitySystem private void OnTryMagicMirrorRemoveSlot(EntityUid uid, MagicMirrorComponent component, MagicMirrorRemoveSlotMessage message) { - if (component.Target is not { } target || message.Session.AttachedEntity is not { } user) + if (component.Target is not { } target) return; _doAfterSystem.Cancel(component.DoAfter); @@ -199,7 +185,7 @@ public sealed class MagicMirrorSystem : EntitySystem Slot = message.Slot, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, user, component.RemoveSlotTime, doAfter, uid, target: target, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.RemoveSlotTime, doAfter, uid, target: target, used: uid) { DistanceThreshold = SharedInteractionSystem.InteractionRange, BreakOnDamage = true, @@ -243,9 +229,6 @@ public sealed class MagicMirrorSystem : EntitySystem if (component.Target == null) return; - if (message.Session.AttachedEntity == null) - return; - _doAfterSystem.Cancel(component.DoAfter); component.DoAfter = null; @@ -254,7 +237,7 @@ public sealed class MagicMirrorSystem : EntitySystem Category = message.Category, }; - _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Session.AttachedEntity.Value, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid) + _doAfterSystem.TryStartDoAfter(new DoAfterArgs(EntityManager, message.Actor, component.AddSlotTime, doAfter, uid, target: component.Target.Value, used: uid) { BreakOnDamage = true, BreakOnMove = true, @@ -315,12 +298,15 @@ public sealed class MagicMirrorSystem : EntitySystem facialHair, humanoid.MarkingSet.PointsLeft(MarkingCategories.FacialHair) + facialHair.Count); + // TODO: Component states component.Target = targetUid; - _uiSystem.TrySetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + _uiSystem.SetUiState(mirrorUid, MagicMirrorUiKey.Key, state); + Dirty(mirrorUid, component); } - private void OnUIClosed(Entity ent, ref BoundUIClosedEvent args) + private void OnUiClosed(Entity ent, ref BoundUIClosedEvent args) { ent.Comp.Target = null; + Dirty(ent); } } diff --git a/Content.Server/MassMedia/Systems/NewsSystem.cs b/Content.Server/MassMedia/Systems/NewsSystem.cs index 2b18b57ff8..0fb5d42394 100644 --- a/Content.Server/MassMedia/Systems/NewsSystem.cs +++ b/Content.Server/MassMedia/Systems/NewsSystem.cs @@ -92,15 +92,12 @@ public sealed class NewsSystem : SharedNewsSystem if (msg.ArticleNum >= articles.Count) return; - if (msg.Session.AttachedEntity is not { } actor) - return; - var article = articles[msg.ArticleNum]; - if (CheckDeleteAccess(article, ent, actor)) + if (CheckDeleteAccess(article, ent, msg.Actor)) { _adminLogger.Add( LogType.Chat, LogImpact.Medium, - $"{ToPrettyString(actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}" + $"{ToPrettyString(msg.Actor):actor} deleted news article {article.Title} by {article.Author}: {article.Content}" ); articles.RemoveAt(msg.ArticleNum); @@ -138,14 +135,11 @@ public sealed class NewsSystem : SharedNewsSystem if (!TryGetArticles(ent, out var articles)) return; - if (msg.Session.AttachedEntity is not { } author) - return; - - if (!_accessReader.FindStationRecordKeys(author, out _)) + if (!_accessReader.FindStationRecordKeys(msg.Actor, out _)) return; string? authorName = null; - if (_idCardSystem.TryFindIdCard(author, out var idCard)) + if (_idCardSystem.TryFindIdCard(msg.Actor, out var idCard)) authorName = idCard.Comp.FullName; var title = msg.Title.Trim(); @@ -164,7 +158,7 @@ public sealed class NewsSystem : SharedNewsSystem _adminLogger.Add( LogType.Chat, LogImpact.Medium, - $"{ToPrettyString(author):actor} created news article {article.Title} by {article.Author}: {article.Content}" + $"{ToPrettyString(msg.Actor):actor} created news article {article.Title} by {article.Author}: {article.Content}" ); articles.Add(article); @@ -248,14 +242,14 @@ public sealed class NewsSystem : SharedNewsSystem private void UpdateWriterUi(Entity ent) { - if (!_ui.TryGetUi(ent, NewsWriterUiKey.Key, out var ui)) + if (!_ui.HasUi(ent, NewsWriterUiKey.Key)) return; if (!TryGetArticles(ent, out var articles)) return; var state = new NewsWriterBoundUserInterfaceState(articles.ToArray(), ent.Comp.PublishEnabled, ent.Comp.NextPublish); - _ui.SetUiState(ui, state); + _ui.SetUiState(ent.Owner, NewsWriterUiKey.Key, state); } private void UpdateReaderUi(Entity ent, EntityUid loaderUid) diff --git a/Content.Server/Mech/Systems/MechSystem.cs b/Content.Server/Mech/Systems/MechSystem.cs index 9e546dc33f..53c6c62cdb 100644 --- a/Content.Server/Mech/Systems/MechSystem.cs +++ b/Content.Server/Mech/Systems/MechSystem.cs @@ -303,15 +303,14 @@ public sealed partial class MechSystem : SharedMechSystem { EquipmentStates = ev.States }; - var ui = _ui.GetUi(uid, MechUiKey.Key); - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, MechUiKey.Key, state); } public override void BreakMech(EntityUid uid, MechComponent? component = null) { base.BreakMech(uid, component); - _ui.TryCloseAll(uid, MechUiKey.Key); + _ui.CloseUi(uid, MechUiKey.Key); _actionBlocker.UpdateCanMove(uid); } diff --git a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs index ff02b9cbdf..a53df6dbae 100644 --- a/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs +++ b/Content.Server/Medical/CrewMonitoring/CrewMonitoringConsoleSystem.cs @@ -58,7 +58,7 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem if (!Resolve(uid, ref component)) return; - if (!_uiSystem.TryGetUi(uid, CrewMonitoringUIKey.Key, out var bui)) + if (!_uiSystem.IsUiOpen(uid, CrewMonitoringUIKey.Key)) return; // The grid must have a NavMapComponent to visualize the map in the UI @@ -69,6 +69,6 @@ public sealed class CrewMonitoringConsoleSystem : EntitySystem // Update all sensors info var allSensors = component.ConnectedSensors.Values.ToList(); - _uiSystem.SetUiState(bui, new CrewMonitoringState(allSensors)); + _uiSystem.SetUiState(uid, CrewMonitoringUIKey.Key, new CrewMonitoringState(allSensors)); } } diff --git a/Content.Server/Medical/CryoPodSystem.cs b/Content.Server/Medical/CryoPodSystem.cs index 02e8cebbe0..71921f44fd 100644 --- a/Content.Server/Medical/CryoPodSystem.cs +++ b/Content.Server/Medical/CryoPodSystem.cs @@ -193,7 +193,8 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem healthAnalyzer.ScannedEntity = entity.Comp.BodyContainer.ContainedEntity; } - _userInterfaceSystem.TrySendUiMessage( + // TODO: This should be a state my dude + _userInterfaceSystem.ServerSendUiMessage( entity.Owner, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage(GetNetEntity(entity.Comp.BodyContainer.ContainedEntity), @@ -246,7 +247,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem else { RemComp(entity); - _uiSystem.TryCloseAll(entity.Owner, HealthAnalyzerUiKey.Key); + _uiSystem.CloseUi(entity.Owner, HealthAnalyzerUiKey.Key); } UpdateAppearance(entity.Owner, entity.Comp); } @@ -297,7 +298,7 @@ public sealed partial class CryoPodSystem : SharedCryoPodSystem } // if body is ejected - no need to display health-analyzer - _uiSystem.TryCloseAll(cryoPod.Owner, HealthAnalyzerUiKey.Key); + _uiSystem.CloseUi(cryoPod.Owner, HealthAnalyzerUiKey.Key); } #endregion diff --git a/Content.Server/Medical/HealthAnalyzerSystem.cs b/Content.Server/Medical/HealthAnalyzerSystem.cs index 4988608327..7282ea197c 100644 --- a/Content.Server/Medical/HealthAnalyzerSystem.cs +++ b/Content.Server/Medical/HealthAnalyzerSystem.cs @@ -128,10 +128,10 @@ public sealed class HealthAnalyzerSystem : EntitySystem private void OpenUserInterface(EntityUid user, EntityUid analyzer) { - if (!TryComp(user, out var actor) || !_uiSystem.TryGetUi(analyzer, HealthAnalyzerUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(analyzer, HealthAnalyzerUiKey.Key)) return; - _uiSystem.OpenUi(ui, actor.PlayerSession); + _uiSystem.OpenUi(analyzer, HealthAnalyzerUiKey.Key, user); } /// @@ -172,7 +172,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem /// True makes the UI show ACTIVE, False makes the UI show INACTIVE public void UpdateScannedUser(EntityUid healthAnalyzer, EntityUid target, bool scanMode) { - if (!_uiSystem.TryGetUi(healthAnalyzer, HealthAnalyzerUiKey.Key, out var ui)) + if (!_uiSystem.HasUi(healthAnalyzer, HealthAnalyzerUiKey.Key)) return; if (!HasComp(target)) @@ -194,9 +194,7 @@ public sealed class HealthAnalyzerSystem : EntitySystem bleeding = bloodstream.BleedAmount > 0; } - - - _uiSystem.SendUiMessage(ui, new HealthAnalyzerScannedUserMessage( + _uiSystem.ServerSendUiMessage(healthAnalyzer, HealthAnalyzerUiKey.Key, new HealthAnalyzerScannedUserMessage( GetNetEntity(target), bodyTemperature, bloodAmount, diff --git a/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs new file mode 100644 index 0000000000..aa0ad98ede --- /dev/null +++ b/Content.Server/NPC/HTN/Preconditions/InContainerPrecondition.cs @@ -0,0 +1,27 @@ +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.Preconditions; + +/// +/// Checks if the owner in container or not +/// +public sealed partial class InContainerPrecondition : HTNPrecondition +{ + private ContainerSystem _container = default!; + + [ViewVariables(VVAccess.ReadWrite)] [DataField("isInContainer")] public bool IsInContainer = true; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + } + + public override bool IsMet(NPCBlackboard blackboard) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + return IsInContainer && _container.IsEntityInContainer(owner) || + !IsInContainer && !_container.IsEntityInContainer(owner); + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs new file mode 100644 index 0000000000..667d0b8ec4 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/ContainerOperator.cs @@ -0,0 +1,40 @@ +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class ContainerOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private ContainerSystem _container = default!; + private EntityQuery _transformQuery; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + [DataField("targetKey", required: true)] + public string TargetKey = default!; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + _transformQuery = _entManager.GetEntityQuery(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + if (!_container.TryGetOuterContainer(owner, _transformQuery.GetComponent(owner), out var outerContainer) && outerContainer == null) + return; + + var target = outerContainer.Owner; + blackboard.SetValue(TargetKey, target); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs new file mode 100644 index 0000000000..a794e1e314 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/EscapeOperator.cs @@ -0,0 +1,140 @@ +using System.Threading; +using System.Threading.Tasks; +using Content.Server.NPC.Components; +using Content.Server.Storage.EntitySystems; +using Content.Shared.CombatMode; +using Robust.Server.Containers; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat.Melee; + +public sealed partial class EscapeOperator : HTNOperator, IHtnConditionalShutdown +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private ContainerSystem _container = default!; + private EntityStorageSystem _entityStorage = default!; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + [DataField("targetKey", required: true)] + public string TargetKey = default!; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _container = sysManager.GetEntitySystem(); + _entityStorage = sysManager.GetEntitySystem(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + var target = blackboard.GetValue(TargetKey); + + if (_entityStorage.TryOpenStorage(owner, target)) + { + TaskShutdown(blackboard, HTNOperatorStatus.Finished); + return; + } + + var melee = _entManager.EnsureComponent(owner); + melee.MissChance = blackboard.GetValueOrDefault(NPCBlackboard.MeleeMissChance, _entManager); + melee.Target = target; + } + + public override async Task<(bool Valid, Dictionary? Effects)> Plan(NPCBlackboard blackboard, + CancellationToken cancelToken) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + if (!blackboard.TryGetValue(TargetKey, out var target, _entManager)) + { + return (false, null); + } + + if (!_container.IsEntityInContainer(owner)) + { + return (false, null); + } + + if (_entityStorage.TryOpenStorage(owner, target)) + { + return (false, null); + } + + return (true, null); + } + + public void ConditionalShutdown(NPCBlackboard blackboard) + { + var owner = blackboard.GetValue(NPCBlackboard.Owner); + _entManager.System().SetInCombatMode(owner, false); + _entManager.RemoveComponent(owner); + blackboard.Remove(TargetKey); + } + + public override void TaskShutdown(NPCBlackboard blackboard, HTNOperatorStatus status) + { + base.TaskShutdown(blackboard, status); + + ConditionalShutdown(blackboard); + } + + public override void PlanShutdown(NPCBlackboard blackboard) + { + base.PlanShutdown(blackboard); + + ConditionalShutdown(blackboard); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + base.Update(blackboard, frameTime); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + HTNOperatorStatus status; + + if (_entManager.TryGetComponent(owner, out var combat) && + blackboard.TryGetValue(TargetKey, out var target, _entManager)) + { + combat.Target = target; + + // Success + if (!_container.IsEntityInContainer(owner)) + { + status = HTNOperatorStatus.Finished; + } + else + { + if (_entityStorage.TryOpenStorage(owner, target)) + { + status = HTNOperatorStatus.Finished; + } + else + { + switch (combat.Status) + { + case CombatStatus.TargetOutOfRange: + case CombatStatus.Normal: + status = HTNOperatorStatus.Continuing; + break; + default: + status = HTNOperatorStatus.Failed; + break; + } + } + } + } + else + { + status = HTNOperatorStatus.Failed; + } + + // Mark it as finished to continue the plan. + if (status == HTNOperatorStatus.Continuing && ShutdownState == HTNPlanState.PlanFinished) + { + status = HTNOperatorStatus.Finished; + } + + return status; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs new file mode 100644 index 0000000000..54f422fe67 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnPullOperator.cs @@ -0,0 +1,35 @@ +using Content.Shared.Movement.Pulling.Components; +using Content.Shared.Movement.Pulling.Systems; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class UnPullOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private PullingSystem _pulling = default!; + + private EntityQuery _pullableQuery; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _pulling = sysManager.GetEntitySystem(); + _pullableQuery = _entManager.GetEntityQuery(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + + _pulling.TryStopPull(owner, _pullableQuery.GetComponent(owner), owner); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs new file mode 100644 index 0000000000..207665d786 --- /dev/null +++ b/Content.Server/NPC/HTN/PrimitiveTasks/Operators/Combat/UnbuckleOperator.cs @@ -0,0 +1,34 @@ +using Content.Server.Buckle.Systems; +using Content.Shared.Buckle.Components; + +namespace Content.Server.NPC.HTN.PrimitiveTasks.Operators.Combat; + +public sealed partial class UnbuckleOperator : HTNOperator +{ + [Dependency] private readonly IEntityManager _entManager = default!; + private BuckleSystem _buckle = default!; + + [DataField("shutdownState")] + public HTNPlanState ShutdownState { get; private set; } = HTNPlanState.TaskFinished; + + public override void Initialize(IEntitySystemManager sysManager) + { + base.Initialize(sysManager); + _buckle = sysManager.GetEntitySystem(); + } + + public override void Startup(NPCBlackboard blackboard) + { + base.Startup(blackboard); + var owner = blackboard.GetValue(NPCBlackboard.Owner); + if (!_entManager.TryGetComponent(owner, out var buckle) || !buckle.Buckled) + return; + + _buckle.TryUnbuckle(owner, owner, true, buckle); + } + + public override HTNOperatorStatus Update(NPCBlackboard blackboard, float frameTime) + { + return HTNOperatorStatus.Finished; + } +} diff --git a/Content.Server/Nuke/NukeSystem.cs b/Content.Server/Nuke/NukeSystem.cs index c996f05ec4..b72be0b46c 100644 --- a/Content.Server/Nuke/NukeSystem.cs +++ b/Content.Server/Nuke/NukeSystem.cs @@ -187,7 +187,7 @@ public sealed class NukeSystem : EntitySystem continue; var msg = Loc.GetString("nuke-component-cant-anchor-floor"); - _popups.PopupEntity(msg, uid, args.Session, PopupType.MediumCaution); + _popups.PopupEntity(msg, uid, args.Actor, PopupType.MediumCaution); return; } @@ -243,10 +243,7 @@ public sealed class NukeSystem : EntitySystem else { - if (args.Session.AttachedEntity is not { } user) - return; - - DisarmBombDoafter(uid, user, component); + DisarmBombDoafter(uid, args.Actor, component); } } @@ -366,8 +363,7 @@ public sealed class NukeSystem : EntitySystem if (!Resolve(uid, ref component)) return; - var ui = _ui.GetUiOrNull(uid, NukeUiKey.Key); - if (ui == null) + if (!_ui.HasUi(uid, NukeUiKey.Key)) return; var anchored = Transform(uid).Anchored; @@ -388,7 +384,7 @@ public sealed class NukeSystem : EntitySystem CooldownTime = (int) component.CooldownTime }; - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, NukeUiKey.Key, state); } private void PlayNukeKeypadSound(EntityUid uid, int number, NukeComponent? component = null) diff --git a/Content.Server/NukeOps/WarDeclaratorSystem.cs b/Content.Server/NukeOps/WarDeclaratorSystem.cs index bcc0b9c0ea..a2d74e16b3 100644 --- a/Content.Server/NukeOps/WarDeclaratorSystem.cs +++ b/Content.Server/NukeOps/WarDeclaratorSystem.cs @@ -55,9 +55,6 @@ public sealed class WarDeclaratorSystem : EntitySystem private void OnActivated(Entity ent, ref WarDeclaratorActivateMessage args) { - if (args.Session.AttachedEntity is not {} playerEntity) - return; - var ev = new WarDeclaredEvent(ent.Comp.CurrentStatus, ent); RaiseLocalEvent(ref ev); @@ -75,7 +72,7 @@ public sealed class WarDeclaratorSystem : EntitySystem { var title = Loc.GetString(ent.Comp.SenderTitle); _chat.DispatchGlobalAnnouncement(ent.Comp.Message, title, true, ent.Comp.Sound, ent.Comp.Color); - _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(playerEntity):player} has declared war with this text: {ent.Comp.Message}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, $"{ToPrettyString(args.Actor):player} has declared war with this text: {ent.Comp.Message}"); } UpdateUI(ent, ev.Status); @@ -83,8 +80,8 @@ public sealed class WarDeclaratorSystem : EntitySystem private void UpdateUI(Entity ent, WarConditionStatus? status = null) { - _userInterfaceSystem.TrySetUiState( - ent, + _userInterfaceSystem.SetUiState( + ent.Owner, WarDeclaratorUiKey.Key, new WarDeclaratorBoundUserInterfaceState(status, ent.Comp.DisableAt, ent.Comp.ShuttleDisabledTime)); } diff --git a/Content.Server/PAI/PAISystem.cs b/Content.Server/PAI/PAISystem.cs index e9505b5e6f..091afb1557 100644 --- a/Content.Server/PAI/PAISystem.cs +++ b/Content.Server/PAI/PAISystem.cs @@ -102,13 +102,15 @@ public sealed class PAISystem : SharedPAISystem { // Close the instrument interface if it was open // before closing - if (HasComp(uid) && TryComp(uid, out var actor)) + if (HasComp(uid)) { - _instrumentSystem.ToggleInstrumentUi(uid, actor.PlayerSession); + _instrumentSystem.ToggleInstrumentUi(uid, uid); } // Stop instrument - if (TryComp(uid, out var instrument)) _instrumentSystem.Clean(uid, instrument); + if (TryComp(uid, out var instrument)) + _instrumentSystem.Clean(uid, instrument); + if (TryComp(uid, out var metadata)) { var proto = metadata.EntityPrototype; diff --git a/Content.Server/PDA/PdaSystem.cs b/Content.Server/PDA/PdaSystem.cs index a343607196..0b86fe29ed 100644 --- a/Content.Server/PDA/PdaSystem.cs +++ b/Content.Server/PDA/PdaSystem.cs @@ -41,6 +41,7 @@ namespace Content.Server.PDA SubscribeLocalEvent(OnLightToggle); // UI Events: + SubscribeLocalEvent(OnPdaOpen); SubscribeLocalEvent(OnUiMessage); SubscribeLocalEvent(OnUiMessage); SubscribeLocalEvent(OnUiMessage); @@ -145,7 +146,7 @@ namespace Content.Server.PDA if (!Resolve(uid, ref pda, false)) return; - if (!_ui.TryGetUi(uid, PdaUiKey.Key, out var ui)) + if (!_ui.HasUi(uid, PdaUiKey.Key)) return; var address = GetDeviceNetAddress(uid); @@ -182,7 +183,15 @@ namespace Content.Server.PDA hasInstrument, address); - _ui.SetUiState(ui, state); + _ui.SetUiState(uid, PdaUiKey.Key, state); + } + + private void OnPdaOpen(Entity ent, ref BoundUIOpenedEvent args) + { + if (!PdaUiKey.Key.Equals(args.UiKey)) + return; + + UpdatePdaUi(ent.Owner, ent.Comp); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaRequestUpdateInterfaceMessage msg) @@ -208,7 +217,7 @@ namespace Content.Server.PDA return; if (HasComp(uid)) - _ringer.ToggleRingerUI(uid, msg.Session); + _ringer.ToggleRingerUI(uid, msg.Actor); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowMusicMessage msg) @@ -217,7 +226,7 @@ namespace Content.Server.PDA return; if (TryComp(uid, out var instrument)) - _instrument.ToggleInstrumentUi(uid, msg.Session, instrument); + _instrument.ToggleInstrumentUi(uid, msg.Actor, instrument); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaShowUplinkMessage msg) @@ -227,7 +236,7 @@ namespace Content.Server.PDA // check if its locked again to prevent malicious clients opening locked uplinks if (TryComp(uid, out var store) && IsUnlocked(uid)) - _store.ToggleUi(msg.Session.AttachedEntity!.Value, uid, store); + _store.ToggleUi(msg.Actor, uid, store); } private void OnUiMessage(EntityUid uid, PdaComponent pda, PdaLockUplinkMessage msg) diff --git a/Content.Server/PDA/Ringer/RingerSystem.cs b/Content.Server/PDA/Ringer/RingerSystem.cs index f95725873a..a10544d696 100644 --- a/Content.Server/PDA/Ringer/RingerSystem.cs +++ b/Content.Server/PDA/Ringer/RingerSystem.cs @@ -81,7 +81,10 @@ namespace Content.Server.PDA.Ringer private void OnSetRingtone(EntityUid uid, RingerComponent ringer, RingerSetRingtoneMessage args) { - ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, args.Session.UserId, out var exists); + if (!TryComp(args.Actor, out ActorComponent? actorComp)) + return; + + ref var lastSetAt = ref CollectionsMarshal.GetValueRefOrAddDefault(_lastSetRingtoneAt, actorComp.PlayerSession.UserId, out var exists); // Delay on the client is 0.333, 0.25 is still enough and gives some leeway in case of small time differences if (exists && lastSetAt > _gameTiming.CurTime - TimeSpan.FromMilliseconds(250)) @@ -111,7 +114,7 @@ namespace Content.Server.PDA.Ringer // can't keep store open after locking it if (!uplink.Unlocked) - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); // no saving the code to prevent meta click set on sus guys pda -> wewlad args.Handled = true; @@ -130,7 +133,7 @@ namespace Content.Server.PDA.Ringer return; uplink.Unlocked = false; - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); } public void RandomizeRingtone(EntityUid uid, RingerComponent ringer, MapInitEvent args) @@ -181,14 +184,12 @@ namespace Content.Server.PDA.Ringer private void UpdateRingerUserInterface(EntityUid uid, RingerComponent ringer, bool isPlaying) { - if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui)) - _ui.SetUiState(bui, new RingerUpdateState(isPlaying, ringer.Ringtone)); + _ui.SetUiState(uid, RingerUiKey.Key, new RingerUpdateState(isPlaying, ringer.Ringtone)); } - public bool ToggleRingerUI(EntityUid uid, ICommonSession session) + public bool ToggleRingerUI(EntityUid uid, EntityUid actor) { - if (_ui.TryGetUi(uid, RingerUiKey.Key, out var bui)) - _ui.ToggleUi(bui, session); + _ui.TryToggleUi(uid, RingerUiKey.Key, actor); return true; } diff --git a/Content.Server/Paper/PaperComponent.cs b/Content.Server/Paper/PaperComponent.cs index 3cf011e34d..6c379eea2b 100644 --- a/Content.Server/Paper/PaperComponent.cs +++ b/Content.Server/Paper/PaperComponent.cs @@ -3,7 +3,7 @@ using Robust.Shared.GameStates; namespace Content.Server.Paper; -[NetworkedComponent, RegisterComponent] +[RegisterComponent] public sealed partial class PaperComponent : SharedPaperComponent { public PaperAction Mode; diff --git a/Content.Server/Paper/PaperSystem.cs b/Content.Server/Paper/PaperSystem.cs index c582b82e2c..d10d04cfb9 100644 --- a/Content.Server/Paper/PaperSystem.cs +++ b/Content.Server/Paper/PaperSystem.cs @@ -67,11 +67,7 @@ namespace Content.Server.Paper private void BeforeUIOpen(EntityUid uid, PaperComponent paperComp, BeforeActivatableUIOpenEvent args) { paperComp.Mode = PaperAction.Read; - - if (!TryComp(args.User, out var actor)) - return; - - UpdateUserInterface(uid, paperComp, actor.PlayerSession); + UpdateUserInterface(uid, paperComp); } private void OnExamined(EntityUid uid, PaperComponent paperComp, ExaminedEvent args) @@ -108,12 +104,10 @@ namespace Content.Server.Paper { var writeEvent = new PaperWriteEvent(uid, args.User); RaiseLocalEvent(args.Used, ref writeEvent); - if (!TryComp(args.User, out var actor)) - return; paperComp.Mode = PaperAction.Write; - _uiSystem.TryOpen(uid, PaperUiKey.Key, actor.PlayerSession); - UpdateUserInterface(uid, paperComp, actor.PlayerSession); + _uiSystem.OpenUi(uid, PaperUiKey.Key, args.User); + UpdateUserInterface(uid, paperComp); args.Handled = true; return; } @@ -157,9 +151,8 @@ namespace Content.Server.Paper if (TryComp(uid, out var meta)) _metaSystem.SetEntityDescription(uid, "", meta); - if (args.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Chat, LogImpact.Low, - $"{ToPrettyString(args.Session.AttachedEntity.Value):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}"); + _adminLogger.Add(LogType.Chat, LogImpact.Low, + $"{ToPrettyString(args.Actor):player} has written on {ToPrettyString(uid):entity} the following text: {args.Text}"); _audio.PlayPvs(paperComp.Sound, uid); } @@ -213,13 +206,12 @@ namespace Content.Server.Paper _appearance.SetData(uid, PaperVisuals.Status, status, appearance); } - public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null, ICommonSession? session = null) + public void UpdateUserInterface(EntityUid uid, PaperComponent? paperComp = null) { if (!Resolve(uid, ref paperComp)) return; - if (_uiSystem.TryGetUi(uid, PaperUiKey.Key, out var bui)) - _uiSystem.SetUiState(bui, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode), session); + _uiSystem.SetUiState(uid, PaperUiKey.Key, new PaperBoundUserInterfaceState(paperComp.Content, paperComp.StampedBy, paperComp.Mode)); } } diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs index 5d373652a9..f3cff9f2e7 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.ControlBox.cs @@ -67,7 +67,7 @@ public sealed partial class ParticleAcceleratorSystem FireEmitter(comp.StarboardEmitter!.Value, strength); } - public void SwitchOn(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SwitchOn(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; @@ -77,7 +77,7 @@ public sealed partial class ParticleAcceleratorSystem if (comp.Enabled || !comp.CanBeEnabled) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} on"); comp.Enabled = true; @@ -90,14 +90,14 @@ public sealed partial class ParticleAcceleratorSystem UpdateUI(uid, comp); } - public void SwitchOff(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SwitchOff(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; if (!comp.Enabled) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) _adminLogger.Add(LogType.Action, LogImpact.Low, $"{ToPrettyString(player):player} has turned {ToPrettyString(uid)} off"); comp.Enabled = false; @@ -138,7 +138,7 @@ public sealed partial class ParticleAcceleratorSystem UpdateUI(uid, comp); } - public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? comp = null) + public void SetStrength(EntityUid uid, ParticleAcceleratorPowerState strength, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? comp = null) { if (!Resolve(uid, ref comp)) return; @@ -154,7 +154,7 @@ public sealed partial class ParticleAcceleratorSystem if (strength == comp.SelectedStrength) return; - if (user?.AttachedEntity is { } player) + if (user is { } player) { var impact = strength switch { @@ -235,7 +235,8 @@ public sealed partial class ParticleAcceleratorSystem { if (!Resolve(uid, ref comp)) return; - if (!_uiSystem.TryGetUi(uid, ParticleAcceleratorControlBoxUiKey.Key, out var bui)) + + if (!_uiSystem.HasUi(uid, ParticleAcceleratorControlBoxUiKey.Key)) return; var draw = 0f; @@ -247,7 +248,7 @@ public sealed partial class ParticleAcceleratorSystem receive = powerConsumer.ReceivedPower; } - _uiSystem.SetUiState(bui, new ParticleAcceleratorUIState( + _uiSystem.SetUiState(uid, ParticleAcceleratorControlBoxUiKey.Key, new ParticleAcceleratorUIState( comp.Assembled, comp.Enabled, comp.SelectedStrength, @@ -346,7 +347,7 @@ public sealed partial class ParticleAcceleratorSystem UpdateAppearance(uid, comp); if (!args.Powered) - _uiSystem.TryCloseAll(uid, ParticleAcceleratorControlBoxUiKey.Key); + _uiSystem.CloseUi(uid, ParticleAcceleratorControlBoxUiKey.Key); } private void OnUISetEnableMessage(EntityUid uid, ParticleAcceleratorControlBoxComponent comp, ParticleAcceleratorSetEnableMessage msg) @@ -361,10 +362,10 @@ public sealed partial class ParticleAcceleratorSystem if (msg.Enabled) { if (comp.Assembled) - SwitchOn(uid, msg.Session, comp); + SwitchOn(uid, msg.Actor, comp); } else - SwitchOff(uid, msg.Session, comp); + SwitchOff(uid, msg.Actor, comp); UpdateUI(uid, comp); } @@ -378,7 +379,7 @@ public sealed partial class ParticleAcceleratorSystem if (TryComp(uid, out var apcPower) && !apcPower.Powered) return; - SetStrength(uid, msg.State, msg.Session, comp); + SetStrength(uid, msg.State, msg.Actor, comp); UpdateUI(uid, comp); } @@ -392,7 +393,7 @@ public sealed partial class ParticleAcceleratorSystem if (TryComp(uid, out var apcPower) && !apcPower.Powered) return; - RescanParts(uid, msg.Session, comp); + RescanParts(uid, msg.Actor, comp); UpdateUI(uid, comp); } diff --git a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs index bdbc7b3f5b..99bb0d5cbd 100644 --- a/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs +++ b/Content.Server/ParticleAccelerator/EntitySystems/ParticleAcceleratorSystem.Parts.cs @@ -18,7 +18,7 @@ public sealed partial class ParticleAcceleratorSystem SubscribeLocalEvent(BodyTypeChanged); } - public void RescanParts(EntityUid uid, ICommonSession? user = null, ParticleAcceleratorControlBoxComponent? controller = null) + public void RescanParts(EntityUid uid, EntityUid? user = null, ParticleAcceleratorControlBoxComponent? controller = null) { if (!Resolve(uid, ref controller)) return; diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs index 0cbd47c233..0645944a2a 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorLimiterWireAction.cs @@ -48,8 +48,7 @@ public sealed partial class ParticleAcceleratorLimiterWireAction : ComponentWire // Yes, it's a feature that mending this wire WON'T WORK if the strength wire is also cut. // Since that blocks SetStrength(). var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; - paSystem.SetStrength(wire.Owner, controller.MaxStrength, userSession, controller); + paSystem.SetStrength(wire.Owner, controller.MaxStrength, user, controller); return true; } diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs index 65fa76ee41..1650960bd3 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorStrengthWireAction.cs @@ -33,7 +33,6 @@ public sealed partial class ParticleAcceleratorStrengthWireAction : ComponentWir public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; - paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), userSession, controller); + paSystem.SetStrength(wire.Owner, (ParticleAcceleratorPowerState) ((int) controller.SelectedStrength + 1), user, controller); } } diff --git a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs index c43403edd4..40a15d2bc5 100644 --- a/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs +++ b/Content.Server/ParticleAccelerator/Wires/ParticleAcceleratorToggleWireAction.cs @@ -23,10 +23,9 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc public override bool Cut(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; controller.CanBeEnabled = false; - paSystem.SwitchOff(wire.Owner, userSession, controller); + paSystem.SwitchOff(wire.Owner, user, controller); return true; } @@ -39,11 +38,10 @@ public sealed partial class ParticleAcceleratorPowerWireAction : ComponentWireAc public override void Pulse(EntityUid user, Wire wire, ParticleAcceleratorControlBoxComponent controller) { var paSystem = EntityManager.System(); - var userSession = EntityManager.TryGetComponent(user, out var actor) ? actor.PlayerSession : null; if (controller.Enabled) - paSystem.SwitchOff(wire.Owner, userSession, controller); + paSystem.SwitchOff(wire.Owner, user, controller); else if (controller.Assembled) - paSystem.SwitchOn(wire.Owner, userSession, controller); + paSystem.SwitchOn(wire.Owner, user, controller); } } diff --git a/Content.Server/Pinpointer/NavMapSystem.cs b/Content.Server/Pinpointer/NavMapSystem.cs index 34c76a1320..0aa6ab1908 100644 --- a/Content.Server/Pinpointer/NavMapSystem.cs +++ b/Content.Server/Pinpointer/NavMapSystem.cs @@ -155,9 +155,6 @@ public sealed partial class NavMapSystem : SharedNavMapSystem private void OnConfigureMessage(Entity ent, ref NavMapBeaconConfigureBuiMessage args) { - if (args.Session.AttachedEntity is not { } user) - return; - if (!TryComp(ent, out var beacon)) return; @@ -167,7 +164,7 @@ public sealed partial class NavMapSystem : SharedNavMapSystem return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(user):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it."); + $"{ToPrettyString(args.Actor):player} configured NavMapBeacon \'{ToPrettyString(ent):entity}\' with text \'{args.Text}\', color {args.Color.ToHexNoAlpha()}, and {(args.Enabled ? "enabled" : "disabled")} it."); if (TryComp(ent, out var warpPoint)) { diff --git a/Content.Server/Pinpointer/StationMapSystem.cs b/Content.Server/Pinpointer/StationMapSystem.cs index c9db560fef..b0b3141fb0 100644 --- a/Content.Server/Pinpointer/StationMapSystem.cs +++ b/Content.Server/Pinpointer/StationMapSystem.cs @@ -24,29 +24,23 @@ public sealed class StationMapSystem : EntitySystem private void OnStationMapClosed(EntityUid uid, StationMapComponent component, BoundUIClosedEvent args) { - if (!Equals(args.UiKey, StationMapUiKey.Key) || args.Session.AttachedEntity == null) + if (!Equals(args.UiKey, StationMapUiKey.Key)) return; - RemCompDeferred(args.Session.AttachedEntity.Value); + RemCompDeferred(args.Actor); } private void OnUserParentChanged(EntityUid uid, StationMapUserComponent component, ref EntParentChangedMessage args) { - if (TryComp(uid, out var actor)) - { - _ui.TryClose(component.Map, StationMapUiKey.Key, actor.PlayerSession); - } + _ui.CloseUi(component.Map, StationMapUiKey.Key, uid); } private void OnStationMapOpened(EntityUid uid, StationMapComponent component, BoundUIOpenedEvent args) { - if (args.Session.AttachedEntity == null) - return; - if (!_cell.TryUseActivatableCharge(uid)) return; - var comp = EnsureComp(args.Session.AttachedEntity.Value); + var comp = EnsureComp(args.Actor); comp.Map = uid; } } diff --git a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs b/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs deleted file mode 100644 index c387457adb..0000000000 --- a/Content.Server/Power/Components/ActivatableUIRequiresPowerComponent.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace Content.Server.Power.Components -{ - [RegisterComponent] - public sealed partial class ActivatableUIRequiresPowerComponent : Component - { - } -} - diff --git a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs index 561b0e71f0..72843a65b8 100644 --- a/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs +++ b/Content.Server/Power/EntitySystems/ActivatableUIRequiresPowerSystem.cs @@ -4,11 +4,12 @@ using Content.Shared.UserInterface; using JetBrains.Annotations; using Content.Shared.Wires; using Content.Server.UserInterface; +using Content.Shared.Power.Components; +using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.Power.EntitySystems; -[UsedImplicitly] -internal sealed class ActivatableUIRequiresPowerSystem : EntitySystem +public sealed class ActivatableUIRequiresPowerSystem : EntitySystem { [Dependency] private readonly ActivatableUISystem _activatableUI = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; diff --git a/Content.Server/Power/EntitySystems/ApcSystem.cs b/Content.Server/Power/EntitySystems/ApcSystem.cs index 95b5d74a94..388f65ad2e 100644 --- a/Content.Server/Power/EntitySystems/ApcSystem.cs +++ b/Content.Server/Power/EntitySystems/ApcSystem.cs @@ -66,11 +66,8 @@ public sealed class ApcSystem : EntitySystem //Update the HasAccess var for UI to read private void OnBoundUiOpen(EntityUid uid, ApcComponent component, BoundUIOpenedEvent args) { - if (args.Session.AttachedEntity == null) - return; - // TODO: this should be per-player not stored on the apc - component.HasAccess = _accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid); + component.HasAccess = _accessReader.IsAllowed(args.Actor, uid); UpdateApcState(uid, component); } @@ -81,21 +78,18 @@ public sealed class ApcSystem : EntitySystem if (attemptEv.Cancelled) { _popup.PopupCursor(Loc.GetString("apc-component-on-toggle-cancel"), - args.Session, PopupType.Medium); + args.Actor, PopupType.Medium); return; } - if (args.Session.AttachedEntity == null) - return; - - if (_accessReader.IsAllowed(args.Session.AttachedEntity.Value, uid)) + if (_accessReader.IsAllowed(args.Actor, uid)) { ApcToggleBreaker(uid, component); } else { _popup.PopupCursor(Loc.GetString("apc-component-insufficient-access"), - args.Session, PopupType.Medium); + args.Actor, PopupType.Medium); } } @@ -158,7 +152,7 @@ public sealed class ApcSystem : EntitySystem (int) MathF.Ceiling(battery.CurrentSupply), apc.LastExternalState, battery.CurrentStorage / battery.Capacity); - _ui.TrySetUiState(uid, ApcUiKey.Key, state, ui: ui); + _ui.SetUiState((uid, ui), ApcUiKey.Key, state); } private ApcChargeState CalcChargeState(EntityUid uid, PowerState.Battery battery) diff --git a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs index 0e20f007d7..be1238fd2b 100644 --- a/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerMonitoringConsoleSystem.cs @@ -286,20 +286,17 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori var query = AllEntityQuery(); while (query.MoveNext(out var ent, out var console)) { - if (!_userInterfaceSystem.TryGetUi(ent, PowerMonitoringConsoleUiKey.Key, out var bui)) + if (!_userInterfaceSystem.IsUiOpen(ent, PowerMonitoringConsoleUiKey.Key)) continue; - foreach (var session in bui.SubscribedSessions) - UpdateUIState(ent, console, session); + UpdateUIState(ent, console); + } } } - public void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component, ICommonSession session) + private void UpdateUIState(EntityUid uid, PowerMonitoringConsoleComponent component) { - if (!_userInterfaceSystem.TryGetUi(uid, PowerMonitoringConsoleUiKey.Key, out var bui)) - return; - var consoleXform = Transform(uid); if (consoleXform?.GridUid == null) @@ -422,15 +419,15 @@ internal sealed partial class PowerMonitoringConsoleSystem : SharedPowerMonitori } // Set the UI state - _userInterfaceSystem.SetUiState(bui, + _userInterfaceSystem.SetUiState(uid, + PowerMonitoringConsoleUiKey.Key, new PowerMonitoringConsoleBoundInterfaceState (totalSources, totalBatteryUsage, totalLoads, allEntries.ToArray(), sourcesForFocus.ToArray(), - loadsForFocus.ToArray()), - session); + loadsForFocus.ToArray())); } private double GetPrimaryPowerValues(EntityUid uid, PowerMonitoringDeviceComponent device, out double powerSupplied, out double powerUsage, out double batteryUsage) diff --git a/Content.Server/Power/Generator/PortableGeneratorSystem.cs b/Content.Server/Power/Generator/PortableGeneratorSystem.cs index a95a3fd423..f7d259b122 100644 --- a/Content.Server/Power/Generator/PortableGeneratorSystem.cs +++ b/Content.Server/Power/Generator/PortableGeneratorSystem.cs @@ -48,30 +48,21 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem private void GeneratorSwitchOutputMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorSwitchOutputMessage args) { - if (args.Session.AttachedEntity == null) - return; - var fuelGenerator = Comp(uid); if (fuelGenerator.On) return; - _switchable.Cycle(uid, args.Session.AttachedEntity.Value); + _switchable.Cycle(uid, args.Actor); } private void GeneratorStopMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStopMessage args) { - if (args.Session.AttachedEntity == null) - return; - - StopGenerator(uid, component, args.Session.AttachedEntity.Value); + StopGenerator(uid, component, args.Actor); } private void GeneratorStartMessage(EntityUid uid, PortableGeneratorComponent component, PortableGeneratorStartMessage args) { - if (args.Session.AttachedEntity == null) - return; - - StartGenerator(uid, component, args.Session.AttachedEntity.Value); + StartGenerator(uid, component, args.Actor); } private void StartGenerator(EntityUid uid, PortableGeneratorComponent component, EntityUid user) @@ -234,7 +225,7 @@ public sealed class PortableGeneratorSystem : SharedPortableGeneratorSystem if (powerSupplier.Net is { IsConnectedNetwork: true } net) networkStats = (net.NetworkNode.LastCombinedLoad, net.NetworkNode.LastCombinedSupply); - _uiSystem.TrySetUiState( + _uiSystem.SetUiState( uid, GeneratorComponentUiKey.Key, new PortableGeneratorComponentBuiState(fuelComp, fuel, clogged, networkStats)); diff --git a/Content.Server/PowerCell/PowerCellSystem.cs b/Content.Server/PowerCell/PowerCellSystem.cs index d4c1faa4c9..f45a01b2e1 100644 --- a/Content.Server/PowerCell/PowerCellSystem.cs +++ b/Content.Server/PowerCell/PowerCellSystem.cs @@ -11,6 +11,7 @@ using Content.Server.Power.EntitySystems; using Content.Server.UserInterface; using Content.Shared.Containers.ItemSlots; using Content.Shared.Popups; +using ActivatableUISystem = Content.Shared.UserInterface.ActivatableUISystem; namespace Content.Server.PowerCell; diff --git a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs index ace7d8ae31..56c5d8e548 100644 --- a/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioDeviceSystem.cs @@ -201,6 +201,9 @@ public sealed class RadioDeviceSystem : EntitySystem private void OnReceiveRadio(EntityUid uid, RadioSpeakerComponent component, ref RadioReceiveEvent args) { + if (uid == args.RadioSource) + return; + var nameEv = new TransformSpeakerNameEvent(args.MessageSource, Name(args.MessageSource)); RaiseLocalEvent(args.MessageSource, nameEv); @@ -218,25 +221,25 @@ public sealed class RadioDeviceSystem : EntitySystem private void OnToggleIntercomMic(EntityUid uid, IntercomComponent component, ToggleIntercomMicMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; - SetMicrophoneEnabled(uid, user, args.Enabled, true); + SetMicrophoneEnabled(uid, args.Actor, args.Enabled, true); UpdateIntercomUi(uid, component); } private void OnToggleIntercomSpeaker(EntityUid uid, IntercomComponent component, ToggleIntercomSpeakerMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { } user) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; - SetSpeakerEnabled(uid, user, args.Enabled, true); + SetSpeakerEnabled(uid, args.Actor, args.Enabled, true); UpdateIntercomUi(uid, component); } private void OnSelectIntercomChannel(EntityUid uid, IntercomComponent component, SelectIntercomChannelMessage args) { - if (component.RequiresPower && !this.IsPowered(uid, EntityManager) || args.Session.AttachedEntity is not { }) + if (component.RequiresPower && !this.IsPowered(uid, EntityManager)) return; if (!_protoMan.TryIndex(args.Channel, out _) || !component.SupportedChannels.Contains(args.Channel)) @@ -259,6 +262,6 @@ public sealed class RadioDeviceSystem : EntitySystem var availableChannels = component.SupportedChannels; var selectedChannel = micComp?.BroadcastChannel ?? SharedChatSystem.CommonChannel; var state = new IntercomBoundUIState(micEnabled, speakerEnabled, availableChannels, selectedChannel); - _ui.TrySetUiState(uid, IntercomUiKey.Key, state); + _ui.SetUiState(uid, IntercomUiKey.Key, state); } } diff --git a/Content.Server/Radio/EntitySystems/RadioSystem.cs b/Content.Server/Radio/EntitySystems/RadioSystem.cs index 5d3074b06b..4341746aaf 100644 --- a/Content.Server/Radio/EntitySystems/RadioSystem.cs +++ b/Content.Server/Radio/EntitySystems/RadioSystem.cs @@ -112,7 +112,7 @@ public sealed class RadioSystem : EntitySystem NetEntity.Invalid, null); var chatMsg = new MsgChatMessage { Message = chat }; - var ev = new RadioReceiveEvent(message, messageSource, channel, chatMsg); + var ev = new RadioReceiveEvent(message, messageSource, channel, radioSource, chatMsg); var sendAttemptEv = new RadioSendAttemptEvent(channel, radioSource); RaiseLocalEvent(ref sendAttemptEv); diff --git a/Content.Server/Radio/RadioEvent.cs b/Content.Server/Radio/RadioEvent.cs index 69d764ffe6..fafa66674e 100644 --- a/Content.Server/Radio/RadioEvent.cs +++ b/Content.Server/Radio/RadioEvent.cs @@ -4,7 +4,7 @@ using Content.Shared.Radio; namespace Content.Server.Radio; [ByRefEvent] -public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, MsgChatMessage ChatMsg); +public readonly record struct RadioReceiveEvent(string Message, EntityUid MessageSource, RadioChannelPrototype Channel, EntityUid RadioSource, MsgChatMessage ChatMsg); /// /// Use this event to cancel sending message per receiver diff --git a/Content.Server/Research/Systems/ResearchSystem.Client.cs b/Content.Server/Research/Systems/ResearchSystem.Client.cs index 6bd5300d8f..f8fdba55b7 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Client.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Client.cs @@ -45,7 +45,7 @@ public sealed partial class ResearchSystem if (!this.IsPowered(uid, EntityManager)) return; - _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Session); + _uiSystem.TryToggleUi(uid, ResearchClientUiKey.Key, args.Actor); } #endregion @@ -88,7 +88,7 @@ public sealed partial class ResearchSystem var state = new ResearchClientBoundInterfaceState(names.Length, names, GetServerIds(), serverComponent?.Id ?? -1); - _uiSystem.TrySetUiState(uid, ResearchClientUiKey.Key, state); + _uiSystem.SetUiState(uid, ResearchClientUiKey.Key, state); } /// diff --git a/Content.Server/Research/Systems/ResearchSystem.Console.cs b/Content.Server/Research/Systems/ResearchSystem.Console.cs index 9f95fd2517..5358ddefcd 100644 --- a/Content.Server/Research/Systems/ResearchSystem.Console.cs +++ b/Content.Server/Research/Systems/ResearchSystem.Console.cs @@ -20,8 +20,7 @@ public sealed partial class ResearchSystem private void OnConsoleUnlock(EntityUid uid, ResearchConsoleComponent component, ConsoleUnlockTechnologyMessage args) { - if (args.Session.AttachedEntity is not { } ent) - return; + var act = args.Actor; if (!this.IsPowered(uid, EntityManager)) return; @@ -29,13 +28,13 @@ public sealed partial class ResearchSystem if (!PrototypeManager.TryIndex(args.Id, out var technologyPrototype)) return; - if (TryComp(uid, out var access) && !_accessReader.IsAllowed(ent, uid, access)) + if (TryComp(uid, out var access) && !_accessReader.IsAllowed(act, uid, access)) { - _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), ent); + _popup.PopupEntity(Loc.GetString("research-console-no-access-popup"), act); return; } - if (!UnlockTechnology(uid, args.Id, ent)) + if (!UnlockTechnology(uid, args.Id, act)) return; var message = Loc.GetString("research-console-unlock-technology-radio-broadcast", @@ -68,7 +67,7 @@ public sealed partial class ResearchSystem state = new ResearchConsoleBoundInterfaceState(default); } - _uiSystem.TrySetUiState(uid, ResearchConsoleUiKey.Key, state); + _uiSystem.SetUiState(uid, ResearchConsoleUiKey.Key, state); } private void OnPointsChanged(EntityUid uid, ResearchConsoleComponent component, ref ResearchServerPointsChangedEvent args) diff --git a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs index 2064abd8eb..6700247522 100644 --- a/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs +++ b/Content.Server/Research/TechnologyDisk/Systems/DiskConsoleSystem.cs @@ -91,7 +91,7 @@ public sealed class DiskConsoleSystem : EntitySystem totalPoints >= component.PricePerDisk; var state = new DiskConsoleBoundUserInterfaceState(totalPoints, component.PricePerDisk, canPrint); - _ui.TrySetUiState(uid, DiskConsoleUiKey.Key, state); + _ui.SetUiState(uid, DiskConsoleUiKey.Key, state); } private void OnShutdown(EntityUid uid, DiskConsolePrintingComponent component, ComponentShutdown args) diff --git a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs index 61636bea7c..d031418476 100644 --- a/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs +++ b/Content.Server/Salvage/SalvageSystem.ExpeditionConsole.cs @@ -56,7 +56,7 @@ public sealed partial class SalvageSystem if (station != component.Owner) continue; - _ui.TrySetUiState(uid, SalvageConsoleUiKey.Expedition, state, ui: uiComp); + _ui.SetUiState((uid, uiComp), SalvageConsoleUiKey.Expedition, state); } } @@ -74,6 +74,6 @@ public sealed partial class SalvageSystem state = new SalvageExpeditionConsoleState(TimeSpan.Zero, false, true, 0, new List()); } - _ui.TrySetUiState(component, SalvageConsoleUiKey.Expedition, state); + _ui.SetUiState(component.Owner, SalvageConsoleUiKey.Expedition, state); } } diff --git a/Content.Server/Salvage/SalvageSystem.Magnet.cs b/Content.Server/Salvage/SalvageSystem.Magnet.cs index e4711a5876..4b7291298b 100644 --- a/Content.Server/Salvage/SalvageSystem.Magnet.cs +++ b/Content.Server/Salvage/SalvageSystem.Magnet.cs @@ -35,11 +35,6 @@ public sealed partial class SalvageSystem private void OnMagnetClaim(EntityUid uid, SalvageMagnetComponent component, ref MagnetClaimOfferEvent args) { - var player = args.Session.AttachedEntity; - - if (player is null) - return; - var station = _station.GetOwningStation(uid); if (!TryComp(station, out SalvageMagnetDataComponent? dataComp) || @@ -177,12 +172,12 @@ public sealed partial class SalvageSystem // Fuck with the seed to mix wrecks and asteroids. seed = (int) (seed / 10f) * 10; - + if (i >= data.Comp.OfferCount / 2) { seed++; } - + data.Comp.Offered.Add(seed); } @@ -216,7 +211,7 @@ public sealed partial class SalvageSystem if (!TryComp(station, out SalvageMagnetDataComponent? dataComp)) return; - _ui.TrySetUiState(entity, SalvageMagnetUiKey.Key, + _ui.SetUiState(entity.Owner, SalvageMagnetUiKey.Key, new SalvageMagnetBoundUserInterfaceState(dataComp.Offered) { Cooldown = dataComp.OfferCooldown, @@ -238,7 +233,7 @@ public sealed partial class SalvageSystem if (station != data.Owner) continue; - _ui.TrySetUiState(magnetUid, SalvageMagnetUiKey.Key, + _ui.SetUiState(magnetUid, SalvageMagnetUiKey.Key, new SalvageMagnetBoundUserInterfaceState(data.Comp.Offered) { Cooldown = data.Comp.OfferCooldown, diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs index 63b4d9daef..b5a954f166 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleComponent.cs @@ -27,7 +27,7 @@ public sealed partial class SensorMonitoringConsoleComponent : Component public TimeSpan RetentionTime = TimeSpan.FromMinutes(1); // UI update tracking stuff. - public HashSet InitialUIStateSent = new(); + public HashSet InitialUIStateSent = new(); public TimeSpan LastUIUpdate; public ValueList RemovedSensors; diff --git a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs index 26c6b17831..dec3e6c36e 100644 --- a/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs +++ b/Content.Server/SensorMonitoring/SensorMonitoringConsoleSystem.UI.cs @@ -18,27 +18,26 @@ public sealed partial class SensorMonitoringConsoleSystem private void UpdateConsoleUI(EntityUid uid, SensorMonitoringConsoleComponent comp) { - if (!_userInterface.TryGetUi(uid, SensorMonitoringConsoleUiKey.Key, out var ui)) - return; - - if (ui.SubscribedSessions.Count == 0) + if (!_userInterface.IsUiOpen(uid, SensorMonitoringConsoleUiKey.Key)) + { return; + } ConsoleUIState? fullState = null; SensorMonitoringIncrementalUpdate? incrementalUpdate = null; - foreach (var session in ui.SubscribedSessions) + foreach (var actorUid in _userInterface.GetActors(uid, SensorMonitoringConsoleUiKey.Key)) { - if (comp.InitialUIStateSent.Contains(session)) + if (comp.InitialUIStateSent.Contains(actorUid)) { incrementalUpdate ??= CalculateIncrementalUpdate(); - _userInterface.TrySendUiMessage(ui, incrementalUpdate, session); + _userInterface.ServerSendUiMessage(uid, SensorMonitoringConsoleUiKey.Key, incrementalUpdate, actorUid); } else { fullState ??= CalculateFullState(); - _userInterface.SetUiState(ui, fullState, session); - comp.InitialUIStateSent.Add(session); + _userInterface.SetUiState(uid, SensorMonitoringConsoleUiKey.Key, fullState); + comp.InitialUIStateSent.Add(actorUid); } } @@ -131,9 +130,6 @@ public sealed partial class SensorMonitoringConsoleSystem if (!args.UiKey.Equals(SensorMonitoringConsoleUiKey.Key)) return; - if (args.Session is not { } player) - return; - - component.InitialUIStateSent.Remove(player); + component.InitialUIStateSent.Remove(args.Actor); } } diff --git a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs index 803aa963f3..d45c04cdc2 100644 --- a/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs +++ b/Content.Server/Shuttles/Systems/EmergencyShuttleSystem.Console.cs @@ -245,19 +245,18 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyRepealAll(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealAllMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) return; + var player = args.Actor; - if (!_reader.FindAccessTags(player.Value).Contains(EmergencyRepealAllAccess)) + if (!_reader.FindAccessTags(player).Contains(EmergencyRepealAllAccess)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium); return; } if (component.AuthorizedEntities.Count == 0) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL ALL by {args.Actor:user}"); _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", component.AuthorizationsRequired))); component.AuthorizedEntities.Clear(); UpdateAllEmergencyConsoles(); @@ -265,13 +264,11 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyRepeal(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleRepealMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) - return; + var player = args.Actor; - if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid)) + if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player.Value, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), player, PopupType.Medium); return; } @@ -279,7 +276,7 @@ public sealed partial class EmergencyShuttleSystem if (!component.AuthorizedEntities.Remove(MetaData(idCard).EntityName)) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch REPEAL by {args.Actor:user}"); var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; _chatSystem.DispatchGlobalAnnouncement(Loc.GetString("emergency-shuttle-console-auth-revoked", ("remaining", remaining))); CheckForLaunch(component); @@ -288,13 +285,11 @@ public sealed partial class EmergencyShuttleSystem private void OnEmergencyAuthorize(EntityUid uid, EmergencyShuttleConsoleComponent component, EmergencyShuttleAuthorizeMessage args) { - var player = args.Session.AttachedEntity; - if (player == null) - return; + var player = args.Actor; - if (!_idSystem.TryFindIdCard(player.Value, out var idCard) || !_reader.IsAllowed(idCard, uid)) + if (!_idSystem.TryFindIdCard(player, out var idCard) || !_reader.IsAllowed(idCard, uid)) { - _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Session, PopupType.Medium); + _popup.PopupCursor(Loc.GetString("emergency-shuttle-console-denied"), args.Actor, PopupType.Medium); return; } @@ -302,7 +297,7 @@ public sealed partial class EmergencyShuttleSystem if (!component.AuthorizedEntities.Add(MetaData(idCard).EntityName)) return; - _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Session:user}"); + _logger.Add(LogType.EmergencyShuttle, LogImpact.High, $"Emergency shuttle early launch AUTH by {args.Actor:user}"); var remaining = component.AuthorizationsRequired - component.AuthorizedEntities.Count; if (remaining > 0) @@ -349,9 +344,10 @@ public sealed partial class EmergencyShuttleSystem auths.Add(auth); } - if (_uiSystem.TryGetUi(uid, EmergencyConsoleUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, EmergencyConsoleUiKey.Key)) _uiSystem.SetUiState( - bui, + uid, + EmergencyConsoleUiKey.Key, new EmergencyConsoleBoundUserInterfaceState() { EarlyLaunchTime = EarlyLaunchAuthorized ? _timing.CurTime + TimeSpan.FromSeconds(_consoleAccumulator) : null, diff --git a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs index b7f08b4b34..1de20a8734 100644 --- a/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/RadarConsoleSystem.cs @@ -39,7 +39,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem angle = Angle.Zero; } - if (_uiSystem.TryGetUi(uid, RadarConsoleUiKey.Key, out var bui)) + if (_uiSystem.HasUi(uid, RadarConsoleUiKey.Key)) { NavInterfaceState state; var docks = _console.GetAllDocks(); @@ -53,7 +53,7 @@ public sealed class RadarConsoleSystem : SharedRadarConsoleSystem state = _console.GetNavState(uid, docks); } - _uiSystem.SetUiState(bui, new NavBoundUserInterfaceState(state)); + _uiSystem.SetUiState(uid, RadarConsoleUiKey.Key, new NavBoundUserInterfaceState(state)); } } } diff --git a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs index a4f2c7b4db..89dc114caf 100644 --- a/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleConsoleSystem.cs @@ -136,13 +136,12 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem /// private void OnConsoleUIClose(EntityUid uid, ShuttleConsoleComponent component, BoundUIClosedEvent args) { - if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key || - args.Session.AttachedEntity is not { } user) + if ((ShuttleConsoleUiKey) args.UiKey != ShuttleConsoleUiKey.Key) { return; } - RemovePilot(user); + RemovePilot(args.Actor); } private void OnConsoleUIOpenAttempt(EntityUid uid, ShuttleConsoleComponent component, @@ -265,9 +264,9 @@ public sealed partial class ShuttleConsoleSystem : SharedShuttleConsoleSystem new List()); } - if (_ui.TryGetUi(consoleUid, ShuttleConsoleUiKey.Key, out var bui)) + if (_ui.HasUi(consoleUid, ShuttleConsoleUiKey.Key)) { - _ui.SetUiState(bui, new ShuttleBoundUserInterfaceState(navState, mapState, dockState)); + _ui.SetUiState(consoleUid, ShuttleConsoleUiKey.Key, new ShuttleBoundUserInterfaceState(navState, mapState, dockState)); } } diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs index bf265da2e6..ce79466b58 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.IFF.cs @@ -57,7 +57,7 @@ public sealed partial class ShuttleSystem !TryComp(uid, out var xform) || !TryComp(xform.GridUid, out var iff)) { - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = component.AllowedFlags, Flags = IFFFlags.None, @@ -65,7 +65,7 @@ public sealed partial class ShuttleSystem } else { - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = component.AllowedFlags, Flags = iff.Flags, @@ -83,7 +83,7 @@ public sealed partial class ShuttleSystem if (xform.GridUid != gridUid) continue; - _uiSystem.TrySetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() + _uiSystem.SetUiState(uid, IFFConsoleUiKey.Key, new IFFConsoleBoundUserInterfaceState() { AllowedFlags = comp.AllowedFlags, Flags = component.Flags, diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs index 3dcdd78aff..d0e9f80e36 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Ui.cs @@ -28,20 +28,19 @@ public sealed partial class BorgSystem private void OnEjectBrainBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBrainBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity || component.BrainEntity is not { } brain) + if (component.BrainEntity is not { } brain) return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(attachedEntity):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}"); + $"{ToPrettyString(args.Actor):player} removed brain {ToPrettyString(brain)} from borg {ToPrettyString(uid)}"); _container.Remove(brain, component.BrainContainer); - _hands.TryPickupAnyHand(attachedEntity, brain); + _hands.TryPickupAnyHand(args.Actor, brain); UpdateUI(uid, component); } private void OnEjectBatteryBuiMessage(EntityUid uid, BorgChassisComponent component, BorgEjectBatteryBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity || - !TryComp(uid, out var slotComp) || + if (!TryComp(uid, out var slotComp) || !Container.TryGetContainer(uid, slotComp.CellSlotId, out var container) || !container.ContainedEntities.Any()) { @@ -49,14 +48,11 @@ public sealed partial class BorgSystem } var ents = Container.EmptyContainer(container); - _hands.TryPickupAnyHand(attachedEntity, ents.First()); + _hands.TryPickupAnyHand(args.Actor, ents.First()); } private void OnSetNameBuiMessage(EntityUid uid, BorgChassisComponent component, BorgSetNameBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - if (args.Name.Length > HumanoidCharacterProfile.MaxNameLength || args.Name.Length == 0 || string.IsNullOrWhiteSpace(args.Name) || @@ -75,24 +71,21 @@ public sealed partial class BorgSystem if (metaData.EntityName.Equals(name, StringComparison.InvariantCulture)) return; - _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(attachedEntity):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}"); + _adminLog.Add(LogType.Action, LogImpact.High, $"{ToPrettyString(args.Actor):player} set borg \"{ToPrettyString(uid)}\"'s name to: {name}"); _metaData.SetEntityName(uid, name, metaData); } private void OnRemoveModuleBuiMessage(EntityUid uid, BorgChassisComponent component, BorgRemoveModuleBuiMessage args) { - if (args.Session.AttachedEntity is not { } attachedEntity) - return; - var module = GetEntity(args.Module); if (!component.ModuleContainer.Contains(module)) return; _adminLog.Add(LogType.Action, LogImpact.Medium, - $"{ToPrettyString(attachedEntity):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}"); + $"{ToPrettyString(args.Actor):player} removed module {ToPrettyString(module)} from borg {ToPrettyString(uid)}"); _container.Remove(module, component.ModuleContainer); - _hands.TryPickupAnyHand(attachedEntity, module); + _hands.TryPickupAnyHand(args.Actor, module); UpdateUI(uid, component); } @@ -111,6 +104,6 @@ public sealed partial class BorgSystem } var state = new BorgBuiState(chargePercent, hasBattery); - _ui.TrySetUiState(uid, BorgUiKey.Key, state); + _ui.SetUiState(uid, BorgUiKey.Key, state); } } diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs index 010682bc0d..cc1532899d 100644 --- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs +++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs @@ -93,10 +93,10 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem private void OnBoundUIOpened(EntityUid uid, SiliconLawBoundComponent component, BoundUIOpenedEvent args) { _entityManager.TryGetComponent(uid, out var intrinsicRadio); - HashSet? radioChannels = intrinsicRadio?.Channels; + var radioChannels = intrinsicRadio?.Channels; var state = new SiliconLawBuiState(GetLaws(uid).Laws, radioChannels); - _userInterface.TrySetUiState(args.Entity, SiliconLawsUiKey.Key, state, args.Session); + _userInterface.SetUiState(args.Entity, SiliconLawsUiKey.Key, state); } private void OnPlayerSpawnComplete(EntityUid uid, SiliconLawBoundComponent component, PlayerSpawnCompleteEvent args) diff --git a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs index 179cadcfbc..dd3f0c0054 100644 --- a/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs +++ b/Content.Server/Solar/EntitySystems/PowerSolarControlConsoleSystem.cs @@ -35,13 +35,13 @@ namespace Content.Server.Solar.EntitySystems _updateTimer -= 1; var state = new SolarControlConsoleBoundInterfaceState(_powerSolarSystem.TargetPanelRotation, _powerSolarSystem.TargetPanelVelocity, _powerSolarSystem.TotalPanelPower, _powerSolarSystem.TowardsSun); var query = EntityQueryEnumerator(); - while (query.MoveNext(out var uid, out var _, out var uiComp)) + while (query.MoveNext(out var uid, out _, out var uiComp)) { - _uiSystem.TrySetUiState(uid, SolarControlConsoleUiKey.Key, state, ui: uiComp); + _uiSystem.SetUiState((uid, uiComp), SolarControlConsoleUiKey.Key, state); } } } - + private void OnUIMessage(EntityUid uid, SolarControlConsoleComponent component, SolarControlConsoleAdjustMessage msg) { if (double.IsFinite(msg.Rotation)) diff --git a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs index 721eff6f2c..a5202285d9 100644 --- a/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs +++ b/Content.Server/StationRecords/Systems/GeneralStationRecordConsoleSystem.cs @@ -57,7 +57,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem if (!TryComp(owningStation, out var stationRecords)) { - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); return; } @@ -66,7 +66,7 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem switch (listing.Count) { case 0: - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, new GeneralStationRecordConsoleState()); return; case 1: console.ActiveKey = listing.Keys.First(); @@ -80,6 +80,6 @@ public sealed class GeneralStationRecordConsoleSystem : EntitySystem _stationRecords.TryGetRecord(key, out var record, stationRecords); GeneralStationRecordConsoleState newState = new(id, record, listing, console.Filter); - _ui.TrySetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); + _ui.SetUiState(uid, GeneralStationRecordConsoleKey.Key, newState); } } diff --git a/Content.Server/Storage/EntitySystems/StorageSystem.cs b/Content.Server/Storage/EntitySystems/StorageSystem.cs index 5d41e0a521..4b5dd7290c 100644 --- a/Content.Server/Storage/EntitySystems/StorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/StorageSystem.cs @@ -7,10 +7,8 @@ using Content.Shared.Lock; using Content.Shared.Storage; using Content.Shared.Storage.Components; using Content.Shared.Storage.EntitySystems; -using Content.Shared.Timing; using Content.Shared.Verbs; using Robust.Server.GameObjects; -using Robust.Shared.Audio.Systems; using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Prototypes; @@ -20,124 +18,21 @@ namespace Content.Server.Storage.EntitySystems; public sealed partial class StorageSystem : SharedStorageSystem { - [Dependency] private readonly IAdminManager _admin = default!; [Dependency] private readonly IPrototypeManager _prototype = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; - [Dependency] private readonly SharedAudioSystem _audio = default!; - [Dependency] private readonly UseDelaySystem _useDelay = default!; public override void Initialize() { base.Initialize(); - SubscribeLocalEvent>(AddUiVerb); - Subs.BuiEvents(StorageComponent.StorageUiKey.Key, subs => - { - subs.Event(OnBoundUIClosed); - }); SubscribeLocalEvent(OnExploded); SubscribeLocalEvent(OnStorageFillMapInit); } - 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); - - // Get the session for the user - if (!TryComp(args.User, out var actor)) - return; - - // Does this player currently have the storage UI open? - var uiOpen = _uiSystem.SessionHasOpenUi(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - - ActivationVerb verb = new() - { - Act = () => - { - if (uiOpen) - { - _uiSystem.TryClose(uid, StorageComponent.StorageUiKey.Key, actor.PlayerSession); - } - else - { - OpenStorageUI(uid, args.User, component, silent); - } - } - }; - if (uiOpen) - { - verb.Text = Loc.GetString("comp-storage-verb-close-storage"); - verb.Icon = new SpriteSpecifier.Texture( - new("/Textures/Interface/VerbIcons/close.svg.192dpi.png")); - } - else - { - verb.Text = Loc.GetString("comp-storage-verb-open-storage"); - verb.Icon = new SpriteSpecifier.Texture( - new("/Textures/Interface/VerbIcons/open.svg.192dpi.png")); - } - args.Verbs.Add(verb); - } - - private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundUIClosedEvent args) - { - if (TryComp(args.Session.AttachedEntity, out var actor) && actor?.PlayerSession != null) - CloseNestedInterfaces(uid, actor.PlayerSession, storageComp); - - // If UI is closed for everyone - if (!_uiSystem.IsUiOpen(uid, args.UiKey)) - { - storageComp.IsUiOpen = false; - UpdateAppearance((uid, storageComp, null)); - - if (storageComp.StorageCloseSound is not null) - Audio.PlayEntity(storageComp.StorageCloseSound, Filter.Pvs(uid, entityManager: EntityManager), uid, true, storageComp.StorageCloseSound.Params); - } - } - private void OnExploded(Entity ent, ref BeforeExplodeEvent args) { args.Contents.AddRange(ent.Comp.Container.ContainedEntities); } - /// - /// Opens the storage UI for an entity - /// - /// The entity to open the UI for - public override void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) - { - if (!Resolve(uid, ref storageComp, false) || !TryComp(entity, out ActorComponent? player)) - return; - - // prevent spamming bag open / honkerton honk sound - silent |= TryComp(uid, out var useDelay) && _useDelay.IsDelayed((uid, useDelay)); - if (!silent) - { - if (!storageComp.IsUiOpen) - _audio.PlayPvs(storageComp.StorageOpenSound, uid); - if (useDelay != null) - _useDelay.TryResetDelay((uid, useDelay)); - } - - Log.Debug($"Storage (UID {uid}) \"used\" by player session (UID {player.PlayerSession.AttachedEntity})."); - - var bui = _uiSystem.GetUiOrNull(uid, StorageComponent.StorageUiKey.Key); - if (bui == null) - return; - _uiSystem.OpenUi(bui, player.PlayerSession); - _uiSystem.SendUiMessage(bui, new StorageModifyWindowMessage()); - } - /// public override void PlayPickupAnimation(EntityUid uid, EntityCoordinates initialCoordinates, EntityCoordinates finalCoordinates, Angle initialRotation, EntityUid? user = null) @@ -145,30 +40,4 @@ public sealed partial class StorageSystem : SharedStorageSystem var filter = Filter.Pvs(uid).RemoveWhereAttachedEntity(e => e == user); RaiseNetworkEvent(new PickupAnimationEvent(GetNetEntity(uid), GetNetCoordinates(initialCoordinates), GetNetCoordinates(finalCoordinates), initialRotation), filter); } - - /// - /// If the user has nested-UIs open (e.g., PDA UI open when pda is in a backpack), close them. - /// - /// - public void CloseNestedInterfaces(EntityUid uid, ICommonSession session, StorageComponent? storageComp = null) - { - if (!Resolve(uid, ref storageComp)) - return; - - // for each containing thing - // if it has a storage comp - // ensure unsubscribe from session - // if it has a ui component - // close ui - foreach (var entity in storageComp.Container.ContainedEntities) - { - if (!TryComp(entity, out UserInterfaceComponent? ui)) - continue; - - foreach (var bui in ui.Interfaces.Values) - { - _uiSystem.TryClose(entity, bui.UiKey, session, ui); - } - } - } } diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 25f64ba4b6..fa363c54c1 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -73,7 +73,7 @@ public sealed partial class StoreSystem if (!Resolve(uid, ref component)) return; - _ui.TryCloseAll(uid, StoreUiKey.Key); + _ui.CloseUi(uid, StoreUiKey.Key); } /// @@ -83,12 +83,13 @@ public sealed partial class StoreSystem /// The store entity itself /// The store component being refreshed. /// - public void UpdateUserInterface(EntityUid? user, EntityUid store, StoreComponent? component = null, PlayerBoundUserInterface? ui = null) + public void UpdateUserInterface(EntityUid? user, EntityUid store, StoreComponent? component = null) { if (!Resolve(store, ref component)) return; - if (ui == null && !_ui.TryGetUi(store, StoreUiKey.Key, out ui)) + // TODO: Why is the state not being set unless this? + if (!_ui.HasUi(store, StoreUiKey.Key)) return; //this is the person who will be passed into logic for all listing filtering. @@ -113,12 +114,12 @@ public sealed partial class StoreSystem // only tell operatives to lock their uplink if it can be locked var showFooter = HasComp(store); var state = new StoreUpdateState(component.LastAvailableListings, allCurrency, showFooter, component.RefundAllowed); - _ui.SetUiState(ui, state); + _ui.SetUiState(store, StoreUiKey.Key, state); } private void OnRequestUpdate(EntityUid uid, StoreComponent component, StoreRequestUpdateInterfaceMessage args) { - UpdateUserInterface(args.Session.AttachedEntity, GetEntity(args.Entity), component); + UpdateUserInterface(args.Actor, GetEntity(args.Entity), component); } private void BeforeActivatableUiOpen(EntityUid uid, StoreComponent component, BeforeActivatableUIOpenEvent args) @@ -139,8 +140,7 @@ public sealed partial class StoreSystem return; } - if (msg.Session.AttachedEntity is not { Valid: true } buyer) - return; + var buyer = msg.Actor; //verify that we can actually buy this listing and it wasn't added if (!ListingHasCategory(listing, component.Categories)) @@ -263,7 +263,7 @@ public sealed partial class StoreSystem $"{ToPrettyString(buyer):player} purchased listing \"{ListingLocalisationHelpers.GetLocalisedNameOrEntityName(listing, _prototypeManager)}\" from {ToPrettyString(uid)}"); listing.PurchaseAmount++; //track how many times something has been purchased - _audio.PlayEntity(component.BuySuccessSound, msg.Session, uid); //cha-ching! + _audio.PlayEntity(component.BuySuccessSound, msg.Actor, uid); //cha-ching! UpdateUserInterface(buyer, uid, component); } @@ -289,8 +289,7 @@ public sealed partial class StoreSystem if (proto.Cash == null || !proto.CanWithdraw) return; - if (msg.Session.AttachedEntity is not { Valid: true } buyer) - return; + var buyer = msg.Actor; FixedPoint2 amountRemaining = msg.Amount; var coordinates = Transform(buyer).Coordinates; @@ -313,7 +312,7 @@ public sealed partial class StoreSystem { // TODO: Remove guardian/holopara - if (args.Session.AttachedEntity is not { Valid: true } buyer) + if (args.Actor is not { Valid: true } buyer) return; if (!IsOnStartingMap(uid, component)) diff --git a/Content.Server/Store/Systems/StoreSystem.cs b/Content.Server/Store/Systems/StoreSystem.cs index 56426e0404..7998c42f53 100644 --- a/Content.Server/Store/Systems/StoreSystem.cs +++ b/Content.Server/Store/Systems/StoreSystem.cs @@ -199,10 +199,9 @@ public sealed partial class StoreSystem : EntitySystem if (component.Balance == new Dictionary() && preset.InitialBalance != null) //if we don't have a value stored, use the preset TryAddCurrency(preset.InitialBalance, uid, component); - var ui = _ui.GetUiOrNull(uid, StoreUiKey.Key); - if (ui != null) + if (_ui.HasUi(uid, StoreUiKey.Key)) { - _ui.SetUiState(ui, new StoreInitializeState(preset.StoreName)); + _ui.SetUiState(uid, StoreUiKey.Key, new StoreInitializeState(preset.StoreName)); } } } diff --git a/Content.Server/Strip/StrippableSystem.cs b/Content.Server/Strip/StrippableSystem.cs index 9447dec417..1dba52a698 100644 --- a/Content.Server/Strip/StrippableSystem.cs +++ b/Content.Server/Strip/StrippableSystem.cs @@ -111,17 +111,15 @@ namespace Content.Server.Strip if (TryComp(user, out var mode) && mode.IsInCombatMode && !openInCombat) return; - if (TryComp(user, out var actor) && HasComp(user)) + if (HasComp(user)) { - if (_userInterfaceSystem.SessionHasOpenUi(strippable, StrippingUiKey.Key, actor.PlayerSession)) - return; - _userInterfaceSystem.TryOpen(strippable, StrippingUiKey.Key, actor.PlayerSession); + _userInterfaceSystem.OpenUi(strippable.Owner, StrippingUiKey.Key, user); } } private void OnStripButtonPressed(Entity strippable, ref StrippingSlotButtonPressed args) { - if (args.Session.AttachedEntity is not { Valid: true } user || + if (args.Actor is not { Valid: true } user || !TryComp(user, out var userHands)) return; @@ -173,7 +171,7 @@ namespace Content.Server.Strip private void OnStripEnsnareMessage(EntityUid uid, EnsnareableComponent component, StrippingEnsnareButtonPressed args) { - if (args.Session.AttachedEntity is not { Valid: true } user) + if (args.Actor is not { Valid: true } user) return; foreach (var entity in component.Container.ContainedEntities) diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs index f258fbe89c..ca0f59cd14 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMonitorSystem.cs @@ -90,7 +90,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem private void OnSubnetRequest(EntityUid uid, SurveillanceCameraMonitorComponent component, SurveillanceCameraMonitorSubnetRequestMessage args) { - if (args.Session.AttachedEntity != null) + if (args.Actor != null) { SetActiveSubnet(uid, args.Subnet, component); } @@ -208,13 +208,9 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem private void OnBoundUiClose(EntityUid uid, SurveillanceCameraMonitorComponent component, BoundUIClosedEvent args) { - if (args.Session.AttachedEntity == null) - { - return; - } - - RemoveViewer(uid, args.Session.AttachedEntity.Value, component); + RemoveViewer(uid, args.Actor, component); } + #endregion private void SendHeartbeat(EntityUid uid, SurveillanceCameraMonitorComponent? monitor = null) @@ -487,6 +483,6 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem } var state = new SurveillanceCameraMonitorUiState(GetNetEntity(monitor.ActiveCamera), monitor.KnownSubnets.Keys.ToHashSet(), monitor.ActiveCameraAddress, monitor.ActiveSubnet, monitor.KnownCameras); - _userInterface.TrySetUiState(uid, SurveillanceCameraMonitorUiKey.Key, state); + _userInterface.SetUiState(uid, SurveillanceCameraMonitorUiKey.Key, state); } } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs index ac41723026..d0c2cd78d3 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraRouterSystem.cs @@ -134,14 +134,14 @@ public sealed class SurveillanceCameraRouterSystem : EntitySystem UpdateSetupInterface(uid, component); } - private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraRouterComponent? camera = null, ActorComponent? actor = null) + private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraRouterComponent? camera = null) { - if (!Resolve(uid, ref camera) || !Resolve(player, ref actor)) - return; - if (!_userInterface.TryGetUi(uid, SurveillanceCameraSetupUiKey.Router, out var bui)) + if (!Resolve(uid, ref camera)) + return; + + if (!_userInterface.TryOpenUi(uid, SurveillanceCameraSetupUiKey.Router, player)) return; - _userInterface.OpenUi(bui, actor.PlayerSession); UpdateSetupInterface(uid, camera); } @@ -154,13 +154,13 @@ public sealed class SurveillanceCameraRouterSystem : EntitySystem if (router.AvailableNetworks.Count == 0 || router.SubnetFrequencyId != null) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Router); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Router); return; } var state = new SurveillanceCameraSetupBoundUiState(router.SubnetName, deviceNet.ReceiveFrequency ?? 0, router.AvailableNetworks, true, router.SubnetFrequencyId != null); - _userInterface.TrySetUiState(uid, SurveillanceCameraSetupUiKey.Router, state); + _userInterface.SetUiState(uid, SurveillanceCameraSetupUiKey.Router, state); } private void SendHeartbeat(EntityUid uid, string origin, string destination, diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs index 410ba9f754..8dd253269d 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraSystem.cs @@ -196,14 +196,14 @@ public sealed class SurveillanceCameraSystem : EntitySystem UpdateSetupInterface(uid, component); } - private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraComponent? camera = null, ActorComponent? actor = null) + private void OpenSetupInterface(EntityUid uid, EntityUid player, SurveillanceCameraComponent? camera = null) { - if (!Resolve(uid, ref camera) || !Resolve(player, ref actor)) - return; - if (!_userInterface.TryGetUi(uid, SurveillanceCameraSetupUiKey.Camera, out var bui)) + if (!Resolve(uid, ref camera)) + return; + + if (!_userInterface.TryOpenUi(uid, SurveillanceCameraSetupUiKey.Camera, player)) return; - _userInterface.OpenUi(bui, actor.PlayerSession); UpdateSetupInterface(uid, camera); } @@ -216,7 +216,7 @@ public sealed class SurveillanceCameraSystem : EntitySystem if (camera.NameSet && camera.NetworkSet) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Camera); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Camera); return; } @@ -228,14 +228,14 @@ public sealed class SurveillanceCameraSystem : EntitySystem } else if (!camera.NetworkSet) { - _userInterface.TryCloseAll(uid, SurveillanceCameraSetupUiKey.Camera); + _userInterface.CloseUi(uid, SurveillanceCameraSetupUiKey.Camera); return; } } var state = new SurveillanceCameraSetupBoundUiState(camera.CameraId, deviceNet.ReceiveFrequency ?? 0, camera.AvailableNetworks, camera.NameSet, camera.NetworkSet); - _userInterface.TrySetUiState(uid, SurveillanceCameraSetupUiKey.Camera, state); + _userInterface.SetUiState(uid, SurveillanceCameraSetupUiKey.Camera, state); } // If the camera deactivates for any reason, it must have all viewers removed, diff --git a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs index 9918565328..133876bd75 100644 --- a/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs +++ b/Content.Server/Thief/Systems/ThiefUndeterminedBackpackSystem.cs @@ -79,6 +79,6 @@ public sealed class ThiefUndeterminedBackpackSystem : EntitySystem data.Add(i, info); } - _ui.TrySetUiState(uid, ThiefBackpackUIKey.Key, new ThiefBackpackBoundUserInterfaceState(data, MaxSelectedSets)); + _ui.SetUiState(uid, ThiefBackpackUIKey.Key, new ThiefBackpackBoundUserInterfaceState(data, MaxSelectedSets)); } } diff --git a/Content.Server/UserInterface/IntrinsicUIComponent.cs b/Content.Server/UserInterface/IntrinsicUIComponent.cs index 4d3c7ffba9..83936edc8c 100644 --- a/Content.Server/UserInterface/IntrinsicUIComponent.cs +++ b/Content.Server/UserInterface/IntrinsicUIComponent.cs @@ -9,18 +9,12 @@ public sealed partial class IntrinsicUIComponent : Component /// /// List of UIs and their actions that this entity has. /// - [DataField("uis", required: true)] public List UIs = new(); + [DataField("uis", required: true)] public Dictionary UIs = new(); } [DataDefinition] -public partial class IntrinsicUIEntry +public sealed partial class IntrinsicUIEntry { - /// - /// The BUI key that this intrinsic UI should open. - /// - [DataField("key", required: true)] - public Enum? Key { get; private set; } - [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] public string? ToggleAction; diff --git a/Content.Server/UserInterface/IntrinsicUISystem.cs b/Content.Server/UserInterface/IntrinsicUISystem.cs index fa725e524a..0f7261865d 100644 --- a/Content.Server/UserInterface/IntrinsicUISystem.cs +++ b/Content.Server/UserInterface/IntrinsicUISystem.cs @@ -18,50 +18,31 @@ public sealed class IntrinsicUISystem : EntitySystem private void OnActionToggle(EntityUid uid, IntrinsicUIComponent component, ToggleIntrinsicUIEvent args) { + if (args.Key == null) + return; + args.Handled = InteractUI(uid, args.Key, component); } private void InitActions(EntityUid uid, IntrinsicUIComponent component, MapInitEvent args) { - foreach (var entry in component.UIs) + foreach (var entry in component.UIs.Values) { _actionsSystem.AddAction(uid, ref entry.ToggleActionEntity, entry.ToggleAction); } } - public bool InteractUI(EntityUid uid, Enum? key, IntrinsicUIComponent? iui = null, ActorComponent? actor = null) + public bool InteractUI(EntityUid uid, Enum key, IntrinsicUIComponent? iui = null, ActorComponent? actor = null) { if (!Resolve(uid, ref iui, ref actor)) return false; - if (key is null) - { - Log.Error($"Entity {ToPrettyString(uid)} has an invalid intrinsic UI."); - } - - var ui = GetUIOrNull(uid, key, iui); - - if (ui is null) - { - Log.Error($"Couldn't get UI {key} on {ToPrettyString(uid)}"); - return false; - } - var attempt = new IntrinsicUIOpenAttemptEvent(uid, key); RaiseLocalEvent(uid, attempt); if (attempt.Cancelled) return false; - _uiSystem.ToggleUi(ui, actor.PlayerSession); - return true; - } - - private PlayerBoundUserInterface? GetUIOrNull(EntityUid uid, Enum? key, IntrinsicUIComponent? component = null) - { - if (!Resolve(uid, ref component)) - return null; - - return key is null ? null : _uiSystem.GetUiOrNull(uid, key); + return _uiSystem.TryToggleUi(uid, key, actor.PlayerSession); } } diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index 7c9aed188f..723b9de626 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -115,7 +115,7 @@ namespace Content.Server.VendingMachines { var state = new VendingMachineInterfaceState(GetAllInventory(uid, component)); - _userInterfaceSystem.TrySetUiState(uid, VendingMachineUiKey.Key, state); + _userInterfaceSystem.SetUiState(uid, VendingMachineUiKey.Key, state); } private void OnInventoryEjectMessage(EntityUid uid, VendingMachineComponent component, VendingMachineEjectMessage args) @@ -123,7 +123,7 @@ namespace Content.Server.VendingMachines if (!this.IsPowered(uid, EntityManager)) return; - if (args.Session.AttachedEntity is not { Valid: true } entity || Deleted(entity)) + if (args.Actor is not { Valid: true } entity || Deleted(entity)) return; AuthorizedVend(uid, entity, args.Type, args.ID, component); diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.cs b/Content.Server/VoiceMask/VoiceMaskSystem.cs index ad9020d324..df972b9a14 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.cs @@ -41,17 +41,14 @@ public sealed partial class VoiceMaskSystem : EntitySystem { if (message.Name.Length > HumanoidCharacterProfile.MaxNameLength || message.Name.Length <= 0) { - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Session, PopupType.SmallCaution); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-failure"), uid, message.Actor, PopupType.SmallCaution); return; } component.VoiceName = message.Name; - if (message.Session.AttachedEntity != null) - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(message.Session.AttachedEntity.Value):player} set voice of {ToPrettyString(uid):mask}: {component.VoiceName}"); - else - _adminLogger.Add(LogType.Action, LogImpact.Medium, $"Voice of {ToPrettyString(uid):mask} set: {component.VoiceName}"); + _adminLogger.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(message.Actor):player} set voice of {ToPrettyString(uid):mask}: {component.VoiceName}"); - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), uid, message.Actor); TrySetLastKnownName(uid, message.Name); @@ -66,7 +63,7 @@ public sealed partial class VoiceMaskSystem : EntitySystem ent.Comp.SpeechVerb = msg.Verb; // verb is only important to metagamers so no need to log as opposed to name - _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, msg.Session); + _popupSystem.PopupEntity(Loc.GetString("voice-mask-popup-success"), ent, msg.Actor); TrySetLastSpeechVerb(ent, msg.Verb); @@ -94,14 +91,12 @@ public sealed partial class VoiceMaskSystem : EntitySystem ent.Comp.Enabled = !args.IsToggled; } - private void OpenUI(EntityUid player, ActorComponent? actor = null) + private void OpenUI(EntityUid player) { - if (!Resolve(player, ref actor)) - return; - if (!_uiSystem.TryGetUi(player, VoiceMaskUIKey.Key, out var bui)) + if (!_uiSystem.HasUi(player, VoiceMaskUIKey.Key)) return; - _uiSystem.OpenUi(bui, actor.PlayerSession); + _uiSystem.OpenUi(player, VoiceMaskUIKey.Key, player); UpdateUI(player); } @@ -112,7 +107,7 @@ public sealed partial class VoiceMaskSystem : EntitySystem return; } - if (_uiSystem.TryGetUi(owner, VoiceMaskUIKey.Key, out var bui)) - _uiSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName, component.SpeechVerb)); + if (_uiSystem.HasUi(owner, VoiceMaskUIKey.Key)) + _uiSystem.SetUiState(owner, VoiceMaskUIKey.Key, new VoiceMaskBuiState(component.VoiceName, component.SpeechVerb)); } } diff --git a/Content.Server/Wires/WiresSystem.cs b/Content.Server/Wires/WiresSystem.cs index a2deb11fe7..5d31a4d144 100644 --- a/Content.Server/Wires/WiresSystem.cs +++ b/Content.Server/Wires/WiresSystem.cs @@ -17,6 +17,7 @@ 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; @@ -393,11 +394,11 @@ public sealed class WiresSystem : SharedWiresSystem private void OnWiresActionMessage(EntityUid uid, WiresComponent component, WiresActionMessage args) { - if (args.Session.AttachedEntity == null) + if (args.Actor == null) { return; } - var player = (EntityUid) args.Session.AttachedEntity; + var player = (EntityUid) args.Actor; if (!EntityManager.TryGetComponent(player, out HandsComponent? handsComponent)) { @@ -458,7 +459,7 @@ public sealed class WiresSystem : SharedWiresSystem { if (TryComp(args.User, out ActorComponent? actor)) { - _uiSystem.TryOpen(uid, WiresUiKey.Key, actor.PlayerSession); + _uiSystem.OpenUi(uid, WiresUiKey.Key, actor.PlayerSession); args.Handled = true; } } @@ -468,7 +469,8 @@ public sealed class WiresSystem : SharedWiresSystem { if (args.Open) return; - _uiSystem.TryCloseAll(ent, WiresUiKey.Key); + + _uiSystem.CloseUi(ent.Owner, WiresUiKey.Key); } private void OnAttemptOpenActivatableUI(EntityUid uid, ActivatableUIRequiresPanelComponent component, ActivatableUIOpenAttemptEvent args) @@ -574,18 +576,17 @@ public sealed class WiresSystem : SharedWiresSystem statuses.Sort((a, b) => a.position.CompareTo(b.position)); - _uiSystem.TrySetUiState(uid, WiresUiKey.Key, new WiresBoundUserInterfaceState( + _uiSystem.SetUiState((uid, ui), WiresUiKey.Key, new WiresBoundUserInterfaceState( clientList.ToArray(), statuses.Select(p => new StatusEntry(p.key, p.value)).ToArray(), Loc.GetString(wires.BoardName), wires.SerialNumber, - wires.WireSeed), ui: ui); + wires.WireSeed)); } public void OpenUserInterface(EntityUid uid, ICommonSession player) { - if (_uiSystem.TryGetUi(uid, WiresUiKey.Key, out var ui)) - _uiSystem.OpenUi(ui, player); + _uiSystem.OpenUi(uid, WiresUiKey.Key, player); } /// @@ -629,7 +630,7 @@ public sealed class WiresSystem : SharedWiresSystem if (!args.WiresAccessible) { - _uiSystem.TryCloseAll(uid, WiresUiKey.Key); + _uiSystem.CloseUi(uid, WiresUiKey.Key); } } diff --git a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs index 2e546dd200..59ca913a39 100644 --- a/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs +++ b/Content.Server/Xenoarchaeology/Equipment/Systems/ArtifactAnalyzerSystem.cs @@ -223,8 +223,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem var state = new AnalysisConsoleUpdateState(GetNetEntity(artifact), analyzerConnected, serverConnected, canScan, canPrint, msg, scanning, paused, active?.StartTime, active?.AccumulatedRunTime, totalTime, points, biasDirection == BiasDirection.Down); - var bui = _ui.GetUi(uid, ArtifactAnalzyerUiKey.Key); - _ui.SetUiState(bui, state); + _ui.SetUiState(uid, ArtifactAnalzyerUiKey.Key, state); } /// @@ -235,7 +234,7 @@ public sealed class ArtifactAnalyzerSystem : EntitySystem /// private void OnServerSelectionMessage(EntityUid uid, AnalysisConsoleComponent component, AnalysisConsoleServerSelectionMessage args) { - _ui.TryOpen(uid, ResearchClientUiKey.Key, args.Session); + _ui.OpenUi(uid, ResearchClientUiKey.Key, args.Actor); } /// diff --git a/Content.Shared/Access/SharedAgentIDCardSystem.cs b/Content.Shared/Access/SharedAgentIDCardSystem.cs index ef6690cc35..d027a3937f 100644 --- a/Content.Shared/Access/SharedAgentIDCardSystem.cs +++ b/Content.Shared/Access/SharedAgentIDCardSystem.cs @@ -26,12 +26,14 @@ namespace Content.Shared.Access.Systems public readonly HashSet Icons; public string CurrentName { get; } public string CurrentJob { get; } + public string CurrentJobIconId { get; } - public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, HashSet icons) + public AgentIDCardBoundUserInterfaceState(string currentName, string currentJob, string currentJobIconId, HashSet icons) { Icons = icons; CurrentName = currentName; CurrentJob = currentJob; + CurrentJobIconId = currentJobIconId; } } @@ -60,11 +62,11 @@ namespace Content.Shared.Access.Systems [Serializable, NetSerializable] public sealed class AgentIDCardJobIconChangedMessage : BoundUserInterfaceMessage { - public string JobIcon { get; } + public string JobIconId { get; } - public AgentIDCardJobIconChangedMessage(string jobIcon) + public AgentIDCardJobIconChangedMessage(string jobIconId) { - JobIcon = jobIcon; + JobIconId = jobIconId; } } } diff --git a/Content.Shared/Access/Systems/SharedIdCardSystem.cs b/Content.Shared/Access/Systems/SharedIdCardSystem.cs index 842e7e7e6a..11a61c7bf3 100644 --- a/Content.Shared/Access/Systems/SharedIdCardSystem.cs +++ b/Content.Shared/Access/Systems/SharedIdCardSystem.cs @@ -1,13 +1,32 @@ using Content.Shared.Access.Components; +using Content.Shared.Administration.Logs; +using Content.Shared.Database; using Content.Shared.Hands.Components; using Content.Shared.Inventory; using Content.Shared.PDA; +using Content.Shared.Roles; +using Content.Shared.StatusIcon; +using Robust.Shared.Prototypes; namespace Content.Shared.Access.Systems; public abstract class SharedIdCardSystem : EntitySystem { + [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; [Dependency] private readonly InventorySystem _inventorySystem = default!; + [Dependency] private readonly MetaDataSystem _metaSystem = default!; + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMapInit); + } + + private void OnMapInit(EntityUid uid, IdCardComponent id, MapInitEvent args) + { + UpdateEntityName(uid, id); + } /// /// Attempt to find an ID card on an entity. This will look in the entity itself, in the entity's hands, and @@ -56,4 +75,143 @@ public abstract class SharedIdCardSystem : EntitySystem idCard = default; return false; } + + /// + /// Attempts to change the job title of a card. + /// Returns true/false. + /// + /// + /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. + /// + public bool TryChangeJobTitle(EntityUid uid, string? jobTitle, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + return false; + + if (!string.IsNullOrWhiteSpace(jobTitle)) + { + jobTitle = jobTitle.Trim(); + + if (jobTitle.Length > IdCardConsoleComponent.MaxJobTitleLength) + jobTitle = jobTitle[..IdCardConsoleComponent.MaxJobTitleLength]; + } + else + { + jobTitle = null; + } + + if (id.JobTitle == jobTitle) + return true; + id.JobTitle = jobTitle; + Dirty(uid, id); + UpdateEntityName(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the job title of {ToPrettyString(uid):entity} to {jobTitle} "); + } + return true; + } + + public bool TryChangeJobIcon(EntityUid uid, StatusIconPrototype jobIcon, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + { + return false; + } + + if (id.JobIcon == jobIcon.ID) + { + return true; + } + + id.JobIcon = jobIcon.ID; + Dirty(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the job icon of {ToPrettyString(uid):entity} to {jobIcon} "); + } + + return true; + } + + public bool TryChangeJobDepartment(EntityUid uid, JobPrototype job, IdCardComponent? id = null) + { + if (!Resolve(uid, ref id)) + return false; + + id.JobDepartments.Clear(); + foreach (var department in _prototypeManager.EnumeratePrototypes()) + { + if (department.Roles.Contains(job.ID)) + id.JobDepartments.Add("department-" + department.ID); + } + + Dirty(uid, id); + + return true; + } + + /// + /// Attempts to change the full name of a card. + /// Returns true/false. + /// + /// + /// If provided with a player's EntityUid to the player parameter, adds the change to the admin logs. + /// + public bool TryChangeFullName(EntityUid uid, string? fullName, IdCardComponent? id = null, EntityUid? player = null) + { + if (!Resolve(uid, ref id)) + return false; + + if (!string.IsNullOrWhiteSpace(fullName)) + { + fullName = fullName.Trim(); + if (fullName.Length > IdCardConsoleComponent.MaxFullNameLength) + fullName = fullName[..IdCardConsoleComponent.MaxFullNameLength]; + } + else + { + fullName = null; + } + + if (id.FullName == fullName) + return true; + id.FullName = fullName; + Dirty(uid, id); + UpdateEntityName(uid, id); + + if (player != null) + { + _adminLogger.Add(LogType.Identity, LogImpact.Low, + $"{ToPrettyString(player.Value):player} has changed the name of {ToPrettyString(uid):entity} to {fullName} "); + } + return true; + } + + /// + /// Changes the name of the id's owner. + /// + /// + /// If either or is empty, it's replaced by placeholders. + /// If both are empty, the original entity's name is restored. + /// + private void UpdateEntityName(EntityUid uid, IdCardComponent? id = null) + { + if (!Resolve(uid, ref id)) + return; + + var jobSuffix = string.IsNullOrWhiteSpace(id.JobTitle) ? string.Empty : $" ({id.JobTitle})"; + + var val = string.IsNullOrWhiteSpace(id.FullName) + ? Loc.GetString("access-id-card-component-owner-name-job-title-text", + ("jobSuffix", jobSuffix)) + : Loc.GetString("access-id-card-component-owner-full-name-job-title-text", + ("fullName", id.FullName), + ("jobSuffix", jobSuffix)); + _metaSystem.SetEntityName(uid, val); + } } diff --git a/Content.Shared/Administration/Components/SharedHeadstandComponent.cs b/Content.Shared/Administration/Components/SharedHeadstandComponent.cs index ebc23c7b05..96a4dfc2dd 100644 --- a/Content.Shared/Administration/Components/SharedHeadstandComponent.cs +++ b/Content.Shared/Administration/Components/SharedHeadstandComponent.cs @@ -1,6 +1,9 @@ -namespace Content.Shared.Administration.Components; +using Robust.Shared.GameStates; + +namespace Content.Shared.Administration.Components; /// /// Flips the target's sprite on it's head, so they do a headstand. /// +[NetworkedComponent] public abstract partial class SharedHeadstandComponent : Component { } diff --git a/Content.Shared/Administration/Components/SharedKillSignComponent.cs b/Content.Shared/Administration/Components/SharedKillSignComponent.cs index 2e6d54ca88..9a95454f72 100644 --- a/Content.Shared/Administration/Components/SharedKillSignComponent.cs +++ b/Content.Shared/Administration/Components/SharedKillSignComponent.cs @@ -1,5 +1,8 @@ -namespace Content.Shared.Administration.Components; +using Robust.Shared.GameStates; +namespace Content.Shared.Administration.Components; + +[NetworkedComponent] public abstract partial class SharedKillSignComponent : Component { diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index ef7cdf7b61..1aa4edbe7c 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -177,7 +177,7 @@ namespace Content.Shared.CCVar /// Controls the maximum number of character slots a player is allowed to have. /// public static readonly CVarDef - GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 10, CVar.ARCHIVE | CVar.SERVERONLY); + GameMaxCharacterSlots = CVarDef.Create("game.maxcharacterslots", 30, CVar.ARCHIVE | CVar.SERVERONLY); /// /// Controls the game map prototype to load. SS14 stores these prototypes in Prototypes/Maps. diff --git a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs index 34a64d0edb..3bea79d345 100644 --- a/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs +++ b/Content.Shared/Chemistry/EntitySystems/SolutionTransferSystem.cs @@ -42,7 +42,7 @@ public sealed class SolutionTransferSystem : EntitySystem var newTransferAmount = FixedPoint2.Clamp(message.Value, ent.Comp.MinimumTransferAmount, ent.Comp.MaximumTransferAmount); ent.Comp.TransferAmount = newTransferAmount; - if (message.Session.AttachedEntity is { Valid: true } user) + if (message.Actor is { Valid: true } user) _popup.PopupClient(Loc.GetString("comp-solution-transfer-set-amount", ("amount", newTransferAmount)), ent, user); } @@ -53,10 +53,9 @@ public sealed class SolutionTransferSystem : EntitySystem if (!args.CanAccess || !args.CanInteract || !comp.CanChangeTransferAmount || args.Hands == null) return; - if (!TryComp(args.User, out var actor)) - return; - // Custom transfer verb + var @event = args; + args.Verbs.Add(new AlternativeVerb() { Text = Loc.GetString("comp-solution-transfer-verb-custom-amount"), @@ -64,8 +63,7 @@ public sealed class SolutionTransferSystem : EntitySystem // TODO: remove server check when bui prediction is a thing Act = () => { - if (_net.IsServer) - _ui.TryOpen(uid, TransferAmountUiKey.Key, actor.PlayerSession); + _ui.OpenUi(uid, TransferAmountUiKey.Key, @event.User); }, Priority = 1 }); diff --git a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs index 83e09b1a6d..914b34d3c1 100644 --- a/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs +++ b/Content.Shared/Containers/ItemSlot/ItemSlotsSystem.cs @@ -626,9 +626,9 @@ namespace Content.Shared.Containers.ItemSlots return; if (args.TryEject && slot.HasItem) - TryEjectToHands(uid, slot, args.Session.AttachedEntity, false); - else if (args.TryInsert && !slot.HasItem && args.Session.AttachedEntity is EntityUid user) - TryInsertFromHand(uid, slot, user); + TryEjectToHands(uid, slot, args.Actor, true); + else if (args.TryInsert && !slot.HasItem) + TryInsertFromHand(uid, slot, args.Actor); } #endregion diff --git a/Content.Shared/Content.Shared.csproj b/Content.Shared/Content.Shared.csproj index 4cca399b28..51a80dfd21 100644 --- a/Content.Shared/Content.Shared.csproj +++ b/Content.Shared/Content.Shared.csproj @@ -23,6 +23,9 @@ false + + + diff --git a/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs b/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs index 4aa9db199d..53928f83a9 100644 --- a/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs +++ b/Content.Shared/DeviceNetwork/Systems/SharedNetworkConfiguratorSystem.cs @@ -1,10 +1,23 @@ using Content.Shared.Actions; +using Content.Shared.DeviceNetwork.Components; +using Content.Shared.UserInterface; using Robust.Shared.Serialization; namespace Content.Shared.DeviceNetwork.Systems; public abstract class SharedNetworkConfiguratorSystem : EntitySystem { + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnUiOpenAttempt); + } + + private void OnUiOpenAttempt(EntityUid uid, NetworkConfiguratorComponent configurator, ActivatableUIOpenAttemptEvent args) + { + if (configurator.LinkModeActive) + args.Cancel(); + } } public sealed partial class ClearAllOverlaysEvent : InstantActionEvent diff --git a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs b/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs index 53d58f1d80..dbb1f6f2c4 100644 --- a/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs +++ b/Content.Shared/Extinguisher/SharedFireExtinguisherComponent.cs @@ -1,8 +1,10 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Extinguisher; +[NetworkedComponent] public abstract partial class SharedFireExtinguisherComponent : Component { [DataField("refillSound")] public SoundSpecifier RefillSound = new SoundPathSpecifier("/Audio/Effects/refill.ogg"); diff --git a/Content.Shared/Ghost/Roles/GhostRolePrototype.cs b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs new file mode 100644 index 0000000000..43d6432250 --- /dev/null +++ b/Content.Shared/Ghost/Roles/GhostRolePrototype.cs @@ -0,0 +1,38 @@ +using Robust.Shared.Prototypes; + +namespace Content.Shared.Ghost.Roles; + +/// +/// For selectable ghostrole prototypes in ghostrole spawners. +/// +[Prototype] +public sealed partial class GhostRolePrototype : IPrototype +{ + [ViewVariables] + [IdDataField] + public string ID { get; private set; } = default!; + + /// + /// The name of the ghostrole. + /// + [DataField] + public string Name { get; set; } = default!; + + /// + /// The description of the ghostrole. + /// + [DataField] + public string Description { get; set; } = default!; + + /// + /// The entity prototype of the ghostrole + /// + [DataField] + public string EntityPrototype = default!; + + /// + /// Rules of the ghostrole + /// + [DataField] + public string Rules = default!; +} \ No newline at end of file diff --git a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs index 44fcef9c4f..fbbf4ecf72 100644 --- a/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs +++ b/Content.Shared/Humanoid/HumanoidCharacterAppearance.cs @@ -104,7 +104,8 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance HumanoidSkinColor.HumanToned => Humanoid.SkinColor.HumanSkinTone(speciesPrototype.DefaultHumanSkinTone), HumanoidSkinColor.Hues => speciesPrototype.DefaultSkinTone, HumanoidSkinColor.TintedHues => Humanoid.SkinColor.TintedHues(speciesPrototype.DefaultSkinTone), - _ => Humanoid.SkinColor.ValidHumanSkinTone + HumanoidSkinColor.VoxFeathers => Humanoid.SkinColor.ClosestVoxColor(speciesPrototype.DefaultSkinTone), + _ => Humanoid.SkinColor.ValidHumanSkinTone, }; return new( @@ -166,6 +167,9 @@ public sealed partial class HumanoidCharacterAppearance : ICharacterAppearance case HumanoidSkinColor.TintedHues: newSkinColor = Humanoid.SkinColor.ValidTintedHuesSkinTone(newSkinColor); break; + case HumanoidSkinColor.VoxFeathers: + newSkinColor = Humanoid.SkinColor.ProportionalVoxColor(newSkinColor); + break; } return new HumanoidCharacterAppearance(newHairStyle, newHairColor, newFacialHairStyle, newHairColor, newEyeColor, newSkinColor, new ()); diff --git a/Content.Shared/Humanoid/SkinColor.cs b/Content.Shared/Humanoid/SkinColor.cs index 960f910a32..2dc95fcf07 100644 --- a/Content.Shared/Humanoid/SkinColor.cs +++ b/Content.Shared/Humanoid/SkinColor.cs @@ -1,3 +1,6 @@ +using System.Security.Cryptography; +using Microsoft.VisualBasic.CompilerServices; + namespace Content.Shared.Humanoid; public static class SkinColor @@ -7,6 +10,13 @@ public static class SkinColor public const float MinHuesLightness = 0.175f; + public const float MinFeathersHue = 29f / 360; + public const float MaxFeathersHue = 174f / 360; + public const float MinFeathersSaturation = 20f / 100; + public const float MaxFeathersSaturation = 88f / 100; + public const float MinFeathersValue = 36f / 100; + public const float MaxFeathersValue = 55f / 100; + public static Color ValidHumanSkinTone => Color.FromHsv(new Vector4(0.07f, 0.2f, 1f, 1f)); /// @@ -140,11 +150,65 @@ public static class SkinColor return Color.ToHsl(color).Y <= MaxTintedHuesSaturation && Color.ToHsl(color).Z >= MinTintedHuesLightness; } + /// + /// Converts a Color proportionally to the allowed vox color range. + /// Will NOT preserve the specific input color even if it is within the allowed vox color range. + /// + /// Color to convert + /// Vox feather coloration + public static Color ProportionalVoxColor(Color color) + { + var newColor = Color.ToHsv(color); + + newColor.X = newColor.X * (MaxFeathersHue - MinFeathersHue) + MinFeathersHue; + newColor.Y = newColor.Y * (MaxFeathersSaturation - MinFeathersSaturation) + MinFeathersSaturation; + newColor.Z = newColor.Z * (MaxFeathersValue - MinFeathersValue) + MinFeathersValue; + + return Color.FromHsv(newColor); + } + + // /// + // /// Ensures the input Color is within the allowed vox color range. + // /// + // /// Color to convert + // /// The same Color if it was within the allowed range, or the closest matching Color otherwise + public static Color ClosestVoxColor(Color color) + { + var hsv = Color.ToHsv(color); + + hsv.X = Math.Clamp(hsv.X, MinFeathersHue, MaxFeathersHue); + hsv.Y = Math.Clamp(hsv.Y, MinFeathersSaturation, MaxFeathersSaturation); + hsv.Z = Math.Clamp(hsv.Z, MinFeathersValue, MaxFeathersValue); + + return Color.FromHsv(hsv); + } + + /// + /// Verify if this color is a valid vox feather coloration, or not. + /// + /// The color to verify + /// True if valid, false otherwise + public static bool VerifyVoxFeathers(Color color) + { + var colorHsv = Color.ToHsv(color); + + if (colorHsv.X < MinFeathersHue || colorHsv.X > MaxFeathersHue) + return false; + + if (colorHsv.Y < MinFeathersSaturation || colorHsv.Y > MaxFeathersSaturation) + return false; + + if (colorHsv.Z < MinFeathersValue || colorHsv.Z > MaxFeathersValue) + return false; + + return true; + } + /// /// This takes in a color, and returns a color guaranteed to be above MinHuesLightness /// /// - /// Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness + /// Either the color as-is if it's above MinHuesLightness, or the color with luminosity increased above MinHuesLightness public static Color MakeHueValid(Color color) { var manipulatedColor = Color.ToHsv(color); @@ -169,6 +233,7 @@ public static class SkinColor HumanoidSkinColor.HumanToned => VerifyHumanSkinTone(color), HumanoidSkinColor.TintedHues => VerifyTintedHues(color), HumanoidSkinColor.Hues => VerifyHues(color), + HumanoidSkinColor.VoxFeathers => VerifyVoxFeathers(color), _ => false, }; } @@ -180,6 +245,7 @@ public static class SkinColor HumanoidSkinColor.HumanToned => ValidHumanSkinTone, HumanoidSkinColor.TintedHues => ValidTintedHuesSkinTone(color), HumanoidSkinColor.Hues => MakeHueValid(color), + HumanoidSkinColor.VoxFeathers => ClosestVoxColor(color), _ => color }; } @@ -189,5 +255,6 @@ public enum HumanoidSkinColor : byte { HumanToned, Hues, + VoxFeathers, // Vox feathers are limited to a specific color range TintedHues, //This gives a color tint to a humanoid's skin (10% saturation with full hue range). } diff --git a/Content.Shared/Input/ContentKeyFunctions.cs b/Content.Shared/Input/ContentKeyFunctions.cs index cf874434ec..886a0d5d3a 100644 --- a/Content.Shared/Input/ContentKeyFunctions.cs +++ b/Content.Shared/Input/ContentKeyFunctions.cs @@ -42,6 +42,7 @@ namespace Content.Shared.Input public static readonly BoundKeyFunction MovePulledObject = "MovePulledObject"; public static readonly BoundKeyFunction ReleasePulledObject = "ReleasePulledObject"; public static readonly BoundKeyFunction MouseMiddle = "MouseMiddle"; + public static readonly BoundKeyFunction ToggleRoundEndSummaryWindow = "ToggleRoundEndSummaryWindow"; public static readonly BoundKeyFunction OpenEntitySpawnWindow = "OpenEntitySpawnWindow"; public static readonly BoundKeyFunction OpenSandboxWindow = "OpenSandboxWindow"; public static readonly BoundKeyFunction OpenTileSpawnWindow = "OpenTileSpawnWindow"; diff --git a/Content.Shared/Interaction/SharedInteractionSystem.cs b/Content.Shared/Interaction/SharedInteractionSystem.cs index 8d49ce31f0..1f421d0e6f 100644 --- a/Content.Shared/Interaction/SharedInteractionSystem.cs +++ b/Content.Shared/Interaction/SharedInteractionSystem.cs @@ -76,8 +76,11 @@ namespace Content.Shared.Interaction public override void Initialize() { + SubscribeLocalEvent(HandleUserInterfaceRangeCheck); SubscribeLocalEvent(OnBoundInterfaceInteractAttempt); + SubscribeAllEvent(HandleInteractInventorySlotEvent); + SubscribeLocalEvent(OnRemoveAttempt); SubscribeLocalEvent(OnUnequip); SubscribeLocalEvent(OnUnequipHand); @@ -108,7 +111,9 @@ namespace Content.Shared.Interaction /// private void OnBoundInterfaceInteractAttempt(BoundUserInterfaceMessageAttempt ev) { - if (ev.Sender.AttachedEntity is not { } user || !_actionBlockerSystem.CanInteract(user, ev.Target)) + var user = ev.Actor; + + if (!_actionBlockerSystem.CanInteract(user, ev.Target)) { ev.Cancel(); return; @@ -973,8 +978,8 @@ namespace Content.Shared.Interaction return false; DoContactInteraction(user, used, activateMsg); - if (delayComponent != null) - _useDelay.TryResetDelay((used, delayComponent)); + // Still need to call this even without checkUseDelay in case this gets relayed from Activate. + _useDelay.TryResetDelay(used, component: delayComponent); if (!activateMsg.WasLogged) _adminLogger.Add(LogType.InteractActivate, LogImpact.Low, $"{ToPrettyString(user):user} activated {ToPrettyString(used):used}"); return true; @@ -1145,6 +1150,21 @@ namespace Content.Shared.Interaction RaiseLocalEvent(uidA, new ContactInteractionEvent(uidB.Value)); 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; + } + } } /// diff --git a/Content.Shared/Inventory/InventoryComponent.cs b/Content.Shared/Inventory/InventoryComponent.cs index 2a8710f0f2..dde48a62aa 100644 --- a/Content.Shared/Inventory/InventoryComponent.cs +++ b/Content.Shared/Inventory/InventoryComponent.cs @@ -13,6 +13,16 @@ public sealed partial class InventoryComponent : Component [DataField("speciesId")] public string? SpeciesId { get; set; } + [DataField] public string JumpsuitShader = "StencilDraw"; + [DataField] public Dictionary Displacements = []; + public SlotDefinition[] Slots = Array.Empty(); public ContainerSlot[] Containers = Array.Empty(); + + [DataDefinition] + public sealed partial class SlotDisplacementData + { + [DataField(required: true)] + public PrototypeLayerData Layer = default!; + } } diff --git a/Content.Server/MagicMirror/MagicMirrorComponent.cs b/Content.Shared/MagicMirror/MagicMirrorComponent.cs similarity index 89% rename from Content.Server/MagicMirror/MagicMirrorComponent.cs rename to Content.Shared/MagicMirror/MagicMirrorComponent.cs index 624a381ca5..6357543905 100644 --- a/Content.Server/MagicMirror/MagicMirrorComponent.cs +++ b/Content.Shared/MagicMirror/MagicMirrorComponent.cs @@ -1,13 +1,13 @@ using Content.Shared.DoAfter; -using Content.Shared.Humanoid; using Robust.Shared.Audio; +using Robust.Shared.GameStates; -namespace Content.Server.MagicMirror; +namespace Content.Shared.MagicMirror; /// /// Allows humanoids to change their appearance mid-round. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class MagicMirrorComponent : Component { [DataField] @@ -16,7 +16,7 @@ public sealed partial class MagicMirrorComponent : Component /// /// Magic mirror target, used for validating UI messages. /// - [DataField] + [DataField, AutoNetworkedField] public EntityUid? Target; /// diff --git a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs index 0b22e02498..f9c941ffe3 100644 --- a/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs +++ b/Content.Shared/MagicMirror/SharedMagicMirrorSystem.cs @@ -1,10 +1,29 @@ using Content.Shared.DoAfter; using Content.Shared.Humanoid.Markings; -using Robust.Shared.Player; +using Content.Shared.Interaction; using Robust.Shared.Serialization; namespace Content.Shared.MagicMirror; +public abstract class SharedMagicMirrorSystem : EntitySystem +{ + [Dependency] private readonly SharedInteractionSystem _interaction = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnMirrorRangeCheck); + } + + private void OnMirrorRangeCheck(EntityUid uid, MagicMirrorComponent component, ref BoundUserInterfaceCheckRangeEvent args) + { + if (!Exists(component.Target) || !_interaction.InRangeUnobstructed(uid, component.Target.Value)) + { + args.Result = BoundUserInterfaceRangeResult.Fail; + } + } +} + [Serializable, NetSerializable] public enum MagicMirrorUiKey : byte { diff --git a/Content.Shared/Paper/SharedPaperComponent.cs b/Content.Shared/Paper/SharedPaperComponent.cs index dd87f9f907..f65a599e53 100644 --- a/Content.Shared/Paper/SharedPaperComponent.cs +++ b/Content.Shared/Paper/SharedPaperComponent.cs @@ -1,8 +1,10 @@ using Robust.Shared.Audio; +using Robust.Shared.GameStates; using Robust.Shared.Serialization; namespace Content.Shared.Paper; +[NetworkedComponent] public abstract partial class SharedPaperComponent : Component { /// diff --git a/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs b/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs new file mode 100644 index 0000000000..af193c8dfc --- /dev/null +++ b/Content.Shared/Power/Components/ActivatableUIRequiresPowerComponent.cs @@ -0,0 +1,8 @@ +using Robust.Shared.GameStates; + +namespace Content.Shared.Power.Components; + +[RegisterComponent, NetworkedComponent] +public sealed partial class ActivatableUIRequiresPowerComponent : Component +{ +} diff --git a/Content.Shared/Prying/Systems/PryingSystem.cs b/Content.Shared/Prying/Systems/PryingSystem.cs index 69a63f72b5..ab87585c70 100644 --- a/Content.Shared/Prying/Systems/PryingSystem.cs +++ b/Content.Shared/Prying/Systems/PryingSystem.cs @@ -1,15 +1,14 @@ -using Content.Shared.Prying.Components; -using Content.Shared.Verbs; -using Content.Shared.DoAfter; -using Robust.Shared.Serialization; +using System.Diagnostics.CodeAnalysis; using Content.Shared.Administration.Logs; using Content.Shared.Database; +using Content.Shared.DoAfter; using Content.Shared.Doors.Components; -using System.Diagnostics.CodeAnalysis; using Content.Shared.Interaction; using Content.Shared.Popups; -using Robust.Shared.Audio; +using Content.Shared.Prying.Components; +using Content.Shared.Verbs; using Robust.Shared.Audio.Systems; +using Robust.Shared.Serialization; using PryUnpoweredComponent = Content.Shared.Prying.Components.PryUnpoweredComponent; namespace Content.Shared.Prying.Systems; @@ -99,14 +98,16 @@ public sealed class PryingSystem : EntitySystem // to be marked as handled. return true; - return StartPry(target, user, null, 0.1f, out id); // hand-prying is much slower + // hand-prying is much slower + var modifier = CompOrNull(user)?.SpeedModifier ?? 0.1f; + return StartPry(target, user, null, modifier, out id); } private bool CanPry(EntityUid target, EntityUid user, out string? message, PryingComponent? comp = null) { BeforePryEvent canev; - if (comp != null) + if (comp != null || Resolve(user, ref comp, false)) { canev = new BeforePryEvent(user, comp.PryPowered, comp.Force); } diff --git a/Content.Shared/Roles/SharedRoleSystem.cs b/Content.Shared/Roles/SharedRoleSystem.cs index 1a732eb750..d5ac2e5923 100644 --- a/Content.Shared/Roles/SharedRoleSystem.cs +++ b/Content.Shared/Roles/SharedRoleSystem.cs @@ -1,3 +1,4 @@ +using System.Linq; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Mind; @@ -62,6 +63,38 @@ public abstract class SharedRoleSystem : EntitySystem _antagTypes.Add(typeof(T)); } + public void MindAddRoles(EntityUid mindId, ComponentRegistry components, MindComponent? mind = null, bool silent = false) + { + if (!Resolve(mindId, ref mind)) + return; + + EntityManager.AddComponents(mindId, components); + var antagonist = false; + foreach (var compReg in components.Values) + { + var compType = compReg.Component.GetType(); + + var comp = EntityManager.ComponentFactory.GetComponent(compType); + if (IsAntagonistRole(comp.GetType())) + { + antagonist = true; + break; + } + } + + var mindEv = new MindRoleAddedEvent(silent); + RaiseLocalEvent(mindId, ref mindEv); + + var message = new RoleAddedEvent(mindId, mind, antagonist, silent); + if (mind.OwnedEntity != null) + { + RaiseLocalEvent(mind.OwnedEntity.Value, message, true); + } + + _adminLogger.Add(LogType.Mind, LogImpact.Low, + $"Role components {string.Join(components.Keys.ToString(), ", ")} added to mind of {_minds.MindOwnerLoggingString(mind)}"); + } + public void MindAddRole(EntityUid mindId, Component component, MindComponent? mind = null, bool silent = false) { if (!Resolve(mindId, ref mind)) diff --git a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs index 2021dfe2de..4670f2dbf8 100644 --- a/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs +++ b/Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs @@ -2,9 +2,12 @@ using System.Collections.Frozen; 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; @@ -29,6 +32,7 @@ using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization; +using Robust.Shared.Utility; namespace Content.Shared.Storage.EntitySystems; @@ -36,6 +40,7 @@ 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!; @@ -72,6 +77,9 @@ public abstract class SharedStorageSystem : EntitySystem private readonly List _sortedSizes = new(); private FrozenDictionary _nextSmallest = FrozenDictionary.Empty; + private const string QuickInsertUseDelayID = "quickInsert"; + private const string OpenUiUseDelayID = "storage"; + protected readonly List CantFillReasons = []; /// @@ -84,6 +92,13 @@ public abstract class SharedStorageSystem : EntitySystem _xformQuery = GetEntityQuery(); _prototype.PrototypesReloaded += OnPrototypesReloaded; + Subs.BuiEvents(StorageComponent.StorageUiKey.Key, subs => + { + subs.Event(OnBoundUIClosed); + }); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent>(AddUiVerb); SubscribeLocalEvent(OnStorageGetState); SubscribeLocalEvent(OnStorageHandleState); SubscribeLocalEvent(OnComponentInit, before: new[] { typeof(SharedContainerSystem) }); @@ -118,6 +133,15 @@ public abstract class SharedStorageSystem : EntitySystem UpdatePrototypeCache(); } + private void OnMapInit(Entity entity, ref MapInitEvent args) + { + if (TryComp(entity, out var useDelayComp)) + { + UseDelay.SetLength((entity, useDelayComp), entity.Comp.QuickInsertCooldown, QuickInsertUseDelayID); + UseDelay.SetLength((entity, useDelayComp), entity.Comp.OpenUiCooldown, OpenUiUseDelayID); + } + } + private void OnStorageGetState(EntityUid uid, StorageComponent component, ref ComponentGetState args) { var storedItems = new Dictionary(); @@ -130,7 +154,6 @@ public abstract class SharedStorageSystem : EntitySystem args.State = new StorageComponentState() { Grid = new List(component.Grid), - IsUiOpen = component.IsUiOpen, MaxItemSize = component.MaxItemSize, StoredItems = storedItems, SavedLocations = component.SavedLocations @@ -144,7 +167,6 @@ public abstract class SharedStorageSystem : EntitySystem component.Grid.Clear(); component.Grid.AddRange(state.Grid); - component.IsUiOpen = state.IsUiOpen; component.MaxItemSize = state.MaxItemSize; component.StoredItems.Clear(); @@ -196,9 +218,108 @@ public abstract class SharedStorageSystem : EntitySystem UpdateAppearance((uid, storageComp, null)); } - public virtual void UpdateUI(Entity entity) {} + /// + /// If the user has nested-UIs open (e.g., PDA UI open when pda is in a backpack), close them. + /// + private void CloseNestedInterfaces(EntityUid uid, EntityUid actor, StorageComponent? storageComp = null) + { + if (!Resolve(uid, ref storageComp)) + return; - public virtual void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false) { } + // for each containing thing + // if it has a storage comp + // ensure unsubscribe from session + // if it has a ui component + // close ui + foreach (var entity in storageComp.Container.ContainedEntities) + { + _ui.CloseUis(entity, actor); + } + } + + private void OnBoundUIClosed(EntityUid uid, StorageComponent storageComp, BoundUIClosedEvent args) + { + CloseNestedInterfaces(uid, args.Actor, storageComp); + + // If UI is closed for everyone + if (!_ui.IsUiOpen(uid, args.UiKey)) + { + UpdateAppearance((uid, storageComp, null)); + Audio.PlayPredicted(storageComp.StorageCloseSound, uid, args.Actor); + } + } + + 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); + + // Does this player currently have the storage UI open? + var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User); + + ActivationVerb verb = new() + { + Act = () => + { + if (uiOpen) + { + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, args.User); + } + else + { + OpenStorageUI(uid, args.User, component, silent); + } + } + }; + + if (uiOpen) + { + verb.Text = Loc.GetString("comp-storage-verb-close-storage"); + verb.Icon = new SpriteSpecifier.Texture( + new("/Textures/Interface/VerbIcons/close.svg.192dpi.png")); + } + else + { + verb.Text = Loc.GetString("comp-storage-verb-open-storage"); + verb.Icon = new SpriteSpecifier.Texture( + new("/Textures/Interface/VerbIcons/open.svg.192dpi.png")); + } + args.Verbs.Add(verb); + } + + /// + /// 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) + { + 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 (!silent) + { + if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key)) + Audio.PlayPredicted(storageComp.StorageOpenSound, uid, entity); + + if (useDelay != null) + UseDelay.TryResetDelay((uid, useDelay)); + } + + _ui.OpenUi(uid, StorageComponent.StorageUiKey.Key, entity); + } + + public virtual void UpdateUI(Entity entity) {} private void AddTransferVerbs(EntityUid uid, StorageComponent component, GetVerbsEvent args) { @@ -252,7 +373,16 @@ public abstract class SharedStorageSystem : EntitySystem if (args.Handled || TryComp(uid, out var lockComponent) && lockComponent.Locked) return; - OpenStorageUI(uid, args.User, storageComp); + // Toggle + if (_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User)) + { + _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, args.User); + } + else + { + OpenStorageUI(uid, args.User, storageComp); + } + args.Handled = true; } @@ -275,7 +405,7 @@ public abstract class SharedStorageSystem : EntitySystem /// private void AfterInteract(EntityUid uid, StorageComponent storageComp, AfterInteractEvent args) { - if (args.Handled || !args.CanReach || !UseDelay.TryResetDelay(uid, checkDelayed: true)) + if (args.Handled || !args.CanReach || !UseDelay.TryResetDelay(uid, checkDelayed: true, id: QuickInsertUseDelayID)) return; // Pick up all entities in a radius around the clicked location. @@ -451,8 +581,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(uid, out var storageComp)) return; - if (!_ui.TryGetUi(uid, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(entity)) @@ -494,8 +623,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -521,8 +649,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -549,8 +676,7 @@ public abstract class SharedStorageSystem : EntitySystem if (!TryComp(storageEnt, out var storageComp)) return; - if (!_ui.TryGetUi(storageEnt, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storageEnt, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(itemEnt)) @@ -575,11 +701,10 @@ public abstract class SharedStorageSystem : EntitySystem var storage = GetEntity(msg.Storage); var item = GetEntity(msg.Item); - if (!TryComp(storage, out var storageComp)) + if (!HasComp(storage)) return; - if (!_ui.TryGetUi(storage, StorageComponent.StorageUiKey.Key, out var bui) || - !bui.SubscribedSessions.Contains(args.SenderSession)) + if (!_ui.IsUiOpen(storage, StorageComponent.StorageUiKey.Key, player)) return; if (!Exists(item)) @@ -596,11 +721,7 @@ public abstract class SharedStorageSystem : EntitySystem private void OnBoundUIOpen(EntityUid uid, StorageComponent storageComp, BoundUIOpenedEvent args) { - if (!storageComp.IsUiOpen) - { - storageComp.IsUiOpen = true; - UpdateAppearance((uid, storageComp, null)); - } + UpdateAppearance((uid, storageComp, null)); } private void OnEntInserted(Entity entity, ref EntInsertedIntoContainerMessage args) @@ -678,11 +799,13 @@ public abstract class SharedStorageSystem : EntitySystem var capacity = storage.Grid.GetArea(); var used = GetCumulativeItemAreas((uid, storage)); + var isOpen = _ui.IsUiOpen(entity.Owner, StorageComponent.StorageUiKey.Key); + _appearance.SetData(uid, StorageVisuals.StorageUsed, used, appearance); _appearance.SetData(uid, StorageVisuals.Capacity, capacity, appearance); - _appearance.SetData(uid, StorageVisuals.Open, storage.IsUiOpen, appearance); - _appearance.SetData(uid, SharedBagOpenVisuals.BagState, storage.IsUiOpen ? SharedBagState.Open : SharedBagState.Closed, appearance); - _appearance.SetData(uid, StackVisuals.Hide, !storage.IsUiOpen, appearance); + _appearance.SetData(uid, StorageVisuals.Open, isOpen, appearance); + _appearance.SetData(uid, SharedBagOpenVisuals.BagState, isOpen ? SharedBagState.Open : SharedBagState.Closed, appearance); + _appearance.SetData(uid, StackVisuals.Hide, !isOpen, appearance); } /// @@ -1334,8 +1457,6 @@ public abstract class SharedStorageSystem : EntitySystem [Serializable, NetSerializable] protected sealed class StorageComponentState : ComponentState { - public bool IsUiOpen; - public Dictionary StoredItems = new(); public Dictionary> SavedLocations = new(); diff --git a/Content.Shared/Storage/StorageComponent.cs b/Content.Shared/Storage/StorageComponent.cs index 16987f1de0..ef682dd4f9 100644 --- a/Content.Shared/Storage/StorageComponent.cs +++ b/Content.Shared/Storage/StorageComponent.cs @@ -19,10 +19,6 @@ namespace Content.Shared.Storage { public static string ContainerId = "storagebase"; - // TODO: This fucking sucks - [ViewVariables(VVAccess.ReadWrite), DataField] - public bool IsUiOpen; - [ViewVariables] public Container Container = default!; @@ -57,6 +53,19 @@ namespace Content.Shared.Storage [DataField] public bool QuickInsert; // Can insert storables by clicking them with the storage entity + /// + /// Minimum delay between quick/area insert actions. + /// + /// Used to prevent autoclickers spamming server with individual pickup actions. + public TimeSpan QuickInsertCooldown = TimeSpan.FromSeconds(0.5); + + /// + /// Minimum delay between UI open actions. + /// Used to spamming opening sounds. + /// + [DataField] + public TimeSpan OpenUiCooldown = TimeSpan.Zero; + [DataField] public bool ClickInsert = true; // Can insert stuff by clicking the storage entity with it @@ -219,15 +228,6 @@ namespace Content.Shared.Storage } } - /// - /// An extra BUI message that either opens, closes, or focuses the storage window based on context. - /// - [Serializable, NetSerializable] - public sealed class StorageModifyWindowMessage : BoundUserInterfaceMessage - { - - } - [NetSerializable] [Serializable] public enum StorageVisuals : byte diff --git a/Content.Shared/Timing/UseDelayComponent.cs b/Content.Shared/Timing/UseDelayComponent.cs index 1560d4dd0b..aa6c66eb81 100644 --- a/Content.Shared/Timing/UseDelayComponent.cs +++ b/Content.Shared/Timing/UseDelayComponent.cs @@ -1,38 +1,53 @@ using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization; namespace Content.Shared.Timing; /// -/// Timer that creates a cooldown each time an object is activated/used +/// Timer that creates a cooldown each time an object is activated/used. +/// Can support additional, separate cooldown timers on the object by passing a unique ID with the system methods. /// -/// -/// Currently it only supports a single delay per entity, this means that for things that have two delay interactions they will share one timer, so this can cause issues. For example, the bible has a delay when opening the storage UI and when applying it's interaction effect, and they share the same delay. -/// [RegisterComponent] -[NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause] +[NetworkedComponent] [Access(typeof(UseDelaySystem))] public sealed partial class UseDelayComponent : Component { - /// - /// When the delay starts. - /// - [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [AutoPausedField] - public TimeSpan DelayStartTime; - - /// - /// When the delay ends. - /// - [ViewVariables(VVAccess.ReadWrite), DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoNetworkedField] - [AutoPausedField] - public TimeSpan DelayEndTime; - - /// - /// Default delay time - /// [DataField] - [ViewVariables(VVAccess.ReadWrite)] - [AutoNetworkedField] + public Dictionary Delays = []; + + /// + /// Default delay time. + /// + /// + /// This is only used at MapInit and should not be expected + /// to reflect the length of the default delay after that. + /// Use instead. + /// + [DataField] public TimeSpan Delay = TimeSpan.FromSeconds(1); } + +[Serializable, NetSerializable] +public sealed class UseDelayComponentState : IComponentState +{ + public Dictionary Delays = new(); +} + +[Serializable, NetSerializable] +[DataDefinition] +public sealed partial class UseDelayInfo +{ + [DataField] + public TimeSpan Length { get; set; } + [DataField] + public TimeSpan StartTime { get; set; } + [DataField] + public TimeSpan EndTime { get; set; } + + public UseDelayInfo(TimeSpan length, TimeSpan startTime = default, TimeSpan endTime = default) + { + Length = length; + StartTime = startTime; + EndTime = endTime; + } +} diff --git a/Content.Shared/Timing/UseDelaySystem.cs b/Content.Shared/Timing/UseDelaySystem.cs index 388f31079c..bc2a709175 100644 --- a/Content.Shared/Timing/UseDelaySystem.cs +++ b/Content.Shared/Timing/UseDelaySystem.cs @@ -1,3 +1,5 @@ +using System.Diagnostics.CodeAnalysis; +using Robust.Shared.GameStates; using Robust.Shared.Timing; namespace Content.Shared.Timing; @@ -7,53 +9,166 @@ public sealed class UseDelaySystem : EntitySystem [Dependency] private readonly IGameTiming _gameTiming = default!; [Dependency] private readonly MetaDataSystem _metadata = default!; - public void SetDelay(Entity ent, TimeSpan delay) + private const string DefaultId = "default"; + + public override void Initialize() { - if (ent.Comp.Delay == delay) + base.Initialize(); + + SubscribeLocalEvent(OnMapInit); + SubscribeLocalEvent(OnUnpaused); + SubscribeLocalEvent(OnDelayGetState); + SubscribeLocalEvent(OnDelayHandleState); + } + + private void OnDelayHandleState(Entity ent, ref ComponentHandleState args) + { + if (args.Current is not UseDelayComponentState state) return; - ent.Comp.Delay = delay; - Dirty(ent); + ent.Comp.Delays.Clear(); + + // At time of writing sourcegen networking doesn't deep copy so this will mispredict if you try. + foreach (var (key, delay) in state.Delays) + { + ent.Comp.Delays[key] = new UseDelayInfo(delay.Length, delay.StartTime, delay.EndTime); + } + } + + private void OnDelayGetState(Entity ent, ref ComponentGetState args) + { + args.State = new UseDelayComponentState() + { + Delays = ent.Comp.Delays + }; + } + + private void OnMapInit(Entity ent, ref MapInitEvent args) + { + // Set default delay length from the prototype + // This makes it easier for simple use cases that only need a single delay + SetLength(ent, ent.Comp.Delay, DefaultId); + } + + private void OnUnpaused(Entity ent, ref EntityUnpausedEvent args) + { + // We have to do this manually, since it's not just a single field. + foreach (var entry in ent.Comp.Delays.Values) + { + entry.EndTime += args.PausedTime; + } } /// - /// Returns true if the entity has a currently active UseDelay. + /// Sets the length of the delay with the specified ID. /// - public bool IsDelayed(Entity ent) + public bool SetLength(Entity ent, TimeSpan length, string id = DefaultId) { - return ent.Comp.DelayEndTime >= _gameTiming.CurTime; - } + if (ent.Comp.Delays.TryGetValue(id, out var entry)) + { + if (entry.Length == length) + return true; - /// - /// Cancels the current delay. - /// - public void CancelDelay(Entity ent) - { - ent.Comp.DelayEndTime = _gameTiming.CurTime; - Dirty(ent); - } + entry.Length = length; + } + else + { + ent.Comp.Delays.Add(id, new UseDelayInfo(length)); + } - /// - /// Resets the UseDelay entirely for this entity if possible. - /// - /// Check if the entity has an ongoing delay, return false if it does, return true if it does not. - public bool TryResetDelay(Entity ent, bool checkDelayed = false) - { - if (checkDelayed && IsDelayed(ent)) - return false; - - var curTime = _gameTiming.CurTime; - ent.Comp.DelayStartTime = curTime; - ent.Comp.DelayEndTime = curTime - _metadata.GetPauseTime(ent) + ent.Comp.Delay; Dirty(ent); return true; } - public bool TryResetDelay(EntityUid uid, bool checkDelayed = false, UseDelayComponent? component = null) + /// + /// Returns true if the entity has a currently active UseDelay with the specified ID. + /// + public bool IsDelayed(Entity ent, string id = DefaultId) + { + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return false; + + return entry.EndTime >= _gameTiming.CurTime; + } + + /// + /// Cancels the delay with the specified ID. + /// + public void CancelDelay(Entity ent, string id = DefaultId) + { + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return; + + entry.EndTime = _gameTiming.CurTime; + Dirty(ent); + } + + /// + /// Tries to get info about the delay with the specified ID. See . + /// + /// + /// + /// + /// + public bool TryGetDelayInfo(Entity ent, [NotNullWhen(true)] out UseDelayInfo? info, string id = DefaultId) + { + return ent.Comp.Delays.TryGetValue(id, out info); + } + + /// + /// Returns info for the delay that will end farthest in the future. + /// + public UseDelayInfo GetLastEndingDelay(Entity ent) + { + var last = ent.Comp.Delays[DefaultId]; + foreach (var entry in ent.Comp.Delays) + { + if (entry.Value.EndTime > last.EndTime) + last = entry.Value; + } + return last; + } + + /// + /// Resets the delay with the specified ID for this entity if possible. + /// + /// Check if the entity has an ongoing delay with the specified ID. + /// If it does, return false and don't reset it. + /// Otherwise reset it and return true. + public bool TryResetDelay(Entity ent, bool checkDelayed = false, string id = DefaultId) + { + if (checkDelayed && IsDelayed(ent, id)) + return false; + + if (!ent.Comp.Delays.TryGetValue(id, out var entry)) + return false; + + var curTime = _gameTiming.CurTime; + entry.StartTime = curTime; + entry.EndTime = curTime - _metadata.GetPauseTime(ent) + entry.Length; + Dirty(ent); + return true; + } + + public bool TryResetDelay(EntityUid uid, bool checkDelayed = false, UseDelayComponent? component = null, string id = DefaultId) { if (!Resolve(uid, ref component, false)) return false; - return TryResetDelay((uid, component), checkDelayed); + return TryResetDelay((uid, component), checkDelayed, id); + } + + /// + /// Resets all delays on the entity. + /// + public void ResetAllDelays(Entity ent) + { + var curTime = _gameTiming.CurTime; + foreach (var entry in ent.Comp.Delays.Values) + { + entry.StartTime = curTime; + entry.EndTime = curTime - _metadata.GetPauseTime(ent) + entry.Length; + } + Dirty(ent); } } diff --git a/Content.Server/UserInterface/ActivatableUIComponent.cs b/Content.Shared/UserInterface/ActivatableUIComponent.cs similarity index 87% rename from Content.Server/UserInterface/ActivatableUIComponent.cs rename to Content.Shared/UserInterface/ActivatableUIComponent.cs index cc0e5008e4..74e6134932 100644 --- a/Content.Server/UserInterface/ActivatableUIComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIComponent.cs @@ -1,16 +1,14 @@ using Content.Shared.Whitelist; -using Robust.Server.GameObjects; -using Robust.Server.Player; -using Robust.Shared.Player; +using Robust.Shared.GameStates; using Robust.Shared.Serialization.TypeSerializers.Implementations; -namespace Content.Server.UserInterface +namespace Content.Shared.UserInterface { - [RegisterComponent] + [RegisterComponent, NetworkedComponent] public sealed partial class ActivatableUIComponent : Component { - [DataField(required: true, customTypeSerializer:typeof(EnumSerializer))] - public Enum? Key { get; set; } + [DataField(required: true, customTypeSerializer: typeof(EnumSerializer))] + public Enum Key { get; set; } = default!; [ViewVariables(VVAccess.ReadWrite)] [DataField] @@ -70,6 +68,6 @@ namespace Content.Server.UserInterface /// NOTE: DO NOT DIRECTLY SET, USE ActivatableUISystem.SetCurrentSingleUser /// [ViewVariables] - public ICommonSession? CurrentSingleUser; + public EntityUid? CurrentSingleUser; } } diff --git a/Content.Shared/UserInterface/ActivatableUIEvents.cs b/Content.Shared/UserInterface/ActivatableUIEvents.cs index 6e6b3f63c6..338673a3ca 100644 --- a/Content.Shared/UserInterface/ActivatableUIEvents.cs +++ b/Content.Shared/UserInterface/ActivatableUIEvents.cs @@ -24,12 +24,12 @@ public sealed class UserOpenActivatableUIAttemptEvent : CancellableEntityEventAr public sealed class AfterActivatableUIOpenEvent : EntityEventArgs { public EntityUid User { get; } - public readonly ICommonSession Session; + public readonly EntityUid Actor; - public AfterActivatableUIOpenEvent(EntityUid who, ICommonSession session) + public AfterActivatableUIOpenEvent(EntityUid who, EntityUid actor) { User = who; - Session = session; + Actor = actor; } } diff --git a/Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs b/Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs similarity index 65% rename from Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs rename to Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs index fdc56f89a0..aa9e561e07 100644 --- a/Content.Server/UserInterface/ActivatableUIRequiresPowerCellComponent.cs +++ b/Content.Shared/UserInterface/ActivatableUIRequiresPowerCellComponent.cs @@ -1,13 +1,12 @@ -using Content.Server.PowerCell; using Content.Shared.PowerCell; -using Content.Shared.UserInterface; +using Robust.Shared.GameStates; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; /// /// Specifies that the attached entity requires power. /// -[RegisterComponent] +[RegisterComponent, NetworkedComponent] public sealed partial class ActivatableUIRequiresPowerCellComponent : Component { diff --git a/Content.Server/UserInterface/ActivatableUISystem.Power.cs b/Content.Shared/UserInterface/ActivatableUISystem.Power.cs similarity index 82% rename from Content.Server/UserInterface/ActivatableUISystem.Power.cs rename to Content.Shared/UserInterface/ActivatableUISystem.Power.cs index d4dcc91d46..c904224328 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.Power.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.Power.cs @@ -1,13 +1,11 @@ -using Content.Server.PowerCell; using Content.Shared.PowerCell; -using Content.Shared.UserInterface; using Robust.Shared.Containers; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; public sealed partial class ActivatableUISystem { - [Dependency] private readonly PowerCellSystem _cell = default!; + [Dependency] private readonly SharedPowerCellSystem _cell = default!; private void InitializePower() { @@ -23,10 +21,9 @@ public sealed partial class ActivatableUISystem _cell.SetPowerCellDrawEnabled(uid, false); if (HasComp(uid) && - TryComp(uid, out var activatable) && - activatable.Key != null) + TryComp(uid, out var activatable)) { - _uiSystem.TryCloseAll(uid, activatable.Key); + _uiSystem.CloseUi(uid, activatable.Key); } } @@ -57,13 +54,13 @@ public sealed partial class ActivatableUISystem /// public void CheckUsage(EntityUid uid, ActivatableUIComponent? active = null, ActivatableUIRequiresPowerCellComponent? component = null, PowerCellDrawComponent? draw = null) { - if (!Resolve(uid, ref component, ref draw, ref active, false) || active.Key == null) + if (!Resolve(uid, ref component, ref draw, ref active, false)) return; - if (_cell.HasCharge(uid, draw.UseRate)) + if (_cell.HasActivatableCharge(uid)) return; - _uiSystem.TryCloseAll(uid, active.Key); + _uiSystem.CloseUi(uid, active.Key); } private void OnBatteryOpenAttempt(EntityUid uid, ActivatableUIRequiresPowerCellComponent component, ActivatableUIOpenAttemptEvent args) @@ -72,10 +69,11 @@ public sealed partial class ActivatableUISystem return; // Check if we have the appropriate drawrate / userate to even open it. - if (args.Cancelled || !_cell.HasCharge(uid, MathF.Max(draw.DrawRate, draw.UseRate), user: args.User)) + if (args.Cancelled || + !_cell.HasActivatableCharge(uid, draw, user: args.User) || + !_cell.HasDrawCharge(uid, draw, user: args.User)) { args.Cancel(); - return; } } } diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Shared/UserInterface/ActivatableUISystem.cs similarity index 79% rename from Content.Server/UserInterface/ActivatableUISystem.cs rename to Content.Shared/UserInterface/ActivatableUISystem.cs index 5f2314df90..452f08c094 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Shared/UserInterface/ActivatableUISystem.cs @@ -1,23 +1,21 @@ -using Content.Server.Administration.Managers; using Content.Shared.ActionBlocker; +using Content.Shared.Administration.Managers; using Content.Shared.Ghost; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; using Content.Shared.Popups; -using Content.Shared.UserInterface; using Content.Shared.Verbs; -using Robust.Server.GameObjects; using Robust.Shared.Player; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; public sealed partial class ActivatableUISystem : EntitySystem { - [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly ISharedAdminManager _adminManager = default!; [Dependency] private readonly ActionBlockerSystem _blockerSystem = default!; - [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; + [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!; [Dependency] private readonly SharedPopupSystem _popupSystem = default!; public override void Initialize() @@ -49,7 +47,7 @@ public sealed partial class ActivatableUISystem : EntitySystem if (!comp.RequireHands) return; - if (!TryComp(ev.Sender.AttachedEntity, out HandsComponent? hands) || hands.Hands.Count == 0) + if (!TryComp(ev.Actor, out HandsComponent? hands) || hands.Hands.Count == 0) ev.Cancel(); } @@ -58,10 +56,7 @@ public sealed partial class ActivatableUISystem : EntitySystem if (args.Handled || args.Key == null) return; - if (!TryComp(args.Performer, out ActorComponent? actor)) - return; - - args.Handled = _uiSystem.TryToggleUi(uid, args.Key, actor.PlayerSession); + args.Handled = _uiSystem.TryToggleUi(uid, args.Key, args.Performer); } private void AddOpenUiVerb(EntityUid uid, ActivatableUIComponent component, GetVerbsEvent args) @@ -128,7 +123,9 @@ public sealed partial class ActivatableUISystem : EntitySystem private void OnUIClose(EntityUid uid, ActivatableUIComponent component, BoundUIClosedEvent args) { - if (args.Session != component.CurrentSingleUser) + var user = args.Actor; + + if (user != component.CurrentSingleUser) return; if (!Equals(args.UiKey, component.Key)) @@ -139,18 +136,12 @@ public sealed partial class ActivatableUISystem : EntitySystem private bool InteractUI(EntityUid user, EntityUid uiEntity, ActivatableUIComponent aui) { - if (!TryComp(user, out ActorComponent? actor)) + if (!_uiSystem.HasUi(uiEntity, aui.Key)) return false; - if (aui.Key == null) - return false; - - if (!_uiSystem.TryGetUi(uiEntity, aui.Key, out var ui)) - return false; - - if (ui.SubscribedSessions.Contains(actor.PlayerSession)) + if (_uiSystem.IsUiOpen(uiEntity, aui.Key, user)) { - _uiSystem.CloseUi(ui, actor.PlayerSession); + _uiSystem.CloseUi(uiEntity, aui.Key, user); return true; } @@ -160,10 +151,10 @@ public sealed partial class ActivatableUISystem : EntitySystem if (aui.RequireHands && !HasComp(user)) return false; - if (aui.AdminOnly && !_adminManager.IsAdmin(actor.PlayerSession)) + if (aui.AdminOnly && !_adminManager.IsAdmin(user)) return false; - if (aui.SingleUser && (aui.CurrentSingleUser != null) && (actor.PlayerSession != aui.CurrentSingleUser)) + if (aui.SingleUser && aui.CurrentSingleUser != null && user != aui.CurrentSingleUser) { string message = Loc.GetString("machine-already-in-use", ("machine", uiEntity)); _popupSystem.PopupEntity(message, uiEntity, user); @@ -171,7 +162,7 @@ public sealed partial class ActivatableUISystem : EntitySystem // If we get here, supposedly, the object is in use. // Check with BUI that it's ACTUALLY in use just in case. // Since this could brick the object if it goes wrong. - if (ui.SubscribedSessions.Count != 0) + if (_uiSystem.IsUiOpen(uiEntity, aui.Key)) return false; } @@ -189,24 +180,25 @@ public sealed partial class ActivatableUISystem : EntitySystem var bae = new BeforeActivatableUIOpenEvent(user); RaiseLocalEvent(uiEntity, bae); - SetCurrentSingleUser(uiEntity, actor.PlayerSession, aui); - _uiSystem.OpenUi(ui, actor.PlayerSession); + SetCurrentSingleUser(uiEntity, user, aui); + _uiSystem.OpenUi(uiEntity, aui.Key, user); //Let the component know a user opened it so it can do whatever it needs to do - var aae = new AfterActivatableUIOpenEvent(user, actor.PlayerSession); + var aae = new AfterActivatableUIOpenEvent(user, user); RaiseLocalEvent(uiEntity, aae); return true; } - public void SetCurrentSingleUser(EntityUid uid, ICommonSession? v, ActivatableUIComponent? aui = null) + public void SetCurrentSingleUser(EntityUid uid, EntityUid? user, ActivatableUIComponent? aui = null) { if (!Resolve(uid, ref aui)) return; + if (!aui.SingleUser) return; - aui.CurrentSingleUser = v; + aui.CurrentSingleUser = user; RaiseLocalEvent(uid, new ActivatableUIPlayerChangedEvent()); } @@ -216,10 +208,7 @@ public sealed partial class ActivatableUISystem : EntitySystem if (!Resolve(uid, ref aui, false)) return; - if (aui.Key == null || !_uiSystem.TryGetUi(uid, aui.Key, out var ui)) - return; - - _uiSystem.CloseAll(ui); + _uiSystem.CloseUi(uid, aui.Key); } private void OnHandDeselected(EntityUid uid, ActivatableUIComponent? aui, HandDeselectedEvent args) diff --git a/Content.Shared/Wieldable/Components/WieldableComponent.cs b/Content.Shared/Wieldable/Components/WieldableComponent.cs index 4a50b93072..5dc6abbbbe 100644 --- a/Content.Shared/Wieldable/Components/WieldableComponent.cs +++ b/Content.Shared/Wieldable/Components/WieldableComponent.cs @@ -26,6 +26,13 @@ public sealed partial class WieldableComponent : Component [AutoNetworkedField, DataField("wielded")] public bool Wielded = false; + /// + /// Whether using the item inhand while wielding causes the item to unwield. + /// Unwielding can conflict with other inhand actions. + /// + [DataField] + public bool UnwieldOnUse = true; + [DataField("wieldedInhandPrefix")] public string? WieldedInhandPrefix = "wielded"; diff --git a/Content.Shared/Wieldable/WieldableSystem.cs b/Content.Shared/Wieldable/WieldableSystem.cs index 6bd406c1ca..ba3f787a4b 100644 --- a/Content.Shared/Wieldable/WieldableSystem.cs +++ b/Content.Shared/Wieldable/WieldableSystem.cs @@ -125,7 +125,7 @@ public sealed class WieldableSystem : EntitySystem if (!component.Wielded) args.Handled = TryWield(uid, component, args.User); - else + else if (component.UnwieldOnUse) args.Handled = TryUnwield(uid, component, args.User); } diff --git a/Resources/Audio/Effects/chopstickbreak.ogg b/Resources/Audio/Effects/chopstickbreak.ogg new file mode 100644 index 0000000000..bac8ac0462 Binary files /dev/null and b/Resources/Audio/Effects/chopstickbreak.ogg differ diff --git a/Resources/Changelog/Admin.yml b/Resources/Changelog/Admin.yml index d4ffb79e92..186b0500ae 100644 --- a/Resources/Changelog/Admin.yml +++ b/Resources/Changelog/Admin.yml @@ -168,5 +168,12 @@ Entries: id: 22 time: '2024-04-20T16:18:26.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/27168 +- author: EmoGarbage404 + changes: + - message: Fixed antag status being broken in overlay and UI. + type: Fix + id: 23 + time: '2024-04-26T00:25:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27319 Name: Admin Order: 1 diff --git a/Resources/Changelog/Changelog.yml b/Resources/Changelog/Changelog.yml index a357848aa5..4ffc67a483 100644 --- a/Resources/Changelog/Changelog.yml +++ b/Resources/Changelog/Changelog.yml @@ -1,170 +1,4 @@ Entries: -- author: TheShuEd - changes: - - message: Darkness is coming. A new shadow anomaly added. - type: Add - id: 5935 - time: '2024-02-13T22:12:32.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24629 -- author: jamessimo - changes: - - message: Microwave UI enhancements - type: Tweak - - message: Microwaves now tell you how much time is left when cooking - type: Tweak - - message: Microwaves UI now uses prediction for user inputs. - type: Fix - id: 5936 - time: '2024-02-13T22:16:00.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24547 -- author: TheShuEd - changes: - - message: Remote signallers are now limited to a 15-tile radius - type: Tweak - - message: Added an advanced remote signaler, with a range of 30 tiles. - type: Add - - message: the anomaly synchronizer consumes much less power, and no longer causes - the anomaly pulses when powering down. - type: Tweak - id: 5937 - time: '2024-02-13T22:19:22.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24461 -- author: joshepvodka - changes: - - message: Fax machines can now print text files from your computer. - type: Add - id: 5938 - time: '2024-02-14T01:14:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/23262 -- author: Plykiya - changes: - - message: Holosigns can now be placed at range. No more being eaten by forcefields! - type: Tweak - id: 5939 - time: '2024-02-14T05:25:59.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25120 -- author: Zadeon - changes: - - message: Disablers now fit inside the suit storage slot. - type: Fix - id: 5940 - time: '2024-02-14T23:07:31.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25238 -- author: Jezithyr - changes: - - message: Death Acidifier implants not deleting items when activated - type: Fix - id: 5941 - time: '2024-02-15T01:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25251 -- author: PJB3005 - changes: - - message: Fixed disposals bins not automatically flushing after an item was inserted. - type: Fix - id: 5942 - time: '2024-02-15T20:52:52.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25233 -- author: liltenhead - changes: - - message: Reduced energy shield's hp from 150 to 100. - type: Tweak - id: 5943 - time: '2024-02-15T20:54:41.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25258 -- author: PJB3005 - changes: - - message: Nuke has some more blinkenlights now. - type: Tweak - id: 5944 - time: '2024-02-16T00:26:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25297 -- author: MACMAN2003 - changes: - - message: Thindows no longer duplicate glass when broken. - type: Fix - id: 5945 - time: '2024-02-16T04:03:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25304 -- author: Golinth - changes: - - message: Mindshields are no longer separate and appear as a border around job - icons on the SecHUD - type: Tweak - id: 5946 - time: '2024-02-16T15:58:29.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25303 -- author: Lukasz825700516 - changes: - - message: Damaging stacked glass sheets now gives appropriate amount of glass shards - type: Fix - id: 5947 - time: '2024-02-16T18:42:43.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25308 -- author: Plykiya - changes: - - message: The firefighting door remote now has access to atmos doors. - type: Tweak - id: 5948 - time: '2024-02-16T18:50:51.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25097 -- author: themias - changes: - - message: t-ray scanners can now penetrate carpets and puddles - type: Tweak - id: 5949 - time: '2024-02-16T23:37:56.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25276 -- author: Krunk - changes: - - message: Sound effects have been added for writing on paper. - type: Add - id: 5950 - time: '2024-02-16T23:48:18.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25257 -- author: PotentiallyTom - changes: - - message: Added new covers for the medical, security, and science guidebooks - type: Add - id: 5951 - time: '2024-02-16T23:50:49.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25232 -- author: PJB3005 - changes: - - message: Fix some rounding issues with complex chemical reactions. - type: Fix - id: 5952 - time: '2024-02-16T23:54:27.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25199 -- author: data_redacted - changes: - - message: New lobby art (of an Air Alarm blueprint). - type: Add - id: 5953 - time: '2024-02-17T02:52:17.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25179 -- author: Lank - changes: - - message: Diona nymphs, small cat-like creatures, several of which make up a Diona. - type: Add - - message: Diona are now able to split into three nymphs on death, and will control - one of them. The controlled nymph is able to reform into a new diona after some - time. - type: Add - - message: Diona now combust into flames upon being hit with significant heat damage. - type: Tweak - id: 5954 - time: '2024-02-17T02:54:45.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/24630 -- author: PolterTzi - changes: - - message: Seeds from sampled plants now inherit the sampled plant's health to discourage - excessive sampling. - type: Tweak - - message: Plants need to grow a bit before being sampled. - type: Tweak - id: 5955 - time: '2024-02-17T05:02:12.0000000+00:00' - url: https://github.com/space-wizards/space-station-14/pull/25326 - author: Dygon changes: - message: Diona nymphs aren't deleted immediately after spawning anymore. @@ -3850,3 +3684,166 @@ id: 6434 time: '2024-04-25T02:19:17.0000000+00:00' url: https://github.com/space-wizards/space-station-14/pull/25912 +- author: cooldolphin + changes: + - message: Three variants of glasses are now available in the loadout menu. + type: Add + id: 6435 + time: '2024-04-25T23:18:39.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27286 +- author: EmoGarbage404 + changes: + - message: Traitors now have the correct number of objectives. + type: Fix + - message: Declaring war now gives TC again. + type: Fix + - message: Latejoining antagonists will now properly exclude command and security + staff. + type: Fix + id: 6436 + time: '2024-04-26T00:25:57.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27319 +- author: Tayrtahn + changes: + - message: Fixed Bibles not healing. + type: Fix + - message: Fixed quick insert and area insert not working on ore/plant/trash bags. + type: Fix + id: 6437 + time: '2024-04-26T02:25:52.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27234 +- author: SkaldetSkaeg + changes: + - message: The handheld radio no longer plays a message spoken into it. + type: Tweak + id: 6438 + time: '2024-04-26T07:34:20.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27046 +- author: FungiFellow + changes: + - message: Added SecBelt whitelist to Sec webbing + type: Tweak + - message: Added more Ammo holders to SecBelt whitelist + type: Tweak + id: 6439 + time: '2024-04-26T07:44:41.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27303 +- author: IlyaElDunaev + changes: + - message: Ammonia heal blood loss in the Rat King + type: Add + id: 6440 + time: '2024-04-26T07:47:02.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26887 +- author: FungiFellow + changes: + - message: Added Quiver Recipe, go wild Robin Hood. + type: Add + id: 6441 + time: '2024-04-26T07:48:15.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27198 +- author: Boaz1111 + changes: + - message: Refactored Cluster's medbay, including cryo in the bottom left room + type: Tweak + id: 6442 + time: '2024-04-26T08:01:21.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27293 +- author: metalgearsloth + changes: + - message: Add predicted UI opening for storage and PDAs. + type: Add + id: 6443 + time: '2024-04-26T08:16:24.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27214 +- author: DrSmugleaf + changes: + - message: Fixed mobs that are able to pry doors not being able to do so by just + left clicking on them. + type: Fix + id: 6444 + time: '2024-04-26T12:17:25.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27349 +- author: WarMechanic + changes: + - message: Fixed unwielding overruling gun cycling + type: Fix + id: 6445 + time: '2024-04-26T12:31:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27307 +- author: wafehling + changes: + - message: You can now reopen the end of round summary window with F9. + type: Tweak + id: 6446 + time: '2024-04-26T12:39:56.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25884 +- author: DrSmugleaf + changes: + - message: Fixed the game never starting again if it fails to start once. + type: Fix + id: 6447 + time: '2024-04-26T13:02:08.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27359 +- author: Dutch-VanDerLinde + changes: + - message: Monkey reinforcement teleporters can now select between kobold and monkey + operative with a verb. + type: Tweak + - message: Monkey reinforcement teleporters have been renamed to "genetic ancestor + reinforcement teleporter". + type: Tweak + id: 6448 + time: '2024-04-26T13:06:44.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/25982 +- author: fujiwaranao + changes: + - message: Players may now select the Creepy Long hairstyle and an appropriately + creepy dress to go with it can be found in theatrical performances crates. + type: Add + id: 6449 + time: '2024-04-26T18:51:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27333 +- author: Pgriha + changes: + - message: Increase limit of characters 10 -> 30. + type: Tweak + id: 6450 + time: '2024-04-26T22:58:26.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27361 +- author: AllenTheGreat + changes: + - message: The Agent ID card will no longer reset the selected job icon between + UI loads + type: Fix + id: 6451 + time: '2024-04-27T05:13:13.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27379 +- author: Slava0135 + changes: + - message: added cancer mouse! (for real this time) + type: Add + id: 6452 + time: '2024-04-27T05:46:50.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26768 +- author: EmoGarbage404 + changes: + - message: Added the welding gas mask to salvage equipment research. + type: Add + id: 6453 + time: '2024-04-27T05:47:38.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27108 +- author: VigersRay + changes: + - message: Angered NPC now can unbuckle, unpull and escape from containers. + type: Fix + id: 6454 + time: '2024-04-27T05:58:10.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/26868 +- author: Lukasz825700516 + changes: + - message: Fixed undeconstructable objects showing deconstruct verb. + type: Fix + id: 6455 + time: '2024-04-27T06:30:30.0000000+00:00' + url: https://github.com/space-wizards/space-station-14/pull/27387 diff --git a/Resources/Locale/en-US/accessories/human-hair.ftl b/Resources/Locale/en-US/accessories/human-hair.ftl index 3a507ec6cf..f052f232de 100644 --- a/Resources/Locale/en-US/accessories/human-hair.ftl +++ b/Resources/Locale/en-US/accessories/human-hair.ftl @@ -55,6 +55,7 @@ marking-HumanHairCornrows2 = Cornrows 2 marking-HumanHairCornrowbun = Cornrow Bun marking-HumanHairCornrowbraid = Cornrow Braid marking-HumanHairCornrowtail = Cornrow Tail +marking-HumanHairSpookyLong = Spooky Long marking-HumanHairCrewcut = Crewcut marking-HumanHairCrewcut2 = Crewcut 2 marking-HumanHairCurls = Curls diff --git a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl index 416d87f7c5..1c0c0005b4 100644 --- a/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl +++ b/Resources/Locale/en-US/escape-menu/ui/options-menu.ftl @@ -173,6 +173,7 @@ ui-options-function-open-crafting-menu = Open crafting menu ui-options-function-open-inventory-menu = Open inventory ui-options-function-open-a-help = Open admin help ui-options-function-open-abilities-menu = Open action menu +ui-options-function-toggle-round-end-summary-window = Toggle round end summary window ui-options-function-open-entity-spawn-window = Open entity spawn menu ui-options-function-open-sandbox-window = Open sandbox menu ui-options-function-open-tile-spawn-window = Open tile spawn menu diff --git a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl index 23a178d282..d307813c26 100644 --- a/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl +++ b/Resources/Locale/en-US/ghost/roles/ghost-role-component.ftl @@ -228,6 +228,10 @@ ghost-role-information-syndicate-monkey-reinforcement-name = Syndicate Monkey Ag ghost-role-information-syndicate-monkey-reinforcement-description = Someone needs reinforcements. You, a trained monkey, will help them. ghost-role-information-syndicate-monkey-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them. +ghost-role-information-syndicate-kobold-reinforcement-name = Syndicate Kobold Agent +ghost-role-information-syndicate-kobold-reinforcement-description = Someone needs reinforcements. You, a trained kobold, will help them. +ghost-role-information-syndicate-kobold-reinforcement-rules = Normal syndicate antagonist rules apply. Work with whoever called you in, and don't harm them. + ghost-role-information-artifact-name = Sentient Artifact ghost-role-information-artifact-description = Enact your eldritch whims. diff --git a/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl b/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl new file mode 100644 index 0000000000..9d649a5e07 --- /dev/null +++ b/Resources/Locale/en-US/ghost/roles/ghostrole-spawner-verb-selectable.ftl @@ -0,0 +1 @@ +ghostrole-spawner-select = Selected: {$mode} \ No newline at end of file diff --git a/Resources/Locale/en-US/preferences/loadout-groups.ftl b/Resources/Locale/en-US/preferences/loadout-groups.ftl index cdad0f72e6..a093a8463a 100644 --- a/Resources/Locale/en-US/preferences/loadout-groups.ftl +++ b/Resources/Locale/en-US/preferences/loadout-groups.ftl @@ -1,5 +1,6 @@ # Miscellaneous loadout-group-trinkets = Trinkets +loadout-group-glasses = Glasses # Command loadout-group-captain-head = Captain head diff --git a/Resources/Locale/en-US/store/uplink-catalog.ftl b/Resources/Locale/en-US/store/uplink-catalog.ftl index 57a309ac69..49d4ca0028 100644 --- a/Resources/Locale/en-US/store/uplink-catalog.ftl +++ b/Resources/Locale/en-US/store/uplink-catalog.ftl @@ -121,8 +121,8 @@ uplink-agent-id-card-desc = A modified ID card that can copy accesses from other uplink-black-jetpack-name = Black Jetpack uplink-black-jetpack-desc = A black jetpack. It allows you to fly around in space. Refills not included, use your fuel wisely. -uplink-reinforcement-radio-monkey-name = Monkey Reinforcement Teleporter -uplink-reinforcement-radio-monkey-desc = Call in a trained monkey to assist you. Comes with a single syndicate cigarette. +uplink-reinforcement-radio-ancestor-name = Genetic Ancestor Reinforcement Teleporter +uplink-reinforcement-radio-ancestor-desc = Call in a trained ancestor of your choosing to assist you. Comes with a single syndicate cigarette. uplink-reinforcement-radio-name = Reinforcement Teleporter uplink-reinforcement-radio-desc = Radio in a reinforcement agent of extremely questionable quality. No off button, buy this if you're ready to party. They have a pistol with no reserve ammo, and a knife. That's it. diff --git a/Resources/Maps/cluster.yml b/Resources/Maps/cluster.yml index 607d8fb4f3..1a2d2ffd8c 100644 --- a/Resources/Maps/cluster.yml +++ b/Resources/Maps/cluster.yml @@ -36,6 +36,7 @@ tilemap: 111: FloorWhiteHerringbone 112: FloorWhiteMini 113: FloorWhiteMono + 1: FloorWhitePlastic 118: FloorWood 120: Lattice 121: Plating @@ -56,7 +57,7 @@ entities: version: 6 -1,0: ind: -1,0 - tiles: eQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAABWQAAAAADWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAABYAAAAAAAWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABTAAAAAAAWQAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAAAWQAAAAABWQAAAAADYAAAAAAAWQAAAAABeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAACYAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbQAAAAABbQAAAAADeQAAAAAAbAAAAAAAbAAAAAADcQAAAAADbQAAAAACbQAAAAADeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAACeQAAAAAAdgAAAAACdgAAAAADdgAAAAACbQAAAAACbQAAAAACeQAAAAAAbAAAAAACbAAAAAACcQAAAAADbQAAAAABbQAAAAACeQAAAAAAYAAAAAAATAAAAAAAWQAAAAABeQAAAAAAdgAAAAACdgAAAAABdgAAAAACcQAAAAADcQAAAAADeQAAAAAAbAAAAAACbAAAAAABeQAAAAAAcQAAAAABcQAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABeQAAAAAAdgAAAAADdgAAAAADdgAAAAACbAAAAAADbAAAAAAAbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAABbAAAAAACWQAAAAACYAAAAAAAWQAAAAADDgAAAAADDgAAAAADDgAAAAABDgAAAAABbAAAAAAAbAAAAAACbAAAAAAAbAAAAAABbAAAAAABcQAAAAABbAAAAAACbAAAAAAAbAAAAAAAWQAAAAACTAAAAAAAWQAAAAACDgAAAAABDgAAAAABDgAAAAADDgAAAAAAbAAAAAACbAAAAAAAbAAAAAACbAAAAAADbAAAAAAAcQAAAAACbAAAAAABbAAAAAABbAAAAAAAYAAAAAAAWQAAAAAAWQAAAAADeQAAAAAAdgAAAAACdgAAAAACDgAAAAAAbAAAAAADbAAAAAADbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAdgAAAAACDgAAAAAAbAAAAAABeQAAAAAAeQAAAAAAcQAAAAACeQAAAAAAeQAAAAAAcQAAAAAAcQAAAAABeQAAAAAAWQAAAAABWQAAAAABYAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAADbAAAAAACeQAAAAAAcAAAAAADcAAAAAABcAAAAAABcAAAAAABcAAAAAACcAAAAAADeQAAAAAAWQAAAAABTAAAAAAAWQAAAAADWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAcAAAAAAAcAAAAAACcAAAAAAAcAAAAAADcAAAAAAAcAAAAAACeQAAAAAAWQAAAAABWQAAAAACYAAAAAAAWQAAAAACYAAAAAAAYAAAAAAAWQAAAAAAbAAAAAAAcQAAAAACcAAAAAABcAAAAAABcAAAAAAAcAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAADTAAAAAAAWQAAAAACWQAAAAAB + tiles: eQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAAAWQAAAAACeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAABWQAAAAADWQAAAAACWQAAAAADWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAABYAAAAAAAWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABWQAAAAABTAAAAAAAWQAAAAADLAAAAAAALAAAAAAALAAAAAAALAAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAAAWQAAAAABWQAAAAADYAAAAAAAWQAAAAABeQAAAAAALAAAAAAALAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAADWQAAAAACYAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAAAbAAAAAADcQAAAAADbQAAAAACbQAAAAADeQAAAAAAWQAAAAAAWQAAAAAAWQAAAAACeQAAAAAAdgAAAAACdgAAAAADdgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAACbAAAAAACcQAAAAADbQAAAAABbQAAAAACeQAAAAAAYAAAAAAATAAAAAAAWQAAAAABeQAAAAAAdgAAAAACdgAAAAABdgAAAAACAQAAAAAAAQAAAAAAAQAAAAAAbAAAAAACbAAAAAABeQAAAAAAcQAAAAABcQAAAAAAeQAAAAAAWQAAAAAAWQAAAAACWQAAAAABeQAAAAAAdgAAAAADdgAAAAADdgAAAAACbAAAAAADbAAAAAAAbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAABbAAAAAABbAAAAAACWQAAAAACYAAAAAAAWQAAAAADDgAAAAADDgAAAAADDgAAAAABDgAAAAABbAAAAAAAbAAAAAACbAAAAAAAbAAAAAABbAAAAAABcQAAAAABbAAAAAACbAAAAAAAbAAAAAAAWQAAAAACTAAAAAAAWQAAAAACDgAAAAABDgAAAAABDgAAAAADDgAAAAAAbAAAAAACbAAAAAAAbAAAAAACbAAAAAADbAAAAAAAcQAAAAACbAAAAAABbAAAAAABbAAAAAAAYAAAAAAAWQAAAAAAWQAAAAADeQAAAAAAdgAAAAACdgAAAAACDgAAAAAAbAAAAAADbAAAAAADbAAAAAADbAAAAAABbAAAAAACeQAAAAAAbAAAAAAAbAAAAAAAbAAAAAABWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAdgAAAAACDgAAAAAAbAAAAAABeQAAAAAAeQAAAAAAcQAAAAACeQAAAAAAeQAAAAAAcQAAAAAAcQAAAAABeQAAAAAAWQAAAAABWQAAAAABYAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAADgAAAAADbAAAAAACeQAAAAAAcAAAAAADcAAAAAABcAAAAAABcAAAAAABcAAAAAACcAAAAAADeQAAAAAAWQAAAAABTAAAAAAAWQAAAAADWQAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAeQAAAAAAcAAAAAAAcAAAAAACcAAAAAAAcAAAAAADcAAAAAAAcAAAAAACeQAAAAAAWQAAAAABWQAAAAACYAAAAAAAWQAAAAACYAAAAAAAYAAAAAAAWQAAAAAAbAAAAAAAcQAAAAACcAAAAAABcAAAAAABcAAAAAAAcAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAAAWQAAAAABWQAAAAADTAAAAAAAWQAAAAACWQAAAAAB version: 6 -1,-1: ind: -1,-1 @@ -76,7 +77,7 @@ entities: version: 6 -2,0: ind: -2,0 - tiles: YAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAADWQAAAAABWQAAAAABWQAAAAAAWQAAAAADWQAAAAABWQAAAAAAYAAAAAAAWQAAAAACWQAAAAABWQAAAAADWQAAAAABWQAAAAACWQAAAAABYAAAAAAAWQAAAAACWQAAAAACWQAAAAAAYAAAAAAAWQAAAAABYAAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAADWQAAAAADWQAAAAABWQAAAAADYAAAAAAAWQAAAAABWQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbwAAAAAAbwAAAAADbwAAAAABbwAAAAADeQAAAAAAbQAAAAADbQAAAAACeQAAAAAAbQAAAAAAbQAAAAADeQAAAAAAdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbwAAAAACbwAAAAABbwAAAAAAbwAAAAAAeQAAAAAAbQAAAAABbQAAAAACeQAAAAAAbQAAAAADbQAAAAADeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbwAAAAABbwAAAAADbwAAAAAAbwAAAAAAeQAAAAAAcQAAAAADcQAAAAAAeQAAAAAAcQAAAAABcQAAAAABeQAAAAAAdgAAAAADeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAADeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAADbAAAAAABbAAAAAADbAAAAAADbAAAAAABdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAADbAAAAAADbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAADbAAAAAADbAAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAACHgAAAAACHgAAAAACHgAAAAADeQAAAAAAHQAAAAACHQAAAAABHQAAAAABeQAAAAAAbAAAAAADPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAADeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAeQAAAAAAbAAAAAACPgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHgAAAAAAHgAAAAADHgAAAAAAHgAAAAADHgAAAAAAeQAAAAAAHQAAAAADHQAAAAADHQAAAAACIgAAAAAAbAAAAAAC + tiles: YAAAAAAAWQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAWQAAAAACWQAAAAACWQAAAAADWQAAAAACWQAAAAADYAAAAAAAWQAAAAACWQAAAAACWQAAAAACWQAAAAABWQAAAAAAYAAAAAAAWQAAAAADWQAAAAABWQAAAAABWQAAAAAAWQAAAAADWQAAAAABWQAAAAAAYAAAAAAAWQAAAAACWQAAAAABWQAAAAADWQAAAAABWQAAAAACWQAAAAABYAAAAAAAWQAAAAACWQAAAAACWQAAAAAAYAAAAAAAWQAAAAABYAAAAAAAWQAAAAADWQAAAAAAYAAAAAAAWQAAAAADWQAAAAADWQAAAAABWQAAAAADYAAAAAAAWQAAAAABWQAAAAABWQAAAAAAWQAAAAACWQAAAAADWQAAAAAAYAAAAAAAeQAAAAAAeQAAAAAAWQAAAAABWQAAAAADeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbwAAAAAAbwAAAAADbwAAAAABbwAAAAADeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbwAAAAACbwAAAAABbwAAAAAAbwAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAABeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbwAAAAABbwAAAAADbwAAAAAAbwAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAdgAAAAADeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAADeQAAAAAAeQAAAAAAbAAAAAAAbAAAAAACbAAAAAADbAAAAAACbAAAAAADbAAAAAACdgAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAADbAAAAAACbAAAAAADbAAAAAACbAAAAAAAbAAAAAADbAAAAAADbAAAAAABbAAAAAADbAAAAAADbAAAAAABdgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABbAAAAAADbAAAAAADbAAAAAACbAAAAAADbAAAAAADbAAAAAAAbAAAAAADbAAAAAADbAAAAAAAdgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAbAAAAAABbAAAAAAAbAAAAAADbAAAAAABbAAAAAABbAAAAAABbAAAAAADbAAAAAAAbAAAAAABbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAIgAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAACHgAAAAACHgAAAAACHgAAAAADeQAAAAAAHQAAAAACHQAAAAABHQAAAAABeQAAAAAAbAAAAAADPgAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAHgAAAAABHgAAAAAAHgAAAAAAHgAAAAAAHgAAAAADeQAAAAAAHQAAAAADHQAAAAACHQAAAAAAeQAAAAAAbAAAAAACPgAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAHgAAAAAAHgAAAAADHgAAAAAAHgAAAAADHgAAAAAAeQAAAAAAHQAAAAADHQAAAAADHQAAAAACIgAAAAAAbAAAAAAC version: 6 1,0: ind: 1,0 @@ -88,7 +89,7 @@ entities: version: 6 -2,1: ind: -2,1 - tiles: PgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAHgAAAAAAHgAAAAACHgAAAAABHgAAAAADHgAAAAAAeQAAAAAAHQAAAAAAHQAAAAABHQAAAAABeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAAAMAAAAAADbAAAAAACbAAAAAAAMAAAAAABeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAACeQAAAAAAMAAAAAACeQAAAAAAbAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAMAAAAAABbAAAAAABbAAAAAACMAAAAAAAMAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAMAAAAAADbAAAAAABeQAAAAAAbAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAbAAAAAAAMAAAAAADMAAAAAADeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA + tiles: PgAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAHgAAAAAAHgAAAAACHgAAAAABHgAAAAADHgAAAAAAeQAAAAAAHQAAAAAAHQAAAAABHQAAAAABeQAAAAAAbAAAAAABeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAcQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAbAAAAAADbAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAbAAAAAACbAAAAAABaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAbAAAAAACbAAAAAACeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAAQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAaAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeAAAAAAAAAAAAAAAAAAAAAAAeQAAAAAAeQAAAAAAeQAAAAAAeQAAAAAA version: 6 0,2: ind: 0,2 @@ -252,83 +253,128 @@ entities: color: '#FFFFFFFF' id: Basalt1 decals: - 1352: 25.881918,34.192333 - 1355: 36.05116,32.59352 - 1380: -23.029747,20.063555 + 1340: 25.881918,34.192333 + 1343: 36.05116,32.59352 - node: color: '#FFFFFFFF' id: Basalt5 decals: - 1353: 31.894993,33.661083 - 1365: 25.780825,32.109146 - 1386: -27.154747,21.001055 + 1341: 31.894993,33.661083 + 1353: 25.780825,32.109146 - node: color: '#FFFFFFFF' id: Basalt8 decals: - 1354: 33.992474,34.93727 - 1385: -26.029747,22.04793 + 1342: 33.992474,34.93727 - node: color: '#A46106FF' id: BotLeft decals: - 1109: 22,-28 - 1110: 21,-28 - 1111: 20,-28 - 1112: 20,-27 - 1113: 21,-27 - 1114: 22,-27 - 1115: 15,-22 - 1116: 15,-23 - 1117: 15,-24 - 1118: 15,-25 - 1119: 14,-25 - 1120: 14,-24 - 1121: 14,-23 - 1122: 14,-22 - 1123: 18,-28 - 1124: 18,-27 - 1125: 17,-27 - 1126: 17,-28 - 1127: 16,-27 - 1128: 16,-28 + 1097: 22,-28 + 1098: 21,-28 + 1099: 20,-28 + 1100: 20,-27 + 1101: 21,-27 + 1102: 22,-27 + 1103: 15,-22 + 1104: 15,-23 + 1105: 15,-24 + 1106: 15,-25 + 1107: 14,-25 + 1108: 14,-24 + 1109: 14,-23 + 1110: 14,-22 + 1111: 18,-28 + 1112: 18,-27 + 1113: 17,-27 + 1114: 17,-28 + 1115: 16,-27 + 1116: 16,-28 - node: color: '#FFFFFFFF' id: BotLeft decals: - 1443: 6,-22 - 1444: 6,-21 - 1445: 6,-20 - 1446: 5,-20 - 1447: 4,-20 - 1448: -3,17 - 1449: -2,17 - 1450: -1,17 - 1451: 0,17 + 1417: 6,-22 + 1418: 6,-21 + 1419: 6,-20 + 1420: 5,-20 + 1421: 4,-20 + 1422: -3,17 + 1423: -2,17 + 1424: -1,17 + 1425: 0,17 - node: color: '#EFB341FF' id: BotRight decals: - 1032: 26,-7 - 1033: 26,-6 - 1034: 26,-5 - 1035: 26,-4 - 1036: 27,-4 - 1037: 27,-5 - 1038: 27,-6 - 1039: 27,-7 - 1040: 28,-7 - 1041: 28,-6 - 1042: 28,-5 - 1043: 28,-4 + 1020: 26,-7 + 1021: 26,-6 + 1022: 26,-5 + 1023: 26,-4 + 1024: 27,-4 + 1025: 27,-5 + 1026: 27,-6 + 1027: 27,-7 + 1028: 28,-7 + 1029: 28,-6 + 1030: 28,-5 + 1031: 28,-4 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlayNE + decals: + 1456: -23,24 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlayNW + decals: + 1453: -27,24 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlaySE + decals: + 1454: -23,20 + - node: + color: '#52B4E9FF' + id: BrickCornerOverlaySW + decals: + 1455: -27,20 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayE + decals: + 1466: -23,23 + 1467: -23,22 + 1468: -23,21 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayN + decals: + 1463: -26,24 + 1464: -25,24 + 1465: -24,24 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayS + decals: + 1457: -26,20 + 1458: -25,20 + 1459: -24,20 + - node: + color: '#52B4E9FF' + id: BrickLineOverlayW + decals: + 1460: -27,21 + 1461: -27,22 + 1462: -27,23 - node: color: '#FFFFFFFF' id: BrickTileDarkBox decals: - 955: -17,-9 - 970: -17,-13 - 971: -17,-11 - 972: -17,-15 + 943: -17,-9 + 958: -17,-13 + 959: -17,-11 + 960: -17,-15 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNe @@ -361,12 +407,12 @@ entities: color: '#FFFFFFFF' id: BrickTileDarkEndE decals: - 836: -10,-3 + 824: -10,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkEndW decals: - 833: -12,-3 + 821: -12,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNe @@ -408,7 +454,7 @@ entities: 96: -5,56 97: -6,56 128: -7,46 - 835: -11,-3 + 823: -11,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkLineS @@ -419,7 +465,7 @@ entities: 107: -6,48 108: -5,48 127: -7,44 - 834: -11,-3 + 822: -11,-3 - node: color: '#FFFFFFFF' id: BrickTileDarkLineW @@ -484,13 +530,13 @@ entities: color: '#52B4E9FF' id: BrickTileSteelCornerNe decals: - 746: -19,16 - 747: -23,16 + 734: -19,16 + 735: -23,16 - node: color: '#D381C9FF' id: BrickTileSteelCornerNe decals: - 894: -21,-1 + 882: -21,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerNe @@ -500,21 +546,21 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerNe decals: - 811: 2,-5 - 812: -2,-5 - 1238: -14,-51 - 1245: -41,-18 + 799: 2,-5 + 800: -2,-5 + 1226: -14,-51 + 1233: -41,-18 - node: color: '#52B4E9FF' id: BrickTileSteelCornerNw decals: - 744: -27,16 - 745: -21,16 + 732: -27,16 + 733: -21,16 - node: color: '#D381C9FF' id: BrickTileSteelCornerNw decals: - 895: -23,-1 + 883: -23,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerNw @@ -524,22 +570,22 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerNw decals: - 813: 0,-5 - 814: 4,-5 - 1239: -16,-51 - 1244: -44,-18 + 801: 0,-5 + 802: 4,-5 + 1227: -16,-51 + 1232: -44,-18 - node: color: '#52B4E9FF' id: BrickTileSteelCornerSe decals: - 742: -19,13 - 743: -23,13 + 730: -19,13 + 731: -23,13 - node: color: '#D381C9FF' id: BrickTileSteelCornerSe decals: - 897: -21,-4 - 966: -15,-19 + 885: -21,-4 + 954: -15,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerSe @@ -549,20 +595,20 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerSe decals: - 1243: -14,-52 - 1247: -41,-21 + 1231: -14,-52 + 1235: -41,-21 - node: color: '#52B4E9FF' id: BrickTileSteelCornerSw decals: - 748: -27,13 - 749: -21,13 + 736: -27,13 + 737: -21,13 - node: color: '#D381C9FF' id: BrickTileSteelCornerSw decals: - 896: -23,-4 - 965: -21,-19 + 884: -23,-4 + 953: -21,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelCornerSw @@ -572,41 +618,41 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelCornerSw decals: - 1242: -16,-52 - 1246: -44,-21 + 1230: -16,-52 + 1234: -44,-21 - node: color: '#FFFFFFFF' id: BrickTileSteelEndE decals: - 822: 2,-3 + 810: 2,-3 - node: color: '#FFFFFFFF' id: BrickTileSteelEndW decals: - 823: 4,-3 - 824: 0,-3 + 811: 4,-3 + 812: 0,-3 - node: color: '#52B4E9FF' id: BrickTileSteelLineE decals: - 726: -19,14 - 727: -19,15 - 731: -23,15 - 732: -23,14 + 714: -19,14 + 715: -19,15 + 719: -23,15 + 720: -23,14 - node: color: '#D381C9FF' id: BrickTileSteelLineE decals: - 888: -21,-2 - 889: -21,-3 - 956: -15,-17 - 957: -15,-18 - 1407: -15,-15 - 1408: -15,-14 - 1409: -15,-13 - 1410: -15,-11 - 1411: -15,-10 - 1412: -15,-9 + 876: -21,-2 + 877: -21,-3 + 944: -15,-17 + 945: -15,-18 + 1381: -15,-15 + 1382: -15,-14 + 1383: -15,-13 + 1384: -15,-11 + 1385: -15,-10 + 1386: -15,-9 - node: color: '#DE3A3AFF' id: BrickTileSteelLineE @@ -616,23 +662,23 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelLineE decals: - 820: -2,-6 - 821: 2,-6 - 1250: -41,-19 - 1251: -41,-20 + 808: -2,-6 + 809: 2,-6 + 1238: -41,-19 + 1239: -41,-20 - node: color: '#52B4E9FF' id: BrickTileSteelLineN decals: - 728: -24,16 - 729: -25,16 - 730: -26,16 - 741: -20,16 + 716: -24,16 + 717: -25,16 + 718: -26,16 + 729: -20,16 - node: color: '#D381C9FF' id: BrickTileSteelLineN decals: - 890: -22,-1 + 878: -22,-1 - node: color: '#DE3A3AFF' id: BrickTileSteelLineN @@ -645,32 +691,32 @@ entities: id: BrickTileSteelLineN decals: 215: -4,26 - 815: -3,-5 - 816: 1,-5 - 817: 5,-5 - 825: 1,-3 - 828: 5,-3 - 1240: -15,-51 - 1248: -43,-18 - 1249: -42,-18 + 803: -3,-5 + 804: 1,-5 + 805: 5,-5 + 813: 1,-3 + 816: 5,-3 + 1228: -15,-51 + 1236: -43,-18 + 1237: -42,-18 - node: color: '#52B4E9FF' id: BrickTileSteelLineS decals: - 737: -26,13 - 738: -25,13 - 739: -24,13 - 740: -20,13 + 725: -26,13 + 726: -25,13 + 727: -24,13 + 728: -20,13 - node: color: '#D381C9FF' id: BrickTileSteelLineS decals: - 891: -22,-4 - 958: -17,-19 - 959: -16,-19 - 960: -18,-19 - 961: -19,-19 - 962: -20,-19 + 879: -22,-4 + 946: -17,-19 + 947: -16,-19 + 948: -18,-19 + 949: -19,-19 + 950: -20,-19 - node: color: '#DE3A3AFF' id: BrickTileSteelLineS @@ -682,38 +728,38 @@ entities: color: '#FFFFFFFF' id: BrickTileSteelLineS decals: - 826: 1,-3 - 827: 5,-3 - 1241: -15,-52 - 1254: -43,-21 - 1255: -42,-21 - 1454: -3,-3 - 1455: -2,-3 - 1456: -1,-3 + 814: 1,-3 + 815: 5,-3 + 1229: -15,-52 + 1242: -43,-21 + 1243: -42,-21 + 1428: -3,-3 + 1429: -2,-3 + 1430: -1,-3 - node: color: '#52B4E9FF' id: BrickTileSteelLineW decals: - 733: -27,15 - 734: -27,14 - 735: -21,15 - 736: -21,14 + 721: -27,15 + 722: -27,14 + 723: -21,15 + 724: -21,14 - node: color: '#D381C9FF' id: BrickTileSteelLineW decals: - 892: -23,-3 - 893: -23,-2 - 963: -21,-18 - 964: -21,-17 - 1413: -18,-15 - 1414: -18,-14 - 1415: -18,-13 - 1416: -18,-11 - 1417: -18,-10 - 1418: -18,-9 - 1420: -18,-12 - 1421: -18,-16 + 880: -23,-3 + 881: -23,-2 + 951: -21,-18 + 952: -21,-17 + 1387: -18,-15 + 1388: -18,-14 + 1389: -18,-13 + 1390: -18,-11 + 1391: -18,-10 + 1392: -18,-9 + 1394: -18,-12 + 1395: -18,-16 - node: color: '#DE3A3AFF' id: BrickTileSteelLineW @@ -724,40 +770,37 @@ entities: id: BrickTileSteelLineW decals: 214: 2,28 - 818: 4,-6 - 819: 0,-6 - 1252: -44,-19 - 1253: -44,-20 + 806: 4,-6 + 807: 0,-6 + 1240: -44,-19 + 1241: -44,-20 - node: color: '#EFB341FF' id: BrickTileWhiteBox decals: - 1104: 19,-15 + 1092: 19,-15 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerNe decals: - 629: -21,6 - 630: -18,6 - 631: -15,6 - 775: -9,6 + 763: -9,6 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerNe decals: - 1299: 46,28 - 1322: 43,27 + 1287: 46,28 + 1310: 43,27 - node: color: '#9FED58FF' id: BrickTileWhiteCornerNe decals: - 705: -11,21 - 708: -11,19 + 693: -11,21 + 696: -11,19 - node: color: '#A46106FF' id: BrickTileWhiteCornerNe decals: - 1161: 11,-18 + 1149: 11,-18 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNe @@ -767,38 +810,35 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerNe decals: - 1092: 20,-14 - 1108: 21,-6 + 1080: 20,-14 + 1096: 21,-6 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe decals: - 806: 4,2 + 794: 4,2 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerNw decals: - 626: -22,6 - 627: -19,6 - 628: -16,6 - 772: -10,6 + 760: -10,6 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerNw decals: - 1300: 39,28 - 1321: 42,27 + 1288: 39,28 + 1309: 42,27 - node: color: '#9FED58FF' id: BrickTileWhiteCornerNw decals: - 703: -12,21 - 707: -12,19 + 691: -12,21 + 695: -12,19 - node: color: '#A46106FF' id: BrickTileWhiteCornerNw decals: - 1226: 8,-18 + 1214: 8,-18 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNw @@ -808,43 +848,40 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerNw decals: - 1093: 16,-14 - 1107: 20,-6 + 1081: 16,-14 + 1095: 20,-6 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw decals: - 803: 1,2 + 791: 1,2 - node: color: '#334E6DFF' id: BrickTileWhiteCornerSe decals: - 1295: 44,33 + 1283: 44,33 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerSe decals: - 632: -21,5 - 633: -18,5 - 634: -15,5 - 773: -9,5 + 761: -9,5 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerSe decals: - 1317: 46,25 - 1320: 43,26 + 1305: 46,25 + 1308: 43,26 - node: color: '#9FED58FF' id: BrickTileWhiteCornerSe decals: - 704: -11,18 - 706: -11,20 + 692: -11,18 + 694: -11,20 - node: color: '#A46106FF' id: BrickTileWhiteCornerSe decals: - 1160: 11,-24 + 1148: 11,-24 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSe @@ -854,38 +891,35 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerSe decals: - 1094: 20,-16 - 1105: 21,-7 + 1082: 20,-16 + 1093: 21,-7 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe decals: - 804: 4,1 + 792: 4,1 - node: color: '#334E6DFF' id: BrickTileWhiteCornerSw decals: - 1296: 41,33 + 1284: 41,33 - node: color: '#52B4E9FF' id: BrickTileWhiteCornerSw decals: - 635: -22,5 - 636: -19,5 - 637: -16,5 - 774: -10,5 + 762: -10,5 - node: color: '#9D9D97FF' id: BrickTileWhiteCornerSw decals: - 1318: 39,25 - 1319: 42,26 + 1306: 39,25 + 1307: 42,26 - node: color: '#9FED58FF' id: BrickTileWhiteCornerSw decals: - 702: -12,18 - 709: -12,20 + 690: -12,18 + 697: -12,20 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSw @@ -895,13 +929,13 @@ entities: color: '#EFB341FF' id: BrickTileWhiteCornerSw decals: - 1095: 16,-16 - 1106: 20,-7 + 1083: 16,-16 + 1094: 20,-7 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw decals: - 805: 1,1 + 793: 1,1 - node: color: '#9FED5896' id: BrickTileWhiteInnerNe @@ -926,7 +960,7 @@ entities: color: '#FFFFFFFF' id: BrickTileWhiteInnerNe decals: - 1234: -5,-25 + 1222: -5,-25 - node: color: '#9FED5896' id: BrickTileWhiteInnerNw @@ -937,7 +971,7 @@ entities: id: BrickTileWhiteInnerNw decals: 180: 1,54 - 1225: 8,-19 + 1213: 8,-19 - node: color: '#D381C9FF' id: BrickTileWhiteInnerNw @@ -947,7 +981,7 @@ entities: color: '#FFFFFFFF' id: BrickTileWhiteInnerNw decals: - 1392: -3,-25 + 1366: -3,-25 - node: color: '#D381C9FF' id: BrickTileWhiteInnerSe @@ -977,28 +1011,28 @@ entities: color: '#334E6DFF' id: BrickTileWhiteLineE decals: - 1294: 44,34 + 1282: 44,34 - node: color: '#7C5C98FF' id: BrickTileWhiteLineE decals: - 1393: 9,-2 + 1367: 9,-2 - node: color: '#9D9D97FF' id: BrickTileWhiteLineE decals: - 1307: 46,27 - 1308: 46,26 + 1295: 46,27 + 1296: 46,26 - node: color: '#A46106FF' id: BrickTileWhiteLineE decals: - 1152: 11,-19 - 1153: 11,-20 - 1154: 11,-21 - 1155: 11,-22 - 1156: 11,-23 - 1224: 7,-18 + 1140: 11,-19 + 1141: 11,-20 + 1142: 11,-21 + 1143: 11,-22 + 1144: 11,-23 + 1212: 7,-18 - node: color: '#BDFF8593' id: BrickTileWhiteLineE @@ -1015,17 +1049,17 @@ entities: id: BrickTileWhiteLineE decals: 166: 1,53 - 1102: 20,-15 + 1090: 20,-15 - node: color: '#9D9D97FF' id: BrickTileWhiteLineN decals: - 1301: 40,28 - 1302: 41,28 - 1303: 42,28 - 1304: 43,28 - 1305: 44,28 - 1306: 45,28 + 1289: 40,28 + 1290: 41,28 + 1291: 42,28 + 1292: 43,28 + 1293: 44,28 + 1294: 45,28 - node: color: '#9FED5896' id: BrickTileWhiteLineN @@ -1038,8 +1072,8 @@ entities: decals: 177: -1,54 178: 0,54 - 1150: 9,-18 - 1151: 10,-18 + 1138: 9,-18 + 1139: 10,-18 - node: color: '#BDFF8593' id: BrickTileWhiteLineN @@ -1065,26 +1099,26 @@ entities: decals: 169: 2,52 170: 3,52 - 1096: 17,-14 - 1097: 18,-14 - 1098: 19,-14 + 1084: 17,-14 + 1085: 18,-14 + 1086: 19,-14 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineN decals: - 807: 2,2 - 808: 3,2 - 829: 3,-1 - 830: 4,-1 - 1233: -4,-25 + 795: 2,2 + 796: 3,2 + 817: 3,-1 + 818: 4,-1 + 1221: -4,-25 - node: color: '#334E6DFF' id: BrickTileWhiteLineS decals: 141: 2,50 142: 3,50 - 1291: 42,33 - 1292: 43,33 + 1279: 42,33 + 1280: 43,33 - node: color: '#52B4E9FF' id: BrickTileWhiteLineS @@ -1092,23 +1126,23 @@ entities: 138: -1,50 139: 0,50 140: 1,50 - 1327: -4,-34 + 1315: -4,-34 - node: color: '#7C5C98FF' id: BrickTileWhiteLineS decals: - 1398: 14,1 - 1399: 15,1 + 1372: 14,1 + 1373: 15,1 - node: color: '#9D9D97FF' id: BrickTileWhiteLineS decals: - 1309: 45,25 - 1310: 44,25 - 1311: 43,25 - 1312: 42,25 - 1313: 41,25 - 1314: 40,25 + 1297: 45,25 + 1298: 44,25 + 1299: 43,25 + 1300: 42,25 + 1301: 41,25 + 1302: 40,25 - node: color: '#9FED5896' id: BrickTileWhiteLineS @@ -1119,17 +1153,17 @@ entities: color: '#A46106FF' id: BrickTileWhiteLineS decals: - 1157: 8,-24 - 1158: 9,-24 - 1159: 10,-24 - 1328: -3,-34 + 1145: 8,-24 + 1146: 9,-24 + 1147: 10,-24 + 1316: -3,-34 - node: color: '#D381C9FF' id: BrickTileWhiteLineS decals: 152: -1,52 153: 0,52 - 1329: -5,-34 + 1317: -5,-34 - node: color: '#DE3A3A96' id: BrickTileWhiteLineS @@ -1143,37 +1177,37 @@ entities: decals: 167: 2,54 168: 3,54 - 1099: 17,-16 - 1100: 18,-16 - 1101: 19,-16 - 1326: -2,-34 + 1087: 17,-16 + 1088: 18,-16 + 1089: 19,-16 + 1314: -2,-34 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineS decals: - 809: 2,1 - 810: 3,1 + 797: 2,1 + 798: 3,1 - node: color: '#334E6DC8' id: BrickTileWhiteLineW decals: - 1323: -7,-32 + 1311: -7,-32 - node: color: '#334E6DFF' id: BrickTileWhiteLineW decals: - 1293: 41,34 + 1281: 41,34 - node: color: '#70707093' id: BrickTileWhiteLineW decals: - 1325: -7,-34 + 1313: -7,-34 - node: color: '#9D9D97FF' id: BrickTileWhiteLineW decals: - 1315: 39,26 - 1316: 39,27 + 1303: 39,26 + 1304: 39,27 - node: color: '#9FED5896' id: BrickTileWhiteLineW @@ -1188,7 +1222,7 @@ entities: color: '#C78B1993' id: BrickTileWhiteLineW decals: - 1324: -7,-33 + 1312: -7,-33 - node: color: '#D381C9FF' id: BrickTileWhiteLineW @@ -1203,128 +1237,114 @@ entities: color: '#EFB341FF' id: BrickTileWhiteLineW decals: - 1103: 16,-15 + 1091: 16,-15 - node: color: '#FFFFFFFF' id: Busha1 decals: - 1348: 28.377537,33.036083 - 1378: -25.060997,23.98543 + 1336: 28.377537,33.036083 - node: color: '#FFFFFFFF' id: Bushb2 decals: - 1343: 22.922419,33.036083 - 1344: 19.880083,33.942333 - - node: - color: '#FFFFFFFF' - id: Bushb3 - decals: - 1377: -23.045372,22.032305 + 1331: 22.922419,33.036083 + 1332: 19.880083,33.942333 - node: color: '#FFFFFFFF' id: Bushc1 decals: - 1345: 18.98016,34.92671 - 1346: 19.38641,32.098583 - 1347: 24.355186,34.536083 + 1333: 18.98016,34.92671 + 1334: 19.38641,32.098583 + 1335: 24.355186,34.536083 - node: color: '#FFFFFFFF' id: Bushc2 decals: - 1369: 34.975742,34.972504 - 1387: -22.967247,20.969805 + 1357: 34.975742,34.972504 - node: color: '#FFFFFFFF' id: Bushi1 decals: - 1367: 28.499575,31.984146 - 1368: 36.95945,33.952896 - 1379: -26.967247,21.92293 - 1381: -23.998497,23.938555 - - node: - color: '#FFFFFFFF' - id: Bushi2 - decals: - 1384: -26.014122,20.92293 + 1355: 28.499575,31.984146 + 1356: 36.95945,33.952896 - node: color: '#FFFFFFFF' id: Bushi3 decals: - 1366: 27.04645,31.937271 + 1354: 27.04645,31.937271 - node: color: '#FFFFFFFF' id: Bushi4 decals: - 1349: 31.565037,34.80171 - 1350: 32.45566,32.92671 - 1351: 29.877537,34.89546 + 1337: 31.565037,34.80171 + 1338: 32.45566,32.92671 + 1339: 29.877537,34.89546 - node: color: '#FFFFFFFF' id: Caution decals: - 978: -27,-6 - 1131: 11,-28 - 1132: 13,-28 - 1232: -41,16 + 966: -27,-6 + 1119: 11,-28 + 1120: 13,-28 + 1220: -41,16 - node: color: '#000000FF' id: CheckerNESW decals: - 776: 0,3 - 777: 1,3 - 778: 2,3 - 779: 3,3 - 780: 4,3 - 781: 5,3 - 782: 5,2 - 783: 0,2 - 784: 0,1 - 785: 5,1 - 786: 5,0 - 787: 4,0 - 788: 3,0 - 789: 2,0 - 790: 1,0 - 791: 0,0 - 792: 4,4 - 793: 3,4 - 794: 6,2 + 764: 0,3 + 765: 1,3 + 766: 2,3 + 767: 3,3 + 768: 4,3 + 769: 5,3 + 770: 5,2 + 771: 0,2 + 772: 0,1 + 773: 5,1 + 774: 5,0 + 775: 4,0 + 776: 3,0 + 777: 2,0 + 778: 1,0 + 779: 0,0 + 780: 4,4 + 781: 3,4 + 782: 6,2 - node: color: '#52B4E996' id: CheckerNESW decals: - 638: -17,12 - 639: -16,12 - 640: -17,13 - 641: -16,13 - 642: -17,14 - 643: -16,14 - 644: -17,15 - 645: -16,15 - 646: -16,16 - 647: -17,16 + 626: -17,12 + 627: -16,12 + 628: -17,13 + 629: -16,13 + 630: -17,14 + 631: -16,14 + 632: -17,15 + 633: -16,15 + 634: -16,16 + 635: -17,16 - node: color: '#A4610696' id: CheckerNESW decals: - 1215: 6,-28 - 1216: 6,-27 - 1217: 6,-26 - 1218: 5,-26 - 1219: 5,-27 - 1220: 5,-28 - 1221: 4,-28 - 1222: 4,-27 - 1223: 4,-26 + 1203: 6,-28 + 1204: 6,-27 + 1205: 6,-26 + 1206: 5,-26 + 1207: 5,-27 + 1208: 5,-28 + 1209: 4,-28 + 1210: 4,-27 + 1211: 4,-26 - node: color: '#D381C996' id: CheckerNESW decals: - 937: -13,-7 - 938: -13,-6 - 939: -12,-6 - 940: -12,-7 + 925: -13,-7 + 926: -13,-6 + 927: -12,-6 + 928: -12,-7 - node: color: '#DE3A3A96' id: CheckerNESW @@ -1376,18 +1396,18 @@ entities: color: '#52B4E996' id: CheckerNWSE decals: - 690: -8,8 - 691: -9,8 - 692: -10,8 - 693: -10,9 - 694: -9,9 - 695: -8,9 - 696: -8,10 - 697: -9,10 - 698: -10,10 - 699: -10,11 - 700: -9,11 - 701: -8,11 + 678: -8,8 + 679: -9,8 + 680: -10,8 + 681: -10,9 + 682: -9,9 + 683: -8,9 + 684: -8,10 + 685: -9,10 + 686: -10,10 + 687: -10,11 + 688: -9,11 + 689: -8,11 - node: color: '#DE3A3A96' id: CheckerNWSE @@ -1407,34 +1427,34 @@ entities: color: '#EFB34196' id: CheckerNWSE decals: - 1005: 17,-5 - 1006: 16,-5 - 1007: 15,-5 + 993: 17,-5 + 994: 16,-5 + 995: 15,-5 - node: color: '#FFFFFFFF' id: Delivery decals: - 976: -21,-14 - 977: -21,-10 - 1256: -6,52 - 1257: -7,53 - 1258: -8,52 - 1259: -7,51 - 1389: 11,27 - 1390: 12,27 - 1391: 13,27 + 964: -21,-14 + 965: -21,-10 + 1244: -6,52 + 1245: -7,53 + 1246: -8,52 + 1247: -7,51 + 1363: 11,27 + 1364: 12,27 + 1365: 13,27 - node: color: '#000000FF' id: DiagonalCheckerAOverlay decals: - 795: 2,2 - 796: 3,1 - 797: 1,1 - 798: 4,2 - 799: 2,1 - 800: 1,2 - 801: 3,2 - 802: 4,1 + 783: 2,2 + 784: 3,1 + 785: 1,1 + 786: 4,2 + 787: 2,1 + 788: 1,2 + 789: 3,2 + 790: 4,1 - node: color: '#334E6DC8' id: FullTileOverlayGreyscale @@ -1471,52 +1491,50 @@ entities: color: '#FFFFFFFF' id: Grassa3 decals: - 1338: 25.518755,33.161083 - 1339: 28.102278,34.536083 - 1340: 30.90701,33.067333 - 1382: -24.060997,21.969805 + 1326: 25.518755,33.161083 + 1327: 28.102278,34.536083 + 1328: 30.90701,33.067333 - node: color: '#FFFFFFFF' id: Grassc1 decals: - 1341: 33.051407,34.442333 - 1342: 35.00453,33.848583 + 1329: 33.051407,34.442333 + 1330: 35.00453,33.848583 - node: color: '#FFFFFFFF' id: Grassd1 decals: - 1337: 22.28438,34.23921 + 1325: 22.28438,34.23921 - node: color: '#FFFFFFFF' id: Grassd3 decals: - 1363: 28.9527,33.984146 - 1364: 26.85895,32.952896 + 1351: 28.9527,33.984146 + 1352: 26.85895,32.952896 - node: color: '#FFFFFFFF' id: Grasse1 decals: - 1362: 21.980526,32.077896 + 1350: 21.980526,32.077896 - node: color: '#FFFFFFFF' id: Grasse2 decals: - 1359: 23.027401,35.28102 - 1360: 24.996151,35.327896 - 1361: 23.902401,32.12477 + 1347: 23.027401,35.28102 + 1348: 24.996151,35.327896 + 1349: 23.902401,32.12477 - node: color: '#FFFFFFFF' id: Grasse3 decals: - 1356: 20.983843,34.62477 - 1357: 19.968218,33.077896 - 1358: 23.34307,34.234146 - 1383: -25.998497,19.938555 + 1344: 20.983843,34.62477 + 1345: 19.968218,33.077896 + 1346: 23.34307,34.234146 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale decals: - 1427: 32,-17 + 1401: 32,-17 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale @@ -1547,10 +1565,14 @@ entities: 467: 21,7 468: 22,7 471: 22,3 - 714: -17,21 - 715: -16,21 - 716: -15,21 - 717: -14,21 + 702: -17,21 + 703: -16,21 + 704: -15,21 + 705: -14,21 + 1474: -21,5 + 1475: -20,5 + 1476: -16,5 + 1477: -15,5 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale @@ -1560,11 +1582,11 @@ entities: color: '#D381C996' id: HalfTileOverlayGreyscale decals: - 843: -11,-2 - 844: -10,-2 - 898: -18,-1 - 899: -17,-1 - 900: -16,-1 + 831: -11,-2 + 832: -10,-2 + 886: -18,-1 + 887: -17,-1 + 888: -16,-1 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale @@ -1586,15 +1608,15 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale decals: - 1077: 12,-11 - 1078: 13,-11 - 1079: 14,-11 - 1080: 15,-11 + 1065: 12,-11 + 1066: 13,-11 + 1067: 14,-11 + 1068: 15,-11 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale180 decals: - 1428: 32,-19 + 1402: 32,-19 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale180 @@ -1617,10 +1639,11 @@ entities: decals: 469: 21,5 470: 22,5 - 710: -17,18 - 711: -16,18 - 712: -15,18 - 713: -14,18 + 698: -17,18 + 699: -16,18 + 700: -15,18 + 701: -14,18 + 1471: -18,5 - node: color: '#707070FF' id: HalfTileOverlayGreyscale180 @@ -1638,12 +1661,12 @@ entities: color: '#D381C996' id: HalfTileOverlayGreyscale180 decals: - 845: -12,-4 - 846: -11,-4 - 847: -10,-4 - 905: -16,-7 - 906: -17,-7 - 907: -18,-7 + 833: -12,-4 + 834: -11,-4 + 835: -10,-4 + 893: -16,-7 + 894: -17,-7 + 895: -18,-7 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale180 @@ -1663,14 +1686,14 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale180 decals: - 1074: 15,-12 - 1075: 12,-13 - 1076: 13,-13 + 1062: 15,-12 + 1063: 12,-13 + 1064: 13,-13 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale270 decals: - 1430: 31,-18 + 1404: 31,-18 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 @@ -1691,9 +1714,11 @@ entities: id: HalfTileOverlayGreyscale270 decals: 473: 20,6 - 669: -27,10 - 720: -18,20 - 725: -18,19 + 657: -27,10 + 708: -18,20 + 713: -18,19 + 1478: -22,6 + 1479: -22,7 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale270 @@ -1703,17 +1728,17 @@ entities: color: '#A4610696' id: HalfTileOverlayGreyscale270 decals: - 1200: 8,-27 + 1188: 8,-27 - node: color: '#D381C996' id: HalfTileOverlayGreyscale270 decals: - 849: -13,-3 - 850: -13,-2 - 908: -19,-6 - 909: -19,-5 - 910: -19,-4 - 911: -19,-2 + 837: -13,-3 + 838: -13,-2 + 896: -19,-6 + 897: -19,-5 + 898: -19,-4 + 899: -19,-2 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 @@ -1733,13 +1758,13 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale270 decals: - 1018: 15,-8 - 1081: 11,-12 + 1006: 15,-8 + 1069: 11,-12 - node: color: '#2BAF9D93' id: HalfTileOverlayGreyscale90 decals: - 1429: 33,-18 + 1403: 33,-18 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale90 @@ -1761,10 +1786,10 @@ entities: id: HalfTileOverlayGreyscale90 decals: 472: 23,6 - 667: -12,10 - 668: -12,9 - 718: -13,20 - 719: -13,19 + 655: -12,10 + 656: -12,9 + 706: -13,20 + 707: -13,19 - node: color: '#707070FF' id: HalfTileOverlayGreyscale90 @@ -1783,18 +1808,18 @@ entities: color: '#A4610696' id: HalfTileOverlayGreyscale90 decals: - 1141: 6,-23 - 1142: 6,-22 - 1143: 6,-21 + 1129: 6,-23 + 1130: 6,-22 + 1131: 6,-21 - node: color: '#D381C996' id: HalfTileOverlayGreyscale90 decals: - 848: -9,-3 - 901: -15,-2 - 902: -15,-4 - 903: -15,-5 - 904: -15,-6 + 836: -9,-3 + 889: -15,-2 + 890: -15,-4 + 891: -15,-5 + 892: -15,-6 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale90 @@ -1813,71 +1838,71 @@ entities: color: '#EFB34196' id: HalfTileOverlayGreyscale90 decals: - 982: 13,-8 - 983: 13,-7 - 984: 13,-6 - 1017: 16,-8 + 970: 13,-8 + 971: 13,-7 + 972: 13,-6 + 1005: 16,-8 - node: color: '#FFFFFFFF' id: LoadingArea decals: - 1452: 1,17 + 1426: 1,17 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: LoadingArea decals: - 1453: 6,-23 + 1427: 6,-23 - node: color: '#D381C9FF' id: MiniTileSteelCornerNe decals: - 883: -32,-7 + 871: -32,-7 - node: color: '#D381C9FF' id: MiniTileSteelCornerNw decals: - 885: -31,-7 + 873: -31,-7 - node: color: '#D381C9FF' id: MiniTileSteelCornerSe decals: - 878: -25,-4 + 866: -25,-4 - node: color: '#D381C9FF' id: MiniTileSteelCornerSw decals: - 879: -29,-4 + 867: -29,-4 - node: color: '#D381C9FF' id: MiniTileSteelInnerNw decals: - 884: -30,-7 + 872: -30,-7 - node: color: '#D381C9FF' id: MiniTileSteelLineE decals: - 875: -25,-3 - 876: -25,-2 - 877: -25,-1 - 887: -32,-8 + 863: -25,-3 + 864: -25,-2 + 865: -25,-1 + 875: -32,-8 - node: color: '#D381C9FF' id: MiniTileSteelLineS decals: - 872: -28,-4 - 873: -27,-4 - 874: -26,-4 - 881: -32,-6 - 882: -31,-6 + 860: -28,-4 + 861: -27,-4 + 862: -26,-4 + 869: -32,-6 + 870: -31,-6 - node: color: '#D381C9FF' id: MiniTileSteelLineW decals: - 869: -29,-1 - 870: -29,-2 - 871: -29,-3 - 886: -31,-8 + 857: -29,-1 + 858: -29,-2 + 859: -29,-3 + 874: -31,-8 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerNe @@ -1887,8 +1912,8 @@ entities: color: '#EF7241FF' id: MiniTileWhiteCornerNe decals: - 750: -11,16 - 751: -9,14 + 738: -11,16 + 739: -9,14 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerNw @@ -1898,7 +1923,7 @@ entities: color: '#EF7241FF' id: MiniTileWhiteCornerNw decals: - 754: -14,16 + 742: -14,16 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerSe @@ -1908,12 +1933,12 @@ entities: color: '#D381C9FF' id: MiniTileWhiteCornerSe decals: - 923: -25,-8 + 911: -25,-8 - node: color: '#EF7241FF' id: MiniTileWhiteCornerSe decals: - 752: -9,13 + 740: -9,13 - node: color: '#52B4E9FF' id: MiniTileWhiteCornerSw @@ -1923,33 +1948,33 @@ entities: color: '#D381C9FF' id: MiniTileWhiteCornerSw decals: - 924: -29,-8 + 912: -29,-8 - node: color: '#EF7241FF' id: MiniTileWhiteCornerSw decals: - 753: -14,13 + 741: -14,13 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerNe decals: - 1396: 9,-3 + 1370: 9,-3 - node: color: '#EF7241FF' id: MiniTileWhiteInnerNe decals: - 764: -11,14 + 752: -11,14 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerSe decals: - 1394: 13,1 - 1395: 9,-1 + 1368: 13,1 + 1369: 9,-1 - node: color: '#7C5C98FF' id: MiniTileWhiteInnerSw decals: - 1397: 16,1 + 1371: 16,1 - node: color: '#52B4E9FF' id: MiniTileWhiteLineE @@ -1959,13 +1984,13 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineE decals: - 916: -25,-6 - 917: -25,-7 + 904: -25,-6 + 905: -25,-7 - node: color: '#EF7241FF' id: MiniTileWhiteLineE decals: - 759: -11,15 + 747: -11,15 - node: color: '#52B4E9FF' id: MiniTileWhiteLineN @@ -1976,16 +2001,16 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineN decals: - 925: -21,-6 - 926: -22,-6 - 927: -23,-6 + 913: -21,-6 + 914: -22,-6 + 915: -23,-6 - node: color: '#EF7241FF' id: MiniTileWhiteLineN decals: - 762: -13,16 - 763: -12,16 - 765: -10,14 + 750: -13,16 + 751: -12,16 + 753: -10,14 - node: color: '#52B4E9FF' id: MiniTileWhiteLineS @@ -1997,20 +2022,20 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineS decals: - 918: -26,-8 - 919: -27,-8 - 920: -28,-8 - 928: -23,-7 - 929: -22,-7 - 930: -21,-7 + 906: -26,-8 + 907: -27,-8 + 908: -28,-8 + 916: -23,-7 + 917: -22,-7 + 918: -21,-7 - node: color: '#EF7241FF' id: MiniTileWhiteLineS decals: - 755: -13,13 - 756: -12,13 - 757: -11,13 - 758: -10,13 + 743: -13,13 + 744: -12,13 + 745: -11,13 + 746: -10,13 - node: color: '#52B4E9FF' id: MiniTileWhiteLineW @@ -2020,19 +2045,19 @@ entities: color: '#D381C9FF' id: MiniTileWhiteLineW decals: - 921: -29,-7 - 922: -29,-6 + 909: -29,-7 + 910: -29,-6 - node: color: '#EF7241FF' id: MiniTileWhiteLineW decals: - 760: -14,14 - 761: -14,15 + 748: -14,14 + 749: -14,15 - node: color: '#334E6DC8' id: MonoOverlay decals: - 1332: -8,-32 + 1320: -8,-32 - node: color: '#52B4E996' id: MonoOverlay @@ -2041,13 +2066,13 @@ entities: 623: -11,9 624: -11,6 625: -11,5 - 766: -10,7 - 767: -9,7 - 768: -13,12 - 769: -10,12 - 770: -9,12 - 771: -15,15 - 1331: -4,-35 + 754: -10,7 + 755: -9,7 + 756: -13,12 + 757: -10,12 + 758: -9,12 + 759: -15,15 + 1319: -4,-35 - node: color: '#52B4E9FF' id: MonoOverlay @@ -2057,88 +2082,88 @@ entities: color: '#70707093' id: MonoOverlay decals: - 1334: -8,-34 + 1322: -8,-34 - node: color: '#A14F9793' id: MonoOverlay decals: - 865: -27,-3 - 866: -28,-2 - 867: -27,-1 - 868: -26,-2 - 880: -27,-5 + 853: -27,-3 + 854: -28,-2 + 855: -27,-1 + 856: -26,-2 + 868: -27,-5 - node: color: '#A4610696' id: MonoOverlay decals: - 1162: 5,-25 - 1163: 7,-27 - 1164: 9,-25 - 1165: 10,-25 - 1166: 12,-23 - 1167: 12,-22 - 1168: 7,-22 - 1169: 7,-21 - 1170: 7,-24 - 1173: 17,-22 - 1174: 17,-23 - 1336: -3,-35 + 1150: 5,-25 + 1151: 7,-27 + 1152: 9,-25 + 1153: 10,-25 + 1154: 12,-23 + 1155: 12,-22 + 1156: 7,-22 + 1157: 7,-21 + 1158: 7,-24 + 1161: 17,-22 + 1162: 17,-23 + 1324: -3,-35 - node: color: '#A46106FF' id: MonoOverlay decals: - 1171: 20,-25 - 1172: 21,-25 + 1159: 20,-25 + 1160: 21,-25 - node: color: '#C78B1993' id: MonoOverlay decals: - 1333: -8,-33 + 1321: -8,-33 - node: color: '#D381C996' id: MonoOverlay decals: - 941: -13,-8 - 942: -12,-8 - 943: -11,-7 - 944: -11,-6 - 945: -12,-5 - 946: -13,-5 - 947: -17,-8 - 1330: -5,-35 + 929: -13,-8 + 930: -12,-8 + 931: -11,-7 + 932: -11,-6 + 933: -12,-5 + 934: -13,-5 + 935: -17,-8 + 1318: -5,-35 - node: color: '#D381C9FF' id: MonoOverlay decals: - 931: -24,-6 - 932: -24,-7 - 933: -20,-6 - 934: -20,-7 - 935: -14,-7 - 936: -14,-6 + 919: -24,-6 + 920: -24,-7 + 921: -20,-6 + 922: -20,-7 + 923: -14,-7 + 924: -14,-6 - node: color: '#EF663193' id: MonoOverlay decals: - 1372: 34,23 + 1360: 34,23 - node: color: '#EFB34196' id: MonoOverlay decals: - 1019: 14,-8 - 1020: 14,-7 - 1021: 15,-6 - 1022: 16,-6 - 1023: 22,-10 - 1024: 23,-10 - 1025: 24,-8 - 1026: 27,-10 - 1027: 17,-11 - 1028: 17,-12 - 1029: 25,-13 - 1030: 30,-12 - 1031: 30,-11 - 1335: -2,-35 + 1007: 14,-8 + 1008: 14,-7 + 1009: 15,-6 + 1010: 16,-6 + 1011: 22,-10 + 1012: 23,-10 + 1013: 24,-8 + 1014: 27,-10 + 1015: 17,-11 + 1016: 17,-12 + 1017: 25,-13 + 1018: 30,-12 + 1019: 30,-11 + 1323: -2,-35 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale @@ -2158,8 +2183,8 @@ entities: 619: -7,12 620: -7,13 621: -7,14 - 685: -13,7 - 686: -13,6 + 673: -13,7 + 674: -13,6 - node: color: '#79150096' id: QuarterTileOverlayGreyscale @@ -2189,25 +2214,25 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale decals: - 1147: 5,-20 - 1148: 4,-20 - 1149: 3,-20 - 1189: 13,-21 - 1190: 13,-22 - 1191: 13,-24 - 1192: 13,-23 - 1193: 13,-25 - 1194: 13,-26 - 1195: 12,-26 - 1196: 11,-26 - 1197: 10,-26 - 1198: 9,-26 - 1199: 8,-26 + 1135: 5,-20 + 1136: 4,-20 + 1137: 3,-20 + 1177: 13,-21 + 1178: 13,-22 + 1179: 13,-24 + 1180: 13,-23 + 1181: 13,-25 + 1182: 13,-26 + 1183: 12,-26 + 1184: 11,-26 + 1185: 10,-26 + 1186: 9,-26 + 1187: 8,-26 - node: color: '#B02E26FF' id: QuarterTileOverlayGreyscale decals: - 1297: 42,29 + 1285: 42,29 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale @@ -2224,8 +2249,8 @@ entities: id: QuarterTileOverlayGreyscale decals: 461: 31,10 - 1459: 10,-5 - 1460: 11,-5 + 1433: 10,-5 + 1434: 11,-5 - node: color: '#EF5C1F93' id: QuarterTileOverlayGreyscale @@ -2235,60 +2260,60 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale decals: - 985: 12,-5 - 987: 18,-5 - 988: 18,-4 - 989: 19,-4 - 990: 20,-4 - 991: 21,-4 - 992: 22,-4 - 1002: 18,-8 - 1003: 18,-7 - 1004: 18,-6 - 1054: 28,-11 - 1055: 27,-11 - 1056: 26,-11 - 1057: 25,-11 - 1058: 24,-11 - 1083: 25,-8 - 1084: 25,-7 - 1085: 25,-6 - 1086: 25,-5 - 1087: 25,-4 + 973: 12,-5 + 975: 18,-5 + 976: 18,-4 + 977: 19,-4 + 978: 20,-4 + 979: 21,-4 + 980: 22,-4 + 990: 18,-8 + 991: 18,-7 + 992: 18,-6 + 1042: 28,-11 + 1043: 27,-11 + 1044: 26,-11 + 1045: 25,-11 + 1046: 24,-11 + 1071: 25,-8 + 1072: 25,-7 + 1073: 25,-6 + 1074: 25,-5 + 1075: 25,-4 - node: color: '#F9801DFF' id: QuarterTileOverlayGreyscale decals: - 1286: 45,34 + 1274: 45,34 - node: color: '#3C44AAFF' id: QuarterTileOverlayGreyscale180 decals: - 1279: 43,30 - 1280: 43,31 - 1281: 43,32 - 1282: 44,32 - 1283: 45,32 - 1284: 46,32 + 1267: 43,30 + 1268: 43,31 + 1269: 43,32 + 1270: 44,32 + 1271: 45,32 + 1272: 46,32 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale180 decals: - 670: -26,9 - 671: -25,9 - 672: -24,9 - 673: -23,9 - 676: -21,8 - 677: -20,8 - 678: -19,8 - 679: -18,8 - 680: -17,8 - 681: -15,8 - 682: -16,8 - 683: -14,8 - 687: -12,8 - 688: -12,7 - 689: -12,6 + 658: -26,9 + 659: -25,9 + 660: -24,9 + 661: -23,9 + 664: -21,8 + 665: -20,8 + 666: -19,8 + 667: -18,8 + 668: -17,8 + 669: -15,8 + 670: -16,8 + 671: -14,8 + 675: -12,8 + 676: -12,7 + 677: -12,6 - node: color: '#707070FF' id: QuarterTileOverlayGreyscale180 @@ -2360,36 +2385,36 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale180 decals: - 993: 23,-5 - 994: 23,-6 - 995: 23,-7 - 996: 23,-8 - 997: 23,-9 - 998: 22,-9 - 999: 21,-9 - 1000: 20,-9 - 1001: 19,-9 - 1048: 23,-12 - 1049: 22,-12 - 1050: 21,-12 - 1051: 20,-12 - 1052: 19,-12 - 1072: 14,-12 - 1088: 26,-9 - 1089: 27,-9 - 1090: 28,-9 - 1091: 29,-9 + 981: 23,-5 + 982: 23,-6 + 983: 23,-7 + 984: 23,-8 + 985: 23,-9 + 986: 22,-9 + 987: 21,-9 + 988: 20,-9 + 989: 19,-9 + 1036: 23,-12 + 1037: 22,-12 + 1038: 21,-12 + 1039: 20,-12 + 1040: 19,-12 + 1060: 14,-12 + 1076: 26,-9 + 1077: 27,-9 + 1078: 28,-9 + 1079: 29,-9 - node: color: '#F9801DFF' id: QuarterTileOverlayGreyscale180 decals: - 1285: 46,33 + 1273: 46,33 - node: color: '#2BAF9D93' id: QuarterTileOverlayGreyscale270 decals: - 1441: 32,-12 - 1442: 31,-12 + 1415: 32,-12 + 1416: 31,-12 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 @@ -2400,10 +2425,10 @@ entities: color: '#52B4E996' id: QuarterTileOverlayGreyscale270 decals: - 674: -22,9 - 684: -13,8 - 1457: 10,-9 - 1458: 11,-9 + 662: -22,9 + 672: -13,8 + 1431: 10,-9 + 1432: 11,-9 - node: color: '#707070FF' id: QuarterTileOverlayGreyscale270 @@ -2421,7 +2446,7 @@ entities: color: '#9D9D97FF' id: QuarterTileOverlayGreyscale270 decals: - 1289: 39,33 + 1277: 39,33 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale270 @@ -2438,27 +2463,27 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale270 decals: - 1144: 5,-24 - 1145: 4,-24 - 1146: 3,-24 - 1175: 8,-28 - 1176: 9,-28 - 1207: 18,-22 - 1208: 18,-23 - 1209: 18,-24 - 1210: 19,-24 - 1211: 20,-24 - 1212: 21,-24 + 1132: 5,-24 + 1133: 4,-24 + 1134: 3,-24 + 1163: 8,-28 + 1164: 9,-28 + 1195: 18,-22 + 1196: 18,-23 + 1197: 18,-24 + 1198: 19,-24 + 1199: 20,-24 + 1200: 21,-24 - node: color: '#B02E26FF' id: QuarterTileOverlayGreyscale270 decals: - 1273: 39,32 - 1274: 40,32 - 1275: 41,32 - 1276: 42,32 - 1277: 42,31 - 1278: 42,30 + 1261: 39,32 + 1262: 40,32 + 1263: 41,32 + 1264: 42,32 + 1265: 42,31 + 1266: 42,30 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 @@ -2475,21 +2500,21 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale270 decals: - 986: 12,-9 - 1044: 28,-12 - 1045: 27,-12 - 1046: 26,-12 - 1047: 25,-12 - 1053: 24,-12 - 1436: 31,-11 - 1437: 32,-11 + 974: 12,-9 + 1032: 28,-12 + 1033: 27,-12 + 1034: 26,-12 + 1035: 25,-12 + 1041: 24,-12 + 1410: 31,-11 + 1411: 32,-11 - node: color: '#2BAF9D93' id: QuarterTileOverlayGreyscale90 decals: - 1435: 31,-11 - 1439: 32,-12 - 1440: 32,-11 + 1409: 31,-11 + 1413: 32,-12 + 1414: 32,-11 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 @@ -2501,27 +2526,27 @@ entities: color: '#3C44AAFF' id: QuarterTileOverlayGreyscale90 decals: - 1298: 43,29 + 1286: 43,29 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale90 decals: 474: 21,3 - 648: -12,11 - 649: -13,11 - 650: -15,11 - 651: -14,11 - 652: -16,11 - 653: -17,11 - 654: -18,11 - 655: -19,11 - 656: -20,11 - 657: -21,11 - 658: -22,11 - 659: -23,11 - 660: -24,11 - 661: -25,11 - 662: -26,11 + 636: -12,11 + 637: -13,11 + 638: -15,11 + 639: -14,11 + 640: -16,11 + 641: -17,11 + 642: -18,11 + 643: -19,11 + 644: -20,11 + 645: -21,11 + 646: -22,11 + 647: -23,11 + 648: -24,11 + 649: -25,11 + 650: -26,11 - node: color: '#79150096' id: QuarterTileOverlayGreyscale90 @@ -2538,7 +2563,7 @@ entities: color: '#9D9D97FF' id: QuarterTileOverlayGreyscale90 decals: - 1290: 40,34 + 1278: 40,34 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale90 @@ -2552,29 +2577,29 @@ entities: color: '#A4610696' id: QuarterTileOverlayGreyscale90 decals: - 1177: 22,-26 - 1178: 21,-26 - 1179: 20,-26 - 1180: 19,-26 - 1181: 18,-26 - 1182: 16,-26 - 1183: 17,-26 - 1184: 16,-25 - 1185: 16,-24 - 1186: 16,-23 - 1187: 16,-22 - 1188: 16,-21 - 1202: 22,-21 - 1203: 21,-21 - 1204: 20,-21 - 1205: 19,-21 - 1206: 22,-22 - 1463: 22,-23 + 1165: 22,-26 + 1166: 21,-26 + 1167: 20,-26 + 1168: 19,-26 + 1169: 18,-26 + 1170: 16,-26 + 1171: 17,-26 + 1172: 16,-25 + 1173: 16,-24 + 1174: 16,-23 + 1175: 16,-22 + 1176: 16,-21 + 1190: 22,-21 + 1191: 21,-21 + 1192: 20,-21 + 1193: 19,-21 + 1194: 22,-22 + 1437: 22,-23 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale90 decals: - 842: -12,-2 + 830: -12,-2 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale90 @@ -2611,64 +2636,49 @@ entities: color: '#EFB34196' id: QuarterTileOverlayGreyscale90 decals: - 1059: 23,-11 - 1060: 22,-11 - 1061: 21,-11 - 1062: 20,-11 - 1063: 19,-11 - 1438: 31,-12 - - node: - color: '#FFFFFFFF' - id: Rock01 - decals: - 1373: -27.060997,22.876055 - - node: - color: '#FFFFFFFF' - id: Rock05 - decals: - 1374: -25.107872,21.001055 - - node: - color: '#FFFFFFFF' - id: Rock06 - decals: - 1375: -25.060997,22.89168 + 1047: 23,-11 + 1048: 22,-11 + 1049: 21,-11 + 1050: 20,-11 + 1051: 19,-11 + 1412: 31,-12 - node: color: '#FFFFFFFF' id: Rock07 decals: - 1376: -23.045372,24.001055 + 1361: -23.045372,24.001055 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: Rust decals: - 1470: 16,22 - 1471: 15,20 - 1472: 12,20 - 1473: 17,20 - 1474: 14,21 + 1444: 16,22 + 1445: 15,20 + 1446: 12,20 + 1447: 17,20 + 1448: 14,21 - node: color: '#FFFFFFFF' id: StandClear decals: - 973: -17,-7 - 974: -8,-10 - 975: -8,-15 - 979: -27,-4 - 1129: 10,-27 - 1130: 14,-27 - 1388: 12,26 + 961: -17,-7 + 962: -8,-10 + 963: -8,-15 + 967: -27,-4 + 1117: 10,-27 + 1118: 14,-27 + 1362: 12,26 - node: angle: 4.71238898038469 rad color: '#FFFFFFFF' id: StandClear decals: - 1231: -40,22 + 1219: -40,22 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale decals: - 1432: 31,-17 + 1406: 31,-17 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale @@ -2683,19 +2693,21 @@ entities: id: ThreeQuarterTileOverlayGreyscale decals: 476: 20,7 - 664: -27,11 - 721: -18,21 + 652: -27,11 + 709: -18,21 + 1470: -17,5 + 1473: -22,5 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale decals: - 1213: 18,-21 + 1201: 18,-21 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale decals: - 841: -13,-1 - 912: -19,-1 + 829: -13,-1 + 900: -19,-1 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale @@ -2722,14 +2734,14 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale decals: - 1014: 15,-7 - 1065: 18,-11 - 1070: 11,-11 + 1002: 15,-7 + 1053: 18,-11 + 1058: 11,-11 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1434: 33,-19 + 1408: 33,-19 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale180 @@ -2743,25 +2755,25 @@ entities: id: ThreeQuarterTileOverlayGreyscale180 decals: 479: 23,5 - 666: -12,5 - 724: -13,18 + 654: -12,5 + 712: -13,18 - node: color: '#9D9D97FF' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1288: 40,33 + 1276: 40,33 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale180 decals: - 1140: 6,-24 - 1214: 22,-24 + 1128: 6,-24 + 1202: 22,-24 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale180 decals: - 838: -9,-4 - 915: -15,-7 + 826: -9,-4 + 903: -15,-7 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale180 @@ -2787,16 +2799,16 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale180 decals: - 981: 13,-9 - 1016: 16,-9 - 1067: 29,-12 - 1068: 16,-12 - 1073: 14,-13 + 969: 13,-9 + 1004: 16,-9 + 1055: 29,-12 + 1056: 16,-12 + 1061: 14,-13 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1433: 31,-19 + 1407: 31,-19 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale270 @@ -2812,16 +2824,16 @@ entities: id: ThreeQuarterTileOverlayGreyscale270 decals: 478: 20,5 - 663: -27,9 - 665: -13,5 - 675: -22,8 - 723: -18,18 + 651: -27,9 + 653: -13,5 + 663: -22,8 + 711: -18,18 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale270 decals: - 837: -13,-4 - 914: -19,-7 + 825: -13,-4 + 902: -19,-7 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale270 @@ -2847,21 +2859,21 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1008: 18,-9 - 1015: 15,-9 - 1066: 18,-12 - 1071: 11,-13 - 1082: 25,-9 + 996: 18,-9 + 1003: 15,-9 + 1054: 18,-12 + 1059: 11,-13 + 1070: 25,-9 - node: color: '#F9801DFF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 1287: 45,33 + 1275: 45,33 - node: color: '#2BAF9D93' id: ThreeQuarterTileOverlayGreyscale90 decals: - 1431: 33,-17 + 1405: 33,-17 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale90 @@ -2877,19 +2889,21 @@ entities: id: ThreeQuarterTileOverlayGreyscale90 decals: 477: 23,7 - 722: -13,21 + 710: -13,21 + 1469: -19,5 + 1472: -14,5 - node: color: '#A4610696' id: ThreeQuarterTileOverlayGreyscale90 decals: - 1139: 6,-20 + 1127: 6,-20 - node: color: '#D381C996' id: ThreeQuarterTileOverlayGreyscale90 decals: - 839: -9,-2 - 840: -12,-1 - 913: -15,-1 + 827: -9,-2 + 828: -12,-1 + 901: -15,-1 - node: color: '#DE3A3A96' id: ThreeQuarterTileOverlayGreyscale90 @@ -2915,22 +2929,22 @@ entities: color: '#EFB34196' id: ThreeQuarterTileOverlayGreyscale90 decals: - 980: 13,-5 - 1009: 23,-4 - 1013: 16,-7 - 1064: 29,-11 - 1069: 16,-11 + 968: 13,-5 + 997: 23,-4 + 1001: 16,-7 + 1052: 29,-11 + 1057: 16,-11 - node: color: '#FFFFFFFF' id: VentSmall decals: - 969: -21,-18 + 957: -21,-18 - node: color: '#FFFFFFFF' id: WarnBox decals: 129: -1,46 - 1264: -7,52 + 1252: -7,52 - node: color: '#FFFFFFFF' id: WarnCornerNE @@ -2942,20 +2956,20 @@ entities: decals: 5: -9,-15 133: -1,45 - 1400: -12,-52 + 1374: -12,-52 - node: color: '#FFFFFFFF' id: WarnCornerSE decals: 209: -2,23 - 1010: 17,-4 - 1370: -41,23 - 1461: 18,-1 + 998: 17,-4 + 1358: -41,23 + 1435: 18,-1 - node: color: '#FFFFFFFF' id: WarnCornerSW decals: - 851: -11,-1 + 839: -11,-1 - node: color: '#FFFFFFFF' id: WarnCornerSmallNE @@ -2963,8 +2977,8 @@ entities: 81: -8,49 82: -9,50 135: -3,46 - 864: -29,-4 - 1230: -40,20 + 852: -29,-4 + 1218: -40,20 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW @@ -2974,14 +2988,14 @@ entities: 80: -5,50 198: -2,23 213: -4,24 - 863: -25,-4 + 851: -25,-4 - node: color: '#FFFFFFFF' id: WarnCornerSmallSE decals: 83: -9,54 84: -8,55 - 1137: 9,-28 + 1125: 9,-28 - node: color: '#FFFFFFFF' id: WarnCornerSmallSW @@ -2989,7 +3003,7 @@ entities: 85: -6,55 86: -5,54 210: -4,26 - 1138: 15,-28 + 1126: 15,-28 - node: color: '#FFFFFFFF' id: WarnLineE @@ -3006,15 +3020,15 @@ entities: 137: -2,44 207: -2,24 208: -2,25 - 860: -29,-3 - 861: -29,-2 - 862: -29,-1 - 1227: -40,21 - 1228: -40,22 - 1229: -40,23 - 1263: -6,52 - 1477: -4,-30 - 1478: -4,-29 + 848: -29,-3 + 849: -29,-2 + 850: -29,-1 + 1215: -40,21 + 1216: -40,22 + 1217: -40,23 + 1251: -6,52 + 1451: -4,-30 + 1452: -4,-29 - node: color: '#FFFFFFFF' id: WarnLineN @@ -3027,24 +3041,24 @@ entities: 204: -5,23 205: -4,23 206: -3,23 - 852: -10,-1 - 853: -9,-1 - 1011: 16,-4 - 1012: 15,-4 - 1133: 11,-28 - 1134: 13,-28 - 1135: 14,-28 - 1136: 12,-28 - 1201: 10,-28 - 1260: -7,51 - 1371: -42,23 - 1403: -17,-12 - 1404: -16,-12 - 1422: -18,-16 - 1423: -17,-16 - 1424: -16,-16 - 1425: -18,-12 - 1462: 17,-1 + 840: -10,-1 + 841: -9,-1 + 999: 16,-4 + 1000: 15,-4 + 1121: 11,-28 + 1122: 13,-28 + 1123: 14,-28 + 1124: 12,-28 + 1189: 10,-28 + 1248: -7,51 + 1359: -42,23 + 1377: -17,-12 + 1378: -16,-12 + 1396: -18,-16 + 1397: -17,-16 + 1398: -16,-16 + 1399: -18,-12 + 1436: 17,-1 - node: color: '#FFFFFFFF' id: WarnLineS @@ -3065,14 +3079,14 @@ entities: 199: -2,25 200: -2,24 211: -4,25 - 854: -25,-1 - 855: -25,-2 - 856: -25,-3 - 1261: -8,52 - 1401: -12,-53 - 1402: -12,-54 - 1475: -2,-30 - 1476: -2,-29 + 842: -25,-1 + 843: -25,-2 + 844: -25,-3 + 1249: -8,52 + 1375: -12,-53 + 1376: -12,-54 + 1449: -2,-30 + 1450: -2,-29 - node: color: '#FFFFFFFF' id: WarnLineW @@ -3086,33 +3100,33 @@ entities: 202: -4,23 203: -3,23 212: -5,24 - 857: -28,-4 - 858: -27,-4 - 859: -26,-4 - 948: -17,-9 - 949: -16,-9 - 950: -18,-17 - 951: -17,-17 - 952: -16,-17 - 953: -19,-17 - 954: -20,-17 - 967: -21,-17 - 968: -15,-17 - 1262: -7,53 - 1405: -17,-12 - 1406: -16,-12 - 1419: -18,-9 - 1426: -18,-12 + 845: -28,-4 + 846: -27,-4 + 847: -26,-4 + 936: -17,-9 + 937: -16,-9 + 938: -18,-17 + 939: -17,-17 + 940: -16,-17 + 941: -19,-17 + 942: -20,-17 + 955: -21,-17 + 956: -15,-17 + 1250: -7,53 + 1379: -17,-12 + 1380: -16,-12 + 1393: -18,-9 + 1400: -18,-12 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe decals: - 1266: 41,31 + 1254: 41,31 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw decals: - 1265: 44,31 + 1253: 44,31 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNe @@ -3134,7 +3148,7 @@ entities: 251: -1,12 252: -4,8 253: 3,12 - 1237: -8,-27 + 1225: -8,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSw @@ -3142,7 +3156,7 @@ entities: 248: 6,8 249: -1,12 250: 3,12 - 1236: -6,-27 + 1224: -6,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinLineE @@ -3152,7 +3166,7 @@ entities: 245: -1,9 246: 3,10 247: 3,11 - 1268: 41,30 + 1256: 41,30 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN @@ -3164,12 +3178,12 @@ entities: 238: -2,9 239: 4,9 240: 5,9 - 831: 3,4 - 832: 4,4 - 1269: 40,31 - 1270: 39,31 - 1271: 45,31 - 1272: 46,31 + 819: 3,4 + 820: 4,4 + 1257: 40,31 + 1258: 39,31 + 1259: 45,31 + 1260: 46,31 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS @@ -3188,7 +3202,7 @@ entities: 227: 0,12 228: 1,12 229: 2,12 - 1235: -7,-27 + 1223: -7,-27 - node: color: '#FFFFFFFF' id: WoodTrimThinLineW @@ -3199,22 +3213,22 @@ entities: 233: 3,10 241: -1,10 242: -1,11 - 1267: 44,30 + 1255: 44,30 - node: angle: 4.71238898038469 rad color: '#69150079' id: footprint decals: - 1465: 12.797138,20.095083 - 1466: 13.359638,19.751333 - 1467: 13.890888,20.079458 - 1468: 14.422138,19.766958 - 1469: 12.219013,19.751333 + 1439: 12.797138,20.095083 + 1440: 13.359638,19.751333 + 1441: 13.890888,20.079458 + 1442: 14.422138,19.766958 + 1443: 12.219013,19.751333 - node: color: '#691500FF' id: splatter decals: - 1464: 12.062763,20.798208 + 1438: 12.062763,20.798208 - type: GridAtmosphere version: 2 data: @@ -4483,8 +4497,6 @@ entities: - 10600 - 10548 - 10550 - - type: AtmosDevice - joinedGrid: 1 - uid: 11592 components: - type: Transform @@ -4498,8 +4510,6 @@ entities: - 3198 - 10762 - 10763 - - type: AtmosDevice - joinedGrid: 1 - uid: 11593 components: - type: Transform @@ -4521,8 +4531,6 @@ entities: - 10727 - 10725 - 10726 - - type: AtmosDevice - joinedGrid: 1 - uid: 11594 components: - type: Transform @@ -4542,8 +4550,6 @@ entities: - 10706 - 10707 - 10813 - - type: AtmosDevice - joinedGrid: 1 - uid: 11598 components: - type: Transform @@ -4570,8 +4576,6 @@ entities: - 10664 - 10821 - 10814 - - type: AtmosDevice - joinedGrid: 1 - uid: 11601 components: - type: Transform @@ -4603,8 +4607,6 @@ entities: - 10509 - 11605 - 11604 - - type: AtmosDevice - joinedGrid: 1 - uid: 11611 components: - type: Transform @@ -4628,8 +4630,6 @@ entities: - 10660 - 10661 - 10659 - - type: AtmosDevice - joinedGrid: 1 - uid: 11612 components: - type: Transform @@ -4658,8 +4658,6 @@ entities: - 10786 - 10785 - 10772 - - type: AtmosDevice - joinedGrid: 1 - uid: 11623 components: - type: Transform @@ -4677,8 +4675,6 @@ entities: - 11176 - 10773 - 10246 - - type: AtmosDevice - joinedGrid: 1 - uid: 11625 components: - type: Transform @@ -4692,8 +4688,6 @@ entities: - 3142 - 11337 - 10248 - - type: AtmosDevice - joinedGrid: 1 - uid: 11630 components: - type: Transform @@ -4719,8 +4713,6 @@ entities: - 3136 - 10994 - 10995 - - type: AtmosDevice - joinedGrid: 1 - uid: 11632 components: - type: Transform @@ -4730,12 +4722,6 @@ entities: devices: - 3183 - 3184 - - 3171 - - 3170 - - 3169 - - 3168 - - 3167 - - 3166 - 3165 - 3189 - 3164 @@ -4743,24 +4729,18 @@ entities: - 3172 - 10879 - 10880 - - 10902 - - 10900 - - 11646 - - 11645 - - 10903 - - 10901 - - 10924 - - 10921 - - type: AtmosDevice - joinedGrid: 1 + - 5885 + - 5882 - uid: 11634 components: - type: Transform rot: -1.5707963267948966 rad pos: -22.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 + - type: DeviceList + devices: + - 5322 + - 5599 - uid: 11636 components: - type: Transform @@ -4773,8 +4753,6 @@ entities: - 10922 - 3164 - 3188 - - type: AtmosDevice - joinedGrid: 1 - uid: 11638 components: - type: Transform @@ -4792,8 +4770,6 @@ entities: - 10969 - 10968 - 10970 - - type: AtmosDevice - joinedGrid: 1 - uid: 11642 components: - type: Transform @@ -4807,8 +4783,6 @@ entities: - 3181 - 10899 - 10944 - - type: AtmosDevice - joinedGrid: 1 - uid: 11647 components: - type: Transform @@ -4824,8 +4798,6 @@ entities: - 3157 - 11054 - 11057 - - type: AtmosDevice - joinedGrid: 1 - uid: 11649 components: - type: Transform @@ -4853,8 +4825,6 @@ entities: - 11055 - 11059 - 11042 - - type: AtmosDevice - joinedGrid: 1 - uid: 11651 components: - type: Transform @@ -4871,8 +4841,6 @@ entities: - 3159 - 3161 - 11653 - - type: AtmosDevice - joinedGrid: 1 - uid: 11655 components: - type: Transform @@ -4890,8 +4858,6 @@ entities: - 11147 - 11151 - 11150 - - type: AtmosDevice - joinedGrid: 1 - uid: 11657 components: - type: Transform @@ -4906,8 +4872,6 @@ entities: - 11175 - 3272 - 3273 - - type: AtmosDevice - joinedGrid: 1 - uid: 11658 components: - type: Transform @@ -4931,8 +4895,6 @@ entities: - 3118 - 3119 - 3120 - - type: AtmosDevice - joinedGrid: 1 - uid: 11660 components: - type: Transform @@ -4949,8 +4911,6 @@ entities: - 3103 - 3104 - 3105 - - type: AtmosDevice - joinedGrid: 1 - uid: 11661 components: - type: Transform @@ -4960,8 +4920,6 @@ entities: - type: DeviceList devices: - 11667 - - type: AtmosDevice - joinedGrid: 1 - uid: 11662 components: - type: Transform @@ -4971,8 +4929,6 @@ entities: - type: DeviceList devices: - 11666 - - type: AtmosDevice - joinedGrid: 1 - uid: 11664 components: - type: Transform @@ -4992,8 +4948,6 @@ entities: - 3107 - 3108 - 3109 - - type: AtmosDevice - joinedGrid: 1 - uid: 11670 components: - type: Transform @@ -5009,8 +4963,6 @@ entities: - 11322 - 11320 - 11323 - - type: AtmosDevice - joinedGrid: 1 - uid: 11672 components: - type: Transform @@ -5027,8 +4979,6 @@ entities: - 11261 - 11331 - 11330 - - type: AtmosDevice - joinedGrid: 1 - uid: 11674 components: - type: Transform @@ -5049,8 +4999,6 @@ entities: - 3264 - 11366 - 11367 - - type: AtmosDevice - joinedGrid: 1 - uid: 11676 components: - type: Transform @@ -5077,8 +5025,6 @@ entities: - 10220 - 1832 - 3055 - - type: AtmosDevice - joinedGrid: 1 - uid: 11678 components: - type: Transform @@ -5096,8 +5042,6 @@ entities: - 10113 - 11687 - 11688 - - type: AtmosDevice - joinedGrid: 1 - uid: 11680 components: - type: Transform @@ -5114,8 +5058,6 @@ entities: - 10144 - 10143 - 10142 - - type: AtmosDevice - joinedGrid: 1 - uid: 11682 components: - type: Transform @@ -5133,8 +5075,6 @@ entities: - 11687 - 11688 - 11689 - - type: AtmosDevice - joinedGrid: 1 - uid: 11684 components: - type: Transform @@ -5149,8 +5089,6 @@ entities: - 3237 - 1222 - 11686 - - type: AtmosDevice - joinedGrid: 1 - uid: 11690 components: - type: Transform @@ -5165,8 +5103,6 @@ entities: - 3499 - 10358 - 10361 - - type: AtmosDevice - joinedGrid: 1 - uid: 11692 components: - type: Transform @@ -5181,8 +5117,6 @@ entities: - 3503 - 10362 - 10359 - - type: AtmosDevice - joinedGrid: 1 - uid: 11694 components: - type: Transform @@ -5199,8 +5133,6 @@ entities: - 3506 - 10360 - 10363 - - type: AtmosDevice - joinedGrid: 1 - uid: 11697 components: - type: Transform @@ -5218,8 +5150,6 @@ entities: - 10390 - 10389 - 10391 - - type: AtmosDevice - joinedGrid: 1 - uid: 11698 components: - type: Transform @@ -5230,8 +5160,6 @@ entities: devices: - 10413 - 10414 - - type: AtmosDevice - joinedGrid: 1 - uid: 11699 components: - type: Transform @@ -5246,8 +5174,6 @@ entities: - 11704 - 10432 - 10433 - - type: AtmosDevice - joinedGrid: 1 - uid: 11700 components: - type: Transform @@ -5262,8 +5188,6 @@ entities: - 10450 - 10449 - 10451 - - type: AtmosDevice - joinedGrid: 1 - uid: 11705 components: - type: Transform @@ -5280,8 +5204,6 @@ entities: - 3266 - 11410 - 11408 - - type: AtmosDevice - joinedGrid: 1 - uid: 11707 components: - type: Transform @@ -5310,8 +5232,6 @@ entities: - 11474 - 11480 - 11475 - - type: AtmosDevice - joinedGrid: 1 - uid: 11709 components: - type: Transform @@ -5335,8 +5255,6 @@ entities: - 7085 - 11409 - 11411 - - type: AtmosDevice - joinedGrid: 1 - uid: 11711 components: - type: Transform @@ -5351,8 +5269,6 @@ entities: - 7085 - 11507 - 11510 - - type: AtmosDevice - joinedGrid: 1 - uid: 11714 components: - type: Transform @@ -5369,8 +5285,6 @@ entities: - 2186 - 11719 - 11720 - - type: AtmosDevice - joinedGrid: 1 - uid: 11718 components: - type: Transform @@ -5387,8 +5301,6 @@ entities: - 11587 - 11588 - 11590 - - type: AtmosDevice - joinedGrid: 1 - proto: AirCanister entities: - uid: 6999 @@ -5396,113 +5308,81 @@ entities: - type: Transform pos: 37.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7000 components: - type: Transform pos: 37.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7004 components: - type: Transform pos: 37.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7204 components: - type: Transform pos: 10.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8862 components: - type: Transform pos: -15.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8867 components: - type: Transform pos: -27.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8868 components: - type: Transform pos: -34.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9126 components: - type: Transform pos: 22.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9180 components: - type: Transform pos: 26.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9250 components: - type: Transform pos: 33.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9336 components: - type: Transform pos: 35.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9337 components: - type: Transform pos: 21.5,25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9338 components: - type: Transform pos: 7.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9691 components: - type: Transform pos: -17.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9692 components: - type: Transform pos: -7.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 12006 components: - type: Transform pos: 11.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Airlock entities: - uid: 3575 @@ -6683,12 +6563,6 @@ entities: rot: 3.141592653589793 rad pos: -27.5,10.5 parent: 1 - - uid: 3395 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -23.5,17.5 - parent: 1 - uid: 3396 components: - type: Transform @@ -6734,16 +6608,6 @@ entities: parent: 1 - proto: AirlockMedicalGlassLocked entities: - - uid: 1859 - components: - - type: Transform - pos: -15.5,7.5 - parent: 1 - - uid: 1860 - components: - - type: Transform - pos: -14.5,7.5 - parent: 1 - uid: 3388 components: - type: Transform @@ -6776,23 +6640,27 @@ entities: parent: 1 - proto: AirlockMedicalLocked entities: + - uid: 223 + components: + - type: Transform + pos: -23.5,19.5 + parent: 1 - uid: 734 components: - type: Transform pos: 22.5,4.5 parent: 1 + - uid: 1890 + components: + - type: Transform + pos: -23.5,17.5 + parent: 1 - uid: 3393 components: - type: Transform rot: 3.141592653589793 rad pos: -23.5,12.5 parent: 1 - - uid: 3560 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,21.5 - parent: 1 - proto: AirlockQuartermasterLocked entities: - uid: 3596 @@ -7048,7 +6916,7 @@ entities: - type: Transform pos: 29.5,-6.5 parent: 1 -- proto: AmePart +- proto: AmePartFlatpack entities: - uid: 6775 components: @@ -7735,8 +7603,6 @@ entities: rot: 3.141592653589793 rad pos: 35.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: BassGuitarInstrument entities: - uid: 12290 @@ -7943,17 +7809,21 @@ entities: parent: 1 - proto: BedsheetMedical entities: - - uid: 5621 + - uid: 236 components: - type: Transform - rot: 3.141592653589793 rad - pos: -18.5,5.5 + pos: -16.5,5.5 parent: 1 - - uid: 5622 + - uid: 1790 components: - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,5.5 + rot: -1.5707963267948966 rad + pos: -21.5,5.5 + parent: 1 + - uid: 1855 + components: + - type: Transform + pos: -18.5,5.5 parent: 1 - proto: BedsheetMime entities: @@ -8158,6 +8028,8 @@ entities: rot: 3.141592653589793 rad pos: 30.5,24.5 parent: 1 + - type: SpamEmitSound + enabled: False - proto: Bloodpack entities: - uid: 9642 @@ -8170,7 +8042,7 @@ entities: - type: Transform pos: -26.622076,24.452543 parent: 1 -- proto: BodyBag_Container +- proto: BodyBag entities: - uid: 8242 components: @@ -8351,6 +8223,11 @@ entities: parent: 1 - proto: BoxFolderBase entities: + - uid: 1801 + components: + - type: Transform + pos: -19.42504,5.668075 + parent: 1 - uid: 3983 components: - type: Transform @@ -8526,11 +8403,6 @@ entities: - type: Transform pos: -14.371586,5.6317506 parent: 1 - - uid: 5881 - components: - - type: Transform - pos: -17.378174,5.612771 - parent: 1 - proto: BoxFolderYellow entities: - uid: 5095 @@ -8621,10 +8493,10 @@ entities: parent: 1 - proto: BoxLatexGloves entities: - - uid: 5903 + - uid: 1792 components: - type: Transform - pos: -22.54765,11.635829 + pos: -15.733353,5.3666716 parent: 1 - uid: 5907 components: @@ -8697,6 +8569,11 @@ entities: parent: 1 - proto: BoxSterileMask entities: + - uid: 250 + components: + - type: Transform + pos: -15.436478,5.6635466 + parent: 1 - uid: 5905 components: - type: Transform @@ -8707,11 +8584,6 @@ entities: - type: Transform pos: -14.459891,-1.7880898 parent: 1 - - uid: 7183 - components: - - type: Transform - pos: -22.431108,11.63326 - parent: 1 - proto: BoxSyringe entities: - uid: 6049 @@ -8804,6 +8676,41 @@ entities: - type: Transform pos: -12.5,-46.5 parent: 1 + - uid: 1785 + components: + - type: Transform + pos: -23.5,17.5 + parent: 1 + - uid: 1885 + components: + - type: Transform + pos: -23.5,16.5 + parent: 1 + - uid: 1892 + components: + - type: Transform + pos: -23.5,22.5 + parent: 1 + - uid: 1896 + components: + - type: Transform + pos: -23.5,21.5 + parent: 1 + - uid: 1897 + components: + - type: Transform + pos: -23.5,20.5 + parent: 1 + - uid: 1898 + components: + - type: Transform + pos: -23.5,19.5 + parent: 1 + - uid: 1901 + components: + - type: Transform + pos: -23.5,18.5 + parent: 1 - uid: 1943 components: - type: Transform @@ -22255,15 +22162,11 @@ entities: - type: Transform pos: -19.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6809 components: - type: Transform pos: 43.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Carpet entities: - uid: 5022 @@ -25583,24 +25486,6 @@ entities: rot: -1.5707963267948966 rad pos: 13.5,-5.5 parent: 1 - - uid: 1899 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,8.5 - parent: 1 - - uid: 1900 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,8.5 - parent: 1 - - uid: 1901 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -19.5,8.5 - parent: 1 - uid: 3210 components: - type: Transform @@ -26272,13 +26157,6 @@ entities: - type: Transform pos: -40.481712,-24.251455 parent: 1 -- proto: ChairGreyscale - entities: - - uid: 8007 - components: - - type: Transform - pos: -25.5,7.5 - parent: 1 - proto: ChairOfficeDark entities: - uid: 778 @@ -27162,17 +27040,6 @@ entities: - 0 - 0 - 0 - - type: ContainerContainer - containers: - entity_storage: !type:Container - showEnts: False - occludes: True - ents: - - 7660 - paper_label: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - proto: ClosetL3JanitorFilled entities: - uid: 7662 @@ -27491,10 +27358,10 @@ entities: parent: 1 - proto: ClothingEyesGlasses entities: - - uid: 5887 + - uid: 1900 components: - type: Transform - pos: -17.56469,5.4986477 + pos: -19.386711,5.3087 parent: 1 - uid: 6051 components: @@ -27621,13 +27488,6 @@ entities: - type: Transform pos: -21.389526,-28.408783 parent: 1 -- proto: ClothingHeadHatHairflower - entities: - - uid: 4135 - components: - - type: Transform - pos: -3.6820545,23.685793 - parent: 1 - proto: ClothingHeadHatHoodCulthood entities: - uid: 8797 @@ -28825,6 +28685,9 @@ entities: - type: Transform pos: 1.5,49.5 parent: 1 + - type: SingletonDeviceNetServer + active: False + available: False - proto: CrewMonitoringServerMachineCircuitboard entities: - uid: 4007 @@ -28837,7 +28700,7 @@ entities: - uid: 5601 components: - type: Transform - pos: -23.451687,5.4552503 + pos: -23.596352,6.739663 parent: 1 - uid: 6336 components: @@ -28897,6 +28760,13 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-29.5 parent: 1 +- proto: CryoPod + entities: + - uid: 5598 + components: + - type: Transform + pos: -26.5,7.5 + parent: 1 - proto: CryoPodMachineCircuitboard entities: - uid: 12611 @@ -29196,6 +29066,13 @@ entities: - type: Transform pos: -26.5,30.5 parent: 1 +- proto: DefaultStationBeaconSurgery + entities: + - uid: 222 + components: + - type: Transform + pos: -23.5,21.5 + parent: 1 - proto: DefaultStationBeaconTechVault entities: - uid: 12646 @@ -29790,12 +29667,6 @@ entities: - type: Transform pos: -16.5,11.5 parent: 1 - - uid: 6131 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -12.5,9.5 - parent: 1 - uid: 6172 components: - type: Transform @@ -29928,6 +29799,12 @@ entities: parent: 1 - proto: DisposalPipe entities: + - uid: 239 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -12.5,9.5 + parent: 1 - uid: 2203 components: - type: Transform @@ -30335,12 +30212,6 @@ entities: rot: -1.5707963267948966 rad pos: -13.5,9.5 parent: 1 - - uid: 6142 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,8.5 - parent: 1 - uid: 6143 components: - type: Transform @@ -32296,12 +32167,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,11.5 parent: 1 - - uid: 6126 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,7.5 - parent: 1 - uid: 6127 components: - type: Transform @@ -32436,11 +32301,6 @@ entities: - type: Transform pos: 13.5,-4.5 parent: 1 - - uid: 1892 - components: - - type: Transform - pos: -12.5,7.5 - parent: 1 - uid: 1903 components: - type: Transform @@ -33103,15 +32963,6 @@ entities: - type: PointLight enabled: True - type: ActiveEmergencyLight - - uid: 12380 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,8.5 - parent: 1 - - type: PointLight - enabled: True - - type: ActiveEmergencyLight - uid: 12381 components: - type: Transform @@ -33312,15 +33163,15 @@ entities: parent: 1 - proto: EmergencyMedipen entities: - - uid: 1925 + - uid: 240 components: - type: Transform - pos: -22.134233,11.75826 + pos: -14.827103,5.7729216 parent: 1 - - uid: 7681 + - uid: 241 components: - type: Transform - pos: -22.212358,11.492635 + pos: -14.983353,5.4135466 parent: 1 - proto: EmergencyRollerBed entities: @@ -33695,6 +33546,13 @@ entities: parent: 1 - proto: FaxMachineBase entities: + - uid: 237 + components: + - type: Transform + pos: -22.5,11.5 + parent: 1 + - type: FaxMachine + name: Medical - uid: 4111 components: - type: Transform @@ -33723,13 +33581,6 @@ entities: parent: 1 - type: FaxMachine name: Library - - uid: 5882 - components: - - type: Transform - pos: -12.5,6.5 - parent: 1 - - type: FaxMachine - name: Medical - uid: 5974 components: - type: Transform @@ -33793,8 +33644,6 @@ entities: - 3203 - 3204 - 3205 - - type: AtmosDevice - joinedGrid: 1 - uid: 11595 components: - type: Transform @@ -33806,8 +33655,6 @@ entities: - 3197 - 3194 - 3198 - - type: AtmosDevice - joinedGrid: 1 - uid: 11596 components: - type: Transform @@ -33821,8 +33668,6 @@ entities: - 3196 - 3194 - 3195 - - type: AtmosDevice - joinedGrid: 1 - uid: 11597 components: - type: Transform @@ -33836,8 +33681,6 @@ entities: - 3193 - 3192 - 3186 - - type: AtmosDevice - joinedGrid: 1 - uid: 11599 components: - type: Transform @@ -33859,8 +33702,6 @@ entities: - 5002 - 5000 - 5001 - - type: AtmosDevice - joinedGrid: 1 - uid: 11607 components: - type: Transform @@ -33877,8 +33718,6 @@ entities: - 3213 - 3214 - 3215 - - type: AtmosDevice - joinedGrid: 1 - uid: 11610 components: - type: Transform @@ -33896,8 +33735,6 @@ entities: - 3221 - 3222 - 3223 - - type: AtmosDevice - joinedGrid: 1 - uid: 11613 components: - type: Transform @@ -33922,8 +33759,6 @@ entities: - 11616 - 11615 - 11614 - - type: AtmosDevice - joinedGrid: 1 - uid: 11624 components: - type: Transform @@ -33937,8 +33772,6 @@ entities: - 3142 - 3139 - 3140 - - type: AtmosDevice - joinedGrid: 1 - uid: 11626 components: - type: Transform @@ -33950,8 +33783,6 @@ entities: - 3146 - 3143 - 3142 - - type: AtmosDevice - joinedGrid: 1 - uid: 11631 components: - type: Transform @@ -33975,8 +33806,6 @@ entities: - 5004 - 3135 - 3136 - - type: AtmosDevice - joinedGrid: 1 - uid: 11633 components: - type: Transform @@ -33986,27 +33815,17 @@ entities: devices: - 3183 - 3184 - - 3171 - - 3170 - - 3169 - - 3168 - - 3167 - - 3166 - 3165 - 3189 - 3164 - 3173 - 3172 - - type: AtmosDevice - joinedGrid: 1 - uid: 11635 components: - type: Transform rot: -1.5707963267948966 rad pos: -22.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 11639 components: - type: Transform @@ -34018,8 +33837,6 @@ entities: - 3187 - 11637 - 11643 - - type: AtmosDevice - joinedGrid: 1 - uid: 11640 components: - type: Transform @@ -34030,8 +33847,6 @@ entities: devices: - 3164 - 3188 - - type: AtmosDevice - joinedGrid: 1 - uid: 11641 components: - type: Transform @@ -34043,8 +33858,6 @@ entities: - 3179 - 3180 - 3181 - - type: AtmosDevice - joinedGrid: 1 - uid: 11648 components: - type: Transform @@ -34058,8 +33871,6 @@ entities: - 3155 - 3156 - 3157 - - type: AtmosDevice - joinedGrid: 1 - uid: 11650 components: - type: Transform @@ -34083,8 +33894,6 @@ entities: - 3158 - 3159 - 3161 - - type: AtmosDevice - joinedGrid: 1 - uid: 11652 components: - type: Transform @@ -34097,8 +33906,6 @@ entities: - 3159 - 3161 - 11653 - - type: AtmosDevice - joinedGrid: 1 - uid: 11654 components: - type: Transform @@ -34112,8 +33919,6 @@ entities: - 3160 - 3162 - 3163 - - type: AtmosDevice - joinedGrid: 1 - uid: 11656 components: - type: Transform @@ -34124,8 +33929,6 @@ entities: devices: - 3273 - 3272 - - type: AtmosDevice - joinedGrid: 1 - uid: 11659 components: - type: Transform @@ -34147,8 +33950,6 @@ entities: - 3118 - 3119 - 3120 - - type: AtmosDevice - joinedGrid: 1 - uid: 11663 components: - type: Transform @@ -34163,8 +33964,6 @@ entities: - 3103 - 3104 - 3105 - - type: AtmosDevice - joinedGrid: 1 - uid: 11665 components: - type: Transform @@ -34182,8 +33981,6 @@ entities: - 3109 - 11668 - 11669 - - type: AtmosDevice - joinedGrid: 1 - uid: 11671 components: - type: Transform @@ -34195,8 +33992,6 @@ entities: - 1979 - 2283 - 996 - - type: AtmosDevice - joinedGrid: 1 - uid: 11673 components: - type: Transform @@ -34209,8 +34004,6 @@ entities: - 3109 - 3093 - 3092 - - type: AtmosDevice - joinedGrid: 1 - uid: 11675 components: - type: Transform @@ -34229,8 +34022,6 @@ entities: - 3266 - 3265 - 3264 - - type: AtmosDevice - joinedGrid: 1 - uid: 11677 components: - type: Transform @@ -34251,8 +34042,6 @@ entities: - 3243 - 1832 - 3055 - - type: AtmosDevice - joinedGrid: 1 - uid: 11679 components: - type: Transform @@ -34266,8 +34055,6 @@ entities: - 3232 - 11687 - 11688 - - type: AtmosDevice - joinedGrid: 1 - uid: 11681 components: - type: Transform @@ -34281,8 +34068,6 @@ entities: - 3233 - 3241 - 3242 - - type: AtmosDevice - joinedGrid: 1 - uid: 11683 components: - type: Transform @@ -34299,8 +34084,6 @@ entities: - 11687 - 11688 - 11689 - - type: AtmosDevice - joinedGrid: 1 - uid: 11685 components: - type: Transform @@ -34313,8 +34096,6 @@ entities: - 3237 - 1222 - 11686 - - type: AtmosDevice - joinedGrid: 1 - uid: 11691 components: - type: Transform @@ -34327,8 +34108,6 @@ entities: - 3127 - 3498 - 3499 - - type: AtmosDevice - joinedGrid: 1 - uid: 11693 components: - type: Transform @@ -34341,8 +34120,6 @@ entities: - 3501 - 3502 - 3503 - - type: AtmosDevice - joinedGrid: 1 - uid: 11695 components: - type: Transform @@ -34357,8 +34134,6 @@ entities: - 3504 - 3505 - 3506 - - type: AtmosDevice - joinedGrid: 1 - uid: 11696 components: - type: Transform @@ -34372,8 +34147,6 @@ entities: - 3504 - 3507 - 4898 - - type: AtmosDevice - joinedGrid: 1 - uid: 11701 components: - type: Transform @@ -34384,8 +34157,6 @@ entities: devices: - 11703 - 11704 - - type: AtmosDevice - joinedGrid: 1 - uid: 11702 components: - type: Transform @@ -34398,8 +34169,6 @@ entities: - 4897 - 11703 - 11704 - - type: AtmosDevice - joinedGrid: 1 - uid: 11706 components: - type: Transform @@ -34414,8 +34183,6 @@ entities: - 3264 - 3265 - 3266 - - type: AtmosDevice - joinedGrid: 1 - uid: 11708 components: - type: Transform @@ -34432,8 +34199,6 @@ entities: - 3269 - 3271 - 3268 - - type: AtmosDevice - joinedGrid: 1 - uid: 11710 components: - type: Transform @@ -34455,8 +34220,6 @@ entities: - 7083 - 7084 - 7085 - - type: AtmosDevice - joinedGrid: 1 - uid: 11712 components: - type: Transform @@ -34469,8 +34232,6 @@ entities: - 7083 - 7084 - 7085 - - type: AtmosDevice - joinedGrid: 1 - uid: 11715 components: - type: Transform @@ -34485,8 +34246,6 @@ entities: - 3252 - 3253 - 2186 - - type: AtmosDevice - joinedGrid: 1 - uid: 11716 components: - type: Transform @@ -34497,8 +34256,6 @@ entities: devices: - 3248 - 3249 - - type: AtmosDevice - joinedGrid: 1 - uid: 11717 components: - type: Transform @@ -34511,8 +34268,6 @@ entities: - 3595 - 7301 - 3257 - - type: AtmosDevice - joinedGrid: 1 - proto: FireAxeCabinetFilled entities: - uid: 4101 @@ -35056,12 +34811,6 @@ entities: rot: -1.5707963267948966 rad pos: 31.5,-17.5 parent: 1 - - uid: 12112 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -22.5,21.5 - parent: 1 - proto: FirelockGlass entities: - uid: 46 @@ -35454,42 +35203,6 @@ entities: rot: 1.5707963267948966 rad pos: -24.5,8.5 parent: 1 - - uid: 3166 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -21.5,7.5 - parent: 1 - - uid: 3167 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -20.5,7.5 - parent: 1 - - uid: 3168 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -18.5,7.5 - parent: 1 - - uid: 3169 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -17.5,7.5 - parent: 1 - - uid: 3170 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -15.5,7.5 - parent: 1 - - uid: 3171 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -14.5,7.5 - parent: 1 - uid: 3172 components: - type: Transform @@ -36499,6 +36212,13 @@ entities: - type: Transform pos: -9.370507,-31.394722 parent: 1 +- proto: FoodPoppy + entities: + - uid: 4135 + components: + - type: Transform + pos: -3.6820545,23.685793 + parent: 1 - proto: FoodTartMime entities: - uid: 7783 @@ -36528,8 +36248,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6841 components: - type: MetaData @@ -36538,8 +36256,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6842 components: - type: MetaData @@ -36548,8 +36264,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6843 components: - type: MetaData @@ -36558,8 +36272,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6844 components: - type: MetaData @@ -36568,8 +36280,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6845 components: - type: MetaData @@ -36578,8 +36288,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6846 components: - type: MetaData @@ -36588,8 +36296,6 @@ entities: rot: 3.141592653589793 rad pos: 38.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerCarbonDioxide entities: - uid: 6804 @@ -36597,8 +36303,6 @@ entities: - type: Transform pos: 44.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerNitrogenStation entities: - uid: 6808 @@ -36606,8 +36310,6 @@ entities: - type: Transform pos: 44.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerOxygenStation entities: - uid: 6807 @@ -36615,8 +36317,6 @@ entities: - type: Transform pos: 44.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMinerWaterVapor entities: - uid: 6805 @@ -36624,8 +36324,6 @@ entities: - type: Transform pos: 44.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMixer entities: - uid: 6942 @@ -36635,8 +36333,6 @@ entities: - type: Transform pos: 37.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasMixerFlipped entities: - uid: 6932 @@ -36650,8 +36346,6 @@ entities: - type: GasMixer inletTwoConcentration: 0.22000003 inletOneConcentration: 0.78 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 6943 @@ -36662,8 +36356,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6944 components: - type: MetaData @@ -36672,8 +36364,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6945 components: - type: MetaData @@ -36682,8 +36372,6 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6946 components: - type: MetaData @@ -36692,16 +36380,12 @@ entities: rot: 3.141592653589793 rad pos: 37.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6947 components: - type: Transform rot: 3.141592653589793 rad pos: 37.5,-16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasOutletInjector entities: - uid: 1436 @@ -36710,64 +36394,48 @@ entities: rot: -1.5707963267948966 rad pos: 43.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6815 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6816 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6817 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6818 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6819 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6821 components: - type: Transform rot: -1.5707963267948966 rad pos: 43.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6959 components: - type: Transform rot: 3.141592653589793 rad pos: 36.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPassiveVent entities: - uid: 6119 @@ -36776,114 +36444,94 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6120 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6121 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6122 components: - type: Transform rot: 1.5707963267948966 rad pos: -19.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6839 components: - type: Transform rot: 3.141592653589793 rad pos: 38.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6875 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6876 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6877 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6878 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6879 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6880 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6881 components: - type: Transform rot: 3.141592653589793 rad pos: 45.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6958 components: - type: Transform rot: 3.141592653589793 rad pos: 34.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6992 components: - type: Transform rot: -1.5707963267948966 rad pos: 41.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPipeBend entities: + - uid: 5881 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 6882 components: - type: Transform @@ -37926,6 +37574,13 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 3171 + components: + - type: Transform + pos: -24.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 10454 components: - type: Transform @@ -37954,13 +37609,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10877 - components: - - type: Transform - pos: -15.5,10.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10926 components: - type: Transform @@ -38033,11 +37681,43 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 1925 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -24.5,7.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 3168 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 3169 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 3351 components: - type: Transform pos: 38.5,-4.5 parent: 1 + - uid: 4884 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 5007 components: - type: Transform @@ -38046,6 +37726,14 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' + - uid: 5621 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -18.5,8.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' - uid: 6103 components: - type: Transform @@ -42961,86 +42649,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10881 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10882 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10883 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10884 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10885 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10886 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10887 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10888 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10889 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,8.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10890 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10891 components: - type: Transform @@ -43185,20 +42793,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 10919 - components: - - type: Transform - pos: -25.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10920 - components: - - type: Transform - pos: -24.5,7.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - uid: 10927 components: - type: Transform @@ -47517,6 +47111,35 @@ entities: color: '#0055CCFF' - proto: GasPipeTJunction entities: + - uid: 3395 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -15.5,10.5 + parent: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5321 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -26.5,6.5 + parent: 1 + - uid: 5600 + components: + - type: Transform + pos: -17.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 5622 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -16.5,9.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 6820 components: - type: Transform @@ -48340,21 +47963,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#0055CCFF' - - uid: 10863 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10864 - components: - - type: Transform - pos: -17.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - uid: 10872 components: - type: Transform @@ -48362,27 +47970,6 @@ entities: parent: 1 - type: AtmosPipeColor color: '#990000FF' - - uid: 10875 - components: - - type: Transform - pos: -14.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10876 - components: - - type: Transform - pos: -20.5,9.5 - parent: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10878 - components: - - type: Transform - pos: -21.5,10.5 - parent: 1 - - type: AtmosPipeColor - color: '#990000FF' - uid: 10905 components: - type: Transform @@ -49061,8 +48648,6 @@ entities: - type: Transform pos: 10.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 3835 @@ -49070,8 +48655,6 @@ entities: - type: Transform pos: 11.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 5918 @@ -49079,82 +48662,70 @@ entities: - type: Transform pos: 35.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6101 components: - type: Transform rot: -1.5707963267948966 rad pos: -14.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6102 components: - type: Transform rot: -1.5707963267948966 rad pos: -14.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6109 components: - type: Transform rot: -1.5707963267948966 rad pos: -15.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6110 components: - type: Transform rot: -1.5707963267948966 rad pos: -15.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6984 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6985 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6986 components: - type: Transform rot: -1.5707963267948966 rad pos: 35.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7199 components: - type: Transform rot: 3.141592653589793 rad pos: 10.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7203 components: - type: Transform rot: 3.141592653589793 rad pos: 11.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasPressurePump entities: + - uid: 3170 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -25.5,6.5 + parent: 1 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 3239 components: - type: MetaData @@ -49162,8 +48733,6 @@ entities: - type: Transform pos: 38.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 6104 @@ -49172,32 +48741,24 @@ entities: rot: -1.5707963267948966 rad pos: -16.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6106 components: - type: Transform rot: 1.5707963267948966 rad pos: -16.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6107 components: - type: Transform rot: -1.5707963267948966 rad pos: -16.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6108 components: - type: Transform rot: 1.5707963267948966 rad pos: -16.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6868 components: - type: MetaData @@ -49206,8 +48767,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6869 components: - type: MetaData @@ -49216,8 +48775,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6870 components: - type: MetaData @@ -49226,8 +48783,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6871 components: - type: MetaData @@ -49236,8 +48791,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6872 components: - type: MetaData @@ -49246,8 +48799,6 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6873 components: - type: MetaData @@ -49256,16 +48807,12 @@ entities: rot: -1.5707963267948966 rad pos: 39.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6874 components: - type: Transform rot: -1.5707963267948966 rad pos: 39.5,-16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6964 components: - type: MetaData @@ -49273,8 +48820,6 @@ entities: - type: Transform pos: 35.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 6976 @@ -49284,8 +48829,6 @@ entities: - type: Transform pos: 35.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6977 components: - type: MetaData @@ -49293,8 +48836,6 @@ entities: - type: Transform pos: 36.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6980 components: - type: MetaData @@ -49303,15 +48844,11 @@ entities: rot: 3.141592653589793 rad pos: 34.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 10190 components: - type: Transform pos: 10.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10192 @@ -49319,26 +48856,26 @@ entities: - type: Transform pos: 11.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasThermoMachineFreezer entities: + - uid: 5319 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -26.5,5.5 + parent: 1 - uid: 7020 components: - type: Transform pos: 34.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7021 components: - type: Transform pos: 34.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasThermoMachineHeater entities: - uid: 6814 @@ -49346,8 +48883,6 @@ entities: - type: Transform pos: 34.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: GasValve entities: - uid: 6978 @@ -49358,8 +48893,6 @@ entities: parent: 1 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 1 - uid: 6990 components: - type: Transform @@ -49368,17 +48901,35 @@ entities: parent: 1 - type: GasValve open: False - - type: AtmosDevice - joinedGrid: 1 - proto: GasVentPump entities: + - uid: 5599 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -23.5,6.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11634 + - type: AtmosPipeColor + color: '#0055CCFF' + - uid: 5885 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -17.5,8.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11632 + - type: AtmosPipeColor + color: '#0055CCFF' - uid: 7151 components: - type: Transform pos: 34.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 7182 @@ -49387,8 +48938,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10112 @@ -49396,8 +48945,6 @@ entities: - type: Transform pos: 27.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10115 @@ -49406,8 +48953,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10143 @@ -49416,8 +48961,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10144 @@ -49426,8 +48969,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10160 @@ -49435,8 +48976,6 @@ entities: - type: Transform pos: 20.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10204 @@ -49445,8 +48984,6 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10219 @@ -49455,8 +48992,6 @@ entities: rot: -1.5707963267948966 rad pos: 11.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10236 @@ -49465,8 +49000,6 @@ entities: rot: -1.5707963267948966 rad pos: 8.5,4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10246 @@ -49475,8 +49008,6 @@ entities: rot: 3.141592653589793 rad pos: 3.5,1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10247 @@ -49485,8 +49016,6 @@ entities: rot: 1.5707963267948966 rad pos: -1.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10248 @@ -49495,8 +49024,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10358 @@ -49504,8 +49031,6 @@ entities: - type: Transform pos: 17.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10359 @@ -49513,8 +49038,6 @@ entities: - type: Transform pos: 29.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10360 @@ -49522,8 +49045,6 @@ entities: - type: Transform pos: 40.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10390 @@ -49532,8 +49053,6 @@ entities: rot: 1.5707963267948966 rad pos: 45.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10391 @@ -49542,8 +49061,6 @@ entities: rot: 1.5707963267948966 rad pos: 45.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10413 @@ -49552,8 +49069,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10432 @@ -49562,8 +49077,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10450 @@ -49572,8 +49085,6 @@ entities: rot: -1.5707963267948966 rad pos: 44.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10451 @@ -49582,8 +49093,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,34.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10475 @@ -49592,8 +49101,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10512 @@ -49602,8 +49109,6 @@ entities: rot: 3.141592653589793 rad pos: 12.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10513 @@ -49612,8 +49117,6 @@ entities: rot: 3.141592653589793 rad pos: 15.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10514 @@ -49622,8 +49125,6 @@ entities: rot: 3.141592653589793 rad pos: 18.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10547 @@ -49632,8 +49133,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10548 @@ -49642,8 +49141,6 @@ entities: rot: 3.141592653589793 rad pos: 26.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10552 @@ -49651,8 +49148,6 @@ entities: - type: Transform pos: 20.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10600 @@ -49661,8 +49156,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10602 @@ -49671,8 +49164,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10604 @@ -49681,8 +49172,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10661 @@ -49691,8 +49180,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10662 @@ -49701,8 +49188,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,27.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10663 @@ -49710,8 +49195,6 @@ entities: - type: Transform pos: 29.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10665 @@ -49719,8 +49202,6 @@ entities: - type: Transform pos: 7.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10697 @@ -49729,8 +49210,6 @@ entities: rot: -1.5707963267948966 rad pos: 4.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10706 @@ -49738,8 +49217,6 @@ entities: - type: Transform pos: -0.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10707 @@ -49748,8 +49225,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10724 @@ -49757,8 +49232,6 @@ entities: - type: Transform pos: 3.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10725 @@ -49767,8 +49240,6 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10748 @@ -49776,8 +49247,6 @@ entities: - type: Transform pos: -1.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10749 @@ -49786,8 +49255,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10762 @@ -49796,8 +49263,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10785 @@ -49806,8 +49271,6 @@ entities: rot: 3.141592653589793 rad pos: 0.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10786 @@ -49816,8 +49279,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10821 @@ -49825,8 +49286,6 @@ entities: - type: Transform pos: -3.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10843 @@ -49835,8 +49294,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10879 @@ -49845,28 +49302,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10902 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10903 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10923 @@ -49874,18 +49309,6 @@ entities: - type: Transform pos: -23.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 10924 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -24.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10943 @@ -49894,8 +49317,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10944 @@ -49904,8 +49325,6 @@ entities: rot: -1.5707963267948966 rad pos: -12.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10967 @@ -49914,8 +49333,6 @@ entities: rot: 3.141592653589793 rad pos: -14.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10968 @@ -49924,8 +49341,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10969 @@ -49934,8 +49349,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 10995 @@ -49944,8 +49357,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11057 @@ -49953,8 +49364,6 @@ entities: - type: Transform pos: -12.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11058 @@ -49962,8 +49371,6 @@ entities: - type: Transform pos: -23.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11059 @@ -49971,8 +49378,6 @@ entities: - type: Transform pos: -34.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11082 @@ -49981,8 +49386,6 @@ entities: rot: 1.5707963267948966 rad pos: -34.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11083 @@ -49990,8 +49393,6 @@ entities: - type: Transform pos: -32.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11121 @@ -50000,8 +49401,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11122 @@ -50010,8 +49409,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11123 @@ -50020,8 +49417,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11124 @@ -50030,8 +49425,6 @@ entities: rot: 1.5707963267948966 rad pos: -43.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11129 @@ -50039,8 +49432,6 @@ entities: - type: Transform pos: -40.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11149 @@ -50049,8 +49440,6 @@ entities: rot: -1.5707963267948966 rad pos: -40.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11150 @@ -50059,8 +49448,6 @@ entities: rot: 3.141592653589793 rad pos: -40.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11162 @@ -50069,8 +49456,6 @@ entities: rot: 1.5707963267948966 rad pos: -38.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11163 @@ -50079,8 +49464,6 @@ entities: rot: 3.141592653589793 rad pos: -37.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11195 @@ -50089,8 +49472,6 @@ entities: rot: 1.5707963267948966 rad pos: -5.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11234 @@ -50099,8 +49480,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11242 @@ -50108,8 +49487,6 @@ entities: - type: Transform pos: -9.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11261 @@ -50117,8 +49494,6 @@ entities: - type: Transform pos: -17.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11285 @@ -50127,8 +49502,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11286 @@ -50137,8 +49510,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11320 @@ -50146,8 +49517,6 @@ entities: - type: Transform pos: -26.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11321 @@ -50156,8 +49525,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11330 @@ -50166,8 +49533,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11367 @@ -50176,8 +49541,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11410 @@ -50186,8 +49549,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11411 @@ -50196,8 +49557,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11476 @@ -50206,8 +49565,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11477 @@ -50216,8 +49573,6 @@ entities: rot: 3.141592653589793 rad pos: -6.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11478 @@ -50226,8 +49581,6 @@ entities: rot: 3.141592653589793 rad pos: -11.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11479 @@ -50235,8 +49588,6 @@ entities: - type: Transform pos: -3.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11480 @@ -50245,8 +49596,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11482 @@ -50254,8 +49603,6 @@ entities: - type: Transform pos: -7.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11510 @@ -50264,8 +49611,6 @@ entities: rot: 1.5707963267948966 rad pos: 1.5,-30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11511 @@ -50274,8 +49619,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,-33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11512 @@ -50284,8 +49627,6 @@ entities: rot: 1.5707963267948966 rad pos: -6.5,-32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11526 @@ -50294,8 +49635,6 @@ entities: rot: 3.141592653589793 rad pos: 5.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11539 @@ -50304,8 +49643,6 @@ entities: rot: 1.5707963267948966 rad pos: 6.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11589 @@ -50314,8 +49651,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11590 @@ -50324,8 +49659,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11591 @@ -50334,8 +49667,6 @@ entities: rot: 1.5707963267948966 rad pos: 11.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11605 @@ -50344,8 +49675,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11608 @@ -50354,18 +49683,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#0055CCFF' - - uid: 11646 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -17.5,8.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 11720 @@ -50374,8 +49691,6 @@ entities: rot: -1.5707963267948966 rad pos: 10.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12148 @@ -50384,8 +49699,6 @@ entities: rot: 3.141592653589793 rad pos: -16.5,-49.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12268 @@ -50394,8 +49707,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12269 @@ -50404,8 +49715,6 @@ entities: rot: 1.5707963267948966 rad pos: -3.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12276 @@ -50414,8 +49723,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,52.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12279 @@ -50424,8 +49731,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,46.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - uid: 12280 @@ -50434,8 +49739,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,44.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#0055CCFF' - proto: GasVentScrubber @@ -50445,8 +49748,28 @@ entities: - type: Transform pos: 12.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5322 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -25.5,7.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11634 + - type: AtmosPipeColor + color: '#990000FF' + - uid: 5882 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -17.5,7.5 + parent: 1 + - type: DeviceNetwork + deviceLists: + - 11632 - type: AtmosPipeColor color: '#990000FF' - uid: 7152 @@ -50455,8 +49778,6 @@ entities: rot: -1.5707963267948966 rad pos: 34.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10113 @@ -50464,8 +49785,6 @@ entities: - type: Transform pos: 28.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10114 @@ -50473,8 +49792,6 @@ entities: - type: Transform pos: 25.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10142 @@ -50483,8 +49800,6 @@ entities: rot: 3.141592653589793 rad pos: 18.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10145 @@ -50493,8 +49808,6 @@ entities: rot: 1.5707963267948966 rad pos: 15.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10161 @@ -50503,8 +49816,6 @@ entities: rot: 1.5707963267948966 rad pos: 21.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10197 @@ -50513,8 +49824,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10220 @@ -50523,8 +49832,6 @@ entities: rot: -1.5707963267948966 rad pos: 11.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10237 @@ -50533,8 +49840,6 @@ entities: rot: 1.5707963267948966 rad pos: 8.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10361 @@ -50543,8 +49848,6 @@ entities: rot: 3.141592653589793 rad pos: 16.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10362 @@ -50553,8 +49856,6 @@ entities: rot: 3.141592653589793 rad pos: 31.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10363 @@ -50563,8 +49864,6 @@ entities: rot: 3.141592653589793 rad pos: 41.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10388 @@ -50573,8 +49872,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10389 @@ -50583,8 +49880,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10414 @@ -50593,8 +49888,6 @@ entities: rot: 1.5707963267948966 rad pos: 42.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10433 @@ -50603,8 +49896,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,27.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10448 @@ -50613,8 +49904,6 @@ entities: rot: 1.5707963267948966 rad pos: 41.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10449 @@ -50623,8 +49912,6 @@ entities: rot: -1.5707963267948966 rad pos: 45.5,33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10474 @@ -50633,8 +49920,6 @@ entities: rot: -1.5707963267948966 rad pos: 15.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10509 @@ -50643,8 +49928,6 @@ entities: rot: 3.141592653589793 rad pos: 11.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10510 @@ -50653,8 +49936,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10511 @@ -50663,8 +49944,6 @@ entities: rot: 3.141592653589793 rad pos: 17.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10549 @@ -50673,8 +49952,6 @@ entities: rot: 3.141592653589793 rad pos: 21.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10550 @@ -50683,8 +49960,6 @@ entities: rot: 3.141592653589793 rad pos: 27.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10551 @@ -50692,8 +49967,6 @@ entities: - type: Transform pos: 21.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10599 @@ -50702,8 +49975,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10601 @@ -50712,8 +49983,6 @@ entities: rot: -1.5707963267948966 rad pos: 37.5,12.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10603 @@ -50722,8 +49991,6 @@ entities: rot: 1.5707963267948966 rad pos: 28.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10658 @@ -50732,8 +49999,6 @@ entities: rot: 3.141592653589793 rad pos: 30.5,26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10659 @@ -50742,8 +50007,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10660 @@ -50752,8 +50015,6 @@ entities: rot: 1.5707963267948966 rad pos: 25.5,28.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10664 @@ -50762,8 +50023,6 @@ entities: rot: 3.141592653589793 rad pos: 6.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10696 @@ -50772,8 +50031,6 @@ entities: rot: 1.5707963267948966 rad pos: 4.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10726 @@ -50782,8 +50039,6 @@ entities: rot: -1.5707963267948966 rad pos: 5.5,28.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10727 @@ -50791,8 +50046,6 @@ entities: - type: Transform pos: 4.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10750 @@ -50801,8 +50054,6 @@ entities: rot: 3.141592653589793 rad pos: -2.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10751 @@ -50811,8 +50062,6 @@ entities: rot: 3.141592653589793 rad pos: -0.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10763 @@ -50821,8 +50070,6 @@ entities: rot: 1.5707963267948966 rad pos: -8.5,30.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10772 @@ -50831,8 +50078,6 @@ entities: rot: 1.5707963267948966 rad pos: 3.5,6.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10773 @@ -50841,8 +50086,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10778 @@ -50851,8 +50094,6 @@ entities: rot: 1.5707963267948966 rad pos: -0.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10812 @@ -50860,8 +50101,6 @@ entities: - type: Transform pos: 0.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10813 @@ -50870,8 +50109,6 @@ entities: rot: 1.5707963267948966 rad pos: -4.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10814 @@ -50880,8 +50117,6 @@ entities: rot: -1.5707963267948966 rad pos: -4.5,15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10842 @@ -50889,8 +50124,6 @@ entities: - type: Transform pos: -8.5,11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10880 @@ -50899,8 +50132,6 @@ entities: rot: -1.5707963267948966 rad pos: -9.5,5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10899 @@ -50908,38 +50139,6 @@ entities: - type: Transform pos: -12.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10900 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -15.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10901 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 10921 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -25.5,6.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10922 @@ -50947,8 +50146,6 @@ entities: - type: Transform pos: -24.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10945 @@ -50957,8 +50154,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10970 @@ -50967,8 +50162,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10971 @@ -50977,8 +50170,6 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10972 @@ -50986,8 +50177,6 @@ entities: - type: Transform pos: -13.5,19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 10994 @@ -50996,8 +50185,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11042 @@ -51006,8 +50193,6 @@ entities: rot: 3.141592653589793 rad pos: -35.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11054 @@ -51016,8 +50201,6 @@ entities: rot: 3.141592653589793 rad pos: -13.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11055 @@ -51026,8 +50209,6 @@ entities: rot: 3.141592653589793 rad pos: -24.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11084 @@ -51036,8 +50217,6 @@ entities: rot: -1.5707963267948966 rad pos: -34.5,8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11085 @@ -51046,8 +50225,6 @@ entities: rot: -1.5707963267948966 rad pos: -33.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11147 @@ -51056,8 +50233,6 @@ entities: rot: 1.5707963267948966 rad pos: -40.5,7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11148 @@ -51065,8 +50240,6 @@ entities: - type: Transform pos: -39.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11151 @@ -51075,8 +50248,6 @@ entities: rot: 1.5707963267948966 rad pos: -40.5,13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11174 @@ -51085,8 +50256,6 @@ entities: rot: 1.5707963267948966 rad pos: -38.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11175 @@ -51095,8 +50264,6 @@ entities: rot: 3.141592653589793 rad pos: -36.5,-9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11176 @@ -51105,8 +50272,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11233 @@ -51115,8 +50280,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11241 @@ -51124,8 +50287,6 @@ entities: - type: Transform pos: -8.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11260 @@ -51133,8 +50294,6 @@ entities: - type: Transform pos: -15.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11283 @@ -51143,8 +50302,6 @@ entities: rot: -1.5707963267948966 rad pos: -14.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11284 @@ -51153,8 +50310,6 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11322 @@ -51163,8 +50318,6 @@ entities: rot: 1.5707963267948966 rad pos: -27.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11323 @@ -51172,8 +50325,6 @@ entities: - type: Transform pos: -24.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11331 @@ -51182,8 +50333,6 @@ entities: rot: 1.5707963267948966 rad pos: -21.5,-1.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11332 @@ -51192,8 +50341,6 @@ entities: rot: -1.5707963267948966 rad pos: -5.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11337 @@ -51202,8 +50349,6 @@ entities: rot: -1.5707963267948966 rad pos: -0.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11366 @@ -51211,8 +50356,6 @@ entities: - type: Transform pos: -1.5,-8.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11408 @@ -51221,8 +50364,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11409 @@ -51231,8 +50372,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11471 @@ -51240,8 +50379,6 @@ entities: - type: Transform pos: -2.5,-21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11472 @@ -51250,8 +50387,6 @@ entities: rot: 3.141592653589793 rad pos: -1.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11473 @@ -51260,8 +50395,6 @@ entities: rot: 3.141592653589793 rad pos: -5.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11474 @@ -51270,8 +50403,6 @@ entities: rot: 3.141592653589793 rad pos: -10.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11475 @@ -51280,8 +50411,6 @@ entities: rot: 1.5707963267948966 rad pos: -17.5,-24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11481 @@ -51290,8 +50419,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11507 @@ -51300,8 +50427,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,-29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11508 @@ -51310,8 +50435,6 @@ entities: rot: 3.141592653589793 rad pos: -3.5,-33.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11509 @@ -51320,8 +50443,6 @@ entities: rot: 1.5707963267948966 rad pos: -6.5,-31.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11527 @@ -51330,8 +50451,6 @@ entities: rot: 3.141592653589793 rad pos: 4.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11538 @@ -51339,8 +50458,6 @@ entities: - type: Transform pos: 5.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11552 @@ -51349,8 +50466,6 @@ entities: rot: 3.141592653589793 rad pos: 10.5,-26.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11587 @@ -51359,8 +50474,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11588 @@ -51369,8 +50482,6 @@ entities: rot: -1.5707963267948966 rad pos: 20.5,-25.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11604 @@ -51378,8 +50489,6 @@ entities: - type: Transform pos: 17.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11609 @@ -51387,18 +50496,6 @@ entities: - type: Transform pos: 31.5,9.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - - type: AtmosPipeColor - color: '#990000FF' - - uid: 11645 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -18.5,8.5 - parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 11719 @@ -51407,8 +50504,6 @@ entities: rot: 3.141592653589793 rad pos: 9.5,-22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12147 @@ -51417,8 +50512,6 @@ entities: rot: 3.141592653589793 rad pos: -15.5,-49.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12270 @@ -51427,8 +50520,6 @@ entities: rot: -1.5707963267948966 rad pos: -3.5,51.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12271 @@ -51437,8 +50528,6 @@ entities: rot: 1.5707963267948966 rad pos: -9.5,53.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12272 @@ -51447,8 +50536,6 @@ entities: rot: -1.5707963267948966 rad pos: 1.5,53.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12277 @@ -51457,8 +50544,6 @@ entities: rot: -1.5707963267948966 rad pos: -2.5,45.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - uid: 12278 @@ -51467,8 +50552,6 @@ entities: rot: 3.141592653589793 rad pos: -7.5,44.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - type: AtmosPipeColor color: '#990000FF' - proto: GeneratorBasic15kW @@ -51490,21 +50573,6 @@ entities: - type: Transform pos: -10.5,-19.5 parent: 1 - - uid: 1763 - components: - - type: Transform - pos: -25.5,19.5 - parent: 1 - - uid: 1788 - components: - - type: Transform - pos: -24.5,19.5 - parent: 1 - - uid: 1792 - components: - - type: Transform - pos: -27.5,22.5 - parent: 1 - proto: GravityGenerator entities: - uid: 7548 @@ -51763,16 +50831,6 @@ entities: - type: Transform pos: -25.5,8.5 parent: 1 - - uid: 240 - components: - - type: Transform - pos: -13.5,6.5 - parent: 1 - - uid: 241 - components: - - type: Transform - pos: -13.5,5.5 - parent: 1 - uid: 242 components: - type: Transform @@ -51793,16 +50851,6 @@ entities: - type: Transform pos: -11.5,4.5 parent: 1 - - uid: 246 - components: - - type: Transform - pos: -16.5,5.5 - parent: 1 - - uid: 247 - components: - - type: Transform - pos: -16.5,6.5 - parent: 1 - uid: 248 components: - type: Transform @@ -51813,16 +50861,6 @@ entities: - type: Transform pos: -18.5,4.5 parent: 1 - - uid: 250 - components: - - type: Transform - pos: -19.5,5.5 - parent: 1 - - uid: 251 - components: - - type: Transform - pos: -19.5,6.5 - parent: 1 - uid: 252 components: - type: Transform @@ -52873,22 +51911,11 @@ entities: - type: Transform pos: 21.5,-28.5 parent: 1 - - uid: 1785 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -24.5,25.5 - parent: 1 - uid: 1800 components: - type: Transform pos: 30.5,14.5 parent: 1 - - uid: 1801 - components: - - type: Transform - pos: -23.5,19.5 - parent: 1 - uid: 1953 components: - type: Transform @@ -55181,18 +54208,6 @@ entities: parent: 1 - proto: GrilleBroken entities: - - uid: 1786 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -23.5,25.5 - parent: 1 - - uid: 1790 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -27.5,23.5 - parent: 1 - uid: 2917 components: - type: Transform @@ -55879,7 +54894,7 @@ entities: - uid: 8243 components: - type: Transform - pos: -24.61685,20.770723 + pos: -24.643688,20.826443 parent: 1 - uid: 9627 components: @@ -55950,28 +54965,6 @@ entities: rot: -1.5707963267948966 rad pos: -18.5,16.5 parent: 1 - - uid: 1855 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,7.5 - parent: 1 - - uid: 1856 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -20.5,7.5 - parent: 1 - - uid: 1857 - components: - - type: Transform - pos: -17.5,7.5 - parent: 1 - - uid: 1858 - components: - - type: Transform - pos: -18.5,7.5 - parent: 1 - uid: 5371 components: - type: Transform @@ -57776,15 +56769,20 @@ entities: parent: 1 - proto: MedicalBed entities: - - uid: 1853 + - uid: 251 components: - type: Transform - pos: -18.5,5.5 + pos: -21.5,5.5 parent: 1 - uid: 1854 components: - type: Transform - pos: -15.5,5.5 + pos: -16.5,5.5 + parent: 1 + - uid: 1857 + components: + - type: Transform + pos: -18.5,5.5 parent: 1 - uid: 1862 components: @@ -58092,7 +57090,7 @@ entities: - uid: 5602 components: - type: Transform - pos: -23.538898,5.5020247 + pos: -23.518227,6.599038 parent: 1 - proto: NitrogenCanister entities: @@ -58101,99 +57099,71 @@ entities: - type: Transform pos: 43.5,-5.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6996 components: - type: Transform pos: 36.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6998 components: - type: Transform pos: 35.5,-4.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8864 components: - type: Transform pos: -13.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8865 components: - type: Transform pos: -29.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8869 components: - type: Transform pos: -32.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9127 components: - type: Transform pos: 24.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9182 components: - type: Transform pos: 28.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9251 components: - type: Transform pos: 31.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9342 components: - type: Transform pos: 35.5,16.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9343 components: - type: Transform pos: 21.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9344 components: - type: Transform pos: 7.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9693 components: - type: Transform pos: -15.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9694 components: - type: Transform pos: -7.5,20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: NitrogenTankFilled entities: - uid: 8927 @@ -58213,22 +57183,16 @@ entities: - type: Transform pos: -18.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6810 components: - type: Transform pos: 43.5,-11.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7003 components: - type: Transform pos: 36.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: NuclearBomb entities: - uid: 4128 @@ -58278,141 +57242,113 @@ entities: - type: Transform pos: 28.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 4924 components: - type: Transform pos: 41.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6802 components: - type: Transform pos: 43.5,-7.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6995 components: - type: Transform pos: 36.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6997 components: - type: Transform pos: 35.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7283 components: - type: Transform pos: 26.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8805 components: - type: Transform pos: -34.5,-23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8863 components: - type: Transform pos: -14.5,-20.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8866 components: - type: Transform pos: -28.5,-10.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 8870 components: - type: Transform pos: -33.5,-19.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9128 components: - type: Transform pos: 23.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9181 components: - type: Transform pos: 27.5,-0.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9252 components: - type: Transform pos: 32.5,32.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9339 components: - type: Transform pos: 7.5,22.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9340 components: - type: Transform pos: 21.5,24.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9341 components: - type: Transform pos: 35.5,17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9662 components: - type: Transform pos: -29.5,29.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9664 components: - type: Transform pos: -18.5,31.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9695 components: - type: Transform pos: -16.5,23.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9696 components: - type: Transform pos: -7.5,21.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 +- proto: OxygenTankFilled + entities: + - uid: 8928 + components: + - type: Transform + pos: -33.421288,-7.524516 + parent: 1 + - uid: 9731 + components: + - type: Transform + pos: -28.423817,12.547613 + parent: 1 - proto: PaintingMonkey entities: - uid: 5040 @@ -58544,6 +57480,16 @@ entities: parent: 1 - proto: PaperOffice entities: + - uid: 232 + components: + - type: Transform + pos: -19.784414,5.480575 + parent: 1 + - uid: 1899 + components: + - type: Transform + pos: -19.565664,5.5587 + parent: 1 - uid: 3999 components: - type: Transform @@ -58769,16 +57715,6 @@ entities: - type: Transform pos: -14.637211,5.5536256 parent: 1 - - uid: 5885 - components: - - type: Transform - pos: -17.62719,5.5455227 - parent: 1 - - uid: 5886 - components: - - type: Transform - pos: -17.62719,5.5455227 - parent: 1 - uid: 5888 components: - type: Transform @@ -59315,22 +58251,16 @@ entities: - type: Transform pos: -20.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6812 components: - type: Transform pos: 43.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7002 components: - type: Transform pos: 35.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: PlasticFlapsAirtightClear entities: - uid: 1743 @@ -59927,6 +58857,11 @@ entities: parent: 1 - proto: PowerCellRecharger entities: + - uid: 246 + components: + - type: Transform + pos: -21.5,11.5 + parent: 1 - uid: 785 components: - type: Transform @@ -59952,11 +58887,6 @@ entities: - type: Transform pos: -9.5,7.5 parent: 1 - - uid: 5902 - components: - - type: Transform - pos: -21.5,11.5 - parent: 1 - uid: 5972 components: - type: Transform @@ -60007,6 +58937,11 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 + - uid: 1860 + components: + - type: Transform + pos: -24.5,24.5 + parent: 1 - uid: 3918 components: - type: Transform @@ -60350,14 +59285,6 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 - - uid: 5931 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,8.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 5932 components: - type: Transform @@ -60397,22 +59324,6 @@ entities: parent: 1 - type: ApcPowerReceiver powerLoad: 0 - - uid: 5937 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -18.5,6.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - - uid: 5938 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -15.5,6.5 - parent: 1 - - type: ApcPowerReceiver - powerLoad: 0 - uid: 5939 components: - type: Transform @@ -61534,6 +60445,12 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-48.5 parent: 1 + - uid: 3560 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -23.5,6.5 + parent: 1 - uid: 4842 components: - type: Transform @@ -61571,11 +60488,6 @@ entities: rot: 1.5707963267948966 rad pos: 44.5,20.5 parent: 1 - - uid: 5598 - components: - - type: Transform - pos: -23.5,5.5 - parent: 1 - uid: 7074 components: - type: Transform @@ -61611,11 +60523,6 @@ entities: - type: Transform pos: -5.5,-28.5 parent: 1 - - uid: 8232 - components: - - type: Transform - pos: -26.5,7.5 - parent: 1 - uid: 8240 components: - type: Transform @@ -62009,6 +60916,11 @@ entities: parent: 1 - proto: RandomArtifactSpawner entities: + - uid: 247 + components: + - type: Transform + pos: -20.5,24.5 + parent: 1 - uid: 6321 components: - type: Transform @@ -62031,11 +60943,6 @@ entities: - type: Transform pos: 42.5,19.5 parent: 1 - - uid: 8235 - components: - - type: Transform - pos: -25.5,23.5 - parent: 1 - proto: RandomBoard entities: - uid: 5005 @@ -62760,16 +61667,6 @@ entities: - type: Transform pos: -27.5,26.5 parent: 1 - - uid: 11805 - components: - - type: Transform - pos: -23.5,22.5 - parent: 1 - - uid: 11806 - components: - - type: Transform - pos: -25.5,21.5 - parent: 1 - uid: 11807 components: - type: Transform @@ -62895,11 +61792,6 @@ entities: - type: Transform pos: -29.5,15.5 parent: 1 - - uid: 11833 - components: - - type: Transform - pos: -23.5,18.5 - parent: 1 - uid: 11834 components: - type: Transform @@ -65619,10 +64511,11 @@ entities: parent: 1 - proto: SheetGlass entities: - - uid: 5600 + - uid: 3166 components: - type: Transform - pos: -23.623562,5.5177503 + rot: 3.141592653589793 rad + pos: -23.643227,6.536538 parent: 1 - uid: 6022 components: @@ -65739,16 +64632,17 @@ entities: parent: 1 - proto: SheetPlastic entities: + - uid: 3167 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -23.486977,6.645913 + parent: 1 - uid: 5419 components: - type: Transform pos: 37.26254,10.609375 parent: 1 - - uid: 5599 - components: - - type: Transform - pos: -23.404812,5.5177503 - parent: 1 - uid: 6020 components: - type: Transform @@ -65973,49 +64867,31 @@ entities: - type: Transform pos: -21.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1896 - uid: 1937 components: - type: Transform pos: -20.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1896 - uid: 1938 components: - type: Transform pos: -18.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1897 - uid: 1939 components: - type: Transform pos: -17.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1897 - uid: 1940 components: - type: Transform pos: -15.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1898 - uid: 1941 components: - type: Transform pos: -14.5,4.5 parent: 1 - - type: DeviceLinkSink - links: - - 1898 - uid: 3618 components: - type: Transform @@ -66364,42 +65240,6 @@ entities: - Pressed: Toggle 3433: - Pressed: Toggle - - uid: 1896 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -19.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1937: - - Pressed: Toggle - 1936: - - Pressed: Toggle - - uid: 1897 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -16.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1939: - - Pressed: Toggle - 1938: - - Pressed: Toggle - - uid: 1898 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -13.5,7.5 - parent: 1 - - type: DeviceLinkSource - linkedPorts: - 1941: - - Pressed: Toggle - 1940: - - Pressed: Toggle - uid: 1978 components: - type: Transform @@ -67281,11 +66121,10 @@ entities: parent: 1 - proto: SignSurgery entities: - - uid: 4884 + - uid: 1859 components: - type: Transform - rot: -1.5707963267948966 rad - pos: -21.5,20.5 + pos: -24.5,19.5 parent: 1 - proto: SignTelecomms entities: @@ -67830,6 +66669,8 @@ entities: rot: -1.5707963267948966 rad pos: -11.5,-50.5 parent: 1 + - type: SpamEmitSound + enabled: False - proto: SpawnMobAlexander entities: - uid: 11924 @@ -67872,23 +66713,6 @@ entities: - type: Transform pos: 36.5,-11.5 parent: 1 -- proto: SpawnMobDrone - entities: - - uid: 9658 - components: - - type: Transform - pos: 11.5,27.5 - parent: 1 - - uid: 9659 - components: - - type: Transform - pos: 12.5,27.5 - parent: 1 - - uid: 9661 - components: - - type: Transform - pos: 13.5,27.5 - parent: 1 - proto: SpawnMobFoxRenault entities: - uid: 4084 @@ -68329,25 +67153,6 @@ entities: - type: Transform pos: 28.5,17.5 parent: 1 -- proto: SpawnVehicleJanicart - entities: - - uid: 7663 - components: - - type: Transform - pos: 14.5,-1.5 - parent: 1 -- proto: SpawnVehicleSecway - entities: - - uid: 5319 - components: - - type: Transform - pos: 18.5,10.5 - parent: 1 - - uid: 5320 - components: - - type: Transform - pos: 19.5,10.5 - parent: 1 - proto: SpawnVendingMachineRestockDrink entities: - uid: 3058 @@ -68439,10 +67244,10 @@ entities: parent: 1 - proto: StasisBed entities: - - uid: 1885 + - uid: 238 components: - type: Transform - pos: -21.5,5.5 + pos: -13.5,5.5 parent: 1 - proto: StationMap entities: @@ -68560,50 +67365,36 @@ entities: - type: Transform pos: -17.5,-18.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6813 components: - type: Transform pos: 43.5,-17.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 6993 components: - type: Transform pos: 34.5,-3.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 7001 components: - type: Transform pos: 34.5,-2.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9561 components: - type: Transform pos: 35.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9562 components: - type: Transform pos: 35.5,-14.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - uid: 9563 components: - type: Transform pos: 35.5,-15.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: Stunbaton entities: - uid: 5327 @@ -69293,6 +68084,11 @@ entities: parent: 1 - proto: Table entities: + - uid: 224 + components: + - type: Transform + pos: -14.5,5.5 + parent: 1 - uid: 233 components: - type: Transform @@ -69335,18 +68131,6 @@ entities: rot: 3.141592653589793 rad pos: -8.5,12.5 parent: 1 - - uid: 483 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -17.5,5.5 - parent: 1 - - uid: 484 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -14.5,5.5 - parent: 1 - uid: 485 components: - type: Transform @@ -69480,11 +68264,17 @@ entities: rot: -1.5707963267948966 rad pos: 24.5,27.5 parent: 1 - - uid: 1890 + - uid: 1853 components: - type: Transform - rot: 3.141592653589793 rad - pos: -12.5,6.5 + rot: -1.5707963267948966 rad + pos: -15.5,5.5 + parent: 1 + - uid: 1856 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -19.5,5.5 parent: 1 - uid: 1902 components: @@ -71252,36 +70042,6 @@ entities: - type: Transform pos: -3.5,-3.5 parent: 1 - - uid: 232 - components: - - type: Transform - pos: -13.5,6.5 - parent: 1 - - uid: 236 - components: - - type: Transform - pos: -16.5,6.5 - parent: 1 - - uid: 237 - components: - - type: Transform - pos: -16.5,5.5 - parent: 1 - - uid: 238 - components: - - type: Transform - pos: -19.5,5.5 - parent: 1 - - uid: 239 - components: - - type: Transform - pos: -19.5,6.5 - parent: 1 - - uid: 260 - components: - - type: Transform - pos: -13.5,5.5 - parent: 1 - uid: 453 components: - type: Transform @@ -71643,27 +70403,6 @@ entities: - type: Transform pos: -14.498325,-10.477551 parent: 1 -- proto: VehicleKeyJanicart - entities: - - uid: 7660 - components: - - type: Transform - parent: 7659 - - type: Physics - canCollide: False - - type: InsideEntityStorage -- proto: VehicleKeySecway - entities: - - uid: 5321 - components: - - type: Transform - pos: 25.427599,10.5971575 - parent: 1 - - uid: 5322 - components: - - type: Transform - pos: 25.708849,10.6596575 - parent: 1 - proto: VendingBarDrobe entities: - uid: 5952 @@ -71847,10 +70586,10 @@ entities: parent: 1 - proto: VendingMachineMediDrobe entities: - - uid: 5920 + - uid: 5320 components: - type: Transform - pos: -26.5,5.5 + pos: -23.5,5.5 parent: 1 - proto: VendingMachineNutri entities: @@ -77798,21 +76537,6 @@ entities: - type: Transform pos: -13.5,4.5 parent: 1 - - uid: 222 - components: - - type: Transform - pos: -16.5,7.5 - parent: 1 - - uid: 223 - components: - - type: Transform - pos: -13.5,7.5 - parent: 1 - - uid: 224 - components: - - type: Transform - pos: -19.5,7.5 - parent: 1 - uid: 227 components: - type: Transform @@ -77843,6 +76567,11 @@ entities: - type: Transform pos: -27.5,12.5 parent: 1 + - uid: 260 + components: + - type: Transform + pos: -27.5,23.5 + parent: 1 - uid: 271 components: - type: Transform @@ -78164,6 +76893,16 @@ entities: rot: 3.141592653589793 rad pos: -4.5,-10.5 parent: 1 + - uid: 483 + components: + - type: Transform + pos: -27.5,22.5 + parent: 1 + - uid: 484 + components: + - type: Transform + pos: -23.5,25.5 + parent: 1 - uid: 486 components: - type: Transform @@ -79321,6 +78060,11 @@ entities: - type: Transform pos: -22.5,25.5 parent: 1 + - uid: 1763 + components: + - type: Transform + pos: -21.5,21.5 + parent: 1 - uid: 1774 components: - type: Transform @@ -79346,6 +78090,16 @@ entities: - type: Transform pos: -27.5,20.5 parent: 1 + - uid: 1786 + components: + - type: Transform + pos: -24.5,19.5 + parent: 1 + - uid: 1788 + components: + - type: Transform + pos: -24.5,25.5 + parent: 1 - uid: 1789 components: - type: Transform @@ -79411,6 +78165,11 @@ entities: rot: 1.5707963267948966 rad pos: 12.5,-3.5 parent: 1 + - uid: 1858 + components: + - type: Transform + pos: -25.5,19.5 + parent: 1 - uid: 1984 components: - type: Transform @@ -80985,8 +79744,6 @@ entities: - type: Transform pos: 43.5,-13.5 parent: 1 - - type: AtmosDevice - joinedGrid: 1 - proto: WeaponCapacitorRecharger entities: - uid: 780 @@ -81913,25 +80670,13 @@ entities: - uid: 5603 components: - type: Transform - pos: -23.498562,5.5333753 + pos: -23.533852,6.770913 parent: 1 - uid: 6090 components: - type: Transform pos: -28.522102,-7.4028454 parent: 1 -- proto: YellowOxygenTankFilled - entities: - - uid: 8928 - components: - - type: Transform - pos: -33.421288,-7.524516 - parent: 1 - - uid: 9731 - components: - - type: Transform - pos: -28.423817,12.547613 - parent: 1 - proto: ZiptiesBroken entities: - uid: 9314 diff --git a/Resources/Maps/oasis.yml b/Resources/Maps/oasis.yml index 47109ea20e..fe4308f081 100644 --- a/Resources/Maps/oasis.yml +++ b/Resources/Maps/oasis.yml @@ -86,11 +86,11 @@ entities: chunks: 0,0: ind: 0,0 - tiles: HwAAAAACHwAAAAACHwAAAAACHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAABHQAAAAABHQAAAAADHQAAAAACHQAAAAAAHQAAAAACHQAAAAABHQAAAAAAHQAAAAACHwAAAAADHwAAAAAAHwAAAAAAHQAAAAABHQAAAAACHQAAAAABHQAAAAABHQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAACHQAAAAACHQAAAAABHQAAAAACHQAAAAADHwAAAAACHwAAAAACHwAAAAABHQAAAAACHQAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAABgQAAAAAATwAAAAAADAAAAAACDAAAAAAASgAAAAAADAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAABHQAAAAADgQAAAAAADAAAAAACDAAAAAABDAAAAAABDAAAAAADDAAAAAABDAAAAAACDAAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAABHQAAAAAAgQAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAACDAAAAAAADAAAAAADDAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAABSgAAAAAADAAAAAACDAAAAAAADAAAAAAADAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADHQAAAAAAHQAAAAABMgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAABDAAAAAAAHQAAAAACHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAADAAAAAACHQAAAAABHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAAHQAAAAADHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAA + tiles: HwAAAAACHwAAAAACHwAAAAACHQAAAAACHQAAAAAAHQAAAAABHQAAAAAAHQAAAAABHQAAAAABHQAAAAADHQAAAAACHQAAAAAAHQAAAAACHQAAAAABHQAAAAAAHQAAAAACHwAAAAADHwAAAAAAHwAAAAAAHQAAAAABHQAAAAACHQAAAAABHQAAAAABHQAAAAAAHQAAAAACHQAAAAAAHQAAAAABHQAAAAACHQAAAAACHQAAAAABHQAAAAACHQAAAAADHwAAAAACHwAAAAACHwAAAAABHQAAAAACHQAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAABHQAAAAACHQAAAAABgQAAAAAATwAAAAAADAAAAAACDAAAAAAASgAAAAAADAAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAABHQAAAAADgQAAAAAADAAAAAACDAAAAAABDAAAAAABDAAAAAADDAAAAAABDAAAAAACDAAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAABHQAAAAAAgQAAAAAADAAAAAAADAAAAAADDAAAAAAADAAAAAACDAAAAAAADAAAAAADDAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAABSgAAAAAADAAAAAACDAAAAAAADAAAAAAADAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADHQAAAAAAHQAAAAABMgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAABDAAAAAAAHQAAAAACHQAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAADAAAAAACHQAAAAABHQAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAAHQAAAAADHQAAAAABNgAAAAAANgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACHQAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAAHQAAAAADgQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAACDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAA version: 6 -1,0: ind: -1,0 - tiles: HQAAAAADHQAAAAABHQAAAAABHQAAAAABHQAAAAACHQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAAAHwAAAAAAHwAAAAADHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADHQAAAAADHQAAAAAAHQAAAAAAHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAABHQAAAAADHwAAAAAAHwAAAAAADwAAAAABgQAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAABSgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAACHwAAAAAAHwAAAAABDwAAAAABDwAAAAABSgAAAAAASgAAAAAANgAAAAACNgAAAAADSgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAABHQAAAAACHQAAAAAADwAAAAACDwAAAAAADwAAAAABSgAAAAAANgAAAAABNgAAAAACNgAAAAADDAAAAAADSgAAAAAASgAAAAAASgAAAAAADAAAAAACDAAAAAADgQAAAAAAHQAAAAAAHQAAAAACDwAAAAAADwAAAAADDwAAAAABNgAAAAADNgAAAAACNgAAAAACDAAAAAABDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAAgQAAAAAAHQAAAAACDwAAAAADDwAAAAAADwAAAAADNgAAAAADNgAAAAACNgAAAAADSgAAAAAASgAAAAAADwAAAAADDwAAAAAADwAAAAABDwAAAAABSgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAADDwAAAAAADwAAAAAANgAAAAABNgAAAAABNgAAAAADMgAAAAAASgAAAAAADwAAAAACDwAAAAADDwAAAAAADwAAAAADSgAAAAAASgAAAAAASgAAAAAAHQAAAAACDwAAAAACDwAAAAAADwAAAAAADAAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAADwAAAAACDwAAAAAADwAAAAABDwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAABDwAAAAAADwAAAAABDAAAAAAANgAAAAABNgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAACDwAAAAABDwAAAAAADAAAAAADDAAAAAACNgAAAAAANgAAAAACNgAAAAAANgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAAADAAAAAABDAAAAAABMgAAAAAAHQAAAAAADwAAAAABDAAAAAAADAAAAAAASgAAAAAANgAAAAABNgAAAAADNgAAAAABNgAAAAADNgAAAAABDAAAAAADDAAAAAABDAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAAANgAAAAABNgAAAAABNgAAAAAANgAAAAAANgAAAAAANgAAAAADNgAAAAACNgAAAAAAHQAAAAADSgAAAAAADwAAAAACDwAAAAADDwAAAAABSgAAAAAADAAAAAABNgAAAAACNgAAAAADNgAAAAABNgAAAAABNgAAAAADNgAAAAADNgAAAAADNgAAAAABNgAAAAACHQAAAAADSgAAAAAADwAAAAAADwAAAAACDwAAAAACSgAAAAAADAAAAAACNgAAAAACNgAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAACSgAAAAAAHQAAAAACSgAAAAAADwAAAAABDwAAAAACDwAAAAADSgAAAAAADAAAAAABNgAAAAADNgAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAAgQAAAAAAHQAAAAAD + tiles: HQAAAAADHQAAAAABHQAAAAABHQAAAAABHQAAAAACHQAAAAADHQAAAAAAHQAAAAAAHQAAAAADHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAAAHwAAAAAAHwAAAAADHQAAAAACHQAAAAAAHQAAAAAAHQAAAAADHQAAAAADHQAAAAAAHQAAAAAAHQAAAAABHQAAAAADHQAAAAABHQAAAAACHQAAAAADHQAAAAABHQAAAAADHwAAAAAAHwAAAAAADwAAAAABgQAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAABSgAAAAAAgQAAAAAASgAAAAAASgAAAAAASgAAAAAAgQAAAAAAHQAAAAADHQAAAAACHwAAAAAAHwAAAAABDwAAAAABDwAAAAABSgAAAAAASgAAAAAANgAAAAACNgAAAAADSgAAAAAADAAAAAACSgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAABHQAAAAACHQAAAAAADwAAAAACDwAAAAAADwAAAAABSgAAAAAANgAAAAABNgAAAAACNgAAAAADDAAAAAADSgAAAAAASgAAAAAASgAAAAAADAAAAAACDAAAAAADgQAAAAAAHQAAAAAAHQAAAAACDwAAAAAADwAAAAADDwAAAAABNgAAAAADNgAAAAACNgAAAAACDAAAAAABDAAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAADDAAAAAAAgQAAAAAAHQAAAAACDwAAAAADDwAAAAAADwAAAAADNgAAAAADNgAAAAACNgAAAAADSgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAADDwAAAAAADwAAAAAANgAAAAABNgAAAAABNgAAAAADMgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAACDwAAAAACDwAAAAAADwAAAAAADAAAAAAANgAAAAAANgAAAAAASgAAAAAASgAAAAAADwAAAAAADwAAAAAADwAAAAAADwAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAADwAAAAABDwAAAAAADwAAAAABDAAAAAAANgAAAAABNgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAADAAAAAACgQAAAAAAHQAAAAACDwAAAAABDwAAAAAADAAAAAADDAAAAAACNgAAAAAANgAAAAACNgAAAAAANgAAAAAASgAAAAAASgAAAAAADAAAAAAADAAAAAAADAAAAAABDAAAAAABMgAAAAAAHQAAAAAADwAAAAABDAAAAAAADAAAAAAASgAAAAAANgAAAAABNgAAAAADNgAAAAABNgAAAAADNgAAAAABDAAAAAADDAAAAAABDAAAAAABMgAAAAAAMgAAAAAAMgAAAAAAHQAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAABNgAAAAAANgAAAAABNgAAAAABNgAAAAAANgAAAAAANgAAAAAANgAAAAADNgAAAAACNgAAAAAAHQAAAAADSgAAAAAADwAAAAACDwAAAAADDwAAAAABSgAAAAAADAAAAAABNgAAAAACNgAAAAADNgAAAAABNgAAAAABNgAAAAADNgAAAAADNgAAAAADNgAAAAABNgAAAAACHQAAAAADSgAAAAAADwAAAAAADwAAAAACDwAAAAACSgAAAAAADAAAAAACNgAAAAACNgAAAAABSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAACSgAAAAAAHQAAAAACSgAAAAAADwAAAAABDwAAAAACDwAAAAADSgAAAAAADAAAAAABNgAAAAADNgAAAAADSgAAAAAASgAAAAAASgAAAAAASgAAAAAANgAAAAAANgAAAAAAgQAAAAAAHQAAAAAD version: 6 0,-1: ind: 0,-1 @@ -142,7 +142,7 @@ entities: version: 6 -1,-2: ind: -1,-2 - tiles: cwAAAAABcwAAAAAAcwAAAAAAcwAAAAADcwAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcwAAAAACcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAACKQAAAAABKQAAAAACgQAAAAAAYAAAAAADcwAAAAAAcwAAAAACgQAAAAAAcwAAAAABcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAAAYAAAAAAAcwAAAAAAcwAAAAADcwAAAAACcwAAAAADcwAAAAABcwAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAACKQAAAAADgQAAAAAAYAAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAACgQAAAAAAKQAAAAADKQAAAAADKQAAAAADKQAAAAABKQAAAAADKQAAAAAAKQAAAAADgQAAAAAAYAAAAAACcwAAAAACcwAAAAACgQAAAAAAcwAAAAABcwAAAAADcwAAAAAAgQAAAAAAKQAAAAADKQAAAAAAKQAAAAADKQAAAAAAKQAAAAACKQAAAAAAKQAAAAADgQAAAAAAYAAAAAADcwAAAAABcwAAAAADgQAAAAAAcwAAAAACcwAAAAAAcwAAAAAAgQAAAAAAKQAAAAAAKQAAAAABKQAAAAADKQAAAAABKQAAAAABKQAAAAACKQAAAAADgQAAAAAAYAAAAAAAcwAAAAABcwAAAAACgQAAAAAAgQAAAAAAcwAAAAADcwAAAAABgQAAAAAAKQAAAAADKQAAAAACKQAAAAABKQAAAAAAKQAAAAADKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAYAAAAAACYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAbwAAAAAAYAAAAAADYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAACgQAAAAAAMAAAAAACMAAAAAACMAAAAAABMAAAAAADgQAAAAAAQwAAAAAFQwAAAAABQwAAAAACQwAAAAABgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAMAAAAAABMAAAAAADMAAAAAAAMAAAAAACgQAAAAAAQwAAAAAEQwAAAAACQwAAAAAFQwAAAAAFgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAADAAAAAAASgAAAAAADAAAAAACDAAAAAAAgQAAAAAAQwAAAAAEQwAAAAABQwAAAAAFQwAAAAACgQAAAAAADQAAAAAADQAAAAAADQAAAAAAgQAAAAAAYAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAC + tiles: cwAAAAABcwAAAAAAcwAAAAAAcwAAAAADcwAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcwAAAAACcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAACKQAAAAABKQAAAAACgQAAAAAAYAAAAAADcwAAAAAAcwAAAAACgQAAAAAAcwAAAAABcwAAAAACcwAAAAACgQAAAAAAKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAADKQAAAAABKQAAAAAAYAAAAAAAcwAAAAAAcwAAAAADcwAAAAACcwAAAAADcwAAAAABcwAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAAAKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAADcwAAAAACgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABdwAAAAAAdwAAAAAAdwAAAAAAgQAAAAAAYAAAAAACcwAAAAACcwAAAAACgQAAAAAAcwAAAAABcwAAAAADcwAAAAAAgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAAAdwAAAAAAdwAAAAAAdwAAAAAAgQAAAAAAYAAAAAADcwAAAAABcwAAAAADgQAAAAAAcwAAAAACcwAAAAAAcwAAAAAAgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAKQAAAAABKQAAAAAAKQAAAAAAKQAAAAAAgQAAAAAAYAAAAAAAcwAAAAABcwAAAAACgQAAAAAAgQAAAAAAcwAAAAADcwAAAAABgQAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAJgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAJgAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAgQAAAAAAYAAAAAACYAAAAAADbwAAAAAAbwAAAAAAbwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAbwAAAAAAbwAAAAAAYAAAAAADYAAAAAADgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAcAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAACgQAAAAAAMAAAAAACMAAAAAACMAAAAAABMAAAAAADgQAAAAAAQwAAAAAFQwAAAAABQwAAAAACQwAAAAABgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAAMAAAAAABMAAAAAADMAAAAAAAMAAAAAACgQAAAAAAQwAAAAAEQwAAAAACQwAAAAAFQwAAAAAFgQAAAAAADgAAAAAADgAAAAAADgAAAAAAgQAAAAAAYAAAAAADgQAAAAAADAAAAAAASgAAAAAADAAAAAACDAAAAAAAgQAAAAAAQwAAAAAEQwAAAAABQwAAAAAFQwAAAAACgQAAAAAADQAAAAAADQAAAAAADQAAAAAAgQAAAAAAYAAAAAACSgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAASgAAAAAAHQAAAAAC version: 6 -2,-2: ind: -2,-2 @@ -174,7 +174,7 @@ entities: version: 6 2,-1: ind: 2,-1 - tiles: KQAAAAACgQAAAAAAKQAAAAACKQAAAAACgQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAABKQAAAAABKQAAAAABKQAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAABKQAAAAABgQAAAAAAKQAAAAADKQAAAAADgQAAAAAAKQAAAAACKQAAAAACKQAAAAADKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAADKQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAAAgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAAAJwAAAAADJwAAAAADJwAAAAAAJwAAAAABJwAAAAABKQAAAAAAKQAAAAACKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAAAKQAAAAAAKQAAAAABKQAAAAACKQAAAAABJwAAAAACJwAAAAABJwAAAAACJwAAAAACJwAAAAADKQAAAAACKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAABKQAAAAAAKQAAAAABKQAAAAABKQAAAAACJwAAAAABJwAAAAADJwAAAAABJwAAAAAAJwAAAAACKQAAAAABKQAAAAAAKQAAAAACKQAAAAABKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAABKQAAAAADKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAABKQAAAAABKQAAAAABgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAACKQAAAAACgQAAAAAAfQAAAAADfQAAAAADfQAAAAADfQAAAAACIQAAAAAAIQAAAAAAgQAAAAAAfQAAAAACfQAAAAADfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAADKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAAAfwAAAAAAIQAAAAACIQAAAAACgQAAAAAAgQAAAAAAfwAAAAACgQAAAAAAgQAAAAAAKQAAAAABKQAAAAACKQAAAAABKQAAAAABfwAAAAADfQAAAAABfQAAAAAAfQAAAAABfwAAAAABfQAAAAADfQAAAAAAfQAAAAACfQAAAAAAfQAAAAAAfQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADKQAAAAACgQAAAAAAfwAAAAAAfwAAAAADfwAAAAADfwAAAAADfQAAAAAAfQAAAAADfQAAAAADfQAAAAACfQAAAAACfQAAAAAAfwAAAAACfQAAAAABgQAAAAAAKQAAAAABKQAAAAABfwAAAAAAfQAAAAADfQAAAAADfQAAAAAAfwAAAAAAfQAAAAABfQAAAAACfQAAAAAAfQAAAAABfQAAAAABfQAAAAADgQAAAAAAfQAAAAAAgQAAAAAAKQAAAAABKQAAAAADgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABfwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAACgQAAAAAAKQAAAAAAKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAACfQAAAAABgQAAAAAAYAAAAAABYAAAAAACYAAAAAAAYAAAAAADgQAAAAAAYAAAAAACYAAAAAACYAAAAAACYAAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAKQAAAAADKQAAAAACYAAAAAADgQAAAAAAYAAAAAABYAAAAAAAYAAAAAACYAAAAAABYAAAAAACYAAAAAADYAAAAAADYAAAAAADYAAAAAAAYAAAAAABYAAAAAADYAAAAAABYAAAAAADYAAAAAADYAAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAAD + tiles: KQAAAAACgQAAAAAAKQAAAAACKQAAAAACgQAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAABKQAAAAABKQAAAAABKQAAAAAAKQAAAAABKQAAAAACKQAAAAAAKQAAAAABKQAAAAABgQAAAAAAKQAAAAADKQAAAAADgQAAAAAAKQAAAAACKQAAAAACKQAAAAADKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAAAKQAAAAABKQAAAAADKQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAAAgQAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAAAKQAAAAACKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAAAKQAAAAAAKQAAAAABKQAAAAACKQAAAAABJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAACKQAAAAACKQAAAAACKQAAAAAAKQAAAAACKQAAAAACKQAAAAABKQAAAAAAKQAAAAABKQAAAAABKQAAAAACJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAJwAAAAAAKQAAAAABKQAAAAAAKQAAAAACKQAAAAABKQAAAAADKQAAAAADKQAAAAABKQAAAAABKQAAAAABKQAAAAADKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAABKQAAAAABKQAAAAABgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADgQAAAAAAgQAAAAAAgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAACKQAAAAACgQAAAAAAfQAAAAADfQAAAAADfQAAAAADfQAAAAACIQAAAAAAIQAAAAAAgQAAAAAAfQAAAAACfQAAAAADfQAAAAABgQAAAAAAKQAAAAAAKQAAAAAAKQAAAAADKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAAAfwAAAAAAIQAAAAACIQAAAAACgQAAAAAAgQAAAAAAfwAAAAACgQAAAAAAgQAAAAAAKQAAAAABKQAAAAACKQAAAAABKQAAAAABfwAAAAADfQAAAAABfQAAAAAAfQAAAAABfwAAAAABfQAAAAADfQAAAAAAfQAAAAACfQAAAAAAfQAAAAAAfQAAAAACgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAADKQAAAAACgQAAAAAAfwAAAAAAfwAAAAADfwAAAAADfwAAAAADfQAAAAAAfQAAAAADfQAAAAADfQAAAAACfQAAAAACfQAAAAAAfwAAAAACfQAAAAABgQAAAAAAKQAAAAABKQAAAAABfwAAAAAAfQAAAAADfQAAAAADfQAAAAAAfwAAAAAAfQAAAAABfQAAAAACfQAAAAAAfQAAAAABfQAAAAABfQAAAAADgQAAAAAAfQAAAAAAgQAAAAAAKQAAAAABKQAAAAADgQAAAAAAfQAAAAAAfQAAAAACfQAAAAABfwAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAKQAAAAACgQAAAAAAKQAAAAAAKQAAAAADgQAAAAAAfQAAAAADfQAAAAACfQAAAAACfQAAAAABgQAAAAAAYAAAAAABYAAAAAACYAAAAAAAYAAAAAADgQAAAAAAYAAAAAACYAAAAAACYAAAAAACYAAAAAACgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAYAAAAAAAKQAAAAADKQAAAAACYAAAAAADgQAAAAAAYAAAAAABYAAAAAAAYAAAAAACYAAAAAABYAAAAAACYAAAAAADYAAAAAADYAAAAAADYAAAAAAAYAAAAAABYAAAAAADYAAAAAABYAAAAAADYAAAAAADYAAAAAAAYAAAAAACYAAAAAADYAAAAAACYAAAAAAD version: 6 2,0: ind: 2,0 @@ -370,11 +370,11 @@ entities: version: 6 4,0: ind: 4,0 - tiles: gQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: DAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-1: ind: 4,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgQAAAAAAgQAAAAAAgQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAAAAAAAgQAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA version: 6 4,-2: ind: 4,-2 @@ -444,2685 +444,2706 @@ entities: color: '#FFFFFFFF' id: Arrows decals: - 720: 42.99683,-1.538444 + 716: 42.99683,-1.538444 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: Arrows decals: - 721: 39.96558,-1.975944 + 717: 39.96558,-1.975944 - node: color: '#FFFFFFFF' id: Bot decals: - 974: -57,-9 - 975: -56,-9 - 976: -55,-9 - 977: -55,-10 - 978: -56,-10 - 979: -57,-10 - 980: -57,-11 - 981: -56,-11 - 982: -55,-11 - 983: -55,-12 - 984: -56,-12 - 985: -57,-12 + 970: -57,-9 + 971: -56,-9 + 972: -55,-9 + 973: -55,-10 + 974: -56,-10 + 975: -57,-10 + 976: -57,-11 + 977: -56,-11 + 978: -55,-11 + 979: -55,-12 + 980: -56,-12 + 981: -57,-12 + 3731: -3,-31 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: Bot decals: - 725: 40,-3 + 721: 40,-3 - node: color: '#FFFFFFFF' id: BotGreyscale decals: - 2778: 35,-25 - 2779: 35,-26 - 2780: 32,-25 - 2781: 32,-24 - 2782: 32,-22 - 2893: 7,-38 - 3024: 15,-40 - 3025: 15,-41 + 2773: 35,-25 + 2774: 35,-26 + 2775: 32,-25 + 2776: 32,-24 + 2777: 32,-22 + 2888: 7,-38 + 3019: 15,-40 + 3020: 15,-41 - node: angle: 3.141592653589793 rad color: '#FFFFFFFF' id: BotLeft decals: - 722: 43,-3 - 723: 42,-3 - 724: 41,-3 + 718: 43,-3 + 719: 42,-3 + 720: 41,-3 - node: color: '#FFFFFFFF' id: BotLeftGreyscale decals: - 2894: 7,-38 + 2889: 7,-38 - node: color: '#FFFFFFFF' id: BotRightGreyscale decals: - 2895: 7,-38 + 2890: 7,-38 - node: color: '#FFFFFFFF' id: Box decals: - 1785: 49,-37 - 1786: 49,-38 - 2397: -7,-51 - 2398: -5,-53 + 1781: 49,-37 + 1782: 49,-38 + 2393: -7,-51 + 2394: -5,-53 - node: color: '#C74EBDB2' id: BrickCornerOverlayNE decals: - 2990: -18,-25 + 2985: -18,-25 - node: color: '#EFB34196' id: BrickCornerOverlayNE decals: - 2540: 5,51 - 3155: -3,42 + 2536: 5,51 + 3150: -3,42 - node: color: '#F9801DB2' id: BrickCornerOverlayNE decals: - 3003: -22,-25 + 2998: -22,-25 - node: color: '#FED83DB2' id: BrickCornerOverlayNE decals: - 2996: -15,-25 + 2991: -15,-25 - node: color: '#C74EBDB2' id: BrickCornerOverlayNW decals: - 2991: -20,-25 + 2986: -20,-25 - node: color: '#EFB34196' id: BrickCornerOverlayNW decals: - 2541: 3,51 - 3154: -6,42 + 2537: 3,51 + 3149: -6,42 - node: color: '#F9801DB2' id: BrickCornerOverlayNW decals: - 3002: -23,-25 + 2997: -23,-25 - node: color: '#FED83DB2' id: BrickCornerOverlayNW decals: - 2997: -16,-25 + 2992: -16,-25 - node: color: '#C74EBDB2' id: BrickCornerOverlaySE decals: - 2993: -18,-26 + 2988: -18,-26 - node: color: '#EFB34196' id: BrickCornerOverlaySE decals: - 2542: 5,49 - 3152: -3,41 + 2538: 5,49 + 3147: -3,41 - node: color: '#F9801DB2' id: BrickCornerOverlaySE decals: - 3000: -22,-26 + 2995: -22,-26 - node: color: '#FED83DB2' id: BrickCornerOverlaySE decals: - 2998: -15,-26 + 2993: -15,-26 - node: color: '#C74EBDB2' id: BrickCornerOverlaySW decals: - 2992: -20,-26 + 2987: -20,-26 - node: color: '#EFB34196' id: BrickCornerOverlaySW decals: - 2494: 7,40 - 2543: 3,49 - 3153: -6,41 + 2490: 7,40 + 2539: 3,49 + 3148: -6,41 - node: color: '#F9801DB2' id: BrickCornerOverlaySW decals: - 3001: -23,-26 + 2996: -23,-26 - node: color: '#FED83DB2' id: BrickCornerOverlaySW decals: - 2999: -16,-26 + 2994: -16,-26 - node: color: '#EFB34196' id: BrickLineOverlayE decals: - 2505: 9,50 - 2506: 9,48 - 2507: 9,47 - 2515: 19,50 - 2526: 19,51 - 2527: 9,51 - 2546: 5,50 - 2548: 3,50 + 2501: 9,50 + 2502: 9,48 + 2503: 9,47 + 2511: 19,50 + 2522: 19,51 + 2523: 9,51 + 2542: 5,50 + 2544: 3,50 - node: color: '#C74EBDB2' id: BrickLineOverlayN decals: - 2994: -19,-25 - 3005: -20,-27 - 3006: -18,-27 - 3012: -19,-27 + 2989: -19,-25 + 3000: -20,-27 + 3001: -18,-27 + 3007: -19,-27 - node: color: '#EFB34196' id: BrickLineOverlayN decals: - 2508: 10,46 - 2509: 11,46 - 2510: 15,46 - 2511: 16,46 - 2545: 4,51 - 2551: 4,49 - 3156: -4,42 - 3157: -5,42 + 2504: 10,46 + 2505: 11,46 + 2506: 15,46 + 2507: 16,46 + 2541: 4,51 + 2547: 4,49 + 3151: -4,42 + 3152: -5,42 - node: color: '#F9801DB2' id: BrickLineOverlayN decals: - 3004: -23,-27 - 3013: -22,-27 + 2999: -23,-27 + 3008: -22,-27 - node: color: '#FED83DB2' id: BrickLineOverlayN decals: - 3007: -15,-27 - 3011: -16,-27 + 3002: -15,-27 + 3006: -16,-27 - node: color: '#C74EBDB2' id: BrickLineOverlayS decals: - 2995: -19,-26 + 2990: -19,-26 - node: color: '#EFB34196' id: BrickLineOverlayS decals: - 2547: 4,49 - 2549: 4,51 - 3158: -5,41 - 3159: -4,41 + 2543: 4,49 + 2545: 4,51 + 3153: -5,41 + 3154: -4,41 - node: color: '#EFB34196' id: BrickLineOverlayW decals: - 2495: 7,41 - 2496: 7,42 - 2497: 7,43 - 2498: 7,44 - 2499: 7,45 - 2500: 7,46 - 2501: 7,47 - 2502: 7,48 - 2503: 7,49 - 2504: 7,50 - 2512: 17,47 - 2513: 17,48 - 2514: 17,50 - 2525: 17,51 - 2528: 7,51 - 2544: 3,50 - 2550: 5,50 + 2491: 7,41 + 2492: 7,42 + 2493: 7,43 + 2494: 7,44 + 2495: 7,45 + 2496: 7,46 + 2497: 7,47 + 2498: 7,48 + 2499: 7,49 + 2500: 7,50 + 2508: 17,47 + 2509: 17,48 + 2510: 17,50 + 2521: 17,51 + 2524: 7,51 + 2540: 3,50 + 2546: 5,50 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNe decals: - 885: -53,8 - 886: -52,7 - 1778: 42,-40 + 881: -53,8 + 882: -52,7 + 1774: 42,-40 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerNw decals: - 883: -55,8 - 887: -57,7 - 1777: 40,-40 + 879: -55,8 + 883: -57,7 + 1773: 40,-40 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSe decals: - 888: -52,5 + 884: -52,5 - node: color: '#FFFFFFFF' id: BrickTileDarkCornerSw decals: - 889: -57,5 + 885: -57,5 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNe decals: - 631: 22,4 - 896: -53,7 + 627: 22,4 + 892: -53,7 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerNw decals: - 897: -55,7 + 893: -55,7 - node: color: '#FFFFFFFF' id: BrickTileDarkInnerSe decals: - 632: 22,9 + 628: 22,9 - node: color: '#FFFFFFFF' id: BrickTileDarkLineE decals: - 627: 22,8 - 628: 22,7 - 629: 22,6 - 630: 22,5 - 898: -52,6 - 2575: 27,42 - 2576: 27,43 - 2577: 30,42 - 2578: 30,43 + 623: 22,8 + 624: 22,7 + 625: 22,6 + 626: 22,5 + 894: -52,6 + 2571: 27,42 + 2572: 27,43 + 2573: 30,42 + 2574: 30,43 - node: color: '#FFFFFFFF' id: BrickTileDarkLineN decals: - 884: -54,8 - 895: -56,7 - 1779: 41,-40 + 880: -54,8 + 891: -56,7 + 1775: 41,-40 + 3767: -8,-24 - node: color: '#FFFFFFFF' id: BrickTileDarkLineS decals: - 890: -56,5 - 891: -55,5 - 892: -54,5 - 893: -53,5 + 886: -56,5 + 887: -55,5 + 888: -54,5 + 889: -53,5 - node: color: '#FFFFFFFF' id: BrickTileDarkLineW decals: - 894: -57,6 - 2579: 31,42 - 2580: 31,43 + 890: -57,6 + 2575: 31,42 + 2576: 31,43 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerNe decals: - 735: -1,-34 - 2381: -4,-50 - 2445: 32,-38 - 3138: -28,42 + 731: -1,-34 + 2377: -4,-50 + 2441: 32,-38 + 3133: -28,42 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerNw decals: - 151: 18,-19 - 152: 19,-18 - 2382: -8,-50 - 2444: 29,-38 - 3139: -33,42 + 2378: -8,-50 + 2440: 29,-38 + 3134: -33,42 + 3512: 19,-18 + 3513: 18,-19 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerSe decals: - 734: -1,-39 - 2383: -4,-54 - 2453: 32,-40 - 3140: -28,40 + 730: -1,-39 + 2379: -4,-54 + 2449: 32,-40 + 3135: -28,40 - node: color: '#FFFFFFFF' id: BrickTileSteelCornerSw decals: - 2384: -8,-54 - 2449: 29,-40 - 3141: -33,40 + 2380: -8,-54 + 2445: 29,-40 + 3136: -33,40 - node: color: '#FFFFFFFF' id: BrickTileSteelEndN decals: - 2373: -8,-44 + 2369: -8,-44 - node: color: '#FFFFFFFF' id: BrickTileSteelEndS decals: - 2374: -8,-48 + 2370: -8,-48 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerNe decals: - 732: -2,-34 + 728: -2,-34 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerNw decals: - 156: 19,-19 + 3518: 19,-19 - node: color: '#FFFFFFFF' id: BrickTileSteelInnerSe decals: - 731: -2,-39 + 727: -2,-39 - node: color: '#FFFFFFFF' id: BrickTileSteelLineE decals: - 726: -2,-40 - 727: -1,-38 - 728: -1,-37 - 729: -1,-36 - 730: -1,-35 - 733: -2,-33 - 1866: 17,30 - 2375: -8,-47 - 2376: -8,-46 - 2377: -8,-45 - 2385: -4,-53 - 2386: -4,-52 - 2387: -4,-51 - 2452: 32,-39 - 3142: -28,41 + 722: -2,-40 + 723: -1,-38 + 724: -1,-37 + 725: -1,-36 + 726: -1,-35 + 729: -2,-33 + 1862: 17,30 + 2371: -8,-47 + 2372: -8,-46 + 2373: -8,-45 + 2381: -4,-53 + 2382: -4,-52 + 2383: -4,-51 + 2448: 32,-39 + 3137: -28,41 - node: color: '#FFFFFFFF' id: BrickTileSteelLineN decals: - 154: 20,-18 - 155: 21,-18 - 2388: -5,-50 - 2389: -6,-50 - 2390: -7,-50 - 2446: 30,-38 - 2450: 31,-38 - 3148: -32,42 - 3149: -31,42 - 3150: -30,42 - 3151: -29,42 + 2384: -5,-50 + 2385: -6,-50 + 2386: -7,-50 + 2442: 30,-38 + 2446: 31,-38 + 3143: -32,42 + 3144: -31,42 + 3145: -30,42 + 3146: -29,42 + 3516: 20,-18 + 3517: 21,-18 - node: color: '#FFFFFFFF' id: BrickTileSteelLineS decals: - 2391: -5,-54 - 2392: -6,-54 - 2393: -7,-54 - 2447: 30,-40 - 2448: 31,-40 - 3144: -32,40 - 3145: -31,40 - 3146: -30,40 - 3147: -29,40 + 2387: -5,-54 + 2388: -6,-54 + 2389: -7,-54 + 2443: 30,-40 + 2444: 31,-40 + 3139: -32,40 + 3140: -31,40 + 3141: -30,40 + 3142: -29,40 - node: color: '#FFFFFFFF' id: BrickTileSteelLineW decals: - 150: 18,-20 - 153: 18,-21 - 1867: 12,30 - 2378: -8,-47 - 2379: -8,-46 - 2380: -8,-45 - 2394: -8,-53 - 2395: -8,-52 - 2396: -8,-51 - 2451: 29,-39 - 3143: -33,41 + 1863: 12,30 + 2374: -8,-47 + 2375: -8,-46 + 2376: -8,-45 + 2390: -8,-53 + 2391: -8,-52 + 2392: -8,-51 + 2447: 29,-39 + 3138: -33,41 + 3514: 18,-21 + 3515: 18,-20 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerNe decals: - 3226: -27,43 - 3236: -36,4 - 3238: -42,5 + 3221: -27,43 + 3231: -36,4 + 3233: -42,5 - node: color: '#334E6DC8' id: BrickTileWhiteCornerNe decals: - 620: 24,9 - 623: 24,8 + 616: 24,9 + 619: 24,8 - node: color: '#4B709CFF' id: BrickTileWhiteCornerNe decals: - 464: -24,-35 + 460: -24,-35 - node: color: '#52B4E996' id: BrickTileWhiteCornerNe decals: - 241: -5,-33 - 242: -5,-38 - 505: -25,-26 - 516: -29,-26 - 568: -24,-39 - 2417: 28,-35 - 2439: 37,-37 + 237: -5,-33 + 238: -5,-38 + 501: -25,-26 + 512: -29,-26 + 564: -24,-39 + 2413: 28,-35 + 2435: 37,-37 - node: color: '#765428FF' id: BrickTileWhiteCornerNe decals: - 3390: -53,-17 + 3385: -53,-17 - node: color: '#9FED58B3' id: BrickTileWhiteCornerNe decals: - 2590: -46,-30 + 2586: -46,-30 - node: color: '#BC863FFF' id: BrickTileWhiteCornerNe decals: - 3279: -49,3 + 3274: -49,3 - node: color: '#D381C996' id: BrickTileWhiteCornerNe decals: - 848: -11,-47 - 2245: 16,-35 - 2246: 12,-43 + 844: -11,-47 + 2241: 16,-35 + 2242: 12,-43 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNe decals: - 1602: 51,-3 - 1766: 42,-41 - 1780: 42,-40 + 1598: 51,-3 + 1762: 42,-41 + 1776: 42,-40 - node: color: '#EFB34196' id: BrickTileWhiteCornerNe decals: - 3160: -2,43 + 3155: -2,43 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNe decals: - 585: -30,-27 + 581: -30,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerNw decals: - 3227: -34,43 - 3237: -44,5 + 3222: -34,43 + 3232: -44,5 - node: color: '#334E6DC8' id: BrickTileWhiteCornerNw decals: - 610: 21,8 - 615: 20,8 - 621: 23,9 - 622: 23,8 - 3268: -44,-9 + 606: 21,8 + 611: 20,8 + 617: 23,9 + 618: 23,8 + 3263: -44,-9 - node: color: '#4B709CFF' id: BrickTileWhiteCornerNw decals: - 463: -27,-35 + 459: -27,-35 - node: color: '#52B4E996' id: BrickTileWhiteCornerNw decals: - 235: -10,-38 - 236: -10,-33 - 504: -27,-26 - 515: -33,-26 - 569: -28,-39 - 738: -2,-39 - 2416: 27,-35 + 231: -10,-38 + 232: -10,-33 + 500: -27,-26 + 511: -33,-26 + 565: -28,-39 + 734: -2,-39 + 2412: 27,-35 - node: color: '#765428FF' id: BrickTileWhiteCornerNw decals: - 3389: -58,-17 + 3384: -58,-17 - node: color: '#9FED58B3' id: BrickTileWhiteCornerNw decals: - 2591: -48,-30 + 2587: -48,-30 - node: color: '#BC863FFF' id: BrickTileWhiteCornerNw decals: - 3278: -51,3 - 3415: -51,-2 + 3273: -51,3 + 3410: -51,-2 - node: color: '#D381C996' id: BrickTileWhiteCornerNw decals: - 849: -14,-47 - 2239: 6,-43 - 2240: 14,-35 + 845: -14,-47 + 2235: 6,-43 + 2236: 14,-35 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerNw decals: - 1601: 49,-3 - 1781: 40,-40 + 1597: 49,-3 + 1777: 40,-40 - node: color: '#EFB34196' id: BrickTileWhiteCornerNw decals: - 3171: -7,43 + 3166: -7,43 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerNw decals: - 583: -32,-27 - 584: -32,-27 + 579: -32,-27 + 580: -32,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerSe decals: - 3228: -27,39 - 3240: -36,3 + 3223: -27,39 + 3235: -36,3 - node: color: '#334E6DC8' id: BrickTileWhiteCornerSe decals: - 619: 24,4 - 624: 24,5 - 625: 24,5 + 615: 24,4 + 620: 24,5 + 621: 24,5 - node: color: '#4B709CFF' id: BrickTileWhiteCornerSe decals: - 466: -24,-37 + 462: -24,-37 - node: color: '#52B4E996' id: BrickTileWhiteCornerSe decals: - 237: -5,-35 - 238: -5,-40 - 502: -25,-30 - 514: -29,-30 - 566: -24,-42 - 2437: 34,-42 - 2438: 37,-38 + 233: -5,-35 + 234: -5,-40 + 498: -25,-30 + 510: -29,-30 + 562: -24,-42 + 2433: 34,-42 + 2434: 37,-38 - node: color: '#765428FF' id: BrickTileWhiteCornerSe decals: - 3392: -53,-24 + 3387: -53,-24 - node: color: '#9FED58B3' id: BrickTileWhiteCornerSe decals: - 2588: -46,-31 + 2584: -46,-31 - node: color: '#BC863FFF' id: BrickTileWhiteCornerSe decals: - 3287: -49,-5 + 3282: -49,-5 - node: color: '#D381C996' id: BrickTileWhiteCornerSe decals: - 847: -11,-51 - 2241: 12,-45 - 2242: 16,-44 + 843: -11,-51 + 2237: 12,-45 + 2238: 16,-44 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSe decals: - 1603: 51,-4 + 1599: 51,-4 - node: color: '#EFB34196' id: BrickTileWhiteCornerSe decals: - 3161: -2,40 - 3176: 10,40 - 3181: 19,39 + 3156: -2,40 + 3171: 10,40 + 3176: 19,39 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSe decals: - 582: -30,-29 + 578: -30,-29 - node: color: '#00BEBE7F' id: BrickTileWhiteCornerSw decals: - 3229: -34,39 - 3239: -44,3 + 3224: -34,39 + 3234: -44,3 - node: color: '#334E6DC8' id: BrickTileWhiteCornerSw decals: - 611: 21,5 - 614: 20,5 - 618: 23,4 - 626: 23,5 - 3267: -44,-11 + 607: 21,5 + 610: 20,5 + 614: 23,4 + 622: 23,5 + 3262: -44,-11 - node: color: '#4B709CFF' id: BrickTileWhiteCornerSw decals: - 465: -27,-37 + 461: -27,-37 - node: color: '#52B4E996' id: BrickTileWhiteCornerSw decals: - 239: -10,-40 - 240: -10,-35 - 503: -27,-30 - 517: -33,-30 - 567: -28,-42 - 737: -2,-34 - 2440: 27,-42 + 235: -10,-40 + 236: -10,-35 + 499: -27,-30 + 513: -33,-30 + 563: -28,-42 + 733: -2,-34 + 2436: 27,-42 - node: color: '#765428FF' id: BrickTileWhiteCornerSw decals: - 3391: -58,-24 + 3386: -58,-24 - node: color: '#9FED58B3' id: BrickTileWhiteCornerSw decals: - 2589: -48,-31 + 2585: -48,-31 - node: color: '#BC863FFF' id: BrickTileWhiteCornerSw decals: - 3288: -51,-5 - 3414: -51,1 + 3283: -51,-5 + 3409: -51,1 - node: color: '#D381C996' id: BrickTileWhiteCornerSw decals: - 850: -14,-51 - 2243: 6,-45 - 2244: 14,-44 + 846: -14,-51 + 2239: 6,-45 + 2240: 14,-44 - node: color: '#DE3A3A96' id: BrickTileWhiteCornerSw decals: - 1604: 49,-4 + 1600: 49,-4 - node: color: '#EFB34196' id: BrickTileWhiteCornerSw decals: - 3169: -7,40 - 3180: 17,39 + 3164: -7,40 + 3175: 17,39 - node: color: '#FFFFFFFF' id: BrickTileWhiteCornerSw decals: - 586: -32,-29 + 582: -32,-29 - node: color: '#169C9CFF' id: BrickTileWhiteEndE decals: - 415: -15,-30 + 411: -15,-30 - node: color: '#4B709CFF' id: BrickTileWhiteEndE decals: - 471: -25,-36 + 467: -25,-36 - node: color: '#F38BAAFF' id: BrickTileWhiteEndE decals: - 409: -21,-30 + 405: -21,-30 + - node: + color: '#80C71F80' + id: BrickTileWhiteEndS + decals: + 3541: 53,-20 + - node: + color: '#8932B87F' + id: BrickTileWhiteEndS + decals: + 3538: 49,-20 - node: color: '#DE3A3A96' id: BrickTileWhiteEndS decals: - 1767: 42,-42 + 1763: 42,-42 + - node: + color: '#F9801D7F' + id: BrickTileWhiteEndS + decals: + 3537: 45,-20 - node: color: '#169C9CFF' id: BrickTileWhiteEndW decals: - 414: -17,-30 + 410: -17,-30 - node: color: '#4B709CFF' id: BrickTileWhiteEndW decals: - 472: -26,-36 + 468: -26,-36 - node: color: '#DE3A3A96' id: BrickTileWhiteEndW decals: - 1765: 40,-41 + 1761: 40,-41 - node: color: '#F38BAAFF' id: BrickTileWhiteEndW decals: - 408: -23,-30 + 404: -23,-30 - node: color: '#00BEBE7F' id: BrickTileWhiteInnerNe decals: - 3257: -44,1 - 3265: -42,4 + 3252: -44,1 + 3260: -42,4 - node: color: '#334E6DC8' id: BrickTileWhiteInnerNe decals: - 1368: 33,-8 + 1364: 33,-8 - node: color: '#4B709CFF' id: BrickTileWhiteInnerNe decals: - 484: -27,-37 + 480: -27,-37 - node: color: '#52B4E996' id: BrickTileWhiteInnerNe decals: - 2443: 28,-37 + 2439: 28,-37 - node: color: '#9FED58B3' id: BrickTileWhiteInnerNe decals: - 2598: -48,-31 + 2594: -48,-31 - node: color: '#BC863FFF' id: BrickTileWhiteInnerNe decals: - 3296: -53,-2 - 3297: -53,3 - 3334: -53,1 - 3335: -53,2 - 3336: -53,3 - 3337: -53,-3 - 3338: -53,-4 - 3339: -53,-5 - 3340: -53,-6 - 3341: -53,-7 - 3342: -53,-8 - 3343: -53,-9 - 3344: -53,-10 - 3345: -53,-11 - 3346: -53,-12 - 3347: -53,-13 - 3348: -53,-15 - 3366: -58,3 - 3367: -57,3 - 3368: -56,3 - 3369: -55,3 + 3291: -53,-2 + 3292: -53,3 + 3329: -53,1 + 3330: -53,2 + 3331: -53,3 + 3332: -53,-3 + 3333: -53,-4 + 3334: -53,-5 + 3335: -53,-6 + 3336: -53,-7 + 3337: -53,-8 + 3338: -53,-9 + 3339: -53,-10 + 3340: -53,-11 + 3341: -53,-12 + 3342: -53,-13 + 3343: -53,-15 + 3361: -58,3 + 3362: -57,3 + 3363: -56,3 + 3364: -55,3 - node: color: '#D381C996' id: BrickTileWhiteInnerNe decals: - 2130: 3,-48 - 2133: 3,-45 - 2160: 17,-37 - 2161: 17,-36 - 2162: 17,-35 - 2163: 17,-34 - 2164: 15,-34 - 2165: 14,-34 - 2166: 13,-34 - 2174: 12,-42 - 2175: 11,-42 - 2176: 10,-42 - 2177: 9,-42 - 2178: 8,-42 - 2179: 7,-42 - 2180: 6,-42 - 2181: 5,-42 - 2189: 4,-34 - 2190: 8,-34 - 2191: 11,-40 - 2223: 8,-47 - 2224: 21,-44 - 2229: 13,-46 - 2238: 18,-45 - 2290: 5,-39 - 2343: -9,-42 - 2344: -8,-42 - 2345: -7,-42 - 2346: -7,-43 - 2352: -7,-46 - 2353: -7,-45 - 2356: -7,-49 - 2357: -6,-49 - 2358: -5,-49 - 2359: -5,-49 - 2360: -4,-49 - 2361: -3,-49 - 2362: -3,-50 - 2363: -3,-51 - 2364: -3,-52 - 2365: -3,-53 - 2366: -3,-54 - 2367: -3,-55 - 2918: 17,-42 - 2920: 17,-38 - 2921: 17,-39 - 2922: 17,-40 - 2923: 17,-43 - 2928: 20,-43 - 2929: 19,-43 - 2930: 18,-43 - 3020: 14,-42 - - node: - color: '#D4D4D428' - id: BrickTileWhiteInnerNe - decals: - 1375: 30,-3 - - node: - color: '#DE3A3A96' - id: BrickTileWhiteInnerNe - decals: - 1434: 52,-6 - 1435: 52,-7 - 1436: 53,-8 - 1437: 54,-8 - 1438: 54,-9 - 1439: 54,-14 - 1440: 54,-16 - 1441: 54,-18 - 1442: 54,-17 - 1443: 54,-19 - 1444: 52,-8 - 1445: 54,-15 - 1446: 54,-13 - 1447: 50,-6 - 1448: 48,-6 - 1471: 47,-8 - 1472: 46,-8 - 1491: 40,-15 - 1492: 40,-14 - 1493: 40,-13 - 1494: 40,-12 - 1495: 39,-11 - 1496: 37,-11 - 1497: 36,-11 - 1498: 35,-11 - 1499: 34,-11 - 1500: 33,-11 - 1501: 31,-11 - 1502: 30,-11 - 1553: 42,-21 - 1554: 42,-20 - 1575: 52,-16 - 1576: 51,-16 - 1577: 49,-16 - 1578: 48,-16 - 1579: 47,-16 - 1591: 47,-15 - 1592: 47,-14 - 1593: 47,-13 - 1594: 47,-12 - 1595: 47,-11 - 1596: 47,-10 - 1621: 40,-24 - 1623: 42,-24 - 1640: 39,-25 - 1641: 42,-25 - 1642: 42,-26 - 1643: 42,-28 - 1644: 42,-29 - 1645: 42,-30 - 1675: 38,-35 - 1697: 38,-31 - 1698: 37,-31 - 1699: 36,-31 - 1700: 35,-31 - 1701: 34,-31 - 1702: 33,-31 - 1703: 32,-31 - 1704: 31,-31 - 1705: 30,-31 - 1715: 40,-32 - 1728: 44,-32 - 1729: 43,-32 - 1730: 42,-32 - 1731: 44,-33 - 1732: 44,-34 - 1733: 43,-35 - 1734: 43,-36 - 1743: 39,-37 - 1751: 43,-39 - 1752: 43,-40 - 1753: 43,-41 - 1754: 43,-42 - 1772: 40,-39 - 1775: 39,-39 - 1783: 37,-42 - 2783: 54,-10 - 2899: 40,-25 - 2905: 42,-23 - 2907: 42,-22 - - node: - color: '#EFB34196' - id: BrickTileWhiteInnerNe - decals: - 1808: 6,38 - 1809: 5,38 - 1810: 4,38 - 1811: 8,38 - 1812: 8,37 - 1813: 8,36 - 1814: 8,35 - 1815: 8,34 - 1816: 8,31 - 1817: 8,30 - 1862: 5,31 - 1883: 19,31 - 1898: 25,23 - 1899: 22,28 - 1900: 23,34 - 1901: 25,34 - 1902: 25,40 - 1903: 23,40 - 1917: 22,31 - 2552: 3,49 - 2556: 19,43 - 2569: 9,46 - 3119: 11,31 - - node: - color: '#00BEBE7F' - id: BrickTileWhiteInnerNw - decals: - 3256: -35,1 - - node: - color: '#4B709CFF' - id: BrickTileWhiteInnerNw - decals: - 481: -24,-37 - - node: - color: '#52B4E996' - id: BrickTileWhiteInnerNw - decals: - 745: -1,-39 - - node: - color: '#9FED58B3' - id: BrickTileWhiteInnerNw - decals: - 2595: -46,-31 - - node: - color: '#A4610696' - id: BrickTileWhiteInnerNw - decals: - 1025: -48,-5 - 1026: -48,-5 - - node: - color: '#BC863FFF' - id: BrickTileWhiteInnerNw - decals: - 3298: -53,3 - 3299: -55,3 - 3300: -56,3 - 3301: -57,3 - 3302: -58,3 - 3303: -58,2 - 3304: -58,1 - 3305: -58,0 - 3306: -58,-1 - 3307: -58,-8 - 3308: -58,-9 - 3309: -58,-10 - 3310: -58,-11 - 3311: -58,-12 - 3312: -58,-13 - 3313: -58,-14 - 3314: -58,-15 - 3402: -47,-5 - 3410: -47,-2 - 3419: -50,-2 - - node: - color: '#D381C996' - id: BrickTileWhiteInnerNw - decals: - 2136: 5,-45 - 2141: 5,-42 - 2142: 6,-42 - 2143: 7,-42 - 2144: 8,-42 - 2145: 9,-42 - 2146: 10,-42 - 2147: 11,-42 - 2148: 12,-42 - 2149: 13,-42 - 2150: 13,-41 - 2151: 13,-40 - 2152: 13,-38 - 2153: 13,-37 - 2154: 13,-36 - 2155: 13,-35 - 2156: 13,-34 - 2157: 14,-34 - 2158: 15,-34 + 2126: 3,-48 + 2129: 3,-45 + 2156: 17,-37 + 2157: 17,-36 + 2158: 17,-35 2159: 17,-34 - 2193: 6,-34 - 2194: 10,-34 - 2291: 9,-39 - 2330: -9,-55 - 2331: -9,-53 - 2332: -9,-52 - 2333: -9,-51 - 2334: -9,-50 - 2335: -9,-48 - 2336: -9,-47 - 2337: -9,-46 - 2338: -9,-44 - 2339: -9,-43 - 2340: -9,-42 - 2341: -8,-42 - 2342: -7,-42 - 2368: -3,-49 - 2369: -4,-49 - 2370: -5,-49 - 2371: -6,-49 - 2409: -1,-48 - 2924: 18,-43 - 2925: 19,-43 - 2926: 20,-43 - 2927: 21,-43 - 3021: 16,-42 + 2160: 15,-34 + 2161: 14,-34 + 2162: 13,-34 + 2170: 12,-42 + 2171: 11,-42 + 2172: 10,-42 + 2173: 9,-42 + 2174: 8,-42 + 2175: 7,-42 + 2176: 6,-42 + 2177: 5,-42 + 2185: 4,-34 + 2186: 8,-34 + 2187: 11,-40 + 2219: 8,-47 + 2220: 21,-44 + 2225: 13,-46 + 2234: 18,-45 + 2286: 5,-39 + 2339: -9,-42 + 2340: -8,-42 + 2341: -7,-42 + 2342: -7,-43 + 2348: -7,-46 + 2349: -7,-45 + 2352: -7,-49 + 2353: -6,-49 + 2354: -5,-49 + 2355: -5,-49 + 2356: -4,-49 + 2357: -3,-49 + 2358: -3,-50 + 2359: -3,-51 + 2360: -3,-52 + 2361: -3,-53 + 2362: -3,-54 + 2363: -3,-55 + 2913: 17,-42 + 2915: 17,-38 + 2916: 17,-39 + 2917: 17,-40 + 2918: 17,-43 + 2923: 20,-43 + 2924: 19,-43 + 2925: 18,-43 + 3015: 14,-42 + - node: + color: '#D4D4D428' + id: BrickTileWhiteInnerNe + decals: + 1371: 30,-3 + - node: + color: '#DE3A3A96' + id: BrickTileWhiteInnerNe + decals: + 1430: 52,-6 + 1431: 52,-7 + 1432: 53,-8 + 1433: 54,-8 + 1434: 54,-9 + 1435: 54,-14 + 1436: 54,-16 + 1437: 54,-18 + 1438: 54,-17 + 1440: 52,-8 + 1441: 54,-15 + 1442: 54,-13 + 1443: 50,-6 + 1444: 48,-6 + 1467: 47,-8 + 1468: 46,-8 + 1487: 40,-15 + 1488: 40,-14 + 1489: 40,-13 + 1490: 40,-12 + 1491: 39,-11 + 1492: 37,-11 + 1493: 36,-11 + 1494: 35,-11 + 1495: 34,-11 + 1496: 33,-11 + 1497: 31,-11 + 1498: 30,-11 + 1549: 42,-21 + 1550: 42,-20 + 1571: 52,-16 + 1572: 51,-16 + 1573: 49,-16 + 1574: 48,-16 + 1575: 47,-16 + 1587: 47,-15 + 1588: 47,-14 + 1589: 47,-13 + 1590: 47,-12 + 1591: 47,-11 + 1592: 47,-10 + 1617: 40,-24 + 1619: 42,-24 + 1636: 39,-25 + 1637: 42,-25 + 1638: 42,-26 + 1639: 42,-28 + 1640: 42,-29 + 1641: 42,-30 + 1671: 38,-35 + 1693: 38,-31 + 1694: 37,-31 + 1695: 36,-31 + 1696: 35,-31 + 1697: 34,-31 + 1698: 33,-31 + 1699: 32,-31 + 1700: 31,-31 + 1701: 30,-31 + 1711: 40,-32 + 1724: 44,-32 + 1725: 43,-32 + 1726: 42,-32 + 1727: 44,-33 + 1728: 44,-34 + 1729: 43,-35 + 1730: 43,-36 + 1739: 39,-37 + 1747: 43,-39 + 1748: 43,-40 + 1749: 43,-41 + 1750: 43,-42 + 1768: 40,-39 + 1771: 39,-39 + 1779: 37,-42 + 2778: 54,-10 + 2894: 40,-25 + 2900: 42,-23 + 2902: 42,-22 + 3548: 54,-19 + - node: + color: '#EFB34196' + id: BrickTileWhiteInnerNe + decals: + 1804: 6,38 + 1805: 5,38 + 1806: 4,38 + 1807: 8,38 + 1808: 8,37 + 1809: 8,36 + 1810: 8,35 + 1811: 8,34 + 1812: 8,31 + 1813: 8,30 + 1858: 5,31 + 1879: 19,31 + 1894: 25,23 + 1895: 22,28 + 1896: 23,34 + 1897: 25,34 + 1898: 25,40 + 1899: 23,40 + 1913: 22,31 + 2548: 3,49 + 2552: 19,43 + 2565: 9,46 + 3114: 11,31 + - node: + color: '#FFFFFFFF' + id: BrickTileWhiteInnerNe + decals: + 3688: -6,-29 + - node: + color: '#00BEBE7F' + id: BrickTileWhiteInnerNw + decals: + 3251: -35,1 + - node: + color: '#4B709CFF' + id: BrickTileWhiteInnerNw + decals: + 477: -24,-37 + - node: + color: '#52B4E996' + id: BrickTileWhiteInnerNw + decals: + 741: -1,-39 + - node: + color: '#9FED58B3' + id: BrickTileWhiteInnerNw + decals: + 2591: -46,-31 + - node: + color: '#A4610696' + id: BrickTileWhiteInnerNw + decals: + 1021: -48,-5 + 1022: -48,-5 + - node: + color: '#BC863FFF' + id: BrickTileWhiteInnerNw + decals: + 3293: -53,3 + 3294: -55,3 + 3295: -56,3 + 3296: -57,3 + 3297: -58,3 + 3298: -58,2 + 3299: -58,1 + 3300: -58,0 + 3301: -58,-1 + 3302: -58,-8 + 3303: -58,-9 + 3304: -58,-10 + 3305: -58,-11 + 3306: -58,-12 + 3307: -58,-13 + 3308: -58,-14 + 3309: -58,-15 + 3397: -47,-5 + 3405: -47,-2 + 3414: -50,-2 + - node: + color: '#D381C996' + id: BrickTileWhiteInnerNw + decals: + 2132: 5,-45 + 2137: 5,-42 + 2138: 6,-42 + 2139: 7,-42 + 2140: 8,-42 + 2141: 9,-42 + 2142: 10,-42 + 2143: 11,-42 + 2144: 12,-42 + 2145: 13,-42 + 2146: 13,-41 + 2147: 13,-40 + 2148: 13,-38 + 2149: 13,-37 + 2150: 13,-36 + 2151: 13,-35 + 2152: 13,-34 + 2153: 14,-34 + 2154: 15,-34 + 2155: 17,-34 + 2189: 6,-34 + 2190: 10,-34 + 2287: 9,-39 + 2326: -9,-55 + 2327: -9,-53 + 2328: -9,-52 + 2329: -9,-51 + 2330: -9,-50 + 2331: -9,-48 + 2332: -9,-47 + 2333: -9,-46 + 2334: -9,-44 + 2335: -9,-43 + 2336: -9,-42 + 2337: -8,-42 + 2338: -7,-42 + 2364: -3,-49 + 2365: -4,-49 + 2366: -5,-49 + 2367: -6,-49 + 2405: -1,-48 + 2919: 18,-43 + 2920: 19,-43 + 2921: 20,-43 + 2922: 21,-43 + 3016: 16,-42 - node: color: '#D4D4D428' id: BrickTileWhiteInnerNw decals: - 1376: 33,-3 + 1372: 33,-3 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerNw decals: - 1449: 48,-6 - 1450: 48,-7 - 1451: 48,-8 - 1452: 47,-8 - 1453: 46,-8 - 1454: 46,-9 - 1455: 46,-10 - 1456: 46,-11 - 1457: 46,-12 - 1458: 46,-13 - 1459: 46,-14 - 1460: 46,-15 - 1469: 54,-8 - 1470: 53,-8 - 1473: 50,-6 - 1485: 52,-6 - 1503: 30,-11 - 1504: 30,-12 - 1505: 30,-13 - 1523: 39,-19 - 1526: 37,-18 - 1527: 37,-17 - 1528: 37,-16 - 1529: 37,-15 - 1530: 37,-14 - 1539: 31,-11 - 1540: 33,-11 - 1542: 34,-11 - 1543: 35,-11 - 1544: 36,-11 - 1545: 37,-11 - 1546: 39,-11 - 1580: 48,-16 - 1581: 49,-16 - 1582: 51,-16 - 1583: 52,-16 - 1584: 53,-15 - 1585: 53,-14 - 1586: 53,-13 - 1587: 53,-12 - 1588: 53,-11 - 1589: 53,-10 - 1590: 53,-16 - 1622: 42,-24 - 1624: 40,-24 - 1625: 40,-25 - 1626: 39,-25 - 1627: 39,-26 - 1628: 39,-27 - 1629: 39,-28 - 1630: 39,-29 - 1631: 40,-30 - 1673: 30,-34 - 1676: 40,-35 - 1688: 30,-35 - 1706: 30,-31 - 1707: 31,-31 - 1708: 32,-31 - 1709: 33,-31 - 1710: 34,-31 - 1711: 35,-31 - 1712: 36,-31 - 1713: 37,-31 - 1714: 38,-31 - 1716: 42,-32 - 1717: 43,-32 - 1718: 44,-32 - 1719: 40,-36 - 1720: 40,-37 - 1721: 39,-37 - 1762: 39,-42 - 1763: 39,-40 - 1764: 43,-39 - 1773: 40,-39 - 1774: 39,-39 - 2898: 42,-25 - 2903: 40,-23 - 2913: 40,-19 - 2914: 40,-20 + 1445: 48,-6 + 1446: 48,-7 + 1447: 48,-8 + 1448: 47,-8 + 1449: 46,-8 + 1450: 46,-9 + 1451: 46,-10 + 1452: 46,-11 + 1453: 46,-12 + 1454: 46,-13 + 1455: 46,-14 + 1456: 46,-15 + 1465: 54,-8 + 1466: 53,-8 + 1469: 50,-6 + 1481: 52,-6 + 1499: 30,-11 + 1500: 30,-12 + 1501: 30,-13 + 1519: 39,-19 + 1522: 37,-18 + 1523: 37,-17 + 1524: 37,-16 + 1525: 37,-15 + 1526: 37,-14 + 1535: 31,-11 + 1536: 33,-11 + 1538: 34,-11 + 1539: 35,-11 + 1540: 36,-11 + 1541: 37,-11 + 1542: 39,-11 + 1576: 48,-16 + 1577: 49,-16 + 1578: 51,-16 + 1579: 52,-16 + 1580: 53,-15 + 1581: 53,-14 + 1582: 53,-13 + 1583: 53,-12 + 1584: 53,-11 + 1585: 53,-10 + 1586: 53,-16 + 1618: 42,-24 + 1620: 40,-24 + 1621: 40,-25 + 1622: 39,-25 + 1623: 39,-26 + 1624: 39,-27 + 1625: 39,-28 + 1626: 39,-29 + 1627: 40,-30 + 1669: 30,-34 + 1672: 40,-35 + 1684: 30,-35 + 1702: 30,-31 + 1703: 31,-31 + 1704: 32,-31 + 1705: 33,-31 + 1706: 34,-31 + 1707: 35,-31 + 1708: 36,-31 + 1709: 37,-31 + 1710: 38,-31 + 1712: 42,-32 + 1713: 43,-32 + 1714: 44,-32 + 1715: 40,-36 + 1716: 40,-37 + 1717: 39,-37 + 1758: 39,-42 + 1759: 39,-40 + 1760: 43,-39 + 1769: 40,-39 + 1770: 39,-39 + 2893: 42,-25 + 2898: 40,-23 + 2908: 40,-19 + 2909: 40,-20 - node: color: '#EFB34196' id: BrickTileWhiteInnerNw decals: - 1829: 8,38 - 1830: 6,38 - 1831: 5,38 - 1832: 4,38 - 1833: 4,37 - 1834: 4,34 - 1835: 4,31 - 1836: 4,30 - 1863: 7,31 - 1884: 21,31 - 1904: 25,40 - 1905: 27,40 - 1906: 27,34 - 1907: 25,28 - 1908: 25,34 - 1918: 28,31 - 2553: 5,49 - 2558: 20,43 - 2570: 17,46 - 3120: 18,31 + 1825: 8,38 + 1826: 6,38 + 1827: 5,38 + 1828: 4,38 + 1829: 4,37 + 1830: 4,34 + 1831: 4,31 + 1832: 4,30 + 1859: 7,31 + 1880: 21,31 + 1900: 25,40 + 1901: 27,40 + 1902: 27,34 + 1903: 25,28 + 1904: 25,34 + 1914: 28,31 + 2549: 5,49 + 2554: 20,43 + 2566: 17,46 + 3115: 18,31 - node: color: '#334E6DC8' id: BrickTileWhiteInnerSe decals: - 1369: 33,-4 + 1365: 33,-4 - node: color: '#4B709CFF' id: BrickTileWhiteInnerSe decals: - 483: -27,-35 + 479: -27,-35 - node: color: '#52B4E996' id: BrickTileWhiteInnerSe decals: - 427: -18,-29 - 2441: 34,-38 + 423: -18,-29 + 2437: 34,-38 - node: - color: '#80C71FFF' + color: '#80C71F80' id: BrickTileWhiteInnerSe decals: - 1422: 53,-19 + 3542: 53,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteInnerSe decals: - 1423: 49,-19 + 3540: 49,-19 - node: color: '#9FED58B3' id: BrickTileWhiteInnerSe decals: - 2596: -48,-30 + 2592: -48,-30 - node: color: '#BC863FFF' id: BrickTileWhiteInnerSe decals: - 3315: -58,-15 - 3316: -57,-15 - 3317: -54,-15 - 3318: -53,-15 - 3319: -53,-13 - 3320: -53,-12 - 3321: -53,-11 - 3322: -53,-10 - 3323: -53,-9 - 3324: -53,-8 - 3325: -53,-7 - 3326: -53,-6 - 3327: -53,-4 - 3328: -53,-5 - 3329: -53,-3 - 3330: -53,-2 - 3331: -53,1 - 3332: -53,2 - 3333: -53,3 - 3349: -53,-15 + 3310: -58,-15 + 3311: -57,-15 + 3312: -54,-15 + 3313: -53,-15 + 3314: -53,-13 + 3315: -53,-12 + 3316: -53,-11 + 3317: -53,-10 + 3318: -53,-9 + 3319: -53,-8 + 3320: -53,-7 + 3321: -53,-6 + 3322: -53,-4 + 3323: -53,-5 + 3324: -53,-3 + 3325: -53,-2 + 3326: -53,1 + 3327: -53,2 + 3328: -53,3 + 3344: -53,-15 - node: color: '#D381C996' id: BrickTileWhiteInnerSe decals: - 2131: 3,-45 - 2132: 3,-42 - 2192: 11,-38 - 2195: 21,-42 - 2196: 17,-36 - 2197: 17,-35 - 2198: 17,-34 - 2199: 21,-44 - 2200: 20,-44 - 2201: 19,-44 - 2202: 18,-44 - 2203: 18,-45 - 2204: 17,-45 - 2205: 16,-45 - 2206: 15,-45 - 2207: 14,-45 - 2208: 13,-45 - 2209: 13,-46 - 2210: 12,-46 - 2211: 11,-46 - 2212: 10,-46 - 2213: 9,-46 - 2214: 8,-46 - 2215: 8,-47 - 2216: 5,-47 - 2217: 6,-47 - 2218: 7,-47 - 2292: 5,-35 - 2317: -3,-55 - 2318: -3,-54 - 2319: -3,-53 - 2320: -3,-52 - 2321: -3,-51 - 2322: -3,-50 - 2323: -3,-49 - 2324: -4,-55 - 2325: -5,-55 - 2326: -6,-55 - 2327: -7,-55 - 2328: -8,-55 - 2329: -9,-55 - 2347: -7,-43 - 2348: -7,-42 - 2349: -7,-45 - 2350: -7,-46 - 2351: -7,-48 - 2919: 17,-40 - 2931: 17,-42 - 2932: 17,-39 - 2933: 17,-38 - 2934: 17,-37 - 3022: 14,-39 + 2127: 3,-45 + 2128: 3,-42 + 2188: 11,-38 + 2191: 21,-42 + 2192: 17,-36 + 2193: 17,-35 + 2194: 17,-34 + 2195: 21,-44 + 2196: 20,-44 + 2197: 19,-44 + 2198: 18,-44 + 2199: 18,-45 + 2200: 17,-45 + 2201: 16,-45 + 2202: 15,-45 + 2203: 14,-45 + 2204: 13,-45 + 2205: 13,-46 + 2206: 12,-46 + 2207: 11,-46 + 2208: 10,-46 + 2209: 9,-46 + 2210: 8,-46 + 2211: 8,-47 + 2212: 5,-47 + 2213: 6,-47 + 2214: 7,-47 + 2288: 5,-35 + 2313: -3,-55 + 2314: -3,-54 + 2315: -3,-53 + 2316: -3,-52 + 2317: -3,-51 + 2318: -3,-50 + 2319: -3,-49 + 2320: -4,-55 + 2321: -5,-55 + 2322: -6,-55 + 2323: -7,-55 + 2324: -8,-55 + 2325: -9,-55 + 2343: -7,-43 + 2344: -7,-42 + 2345: -7,-45 + 2346: -7,-46 + 2347: -7,-48 + 2914: 17,-40 + 2926: 17,-42 + 2927: 17,-39 + 2928: 17,-38 + 2929: 17,-37 + 3017: 14,-39 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerSe decals: - 1372: 31,-9 - 1461: 54,-8 - 1462: 54,-9 - 1463: 54,-13 - 1464: 54,-14 - 1465: 54,-15 - 1466: 54,-16 - 1467: 54,-17 - 1468: 54,-18 - 1520: 42,-21 - 1521: 42,-20 - 1522: 42,-19 - 1524: 38,-18 - 1525: 37,-18 - 1533: 34,-13 - 1534: 33,-13 - 1535: 32,-13 - 1536: 30,-13 - 1549: 40,-11 - 1550: 40,-12 - 1551: 40,-13 - 1552: 40,-14 - 1564: 47,-15 - 1565: 47,-14 - 1566: 47,-13 - 1567: 47,-12 - 1568: 47,-11 - 1569: 47,-10 - 1570: 47,-9 - 1571: 48,-9 - 1572: 49,-9 - 1599: 51,-9 - 1600: 52,-9 - 1638: 39,-29 - 1648: 40,-30 - 1649: 42,-30 - 1650: 42,-29 - 1651: 42,-28 - 1652: 42,-26 - 1653: 42,-25 - 1654: 42,-24 - 1671: 28,-31 - 1674: 38,-31 - 1677: 38,-35 - 1689: 30,-35 - 1690: 31,-35 - 1691: 32,-35 - 1692: 33,-35 - 1693: 34,-35 - 1694: 35,-35 - 1695: 36,-35 - 1696: 37,-35 - 1722: 43,-36 - 1723: 43,-35 - 1724: 43,-34 - 1725: 44,-34 - 1726: 44,-33 - 1727: 44,-32 - 1740: 40,-37 - 1741: 39,-37 - 1742: 42,-37 - 1755: 39,-42 - 1756: 40,-42 - 1757: 41,-42 - 1758: 43,-42 - 1759: 43,-41 - 1760: 43,-40 - 1761: 43,-39 - 1784: 37,-40 - 2784: 54,-12 - 2901: 40,-23 - 2904: 42,-23 - 2906: 42,-22 - 2912: 39,-18 + 1368: 31,-9 + 1457: 54,-8 + 1458: 54,-9 + 1459: 54,-13 + 1460: 54,-14 + 1461: 54,-15 + 1462: 54,-16 + 1463: 54,-17 + 1464: 54,-18 + 1516: 42,-21 + 1517: 42,-20 + 1518: 42,-19 + 1520: 38,-18 + 1521: 37,-18 + 1529: 34,-13 + 1530: 33,-13 + 1531: 32,-13 + 1532: 30,-13 + 1545: 40,-11 + 1546: 40,-12 + 1547: 40,-13 + 1548: 40,-14 + 1560: 47,-15 + 1561: 47,-14 + 1562: 47,-13 + 1563: 47,-12 + 1564: 47,-11 + 1565: 47,-10 + 1566: 47,-9 + 1567: 48,-9 + 1568: 49,-9 + 1595: 51,-9 + 1596: 52,-9 + 1634: 39,-29 + 1644: 40,-30 + 1645: 42,-30 + 1646: 42,-29 + 1647: 42,-28 + 1648: 42,-26 + 1649: 42,-25 + 1650: 42,-24 + 1667: 28,-31 + 1670: 38,-31 + 1673: 38,-35 + 1685: 30,-35 + 1686: 31,-35 + 1687: 32,-35 + 1688: 33,-35 + 1689: 34,-35 + 1690: 35,-35 + 1691: 36,-35 + 1692: 37,-35 + 1718: 43,-36 + 1719: 43,-35 + 1720: 43,-34 + 1721: 44,-34 + 1722: 44,-33 + 1723: 44,-32 + 1736: 40,-37 + 1737: 39,-37 + 1738: 42,-37 + 1751: 39,-42 + 1752: 40,-42 + 1753: 41,-42 + 1754: 43,-42 + 1755: 43,-41 + 1756: 43,-40 + 1757: 43,-39 + 1780: 37,-40 + 2779: 54,-12 + 2896: 40,-23 + 2899: 42,-23 + 2901: 42,-22 + 2907: 39,-18 + 3546: 52,-7 + 3547: 52,-6 - node: color: '#EFB34196' id: BrickTileWhiteInnerSe decals: - 1818: 8,30 - 1819: 7,30 - 1820: 6,30 - 1821: 5,30 - 1822: 4,30 - 1823: 8,31 - 1824: 8,34 - 1825: 8,35 - 1826: 8,36 - 1827: 8,37 - 1828: 8,38 - 1865: 5,37 - 1882: 19,34 - 1909: 22,30 - 1910: 23,36 - 1911: 25,36 - 1912: 25,25 - 1920: 22,33 - 2554: 3,51 - 2557: 19,42 - 2568: 10,45 - 2582: 32,42 - 2583: 25,42 - 2585: 23,42 - 3121: 11,33 + 1814: 8,30 + 1815: 7,30 + 1816: 6,30 + 1817: 5,30 + 1818: 4,30 + 1819: 8,31 + 1820: 8,34 + 1821: 8,35 + 1822: 8,36 + 1823: 8,37 + 1824: 8,38 + 1861: 5,37 + 1878: 19,34 + 1905: 22,30 + 1906: 23,36 + 1907: 25,36 + 1908: 25,25 + 1916: 22,33 + 2550: 3,51 + 2553: 19,42 + 2564: 10,45 + 2578: 32,42 + 2579: 25,42 + 2581: 23,42 + 3116: 11,33 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteInnerSe decals: - 1424: 45,-19 + 3545: 45,-19 + - node: + color: '#FFFFFFFF' + id: BrickTileWhiteInnerSe + decals: + 3687: -6,-26 - node: color: '#4B709CFF' id: BrickTileWhiteInnerSw decals: - 482: -24,-35 + 478: -24,-35 - node: color: '#52B4E996' id: BrickTileWhiteInnerSw decals: - 426: -20,-29 - 744: -1,-34 + 422: -20,-29 + 740: -1,-34 - node: - color: '#80C71FFF' + color: '#80C71F80' id: BrickTileWhiteInnerSw decals: - 1427: 53,-19 + 3543: 53,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteInnerSw decals: - 1426: 49,-19 + 3539: 49,-19 - node: color: '#9FED58B3' id: BrickTileWhiteInnerSw decals: - 2597: -46,-30 + 2593: -46,-30 - node: color: '#A4610696' id: BrickTileWhiteInnerSw decals: - 1027: -48,-2 - 1028: -48,-2 + 1023: -48,-2 + 1024: -48,-2 - node: color: '#BC863FFF' id: BrickTileWhiteInnerSw decals: - 3350: -53,-15 - 3351: -54,-15 - 3352: -57,-15 - 3353: -58,-15 - 3354: -58,-14 - 3355: -58,-13 - 3356: -58,-12 - 3357: -58,-11 - 3358: -58,-10 - 3359: -58,-9 - 3360: -58,-8 - 3361: -58,-7 - 3362: -58,0 - 3363: -58,1 - 3364: -58,2 - 3365: -58,3 - 3405: -47,2 - 3411: -47,-2 - 3418: -50,1 + 3345: -53,-15 + 3346: -54,-15 + 3347: -57,-15 + 3348: -58,-15 + 3349: -58,-14 + 3350: -58,-13 + 3351: -58,-12 + 3352: -58,-11 + 3353: -58,-10 + 3354: -58,-9 + 3355: -58,-8 + 3356: -58,-7 + 3357: -58,0 + 3358: -58,1 + 3359: -58,2 + 3360: -58,3 + 3400: -47,2 + 3406: -47,-2 + 3413: -50,1 - node: color: '#D381C996' id: BrickTileWhiteInnerSw decals: - 2134: 5,-42 - 2135: 5,-45 - 2167: 13,-34 - 2168: 13,-35 - 2169: 13,-36 - 2170: 13,-37 - 2171: 13,-38 - 2172: 13,-40 - 2173: 13,-41 - 2219: 6,-47 - 2220: 7,-47 - 2221: 8,-47 - 2222: 9,-46 - 2225: 10,-46 - 2226: 11,-46 - 2227: 12,-46 - 2228: 13,-46 - 2230: 14,-45 - 2231: 16,-45 - 2232: 15,-45 - 2233: 17,-45 - 2234: 18,-45 - 2235: 19,-44 - 2236: 20,-44 - 2237: 21,-44 - 2289: 9,-35 - 2298: -9,-48 - 2299: -5,-46 - 2300: -9,-47 - 2301: -9,-46 - 2302: -9,-44 - 2303: -9,-43 - 2304: -9,-42 - 2305: -9,-50 - 2306: -9,-51 - 2307: -9,-52 - 2308: -9,-53 - 2310: -9,-55 - 2311: -8,-55 - 2312: -7,-55 - 2313: -6,-55 - 2314: -5,-55 - 2315: -4,-55 - 2316: -3,-55 - 2405: -1,-42 - 3023: 16,-39 + 2130: 5,-42 + 2131: 5,-45 + 2163: 13,-34 + 2164: 13,-35 + 2165: 13,-36 + 2166: 13,-37 + 2167: 13,-38 + 2168: 13,-40 + 2169: 13,-41 + 2215: 6,-47 + 2216: 7,-47 + 2217: 8,-47 + 2218: 9,-46 + 2221: 10,-46 + 2222: 11,-46 + 2223: 12,-46 + 2224: 13,-46 + 2226: 14,-45 + 2227: 16,-45 + 2228: 15,-45 + 2229: 17,-45 + 2230: 18,-45 + 2231: 19,-44 + 2232: 20,-44 + 2233: 21,-44 + 2285: 9,-35 + 2294: -9,-48 + 2295: -5,-46 + 2296: -9,-47 + 2297: -9,-46 + 2298: -9,-44 + 2299: -9,-43 + 2300: -9,-42 + 2301: -9,-50 + 2302: -9,-51 + 2303: -9,-52 + 2304: -9,-53 + 2306: -9,-55 + 2307: -8,-55 + 2308: -7,-55 + 2309: -6,-55 + 2310: -5,-55 + 2311: -4,-55 + 2312: -3,-55 + 2401: -1,-42 + 3018: 16,-39 - node: color: '#DE3A3A96' id: BrickTileWhiteInnerSw decals: - 1371: 33,-9 - 1474: 48,-7 - 1475: 48,-6 - 1476: 46,-8 - 1477: 46,-9 - 1478: 46,-10 - 1479: 46,-11 - 1480: 46,-12 - 1481: 46,-13 - 1482: 46,-14 - 1506: 30,-13 - 1507: 32,-13 - 1508: 33,-13 - 1509: 34,-13 - 1510: 36,-13 - 1511: 37,-13 - 1512: 37,-14 - 1513: 37,-15 - 1514: 37,-16 - 1515: 37,-17 - 1516: 37,-18 - 1517: 38,-18 - 1518: 39,-18 - 1519: 39,-19 - 1537: 30,-12 - 1538: 30,-11 - 1555: 51,-9 - 1556: 52,-9 - 1557: 53,-9 - 1558: 53,-10 - 1559: 53,-11 - 1560: 53,-12 - 1561: 53,-13 - 1562: 53,-14 - 1563: 53,-15 - 1597: 48,-9 - 1598: 49,-9 - 1632: 40,-24 - 1633: 39,-25 - 1634: 39,-26 - 1635: 39,-27 - 1636: 39,-28 - 1637: 39,-29 - 1639: 40,-29 - 1646: 42,-30 - 1647: 40,-30 - 1672: 30,-31 - 1678: 38,-35 - 1679: 37,-35 - 1680: 36,-35 - 1681: 35,-35 - 1682: 34,-35 - 1683: 33,-35 - 1684: 32,-35 - 1685: 31,-35 - 1686: 30,-35 - 1687: 30,-34 - 1735: 44,-34 - 1736: 43,-37 - 1737: 42,-37 - 1738: 40,-37 - 1739: 39,-37 - 1744: 40,-35 - 1745: 40,-36 - 1746: 43,-42 - 1747: 41,-42 - 1748: 40,-42 - 1749: 39,-42 - 1750: 39,-40 - 1770: 42,-41 - 1776: 39,-39 - 2900: 42,-23 - 2902: 40,-23 - 2909: 40,-20 - 2910: 40,-19 - 2911: 40,-18 + 1367: 33,-9 + 1470: 48,-7 + 1471: 48,-6 + 1472: 46,-8 + 1473: 46,-9 + 1474: 46,-10 + 1475: 46,-11 + 1476: 46,-12 + 1477: 46,-13 + 1478: 46,-14 + 1502: 30,-13 + 1503: 32,-13 + 1504: 33,-13 + 1505: 34,-13 + 1506: 36,-13 + 1507: 37,-13 + 1508: 37,-14 + 1509: 37,-15 + 1510: 37,-16 + 1511: 37,-17 + 1512: 37,-18 + 1513: 38,-18 + 1514: 39,-18 + 1515: 39,-19 + 1533: 30,-12 + 1534: 30,-11 + 1551: 51,-9 + 1552: 52,-9 + 1553: 53,-9 + 1554: 53,-10 + 1555: 53,-11 + 1556: 53,-12 + 1557: 53,-13 + 1558: 53,-14 + 1559: 53,-15 + 1593: 48,-9 + 1594: 49,-9 + 1628: 40,-24 + 1629: 39,-25 + 1630: 39,-26 + 1631: 39,-27 + 1632: 39,-28 + 1633: 39,-29 + 1635: 40,-29 + 1642: 42,-30 + 1643: 40,-30 + 1668: 30,-31 + 1674: 38,-35 + 1675: 37,-35 + 1676: 36,-35 + 1677: 35,-35 + 1678: 34,-35 + 1679: 33,-35 + 1680: 32,-35 + 1681: 31,-35 + 1682: 30,-35 + 1683: 30,-34 + 1731: 44,-34 + 1732: 43,-37 + 1733: 42,-37 + 1734: 40,-37 + 1735: 39,-37 + 1740: 40,-35 + 1741: 40,-36 + 1742: 43,-42 + 1743: 41,-42 + 1744: 40,-42 + 1745: 39,-42 + 1746: 39,-40 + 1766: 42,-41 + 1772: 39,-39 + 2895: 42,-23 + 2897: 40,-23 + 2904: 40,-20 + 2905: 40,-19 + 2906: 40,-18 - node: color: '#EFB34196' id: BrickTileWhiteInnerSw decals: - 1841: 4,37 - 1842: 4,34 - 1843: 4,30 - 1844: 5,30 - 1845: 6,30 - 1846: 7,30 - 1847: 8,30 - 1848: 4,31 - 1849: 4,38 - 1864: 7,37 - 1872: 10,34 - 1881: 21,34 - 1913: 25,30 - 1914: 25,36 - 1915: 27,36 - 1916: 27,42 - 1919: 28,33 - 1934: 35,42 - 2555: 5,51 - 2559: 20,42 - 2584: 25,42 - 3122: 18,33 - 3191: 17,45 + 1837: 4,37 + 1838: 4,34 + 1839: 4,30 + 1840: 5,30 + 1841: 6,30 + 1842: 7,30 + 1843: 8,30 + 1844: 4,31 + 1845: 4,38 + 1860: 7,37 + 1868: 10,34 + 1877: 21,34 + 1909: 25,30 + 1910: 25,36 + 1911: 27,36 + 1912: 27,42 + 1915: 28,33 + 1930: 35,42 + 2551: 5,51 + 2555: 20,42 + 2580: 25,42 + 3117: 18,33 + 3186: 17,45 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteInnerSw decals: - 1425: 45,-19 + 3544: 45,-19 - node: color: '#00BEBE7F' id: BrickTileWhiteLineE decals: - 3214: -27,40 - 3215: -27,41 - 3216: -27,42 + 3209: -27,40 + 3210: -27,41 + 3211: -27,42 - node: color: '#334E6DC8' id: BrickTileWhiteLineE decals: - 1365: 33,-5 - 1366: 33,-7 - 1367: 33,-6 + 1361: 33,-5 + 1362: 33,-7 + 1363: 33,-6 - node: color: '#4B709CFF' id: BrickTileWhiteLineE decals: - 469: -24,-36 - 473: -27,-36 + 465: -24,-36 + 469: -27,-36 - node: color: '#52B4E996' id: BrickTileWhiteLineE decals: - 243: -5,-39 - 244: -5,-34 - 418: -18,-31 - 419: -18,-30 - 508: -25,-29 - 509: -25,-28 - 510: -25,-27 - 518: -29,-29 - 519: -29,-28 - 520: -29,-27 - 573: -24,-40 - 574: -24,-41 - 2428: 34,-39 - 2429: 34,-40 - 2430: 34,-41 - 2442: 28,-36 + 239: -5,-39 + 240: -5,-34 + 414: -18,-31 + 415: -18,-30 + 504: -25,-29 + 505: -25,-28 + 506: -25,-27 + 514: -29,-29 + 515: -29,-28 + 516: -29,-27 + 569: -24,-40 + 570: -24,-41 + 2424: 34,-39 + 2425: 34,-40 + 2426: 34,-41 + 2438: 28,-36 - node: color: '#765428FF' id: BrickTileWhiteLineE decals: - 3376: -53,-18 - 3377: -53,-19 - 3378: -53,-20 - 3379: -53,-21 - 3380: -53,-22 - 3381: -53,-23 - - node: - color: '#80C71FFF' - id: BrickTileWhiteLineE - decals: - 1420: 53,-20 - - node: - color: '#8932B8FF' - id: BrickTileWhiteLineE - decals: - 1419: 49,-20 + 3371: -53,-18 + 3372: -53,-19 + 3373: -53,-20 + 3374: -53,-21 + 3375: -53,-22 + 3376: -53,-23 - node: color: '#9FED58B3' id: BrickTileWhiteLineE decals: - 2599: -45,-31 - 2600: -45,-30 + 2595: -45,-31 + 2596: -45,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineE decals: - 3273: -53,-14 - 3274: -53,-1 - 3275: -53,0 - 3281: -49,2 - 3282: -49,1 - 3283: -49,0 - 3284: -49,-1 - 3285: -49,-2 - 3286: -49,-4 - 3413: -49,-3 + 3268: -53,-14 + 3269: -53,-1 + 3270: -53,0 + 3276: -49,2 + 3277: -49,1 + 3278: -49,0 + 3279: -49,-1 + 3280: -49,-2 + 3281: -49,-4 + 3408: -49,-3 - node: color: '#D381C996' id: BrickTileWhiteLineE decals: - 854: -11,-50 - 855: -11,-49 - 856: -11,-48 - 2126: 3,-43 - 2127: 3,-44 - 2128: 3,-46 - 2129: 3,-47 - 2183: 17,-41 - 2184: 21,-43 - 2185: 11,-39 - 2253: 12,-44 - 2254: 16,-43 - 2255: 16,-42 - 2256: 16,-41 - 2257: 16,-40 - 2258: 16,-39 - 2259: 16,-38 - 2260: 16,-37 - 2261: 16,-36 - 2283: 5,-38 - 2284: 5,-37 - 2285: 5,-36 - 2293: -7,-47 - 2295: -7,-44 - 2355: -11,-45 - 2399: -3,-47 - 2400: -3,-46 - 3016: 14,-41 - 3017: 14,-40 + 850: -11,-50 + 851: -11,-49 + 852: -11,-48 + 2122: 3,-43 + 2123: 3,-44 + 2124: 3,-46 + 2125: 3,-47 + 2179: 17,-41 + 2180: 21,-43 + 2181: 11,-39 + 2249: 12,-44 + 2250: 16,-43 + 2251: 16,-42 + 2252: 16,-41 + 2253: 16,-40 + 2254: 16,-39 + 2255: 16,-38 + 2256: 16,-37 + 2257: 16,-36 + 2279: 5,-38 + 2280: 5,-37 + 2281: 5,-36 + 2289: -7,-47 + 2291: -7,-44 + 2351: -11,-45 + 2395: -3,-47 + 2396: -3,-46 + 3011: 14,-41 + 3012: 14,-40 - node: color: '#DE3A3A96' id: BrickTileWhiteLineE decals: - 1655: 42,-27 - 1656: 43,-37 - 1659: 37,-41 - 1660: 38,-34 - 1661: 38,-33 - 1662: 38,-32 - 1668: 27,-27 - 1669: 28,-32 - 1670: 28,-33 + 1651: 42,-27 + 1652: 43,-37 + 1655: 37,-41 + 1656: 38,-34 + 1657: 38,-33 + 1658: 38,-32 + 1664: 27,-27 + 1665: 28,-32 + 1666: 28,-33 - node: color: '#EFB34196' id: BrickTileWhiteLineE decals: - 1806: 8,32 - 1807: 8,33 - 1850: 5,32 - 1851: 5,33 - 1852: 5,34 - 1853: 5,35 - 1854: 5,36 - 1868: 17,30 - 1877: 19,32 - 1878: 19,33 - 1931: 22,32 - 2565: 10,44 - 2566: 10,43 - 2567: 10,42 - 2571: 19,44 - 2572: 19,45 - 2573: 20,42 - 2574: 20,43 - 3110: 11,32 - 3137: 17,34 - 3162: -2,41 - 3163: -2,42 - 3177: 10,41 - 3182: 19,40 - 3183: 19,41 - - node: - color: '#F9801DFF' - id: BrickTileWhiteLineE - decals: - 1416: 45,-20 + 1802: 8,32 + 1803: 8,33 + 1846: 5,32 + 1847: 5,33 + 1848: 5,34 + 1849: 5,35 + 1850: 5,36 + 1864: 17,30 + 1873: 19,32 + 1874: 19,33 + 1927: 22,32 + 2561: 10,44 + 2562: 10,43 + 2563: 10,42 + 2567: 19,44 + 2568: 19,45 + 2569: 20,42 + 2570: 20,43 + 3105: 11,32 + 3132: 17,34 + 3157: -2,41 + 3158: -2,42 + 3172: 10,41 + 3177: 19,40 + 3178: 19,41 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineE decals: - 588: -30,-28 + 584: -30,-28 + 3689: -6,-28 + 3690: -6,-27 - node: color: '#00BEBE7F' id: BrickTileWhiteLineN decals: - 3217: -28,43 - 3218: -29,43 - 3219: -30,43 - 3220: -31,43 - 3221: -32,43 - 3222: -33,43 - 3248: -43,1 - 3249: -42,1 - 3250: -41,1 - 3251: -40,1 - 3252: -39,1 - 3253: -38,1 - 3254: -37,1 - 3255: -36,1 - 3259: -43,5 - 3260: -41,4 - 3261: -40,4 - 3262: -39,4 - 3263: -38,4 - 3264: -37,4 + 3212: -28,43 + 3213: -29,43 + 3214: -30,43 + 3215: -31,43 + 3216: -32,43 + 3217: -33,43 + 3243: -43,1 + 3244: -42,1 + 3245: -41,1 + 3246: -40,1 + 3247: -39,1 + 3248: -38,1 + 3249: -37,1 + 3250: -36,1 + 3254: -43,5 + 3255: -41,4 + 3256: -40,4 + 3257: -39,4 + 3258: -38,4 + 3259: -37,4 - node: color: '#169C9CFF' id: BrickTileWhiteLineN decals: - 413: -16,-30 + 409: -16,-30 - node: color: '#4B709CFF' id: BrickTileWhiteLineN decals: - 461: -26,-35 - 462: -25,-35 - 474: -26,-37 - 475: -26,-37 - 476: -25,-37 + 457: -26,-35 + 458: -25,-35 + 470: -26,-37 + 471: -26,-37 + 472: -25,-37 - node: color: '#52B4E996' id: BrickTileWhiteLineN decals: - 226: -8,-38 - 227: -7,-38 - 228: -6,-38 - 229: -9,-38 - 251: -8,-33 - 252: -7,-33 - 253: -6,-33 - 254: -9,-33 - 403: -17,-27 - 404: -21,-27 - 506: -26,-26 - 521: -30,-26 - 522: -31,-26 - 523: -32,-26 - 570: -27,-39 - 571: -26,-39 - 572: -25,-39 - 2418: 29,-37 - 2419: 30,-37 - 2420: 31,-37 - 2421: 32,-37 - 2422: 33,-37 - 2423: 34,-37 - 2424: 35,-37 - 2425: 36,-37 + 222: -8,-38 + 223: -7,-38 + 224: -6,-38 + 225: -9,-38 + 247: -8,-33 + 248: -7,-33 + 249: -6,-33 + 250: -9,-33 + 399: -17,-27 + 400: -21,-27 + 502: -26,-26 + 517: -30,-26 + 518: -31,-26 + 519: -32,-26 + 566: -27,-39 + 567: -26,-39 + 568: -25,-39 + 2414: 29,-37 + 2415: 30,-37 + 2416: 31,-37 + 2417: 32,-37 + 2418: 33,-37 + 2419: 34,-37 + 2420: 35,-37 + 2421: 36,-37 - node: color: '#765428FF' id: BrickTileWhiteLineN decals: - 3370: -55,-17 - 3371: -56,-17 - 3372: -57,-17 - 3373: -54,-17 + 3365: -55,-17 + 3366: -56,-17 + 3367: -57,-17 + 3368: -54,-17 - node: color: '#9FED58B3' id: BrickTileWhiteLineN decals: - 2587: -47,-31 - 2593: -47,-30 + 2583: -47,-31 + 2589: -47,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineN decals: - 3270: -54,3 - 3280: -50,3 + 3265: -54,3 + 3275: -50,3 - node: color: '#D381C996' id: BrickTileWhiteLineN decals: - 845: -13,-47 - 846: -12,-47 - 2186: 16,-34 - 2187: 9,-34 - 2188: 5,-34 - 2247: 7,-43 - 2248: 8,-43 - 2249: 9,-43 - 2250: 10,-43 - 2251: 11,-43 - 2252: 15,-35 - 2280: 6,-39 - 2281: 7,-39 - 2282: 8,-39 + 841: -13,-47 + 842: -12,-47 + 2182: 16,-34 + 2183: 9,-34 + 2184: 5,-34 + 2243: 7,-43 + 2244: 8,-43 + 2245: 9,-43 + 2246: 10,-43 + 2247: 11,-43 + 2248: 15,-35 + 2276: 6,-39 + 2277: 7,-39 + 2278: 8,-39 - node: color: '#D4D4D428' id: BrickTileWhiteLineN decals: - 1373: 31,-3 - 1374: 32,-3 + 1369: 31,-3 + 1370: 32,-3 - node: color: '#DE3A3A96' id: BrickTileWhiteLineN decals: - 1483: 49,-6 - 1484: 51,-6 - 1541: 32,-11 - 1547: 38,-11 - 1548: 40,-11 - 1574: 50,-16 - 1605: 50,-3 - 1619: 41,-32 - 1768: 41,-41 - 1771: 41,-39 - 1782: 41,-40 - 2897: 41,-25 + 1479: 49,-6 + 1480: 51,-6 + 1537: 32,-11 + 1543: 38,-11 + 1544: 40,-11 + 1570: 50,-16 + 1601: 50,-3 + 1615: 41,-32 + 1764: 41,-41 + 1767: 41,-39 + 1778: 41,-40 + 2892: 41,-25 - node: color: '#EFB34196' id: BrickTileWhiteLineN decals: - 1805: 7,38 - 1855: 6,31 - 1885: 23,28 - 1886: 24,28 - 1893: 24,40 - 1894: 26,40 - 1895: 24,34 - 1896: 26,34 - 1897: 26,23 - 1921: 23,31 - 1922: 24,31 - 1923: 25,31 - 1924: 26,31 - 1925: 27,31 - 3098: 17,31 - 3099: 16,31 - 3100: 15,31 - 3101: 14,31 - 3102: 13,31 - 3103: 12,31 - 3113: 12,33 - 3114: 13,33 - 3115: 14,33 - 3116: 15,33 - 3117: 16,33 - 3118: 17,33 - 3172: -6,43 - 3173: -5,43 - 3174: -4,43 - 3175: -3,43 + 1801: 7,38 + 1851: 6,31 + 1881: 23,28 + 1882: 24,28 + 1889: 24,40 + 1890: 26,40 + 1891: 24,34 + 1892: 26,34 + 1893: 26,23 + 1917: 23,31 + 1918: 24,31 + 1919: 25,31 + 1920: 26,31 + 1921: 27,31 + 3093: 17,31 + 3094: 16,31 + 3095: 15,31 + 3096: 14,31 + 3097: 13,31 + 3098: 12,31 + 3108: 12,33 + 3109: 13,33 + 3110: 14,33 + 3111: 15,33 + 3112: 16,33 + 3113: 17,33 + 3167: -6,43 + 3168: -5,43 + 3169: -4,43 + 3170: -3,43 - node: color: '#F38BAAFF' id: BrickTileWhiteLineN decals: - 410: -22,-30 + 406: -22,-30 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineN decals: - 587: -31,-27 + 583: -31,-27 + 3681: -5,-29 + 3682: -4,-29 + 3683: -3,-29 - node: color: '#00BEBE7F' id: BrickTileWhiteLineS decals: - 3208: -33,39 - 3209: -32,39 - 3210: -31,39 - 3211: -30,39 - 3212: -29,39 - 3213: -28,39 - 3241: -37,3 - 3242: -38,3 - 3243: -39,3 - 3244: -40,3 - 3245: -41,3 - 3246: -42,3 - 3247: -43,3 + 3203: -33,39 + 3204: -32,39 + 3205: -31,39 + 3206: -30,39 + 3207: -29,39 + 3208: -28,39 + 3236: -37,3 + 3237: -38,3 + 3238: -39,3 + 3239: -40,3 + 3240: -41,3 + 3241: -42,3 + 3242: -43,3 - node: color: '#169C9CFF' id: BrickTileWhiteLineS decals: - 412: -16,-30 + 408: -16,-30 - node: color: '#4B709CFF' id: BrickTileWhiteLineS decals: - 467: -26,-37 - 468: -25,-37 - 478: -25,-35 - 479: -25,-35 - 480: -26,-35 + 463: -26,-37 + 464: -25,-37 + 474: -25,-35 + 475: -25,-35 + 476: -26,-35 - node: color: '#52B4E996' id: BrickTileWhiteLineS decals: - 230: -9,-35 - 231: -8,-35 - 232: -8,-35 - 233: -7,-35 - 234: -6,-35 - 247: -9,-40 - 248: -8,-40 - 249: -7,-40 - 250: -6,-40 - 420: -17,-29 - 421: -16,-29 - 422: -15,-29 - 423: -21,-29 - 424: -22,-29 - 425: -23,-29 - 507: -26,-30 - 527: -32,-30 - 528: -31,-30 - 529: -30,-30 - 530: -30,-30 - 575: -25,-42 - 576: -26,-42 - 577: -27,-42 - 2426: 36,-38 - 2427: 35,-38 - 2431: 33,-42 - 2432: 32,-42 - 2433: 31,-42 - 2434: 30,-42 - 2435: 29,-42 - 2436: 28,-42 + 226: -9,-35 + 227: -8,-35 + 228: -8,-35 + 229: -7,-35 + 230: -6,-35 + 243: -9,-40 + 244: -8,-40 + 245: -7,-40 + 246: -6,-40 + 416: -17,-29 + 417: -16,-29 + 418: -15,-29 + 419: -21,-29 + 420: -22,-29 + 421: -23,-29 + 503: -26,-30 + 523: -32,-30 + 524: -31,-30 + 525: -30,-30 + 526: -30,-30 + 571: -25,-42 + 572: -26,-42 + 573: -27,-42 + 2422: 36,-38 + 2423: 35,-38 + 2427: 33,-42 + 2428: 32,-42 + 2429: 31,-42 + 2430: 30,-42 + 2431: 29,-42 + 2432: 28,-42 - node: color: '#765428FF' id: BrickTileWhiteLineS decals: - 3382: -54,-24 - 3383: -55,-24 - 3384: -56,-24 - 3385: -57,-24 + 3377: -54,-24 + 3378: -55,-24 + 3379: -56,-24 + 3380: -57,-24 - node: - color: '#80C71FFF' + color: '#80C71F7F' id: BrickTileWhiteLineS decals: - 1414: 52,-19 - 1415: 54,-19 - 1431: 51,-19 + 3528: 54,-19 + 3529: 52,-19 + 3530: 51,-19 - node: - color: '#8932B8FF' + color: '#8932B87F' id: BrickTileWhiteLineS decals: - 1412: 48,-19 - 1413: 50,-19 - 1432: 47,-19 + 3531: 50,-19 + 3532: 48,-19 + 3533: 47,-19 - node: color: '#9FED58B3' id: BrickTileWhiteLineS decals: - 2592: -47,-30 - 2594: -47,-31 + 2588: -47,-30 + 2590: -47,-31 - node: color: '#BC863FFF' id: BrickTileWhiteLineS decals: - 3271: -56,-15 - 3272: -55,-15 - 3289: -50,-5 + 3266: -56,-15 + 3267: -55,-15 + 3284: -50,-5 - node: color: '#D381C996' id: BrickTileWhiteLineS decals: - 857: -12,-51 - 858: -13,-51 - 2271: 7,-45 - 2272: 8,-45 - 2273: 9,-45 - 2274: 10,-45 - 2275: 11,-45 - 2276: 15,-44 - 2277: 6,-35 - 2278: 7,-35 - 2279: 8,-35 + 853: -12,-51 + 854: -13,-51 + 2267: 7,-45 + 2268: 8,-45 + 2269: 9,-45 + 2270: 10,-45 + 2271: 11,-45 + 2272: 15,-44 + 2273: 6,-35 + 2274: 7,-35 + 2275: 8,-35 - node: color: '#DE3A3A96' id: BrickTileWhiteLineS decals: - 1370: 32,-9 - 1531: 35,-13 - 1532: 31,-13 - 1573: 50,-9 - 1606: 50,-4 - 1620: 41,-30 - 1657: 41,-37 - 1769: 41,-41 - 2896: 41,-23 + 1366: 32,-9 + 1527: 35,-13 + 1528: 31,-13 + 1569: 50,-9 + 1602: 50,-4 + 1616: 41,-30 + 1653: 41,-37 + 1765: 41,-41 + 2891: 41,-23 - node: color: '#EFB34196' id: BrickTileWhiteLineS decals: - 1861: 6,37 - 1887: 23,30 - 1888: 24,30 - 1889: 26,25 - 1890: 26,36 - 1891: 24,36 - 1892: 26,42 - 1926: 23,33 - 1927: 24,33 - 1928: 25,33 - 1929: 26,33 - 1930: 27,33 - 1933: 34,42 - 2560: 15,45 - 2561: 14,45 - 2562: 13,45 - 2563: 12,45 - 2564: 11,45 - 2581: 33,42 - 2586: 24,42 - 3104: 12,33 - 3105: 13,33 - 3106: 14,33 - 3107: 15,33 - 3108: 16,33 - 3109: 17,33 - 3164: -3,40 - 3165: -4,40 - 3166: -5,40 - 3170: -6,40 - 3178: 9,40 - 3179: 8,40 - 3184: 18,39 - 3190: 16,45 + 1857: 6,37 + 1883: 23,30 + 1884: 24,30 + 1885: 26,25 + 1886: 26,36 + 1887: 24,36 + 1888: 26,42 + 1922: 23,33 + 1923: 24,33 + 1924: 25,33 + 1925: 26,33 + 1926: 27,33 + 1929: 34,42 + 2556: 15,45 + 2557: 14,45 + 2558: 13,45 + 2559: 12,45 + 2560: 11,45 + 2577: 33,42 + 2582: 24,42 + 3099: 12,33 + 3100: 13,33 + 3101: 14,33 + 3102: 15,33 + 3103: 16,33 + 3104: 17,33 + 3159: -3,40 + 3160: -4,40 + 3161: -5,40 + 3165: -6,40 + 3173: 9,40 + 3174: 8,40 + 3179: 18,39 + 3185: 16,45 - node: color: '#F38BAAFF' id: BrickTileWhiteLineS decals: - 411: -22,-30 + 407: -22,-30 - node: - color: '#F9801DFF' + color: '#F9801D7F' id: BrickTileWhiteLineS decals: - 1410: 44,-19 - 1411: 46,-19 - 1433: 43,-19 + 3534: 46,-19 + 3535: 44,-19 + 3536: 43,-19 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineS decals: - 589: -31,-29 + 585: -31,-29 + 3684: -5,-26 + 3685: -4,-26 + 3686: -3,-26 - node: color: '#00BEBE7F' id: BrickTileWhiteLineW decals: - 3223: -34,42 - 3224: -34,41 - 3225: -34,40 - 3258: -44,4 + 3218: -34,42 + 3219: -34,41 + 3220: -34,40 + 3253: -44,4 - node: color: '#334E6DC8' id: BrickTileWhiteLineW decals: - 612: 21,6 - 613: 21,7 - 616: 20,6 - 617: 20,7 - 3269: -44,-10 + 608: 21,6 + 609: 21,7 + 612: 20,6 + 613: 20,7 + 3264: -44,-10 - node: color: '#4B709CFF' id: BrickTileWhiteLineW decals: - 470: -27,-36 - 477: -24,-36 + 466: -27,-36 + 473: -24,-36 - node: color: '#52B4E996' id: BrickTileWhiteLineW decals: - 245: -10,-34 - 246: -10,-39 - 416: -20,-31 - 417: -20,-30 - 511: -27,-29 - 512: -27,-27 - 513: -27,-28 - 524: -33,-29 - 525: -33,-28 - 526: -33,-27 - 578: -28,-41 - 579: -28,-40 - 736: -2,-33 - 739: -2,-40 - 740: -1,-35 - 741: -1,-36 - 742: -1,-37 - 743: -1,-38 - 2410: 27,-41 - 2411: 27,-40 - 2412: 27,-39 - 2413: 27,-38 - 2414: 27,-37 - 2415: 27,-36 + 241: -10,-34 + 242: -10,-39 + 412: -20,-31 + 413: -20,-30 + 507: -27,-29 + 508: -27,-27 + 509: -27,-28 + 520: -33,-29 + 521: -33,-28 + 522: -33,-27 + 574: -28,-41 + 575: -28,-40 + 732: -2,-33 + 735: -2,-40 + 736: -1,-35 + 737: -1,-36 + 738: -1,-37 + 739: -1,-38 + 2406: 27,-41 + 2407: 27,-40 + 2408: 27,-39 + 2409: 27,-38 + 2410: 27,-37 + 2411: 27,-36 - node: color: '#765428FF' id: BrickTileWhiteLineW decals: - 3386: -58,-23 - 3387: -58,-22 - 3388: -58,-21 - - node: - color: '#80C71FFF' - id: BrickTileWhiteLineW - decals: - 1421: 53,-20 - - node: - color: '#8932B8FF' - id: BrickTileWhiteLineW - decals: - 1418: 49,-20 + 3381: -58,-23 + 3382: -58,-22 + 3383: -58,-21 - node: color: '#9FED58B3' id: BrickTileWhiteLineW decals: - 2601: -45,-31 - 2602: -45,-30 + 2597: -45,-31 + 2598: -45,-30 - node: color: '#BC863FFF' id: BrickTileWhiteLineW decals: - 3276: -51,-4 - 3277: -51,-3 - 3290: -47,-4 - 3291: -47,-3 - 3403: -47,0 - 3404: -47,1 - 3409: -47,-1 - 3412: -51,2 - 3416: -50,-1 - 3417: -50,0 + 3271: -51,-4 + 3272: -51,-3 + 3285: -47,-4 + 3286: -47,-3 + 3398: -47,0 + 3399: -47,1 + 3404: -47,-1 + 3407: -51,2 + 3411: -50,-1 + 3412: -50,0 - node: color: '#D381C996' id: BrickTileWhiteLineW decals: - 851: -14,-50 - 852: -14,-49 - 853: -14,-48 - 2137: 5,-43 - 2138: 5,-44 - 2139: 5,-46 - 2140: 5,-47 - 2182: 13,-39 - 2262: 6,-44 - 2263: 14,-43 - 2264: 14,-42 - 2265: 14,-41 - 2266: 14,-39 - 2267: 14,-40 - 2268: 14,-38 - 2269: 14,-37 - 2270: 14,-36 - 2286: 9,-38 - 2287: 9,-37 - 2288: 9,-36 - 2294: -5,-47 - 2297: -9,-49 - 2309: -9,-54 - 2354: -9,-45 - 2401: -1,-46 - 2402: -1,-45 - 2403: -1,-44 - 2404: -1,-43 - 2408: -1,-47 - 3018: 16,-41 - 3019: 16,-40 + 847: -14,-50 + 848: -14,-49 + 849: -14,-48 + 2133: 5,-43 + 2134: 5,-44 + 2135: 5,-46 + 2136: 5,-47 + 2178: 13,-39 + 2258: 6,-44 + 2259: 14,-43 + 2260: 14,-42 + 2261: 14,-41 + 2262: 14,-39 + 2263: 14,-40 + 2264: 14,-38 + 2265: 14,-37 + 2266: 14,-36 + 2282: 9,-38 + 2283: 9,-37 + 2284: 9,-36 + 2290: -5,-47 + 2293: -9,-49 + 2305: -9,-54 + 2350: -9,-45 + 2397: -1,-46 + 2398: -1,-45 + 2399: -1,-44 + 2400: -1,-43 + 2404: -1,-47 + 3013: 16,-41 + 3014: 16,-40 - node: color: '#DE3A3A96' id: BrickTileWhiteLineW decals: - 1658: 39,-41 - 1663: 40,-34 - 1664: 40,-33 - 1665: 40,-32 - 1666: 30,-33 - 1667: 30,-32 - 2915: 40,-22 - 2916: 40,-21 + 1654: 39,-41 + 1659: 40,-34 + 1660: 40,-33 + 1661: 40,-32 + 1662: 30,-33 + 1663: 30,-32 + 2910: 40,-22 + 2911: 40,-21 - node: color: '#EFB34196' id: BrickTileWhiteLineW decals: - 1837: 4,32 - 1838: 4,33 - 1839: 4,35 - 1840: 4,36 - 1856: 7,32 - 1857: 7,33 - 1858: 7,34 - 1859: 7,35 - 1860: 7,36 - 1869: 12,30 - 1870: 10,33 - 1871: 10,32 - 1879: 21,32 - 1880: 21,33 - 1932: 28,32 - 3111: 18,32 - 3112: 12,34 - 3167: -7,41 - 3168: -7,42 - 3185: 17,40 - 3186: 17,41 - 3187: 17,42 - 3188: 17,43 - 3189: 17,44 - - node: - color: '#F9801DFF' - id: BrickTileWhiteLineW - decals: - 1417: 45,-20 + 1833: 4,32 + 1834: 4,33 + 1835: 4,35 + 1836: 4,36 + 1852: 7,32 + 1853: 7,33 + 1854: 7,34 + 1855: 7,35 + 1856: 7,36 + 1865: 12,30 + 1866: 10,33 + 1867: 10,32 + 1875: 21,32 + 1876: 21,33 + 1928: 28,32 + 3106: 18,32 + 3107: 12,34 + 3162: -7,41 + 3163: -7,42 + 3180: 17,40 + 3181: 17,41 + 3182: 17,42 + 3183: 17,43 + 3184: 17,44 - node: color: '#FFFFFFFF' id: BrickTileWhiteLineW decals: - 590: -32,-28 - 591: -32,-28 + 586: -32,-28 + 587: -32,-28 - node: color: '#FFFFFFFF' id: BushAOne decals: - 2704: -12.173578,-13.16537 + 2699: -12.173578,-13.16537 - node: color: '#FFFFFFFF' id: BushAThree decals: - 2661: 7.063609,-17.083809 - 2705: -12.954828,-13.13412 - 3037: -13.009358,7.995878 - 3042: -15.09027,11.031727 + 2656: 7.063609,-17.083809 + 2700: -12.954828,-13.13412 + 3032: -13.009358,7.995878 + 3037: -15.09027,11.031727 - node: color: '#FFFFFFFF' id: BushATwo decals: - 2706: -12.996495,-12.238287 - 2707: -6.0969057,-13.717453 + 2701: -12.996495,-12.238287 + 2702: -6.0969057,-13.717453 - node: color: '#FFFFFFFF' id: BushCOne decals: - 3030: -11.007082,13.412277 + 3025: -11.007082,13.412277 - node: color: '#FFFFFFFF' id: BushCThree decals: - 2655: 17.014423,-8.300894 - 2691: -4.785802,3.4705331 + 2650: 17.014423,-8.300894 + 2686: -4.785802,3.4705331 - node: color: '#FFFFFFFF' id: BushCTwo decals: - 2710: -5.148989,-12.144537 + 2705: -5.148989,-12.144537 - node: color: '#FFFFFFFF' id: BushDTwo decals: - 2647: 17.163681,15.561111 - 2648: 3.516313,17.119299 + 2642: 17.163681,15.561111 + 2643: 3.516313,17.119299 - node: color: '#FFFFFFFF' id: Busha1 decals: - 2649: 4.90173,16.900549 - 3034: -13.092692,9.881294 + 2644: 4.90173,16.900549 + 3029: -13.092692,9.881294 - node: color: '#FFFFFFFF' id: Busha2 decals: - 3039: -13.96527,9.885894 - 3041: -14.642353,10.979644 + 3034: -13.96527,9.885894 + 3036: -14.642353,10.979644 - node: color: '#FFFFFFFF' id: Bushb1 decals: - 3031: -10.975832,14.18311 - 3035: -13.092692,9.006294 + 3026: -10.975832,14.18311 + 3030: -13.092692,9.006294 - node: color: '#FFFFFFFF' id: Bushb2 decals: - 2703: -12.183994,-14.061203 - 3032: -10.996666,15.02686 + 2698: -12.183994,-14.061203 + 3027: -10.996666,15.02686 - node: color: '#FFFFFFFF' id: Bushb3 decals: - 3036: -13.009358,8.402128 - 3040: -14.017353,10.354644 + 3031: -13.009358,8.402128 + 3035: -14.017353,10.354644 - node: color: '#FFFFFFFF' id: Bushc1 decals: - 2708: -5.1698227,-12.957037 - 3038: -14.02777,11.062977 + 2703: -5.1698227,-12.957037 + 3033: -14.02777,11.062977 - node: color: '#FFFFFFFF' id: Bushc3 decals: - 2646: 17.194931,12.9986105 - 2709: -8.055239,-11.332037 - 3033: -11.044625,12.930744 + 2641: 17.194931,12.9986105 + 2704: -8.055239,-11.332037 + 3028: -11.044625,12.930744 - node: color: '#FFFFFFFF' id: Bushe1 decals: - 2637: 6.2998166,3.7755318 - 2652: 17.076923,-7.467561 - 2653: 16.566507,-7.988394 - 2659: 7.2406926,-16.500475 - 2674: 3.5204434,-9.447139 - 2675: 3.2912767,-9.686723 - 2711: -8.044823,-11.092453 + 2632: 6.2998166,3.7755318 + 2647: 17.076923,-7.467561 + 2648: 16.566507,-7.988394 + 2654: 7.2406926,-16.500475 + 2669: 3.5204434,-9.447139 + 2670: 3.2912767,-9.686723 + 2706: -8.044823,-11.092453 - node: color: '#FFFFFFFF' id: Bushe2 decals: - 2638: 6.6984973,3.4174294 - 2654: 17.014423,-8.030061 - 2668: 7.441076,6.766222 - 3028: -17.569584,14.99561 - 3051: -4.0134697,4.9046235 + 2633: 6.6984973,3.4174294 + 2649: 17.014423,-8.030061 + 2663: 7.441076,6.766222 + 3023: -17.569584,14.99561 + 3046: -4.0134697,4.9046235 + 3613: 63.771957,-1.9947927 + 3619: 64.23029,-2.0052094 - node: color: '#FFFFFFFF' id: Bushe3 decals: - 2660: 6.6990256,-16.510893 - 3432: 58.245747,-2.973395 - 3433: 57.818665,-3.0463119 - 3434: 58.308247,-2.1817284 + 2655: 6.6990256,-16.510893 + 3427: 58.245747,-2.973395 + 3428: 57.818665,-3.0463119 + 3429: 58.308247,-2.1817284 + 3612: 64.15737,-0.19270933 - node: color: '#FFFFFFFF' id: Bushe4 decals: - 1315: 57.84424,1.1426643 - 1316: 58.21924,0.9864143 - 1317: 57.885906,-2.0552526 - 1318: 58.15674,-1.5865024 - 1319: 57.90674,0.18433094 - 2685: 6.6556993,14.650438 - 2692: -4.7441354,3.6892834 - 2717: -12.329075,-5.2076516 - 2718: -11.683241,-5.540985 - 3052: -4.2530527,4.29004 + 1311: 57.84424,1.1426643 + 1312: 58.21924,0.9864143 + 1313: 57.885906,-2.0552526 + 1314: 58.15674,-1.5865024 + 1315: 57.90674,0.18433094 + 2680: 6.6556993,14.650438 + 2687: -4.7441354,3.6892834 + 2712: -12.329075,-5.2076516 + 2713: -11.683241,-5.540985 + 3047: -4.2530527,4.29004 + 3611: 63.792793,0.09895742 - node: color: '#FFFFFFFF' id: Bushf1 decals: - 1322: 58.167156,-0.24275243 - 3065: -4.922404,-3.8768375 + 1318: 58.167156,-0.24275243 + 3060: -4.922404,-3.8768375 - node: color: '#FFFFFFFF' id: Bushf2 decals: - 1323: 57.833824,-0.37816906 - 3067: -4.4328203,-4.7726707 - 3068: -4.3255215,-5.3247385 + 1319: 57.833824,-0.37816906 + 3062: -4.4328203,-4.7726707 + 3063: -4.3255215,-5.3247385 - node: color: '#FFFFFFFF' id: Bushf3 decals: - 3027: -17.132084,16.266443 - 3066: -4.3703203,-4.199754 - 3431: 57.943665,-2.723395 + 3022: -17.132084,16.266443 + 3061: -4.3703203,-4.199754 + 3426: 57.943665,-2.723395 - node: color: '#FFFFFFFF' id: Bushg1 decals: - 2656: 17.14984,-5.092561 - 2662: 8.53236,-17.187975 - 2696: 3.404969,-4.7533755 - 3043: -9.359586,2.9312673 + 2651: 17.14984,-5.092561 + 2657: 8.53236,-17.187975 + 2691: 3.404969,-4.7533755 + 3038: -9.359586,2.9312673 - node: color: '#FFFFFFFF' id: Bushg2 decals: - 2697: 4.175802,-4.0346255 - 3029: -16.8925,15.828943 + 2692: 4.175802,-4.0346255 + 3024: -16.8925,15.828943 - node: color: '#FFFFFFFF' id: Bushg3 decals: - 2615: -2.1416075,5.8916445 - 2616: -2.162441,14.072103 - 2617: 14.210857,2.3523626 - 2618: 17.866562,15.155413 - 2619: 18.231146,11.999163 - 2620: 3.059716,-17.07088 - 2621: -4.1298733,-14.029394 - 2622: -2.3702574,-5.9809127 - 2623: -8.961391,-10.053829 - 2624: -17.146135,-6.1901164 + 2611: -2.1416075,5.8916445 + 2612: -2.162441,14.072103 + 2613: 17.866562,15.155413 + 2614: 18.231146,11.999163 + 2615: 3.059716,-17.07088 + 2616: -4.1298733,-14.029394 + 2617: -2.3702574,-5.9809127 + 2618: -8.961391,-10.053829 + 2619: -17.146135,-6.1901164 - node: color: '#FFFFFFFF' id: Bushg4 decals: - 2657: 17.160257,-5.6342273 - 2686: 7.2077823,13.712938 + 2652: 17.160257,-5.6342273 + 2681: 7.2077823,13.712938 - node: color: '#FFFFFFFF' id: Bushh1 decals: - 2634: 5.9211392,3.1419072 - 2639: 8.507914,15.796663 - 2640: 9.528748,15.46333 - 3050: -3.4732609,5.2424126 + 2629: 5.9211392,3.1419072 + 2634: 8.507914,15.796663 + 2635: 9.528748,15.46333 + 3045: -3.4732609,5.2424126 - node: color: '#FFFFFFFF' id: Bushh2 decals: - 2635: 5.087806,3.9127407 - 2641: 8.528747,14.473747 - 2719: -13.162408,-5.0826516 - 2720: -14.037408,-5.988902 + 2630: 5.087806,3.9127407 + 2636: 8.528747,14.473747 + 2714: -13.162408,-5.0826516 + 2715: -14.037408,-5.988902 - node: color: '#FFFFFFFF' id: Bushh3 decals: - 2636: 7.181556,4.0273237 - 2645: 17.465765,12.071527 - 2721: -13.756159,-5.822237 - 2722: -13.901991,-8.228487 - 3047: -9.230458,4.9216795 + 2631: 7.181556,4.0273237 + 2640: 17.465765,12.071527 + 2716: -13.756159,-5.822237 + 2717: -13.901991,-8.228487 + 3042: -9.230458,4.9216795 - node: color: '#FFFFFFFF' id: Bushi1 decals: - 2625: -17.677385,-15.149096 - 2626: -6.0205603,-17.117607 - 2627: -9.970078,-14.052947 - 2628: -9.887934,2.4137444 - 2629: -18.05108,15.0529785 - 2658: 6.2927756,-17.073393 - 2669: 15.850491,-4.61609 - 2671: 9.772904,-4.483665 - 2683: 13.70388,8.66825 - 2684: 7.1036158,14.358771 - 2687: -5.465275,9.849015 - 2688: -6.746525,10.213598 - 2701: 3.4466357,-5.461709 - 2736: -20.130556,-17.838984 - 2737: -16.849306,-19.984818 - 2738: -17.307638,-19.6619 - 2739: -19.265972,-20.13065 - 3055: -14.051299,-2.1793242 - 3058: -17.143507,-2.1316965 - 3059: -14.734559,-9.289597 - 3061: -14.390809,-9.633347 - 3062: -10.377625,-9.233512 - 3070: -3.5338547,-5.210155 - 3071: -4.8467765,-14.670914 - 3427: -2.6337829,9.646117 + 2620: -17.677385,-15.149096 + 2621: -6.0205603,-17.117607 + 2622: -9.970078,-14.052947 + 2623: -9.887934,2.4137444 + 2624: -18.05108,15.0529785 + 2653: 6.2927756,-17.073393 + 2664: 15.850491,-4.61609 + 2666: 9.772904,-4.483665 + 2678: 13.70388,8.66825 + 2679: 7.1036158,14.358771 + 2682: -5.465275,9.849015 + 2683: -6.746525,10.213598 + 2696: 3.4466357,-5.461709 + 2731: -20.130556,-17.838984 + 2732: -16.849306,-19.984818 + 2733: -17.307638,-19.6619 + 2734: -19.265972,-20.13065 + 3050: -14.051299,-2.1793242 + 3053: -17.143507,-2.1316965 + 3054: -14.734559,-9.289597 + 3056: -14.390809,-9.633347 + 3057: -10.377625,-9.233512 + 3065: -3.5338547,-5.210155 + 3066: -4.8467765,-14.670914 + 3422: -2.6337829,9.646117 - node: color: '#FFFFFFFF' id: Bushi2 decals: - 2630: -17.025719,17.03245 - 2631: 18.117056,13.867498 - 2676: 3.580893,-8.535644 - 2677: 8.918044,-3.98356 - 2678: 15.266736,-5.8692675 - 2679: 16.209822,-5.8538113 - 2680: 7.318463,5.66825 - 2681: 6.4642963,5.85575 - 2682: 14.620547,8.230751 - 2693: 6.318049,2.225238 - 2712: -8.044823,-13.97787 - 2713: -8.878156,-13.144537 - 2714: -5.867739,-11.154953 - 2715: -13.026991,-9.009735 - 2716: -11.860325,-5.124318 - 2740: -16.859722,-18.94315 - 3044: -8.75542,2.9208503 - 3049: -13.95071,2.256745 - 3056: -14.165881,-2.439741 - 3060: -14.713725,-9.602097 - 3063: -9.76849,-14.395954 - 3072: -4.450943,-14.608414 - 3428: -2.8004496,9.333617 + 2625: -17.025719,17.03245 + 2626: 18.117056,13.867498 + 2671: 3.580893,-8.535644 + 2672: 8.918044,-3.98356 + 2673: 15.266736,-5.8692675 + 2674: 16.209822,-5.8538113 + 2675: 7.318463,5.66825 + 2676: 6.4642963,5.85575 + 2677: 14.620547,8.230751 + 2688: 6.318049,2.225238 + 2707: -8.044823,-13.97787 + 2708: -8.878156,-13.144537 + 2709: -5.867739,-11.154953 + 2710: -13.026991,-9.009735 + 2711: -11.860325,-5.124318 + 2735: -16.859722,-18.94315 + 3039: -8.75542,2.9208503 + 3044: -13.95071,2.256745 + 3051: -14.165881,-2.439741 + 3055: -14.713725,-9.602097 + 3058: -9.76849,-14.395954 + 3067: -4.450943,-14.608414 + 3423: -2.8004496,9.333617 - node: color: '#FFFFFFFF' id: Bushi3 decals: - 2632: 17.117056,10.211248 - 2633: 9.26489,2.9960737 - 2663: 14.499886,6.958212 - 2664: 13.541552,7.447795 - 2665: 6.0254874,14.498462 - 2670: 16.579659,-3.9598398 - 2694: 7.224299,2.3710713 - 2695: 4.0082765,6.5204124 - 2702: 5.713353,-3.1926599 - 3026: -14.413333,18.172693 - 3046: -9.557503,5.8271008 - 3048: -14.0402975,2.506745 - 3429: -2.8212829,8.989867 + 2627: 17.117056,10.211248 + 2628: 9.26489,2.9960737 + 2658: 14.499886,6.958212 + 2659: 13.541552,7.447795 + 2660: 6.0254874,14.498462 + 2665: 16.579659,-3.9598398 + 2689: 7.224299,2.3710713 + 2690: 4.0082765,6.5204124 + 2697: 5.713353,-3.1926599 + 3021: -14.413333,18.172693 + 3041: -9.557503,5.8271008 + 3043: -14.0402975,2.506745 + 3424: -2.8212829,8.989867 - node: color: '#FFFFFFFF' id: Bushi4 decals: - 2603: -15.13607,-18.199955 - 2604: -18.14605,-11.80234 - 2605: -13.963279,-4.177868 - 2606: -5.8667884,-5.4799514 - 2607: 8.061129,-4.427868 - 2608: 15.901968,-2.2820346 - 2609: 17.151968,2.9988291 - 2610: 9.610178,17.11985 - 2611: 4.0546904,17.078184 - 2612: 3.480264,5.210905 - 2613: -15.017622,18.057854 - 2614: -5.5270247,2.9853945 - 2650: 5.777904,17.049623 - 2651: 9.139725,14.0701685 - 2666: 6.567154,13.456795 - 2667: 6.441076,6.7870555 - 2672: 9.397904,-5.046165 - 2673: 4.3850265,-9.488806 - 2689: -6.2881913,9.494848 - 2690: -5.402775,10.869849 - 2698: 3.8528857,-4.5242085 - 2723: -11.037408,-8.100949 - 3053: -3.7009702,4.4983735 - 3054: -5.697132,-3.1168242 - 3064: -9.425084,-14.560988 - 3069: -3.5442712,-4.7830715 + 2599: -15.13607,-18.199955 + 2600: -18.14605,-11.80234 + 2601: -13.963279,-4.177868 + 2602: -5.8667884,-5.4799514 + 2603: 8.061129,-4.427868 + 2604: 15.901968,-2.2820346 + 2605: 17.151968,2.9988291 + 2606: 9.610178,17.11985 + 2607: 4.0546904,17.078184 + 2608: 3.480264,5.210905 + 2609: -15.017622,18.057854 + 2610: -5.5270247,2.9853945 + 2645: 5.777904,17.049623 + 2646: 9.139725,14.0701685 + 2661: 6.567154,13.456795 + 2662: 6.441076,6.7870555 + 2667: 9.397904,-5.046165 + 2668: 4.3850265,-9.488806 + 2684: -6.2881913,9.494848 + 2685: -5.402775,10.869849 + 2693: 3.8528857,-4.5242085 + 2718: -11.037408,-8.100949 + 3048: -3.7009702,4.4983735 + 3049: -5.697132,-3.1168242 + 3059: -9.425084,-14.560988 + 3064: -3.5442712,-4.7830715 - node: color: '#FFFFFFFF' id: Bushj1 decals: - 2642: 8.789164,15.109163 - 2728: -19.824345,-10.10782 - 2729: -20.11601,-9.63907 - 2731: -20.011845,-8.243237 - 2732: -18.730595,-8.79532 - 2733: -18.873224,-10.013859 - 2734: -19.654474,-7.0659423 - 3445: -18.860361,-7.807997 + 2637: 8.789164,15.109163 + 2723: -19.824345,-10.10782 + 2724: -20.11601,-9.63907 + 2726: -20.011845,-8.243237 + 2727: -18.730595,-8.79532 + 2728: -18.873224,-10.013859 + 2729: -19.654474,-7.0659423 + 3440: -18.860361,-7.807997 - node: color: '#FFFFFFFF' id: Bushj2 decals: - 2730: -18.793095,-6.868236 - 2735: -19.94614,-7.7117753 - 3443: -20.016611,-7.2975807 - 3444: -18.902029,-9.370498 - 3446: -19.318695,-8.485081 + 2725: -18.793095,-6.868236 + 2730: -19.94614,-7.7117753 + 3438: -20.016611,-7.2975807 + 3439: -18.902029,-9.370498 + 3441: -19.318695,-8.485081 - node: color: '#FFFFFFFF' id: Bushj3 decals: - 3430: -4.6337833,10.114867 + 3425: -4.6337833,10.114867 - node: color: '#FFFFFFFF' id: Bushk1 decals: - 2700: 3.0091357,-5.795042 - 3045: -10.00542,5.191684 + 2695: 3.0091357,-5.795042 + 3040: -10.00542,5.191684 - node: color: '#FFFFFFFF' id: Bushk3 decals: - 2643: 15.903748,17.02583 - 2644: 18.067644,12.942497 - 2699: 4.8112187,-3.7846253 + 2638: 15.903748,17.02583 + 2639: 18.067644,12.942497 + 2694: 4.8112187,-3.7846253 + - node: + color: '#FFFFFFFF' + id: Bushm1 + decals: + 3615: 63.81363,-0.83854264 + - node: + color: '#FFFFFFFF' + id: Bushm3 + decals: + 3617: 64.29279,-0.73437595 - node: color: '#FFFFFFFF' id: Bushm4 decals: - 2724: -10.9586735,-6.0094166 - 2725: -11.224603,-5.736016 - 2726: -13.307937,-8.381849 - 2727: -14.067469,-7.593817 + 2719: -10.9586735,-6.0094166 + 2720: -11.224603,-5.736016 + 2721: -13.307937,-8.381849 + 2722: -14.067469,-7.593817 + 3618: 64.12612,-1.2864593 - node: color: '#FFFFFFFF' id: Bushn1 decals: - 1320: 58.021324,0.5489143 - 1321: 57.96924,-1.1594192 - 3435: 57.99387,-2.411529 + 1316: 58.021324,0.5489143 + 1317: 57.96924,-1.1594192 + 3430: 57.99387,-2.411529 - node: color: '#52B4E996' id: CheckerNWSE decals: - 3008: -19,-27 - 3009: -16,-27 - 3010: -22,-27 + 3003: -19,-27 + 3004: -16,-27 + 3005: -22,-27 - node: color: '#FFFFFFFF' id: ConcreteTrimCornerNe @@ -3153,21 +3174,33 @@ entities: decals: 30: -2,-2 31: -2,-2 + 3479: 2,4 + 3480: 3,3 + 3481: 4,2 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerNw decals: 33: 2,-2 + 3476: -4,2 + 3477: -3,3 + 3478: -2,4 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerSe decals: 29: -2,2 + 3473: 2,-4 + 3474: 3,-3 + 3475: 4,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimInnerSw decals: 32: 2,2 + 3470: -2,-4 + 3471: -3,-3 + 3472: -4,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineE @@ -3180,27 +3213,27 @@ entities: 27: -2,0 28: -2,-1 42: 1,0 - 83: -2,-17 - 84: -2,-16 - 85: -2,-14 - 86: -2,-13 - 87: -2,-12 - 88: -2,-11 - 89: -2,-10 - 90: -2,-8 - 91: -2,-7 - 92: -2,-6 - 112: -2,6 - 113: -2,7 - 114: -2,8 - 115: -2,10 - 116: -2,11 - 117: -2,11 - 118: -2,12 - 119: -2,13 - 120: -2,14 - 121: -2,16 - 122: -2,17 + 79: -2,-17 + 80: -2,-16 + 81: -2,-14 + 82: -2,-13 + 83: -2,-12 + 84: -2,-11 + 85: -2,-10 + 86: -2,-8 + 87: -2,-7 + 88: -2,-6 + 108: -2,6 + 109: -2,7 + 110: -2,8 + 111: -2,10 + 112: -2,11 + 113: -2,11 + 114: -2,12 + 115: -2,13 + 116: -2,14 + 117: -2,16 + 118: -2,17 - node: color: '#FFFFFFFF' id: ConcreteTrimLineN @@ -3212,26 +3245,26 @@ entities: 18: 0,-2 19: 1,-2 39: 0,1 - 63: 17,-2 - 64: 16,-2 - 65: 14,-2 - 66: 13,-2 - 67: 12,-2 - 68: 11,-2 - 69: 10,-2 - 70: 8,-2 - 71: 7,-2 - 72: 6,-2 - 93: -6,-2 - 94: -7,-2 - 95: -8,-2 - 96: -10,-2 - 97: -11,-2 - 98: -12,-2 - 99: -13,-2 - 100: -16,-2 - 101: -17,-2 - 3057: -14,-2 + 59: 17,-2 + 60: 16,-2 + 61: 14,-2 + 62: 13,-2 + 63: 12,-2 + 64: 11,-2 + 65: 10,-2 + 66: 8,-2 + 67: 7,-2 + 68: 6,-2 + 89: -6,-2 + 90: -7,-2 + 91: -8,-2 + 92: -10,-2 + 93: -11,-2 + 94: -12,-2 + 95: -13,-2 + 96: -16,-2 + 97: -17,-2 + 3052: -14,-2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineS @@ -3244,26 +3277,26 @@ entities: 25: -1,2 34: 0,-1 41: 0,-1 - 53: 6,2 - 54: 7,2 - 55: 8,2 - 56: 10,2 - 57: 11,2 - 58: 12,2 - 59: 13,2 - 60: 14,2 - 61: 16,2 - 62: 17,2 - 102: -17,2 - 103: -16,2 - 104: -14,2 - 105: -13,2 - 106: -12,2 - 107: -11,2 - 108: -10,2 - 109: -8,2 - 110: -7,2 - 111: -6,2 + 51: 6,2 + 52: 7,2 + 53: 8,2 + 54: 10,2 + 55: 12,2 + 56: 13,2 + 57: 16,2 + 58: 17,2 + 98: -17,2 + 99: -16,2 + 100: -14,2 + 101: -13,2 + 102: -12,2 + 103: -11,2 + 104: -10,2 + 105: -8,2 + 106: -7,2 + 107: -6,2 + 3448: 11,2 + 3449: 14,2 - node: color: '#FFFFFFFF' id: ConcreteTrimLineW @@ -3278,2506 +3311,2566 @@ entities: 43: 2,6 44: 2,7 45: 2,8 - 46: 2,10 - 47: 2,11 - 48: 2,12 - 49: 2,13 - 50: 2,14 - 51: 2,16 - 52: 2,17 - 73: 2,-6 - 74: 2,-7 - 75: 2,-8 - 76: 2,-10 - 77: 2,-11 - 78: 2,-12 - 79: 2,-13 - 80: 2,-14 - 81: 2,-16 - 82: 2,-17 + 46: 2,11 + 47: 2,12 + 48: 2,14 + 49: 2,16 + 50: 2,17 + 69: 2,-6 + 70: 2,-7 + 71: 2,-8 + 72: 2,-10 + 73: 2,-11 + 74: 2,-12 + 75: 2,-13 + 76: 2,-14 + 77: 2,-16 + 78: 2,-17 + 3454: 2,10 + 3455: 2,13 - node: color: '#FFFFFFFF' id: Delivery decals: - 1787: 50,-39 - 1788: 50,-38 - 1789: 50,-37 - 1790: 50,-36 + 1783: 50,-39 + 1784: 50,-38 + 1785: 50,-37 + 1786: 50,-36 - node: color: '#D381C996' id: DiagonalOverlay decals: - 2296: -10,-49 - 2372: -10,-45 - 3438: 4,-47 - 3439: 4,-46 - 3440: -2,-47 - 3441: -6,-47 + 2292: -10,-49 + 2368: -10,-45 + 3433: 4,-47 + 3434: 4,-46 + 3435: -2,-47 + 3436: -6,-47 - node: color: '#DE3A3A96' id: DiagonalOverlay decals: - 1607: 51,-2 - 1608: 49,-2 - 1609: 49,-5 - 1610: 51,-5 - 1611: 29,-33 - 1612: 29,-32 - 1613: 39,-34 - 1614: 39,-32 - 1615: 41,-31 - 1616: 44,-37 - 1617: 41,-38 - 1618: 38,-41 - 2908: 41,-24 + 1603: 51,-2 + 1604: 49,-2 + 1605: 49,-5 + 1606: 51,-5 + 1607: 29,-33 + 1608: 29,-32 + 1609: 39,-34 + 1610: 39,-32 + 1611: 41,-31 + 1612: 44,-37 + 1613: 41,-38 + 1614: 38,-41 + 2903: 41,-24 - node: color: '#EFB34196' id: DiagonalOverlay decals: - 1873: 9,33 - 1874: 9,32 - 1875: 20,33 - 1876: 20,32 + 1869: 9,33 + 1870: 9,32 + 1871: 20,33 + 1872: 20,32 - node: color: '#FFFFFFFF' id: FlowersBROne decals: - 2806: 16.070688,16.03927 - 2837: 9.361443,4.4135666 - 2838: 8.71561,5.3614836 + 2801: 16.070688,16.03927 + 2832: 9.361443,4.4135666 + 2833: 8.71561,5.3614836 - node: color: '#FFFFFFFF' id: FlowersBRThree decals: - 2807: 17.062426,11.239492 - 2808: 10.321154,17.060677 - 2841: 7.6635256,6.1948166 - 2842: 8.538526,6.2989836 - 2877: 9.51524,6.327868 + 2802: 17.062426,11.239492 + 2803: 10.321154,17.060677 + 2836: 7.6635256,6.1948166 + 2837: 8.538526,6.2989836 + 2872: 9.51524,6.327868 - node: color: '#FFFFFFFF' id: FlowersBRTwo decals: - 2834: 10.111443,4.4344 - 2835: 8.663526,4.5594 - 2836: 8.05936,5.5073166 - 2878: 9.79649,6.7862015 + 2829: 10.111443,4.4344 + 2830: 8.663526,4.5594 + 2831: 8.05936,5.5073166 + 2873: 9.79649,6.7862015 - node: color: '#FFFFFFFF' id: Flowersbr1 decals: - 2803: 3.1090877,15.838451 - 2804: 15.10194,16.174686 + 2798: 3.1090877,15.838451 + 2799: 15.10194,16.174686 - node: color: '#FFFFFFFF' id: Flowersbr2 decals: - 2805: 15.393607,16.737186 - 2839: 9.49686,5.1010666 - 2840: 9.080193,5.7260666 - 2843: 10.324566,5.2335067 - 2865: 16.988474,10.508276 - 2866: 16.363474,10.747859 - 2867: 11.000941,16.992361 - 2868: 11.6309395,17.170504 - 2884: 7.8013525,4.69695 - 2885: 9.145103,3.603201 - 2886: 9.15132,6.0905905 + 2800: 15.393607,16.737186 + 2834: 9.49686,5.1010666 + 2835: 9.080193,5.7260666 + 2838: 10.324566,5.2335067 + 2860: 16.988474,10.508276 + 2861: 16.363474,10.747859 + 2862: 11.000941,16.992361 + 2863: 11.6309395,17.170504 + 2879: 7.8013525,4.69695 + 2880: 9.145103,3.603201 + 2881: 9.15132,6.0905905 - node: color: '#FFFFFFFF' id: Flowersbr3 decals: - 2876: 8.806907,6.8799515 + 2871: 8.806907,6.8799515 - node: color: '#FFFFFFFF' id: Flowerspv1 decals: - 2844: 15.255633,6.9409747 - 2845: 14.661882,7.545141 + 2839: 15.255633,6.9409747 + 2840: 14.661882,7.545141 - node: color: '#FFFFFFFF' id: Flowerspv2 decals: - 2846: 15.463966,7.690975 - 2848: 14.5844555,8.774308 - 2852: 14.978545,6.1768036 - 2853: 15.728544,6.3643036 - 2879: 14.814111,5.0989227 - 2880: 15.56411,4.4947557 - 2883: 12.9190645,9.799427 + 2841: 15.463966,7.690975 + 2843: 14.5844555,8.774308 + 2847: 14.978545,6.1768036 + 2848: 15.728544,6.3643036 + 2874: 14.814111,5.0989227 + 2875: 15.56411,4.4947557 + 2878: 12.9190645,9.799427 - node: color: '#FFFFFFFF' id: Flowerspv3 decals: - 2797: 8.013186,3.1140726 - 2798: 10.378889,-5.012858 - 2799: 10.274722,-4.383773 - 2847: 15.219872,8.347224 - 2849: 13.9177885,8.774308 - 2850: 13.252036,8.115639 - 2851: 13.134795,8.926804 - 2854: 16.103544,7.1143036 - 2855: 16.42646,6.1143036 - 2856: 15.748611,5.544657 - 2881: 14.501611,4.234339 - 2882: 13.6690645,9.570259 + 2792: 8.013186,3.1140726 + 2793: 10.378889,-5.012858 + 2794: 10.274722,-4.383773 + 2842: 15.219872,8.347224 + 2844: 13.9177885,8.774308 + 2845: 13.252036,8.115639 + 2846: 13.134795,8.926804 + 2849: 16.103544,7.1143036 + 2850: 16.42646,6.1143036 + 2851: 15.748611,5.544657 + 2876: 14.501611,4.234339 + 2877: 13.6690645,9.570259 - node: color: '#FFFFFFFF' id: Flowersy1 decals: - 2795: 7.160172,13.449887 - 2796: 5.483089,13.918637 - 2809: 12.341987,18.164845 - 2816: 4.084557,12.876521 - 2817: 6.313724,11.689021 - 2818: 9.0012245,11.564021 - 2824: 8.3553915,12.168188 - 2825: 6.730391,12.855688 - 2826: 5.105391,14.376521 - 2827: 2.9283073,14.741104 - 2829: 4.719974,13.105688 - 2830: 4.355391,14.585857 - 2831: 3.473161,14.394393 - 2832: 4.3585773,13.821476 - 2858: 2.299132,6.662748 - 2863: 4.7337813,6.6002483 - 2864: 4.5150313,6.0064983 + 2790: 7.160172,13.449887 + 2791: 5.483089,13.918637 + 2804: 12.341987,18.164845 + 2811: 4.084557,12.876521 + 2812: 6.313724,11.689021 + 2813: 9.0012245,11.564021 + 2819: 8.3553915,12.168188 + 2820: 6.730391,12.855688 + 2821: 5.105391,14.376521 + 2822: 2.9283073,14.741104 + 2824: 4.719974,13.105688 + 2825: 4.355391,14.585857 + 2826: 3.473161,14.394393 + 2827: 4.3585773,13.821476 + 2853: 2.299132,6.662748 + 2858: 4.7337813,6.6002483 + 2859: 4.5150313,6.0064983 - node: color: '#FFFFFFFF' id: Flowersy2 decals: - 2810: 14.633654,18.154427 - 2819: 7.6991415,11.939021 - 2820: 7.0533075,11.282771 - 2821: 8.1783085,11.241104 - 2859: 3.0178826,5.8710814 + 2805: 14.633654,18.154427 + 2814: 7.6991415,11.939021 + 2815: 7.0533075,11.282771 + 2816: 8.1783085,11.241104 + 2854: 3.0178826,5.8710814 - node: color: '#FFFFFFFF' id: Flowersy3 decals: - 2811: 13.227404,18.091927 - 2813: 11.914904,18.11276 - 2814: 11.914904,18.11276 - 2822: 6.938724,12.168188 - 2823: 7.6158075,12.918188 - 2833: 3.4939945,13.592309 - 2860: 3.1637156,6.5481644 - 2861: 3.7887158,5.704415 - 2862: 3.9108648,7.0273314 + 2806: 13.227404,18.091927 + 2808: 11.914904,18.11276 + 2809: 11.914904,18.11276 + 2817: 6.938724,12.168188 + 2818: 7.6158075,12.918188 + 2828: 3.4939945,13.592309 + 2855: 3.1637156,6.5481644 + 2856: 3.7887158,5.704415 + 2857: 3.9108648,7.0273314 - node: color: '#FFFFFFFF' id: Flowersy4 decals: - 2800: 3.8501334,-9.470912 - 2801: 4.3709664,-9.908412 - 2802: 3.6209664,-9.960495 - 2812: 13.966987,18.133595 - 2815: 15.123237,18.071095 - 2828: 5.136641,13.511938 - 2857: 2.2574656,5.8294144 - 2869: 9.849766,11.338729 - 2870: 9.047683,10.619978 - 2871: 4.7809443,7.692894 - 2872: 5.676778,7.797061 - 2873: 5.4059443,8.505394 - 2874: 5.8902392,6.890369 - 2875: 6.223573,8.400785 + 2795: 3.8501334,-9.470912 + 2796: 4.3709664,-9.908412 + 2797: 3.6209664,-9.960495 + 2807: 13.966987,18.133595 + 2810: 15.123237,18.071095 + 2823: 5.136641,13.511938 + 2852: 2.2574656,5.8294144 + 2864: 9.849766,11.338729 + 2865: 9.047683,10.619978 + 2866: 4.7809443,7.692894 + 2867: 5.676778,7.797061 + 2868: 5.4059443,8.505394 + 2869: 5.8902392,6.890369 + 2870: 6.223573,8.400785 - node: color: '#00BEBE7F' id: FullTileOverlayGreyscale decals: - 3230: -26,40 - 3231: -26,42 - 3232: -43,2 - 3233: -42,2 - 3234: -37,2 - 3235: -36,2 + 3225: -26,40 + 3226: -26,42 + 3227: -43,2 + 3228: -42,2 + 3229: -37,2 + 3230: -36,2 - node: color: '#334E6DC8' id: FullTileOverlayGreyscale decals: - 717: 21,3 - 718: 23,3 - 719: 25,3 - 819: -33,-9 - 820: -29,-9 - 2917: -23,-36 + 713: 21,3 + 714: 23,3 + 715: 25,3 + 815: -33,-9 + 816: -29,-9 + 2912: -23,-36 + - node: + color: '#373737FF' + id: FullTileOverlayGreyscale + decals: + 3498: 21,-19 + 3501: 20,-19 + 3502: 19,-19 + 3503: 19,-18 + 3504: 18,-19 + 3505: 18,-20 + 3506: 19,-20 + 3507: 19,-21 + 3508: 18,-21 + 3510: 21,-18 + 3511: 20,-18 + 3519: 17,-18 + 3520: 18,-17 + 3521: 21,-22 + 3522: 22,-21 - node: color: '#4A35194C' id: FullTileOverlayGreyscale decals: - 2746: -22,3 - 2747: -21,3 - 2748: -20,3 - 2749: -19,3 - 2750: -19,4 - 2751: -19,5 - 2752: -19,6 - 2753: -19,7 - 2754: -19,8 - 2755: -19,9 - 2756: -19,10 - 2757: -20,10 - 2758: -20,9 - 2759: -20,8 - 2760: -20,7 - 2761: -20,6 - 2762: -20,5 - 2763: -20,4 - 2764: -21,4 - 2765: -22,4 - 2766: -22,5 - 2767: -21,5 - 2768: -21,6 - 2769: -22,6 - 2770: -22,7 - 2771: -21,7 - 2772: -21,8 - 2773: -22,8 - 2774: -22,9 - 2775: -21,9 - 2776: -21,10 - 2777: -22,10 + 2741: -22,3 + 2742: -21,3 + 2743: -20,3 + 2744: -19,3 + 2745: -19,4 + 2746: -19,5 + 2747: -19,6 + 2748: -19,7 + 2749: -19,8 + 2750: -19,9 + 2751: -19,10 + 2752: -20,10 + 2753: -20,9 + 2754: -20,8 + 2755: -20,7 + 2756: -20,6 + 2757: -20,5 + 2758: -20,4 + 2759: -21,4 + 2760: -22,4 + 2761: -22,5 + 2762: -21,5 + 2763: -21,6 + 2764: -22,6 + 2765: -22,7 + 2766: -21,7 + 2767: -21,8 + 2768: -22,8 + 2769: -22,9 + 2770: -21,9 + 2771: -21,10 + 2772: -22,10 - node: color: '#52B4E996' id: FullTileOverlayGreyscale decals: - 255: -8,-39 - 256: -7,-39 - 541: -26,-27 - 542: -26,-28 - 543: -26,-29 - 544: -12,-30 - 545: -12,-29 - 546: -11,-29 - 561: -26,-41 - 746: -3,-37 - 747: -3,-36 - 829: -29,-6 - 830: -33,-6 - 938: -28,-29 - 939: -28,-28 - 940: -24,-29 - 941: -24,-28 + 251: -8,-39 + 252: -7,-39 + 537: -26,-27 + 538: -26,-28 + 539: -26,-29 + 540: -12,-30 + 541: -12,-29 + 542: -11,-29 + 557: -26,-41 + 742: -3,-37 + 743: -3,-36 + 825: -29,-6 + 826: -33,-6 + 934: -28,-29 + 935: -28,-28 + 936: -24,-29 + 937: -24,-28 - node: color: '#765428FF' id: FullTileOverlayGreyscale decals: - 3374: -55,-16 - 3375: -56,-16 + 3369: -55,-16 + 3370: -56,-16 - node: color: '#951710FF' id: FullTileOverlayGreyscale decals: - 2454: 43,37 - 2455: 43,38 - 2456: 43,39 - 2457: 43,40 - 2458: 43,41 - 2459: 43,36 - 2460: 43,42 + 2450: 43,37 + 2451: 43,38 + 2452: 43,39 + 2453: 43,40 + 2454: 43,41 + 2455: 43,36 + 2456: 43,42 - node: color: '#9FED5896' id: FullTileOverlayGreyscale decals: - 199: -33,-14 - 200: -30,-14 - 201: -26,-18 - 202: -31,-19 - 203: -31,-18 - 204: -31,-17 - 274: -26,-14 - 485: -30,-22 - 825: -31,-9 - 826: -31,-4 + 195: -33,-14 + 196: -30,-14 + 197: -26,-18 + 198: -31,-19 + 199: -31,-18 + 200: -31,-17 + 270: -26,-14 + 481: -30,-22 + 821: -31,-9 + 822: -31,-4 - node: color: '#A4610696' id: FullTileOverlayGreyscale decals: - 823: -31,-8 - 824: -31,-5 + 819: -31,-8 + 820: -31,-5 - node: color: '#BC863FFF' id: FullTileOverlayGreyscale decals: - 3292: -48,-3 - 3293: -48,-4 - 3294: -52,-1 - 3295: -52,0 - 3406: -48,0 - 3407: -48,1 - 3408: -48,-1 - 3420: -51,-1 - 3421: -51,0 + 3287: -48,-3 + 3288: -48,-4 + 3289: -52,-1 + 3290: -52,0 + 3401: -48,0 + 3402: -48,1 + 3403: -48,-1 + 3415: -51,-1 + 3416: -51,0 - node: color: '#C6FF91FF' id: FullTileOverlayGreyscale decals: - 3075: -37,-35 - 3076: -37,-34 - 3077: -36,-34 - 3078: -35,-34 + 3070: -37,-35 + 3071: -37,-34 + 3072: -36,-34 + 3073: -35,-34 - node: color: '#D381C996' id: FullTileOverlayGreyscale decals: - 833: -29,-4 - 834: -33,-4 + 829: -29,-4 + 830: -33,-4 - node: color: '#D4D4D496' id: FullTileOverlayGreyscale decals: - 827: -29,-7 - 828: -33,-7 + 823: -29,-7 + 824: -33,-7 - node: color: '#DE3A3A96' id: FullTileOverlayGreyscale decals: - 831: -29,-5 - 832: -33,-5 - 2792: 56,-10 - 2793: 56,-11 - 2794: 56,-12 - 3447: 32,-10 - 3448: 38,-10 - 3449: 40,-10 + 827: -29,-5 + 828: -33,-5 + 2787: 56,-10 + 2788: 56,-11 + 2789: 56,-12 + 3442: 32,-10 + 3443: 38,-10 + 3444: 40,-10 - node: color: '#EFB34196' id: FullTileOverlayGreyscale decals: - 821: -29,-8 - 822: -33,-8 - 2943: -11,-39 - 2944: -19,-40 - 2989: -16,-38 + 817: -29,-8 + 818: -33,-8 + 2938: -11,-39 + 2939: -19,-40 + 2984: -16,-38 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineE + decals: + 3445: 11,2 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineN + decals: + 3452: 2,10 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineS + decals: + 3447: 12.501469,3.9993005 + 3450: 2,13 + 3451: 2,13 + - node: + color: '#FFFFFFFF' + id: GrayConcreteTrimLineW + decals: + 3446: 14,2 + 3453: 4.001555,11.500919 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale decals: - 604: 20,9 - 605: 21,9 - 606: 21,9 - 607: 22,9 - 608: 22,9 - 609: 25,9 - 633: 26,9 + 600: 20,9 + 601: 21,9 + 602: 21,9 + 603: 22,9 + 604: 22,9 + 605: 25,9 + 629: 26,9 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale decals: - 269: -9,-34 - 270: -6,-34 - 340: -20,-33 - 341: -19,-33 - 342: -18,-33 - 343: -17,-33 - 344: -16,-33 - 345: -15,-33 - 548: -13,-29 - 560: -26,-42 + 265: -9,-34 + 266: -6,-34 + 336: -20,-33 + 337: -19,-33 + 338: -18,-33 + 339: -17,-33 + 340: -16,-33 + 341: -15,-33 + 544: -13,-29 + 556: -26,-42 - node: color: '#639137FF' id: HalfTileOverlayGreyscale decals: - 651: 4,24 - 652: 5,24 - 653: 6,24 - 654: 7,24 - 655: 8,24 - 656: 9,24 + 647: 4,24 + 648: 5,24 + 649: 6,24 + 650: 7,24 + 651: 8,24 + 652: 9,24 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale decals: - 163: -26,-15 - 164: -27,-15 - 165: -28,-15 - 166: -29,-15 - 167: -30,-15 - 168: -32,-15 - 205: -31,-15 - 486: -30,-23 - 487: -31,-23 - 488: -32,-23 + 159: -26,-15 + 160: -27,-15 + 161: -28,-15 + 162: -29,-15 + 163: -30,-15 + 164: -32,-15 + 201: -31,-15 + 482: -30,-23 + 483: -31,-23 + 484: -32,-23 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale decals: - 3079: -36,-31 - 3080: -37,-31 - 3081: -38,-31 + 3074: -36,-31 + 3075: -37,-31 + 3076: -38,-31 - node: color: '#D381C996' id: HalfTileOverlayGreyscale decals: - 841: -13,-50 - 842: -12,-50 - 3014: 15,-42 + 837: -13,-50 + 838: -12,-50 + 3009: 15,-42 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale decals: - 1486: 45,-15 - 1487: 44,-15 - 1488: 43,-15 - 1489: 42,-15 - 1490: 41,-15 + 1482: 45,-15 + 1483: 44,-15 + 1484: 43,-15 + 1485: 42,-15 + 1486: 41,-15 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale180 decals: - 599: 20,4 - 600: 20,4 - 601: 21,4 - 602: 22,4 - 603: 25,4 - 634: 26,4 + 595: 20,4 + 596: 20,4 + 597: 21,4 + 598: 22,4 + 599: 25,4 + 630: 26,4 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale180 decals: - 348: -15,-36 - 349: -16,-36 - 350: -17,-36 - 351: -18,-36 - 352: -20,-36 - 353: -19,-36 - 547: -13,-28 - 559: -26,-40 + 344: -15,-36 + 345: -16,-36 + 346: -17,-36 + 347: -18,-36 + 348: -20,-36 + 349: -19,-36 + 543: -13,-28 + 555: -26,-40 - node: color: '#639137FF' id: HalfTileOverlayGreyscale180 decals: - 643: 8,22 - 644: 7,22 - 645: 7,22 - 646: 6,22 - 647: 5,22 - 657: 4,19 - 658: 5,19 - 659: 6,19 - 660: 7,19 - 661: 7,19 - 662: 8,19 - 663: 9,19 - 676: 5,23 - 677: 8,23 - - node: - color: '#80C71FFF' - id: HalfTileOverlayGreyscale180 - decals: - 1428: 53,-20 - - node: - color: '#8932B8FF' - id: HalfTileOverlayGreyscale180 - decals: - 1429: 49,-20 + 639: 8,22 + 640: 7,22 + 641: 7,22 + 642: 6,22 + 643: 5,22 + 653: 4,19 + 654: 5,19 + 655: 6,19 + 656: 7,19 + 657: 7,19 + 658: 8,19 + 659: 9,19 + 672: 5,23 + 673: 8,23 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale180 decals: - 160: -27,-17 - 161: -28,-17 - 162: -26,-17 - 169: -30,-21 - 170: -31,-21 - 171: -32,-21 - 489: -30,-24 - 490: -31,-24 - 491: -32,-24 + 156: -27,-17 + 157: -28,-17 + 158: -26,-17 + 165: -30,-21 + 166: -31,-21 + 167: -32,-21 + 485: -30,-24 + 486: -31,-24 + 487: -32,-24 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale180 decals: - 3074: -38,-35 + 3069: -38,-35 - node: color: '#D381C996' id: HalfTileOverlayGreyscale180 decals: - 835: -13,-48 - 836: -12,-48 - 3015: 15,-39 - - node: - color: '#F9801DFF' - id: HalfTileOverlayGreyscale180 - decals: - 1430: 45,-20 + 831: -13,-48 + 832: -12,-48 + 3010: 15,-39 - node: color: '#1E5026FF' id: HalfTileOverlayGreyscale270 decals: - 2468: 42,36 - 2469: 42,37 - 2470: 42,38 - 2471: 42,39 - 2472: 42,40 - 2473: 42,41 - 2474: 42,42 + 2464: 42,36 + 2465: 42,37 + 2466: 42,38 + 2467: 42,39 + 2468: 42,40 + 2469: 42,41 + 2470: 42,42 - node: color: '#334E6DC8' id: HalfTileOverlayGreyscale270 decals: - 595: 19,5 - 596: 19,6 - 597: 19,7 - 598: 19,8 + 591: 19,5 + 592: 19,6 + 593: 19,7 + 594: 19,8 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale270 decals: - 220: -3,-33 - 221: -3,-34 - 222: -3,-35 - 223: -3,-38 - 224: -3,-39 - 225: -3,-40 - 263: -5,-35 - 264: -5,-34 - 267: -8,-35 - 268: -8,-34 - 338: -21,-34 - 339: -21,-35 - 552: -11,-28 - 553: -11,-27 - 554: -11,-26 - 558: -11,-25 + 216: -3,-33 + 217: -3,-34 + 218: -3,-35 + 219: -3,-38 + 220: -3,-39 + 221: -3,-40 + 259: -5,-35 + 260: -5,-34 + 263: -8,-35 + 264: -8,-34 + 334: -21,-34 + 335: -21,-35 + 548: -11,-28 + 549: -11,-27 + 550: -11,-26 + 554: -11,-25 - node: color: '#639137FF' id: HalfTileOverlayGreyscale270 decals: - 642: 9,21 - 664: 3,20 - 665: 3,21 - 666: 3,22 - 667: 3,23 - 678: 7,20 - 681: 7,21 + 638: 9,21 + 660: 3,20 + 661: 3,21 + 662: 3,22 + 663: 3,23 + 674: 7,20 + 677: 7,21 - node: color: '#951710FF' id: HalfTileOverlayGreyscale270 decals: - 2482: 44,36 - 2483: 44,37 - 2484: 44,38 - 2485: 44,39 - 2486: 44,40 - 2487: 44,41 - 2488: 44,42 + 2478: 44,36 + 2479: 44,37 + 2480: 44,38 + 2481: 44,39 + 2482: 44,40 + 2483: 44,41 + 2484: 44,42 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale270 decals: - 174: -33,-20 - 175: -33,-19 - 176: -33,-18 - 177: -33,-17 - 178: -33,-16 - 196: -33,-12 - 198: -30,-12 + 170: -33,-20 + 171: -33,-19 + 172: -33,-18 + 173: -33,-17 + 174: -33,-16 + 192: -33,-12 + 194: -30,-12 - node: color: '#C6FF91FF' id: HalfTileOverlayGreyscale270 decals: - 3083: -39,-32 - 3084: -39,-33 - 3085: -39,-34 + 3078: -39,-32 + 3079: -39,-33 + 3080: -39,-34 - node: color: '#D381C996' id: HalfTileOverlayGreyscale270 decals: - 840: -13,-49 + 836: -13,-49 - node: color: '#DE3A3A96' id: HalfTileOverlayGreyscale270 decals: - 2787: 57,-12 - 2788: 57,-11 - 2789: 57,-10 + 2782: 57,-12 + 2783: 57,-11 + 2784: 57,-10 - node: color: '#1E5026FF' id: HalfTileOverlayGreyscale90 decals: - 2461: 44,36 - 2462: 44,37 - 2463: 44,38 - 2464: 44,39 - 2465: 44,40 - 2466: 44,41 - 2467: 44,42 + 2457: 44,36 + 2458: 44,37 + 2459: 44,38 + 2460: 44,39 + 2461: 44,40 + 2462: 44,41 + 2463: 44,42 - node: color: '#52B4E996' id: HalfTileOverlayGreyscale90 decals: - 261: -7,-35 - 262: -7,-34 - 265: -10,-35 - 266: -10,-34 - 346: -14,-34 - 347: -14,-35 - 555: -12,-27 - 556: -12,-26 - 557: -12,-25 + 257: -7,-35 + 258: -7,-34 + 261: -10,-35 + 262: -10,-34 + 342: -14,-34 + 343: -14,-35 + 551: -12,-27 + 552: -12,-26 + 553: -12,-25 - node: color: '#639137FF' id: HalfTileOverlayGreyscale90 decals: - 648: 4,21 - 668: 10,20 - 669: 10,21 - 670: 10,22 - 671: 10,23 - 679: 6,20 - 680: 6,21 + 644: 4,21 + 664: 10,20 + 665: 10,21 + 666: 10,22 + 667: 10,23 + 675: 6,20 + 676: 6,21 - node: color: '#951710FF' id: HalfTileOverlayGreyscale90 decals: - 2475: 42,36 - 2476: 42,37 - 2477: 42,38 - 2478: 42,39 - 2479: 42,40 - 2480: 42,41 - 2481: 42,42 + 2471: 42,36 + 2472: 42,37 + 2473: 42,38 + 2474: 42,39 + 2475: 42,40 + 2476: 42,41 + 2477: 42,42 - node: color: '#9FED5896' id: HalfTileOverlayGreyscale90 decals: - 157: -29,-20 - 158: -29,-19 - 159: -29,-18 - 195: -29,-12 - 197: -32,-12 + 153: -29,-20 + 154: -29,-19 + 155: -29,-18 + 191: -29,-12 + 193: -32,-12 - node: color: '#D381C996' id: HalfTileOverlayGreyscale90 decals: - 839: -12,-49 + 835: -12,-49 - node: color: '#EFB34196' id: MiniTileCornerOverlayNE decals: - 2938: -14,-40 + 2933: -14,-40 - node: color: '#EFB34196' id: MiniTileCornerOverlayNW decals: - 2935: -16,-40 + 2930: -16,-40 - node: color: '#EFB34196' id: MiniTileCornerOverlaySE decals: - 2936: -14,-42 + 2931: -14,-42 - node: color: '#EFB34196' id: MiniTileCornerOverlaySW decals: - 2937: -16,-42 + 2932: -16,-42 - node: color: '#DE3A3A96' id: MiniTileInnerOverlaySE decals: - 2887: 36,-13 + 2882: 36,-13 - node: color: '#EFB34196' id: MiniTileLineOverlayE decals: - 2940: -14,-41 + 2935: -14,-41 - node: color: '#DE3A3A96' id: MiniTileLineOverlayN decals: - 2786: 55,-10 + 2781: 55,-10 - node: color: '#EFB34196' id: MiniTileLineOverlayN decals: - 2939: -15,-40 + 2934: -15,-40 - node: color: '#DE3A3A96' id: MiniTileLineOverlayS decals: - 2785: 55,-12 + 2780: 55,-12 - node: color: '#EFB34196' id: MiniTileLineOverlayS decals: - 2942: -15,-42 + 2937: -15,-42 - node: color: '#EFB34196' id: MiniTileLineOverlayW decals: - 2941: -16,-41 + 2936: -16,-41 - node: color: '#D4D4D496' id: MiniTileOverlay decals: - 1802: 46,-35 - 1803: 46,-41 + 1798: 46,-35 + 1799: 46,-41 - node: color: '#FFFFFFFF' id: MiniTileOverlay decals: - 1804: 6,39 + 1800: 6,39 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerNe decals: - 1792: 48,-36 + 1788: 48,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerNw decals: - 1793: 45,-36 + 1789: 45,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerSe decals: - 1791: 48,-39 - 1795: 47,-40 + 1787: 48,-39 + 1791: 47,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelCornerSw decals: - 1794: 45,-40 + 1790: 45,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelLineN decals: - 1796: 46,-36 - 1797: 47,-36 + 1792: 46,-36 + 1793: 47,-36 - node: color: '#FFFFFFFF' id: MiniTileSteelLineS decals: - 1798: 46,-40 + 1794: 46,-40 - node: color: '#FFFFFFFF' id: MiniTileSteelLineW decals: - 1799: 45,-39 - 1800: 45,-38 - 1801: 45,-37 + 1795: 45,-39 + 1796: 45,-38 + 1797: 45,-37 - node: color: '#334E6DC8' id: MiniTileWhiteCornerNe decals: - 1000: -52,-9 + 996: -52,-9 - node: color: '#A4610696' id: MiniTileWhiteCornerNe decals: - 1015: -57,-3 - 1018: -57,-3 + 1011: -57,-3 + 1014: -57,-3 - node: color: '#BC863FBF' id: MiniTileWhiteCornerNe decals: - 971: -57,-18 + 967: -57,-18 - node: color: '#EFB34196' id: MiniTileWhiteCornerNe decals: - 2980: -11,-42 - 2981: -12,-39 + 2975: -11,-42 + 2976: -12,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerNe decals: - 452: -15,-34 - 2948: -12,-39 - 2949: -11,-42 + 448: -15,-34 + 2943: -12,-39 + 2944: -11,-42 - node: color: '#A4610696' id: MiniTileWhiteCornerNw decals: - 1016: -58,-3 - 1017: -58,-3 + 1012: -58,-3 + 1013: -58,-3 - node: color: '#BC863FBF' id: MiniTileWhiteCornerNw decals: - 970: -58,-18 + 966: -58,-18 - node: color: '#EFB34196' id: MiniTileWhiteCornerNw decals: - 2982: -18,-39 + 2977: -18,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerNw decals: - 451: -20,-34 - 2947: -18,-39 + 447: -20,-34 + 2942: -18,-39 - node: color: '#334E6DC8' id: MiniTileWhiteCornerSe decals: - 999: -52,-11 + 995: -52,-11 - node: color: '#A4610696' id: MiniTileWhiteCornerSe decals: - 1013: -57,-5 - 1019: -57,-5 + 1009: -57,-5 + 1015: -57,-5 - node: color: '#BC863FBF' id: MiniTileWhiteCornerSe decals: - 968: -57,-20 + 964: -57,-20 - node: color: '#EFB34196' id: MiniTileWhiteCornerSe decals: - 2979: -11,-43 + 2974: -11,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerSe decals: - 449: -15,-35 - 2945: -11,-43 + 445: -15,-35 + 2940: -11,-43 - node: color: '#A4610696' id: MiniTileWhiteCornerSw decals: - 1014: -58,-5 - 1020: -58,-5 + 1010: -58,-5 + 1016: -58,-5 - node: color: '#BC863FBF' id: MiniTileWhiteCornerSw decals: - 969: -58,-20 + 965: -58,-20 - node: color: '#EFB34196' id: MiniTileWhiteCornerSw decals: - 2978: -18,-43 + 2973: -18,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteCornerSw decals: - 450: -20,-35 - 2946: -18,-43 + 446: -20,-35 + 2941: -18,-43 - node: color: '#D381C996' id: MiniTileWhiteInnerNe decals: - 3442: -7,-48 + 3437: -7,-48 - node: color: '#DE3A3A96' id: MiniTileWhiteInnerNe decals: - 3437: 42,-39 + 3432: 42,-39 - node: color: '#EFB34196' id: MiniTileWhiteInnerNe decals: - 2988: -12,-42 + 2983: -12,-42 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerNe decals: - 445: -21,-36 - 2966: -12,-42 + 441: -21,-36 + 2961: -12,-42 - node: color: '#DE3A3A96' id: MiniTileWhiteInnerNw decals: - 3436: 42,-39 + 3431: 42,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerNw decals: - 501: -14,-36 + 497: -14,-36 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerSe decals: - 447: -21,-33 - 448: -21,-33 + 443: -21,-33 + 444: -21,-33 - node: color: '#FFFFFFFF' id: MiniTileWhiteInnerSw decals: - 446: -14,-33 + 442: -14,-33 - node: color: '#334E6DC8' id: MiniTileWhiteLineE decals: - 998: -52,-10 + 994: -52,-10 - node: color: '#A4610696' id: MiniTileWhiteLineE decals: - 1023: -57,-4 - 1024: -57,-4 + 1019: -57,-4 + 1020: -57,-4 - node: color: '#BC863FBF' id: MiniTileWhiteLineE decals: - 973: -57,-19 + 969: -57,-19 - node: color: '#EFB34196' id: MiniTileWhiteLineE decals: - 2986: -12,-41 - 2987: -12,-40 + 2981: -12,-41 + 2982: -12,-40 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineE decals: - 436: -21,-34 - 437: -21,-34 - 438: -21,-35 - 2955: -12,-40 - 2956: -12,-41 + 432: -21,-34 + 433: -21,-34 + 434: -21,-35 + 2950: -12,-40 + 2951: -12,-41 - node: color: '#EFB34196' id: MiniTileWhiteLineN decals: - 2967: -17,-39 - 2968: -16,-39 - 2969: -15,-39 - 2970: -14,-39 - 2971: -13,-39 + 2962: -17,-39 + 2963: -16,-39 + 2964: -15,-39 + 2965: -14,-39 + 2966: -13,-39 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineN decals: - 439: -20,-36 - 440: -19,-36 - 441: -18,-36 - 442: -17,-36 - 443: -16,-36 - 444: -15,-36 - 453: -19,-34 - 454: -18,-34 - 455: -17,-34 - 456: -16,-34 - 2950: -17,-39 - 2951: -16,-39 - 2952: -15,-39 - 2953: -14,-39 - 2954: -13,-39 + 435: -20,-36 + 436: -19,-36 + 437: -18,-36 + 438: -17,-36 + 439: -16,-36 + 440: -15,-36 + 449: -19,-34 + 450: -18,-34 + 451: -17,-34 + 452: -16,-34 + 2945: -17,-39 + 2946: -16,-39 + 2947: -15,-39 + 2948: -14,-39 + 2949: -13,-39 - node: color: '#EFB34196' id: MiniTileWhiteLineS decals: - 2972: -12,-43 - 2973: -13,-43 - 2974: -14,-43 - 2975: -15,-43 - 2976: -16,-43 - 2977: -17,-43 + 2967: -12,-43 + 2968: -13,-43 + 2969: -14,-43 + 2970: -15,-43 + 2971: -16,-43 + 2972: -17,-43 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineS decals: - 430: -15,-33 - 431: -16,-33 - 432: -17,-33 - 433: -18,-33 - 434: -19,-33 - 435: -20,-33 - 457: -16,-35 - 458: -17,-35 - 459: -18,-35 - 460: -19,-35 - 2957: -12,-43 - 2958: -13,-43 - 2959: -14,-43 - 2960: -15,-43 - 2961: -16,-43 - 2962: -17,-43 + 426: -15,-33 + 427: -16,-33 + 428: -17,-33 + 429: -18,-33 + 430: -19,-33 + 431: -20,-33 + 453: -16,-35 + 454: -17,-35 + 455: -18,-35 + 456: -19,-35 + 2952: -12,-43 + 2953: -13,-43 + 2954: -14,-43 + 2955: -15,-43 + 2956: -16,-43 + 2957: -17,-43 - node: color: '#A4610696' id: MiniTileWhiteLineW decals: - 1021: -58,-4 - 1022: -58,-4 + 1017: -58,-4 + 1018: -58,-4 - node: color: '#BC863FBF' id: MiniTileWhiteLineW decals: - 972: -58,-19 + 968: -58,-19 - node: color: '#EFB34196' id: MiniTileWhiteLineW decals: - 2983: -18,-40 - 2984: -18,-41 - 2985: -18,-42 + 2978: -18,-40 + 2979: -18,-41 + 2980: -18,-42 - node: color: '#FFFFFFFF' id: MiniTileWhiteLineW decals: - 428: -14,-35 - 429: -14,-34 - 2963: -18,-42 - 2964: -18,-41 - 2965: -18,-40 + 424: -14,-35 + 425: -14,-34 + 2958: -18,-42 + 2959: -18,-41 + 2960: -18,-40 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerNe decals: - 136: 5,-9 + 132: 5,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerNw decals: - 137: 9,-9 + 133: 9,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerSe decals: - 139: 5,-5 - 148: 11,-17 - 149: 17,-11 + 135: 5,-5 + 144: 11,-17 + 145: 17,-11 - node: color: '#FFFFFFFF' id: OldConcreteTrimInnerSw decals: - 138: 9,-5 + 134: 9,-5 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineE decals: - 129: 5,-8 - 130: 5,-7 - 131: 5,-7 - 132: 5,-6 - 140: 17,-15 - 141: 17,-14 - 142: 17,-13 - 143: 17,-12 + 125: 5,-8 + 126: 5,-7 + 127: 5,-7 + 128: 5,-6 + 136: 17,-15 + 137: 17,-14 + 138: 17,-13 + 139: 17,-12 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineN decals: - 123: 7,-9 - 124: 6,-9 - 125: 8,-9 + 119: 7,-9 + 120: 6,-9 + 121: 8,-9 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineS decals: - 133: 6,-5 - 134: 7,-5 - 135: 8,-5 - 144: 15,-17 - 145: 14,-17 - 146: 13,-17 - 147: 12,-17 + 129: 6,-5 + 130: 7,-5 + 131: 8,-5 + 140: 15,-17 + 141: 14,-17 + 142: 13,-17 + 143: 12,-17 - node: color: '#FFFFFFFF' id: OldConcreteTrimLineW decals: - 126: 9,-8 - 127: 9,-7 - 128: 9,-6 + 122: 9,-8 + 123: 9,-7 + 124: 9,-6 - node: color: '#D4D4D428' id: PavementOverlay decals: - 1377: 41,-12 - 1378: 42,-12 - 1379: 43,-12 - 1380: 44,-12 - 1381: 45,-12 - 1382: 45,-13 - 1383: 44,-13 - 1384: 43,-13 - 1385: 42,-13 - 1386: 41,-13 - 1387: 41,-14 - 1388: 42,-14 - 1389: 43,-14 - 1390: 44,-14 - 1391: 45,-14 - 1392: 44,-21 - 1393: 45,-21 - 1394: 46,-21 - 1395: 46,-22 - 1396: 45,-22 - 1397: 44,-22 - 1398: 48,-21 - 1399: 49,-21 - 1400: 50,-21 - 1401: 50,-22 - 1402: 49,-22 - 1403: 48,-22 - 1404: 52,-21 - 1405: 53,-21 - 1406: 54,-21 - 1407: 54,-22 - 1408: 53,-22 - 1409: 52,-22 + 1388: 44,-21 + 1389: 45,-21 + 1390: 46,-21 + 1391: 46,-22 + 1392: 45,-22 + 1393: 44,-22 + 1394: 48,-21 + 1395: 49,-21 + 1396: 50,-21 + 1397: 50,-22 + 1398: 49,-22 + 1399: 48,-22 + 1400: 52,-21 + 1401: 53,-21 + 1402: 54,-21 + 1403: 54,-22 + 1404: 53,-22 + 1405: 52,-22 + 3583: 42,-12 + 3585: 44,-12 + 3586: 44,-13 + 3587: 43,-13 + 3591: 41,-12 + 3592: 41,-14 + 3593: 42,-13 + 3594: 41,-13 + 3595: 42,-14 + 3596: 43,-14 + 3597: 44,-14 + 3598: 45,-14 + 3599: 45,-13 + 3600: 45,-12 + 3601: 43,-12 - node: color: '#1D1D21FF' id: QuarterTileOverlayGreyscale decals: - 2489: 43,37 - 2492: 44,41 + 2485: 43,37 + 2488: 44,41 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale decals: - 1355: 30,-3 - 1359: 30,-8 - 1362: 30,-5 - 1363: 30,-6 + 1351: 30,-3 + 1355: 30,-8 + 1358: 30,-5 + 1359: 30,-6 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale decals: - 208: -5,-37 - 209: -7,-37 - 210: -9,-37 - 211: -8,-37 - 212: -6,-37 - 218: -4,-37 - 257: -7,-40 - 272: -10,-37 - 273: -11,-37 - 310: -12,-37 - 311: -13,-37 - 313: -23,-33 - 314: -24,-33 - 315: -25,-33 - 316: -26,-33 - 317: -27,-33 - 318: -28,-33 - 319: -29,-33 - 320: -30,-33 - 321: -32,-33 - 322: -33,-33 - 354: -22,-33 - 360: -21,-40 - 361: -21,-39 - 362: -21,-38 - 363: -21,-37 - 364: -20,-40 - 365: -22,-40 - 369: -13,-36 - 370: -20,-37 - 371: -12,-32 - 373: -13,-33 - 375: -12,-33 - 377: -13,-34 + 204: -5,-37 + 205: -7,-37 + 206: -9,-37 + 207: -8,-37 + 208: -6,-37 + 214: -4,-37 + 253: -7,-40 + 268: -10,-37 + 269: -11,-37 + 306: -12,-37 + 307: -13,-37 + 309: -23,-33 + 310: -24,-33 + 311: -25,-33 + 312: -26,-33 + 313: -27,-33 + 314: -28,-33 + 315: -29,-33 + 316: -30,-33 + 317: -32,-33 + 318: -33,-33 + 350: -22,-33 + 356: -21,-40 + 357: -21,-39 + 358: -21,-38 + 359: -21,-37 + 360: -20,-40 + 361: -22,-40 + 365: -13,-36 + 366: -20,-37 + 367: -12,-32 + 369: -13,-33 + 371: -12,-33 + 373: -13,-34 + 374: -19,-32 + 375: -19,-31 + 376: -19,-30 + 377: -19,-29 + 390: -22,-29 + 391: -23,-29 + 392: -21,-29 + 393: -20,-29 + 394: -18,-29 + 395: -17,-29 + 396: -16,-29 + 397: -15,-29 + 401: -22,-28 + 402: -19,-28 + 403: -16,-28 + 527: -31,-32 + 528: -31,-31 + 531: -31,-33 + 532: -22,-36 + 536: -24,-29 + 545: -14,-29 + 561: -25,-42 + 577: -12,-31 + 744: -2,-37 + 3081: -36,-33 + 3085: -37,-33 + 3089: -35,-33 + 3091: -34,-33 + - node: + color: '#9FED5896' + id: QuarterTileOverlayGreyscale + decals: + 494: -30,-20 + - node: + color: '#D381C996' + id: QuarterTileOverlayGreyscale + decals: + 839: -11,-50 + - node: + color: '#D4D4D428' + id: QuarterTileOverlayGreyscale + decals: + 1025: -48,-2 + 1027: -48,3 + 1062: -33,-2 + 1127: -1,18 + 1128: -1,19 + 1129: -1,20 + 1130: -1,21 + 1131: -1,22 + 1132: -1,23 + 1133: -1,24 + 1134: -1,25 + 1135: -1,29 + 1136: -1,30 + 1137: -2,31 + 1138: -2,32 + 1139: -2,33 + 1140: -2,34 + 1141: -2,35 + 1142: -2,36 + 1143: -2,37 + 1144: -2,38 + 1159: -13,53 + 1161: -12,53 + 1162: -11,53 + 1163: -10,53 + 1164: -9,53 + 1169: -8,50 + 1170: -7,50 + 1171: -6,50 + 1172: -5,50 + 1173: -5,50 + 1174: -4,50 + 1175: -3,50 + 1176: -3,51 + 1177: -3,52 + 1178: -3,53 + 1179: -2,53 + 1180: -1,53 + 1181: 0,53 + 1183: 1,53 + 1225: -2,26 + 1226: -2,27 + 1227: -2,27 + 1228: -2,28 + 1264: 53,1 + 1265: 53,2 + 1266: 54,3 + 1267: 55,4 + 1268: 56,5 + 1309: 45,-3 + 1310: 45,-2 + 1322: 59,-3 + 1336: 57,5 + 1337: 58,5 + 1338: 59,5 + 1339: 60,5 + 1340: 61,5 + 1346: 62,0 + 1983: 3,-83 + 1984: 3,-82 + 1985: 3,-81 + 1986: 3,-80 + 1987: 3,-79 + 1988: 3,-78 + 1989: 3,-77 + 1990: 3,-76 + 1991: 3,-75 + 1992: 3,-74 + 1993: 3,-73 + 1994: 3,-72 + 1995: 3,-71 + 1996: 3,-70 + 1997: 3,-69 + 1998: 3,-68 + 1999: 3,-67 + 2000: 3,-66 + 2001: 3,-65 + 2002: 3,-64 + 2037: -11,-82 + 2038: -11,-81 + 2039: -10,-81 + 2040: -10,-80 + 2041: -10,-79 + 2042: -10,-78 + 2043: -11,-77 + 2044: -11,-76 + 2045: -11,-75 + 2046: -11,-75 + 2047: -10,-75 + 2048: -10,-74 + 2049: -10,-73 + 2050: -10,-72 + 2051: -10,-71 + 2052: -11,-70 + 2053: -11,-69 + 2054: -11,-68 + 2055: -10,-68 + 2056: -10,-67 + 2057: -10,-66 + 2058: -10,-65 + 2059: -10,-64 + 2060: -10,-63 + 2061: -10,-62 + 2062: -10,-61 + 2063: -10,-60 + 2064: -10,-59 + 2065: -10,-58 + 2066: -10,-57 + 2067: -9,-57 + 2068: -1,-57 + 2069: -1,-56 + 2070: -1,-55 + 2071: -1,-54 + 2072: -1,-53 + 2073: -1,-52 + 2074: -1,-51 + 2075: -1,-50 + 2076: -1,-49 + 2077: -1,-46 + 2078: -1,-45 + 2079: -1,-44 + 2080: -1,-43 + 2081: -1,-42 + 2082: -1,-41 + 2402: -1,-47 + 2403: -1,-48 + - node: + color: '#D4D4D433' + id: QuarterTileOverlayGreyscale + decals: + 3191: 0,48 + 3192: 0,47 + 3193: 0,46 + 3194: 0,45 + 3195: 0,44 + 3196: 0,43 + 3197: 0,42 + 3198: 0,41 + 3199: 0,40 + 3200: 0,38 + 3201: 0,39 + 3202: -1,38 + - node: + color: '#DE3A3A96' + id: QuarterTileOverlayGreyscale + decals: + 2786: 57,-13 + - node: + color: '#1D1D21FF' + id: QuarterTileOverlayGreyscale180 + decals: + 2486: 43,39 + 2489: 43,36 + - node: + color: '#334E6DC8' + id: QuarterTileOverlayGreyscale180 + decals: + 637: 27,5 + 1353: 33,-9 + - node: + color: '#52B4E996' + id: QuarterTileOverlayGreyscale180 + decals: + 203: -5,-36 + 209: -6,-36 + 210: -7,-36 + 211: -8,-36 + 212: -9,-36 + 213: -10,-36 + 215: -4,-36 + 255: -8,-38 + 267: -11,-36 + 308: -12,-36 + 319: -23,-32 + 320: -24,-32 + 321: -25,-32 + 322: -26,-32 + 323: -27,-32 + 324: -28,-32 + 325: -29,-32 + 326: -32,-32 + 327: -33,-32 + 328: -31,-32 + 329: -30,-32 + 330: -13,-36 + 351: -22,-32 + 352: -21,-37 + 353: -21,-38 + 354: -21,-39 + 355: -21,-40 + 362: -20,-40 + 363: -22,-40 + 364: -22,-33 + 368: -12,-32 + 370: -13,-32 + 372: -13,-33 378: -19,-32 379: -19,-31 380: -19,-30 381: -19,-29 - 394: -22,-29 - 395: -23,-29 - 396: -21,-29 - 397: -20,-29 - 398: -18,-29 - 399: -17,-29 - 400: -16,-29 - 401: -15,-29 - 405: -22,-28 - 406: -19,-28 - 407: -16,-28 - 531: -31,-32 - 532: -31,-31 - 535: -31,-33 - 536: -22,-36 - 540: -24,-29 - 549: -14,-29 - 565: -25,-42 - 581: -12,-31 - 748: -2,-37 - 3086: -36,-33 - 3090: -37,-33 - 3094: -35,-33 - 3096: -34,-33 - - node: - color: '#9FED5896' - id: QuarterTileOverlayGreyscale - decals: - 498: -30,-20 - - node: - color: '#D381C996' - id: QuarterTileOverlayGreyscale - decals: - 843: -11,-50 - - node: - color: '#D4D4D428' - id: QuarterTileOverlayGreyscale - decals: - 1029: -48,-2 - 1031: -48,3 - 1066: -33,-2 - 1131: -1,18 - 1132: -1,19 - 1133: -1,20 - 1134: -1,21 - 1135: -1,22 - 1136: -1,23 - 1137: -1,24 - 1138: -1,25 - 1139: -1,29 - 1140: -1,30 - 1141: -2,31 - 1142: -2,32 - 1143: -2,33 - 1144: -2,34 - 1145: -2,35 - 1146: -2,36 - 1147: -2,37 - 1148: -2,38 - 1163: -13,53 - 1165: -12,53 - 1166: -11,53 - 1167: -10,53 - 1168: -9,53 - 1173: -8,50 - 1174: -7,50 - 1175: -6,50 - 1176: -5,50 - 1177: -5,50 - 1178: -4,50 - 1179: -3,50 - 1180: -3,51 - 1181: -3,52 - 1182: -3,53 - 1183: -2,53 - 1184: -1,53 - 1185: 0,53 - 1187: 1,53 - 1229: -2,26 - 1230: -2,27 - 1231: -2,27 - 1232: -2,28 - 1268: 53,1 - 1269: 53,2 - 1270: 54,3 - 1271: 55,4 - 1272: 56,5 - 1313: 45,-3 - 1314: 45,-2 - 1326: 59,-3 - 1340: 57,5 - 1341: 58,5 - 1342: 59,5 - 1343: 60,5 - 1344: 61,5 - 1350: 62,0 - 1987: 3,-83 - 1988: 3,-82 - 1989: 3,-81 - 1990: 3,-80 - 1991: 3,-79 - 1992: 3,-78 - 1993: 3,-77 - 1994: 3,-76 - 1995: 3,-75 - 1996: 3,-74 - 1997: 3,-73 - 1998: 3,-72 - 1999: 3,-71 - 2000: 3,-70 - 2001: 3,-69 - 2002: 3,-68 - 2003: 3,-67 - 2004: 3,-66 - 2005: 3,-65 - 2006: 3,-64 - 2041: -11,-82 - 2042: -11,-81 - 2043: -10,-81 - 2044: -10,-80 - 2045: -10,-79 - 2046: -10,-78 - 2047: -11,-77 - 2048: -11,-76 - 2049: -11,-75 - 2050: -11,-75 - 2051: -10,-75 - 2052: -10,-74 - 2053: -10,-73 - 2054: -10,-72 - 2055: -10,-71 - 2056: -11,-70 - 2057: -11,-69 - 2058: -11,-68 - 2059: -10,-68 - 2060: -10,-67 - 2061: -10,-66 - 2062: -10,-65 - 2063: -10,-64 - 2064: -10,-63 - 2065: -10,-62 - 2066: -10,-61 - 2067: -10,-60 - 2068: -10,-59 - 2069: -10,-58 - 2070: -10,-57 - 2071: -9,-57 - 2072: -1,-57 - 2073: -1,-56 - 2074: -1,-55 - 2075: -1,-54 - 2076: -1,-53 - 2077: -1,-52 - 2078: -1,-51 - 2079: -1,-50 - 2080: -1,-49 - 2081: -1,-46 - 2082: -1,-45 - 2083: -1,-44 - 2084: -1,-43 - 2085: -1,-42 - 2086: -1,-41 - 2406: -1,-47 - 2407: -1,-48 - - node: - color: '#D4D4D433' - id: QuarterTileOverlayGreyscale - decals: - 3196: 0,48 - 3197: 0,47 - 3198: 0,46 - 3199: 0,45 - 3200: 0,44 - 3201: 0,43 - 3202: 0,42 - 3203: 0,41 - 3204: 0,40 - 3205: 0,38 - 3206: 0,39 - 3207: -1,38 - - node: - color: '#DE3A3A96' - id: QuarterTileOverlayGreyscale - decals: - 2791: 57,-13 - - node: - color: '#1D1D21FF' - id: QuarterTileOverlayGreyscale180 - decals: - 2490: 43,39 - 2493: 43,36 - - node: - color: '#334E6DC8' - id: QuarterTileOverlayGreyscale180 - decals: - 641: 27,5 - 1357: 33,-9 - - node: - color: '#52B4E996' - id: QuarterTileOverlayGreyscale180 - decals: - 207: -5,-36 - 213: -6,-36 - 214: -7,-36 - 215: -8,-36 - 216: -9,-36 - 217: -10,-36 - 219: -4,-36 - 259: -8,-38 - 271: -11,-36 - 312: -12,-36 - 323: -23,-32 - 324: -24,-32 - 325: -25,-32 - 326: -26,-32 - 327: -27,-32 - 328: -28,-32 - 329: -29,-32 - 330: -32,-32 - 331: -33,-32 - 332: -31,-32 - 333: -30,-32 - 334: -13,-36 - 355: -22,-32 - 356: -21,-37 - 357: -21,-38 - 358: -21,-39 - 359: -21,-40 - 366: -20,-40 - 367: -22,-40 - 368: -22,-33 - 372: -12,-32 - 374: -13,-32 - 376: -13,-33 - 382: -19,-32 - 383: -19,-31 - 384: -19,-30 - 385: -19,-29 - 386: -20,-28 - 387: -21,-28 - 388: -22,-28 - 389: -23,-28 - 390: -18,-28 - 391: -17,-28 - 392: -16,-28 - 393: -15,-28 - 402: -19,-28 - 533: -31,-31 - 534: -31,-33 - 537: -22,-36 - 538: -22,-35 - 539: -24,-28 - 550: -14,-28 - 562: -27,-40 - 580: -12,-31 - 592: -12,-33 - 3087: -36,-32 - 3088: -37,-32 - 3089: -38,-32 - 3095: -35,-32 - 3097: -34,-32 + 382: -20,-28 + 383: -21,-28 + 384: -22,-28 + 385: -23,-28 + 386: -18,-28 + 387: -17,-28 + 388: -16,-28 + 389: -15,-28 + 398: -19,-28 + 529: -31,-31 + 530: -31,-33 + 533: -22,-36 + 534: -22,-35 + 535: -24,-28 + 546: -14,-28 + 558: -27,-40 + 576: -12,-31 + 588: -12,-33 + 3082: -36,-32 + 3083: -37,-32 + 3084: -38,-32 + 3090: -35,-32 + 3092: -34,-32 - node: color: '#639137FF' id: QuarterTileOverlayGreyscale180 decals: - 650: 4,22 + 646: 4,22 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale180 decals: - 837: -14,-48 + 833: -14,-48 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale180 decals: - 1052: -18,-1 - 1053: -19,-1 - 1054: -20,-1 - 1055: -21,-1 - 1056: -22,-1 - 1057: -23,-1 - 1058: -27,-1 - 1059: -28,-1 - 1060: -29,-1 - 1061: -29,-2 - 1062: -31,-2 - 1064: -33,-2 - 1067: -34,-1 - 1068: -35,-1 - 1069: -36,-1 - 1070: -37,-1 - 1071: -38,-1 - 1072: -39,-1 - 1073: -40,-1 - 1074: -41,-1 - 1075: -41,-2 - 1076: -41,-3 - 1077: -41,-4 - 1078: -41,-5 - 1079: -41,-6 - 1080: -41,-7 - 1081: -41,-8 - 1082: -41,-9 - 1083: -41,-10 - 1084: -41,-13 - 1085: -41,-14 - 1086: -41,-15 - 1087: -41,-16 - 1088: -41,-17 - 1089: -41,-18 - 1090: -41,-19 - 1091: -41,-20 - 1092: -41,-21 - 1093: -41,-22 - 1094: -41,-23 - 1095: -41,-24 - 1096: -41,-25 - 1097: -41,-26 - 1098: -41,-27 - 1099: -41,-28 - 1100: -41,-29 - 1101: -41,-30 - 1102: -41,-31 - 1103: -43,-31 - 1170: -9,53 - 1171: -9,52 - 1172: -9,51 - 1188: 1,53 - 1213: 2,31 - 1216: -2,31 - 1279: 52,-1 - 1280: 51,-1 - 1281: 50,-1 - 1282: 49,-1 - 1283: 48,-1 - 1284: 47,-2 - 1285: 47,-3 - 1286: 46,-3 - 1287: 44,-1 - 1288: 42,-1 - 1289: 39,-1 - 1290: 38,-1 - 1291: 37,-1 - 1292: 36,-1 - 1293: 35,-1 - 1294: 34,-1 - 1295: 33,-1 - 1296: 32,-1 - 1297: 31,-1 - 1298: 29,-1 - 1299: 28,-2 - 1300: 27,-2 - 1301: 26,-2 - 1302: 25,-1 - 1303: 24,-1 - 1304: 23,-1 - 1305: 22,-1 - 1306: 21,-1 - 1307: 20,-1 - 1308: 19,-1 - 1309: 18,-1 - 1312: 45,-3 - 1327: 57,2 - 1328: 57,1 - 1329: 57,0 - 1330: 57,-1 - 1345: 61,5 - 1346: 61,4 - 1347: 61,3 - 1348: 61,2 - 1349: 61,1 - 1353: 62,-1 - 1354: 30,-1 - 1935: 1,-19 - 1936: 1,-20 - 1937: 1,-18 - 1938: 1,-21 - 1939: 1,-22 - 1940: 1,-23 - 1941: 2,-26 - 1942: 2,-28 - 1943: 1,-29 - 1944: 1,-30 - 1945: 1,-31 - 1946: 1,-32 - 1985: 4,-83 - 1986: 3,-83 - 2007: 2,-63 - 2008: 1,-63 - 2009: 0,-63 - 2010: -1,-63 - 2011: -2,-63 - 2018: -3,-63 - 2098: 1,-33 - 2099: 1,-34 - 2100: 1,-35 - 2101: 1,-36 - 2102: 1,-37 - 2103: 1,-38 - 2104: 1,-39 - 2105: 1,-40 - 2125: 1,-25 + 1048: -18,-1 + 1049: -19,-1 + 1050: -20,-1 + 1051: -21,-1 + 1052: -22,-1 + 1053: -23,-1 + 1054: -27,-1 + 1055: -28,-1 + 1056: -29,-1 + 1057: -29,-2 + 1058: -31,-2 + 1060: -33,-2 + 1063: -34,-1 + 1064: -35,-1 + 1065: -36,-1 + 1066: -37,-1 + 1067: -38,-1 + 1068: -39,-1 + 1069: -40,-1 + 1070: -41,-1 + 1071: -41,-2 + 1072: -41,-3 + 1073: -41,-4 + 1074: -41,-5 + 1075: -41,-6 + 1076: -41,-7 + 1077: -41,-8 + 1078: -41,-9 + 1079: -41,-10 + 1080: -41,-13 + 1081: -41,-14 + 1082: -41,-15 + 1083: -41,-16 + 1084: -41,-17 + 1085: -41,-18 + 1086: -41,-19 + 1087: -41,-20 + 1088: -41,-21 + 1089: -41,-22 + 1090: -41,-23 + 1091: -41,-24 + 1092: -41,-25 + 1093: -41,-26 + 1094: -41,-27 + 1095: -41,-28 + 1096: -41,-29 + 1097: -41,-30 + 1098: -41,-31 + 1099: -43,-31 + 1166: -9,53 + 1167: -9,52 + 1168: -9,51 + 1184: 1,53 + 1209: 2,31 + 1212: -2,31 + 1275: 52,-1 + 1276: 51,-1 + 1277: 50,-1 + 1278: 49,-1 + 1279: 48,-1 + 1280: 47,-2 + 1281: 47,-3 + 1282: 46,-3 + 1283: 44,-1 + 1284: 42,-1 + 1285: 39,-1 + 1286: 38,-1 + 1287: 37,-1 + 1288: 36,-1 + 1289: 35,-1 + 1290: 34,-1 + 1291: 33,-1 + 1292: 32,-1 + 1293: 31,-1 + 1294: 29,-1 + 1295: 28,-2 + 1296: 27,-2 + 1297: 26,-2 + 1298: 25,-1 + 1299: 24,-1 + 1300: 23,-1 + 1301: 22,-1 + 1302: 21,-1 + 1303: 20,-1 + 1304: 19,-1 + 1305: 18,-1 + 1308: 45,-3 + 1323: 57,2 + 1324: 57,1 + 1325: 57,0 + 1326: 57,-1 + 1341: 61,5 + 1342: 61,4 + 1343: 61,3 + 1344: 61,2 + 1345: 61,1 + 1349: 62,-1 + 1350: 30,-1 + 1931: 1,-19 + 1932: 1,-20 + 1933: 1,-18 + 1934: 1,-21 + 1935: 1,-22 + 1936: 1,-23 + 1937: 2,-26 + 1938: 2,-28 + 1939: 1,-29 + 1940: 1,-30 + 1941: 1,-31 + 1942: 1,-32 + 1981: 4,-83 + 1982: 3,-83 + 2003: 2,-63 + 2004: 1,-63 + 2005: 0,-63 + 2006: -1,-63 + 2007: -2,-63 + 2014: -3,-63 + 2094: 1,-33 + 2095: 1,-34 + 2096: 1,-35 + 2097: 1,-36 + 2098: 1,-37 + 2099: 1,-38 + 2100: 1,-39 + 2101: 1,-40 + 2121: 1,-25 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale270 decals: - 1356: 30,-9 - 1360: 30,-7 - 1361: 30,-4 - 1364: 30,-6 + 1352: 30,-9 + 1356: 30,-7 + 1357: 30,-4 + 1360: 30,-6 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale270 decals: - 260: -7,-38 - 564: -25,-40 - 749: -2,-36 - 3092: -37,-32 + 256: -7,-38 + 560: -25,-40 + 745: -2,-36 + 3087: -37,-32 - node: color: '#639137FF' id: QuarterTileOverlayGreyscale270 decals: - 649: 9,22 + 645: 9,22 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale270 decals: - 838: -11,-48 + 834: -11,-48 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale270 decals: - 1030: -48,3 - 1063: -31,-2 - 1065: -33,-2 - 1105: -43,-29 - 1106: -43,-28 - 1107: -43,-27 - 1108: -43,-26 - 1109: -43,-25 - 1110: -43,-24 - 1111: -43,-23 - 1112: -43,-22 - 1113: -43,-21 - 1114: -43,-20 - 1115: -43,-19 - 1116: -43,-18 - 1117: -43,-14 - 1118: -43,-13 - 1119: -43,-12 - 1120: -43,-8 - 1121: -43,-7 - 1122: -43,-6 - 1123: -44,-5 - 1124: -45,-5 - 1125: -46,-5 - 1126: -47,-5 - 1127: -48,-5 - 1128: -43,-5 - 1129: -29,-2 - 1149: -4,49 - 1150: -5,49 - 1151: -6,49 - 1152: -7,49 - 1153: -8,49 - 1154: -9,49 - 1155: -10,49 - 1156: -11,49 - 1157: -12,49 - 1158: -13,49 - 1159: -13,50 - 1160: -13,51 - 1161: -13,52 - 1162: -13,53 - 1214: 2,31 - 1215: -2,31 - 1273: 53,-3 - 1274: 54,-4 - 1275: 55,-5 - 1276: 56,-6 - 1277: 53,-1 - 1278: 53,-2 - 1310: 41,-1 - 1311: 45,-3 - 1325: 59,2 - 1331: 59,-1 - 1332: 59,0 - 1333: 59,1 - 1334: 61,-6 - 1351: 62,-1 - 2012: -8,-63 - 2013: -7,-63 - 2014: -6,-63 - 2015: -5,-63 - 2016: -4,-63 - 2017: -3,-63 - 2039: -9,-83 - 2040: -10,-83 - 2087: -1,-32 - 2088: -1,-31 - 2089: -1,-29 - 2090: -1,-30 - 2091: -1,-26 - 2092: -2,-23 - 2093: -2,-22 - 2094: -1,-21 - 2095: -1,-20 - 2096: -1,-19 - 2097: -1,-18 - 2118: 4,-51 - 2119: 3,-51 - 2120: 2,-51 - 2121: -1,-24 - 2122: -1,-25 - 2123: -1,-27 - 2124: -1,-28 + 1026: -48,3 + 1059: -31,-2 + 1061: -33,-2 + 1101: -43,-29 + 1102: -43,-28 + 1103: -43,-27 + 1104: -43,-26 + 1105: -43,-25 + 1106: -43,-24 + 1107: -43,-23 + 1108: -43,-22 + 1109: -43,-21 + 1110: -43,-20 + 1111: -43,-19 + 1112: -43,-18 + 1113: -43,-14 + 1114: -43,-13 + 1115: -43,-12 + 1116: -43,-8 + 1117: -43,-7 + 1118: -43,-6 + 1119: -44,-5 + 1120: -45,-5 + 1121: -46,-5 + 1122: -47,-5 + 1123: -48,-5 + 1124: -43,-5 + 1125: -29,-2 + 1145: -4,49 + 1146: -5,49 + 1147: -6,49 + 1148: -7,49 + 1149: -8,49 + 1150: -9,49 + 1151: -10,49 + 1152: -11,49 + 1153: -12,49 + 1154: -13,49 + 1155: -13,50 + 1156: -13,51 + 1157: -13,52 + 1158: -13,53 + 1210: 2,31 + 1211: -2,31 + 1269: 53,-3 + 1270: 54,-4 + 1271: 55,-5 + 1272: 56,-6 + 1273: 53,-1 + 1274: 53,-2 + 1306: 41,-1 + 1307: 45,-3 + 1321: 59,2 + 1327: 59,-1 + 1328: 59,0 + 1329: 59,1 + 1330: 61,-6 + 1347: 62,-1 + 2008: -8,-63 + 2009: -7,-63 + 2010: -6,-63 + 2011: -5,-63 + 2012: -4,-63 + 2013: -3,-63 + 2035: -9,-83 + 2036: -10,-83 + 2083: -1,-32 + 2084: -1,-31 + 2085: -1,-29 + 2086: -1,-30 + 2087: -1,-26 + 2088: -2,-23 + 2089: -2,-22 + 2090: -1,-21 + 2091: -1,-20 + 2092: -1,-19 + 2093: -1,-18 + 2114: 4,-51 + 2115: 3,-51 + 2116: 2,-51 + 2117: -1,-24 + 2118: -1,-25 + 2119: -1,-27 + 2120: -1,-28 - node: color: '#D4D4D433' id: QuarterTileOverlayGreyscale270 decals: - 3192: -3,49 - 3193: -2,49 - 3194: -1,49 + 3187: -3,49 + 3188: -2,49 + 3189: -1,49 - node: color: '#DE3A3A96' id: QuarterTileOverlayGreyscale270 decals: - 2790: 57,-9 + 2785: 57,-9 - node: color: '#1D1D21FF' id: QuarterTileOverlayGreyscale90 decals: - 2491: 42,40 + 2487: 42,40 - node: color: '#334E6DC8' id: QuarterTileOverlayGreyscale90 decals: - 640: 27,8 - 1358: 33,-3 + 636: 27,8 + 1354: 33,-3 - node: color: '#52B4E996' id: QuarterTileOverlayGreyscale90 decals: - 258: -8,-40 - 563: -27,-42 - 3091: -38,-33 + 254: -8,-40 + 559: -27,-42 + 3086: -38,-33 - node: color: '#9FED5896' id: QuarterTileOverlayGreyscale90 decals: - 499: -32,-20 + 495: -32,-20 - node: color: '#D381C996' id: QuarterTileOverlayGreyscale90 decals: - 844: -14,-50 + 840: -14,-50 - node: color: '#D4D4D428' id: QuarterTileOverlayGreyscale90 decals: - 1032: -48,3 - 1033: -47,3 - 1034: -46,3 - 1035: -46,2 - 1036: -46,1 - 1037: -45,1 - 1038: -34,1 - 1039: -33,1 - 1040: -32,1 - 1041: -31,1 - 1042: -30,1 - 1043: -29,1 - 1044: -28,1 - 1045: -27,1 - 1046: -23,1 - 1047: -22,1 - 1048: -21,1 - 1049: -20,1 - 1050: -19,1 - 1051: -18,1 - 1104: -44,-30 - 1130: -29,-2 - 1164: -13,53 - 1169: -9,53 - 1186: 1,53 - 1189: 1,52 - 1190: 1,51 - 1191: 1,50 - 1192: 1,48 - 1193: 1,47 - 1194: 1,46 - 1195: 1,45 - 1196: 1,44 - 1197: 1,43 - 1198: 1,42 - 1199: 1,41 - 1200: 1,40 - 1201: 1,39 - 1202: 1,38 - 1203: 2,38 - 1204: 2,37 - 1205: 2,37 - 1206: 2,36 - 1207: 2,35 - 1208: 2,34 - 1209: 2,33 - 1210: 2,32 - 1211: 2,31 - 1212: 1,30 - 1217: 1,29 - 1218: 1,25 - 1219: 1,24 - 1220: 1,23 - 1221: 1,22 - 1222: 1,21 - 1223: 1,20 - 1224: 1,20 - 1225: 1,19 - 1226: 1,18 - 1227: 2,26 - 1228: 2,27 - 1233: 18,1 - 1234: 19,1 - 1235: 20,1 - 1236: 21,1 - 1237: 22,1 - 1238: 23,1 - 1239: 24,1 - 1240: 25,1 - 1241: 26,1 - 1242: 27,1 - 1243: 28,1 - 1244: 29,1 - 1245: 30,1 - 1246: 31,1 - 1247: 32,1 - 1248: 33,1 - 1249: 34,2 - 1250: 35,2 - 1251: 36,2 - 1252: 37,1 - 1253: 38,1 - 1254: 39,1 - 1255: 40,1 - 1256: 41,1 - 1257: 42,1 - 1258: 43,1 - 1259: 44,1 - 1260: 45,1 - 1261: 46,1 - 1262: 47,1 - 1263: 48,1 - 1264: 49,1 - 1265: 50,1 - 1266: 51,1 - 1267: 52,1 - 1324: 57,-3 - 1335: 61,-6 - 1336: 61,-5 - 1337: 61,-4 - 1338: 61,-3 - 1339: 61,-2 - 1352: 62,0 - 1947: 1,-52 - 1948: 1,-53 - 1949: 1,-54 - 1950: 1,-55 - 1951: 1,-56 - 1952: 1,-57 - 1953: 1,-58 - 1954: 1,-59 - 1955: 1,-60 - 1956: 2,-60 - 1957: 3,-60 - 1958: 4,-60 - 1959: 4,-61 - 1960: 4,-62 - 1961: 4,-63 - 1962: 4,-64 - 1963: 4,-65 - 1964: 4,-66 - 1965: 4,-68 - 1966: 5,-68 - 1967: 5,-69 - 1968: 5,-70 - 1969: 4,-71 - 1970: 4,-67 - 1971: 4,-72 - 1972: 4,-73 - 1973: 4,-74 - 1974: 4,-75 - 1975: 5,-75 - 1976: 5,-76 - 1977: 5,-77 - 1978: 4,-78 - 1979: 4,-79 - 1980: 4,-80 - 1981: 4,-81 - 1982: 5,-81 - 1983: 5,-82 - 1984: 5,-83 - 2019: -9,-64 - 2020: -9,-65 - 2021: -9,-66 - 2022: -9,-67 - 2023: -9,-68 - 2024: -9,-69 - 2025: -9,-70 - 2026: -9,-71 - 2027: -9,-72 - 2028: -9,-73 - 2029: -9,-74 - 2030: -9,-75 - 2031: -9,-76 - 2032: -9,-77 - 2033: -9,-78 - 2034: -9,-79 - 2035: -9,-80 - 2036: -9,-81 - 2037: -9,-82 - 2038: -9,-83 - 2106: 1,-41 - 2107: 2,-42 - 2108: 3,-42 - 2109: 3,-43 - 2110: 3,-44 - 2111: 3,-45 - 2112: 3,-46 - 2113: 3,-47 - 2114: 3,-48 - 2115: 4,-49 - 2116: 4,-50 - 2117: 4,-51 + 1028: -48,3 + 1029: -47,3 + 1030: -46,3 + 1031: -46,2 + 1032: -46,1 + 1033: -45,1 + 1034: -34,1 + 1035: -33,1 + 1036: -32,1 + 1037: -31,1 + 1038: -30,1 + 1039: -29,1 + 1040: -28,1 + 1041: -27,1 + 1042: -23,1 + 1043: -22,1 + 1044: -21,1 + 1045: -20,1 + 1046: -19,1 + 1047: -18,1 + 1100: -44,-30 + 1126: -29,-2 + 1160: -13,53 + 1165: -9,53 + 1182: 1,53 + 1185: 1,52 + 1186: 1,51 + 1187: 1,50 + 1188: 1,48 + 1189: 1,47 + 1190: 1,46 + 1191: 1,45 + 1192: 1,44 + 1193: 1,43 + 1194: 1,42 + 1195: 1,41 + 1196: 1,40 + 1197: 1,39 + 1198: 1,38 + 1199: 2,38 + 1200: 2,37 + 1201: 2,37 + 1202: 2,36 + 1203: 2,35 + 1204: 2,34 + 1205: 2,33 + 1206: 2,32 + 1207: 2,31 + 1208: 1,30 + 1213: 1,29 + 1214: 1,25 + 1215: 1,24 + 1216: 1,23 + 1217: 1,22 + 1218: 1,21 + 1219: 1,20 + 1220: 1,20 + 1221: 1,19 + 1222: 1,18 + 1223: 2,26 + 1224: 2,27 + 1229: 18,1 + 1230: 19,1 + 1231: 20,1 + 1232: 21,1 + 1233: 22,1 + 1234: 23,1 + 1235: 24,1 + 1236: 25,1 + 1237: 26,1 + 1238: 27,1 + 1239: 28,1 + 1240: 29,1 + 1241: 30,1 + 1242: 31,1 + 1243: 32,1 + 1244: 33,1 + 1245: 34,2 + 1246: 35,2 + 1247: 36,2 + 1248: 37,1 + 1249: 38,1 + 1250: 39,1 + 1251: 40,1 + 1252: 41,1 + 1253: 42,1 + 1254: 43,1 + 1255: 44,1 + 1256: 45,1 + 1257: 46,1 + 1258: 47,1 + 1259: 48,1 + 1260: 49,1 + 1261: 50,1 + 1262: 51,1 + 1263: 52,1 + 1320: 57,-3 + 1331: 61,-6 + 1332: 61,-5 + 1333: 61,-4 + 1334: 61,-3 + 1335: 61,-2 + 1348: 62,0 + 1943: 1,-52 + 1944: 1,-53 + 1945: 1,-54 + 1946: 1,-55 + 1947: 1,-56 + 1948: 1,-57 + 1949: 1,-58 + 1950: 1,-59 + 1951: 1,-60 + 1952: 2,-60 + 1953: 3,-60 + 1954: 4,-60 + 1955: 4,-61 + 1956: 4,-62 + 1957: 4,-63 + 1958: 4,-64 + 1959: 4,-65 + 1960: 4,-66 + 1961: 4,-68 + 1962: 5,-68 + 1963: 5,-69 + 1964: 5,-70 + 1965: 4,-71 + 1966: 4,-67 + 1967: 4,-72 + 1968: 4,-73 + 1969: 4,-74 + 1970: 4,-75 + 1971: 5,-75 + 1972: 5,-76 + 1973: 5,-77 + 1974: 4,-78 + 1975: 4,-79 + 1976: 4,-80 + 1977: 4,-81 + 1978: 5,-81 + 1979: 5,-82 + 1980: 5,-83 + 2015: -9,-64 + 2016: -9,-65 + 2017: -9,-66 + 2018: -9,-67 + 2019: -9,-68 + 2020: -9,-69 + 2021: -9,-70 + 2022: -9,-71 + 2023: -9,-72 + 2024: -9,-73 + 2025: -9,-74 + 2026: -9,-75 + 2027: -9,-76 + 2028: -9,-77 + 2029: -9,-78 + 2030: -9,-79 + 2031: -9,-80 + 2032: -9,-81 + 2033: -9,-82 + 2034: -9,-83 + 2102: 1,-41 + 2103: 2,-42 + 2104: 3,-42 + 2105: 3,-43 + 2106: 3,-44 + 2107: 3,-45 + 2108: 3,-46 + 2109: 3,-47 + 2110: 3,-48 + 2111: 4,-49 + 2112: 4,-50 + 2113: 4,-51 - node: color: '#D4D4D433' id: QuarterTileOverlayGreyscale90 decals: - 3195: 1,49 - 3266: -35,1 + 3190: 1,49 + 3261: -35,1 - node: color: '#FFFFFFFF' id: Rock06 decals: - 2741: -6.549043,-18.995234 + 2736: -6.549043,-18.995234 - node: color: '#FFFFFFFF' id: Rock07 decals: - 2742: -10.21571,-19.245234 - 2743: -19.922543,-12.716649 - 2744: -18.60001,-10.259648 - 2745: -18.846893,-8.106161 + 2737: -10.21571,-19.245234 + 2738: -19.922543,-12.716649 + 2739: -18.60001,-10.259648 + 2740: -18.846893,-8.106161 - node: color: '#FFFFFFFF' id: SpaceStationSign1 decals: - 967: 31,0 + 963: 31,0 - node: color: '#FFFFFFFF' id: SpaceStationSign2 decals: - 966: 32,0 + 962: 32,0 - node: color: '#FFFFFFFF' id: SpaceStationSign3 decals: - 965: 33,0 + 961: 33,0 - node: color: '#FFFFFFFF' id: SpaceStationSign4 decals: - 964: 34,0 + 960: 34,0 - node: color: '#FFFFFFFF' id: SpaceStationSign5 decals: - 963: 35,0 + 959: 35,0 - node: color: '#FFFFFFFF' id: SpaceStationSign6 decals: - 962: 36,0 + 958: 36,0 - node: color: '#FFFFFFFF' id: SpaceStationSign7 decals: - 961: 37,0 + 957: 37,0 - node: angle: 1.5707963267948966 rad color: '#FFFFFFFF' id: StandClearGreyscale decals: - 3426: -56,-4 + 3421: -56,-4 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale decals: - 593: 19,9 + 589: 19,9 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale decals: - 335: -21,-33 + 331: -21,-33 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale decals: - 672: 3,24 + 668: 3,24 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale decals: - 179: -33,-15 - 180: -33,-11 - 181: -30,-11 - 182: -27,-19 - 206: -27,-11 - 493: -33,-23 + 175: -33,-15 + 176: -33,-11 + 177: -30,-11 + 178: -27,-19 + 202: -27,-11 + 489: -33,-23 - node: color: '#C6FF91FF' id: ThreeQuarterTileOverlayGreyscale decals: - 3082: -39,-31 + 3077: -39,-31 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale180 decals: - 635: 27,4 - 636: 28,5 - 637: 28,5 + 631: 27,4 + 632: 28,5 + 633: 28,5 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale180 decals: - 500: -14,-36 - 551: -12,-28 + 496: -14,-36 + 547: -12,-28 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale180 decals: - 675: 10,19 + 671: 10,19 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale180 decals: - 172: -29,-21 - 191: -25,-21 - 192: -25,-13 - 193: -29,-13 - 194: -32,-13 - 495: -29,-24 - 496: -32,-16 + 168: -29,-21 + 187: -25,-21 + 188: -25,-13 + 189: -29,-13 + 190: -32,-13 + 491: -29,-24 + 492: -32,-16 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale270 decals: - 594: 19,4 + 590: 19,4 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale270 decals: - 337: -21,-36 + 333: -21,-36 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 674: 3,19 + 670: 3,19 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale270 decals: - 173: -33,-21 - 187: -33,-13 - 188: -30,-13 - 189: -27,-13 - 190: -27,-21 - 492: -33,-24 - 497: -30,-16 + 169: -33,-21 + 183: -33,-13 + 184: -30,-13 + 185: -27,-13 + 186: -27,-21 + 488: -33,-24 + 493: -30,-16 - node: color: '#C6FF91FF' id: ThreeQuarterTileOverlayGreyscale270 decals: - 3073: -39,-35 + 3068: -39,-35 - node: color: '#334E6DC8' id: ThreeQuarterTileOverlayGreyscale90 decals: - 638: 28,8 - 639: 27,9 + 634: 28,8 + 635: 27,9 - node: color: '#52B4E996' id: ThreeQuarterTileOverlayGreyscale90 decals: - 336: -14,-33 + 332: -14,-33 - node: color: '#639137FF' id: ThreeQuarterTileOverlayGreyscale90 decals: - 673: 10,24 + 669: 10,24 - node: color: '#9FED5896' id: ThreeQuarterTileOverlayGreyscale90 decals: - 183: -25,-11 - 184: -25,-19 - 185: -29,-11 - 186: -32,-11 - 494: -29,-23 - 3093: -35,-31 + 179: -25,-11 + 180: -25,-19 + 181: -29,-11 + 182: -32,-11 + 490: -29,-23 + 3088: -35,-31 + - node: + color: '#FFFFFFFF' + id: WarnCornerGreyscaleNW + decals: + 3739: -6,-26 + - node: + color: '#FFFFFFFF' + id: WarnCornerSmallGreyscaleNW + decals: + 3755: -6,-29 - node: color: '#FFFFFFFF' id: WarnCornerSmallNE decals: - 3399: -58,-13 + 3394: -58,-13 - node: color: '#FFFFFFFF' id: WarnCornerSmallNW decals: - 992: -56,-7 - 996: -56,-3 - 1012: -54,-13 + 988: -56,-7 + 992: -56,-3 + 1008: -54,-13 - node: color: '#FFFFFFFF' id: WarnCornerSmallSE decals: - 3398: -58,-8 + 3393: -58,-8 - node: color: '#FFFFFFFF' id: WarnCornerSmallSW decals: - 990: -56,-1 - 991: -56,-1 - 997: -56,-5 - 1011: -54,-8 + 986: -56,-1 + 987: -56,-1 + 993: -56,-5 + 1007: -54,-8 - node: color: '#FFFFFFFF' id: WarnFull decals: - 2537: 12,53 - 2538: 13,53 - 2539: 14,53 + 2533: 12,53 + 2534: 13,53 + 2535: 14,53 - node: color: '#BC863FFF' id: WarnFullGreyscale decals: - 3422: -51,-1 - 3423: -51,0 - 3424: -52,-1 - 3425: -52,0 + 3417: -51,-1 + 3418: -51,0 + 3419: -52,-1 + 3420: -52,0 - node: color: '#FFFFFFFF' id: WarnLineE decals: - 2519: 9,49 - 2521: 19,49 - 2522: 19,48 - 2523: 19,47 - 2524: 19,46 - 3393: -58,-12 - 3394: -58,-11 - 3395: -58,-10 - 3396: -58,-9 + 2515: 9,49 + 2517: 19,49 + 2518: 19,48 + 2519: 19,47 + 2520: 19,46 + 3388: -58,-12 + 3389: -58,-11 + 3390: -58,-10 + 3391: -58,-9 + - node: + color: '#FFFFFFFF' + id: WarnLineGreyscaleN + decals: + 3740: -5,-26 + 3741: -4,-26 + 3742: -3,-26 + 3752: -9,-29 + 3753: -8,-29 + 3754: -7,-29 + - node: + color: '#FFFFFFFF' + id: WarnLineGreyscaleS + decals: + 3745: -9,-30 + 3746: -8,-30 + 3747: -7,-30 + 3748: -6,-30 + 3749: -5,-30 + 3750: -4,-30 + 3751: -3,-30 - node: color: '#FFFFFFFF' id: WarnLineGreyscaleW decals: - 993: -56,-5 - 994: -56,-4 - 995: -56,-3 + 989: -56,-5 + 990: -56,-4 + 991: -56,-3 + 3743: -6,-27 + 3744: -6,-28 - node: color: '#FFFFFFFF' id: WarnLineN decals: - 987: -57,-1 - 1001: -57,-8 - 1002: -56,-8 - 1003: -56,-8 - 1004: -55,-8 - 3400: -58,-1 + 983: -57,-1 + 997: -57,-8 + 998: -56,-8 + 999: -56,-8 + 1000: -55,-8 + 3395: -58,-1 - node: color: '#FFFFFFFF' id: WarnLineS decals: - 988: -56,-6 - 989: -56,-2 - 1005: -54,-10 - 1006: -54,-11 - 1007: -54,-12 - 2520: 17,49 - 3397: -54,-9 + 984: -56,-6 + 985: -56,-2 + 1001: -54,-10 + 1002: -54,-11 + 1003: -54,-12 + 2516: 17,49 + 3392: -54,-9 - node: color: '#FFFFFFFF' id: WarnLineW decals: - 986: -57,-7 - 1008: -55,-13 - 1009: -56,-13 - 1010: -57,-13 - 2516: 12,46 - 2517: 13,46 - 2518: 14,46 - 2529: 7,51 - 2530: 8,51 - 2531: 9,51 - 2532: 17,51 - 2533: 18,51 - 2534: 19,51 - 2535: 15,53 - 2536: 11,53 - 3401: -58,-7 + 982: -57,-7 + 1004: -55,-13 + 1005: -56,-13 + 1006: -57,-13 + 2512: 12,46 + 2513: 13,46 + 2514: 14,46 + 2525: 7,51 + 2526: 8,51 + 2527: 9,51 + 2528: 17,51 + 2529: 18,51 + 2530: 19,51 + 2531: 15,53 + 2532: 11,53 + 3396: -58,-7 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNe decals: - 277: -30,-39 - 297: -29,-35 - 696: 37,-7 - 702: 44,-5 - 750: -4,38 - 751: -12,33 - 792: -16,32 - 808: -19,-3 - 862: -49,7 - 865: -53,12 - 866: -51,10 - 908: 36,18 - 915: 40,16 - 935: 44,-9 - 942: 17,-30 - 943: 20,-30 - 2888: 41,23 - 3123: 19,37 + 273: -30,-39 + 293: -29,-35 + 692: 37,-7 + 698: 44,-5 + 746: -4,38 + 747: -12,33 + 788: -16,32 + 804: -19,-3 + 858: -49,7 + 861: -53,12 + 862: -51,10 + 904: 36,18 + 911: 40,16 + 931: 44,-9 + 938: 17,-30 + 939: 20,-30 + 2883: 41,23 + 3118: 19,37 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerNw decals: - 280: -31,-39 - 281: -31,-39 - 298: -33,-35 - 689: 35,-7 - 690: 35,-3 - 703: 39,-5 - 752: -14,38 - 753: -14,33 - 793: -19,32 - 809: -22,-3 - 861: -50,7 - 867: -55,12 - 868: -57,10 - 909: 35,18 - 916: 38,16 - 917: 35,15 - 932: 42,-9 - 944: 13,-30 - 945: 19,-30 - 2889: 39,23 - 3124: 12,37 + 276: -31,-39 + 277: -31,-39 + 294: -33,-35 + 685: 35,-7 + 686: 35,-3 + 699: 39,-5 + 748: -14,38 + 749: -14,33 + 789: -19,32 + 805: -22,-3 + 857: -50,7 + 863: -55,12 + 864: -57,10 + 905: 35,18 + 912: 38,16 + 913: 35,15 + 928: 42,-9 + 940: 13,-30 + 941: 19,-30 + 2884: 39,23 + 3119: 12,37 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSe decals: - 279: -30,-41 - 308: -29,-37 - 700: 37,-5 - 715: 44,-7 - 754: -12,31 - 755: -4,31 - 794: -16,27 - 810: -19,-5 - 859: -49,5 - 870: -51,9 - 900: 41,18 - 911: 36,17 - 912: 40,11 - 933: 44,-10 - 946: 17,-32 - 947: 20,-32 - 3134: 19,36 + 275: -30,-41 + 304: -29,-37 + 696: 37,-5 + 711: 44,-7 + 750: -12,31 + 751: -4,31 + 790: -16,27 + 806: -19,-5 + 855: -49,5 + 866: -51,9 + 896: 41,18 + 907: 36,17 + 908: 40,11 + 929: 44,-10 + 942: 17,-32 + 943: 20,-32 + 3129: 19,36 - node: color: '#FFFFFFFF' id: WoodTrimThinCornerSw decals: - 278: -31,-41 - 306: -33,-37 - 687: 35,-5 - 688: 35,-9 - 704: 39,-7 - 756: -14,31 - 757: -14,35 - 758: -10,31 - 795: -19,27 - 811: -22,-5 - 860: -50,5 - 869: -57,9 - 899: 39,18 - 910: 35,17 - 913: 38,11 - 914: 35,12 - 934: 42,-10 - 948: 13,-32 - 949: 19,-32 + 274: -31,-41 + 302: -33,-37 + 683: 35,-5 + 684: 35,-9 + 700: 39,-7 + 752: -14,31 + 753: -14,35 + 754: -10,31 + 791: -19,27 + 807: -22,-5 + 856: -50,5 + 865: -57,9 + 895: 39,18 + 906: 35,17 + 909: 38,11 + 910: 35,12 + 930: 42,-10 + 944: 13,-32 + 945: 19,-32 - node: color: '#FFFFFFFF' id: WoodTrimThinEndE decals: - 682: 38,-3 - 683: 38,-9 + 678: 38,-3 + 679: 38,-9 - node: color: '#FFFFFFFF' id: WoodTrimThinEndN decals: - 930: 46,-5 + 926: 46,-5 - node: color: '#FFFFFFFF' id: WoodTrimThinEndS decals: - 931: 46,-6 + 927: 46,-6 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNe decals: - 698: 37,-9 - 881: -53,10 + 694: 37,-9 + 877: -53,10 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerNw decals: - 882: -55,10 - 929: 38,15 + 878: -55,10 + 925: 38,15 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSe decals: - 701: 37,-3 - 3136: 17,36 + 697: 37,-3 + 3131: 17,36 - node: color: '#FFFFFFFF' id: WoodTrimThinInnerSw decals: - 788: -10,35 - 928: 38,12 + 784: -10,35 + 924: 38,12 - node: color: '#FFFFFFFF' id: WoodTrimThinLineE decals: - 276: -32,-39 - 282: -30,-40 - 283: -32.14971,-38.99947 - 284: -32.14971,-38.99947 - 285: -32,-41 - 286: -32,-40 - 287: -32.150627,-40.002556 - 288: -32.150627,-40.99947 - 289: -32.296745,-39.00201 - 290: -32.293655,-40.00201 - 291: -32.29232,-41.003887 - 309: -29,-36 - 697: 37,-8 - 699: 37,-4 - 716: 44,-6 - 765: -4,32 - 766: -4,33 - 767: -4,34 - 768: -4,35 - 769: -4,36 - 770: -4,37 - 771: -12,32 - 796: -16,31 - 797: -16,30 - 798: -16,29 - 799: -16,28 - 812: -19,-4 - 864: -49,6 - 880: -53,11 - 901: 41,19 - 902: 41,20 - 903: 41,21 - 918: 40,14 - 919: 40,15 - 920: 40,12 - 921: 40,13 - 950: 20,-31 - 951: 17,-31 - 2890: 41,22 - 3125: 17,35 + 272: -32,-39 + 278: -30,-40 + 279: -32.14971,-38.99947 + 280: -32.14971,-38.99947 + 281: -32,-41 + 282: -32,-40 + 283: -32.150627,-40.002556 + 284: -32.150627,-40.99947 + 285: -32.296745,-39.00201 + 286: -32.293655,-40.00201 + 287: -32.29232,-41.003887 + 305: -29,-36 + 693: 37,-8 + 695: 37,-4 + 712: 44,-6 + 761: -4,32 + 762: -4,33 + 763: -4,34 + 764: -4,35 + 765: -4,36 + 766: -4,37 + 767: -12,32 + 792: -16,31 + 793: -16,30 + 794: -16,29 + 795: -16,28 + 808: -19,-4 + 860: -49,6 + 876: -53,11 + 897: 41,19 + 898: 41,20 + 899: 41,21 + 914: 40,14 + 915: 40,15 + 916: 40,12 + 917: 40,13 + 946: 20,-31 + 947: 17,-31 + 2885: 41,22 + 3120: 17,35 - node: color: '#FFFFFFFF' id: WoodTrimThinLineN decals: - 295: -36,-39 - 296: -35,-39 - 299: -32,-35 - 300: -31,-35 - 301: -30,-35 - 691: 36,-3 - 692: 37,-3 - 695: 36,-7 - 710: 40,-5 - 711: 41,-5 - 712: 41,-5 - 713: 42,-5 - 714: 43,-5 - 772: -5,38 - 773: -6,38 - 774: -7,38 - 775: -8,38 - 776: -9,38 - 777: -10,38 - 778: -11,38 - 779: -12,38 - 780: -13,38 - 781: -13,33 - 802: -17,32 - 803: -18,32 - 816: -21,-3 - 817: -20,-3 - 818: -19,-3 - 876: -54,12 - 877: -56,10 - 878: -52,10 - 924: 36,15 - 925: 37,15 - 937: 43,-9 - 957: 14,-30 - 958: 15,-30 - 959: 15,-30 - 960: 16,-30 - 2892: 40,23 - 3128: 13,37 - 3129: 14,37 - 3130: 15,37 - 3131: 16,37 - 3132: 17,37 - 3133: 18,37 + 291: -36,-39 + 292: -35,-39 + 295: -32,-35 + 296: -31,-35 + 297: -30,-35 + 687: 36,-3 + 688: 37,-3 + 691: 36,-7 + 706: 40,-5 + 707: 41,-5 + 708: 41,-5 + 709: 42,-5 + 710: 43,-5 + 768: -5,38 + 769: -6,38 + 770: -7,38 + 771: -8,38 + 772: -9,38 + 773: -10,38 + 774: -11,38 + 775: -12,38 + 776: -13,38 + 777: -13,33 + 798: -17,32 + 799: -18,32 + 812: -21,-3 + 813: -20,-3 + 814: -19,-3 + 872: -54,12 + 873: -56,10 + 874: -52,10 + 920: 36,15 + 921: 37,15 + 933: 43,-9 + 953: 14,-30 + 954: 15,-30 + 955: 15,-30 + 956: 16,-30 + 2887: 40,23 + 3123: 13,37 + 3124: 14,37 + 3125: 15,37 + 3126: 16,37 + 3127: 17,37 + 3128: 18,37 - node: color: '#FFFFFFFF' id: WoodTrimThinLineS decals: - 292: -36,-38 - 293: -36,-38 - 294: -35,-38 - 302: -32,-37 - 303: -31,-37 - 304: -31,-37 - 305: -30,-37 - 684: 37,-9 - 685: 36,-9 - 686: 36,-5 - 706: 40,-7 - 707: 41,-7 - 708: 42,-7 - 709: 43,-7 - 759: -13,31 - 760: -9,31 - 761: -8,31 - 762: -7,31 - 763: -6,31 - 764: -5,31 - 789: -11,35 - 790: -12,35 - 791: -13,35 - 800: -17,27 - 801: -18,27 - 814: -21,-5 - 815: -20,-5 - 871: -56,9 - 872: -55,9 - 873: -54,9 - 874: -53,9 - 875: -52,9 - 904: 40,18 - 926: 36,12 - 927: 37,12 - 936: 43,-10 - 954: 14,-32 - 955: 15,-32 - 956: 16,-32 - 3135: 18,36 + 288: -36,-38 + 289: -36,-38 + 290: -35,-38 + 298: -32,-37 + 299: -31,-37 + 300: -31,-37 + 301: -30,-37 + 680: 37,-9 + 681: 36,-9 + 682: 36,-5 + 702: 40,-7 + 703: 41,-7 + 704: 42,-7 + 705: 43,-7 + 755: -13,31 + 756: -9,31 + 757: -8,31 + 758: -7,31 + 759: -6,31 + 760: -5,31 + 785: -11,35 + 786: -12,35 + 787: -13,35 + 796: -17,27 + 797: -18,27 + 810: -21,-5 + 811: -20,-5 + 867: -56,9 + 868: -55,9 + 869: -54,9 + 870: -53,9 + 871: -52,9 + 900: 40,18 + 922: 36,12 + 923: 37,12 + 932: 43,-10 + 950: 14,-32 + 951: 15,-32 + 952: 16,-32 + 3130: 18,36 - node: color: '#FFFFFFFF' id: WoodTrimThinLineW decals: - 275: -31,-40 - 307: -33,-36 - 693: 35,-4 - 694: 35,-8 - 705: 39,-6 - 782: -14,37 - 783: -14,36 - 784: -14,32 - 785: -10,32 - 786: -10,33 - 787: -10,34 - 804: -19,31 - 805: -19,30 - 806: -19,29 - 807: -19,28 - 813: -22,-4 - 863: -50,6 - 879: -55,11 - 905: 39,19 - 906: 39,20 - 907: 39,21 - 922: 35,13 - 923: 35,14 - 952: 19,-31 - 953: 13,-31 - 2891: 39,22 - 3126: 12,35 - 3127: 12,36 + 271: -31,-40 + 303: -33,-36 + 689: 35,-4 + 690: 35,-8 + 701: 39,-6 + 778: -14,37 + 779: -14,36 + 780: -14,32 + 781: -10,32 + 782: -10,33 + 783: -10,34 + 800: -19,31 + 801: -19,30 + 802: -19,29 + 803: -19,28 + 809: -22,-4 + 859: -50,6 + 875: -55,11 + 901: 39,19 + 902: 39,20 + 903: 39,21 + 918: 35,13 + 919: 35,14 + 948: 19,-31 + 949: 13,-31 + 2886: 39,22 + 3121: 12,35 + 3122: 12,36 - type: GridAtmosphere version: 2 data: @@ -7113,7 +7206,8 @@ entities: 4,15: 0: 44971 5,12: - 0: 65535 + 0: 65503 + 5: 32 5,13: 0: 15359 5,14: @@ -7202,10 +7296,10 @@ entities: 0: 34956 -11,2: 0: 8191 - 5: 57344 + 6: 57344 -11,3: 0: 65311 - 6: 224 + 7: 224 -12,4: 0: 53192 -12,7: @@ -7216,7 +7310,7 @@ entities: 0: 34952 -11,4: 0: 7967 - 7: 224 + 8: 224 4: 57344 -11,5: 0: 7967 @@ -7935,6 +8029,21 @@ entities: - 0 - 0 - 0 + - volume: 2500 + temperature: 293.14975 + moles: + - 20.078888 + - 75.53487 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 - volume: 2500 temperature: 293.15 moles: @@ -9897,7 +10006,6 @@ entities: - 183 - 182 - 16486 - - 16487 - 18267 - uid: 18273 components: @@ -10178,7 +10286,6 @@ entities: - 16514 - 18295 - 16520 - - 16519 - uid: 18336 components: - type: Transform @@ -10357,7 +10464,6 @@ entities: - 16550 - 18349 - 16556 - - 16555 - uid: 18501 components: - type: Transform @@ -12958,18 +13064,17 @@ entities: parent: 2 - proto: AirlockHydroGlassLocked entities: + - uid: 16 + components: + - type: Transform + pos: 11.5,21.5 + parent: 2 - uid: 3300 components: - type: Transform rot: 1.5707963267948966 rad pos: 2.5,23.5 parent: 2 - - uid: 3328 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 11.5,21.5 - parent: 2 - uid: 3329 components: - type: Transform @@ -13080,7 +13185,7 @@ entities: pos: 46.5,-40.5 parent: 2 - type: Door - secondsUntilStateChange: -152903.86 + secondsUntilStateChange: -164910.06 state: Opening - uid: 4137 components: @@ -13517,7 +13622,7 @@ entities: pos: -3.5,-35.5 parent: 2 - type: Door - secondsUntilStateChange: -269071.25 + secondsUntilStateChange: -281077.44 state: Opening - uid: 1496 components: @@ -64736,26 +64841,6 @@ entities: - type: Transform pos: -52.5,-9.5 parent: 2 - - uid: 11702 - components: - - type: Transform - pos: -51.5,-9.5 - parent: 2 - - uid: 11703 - components: - - type: Transform - pos: -50.5,-9.5 - parent: 2 - - uid: 11704 - components: - - type: Transform - pos: -49.5,-9.5 - parent: 2 - - uid: 11705 - components: - - type: Transform - pos: -48.5,-9.5 - parent: 2 - uid: 11706 components: - type: Transform @@ -65231,6 +65316,11 @@ entities: - type: Transform pos: 28.5,-7.5 parent: 2 + - uid: 15081 + components: + - type: Transform + pos: -46.5,-9.5 + parent: 2 - uid: 15495 components: - type: Transform @@ -65316,6 +65406,11 @@ entities: - type: Transform pos: 54.5,4.5 parent: 2 + - uid: 16519 + components: + - type: Transform + pos: -45.5,-9.5 + parent: 2 - uid: 17914 components: - type: Transform @@ -66106,6 +66201,11 @@ entities: - type: Transform pos: 24.5,-26.5 parent: 2 + - uid: 20807 + components: + - type: Transform + pos: -44.5,-9.5 + parent: 2 - uid: 22780 components: - type: Transform @@ -66126,6 +66226,111 @@ entities: - type: Transform pos: 3.5,-4.5 parent: 21002 + - uid: 23128 + components: + - type: Transform + pos: -43.5,-9.5 + parent: 2 + - uid: 23129 + components: + - type: Transform + pos: -42.5,-9.5 + parent: 2 + - uid: 23130 + components: + - type: Transform + pos: -41.5,-9.5 + parent: 2 + - uid: 23131 + components: + - type: Transform + pos: -41.5,-10.5 + parent: 2 + - uid: 23132 + components: + - type: Transform + pos: -41.5,-11.5 + parent: 2 + - uid: 23133 + components: + - type: Transform + pos: -41.5,-12.5 + parent: 2 + - uid: 23134 + components: + - type: Transform + pos: -41.5,-13.5 + parent: 2 + - uid: 23135 + components: + - type: Transform + pos: -41.5,-14.5 + parent: 2 + - uid: 23136 + components: + - type: Transform + pos: -41.5,-15.5 + parent: 2 + - uid: 23137 + components: + - type: Transform + pos: -41.5,-16.5 + parent: 2 + - uid: 23138 + components: + - type: Transform + pos: -41.5,-17.5 + parent: 2 + - uid: 23139 + components: + - type: Transform + pos: -41.5,-18.5 + parent: 2 + - uid: 23140 + components: + - type: Transform + pos: -41.5,-19.5 + parent: 2 + - uid: 23141 + components: + - type: Transform + pos: -41.5,-20.5 + parent: 2 + - uid: 23142 + components: + - type: Transform + pos: -41.5,-21.5 + parent: 2 + - uid: 23143 + components: + - type: Transform + pos: -41.5,-22.5 + parent: 2 + - uid: 23144 + components: + - type: Transform + pos: -41.5,-23.5 + parent: 2 + - uid: 23145 + components: + - type: Transform + pos: -41.5,-24.5 + parent: 2 + - uid: 23146 + components: + - type: Transform + pos: -41.5,-25.5 + parent: 2 + - uid: 23147 + components: + - type: Transform + pos: -41.5,-26.5 + parent: 2 + - uid: 23148 + components: + - type: Transform + pos: -41.5,-27.5 + parent: 2 - uid: 23346 components: - type: Transform @@ -66654,13 +66859,6 @@ entities: rot: 1.5707963267948966 rad pos: -25.7441,-49.319046 parent: 2 -- proto: CaptainIDCard - entities: - - uid: 2741 - components: - - type: Transform - pos: 24.370218,14.675703 - parent: 2 - proto: CarbonDioxideCanister entities: - uid: 8865 @@ -72818,55 +73016,6 @@ entities: rot: 1.5707963267948966 rad pos: -19.5,-3.5 parent: 2 - - uid: 879 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 19.5,-19.5 - parent: 2 - - uid: 881 - components: - - type: Transform - pos: 20.5,-18.5 - parent: 2 - - uid: 882 - components: - - type: Transform - pos: 21.5,-18.5 - parent: 2 - - uid: 883 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 19.5,-20.5 - parent: 2 - - uid: 895 - components: - - type: Transform - pos: 20.5,-17.5 - parent: 2 - - uid: 896 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 18.5,-20.5 - parent: 2 - - uid: 898 - components: - - type: Transform - pos: 20.5,-17.5 - parent: 2 - - uid: 900 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 18.5,-19.5 - parent: 2 - - uid: 906 - components: - - type: Transform - pos: 21.5,-17.5 - parent: 2 - uid: 960 components: - type: Transform @@ -73197,10 +73346,10 @@ entities: parent: 2 - proto: ChurchOrganInstrument entities: - - uid: 1063 + - uid: 45 components: - type: Transform - rot: 1.5707963267948966 rad + rot: -1.5707963267948966 rad pos: 23.5,-22.5 parent: 2 - proto: Cigar @@ -75748,6 +75897,12 @@ entities: parent: 21002 - proto: ContainmentFieldGenerator entities: + - uid: 1046 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 25.5,49.5 + parent: 2 - uid: 3868 components: - type: MetaData @@ -75814,12 +75969,6 @@ entities: rot: 3.141592653589793 rad pos: 22.5,49.5 parent: 2 - - uid: 7364 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 21.5,49.5 - parent: 2 - proto: ConveyorBelt entities: - uid: 1666 @@ -76295,6 +76444,13 @@ entities: - type: Transform pos: 26.5,20.5 parent: 2 +- proto: CrateEngineeringCableBulk + entities: + - uid: 23066 + components: + - type: Transform + pos: 21.5,47.5 + parent: 2 - proto: CrateEngineeringCableHV entities: - uid: 23688 @@ -76494,6 +76650,42 @@ entities: - 0 - proto: CrateGenericSteel entities: + - uid: 13200 + components: + - type: Transform + pos: 21.5,49.5 + parent: 2 + - type: EntityStorage + air: + volume: 200 + immutable: False + temperature: 293.14673 + moles: + - 1.7459903 + - 6.568249 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - type: ContainerContainer + containers: + entity_storage: !type:Container + showEnts: False + occludes: True + ents: + - 13258 + - 13370 + - 13398 + paper_label: !type:ContainerSlot + showEnts: False + occludes: True + ent: null - uid: 21559 components: - type: Transform @@ -86271,6 +86463,13 @@ entities: - type: Transform pos: -36.6906,-34.412094 parent: 2 +- proto: DrinkGlassCoupeShaped + entities: + - uid: 11702 + components: + - type: Transform + pos: 22.45992,-14.325507 + parent: 2 - proto: DrinkGoldenCup entities: - uid: 11453 @@ -86518,6 +86717,11 @@ entities: parent: 2 - proto: DrinkSodaWaterBottleFull entities: + - uid: 18 + components: + - type: Transform + pos: 24.350317,14.880395 + parent: 2 - uid: 3589 components: - type: Transform @@ -87489,15 +87693,6 @@ entities: parent: 2 - proto: Emitter entities: - - uid: 3081 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 60.5,-32.5 - parent: 2 - - type: DeviceLinkSink - links: - - 4246 - uid: 3921 components: - type: Transform @@ -87570,11 +87765,11 @@ entities: rot: -1.5707963267948966 rad pos: 22.5,48.5 parent: 2 - - uid: 7360 + - uid: 13653 components: - type: Transform rot: -1.5707963267948966 rad - pos: 21.5,48.5 + pos: 25.5,48.5 parent: 2 - proto: EncryptionKeyCargo entities: @@ -94066,6 +94261,38 @@ entities: parent: 21002 - proto: GasPipeBend entities: + - uid: 51 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -53.5,-6.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 52 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -41.5,-9.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 896 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -54.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 898 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -52.5,-6.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 3203 components: - type: Transform @@ -94105,6 +94332,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 7356 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 8106 components: - type: Transform @@ -95397,14 +95632,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15060 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -53.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15083 components: - type: Transform @@ -96142,6 +96369,14 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23072 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 0.5,10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23497 components: - type: Transform @@ -96363,6 +96598,20 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7344 + components: + - type: Transform + pos: 13.5,-0.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7350 + components: + - type: Transform + pos: 1.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 7765 components: - type: Transform @@ -96624,6 +96873,108 @@ entities: color: '#FF1212FF' - proto: GasPipeStraight entities: + - uid: 46 + components: + - type: Transform + pos: -53.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 48 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -42.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 49 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -42.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 50 + components: + - type: Transform + pos: -53.5,-7.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 54 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -43.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 55 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -44.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 881 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -43.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 882 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -44.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 883 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -45.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 895 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -46.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 900 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -45.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 906 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -46.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 1063 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -41.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 1093 components: - type: Transform @@ -96731,6 +97082,22 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7355 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 1.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7360 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 2.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 7732 components: - type: Transform @@ -97882,11 +98249,11 @@ entities: - uid: 8706 components: - type: Transform - rot: 3.141592653589793 rad - pos: -20.5,24.5 + rot: 1.5707963267948966 rad + pos: 0.5,11.5 parent: 2 - type: AtmosPipeColor - color: '#0335FCFF' + color: '#FF1212FF' - uid: 8707 components: - type: Transform @@ -98207,14 +98574,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 8761 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -21.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 8762 components: - type: Transform @@ -99454,14 +99813,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13258 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 1.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13260 components: - type: Transform @@ -100592,14 +100943,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13450 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 12.5,1.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13452 components: - type: Transform @@ -101016,14 +101359,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13531 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,25.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13534 components: - type: Transform @@ -101096,14 +101431,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13546 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -0.5,10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13547 components: - type: Transform @@ -101600,14 +101927,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13641 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -11.5,5.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13642 components: - type: Transform @@ -101696,14 +102015,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13653 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -10.5,7.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13654 components: - type: Transform @@ -107491,14 +107802,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 14778 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -42.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 14779 components: - type: Transform @@ -107507,14 +107810,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 14780 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -42.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 14783 components: - type: Transform @@ -107683,14 +107978,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 14818 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -40.5,-9.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 14819 components: - type: Transform @@ -108906,22 +109193,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15057 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-6.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15058 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-7.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15061 components: - type: Transform @@ -108986,86 +109257,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15071 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -51.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15072 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -50.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15073 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15074 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -48.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - - uid: 15075 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -53.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15076 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -52.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15077 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -51.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15078 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -50.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15079 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -49.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - - uid: 15080 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -48.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15084 components: - type: Transform @@ -116761,6 +116952,382 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23073 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 2.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23078 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 12.5,2.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23079 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,2.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23080 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,1.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23081 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 13.5,0.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23083 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23084 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23085 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23086 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23087 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23088 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23089 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23090 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23091 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23092 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23093 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23094 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23095 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23096 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23097 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23098 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23099 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23100 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23101 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23102 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23103 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23104 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -19.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23105 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -18.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23106 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -17.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23107 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -16.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23108 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -15.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23109 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -14.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23110 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -13.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23111 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23112 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -11.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23113 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -10.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23114 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -9.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23115 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -8.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23116 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -7.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23117 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -6.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23118 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -5.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23119 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23120 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -3.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23121 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -2.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23122 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -1.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23123 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23127 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23460 components: - type: Transform @@ -117471,6 +118038,22 @@ entities: color: '#0335FCFF' - proto: GasPipeTJunction entities: + - uid: 17 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -40.5,-9.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 47 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -42.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 737 components: - type: Transform @@ -117495,6 +118078,14 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 3081 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 3284 components: - type: Transform @@ -117596,6 +118187,54 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 7228 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7333 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -20.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7343 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 1.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 7345 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -0.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7347 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -0.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7354 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 12.5,1.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 7761 components: - type: Transform @@ -117954,14 +118593,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 13200 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 1.5,12.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13201 components: - type: Transform @@ -118176,13 +118807,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13370 - components: - - type: Transform - pos: 13.5,-0.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 13376 components: - type: Transform @@ -118212,14 +118836,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 13398 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -0.5,11.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 13400 components: - type: Transform @@ -119302,14 +119918,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15059 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -54.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15062 components: - type: Transform @@ -119318,14 +119926,6 @@ entities: parent: 2 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15070 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: -52.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15177 components: - type: Transform @@ -120190,6 +120790,30 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23082 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -21.5,25.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23125 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -11.5,5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23126 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: -10.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23495 components: - type: Transform @@ -120428,7 +121052,7 @@ entities: pos: -19.5,-34.5 parent: 2 - type: AtmosPipeColor - color: '#BB55BBFF' + color: '#0335FCFF' - uid: 23527 components: - type: Transform @@ -120583,6 +121207,14 @@ entities: open: False - proto: GasVentPump entities: + - uid: 56 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -47.5,-8.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 1922 components: - type: Transform @@ -120593,6 +121225,14 @@ entities: - 5583 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 7348 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,5.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 10592 components: - type: Transform @@ -121322,14 +121962,6 @@ entities: - 18584 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 15082 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -47.5,-8.5 - parent: 2 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 15106 components: - type: Transform @@ -122199,17 +122831,6 @@ entities: - 18247 - type: AtmosPipeColor color: '#0335FCFF' - - uid: 16555 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: 0.5,24.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18499 - - type: AtmosPipeColor - color: '#0335FCFF' - uid: 16774 components: - type: Transform @@ -122329,6 +122950,29 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#0335FCFF' + - uid: 23074 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,12.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23076 + components: + - type: Transform + pos: 13.5,3.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' + - uid: 23124 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 0.5,24.5 + parent: 2 + - type: AtmosPipeColor + color: '#0335FCFF' - uid: 23704 components: - type: Transform @@ -122384,6 +123028,14 @@ entities: color: '#0335FCFF' - proto: GasVentScrubber entities: + - uid: 53 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: -41.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 412 components: - type: Transform @@ -122394,6 +123046,22 @@ entities: - 5583 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 879 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -47.5,-10.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 7349 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -12.5,7.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 8128 components: - type: Transform @@ -123098,14 +123766,6 @@ entities: - 18584 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 15081 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: -47.5,-10.5 - parent: 2 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 15105 components: - type: Transform @@ -123859,17 +124519,6 @@ entities: - 18288 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 16487 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 0.5,11.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18272 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 16490 components: - type: Transform @@ -123942,17 +124591,6 @@ entities: - 18332 - type: AtmosPipeColor color: '#FF1212FF' - - uid: 16519 - components: - - type: Transform - rot: 1.5707963267948966 rad - pos: -41.5,-10.5 - parent: 2 - - type: DeviceNetwork - deviceLists: - - 18333 - - type: AtmosPipeColor - color: '#FF1212FF' - uid: 16522 components: - type: Transform @@ -124142,6 +124780,28 @@ entities: parent: 21002 - type: AtmosPipeColor color: '#FF1212FF' + - uid: 23071 + components: + - type: Transform + pos: 0.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23075 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,11.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' + - uid: 23077 + components: + - type: Transform + pos: 12.5,3.5 + parent: 2 + - type: AtmosPipeColor + color: '#FF1212FF' - uid: 23703 components: - type: Transform @@ -131461,74 +132121,74 @@ entities: parent: 21002 - proto: GrilleDiagonal entities: - - uid: 21 + - uid: 14778 + components: + - type: Transform + pos: -3.5,4.5 + parent: 2 + - uid: 14780 components: - type: Transform rot: -1.5707963267948966 rad pos: 5.5,3.5 parent: 2 - - uid: 22 + - uid: 14818 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,4.5 + rot: 1.5707963267948966 rad + pos: -2.5,-4.5 parent: 2 - - uid: 23 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,5.5 - parent: 2 - - uid: 38 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-2.5 - parent: 2 - - uid: 39 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 4.5,-3.5 - parent: 2 - - uid: 40 + - uid: 15058 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-4.5 parent: 2 - - uid: 51 + - uid: 15059 components: - type: Transform - pos: -4.5,3.5 + rot: -1.5707963267948966 rad + pos: 4.5,4.5 parent: 2 - - uid: 52 - components: - - type: Transform - pos: -3.5,4.5 - parent: 2 - - uid: 53 + - uid: 15075 components: - type: Transform pos: -2.5,5.5 parent: 2 - - uid: 54 + - uid: 15076 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,-2.5 + rot: 3.141592653589793 rad + pos: 5.5,-2.5 parent: 2 - - uid: 55 + - uid: 15077 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,-3.5 parent: 2 - - uid: 56 + - uid: 15078 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 2 + - uid: 15079 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-3.5 + parent: 2 + - uid: 15080 components: - type: Transform rot: 1.5707963267948966 rad - pos: -2.5,-4.5 + pos: -4.5,-2.5 + parent: 2 + - uid: 15082 + components: + - type: Transform + pos: -4.5,3.5 parent: 2 - uid: 23946 components: @@ -133525,6 +134185,11 @@ entities: rot: -1.5707963267948966 rad pos: 42.546173,-40.193848 parent: 2 + - uid: 7364 + components: + - type: Transform + pos: 8.466017,-18.14467 + parent: 2 - uid: 9899 components: - type: Transform @@ -133648,11 +134313,6 @@ entities: parent: 2 - proto: LampInterrogator entities: - - uid: 1046 - components: - - type: Transform - pos: 8.440077,-18.25892 - parent: 2 - uid: 3763 components: - type: Transform @@ -134546,14 +135206,7 @@ entities: - uid: 4205 components: - type: Transform - pos: 32.40636,-20.502666 - parent: 2 -- proto: MagazineMagnumRubber - entities: - - uid: 4206 - components: - - type: Transform - pos: 32.65636,-20.533916 + pos: 32.59941,-20.510296 parent: 2 - proto: MagazinePistolSubMachineGunTopMounted entities: @@ -136164,12 +136817,6 @@ entities: rot: 3.141592653589793 rad pos: 14.5,52.5 parent: 2 - - uid: 7228 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 14.5,52.5 - parent: 2 - proto: ParticleAcceleratorEndCapUnfinished entities: - uid: 7232 @@ -136245,6 +136892,13 @@ entities: - type: Transform pos: -52.375683,-20.40928 parent: 2 + - uid: 13258 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 21846 components: - type: Transform @@ -147875,74 +148529,74 @@ entities: parent: 21002 - proto: ReinforcedWindowDiagonal entities: - - uid: 16 + - uid: 2741 components: - type: Transform - rot: -1.5707963267948966 rad - pos: 3.5,5.5 + pos: -4.5,3.5 parent: 2 - - uid: 17 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 4.5,4.5 - parent: 2 - - uid: 18 - components: - - type: Transform - rot: -1.5707963267948966 rad - pos: 5.5,3.5 - parent: 2 - - uid: 31 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 5.5,-2.5 - parent: 2 - - uid: 34 - components: - - type: Transform - rot: 3.141592653589793 rad - pos: 4.5,-3.5 - parent: 2 - - uid: 35 + - uid: 3328 components: - type: Transform rot: 3.141592653589793 rad pos: 3.5,-4.5 parent: 2 - - uid: 45 + - uid: 11703 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 4.5,4.5 + parent: 2 + - uid: 11704 + components: + - type: Transform + rot: -1.5707963267948966 rad + pos: 3.5,5.5 + parent: 2 + - uid: 11705 + components: + - type: Transform + rot: 3.141592653589793 rad + pos: 4.5,-3.5 + parent: 2 + - uid: 15057 components: - type: Transform rot: 1.5707963267948966 rad pos: -2.5,-4.5 parent: 2 - - uid: 46 + - uid: 15060 components: - type: Transform rot: 1.5707963267948966 rad pos: -3.5,-3.5 parent: 2 - - uid: 47 + - uid: 15070 components: - type: Transform - rot: 1.5707963267948966 rad - pos: -4.5,-2.5 + rot: 3.141592653589793 rad + pos: 5.5,-2.5 parent: 2 - - uid: 48 + - uid: 15071 components: - type: Transform - pos: -4.5,3.5 + pos: -2.5,5.5 parent: 2 - - uid: 49 + - uid: 15072 components: - type: Transform pos: -3.5,4.5 parent: 2 - - uid: 50 + - uid: 15073 components: - type: Transform - pos: -2.5,5.5 + rot: -1.5707963267948966 rad + pos: 5.5,3.5 + parent: 2 + - uid: 15074 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: -4.5,-2.5 parent: 2 - proto: RemoteSignaller entities: @@ -147970,8 +148624,6 @@ entities: linkedPorts: 3921: - Pressed: Toggle - 3081: - - Pressed: Toggle - uid: 6115 components: - type: MetaData @@ -148314,6 +148966,13 @@ entities: - type: Transform pos: 28.332474,49.774113 parent: 2 + - uid: 13398 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - proto: SheetPlasma entities: - uid: 7631 @@ -148421,6 +149080,13 @@ entities: - type: Transform pos: 28.676224,49.727238 parent: 2 + - uid: 13370 + components: + - type: Transform + parent: 13200 + - type: Physics + canCollide: False + - type: InsideEntityStorage - uid: 21560 components: - type: Transform @@ -149261,7 +149927,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9767 components: @@ -149271,7 +149936,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9768 components: @@ -149281,7 +149945,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9769 components: @@ -149318,7 +149981,6 @@ entities: parent: 2 - type: DeviceLinkSink links: - - 10078 - 21223 - uid: 9773 components: @@ -149971,14 +150633,6 @@ entities: linkedPorts: 9715: - Pressed: Toggle - 9772: - - Pressed: Toggle - 9766: - - Pressed: Toggle - 9767: - - Pressed: Toggle - 9768: - - Pressed: Toggle - uid: 10222 components: - type: Transform @@ -151066,10 +151720,10 @@ entities: - type: Transform pos: 13.5,62.5 parent: 2 - - uid: 7356 + - uid: 23068 components: - type: Transform - pos: 25.5,48.5 + pos: 24.5,47.5 parent: 2 - proto: Sink entities: @@ -154186,6 +154840,11 @@ entities: parent: 2 - proto: SpawnPointMedicalIntern entities: + - uid: 22 + components: + - type: Transform + pos: -3.5,-27.5 + parent: 2 - uid: 20805 components: - type: Transform @@ -154196,11 +154855,6 @@ entities: - type: Transform pos: -5.5,-33.5 parent: 2 - - uid: 20807 - components: - - type: Transform - pos: -5.5,-25.5 - parent: 2 - uid: 20811 components: - type: Transform @@ -159284,60 +159938,46 @@ entities: parent: 2 - proto: TeslaCoil entities: - - uid: 7333 + - uid: 4206 components: - type: Transform + rot: -1.5707963267948966 rad pos: 25.5,47.5 parent: 2 - - uid: 7343 - components: - - type: Transform - pos: 21.5,46.5 - parent: 2 - - uid: 7344 - components: - - type: Transform - pos: 23.5,46.5 - parent: 2 - - uid: 7345 - components: - - type: Transform - pos: 22.5,46.5 - parent: 2 - uid: 7346 components: - type: Transform pos: 24.5,46.5 parent: 2 - - uid: 7348 + - uid: 8761 + components: + - type: Transform + pos: 19.5,67.5 + parent: 2 + - uid: 13450 components: - type: Transform pos: 25.5,46.5 parent: 2 + - uid: 16487 + components: + - type: Transform + pos: 23.5,46.5 + parent: 2 + - uid: 23069 + components: + - type: Transform + pos: 7.5,64.5 + parent: 2 - proto: TeslaGenerator entities: - - uid: 7355 - components: - - type: Transform - pos: 25.5,49.5 - parent: 2 -- proto: TeslaGroundingRod - entities: - - uid: 7347 - components: - - type: Transform - pos: 22.5,47.5 - parent: 2 - - uid: 7349 - components: - - type: Transform - pos: 21.5,47.5 - parent: 2 - - uid: 7350 + - uid: 23067 components: - type: Transform pos: 23.5,47.5 parent: 2 +- proto: TeslaGroundingRod + entities: - uid: 7352 components: - type: Transform @@ -159348,10 +159988,30 @@ entities: - type: Transform pos: 7.5,68.5 parent: 2 - - uid: 7354 + - uid: 13531 components: - type: Transform - pos: 24.5,47.5 + pos: 22.5,47.5 + parent: 2 + - uid: 13546 + components: + - type: Transform + pos: 21.5,46.5 + parent: 2 + - uid: 13641 + components: + - type: Transform + pos: 22.5,46.5 + parent: 2 + - uid: 16555 + components: + - type: Transform + pos: 22.5,47.5 + parent: 2 + - uid: 23070 + components: + - type: Transform + pos: 8.5,68.5 parent: 2 - proto: ThermomachineFreezerMachineCircuitBoard entities: @@ -180135,10 +180795,54 @@ entities: pos: 24.5,2.5 parent: 21002 - type: Door - secondsUntilStateChange: -47203.098 + secondsUntilStateChange: -59209.29 state: Opening - proto: WoodenBench entities: + - uid: 21 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,-19.5 + parent: 2 + - uid: 23 + components: + - type: Transform + pos: 21.5,-18.5 + parent: 2 + - uid: 31 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,-19.5 + parent: 2 + - uid: 34 + components: + - type: Transform + pos: 21.5,-17.5 + parent: 2 + - uid: 35 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 19.5,-20.5 + parent: 2 + - uid: 38 + components: + - type: Transform + pos: 20.5,-18.5 + parent: 2 + - uid: 39 + components: + - type: Transform + rot: 1.5707963267948966 rad + pos: 18.5,-20.5 + parent: 2 + - uid: 40 + components: + - type: Transform + pos: 20.5,-17.5 + parent: 2 - uid: 4172 components: - type: Transform diff --git a/Resources/Prototypes/Body/Parts/vox.yml b/Resources/Prototypes/Body/Parts/vox.yml index b163ed0864..9f89a0c583 100644 --- a/Resources/Prototypes/Body/Parts/vox.yml +++ b/Resources/Prototypes/Body/Parts/vox.yml @@ -33,10 +33,10 @@ components: - type: Sprite sprite: Mobs/Species/Vox/parts.rsi - state: "torso_m" + state: "torso" - type: Icon sprite: Mobs/Species/Vox/parts.rsi - state: "torso_m" + state: "torso" - type: BodyPart partType: Torso - type: Extractable @@ -54,10 +54,10 @@ components: - type: Sprite sprite: Mobs/Species/Vox/parts.rsi - state: "head_m" + state: "head" - type: Icon sprite: Mobs/Species/Vox/parts.rsi - state: "head_m" + state: "head" - type: BodyPart partType: Head vital: true diff --git a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml index 62942d9ea5..040efebe7a 100644 --- a/Resources/Prototypes/Catalog/Cargo/cargo_security.yml +++ b/Resources/Prototypes/Catalog/Cargo/cargo_security.yml @@ -34,7 +34,7 @@ sprite: Clothing/OuterClothing/Armor/riot.rsi state: icon product: CrateSecurityRiot - cost: 5500 + cost: 7500 category: cargoproduct-category-name-security group: market diff --git a/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml b/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml index ba8fd6fb25..a9fffddd2a 100644 --- a/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml +++ b/Resources/Prototypes/Catalog/Fills/Boxes/ammunition.yml @@ -33,17 +33,6 @@ - id: MagazinePistolCaselessRiflePractice amount: 4 -- type: entity - name: box of .25 caseless (rubber) magazines - parent: BoxMagazine - id: BoxMagazineCaselessRifleRubber - description: A box full of - components: - - type: StorageFill - contents: - - id: MagazineCaselessRifleRubber - amount: 4 - # LightRifle - type: entity name: box of .30 rifle magazines @@ -67,17 +56,6 @@ - id: MagazineLightRiflePractice amount: 4 -- type: entity - name: box of .30 rifle (rubber) magazines - parent: BoxMagazine - id: BoxMagazineLightRifleRubber - description: A box full of .30 rifle (practice) magazines. - components: - - type: StorageFill - contents: - - id: MagazineLightRifleRubber - amount: 4 - - type: entity name: box of Vector magazines parent: BoxMagazine @@ -100,17 +78,6 @@ - id: MagazineMagnumSubMachineGunPractice amount: 3 -- type: entity - name: box of Vector (rubber) magazines - parent: BoxMagazine - id: BoxMagazineMagnumSubMachineGunRubber - description: A box full of Vector (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazineMagnumSubMachineGunRubber - amount: 3 - # Pistol - type: entity name: box of WT550 .35 auto magazines @@ -145,17 +112,6 @@ - id: MagazinePistolPractice amount: 4 -- type: entity - name: box of pistol .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolRubber - description: A box full of pistol .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolRubber - amount: 4 - - type: entity name: box of machine pistol .35 auto magazines parent: BoxMagazine @@ -178,18 +134,6 @@ - id: MagazinePistolHighCapacityPractice amount: 4 -- type: entity - name: box of machine pistol .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolHighCapacityRubber - description: A box full of machine pistol .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolHighCapacityRubber - amount: 4 - - - type: entity name: box of SMG .35 auto magazines parent: BoxMagazine @@ -212,17 +156,6 @@ - id: MagazinePistolSubMachineGunPractice amount: 3 -- type: entity - name: box of SMG .35 auto (rubber) magazines - parent: BoxMagazine - id: BoxMagazinePistolSubMachineGunRubber - description: A box full of SMG .35 auto (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazinePistolSubMachineGunRubber - amount: 3 - # Shotgun - type: entity name: box of (.50 pellet) ammo drums @@ -290,14 +223,3 @@ contents: - id: MagazineRiflePractice amount: 4 - -- type: entity - name: box of .20 rifle (rubber) magazines - parent: BoxMagazine - id: BoxMagazineRifleRubber - description: A box full of .20 rifle (rubber) magazines. - components: - - type: StorageFill - contents: - - id: MagazineRifleRubber - amount: 4 diff --git a/Resources/Prototypes/Catalog/Fills/Crates/service.yml b/Resources/Prototypes/Catalog/Fills/Crates/service.yml index 141f98edab..38cd6975ee 100644 --- a/Resources/Prototypes/Catalog/Fills/Crates/service.yml +++ b/Resources/Prototypes/Catalog/Fills/Crates/service.yml @@ -20,7 +20,7 @@ - id: Plunger amount: 2 - id: BoxCleanerGrenades - + - type: entity id: CrateServiceReplacementLights parent: CrateGenericSteel @@ -88,6 +88,7 @@ - id: ClothingNeckCloakVoid - id: RevolverCapGun - id: BarberScissors + - id: ClothingUniformJumpskirtOldDress - type: entity id: CrateServiceCustomSmokable diff --git a/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml b/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml index e13070d1ba..4893fa2557 100644 --- a/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml +++ b/Resources/Prototypes/Catalog/Fills/Paper/manuals.yml @@ -19,7 +19,7 @@ key: enum.PaperUiKey.Key - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Paper content: book-text-holoparasite-info diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml index 3c539243c9..f767e95e11 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/ammo.yml @@ -1,22 +1,17 @@ - type: vendingMachineInventory id: AmmoVendInventory startingInventory: - MagazineBoxCaselessRifle: 3 + MagazineBoxCaselessRifle: 6 MagazineBoxCaselessRiflePractice: 3 - MagazineBoxCaselessRifleRubber: 3 - MagazineBoxLightRifleBig: 3 + MagazineBoxLightRifleBig: 6 MagazineBoxLightRiflePractice: 3 - MagazineBoxLightRifleRubber: 3 - MagazineBoxMagnum: 3 + MagazineBoxMagnum: 6 MagazineBoxMagnumPractice: 3 - MagazineBoxMagnumRubber: 3 - MagazineBoxPistol: 3 + MagazineBoxPistol: 6 MagazineBoxPistolPractice: 3 - MagazineBoxPistolRubber: 3 - MagazineBoxRifle: 3 + MagazineBoxRifle: 6 MagazineBoxRiflePractice: 3 - MagazineBoxRifleRubber: 3 diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml index 282f58535b..5befd85ca8 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/chang.yml @@ -7,4 +7,5 @@ DrinkHellRamen: 3 FoodSnackChowMein: 3 FoodSnackDanDanNoodles: 3 + PairedChopsticks: 3 # rice? diff --git a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml index 86f35b5269..11e48f830e 100644 --- a/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml +++ b/Resources/Prototypes/Catalog/VendingMachines/Inventories/dinnerware.yml @@ -6,6 +6,7 @@ RollingPin: 4 Spoon: 4 Fork: 4 + PairedChopsticks: 4 FoodBowlBig: 10 FoodPlate: 10 FoodPlateSmall: 10 diff --git a/Resources/Prototypes/Catalog/uplink_catalog.yml b/Resources/Prototypes/Catalog/uplink_catalog.yml index a7c2dbc7a4..ca1a2e4f2d 100644 --- a/Resources/Prototypes/Catalog/uplink_catalog.yml +++ b/Resources/Prototypes/Catalog/uplink_catalog.yml @@ -937,10 +937,10 @@ - NukeOpsUplink - type: listing - id: UplinkReinforcementRadioSyndicateMonkey - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkey + id: UplinkReinforcementRadioSyndicateAncestor + name: uplink-reinforcement-radio-ancestor-name + description: uplink-reinforcement-radio-ancestor-desc + productEntity: ReinforcementRadioSyndicateAncestor icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 6 @@ -953,10 +953,10 @@ - NukeOpsUplink - type: listing - id: UplinkReinforcementRadioSyndicateMonkeyNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. - name: uplink-reinforcement-radio-monkey-name - description: uplink-reinforcement-radio-monkey-desc - productEntity: ReinforcementRadioSyndicateMonkeyNukeops + id: UplinkReinforcementRadioSyndicateAncestorNukeops # Version for Nukeops that spawns a syndicate monkey with the NukeOperative component. + name: uplink-reinforcement-radio-ancestor-name + description: uplink-reinforcement-radio-ancestor-desc + productEntity: ReinforcementRadioSyndicateAncestorNukeops icon: { sprite: Objects/Devices/communication.rsi, state: old-radio } cost: Telecrystal: 6 diff --git a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml index a69c770f40..5d9fc64e12 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/backpacks.yml @@ -23,8 +23,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 @@ -267,7 +267,7 @@ - type: Sprite sprite: Clothing/Back/Backpacks/syndicate.rsi - type: ExplosionResistance - damageCoefficient: 0.1 + damageCoefficient: 0.1 #Special - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Back/specific.yml b/Resources/Prototypes/Entities/Clothing/Back/specific.yml index 8af00039b5..fcdecffc8f 100644 --- a/Resources/Prototypes/Entities/Clothing/Back/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Back/specific.yml @@ -14,9 +14,9 @@ default: ClothingBackpack - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity @@ -51,8 +51,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DrawableSolution solution: tank - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml index 703730daf3..76af5067ae 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/base_clothingbelt.yml @@ -36,8 +36,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: entity abstract: true diff --git a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml index 1bae86a022..c72a3f3120 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/belts.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/belts.yml @@ -480,6 +480,8 @@ - SmokeOnTrigger - Flash - Handcuff + - BallisticAmmoProvider + - CartridgeAmmo - type: ItemMapper mapLayers: flashbang: @@ -599,7 +601,7 @@ - CartridgeAmmo - type: entity - parent: ClothingBeltStorageBase + parent: ClothingBeltSecurity id: ClothingBeltSecurityWebbing name: security webbing description: Unique and versatile chest rig, can hold security gear. @@ -608,11 +610,11 @@ sprite: Clothing/Belt/securitywebbing.rsi - type: Clothing sprite: Clothing/Belt/securitywebbing.rsi - + - type: entity parent: ClothingBeltStorageBase id: ClothingBeltMercWebbing - name: mercenarie webbing + name: mercenary webbing description: Ideal for storing everything from ammo to weapons and combat essentials. components: - type: Sprite diff --git a/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml b/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml index 6cbf5a69ca..bb4e395c4f 100644 --- a/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml +++ b/Resources/Prototypes/Entities/Clothing/Belt/quiver.yml @@ -18,7 +18,11 @@ whitelist: tags: - Arrow + - Plunger - type: Appearance - type: StorageContainerVisuals maxFillLevels: 3 fillBaseName: fill- + - type: Construction + graph: Quiver + node: Quiver diff --git a/Resources/Prototypes/Entities/Clothing/Ears/specific.yml b/Resources/Prototypes/Entities/Clothing/Ears/specific.yml index 093f5e645b..83612ac4b2 100644 --- a/Resources/Prototypes/Entities/Clothing/Ears/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Ears/specific.yml @@ -16,5 +16,5 @@ default: ClothingHeadsetGrey - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml b/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml index c04f348287..fa87ed398e 100644 --- a/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Eyes/specific.yml @@ -16,6 +16,6 @@ default: ClothingEyesGlassesSunglasses - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml index 96bdd61f94..02ec58bd67 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/gloves.yml @@ -377,7 +377,7 @@ - type: Actions - type: UserInterface interfaces: - - key: enum.MeleeSpeechUiKey.Key + enum.MeleeSpeechUiKey.Key: type: MeleeSpeechBoundUserInterface - type: StaticPrice price: 0 diff --git a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml index e6a5731999..6140bcd8ed 100644 --- a/Resources/Prototypes/Entities/Clothing/Hands/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Hands/specific.yml @@ -19,9 +19,9 @@ - type: FingerprintMask - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - + - type: entity parent: ClothingHandsChameleon id: ClothingHandsChameleonThief diff --git a/Resources/Prototypes/Entities/Clothing/Head/hats.yml b/Resources/Prototypes/Entities/Clothing/Head/hats.yml index ec0921c512..a844fd724a 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/hats.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/hats.yml @@ -245,7 +245,7 @@ - 0,0,0,0 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: ContainerContainer containers: @@ -834,8 +834,8 @@ - 0,0,0,0 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Clothing/Head/specific.yml b/Resources/Prototypes/Entities/Clothing/Head/specific.yml index 1dd36bff94..636f922d85 100644 --- a/Resources/Prototypes/Entities/Clothing/Head/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Head/specific.yml @@ -16,5 +16,5 @@ default: ClothingHeadHatBeret - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml index 0a0fc68469..c3a07fa8e9 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/specific.yml @@ -18,7 +18,7 @@ - type: IdentityBlocker # need that for default ClothingMaskGas - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: HideLayerClothing slots: @@ -33,3 +33,32 @@ - type: HideLayerClothing slots: - Snout + +- type: entity + parent: ClothingMaskBase + id: ClothingMaskWeldingGas + name: welding gas mask + description: A gas mask with built in welding goggles and face shield. Looks like a skull, clearly designed by a nerd. + components: + - type: Sprite + sprite: Clothing/Mask/welding-gas.rsi + state: icon + - type: Clothing + sprite: Clothing/Mask/welding-gas.rsi + - type: BreathMask + - type: IngestionBlocker + - type: IdentityBlocker + - type: FlashImmunity + - type: EyeProtection + - type: PhysicalComposition + materialComposition: + Steel: 200 + Glass: 100 + - type: StaticPrice + price: 100 + - type: Tag + tags: + - WhitelistChameleon + - type: HideLayerClothing + slots: + - Snout diff --git a/Resources/Prototypes/Entities/Clothing/Neck/specific.yml b/Resources/Prototypes/Entities/Clothing/Neck/specific.yml index 1f50dc1ef1..56fddceaad 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/specific.yml @@ -16,5 +16,5 @@ default: ClothingNeckScarfStripedRed - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml index 987d3c2f24..e5067e84c5 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/base_clothingouter.yml @@ -38,8 +38,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: StaticPrice price: 70 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml index 9be8c22a0a..c3d9bb1224 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/specific.yml @@ -16,5 +16,5 @@ default: ClothingOuterVest - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml index 880239b51e..485d530ea5 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml @@ -110,7 +110,7 @@ key: enum.SharedGasTankUiKey.Key - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key + enum.SharedGasTankUiKey.Key: type: GasTankBoundUserInterface - type: Explosive explosionType: Default diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml index 987eda582e..4ae752345a 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/specific.yml @@ -185,7 +185,7 @@ default: ClothingShoesColorBlack - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml index aeebaca31c..998d462898 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/jumpskirts.yml @@ -766,3 +766,14 @@ - state: equipped-INNERCLOTHING-jumpskirt - state: equipped-INNERCLOTHING-shirt color: "#b30000" + +- type: entity + parent: ClothingUniformSkirtBase + id: ClothingUniformJumpskirtOldDress + name: old dress + description: A worn-looking dress from a very long time ago. + components: + - type: Sprite + sprite: Clothing/Uniforms/Jumpskirt/olddress.rsi + - type: Clothing + sprite: Clothing/Uniforms/Jumpskirt/olddress.rsi diff --git a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml index ad02f4aa67..a2c903bac3 100644 --- a/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml +++ b/Resources/Prototypes/Entities/Clothing/Uniforms/specific.yml @@ -38,5 +38,5 @@ default: ClothingUniformJumpsuitColorBlack - type: UserInterface interfaces: - - key: enum.ChameleonUiKey.Key - type: ChameleonBoundUserInterface \ No newline at end of file + enum.ChameleonUiKey.Key: + type: ChameleonBoundUserInterface diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml index be346a3489..8f4b15e842 100644 --- a/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/human_hair.yml @@ -398,6 +398,13 @@ # - sprite: Mobs/Customization/human_hair.rsi # state: cornrowtail #- type: marking +# id: HumanHairSpookyLong +# bodyPart: Hair +# markingCategory: Hair +# sprites: +# - sprite: Mobs/Customization/human_hair.rsi +# state: spookylong +#- type: marking # id: HumanHairCrewcut # bodyPart: Hair # markingCategory: Hair diff --git a/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml new file mode 100644 index 0000000000..cd3588bf54 --- /dev/null +++ b/Resources/Prototypes/Entities/Mobs/Customization/Markings/vox_parts.yml @@ -0,0 +1,145 @@ +- type: marking + id: VoxBeak + bodyPart: Snout + markingCategory: Snout + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: beak + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLArmScales + bodyPart: LArm + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_arm + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLLegScales + bodyPart: LLeg + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_leg + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRArmScales + bodyPart: RArm + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_arm + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRLegScales + bodyPart: RLeg + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_leg + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRHandScales + bodyPart: RHand + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_hand + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLHandScales + bodyPart: LHand + markingCategory: Arms + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_hand + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxLFootScales + bodyPart: LFoot + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: l_foot + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxRFootScales + bodyPart: RFoot + markingCategory: Legs + forcedColoring: true + speciesRestriction: [Vox] + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + state: r_foot + coloring: + default: + type: + !type:SimpleColoring + color: "#937e3d" + +- type: marking + id: VoxTail + bodyPart: Tail + markingCategory: Tail + speciesRestriction: [Vox] + forcedColoring: true + sprites: + - sprite: Mobs/Customization/vox_parts.rsi + # Ideally this should use the normal tail sprite and apply an actual mask over it, not just use a butchered sprite + state: tail_stenciled diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 9907c5f71f..27a19ab899 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -63,12 +63,12 @@ locPrefix: silicon - type: UserInterface interfaces: - - key: enum.SiliconLawsUiKey.Key - type: SiliconLawBoundUserInterface - - key: enum.BorgUiKey.Key - type: BorgBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.SiliconLawsUiKey.Key: + type: SiliconLawBoundUserInterface + enum.BorgUiKey.Key: + type: BorgBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: ActivatableUI key: enum.BorgUiKey.Key - type: SiliconLawBound diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 819c7beacf..ad5b51d998 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -1077,8 +1077,8 @@ - id: FoodMeat - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -1169,8 +1169,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: Sprite drawdepth: Mobs layers: @@ -1324,9 +1324,10 @@ - type: entity name: kobold - id: MobKobold + id: MobBaseKobold parent: MobBaseAncestor description: Cousins to the sentient race of lizard people, kobolds blend in with their natural habitat and are as nasty as monkeys; ready to pull out your hair and stab you to death. + abstract: true components: - type: NameIdentifier group: Kobold @@ -1420,15 +1421,6 @@ spawned: - id: FoodMeat amount: 2 - - type: Clumsy - clumsyDamage: - types: - Blunt: 2 - Piercing: 7 - groups: - Burn: 3 - clumsySound: - path: /Audio/Voice/Reptilian/reptilian_scream.ogg - type: AlwaysRevolutionaryConvertible - type: GhostTakeoverAvailable - type: SentienceTarget @@ -1439,6 +1431,55 @@ name: ghost-role-information-kobold-name description: ghost-role-information-kobold-description +- type: entity + name: kobold + id: MobKobold + parent: MobBaseKobold + description: Cousins to the sentient race of lizard people, kobolds blend in with their natural habitat and are as nasty as monkeys; ready to pull out your hair and stab you to death. + components: + - type: Clumsy + clumsyDamage: + types: + Blunt: 2 + Piercing: 7 + groups: + Burn: 3 + clumsySound: + path: /Audio/Voice/Reptilian/reptilian_scream.ogg + +- type: entity + id: MobBaseSyndicateKobold + parent: MobBaseKobold + suffix: syndicate base + components: + - type: MobThresholds + thresholds: + 0: Alive + 75: Critical + 200: Dead + - type: NpcFactionMember + factions: + - Syndicate + - type: Loadout + prototypes: [SyndicateOperativeGearMonkey] + +- type: entity + id: MobKoboldSyndicateAgent + parent: MobBaseSyndicateKobold + suffix: syndicate agent + components: + # make the player a traitor once its taken + - type: AutoTraitor + giveUplink: false + giveObjectives: false + +- type: entity + id: MobKoboldSyndicateAgentNukeops # Reinforcement exclusive to nukeops uplink + parent: MobBaseSyndicateKobold + suffix: NukeOps + components: + - type: NukeOperative + - type: entity name: guidebook monkey parent: MobMonkey @@ -1679,6 +1720,41 @@ Dead: Base: splat-2 +- type: entity + name: cancer mouse + description: Toxic. Squeak! + parent: MobMouse + id: MobMouseCancer + components: + - type: Sprite + color: LightGreen + - type: PointLight + color: LightGreen + radius: 5 + energy: 5 + netsync: false + - type: RadiationSource + intensity: 0.3 + - type: Bloodstream + bloodReagent: UnstableMutagen + - type: SolutionContainerManager + solutions: + food: + reagents: + - ReagentId: UncookedAnimalProteins + Quantity: 3 + - ReagentId: Uranium + Quantity: 10 + - type: Butcherable + spawned: + - id: FoodMeatRat + amount: 1 + - id: SheetUranium1 + amount: 1 + - type: Damageable + damageContainer: Biological + damageModifierSet: Zombie + - type: entity name: lizard #Weh parent: SimpleMobBase @@ -2283,8 +2359,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2358,8 +2434,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2422,8 +2498,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2499,8 +2575,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2648,8 +2724,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2857,8 +2933,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -2914,8 +2990,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3007,8 +3083,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3124,8 +3200,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -3188,8 +3264,8 @@ bloodMaxVolume: 60 - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml index 8a10337c94..6aea0e89b0 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/behonker.yml @@ -76,8 +76,8 @@ - id: BikeHorn - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml index 747268466a..f6cf36196f 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/pets.yml @@ -211,8 +211,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -274,8 +274,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: @@ -373,8 +373,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: DamageStateVisuals states: Alive: diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml index 68ebf52dc0..83d3dbd069 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/revenant.yml @@ -75,8 +75,8 @@ softness: 1 - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: Visibility layer: 2 #ghost vis layer - type: Store diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 9a4d4ec3aa..c808ed2d21 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -300,8 +300,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: Sprite layers: - map: ["enum.DamageStateVisualLayers.Base"] diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml index eeee640225..8cfd199dca 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/space.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/space.yml @@ -171,8 +171,8 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface - type: entity id: MobKangarooSpaceSalvage diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index af18791fa7..38092e3aa7 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -34,32 +34,32 @@ - CentralCommand - type: UserInterface interfaces: - - key: enum.SolarControlConsoleUiKey.Key + enum.SolarControlConsoleUiKey.Key: type: SolarControlConsoleBoundUserInterface - - key: enum.CommunicationsConsoleUiKey.Key + enum.CommunicationsConsoleUiKey.Key: type: CommunicationsConsoleBoundUserInterface - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: type: RadarConsoleBoundUserInterface - - key: enum.CargoConsoleUiKey.Orders + enum.CargoConsoleUiKey.Orders: type: CargoOrderConsoleBoundUserInterface - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - - key: enum.GeneralStationRecordConsoleKey.Key - # who the fuck named this bruh + enum.GeneralStationRecordConsoleKey.Key: + # who the fuck named this bruh type: GeneralStationRecordConsoleBoundUserInterface - type: IntrinsicUI uis: - - key: enum.SolarControlConsoleUiKey.Key + enum.SolarControlConsoleUiKey.Key: toggleAction: ActionAGhostShowSolar - - key: enum.CommunicationsConsoleUiKey.Key + enum.CommunicationsConsoleUiKey.Key: toggleAction: ActionAGhostShowCommunications - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: toggleAction: ActionAGhostShowRadar - - key: enum.CargoConsoleUiKey.Orders + enum.CargoConsoleUiKey.Orders: toggleAction: ActionAGhostShowCargo - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: toggleAction: ActionAGhostShowCrewMonitoring - - key: enum.GeneralStationRecordConsoleKey.Key + enum.GeneralStationRecordConsoleKey.Key: toggleAction: ActionAGhostShowStationRecords - type: SolarControlConsole # look ma i AM the computer! - type: CommunicationsConsole diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index ae4a370f9d..26c0ae30ec 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -95,8 +95,8 @@ - type: MeleeSpeech - type: UserInterface interfaces: - - key: enum.MeleeSpeechUiKey.Key - type: MeleeSpeechBoundUserInterface + enum.MeleeSpeechUiKey.Key: + type: MeleeSpeechBoundUserInterface - type: Actions - type: Guardian - type: InteractionPopup diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index fec1d43325..808f9fa327 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -28,8 +28,6 @@ state: unisex_full visible: false - map: ["jumpsuit"] - - map: [ "pants" ] - - map: [ "shirt" ] - map: ["enum.HumanoidVisualLayers.LFoot"] - map: ["enum.HumanoidVisualLayers.RFoot"] - map: ["enum.HumanoidVisualLayers.LHand"] @@ -42,7 +40,6 @@ - map: [ "belt" ] - map: [ "id" ] - map: [ "neck" ] - - map: [ "cloak" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - map: [ "enum.HumanoidVisualLayers.Hair" ] @@ -195,11 +192,11 @@ - type: Strippable - type: UserInterface interfaces: - - key: enum.VoiceMaskUIKey.Key + enum.VoiceMaskUIKey.Key: type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key + enum.HumanoidMarkingModifierKey.Key: type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key + enum.StrippingUiKey.Key: type: StrippableBoundUserInterface - type: Puller - type: Speech @@ -350,16 +347,12 @@ state: body-overlay-2 visible: false - map: [ "gloves" ] - - map: [ "ring1" ] - - map: [ "ring2" ] - map: [ "shoes" ] - map: [ "ears" ] - map: [ "outerClothing" ] - map: [ "eyes" ] - - map: [ "belt1" ] - - map: [ "belt2" ] + - map: [ "belt" ] - map: [ "id" ] - - map: [ "keys" ] - map: [ "neck" ] - map: [ "back" ] - map: [ "enum.HumanoidVisualLayers.FacialHair" ] @@ -379,5 +372,5 @@ requiredLegs: 2 - type: UserInterface interfaces: - - key: enum.HumanoidMarkingModifierKey.Key # sure, this can go here too - type: HumanoidMarkingModifierBoundUserInterface + enum.HumanoidMarkingModifierKey.Key: # sure, this can go here too + type: HumanoidMarkingModifierBoundUserInterface \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Mobs/Species/slime.yml b/Resources/Prototypes/Entities/Mobs/Species/slime.yml index de2f88e59d..081973c3d2 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/slime.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/slime.yml @@ -26,14 +26,14 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.VoiceMaskUIKey.Key - type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key - type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.VoiceMaskUIKey.Key: + type: VoiceMaskBoundUserInterface + enum.HumanoidMarkingModifierKey.Key: + type: HumanoidMarkingModifierBoundUserInterface + enum.StrippingUiKey.Key: + type: StrippableBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/vox.yml b/Resources/Prototypes/Entities/Mobs/Species/vox.yml index a271e9d084..c79947f15c 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/vox.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/vox.yml @@ -16,6 +16,17 @@ #- type: VoxAccent # Not yet coded - type: Inventory speciesId: vox + jumpsuitShader: DisplacedStencilDraw + displacements: + jumpsuit: + layer: + sprite: Mobs/Species/Vox/displacement.rsi + state: jumpsuit + copyToShaderParameters: + # Value required, provide a dummy. Gets overridden when applied. + layerKey: dummy + parameterTexture: displacementMap + parameterUV: displacementUV - type: Speech speechVerb: Vox speechSounds: Vox @@ -49,6 +60,49 @@ damage: types: Slash: 5 # Reduce? + - type: Sprite # Need to redefine the whole order to draw the tail over their gas tank + layers: + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - map: [ "jumpsuit" ] + - map: [ "enum.HumanoidVisualLayers.LFoot" ] + - map: [ "enum.HumanoidVisualLayers.RFoot" ] + - map: [ "enum.HumanoidVisualLayers.LHand" ] + - map: [ "enum.HumanoidVisualLayers.RHand" ] + - map: [ "gloves" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt" ] + - map: [ "id" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "suitstorage" ] # This is not in the default order + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] + - map: [ "enum.HumanoidVisualLayers.Handcuffs" ] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "clownedon" ] + sprite: "Effects/creampie.rsi" + state: "creampie_vox" # Not default + visible: false - type: entity parent: BaseSpeciesDummy diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml index e8ae787636..a729eed9c8 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks.yml @@ -33,8 +33,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: entity parent: DrinkBase diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml index ca67e51792..5d092673ed 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cans.yml @@ -21,8 +21,8 @@ maxTransferAmount: 15 - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Sprite state: icon layers: diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml index 763c4210ae..156cd5a767 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_cups.yml @@ -25,8 +25,8 @@ maxTransferAmount: 10 - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink - type: Sprite state: icon diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml index 829d68279d..ad2e760141 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/drinks_special.yml @@ -29,8 +29,8 @@ state: icon - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: PhysicalComposition materialComposition: Steel: 50 diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml index 67154963d1..a6b14d722d 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Drinks/trash_drinks.yml @@ -39,8 +39,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DamageOnLand damage: types: @@ -122,8 +122,8 @@ solution: drink - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml index 70303cfdff..40cb141af7 100644 --- a/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml +++ b/Resources/Prototypes/Entities/Objects/Consumable/Food/Containers/bowl.yml @@ -37,8 +37,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Destructible thresholds: - trigger: diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml index 670b556e35..ada46c5d02 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door.yml @@ -21,5 +21,5 @@ - DoorElectronicsConfigurator - type: UserInterface interfaces: - - key: enum.DoorElectronicsConfigurationUiKey.Key - type: DoorElectronicsBoundUserInterface + enum.DoorElectronicsConfigurationUiKey.Key: + type: DoorElectronicsBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml index bb2f481644..f75fa2584e 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Electronics/door_access.yml @@ -155,6 +155,14 @@ access: [["Engineering"]] # Science +- type: entity + parent: DoorElectronics + id: DoorElectronicsMorgue + suffix: Morgue, Locked + components: + - type: AccessReader + access: [["Medical"], ["Detective"], ["Chapel"]] + - type: entity parent: DoorElectronics id: DoorElectronicsResearchDirector diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml index f6d57f53a5..3ce39afceb 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/reinforcement_teleporter.yml @@ -29,9 +29,9 @@ - type: entity parent: ReinforcementRadioSyndicate - id: ReinforcementRadioSyndicateMonkey - name: syndicate monkey reinforcement radio - description: Calls in a specially trained monkey to assist you. + id: ReinforcementRadioSyndicateAncestor + name: syndicate genetic ancestor reinforcement radio + description: Calls in a specially trained ancestor of your choosing to assist you. components: - type: GhostRole name: ghost-role-information-syndicate-monkey-reinforcement-name @@ -39,14 +39,16 @@ rules: ghost-role-information-syndicate-monkey-reinforcement-rules - type: GhostRoleMobSpawner prototype: MobMonkeySyndicateAgent + selectablePrototypes: ["SyndicateMonkey", "SyndicateKobold"] - type: entity - parent: ReinforcementRadioSyndicateMonkey - id: ReinforcementRadioSyndicateMonkeyNukeops # Reinforcement radio exclusive to nukeops uplink + parent: ReinforcementRadioSyndicateAncestor + id: ReinforcementRadioSyndicateAncestorNukeops # Reinforcement radio exclusive to nukeops uplink suffix: NukeOps components: - type: GhostRoleMobSpawner prototype: MobMonkeySyndicateAgentNukeops + selectablePrototypes: ["SyndicateMonkeyNukeops", "SyndicateKoboldNukeops"] - type: entity parent: ReinforcementRadioSyndicate diff --git a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml index 08e96d1de2..c0ce4cba18 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/Syndicate_Gadgets/war_declarator.yml @@ -18,7 +18,7 @@ key: enum.WarDeclaratorUiKey.Key - type: UserInterface interfaces: - - key: enum.WarDeclaratorUiKey.Key + enum.WarDeclaratorUiKey.Key: type: WarDeclaratorBoundUserInterface - type: WarDeclarator message: war-declarator-default-message diff --git a/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml b/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml index 7436ae7c98..e7c0b14beb 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/forensic_scanner.yml @@ -20,8 +20,8 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.ForensicScannerUiKey.Key - type: ForensicScannerBoundUserInterface + enum.ForensicScannerUiKey.Key: + type: ForensicScannerBoundUserInterface - type: ForensicScanner - type: GuideHelp guides: diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 73976b48e0..e1efc03993 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -89,16 +89,16 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.PdaUiKey.Key - type: PdaBoundUserInterface - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface - - key: enum.RingerUiKey.Key - type: RingerBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.HealthAnalyzerUiKey.Key - type: HealthAnalyzerBoundUserInterface + enum.PdaUiKey.Key: + type: PdaBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface + enum.RingerUiKey.Key: + type: RingerBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.HealthAnalyzerUiKey.Key: + type: HealthAnalyzerBoundUserInterface - type: Tag tags: - DoorBumpOpener diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml index fa9071d3e9..b4e336b37d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_beacon.yml @@ -30,8 +30,8 @@ singleUser: true - type: UserInterface interfaces: - - key: enum.NavMapBeaconUiKey.Key - type: NavMapBeaconBoundUserInterface + enum.NavMapBeaconUiKey.Key: + type: NavMapBeaconBoundUserInterface - type: Item size: Small - type: SubFloorHide diff --git a/Resources/Prototypes/Entities/Objects/Devices/station_map.yml b/Resources/Prototypes/Entities/Objects/Devices/station_map.yml index c37d8935f3..0d2f890a1d 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/station_map.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/station_map.yml @@ -28,7 +28,7 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - - key: enum.StationMapUiKey.Key + enum.StationMapUiKey.Key: type: StationMapBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml index 07d918b576..684260b737 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/Instruments/base_instruments.yml @@ -13,8 +13,8 @@ key: enum.InstrumentUiKey.Key - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface - type: Item size: Normal - type: StaticPrice @@ -51,8 +51,8 @@ acts: ["Destruction"] - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml index d8f11cdea2..63175dc89a 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/candy_bucket.yml @@ -36,8 +36,8 @@ ents: [] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface # to prevent bag open/honk spam - type: UseDelay delay: 0.5 diff --git a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml index cb755b161a..4aab2efdb9 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/crayons.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/crayons.yml @@ -18,8 +18,8 @@ - type: SpaceGarbage - type: UserInterface interfaces: - - key: enum.CrayonUiKey.Key - type: CrayonBoundUserInterface + enum.CrayonUiKey.Key: + type: CrayonBoundUserInterface - type: Crayon capacity: 15 - type: Food diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 537562f461..1b9c5303c6 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -13,10 +13,12 @@ program: 2 - type: UserInterface interfaces: - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.StationMapUiKey.Key - type: UntrackedStationMapBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + requireInputValidation: false + enum.StationMapUiKey.Key: + type: UntrackedStationMapBoundUserInterface + requireInputValidation: false - type: Sprite sprite: Objects/Fun/pai.rsi layers: diff --git a/Resources/Prototypes/Entities/Objects/Misc/books.yml b/Resources/Prototypes/Entities/Objects/Misc/books.yml index 78f9edc9c5..e44e981a6c 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/books.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/books.yml @@ -25,8 +25,8 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Tag tags: - Book @@ -49,7 +49,7 @@ color: "#0a2a6b" - state: decor_wingette color: "#082561" - - state: icon_text + - state: icon_text color: gold - state: icon_planet color: "#42b6f5" @@ -361,7 +361,7 @@ description: Each book is unique! What is hidden in this one? components: - type: RandomMetadata - nameSegments: + nameSegments: - book_hint_appearance - book_type - type: RandomSprite @@ -410,7 +410,7 @@ icon_skull: "" icon_text: "" icon_text2: "" - icon_text3: "" + icon_text3: "" overlay: overlay_blood: "" overlay_dirt: Sixteen @@ -451,7 +451,7 @@ - book_story_element_trait - "." storySeparator: "" - + - type: entity parent: BookBase id: BookAtmosDistro @@ -530,4 +530,4 @@ - state: icon_corner color: gold - type: Paper - content: book-text-atmos-vents \ No newline at end of file + content: book-text-atmos-vents diff --git a/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml b/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml new file mode 100644 index 0000000000..47cae456fa --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Misc/chopsticks.yml @@ -0,0 +1,31 @@ +- type: entity + parent: BaseItem + id: ChopSticks + name: chopsticks + description: A very traditional utensil. + components: + - type: Sprite + sprite: Objects/Misc/chopstick.rsi + state: icon + - type: Item + sprite: Objects/Misc/chopstick.rsi + size: Small + - type: Utensil + types: + - Fork + +- type: entity + parent: BaseItem + name: paired chopsticks + id: PairedChopsticks + description: You should probably seperate them. + components: + - type: SpawnItemsOnUse + items: + - id: ChopSticks + - type: Sprite + sprite: Objects/Misc/chopstick.rsi + state: paired + - type: EmitSoundOnUse + sound: + path: /Audio/Effects/chopstickbreak.ogg diff --git a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml index b44b71930f..3de1afe8b8 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/identification_cards.yml @@ -658,9 +658,9 @@ default: PassengerIDCard - type: UserInterface interfaces: - - key: enum.AgentIDCardUiKey.Key + enum.AgentIDCardUiKey.Key: type: AgentIDCardBoundUserInterface - - key: enum.ChameleonUiKey.Key + enum.ChameleonUiKey.Key: type: ChameleonBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Misc/paper.yml b/Resources/Prototypes/Entities/Objects/Misc/paper.yml index 0c52b2381c..08e5e3caaf 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/paper.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/paper.yml @@ -22,8 +22,8 @@ requireHands: false - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: Item size: Tiny - type: Tag @@ -264,8 +264,8 @@ key: enum.PaperUiKey.Key - type: UserInterface interfaces: - - key: enum.PaperUiKey.Key - type: PaperBoundUserInterface + enum.PaperUiKey.Key: + type: PaperBoundUserInterface - type: entity parent: Paper @@ -695,10 +695,10 @@ key: enum.CargoConsoleUiKey.Orders - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Orders - type: CargoOrderConsoleBoundUserInterface - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: MeleeWeapon wideAnimationRotation: 180 damage: diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index 2336945f17..a0f5e254d5 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -126,7 +126,7 @@ ents: [ ] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key + enum.StorageUiKey.Key: type: StorageBoundUserInterface - type: entity @@ -160,8 +160,8 @@ Telecrystal: 0 - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: entity parent: BaseSubdermalImplant diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index b4f95d81e5..f6b2b0a70c 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -40,8 +40,8 @@ - 0,0,0,1 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Tag tags: - Book diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml index 706407b8a6..55a58ef18a 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/urn.yml @@ -9,11 +9,11 @@ - 0,0,0,1 - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Sprite sprite: Objects/Specific/Chapel/chaplainurn.rsi state: icon - type: Item size: Normal - sprite: Objects/Specific/Chapel/chaplainurn.rsi \ No newline at end of file + sprite: Objects/Specific/Chapel/chaplainurn.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml b/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml index 0894d6a754..ca74dca8a7 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Kitchen/foodcarts.yml @@ -44,8 +44,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Storage maxItemSize: Normal grid: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml index 6e5362d9bb..dab6f9f20f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Mech/mechs.yml @@ -39,8 +39,8 @@ doAfterDelay: 10 - type: UserInterface interfaces: - - key: enum.MechUiKey.Key - type: MechBoundUserInterface + enum.MechUiKey.Key: + type: MechBoundUserInterface - type: MeleeWeapon hidden: true attackRate: 0.75 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml index 6dfe039cc0..f30e1cf633 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/handheld_crew_monitor.yml @@ -20,7 +20,7 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - type: CrewMonitoringConsole - type: DeviceNetwork diff --git a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml index 64bd04569b..4f8b6f2936 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Medical/healthanalyzer.yml @@ -20,7 +20,7 @@ closeOnHandDeselect: false - type: UserInterface interfaces: - - key: enum.HealthAnalyzerUiKey.Key + enum.HealthAnalyzerUiKey.Key: type: HealthAnalyzerBoundUserInterface - type: HealthAnalyzer scanningEndSound: diff --git a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml index b02c7109d3..4250d9ccdd 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Research/anomaly.yml @@ -13,7 +13,7 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.AnomalyScannerUiKey.Key + enum.AnomalyScannerUiKey.Key: type: AnomalyScannerBoundUserInterface - type: AnomalyScanner - type: GuideHelp diff --git a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml index e896832e5f..d7b0a566e1 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Service/barber.yml @@ -13,8 +13,8 @@ closeOnHandDeselect: true - type: UserInterface interfaces: - - key: enum.MagicMirrorUiKey.Key - type: MagicMirrorBoundUserInterface + enum.MagicMirrorUiKey.Key: + type: MagicMirrorBoundUserInterface - type: MeleeWeapon wideAnimationRotation: -135 attackRate: 1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml index e5f7a5ec3e..2241cdd4aa 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/item_artifacts.yml @@ -45,14 +45,14 @@ ano01_on: Rainbow - type: UserInterface #needs to be here for certain effects interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.IntercomUiKey.Key - type: IntercomBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.IntercomUiKey.Key: + type: IntercomBoundUserInterface - type: Appearance - type: Item size: Normal diff --git a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml index 57b3dab921..4c3dac1816 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Xenoarchaeology/structure_artifacts.yml @@ -22,14 +22,14 @@ noRot: true - type: UserInterface #needs to be here for certain effects interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface - - key: enum.InstrumentUiKey.Key - type: InstrumentBoundUserInterface - - key: enum.IntercomUiKey.Key - type: IntercomBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface + enum.InstrumentUiKey.Key: + type: InstrumentBoundUserInterface + enum.IntercomUiKey.Key: + type: IntercomBoundUserInterface - type: Reactive groups: Acidic: [Touch] diff --git a/Resources/Prototypes/Entities/Objects/Specific/atmos.yml b/Resources/Prototypes/Entities/Objects/Specific/atmos.yml index 0dc714aba0..acf5f6f240 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/atmos.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/atmos.yml @@ -17,8 +17,8 @@ key: enum.GasAnalyzerUiKey.Key - type: UserInterface interfaces: - - key: enum.GasAnalyzerUiKey.Key - type: GasAnalyzerBoundUserInterface + enum.GasAnalyzerUiKey.Key: + type: GasAnalyzerBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml index 8034844a82..4bd71f898d 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemical-containers.yml @@ -36,7 +36,7 @@ solution: beaker - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key + enum.TransferAmountUiKey.Key: type: TransferAmountBoundUserInterface - type: Drink solution: beaker diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml index 6c81fa9466..3005f6b947 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-bottles.yml @@ -44,8 +44,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Item size: Tiny sprite: Objects/Specific/Chemistry/beaker.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml index 65f5fbb5d0..ed36861bb2 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry-vials.yml @@ -50,8 +50,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Item size: Tiny sprite: Objects/Specific/Chemistry/vial.rsi diff --git a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml index fdf58dc484..4989320e6f 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/chemistry.yml @@ -45,8 +45,8 @@ solution: beaker - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink solution: beaker - type: Appearance @@ -138,8 +138,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Drink solution: beaker - type: Appearance @@ -276,8 +276,8 @@ solution: dropper - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: Spillable solution: injector - type: Item diff --git a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml index aa17685c24..459beeef18 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/syndicate.yml @@ -63,8 +63,8 @@ heldPrefix: old-radio - type: UserInterface interfaces: - - key: enum.StoreUiKey.Key - type: StoreBoundUserInterface + enum.StoreUiKey.Key: + type: StoreBoundUserInterface - type: ActivatableUI key: enum.StoreUiKey.Key - type: Store diff --git a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml index 9a367841c4..b6c7c49855 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml @@ -62,7 +62,7 @@ doAfter: 0.5 - type: UserInterface interfaces: - - key: enum.AccessOverriderUiKey.Key + enum.AccessOverriderUiKey.Key: type: AccessOverriderBoundUserInterface - type: ActivatableUI key: enum.AccessOverriderUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml index 77803a13ec..77c5e54897 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/bucket.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/bucket.yml @@ -35,8 +35,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: MeleeWeapon soundNoDamage: path: "/Audio/Effects/Fluids/splat.ogg" diff --git a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml index 295412debc..87959ebef3 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/cowtools.yml @@ -142,8 +142,8 @@ - type: GasAnalyzer - type: UserInterface interfaces: - - key: enum.GasAnalyzerUiKey.Key - type: GasAnalyzerBoundUserInterface + enum.GasAnalyzerUiKey.Key: + type: GasAnalyzerBoundUserInterface - type: Appearance - type: entity diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 2f281e141a..65942e330e 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -19,8 +19,8 @@ key: enum.SharedGasTankUiKey.Key - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key - type: GasTankBoundUserInterface + enum.SharedGasTankUiKey.Key: + type: GasTankBoundUserInterface - type: GasTank outputPressure: 21.3 air: diff --git a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml index 1d9bb47e0e..4b46a93353 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/hand_labeler.yml @@ -17,7 +17,7 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.HandLabelerUiKey.Key + enum.HandLabelerUiKey.Key: type: HandLabelerBoundUserInterface - type: HandLabeler whitelist: diff --git a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml index 5647737219..5938193181 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/handheld_mass_scanner.yml @@ -34,7 +34,7 @@ singleUser: true - type: UserInterface interfaces: - - key: enum.RadarConsoleUiKey.Key + enum.RadarConsoleUiKey.Key: type: RadarConsoleBoundUserInterface - type: StaticPrice price: 150 @@ -69,4 +69,4 @@ name: power-cell-slot-component-slot-name-default startingItem: PowerCellMicroreactor disableEject: true - swap: false \ No newline at end of file + swap: false diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index f40f47115b..04f8b9f9f6 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -40,7 +40,7 @@ size: Huge - type: UserInterface interfaces: - - key: enum.SharedGasTankUiKey.Key + enum.SharedGasTankUiKey.Key: type: GasTankBoundUserInterface - type: Clothing sprite: Objects/Tanks/Jetpacks/blue.rsi diff --git a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml index 903b8d3f90..ad31a6ec02 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/spray_painter.yml @@ -13,8 +13,8 @@ key: enum.SprayPainterUiKey.Key - type: UserInterface interfaces: - - key: enum.SprayPainterUiKey.Key - type: SprayPainterBoundUserInterface + enum.SprayPainterUiKey.Key: + type: SprayPainterBoundUserInterface - type: SprayPainter colorPalette: red: '#FF1212FF' diff --git a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml index 695725140f..0a0c702324 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/toolbox.yml @@ -167,5 +167,5 @@ key: enum.ThiefBackpackUIKey.Key - type: UserInterface interfaces: - - key: enum.ThiefBackpackUIKey.Key + enum.ThiefBackpackUIKey.Key: type: ThiefBackpackBoundUserInterface diff --git a/Resources/Prototypes/Entities/Objects/Tools/tools.yml b/Resources/Prototypes/Entities/Objects/Tools/tools.yml index b3103816eb..452a905329 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/tools.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/tools.yml @@ -216,11 +216,11 @@ inHandsOnly: true - type: UserInterface interfaces: - - key: enum.NetworkConfiguratorUiKey.List + enum.NetworkConfiguratorUiKey.List: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Configure + enum.NetworkConfiguratorUiKey.Configure: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Link + enum.NetworkConfiguratorUiKey.Link: type: NetworkConfiguratorBoundUserInterface - type: Tag tags: @@ -272,11 +272,11 @@ - DoorElectronicsConfigurator - type: UserInterface interfaces: - - key: enum.NetworkConfiguratorUiKey.List + enum.NetworkConfiguratorUiKey.List: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Configure + enum.NetworkConfiguratorUiKey.Configure: type: NetworkConfiguratorBoundUserInterface - - key: enum.NetworkConfiguratorUiKey.Link + enum.NetworkConfiguratorUiKey.Link: type: NetworkConfiguratorBoundUserInterface - type: StaticPrice price: 56 @@ -389,8 +389,8 @@ price: 100 - type: UserInterface interfaces: - - key: enum.RcdUiKey.Key - type: RCDMenuBoundUserInterface + enum.RcdUiKey.Key: + type: RCDMenuBoundUserInterface - type: ActivatableUI key: enum.RcdUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml index 063268d8b5..98ad35b70d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/caseless_rifle.yml @@ -65,27 +65,6 @@ zeroVisible: false - type: Appearance -- type: entity - parent: BaseMagazineBoxCaselessRifle - id: MagazineBoxCaselessRifleBigRubber - name: ammunition box (.25 caseless rubber) - components: - - type: BallisticAmmoProvider - capacity: 200 - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: base-b - map: ["enum.GunVisualLayers.Base"] - - state: magb-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber-b - - type: MagazineVisuals - magState: magb - steps: 2 - zeroVisible: false - - type: Appearance - - type: entity parent: BaseMagazineBoxCaselessRifle id: MagazineBoxCaselessRifle @@ -114,18 +93,3 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - state: practice - -- type: entity - parent: BaseMagazineBoxCaselessRifle - id: MagazineBoxCaselessRifleRubber - name: ammunition box (.25 caseless rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml index 0670e37636..5b2ec79491 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/light_rifle.yml @@ -74,21 +74,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxLightRifle - id: MagazineBoxLightRifleRubber - name: ammunition box (.30 rifle rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeLightRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxLightRifleIncendiary parent: BaseMagazineBoxLightRifle @@ -117,4 +102,4 @@ map: ["enum.GunVisualLayers.Base"] - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - - state: uranium \ No newline at end of file + - state: uranium diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml index 65f6bff00e..f5b2955e08 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/magnum.yml @@ -53,21 +53,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxMagnum - id: MagazineBoxMagnumRubber - name: ammunition box (.45 magnum rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxMagnumIncendiary parent: BaseMagazineBoxMagnum diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml index 9f6a8e8257..fbd2044690 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/pistol.yml @@ -54,21 +54,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxPistol - id: MagazineBoxPistolRubber - name: ammunition box (.35 auto rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxPistolIncendiary parent: BaseMagazineBoxPistol diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml index c321b77d10..54d5327dda 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Boxes/rifle.yml @@ -44,27 +44,6 @@ zeroVisible: false - type: Appearance -- type: entity - parent: BaseMagazineBoxRifle - id: MagazineBoxRifleBigRubber - name: ammunition box (.20 rifle rubber) - components: - - type: BallisticAmmoProvider - capacity: 200 - proto: CartridgeRiflePractice - - type: Sprite - layers: - - state: base-b - map: ["enum.GunVisualLayers.Base"] - - state: magb-1 - map: ["enum.GunVisualLayers.Mag"] - - state: practice-b - - type: MagazineVisuals - magState: magb - steps: 2 - zeroVisible: false - - type: Appearance - - type: entity parent: BaseMagazineBoxRifle id: MagazineBoxRifle @@ -94,21 +73,6 @@ map: ["enum.GunVisualLayers.Mag"] - state: practice -- type: entity - parent: BaseMagazineBoxRifle - id: MagazineBoxRifleRubber - name: ammunition box (.20 rifle rubber) - components: - - type: BallisticAmmoProvider - proto: CartridgeRifleRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - state: rubber - - type: entity id: MagazineBoxRifleIncendiary parent: BaseMagazineBoxRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml index 8d7b94a50a..9e46725b94 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/caseless_rifle.yml @@ -43,18 +43,3 @@ - state: tip map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" - -- type: entity - id: CartridgeCaselessRifleRubber - name: cartridge (.25 caseless rubber) - parent: BaseCartridgeCaselessRifle - components: - - type: CartridgeAmmo - proto: BulletCaselessRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml index cda812ed03..80623f874e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/light_rifle.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgeLightRifleRubber - name: cartridge (.30 rifle rubber) - parent: BaseCartridgeLightRifle - components: - - type: CartridgeAmmo - proto: BulletLightRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeLightRifleIncendiary name: cartridge (.30 rifle incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml index c5c5ad1f8d..b6cb65db05 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/magnum.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgeMagnumRubber - name: cartridge (.45 magnum rubber) - parent: BaseCartridgeMagnum - components: - - type: CartridgeAmmo - proto: BulletMagnumRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeMagnumIncendiary name: cartridge (.45 magnum incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml index 69aa8664aa..c097d7746e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/pistol.yml @@ -41,21 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" -- type: entity - id: CartridgePistolRubber - name: cartridge (.35 auto rubber) - parent: BaseCartridgePistol - components: - - type: CartridgeAmmo - proto: BulletPistolRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgePistolIncendiary name: cartridge (.35 auto incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml index c47688ab01..21e6daa2b8 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Cartridges/rifle.yml @@ -41,22 +41,6 @@ map: [ "enum.AmmoVisualLayers.Tip" ] color: "#dbdbdb" - -- type: entity - id: CartridgeRifleRubber - name: cartridge (.20 rifle rubber) - parent: BaseCartridgeRifle - components: - - type: CartridgeAmmo - proto: BulletRifleRubber - - type: Sprite - layers: - - state: base - map: [ "enum.AmmoVisualLayers.Base" ] - - state: tip - map: [ "enum.AmmoVisualLayers.Tip" ] - color: "#43c4f7" - - type: entity id: CartridgeRifleIncendiary name: cartridge (.20 rifle incendiary) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml index 0d16f1e966..2c23d803e2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/caseless_rifle.yml @@ -132,26 +132,6 @@ zeroVisible: false - type: Appearance -- type: entity - id: MagazinePistolCaselessRifleRubber - name: "pistol magazine (.25 caseless rubber)" - parent: BaseMagazinePistolCaselessRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - capacity: 10 - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: MagazineVisuals - magState: mag - steps: 6 - zeroVisible: false - - type: Appearance - - type: entity id: MagazineCaselessRifle name: "magazine (.25 caseless)" @@ -180,20 +160,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineCaselessRifleRubber - name: "magazine (.25 caseless rubber)" - parent: BaseMagazineCaselessRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineCaselessRifleShort name: "short magazine (.25 caseless)" @@ -223,18 +189,3 @@ map: ["enum.GunVisualLayers.Base"] - state: mag-1 map: ["enum.GunVisualLayers.Mag"] - -- type: entity - id: MagazineCaselessRifleShortRubber - name: "short magazine (.25 caseless rubber)" - parent: BaseMagazineCaselessRifleShort - components: - - type: BallisticAmmoProvider - proto: CartridgeCaselessRifleRubber - capacity: 20 - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml index d420a5c3d8..ebb98b879c 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/light_rifle.yml @@ -82,20 +82,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineLightRifleRubber - name: "magazine (.30 rifle rubber)" - parent: BaseMagazineLightRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeLightRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineLightRifleUranium name: "magazine (.30 rifle uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml index 6a1cc041de..1d8437a884 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/magnum.yml @@ -75,20 +75,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineMagnumRubber - name: pistol magazine (.45 magnum rubber) - parent: BaseMagazineMagnum - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineMagnumUranium name: pistol magazine (.45 magnum uranium) @@ -145,20 +131,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineMagnumSubMachineGunRubber - name: "Vector magazine (.45 magnum rubber)" - parent: BaseMagazineMagnumSubMachineGun - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineMagnumSubMachineGunUranium name: "Vector magazine (.45 magnum uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml index 679acd299c..3526281907 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/pistol.yml @@ -156,20 +156,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazinePistolRubber - name: pistol magazine (.35 auto rubber) - parent: BaseMagazinePistol - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazinePistolHighCapacity name: machine pistol magazine (.35 auto) @@ -246,20 +232,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazinePistolSubMachineGunRubber - name: SMG magazine (.35 auto rubber) - parent: BaseMagazinePistolSubMachineGun - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazinePistolSubMachineGunUranium name: SMG magazine (.35 auto rubber) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml index 5ba57dce4e..d060af2c21 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Magazines/rifle.yml @@ -61,20 +61,6 @@ - state: mag-1 map: ["enum.GunVisualLayers.Mag"] -- type: entity - id: MagazineRifleRubber - name: "magazine (.20 rifle rubber)" - parent: BaseMagazineRifle - components: - - type: BallisticAmmoProvider - proto: CartridgeRifleRubber - - type: Sprite - layers: - - state: rubber - map: ["enum.GunVisualLayers.Base"] - - state: mag-1 - map: ["enum.GunVisualLayers.Mag"] - - type: entity id: MagazineRifleUranium name: "magazine (.20 rifle uranium)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml index 5ce0bf82fe..741f0a4e1a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/caseless_rifle.yml @@ -19,14 +19,3 @@ damage: types: Blunt: 2 - -- type: entity - id: BulletCaselessRifleRubber - name: bullet (.25 caseless rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml index 3a0df2ac6c..c6a4808b77 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/light_rifle.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletLightRifleRubber - name: bullet (.20 rifle rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletLightRifleIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml index 1b5cf7890b..798de9fa85 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/magnum.yml @@ -20,19 +20,6 @@ types: Blunt: 1 -- type: entity - id: BulletMagnumRubber - name: bullet (.45 magnum rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: StaminaDamageOnCollide - damage: 35 # 3 hits to stun cuz revolver - - type: entity id: BulletMagnumIncendiary parent: BaseBulletIncendiary @@ -44,7 +31,7 @@ types: Blunt: 3 Heat: 32 - + - type: entity id: BulletMagnumAP name: bullet (.45 magnum armor-piercing) diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml index 086a8dc914..3cfcc0cf20 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/pistol.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletPistolRubber - name: bullet (.35 auto rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletPistolIncendiary parent: BaseBulletIncendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml index 2113916cf5..6f6fa0f907 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/Projectiles/rifle.yml @@ -20,17 +20,6 @@ types: Blunt: 2 -- type: entity - id: BulletRifleRubber - name: bullet (0.20 rifle rubber) - parent: BaseBulletRubber - noSpawn: true - components: - - type: Projectile - damage: - types: - Blunt: 3 - - type: entity id: BulletRifleIncendiary parent: BaseBulletIncendiary @@ -42,7 +31,7 @@ types: Blunt: 2 Heat: 15 - + - type: entity id: BulletRifleUranium parent: BaseBulletUranium @@ -54,4 +43,4 @@ types: Radiation: 7 Piercing: 8 - + diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml index b06ca64d8f..fda8046cc6 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/magnum.yml @@ -59,26 +59,6 @@ zeroVisible: false - type: Appearance -- type: entity - id: SpeedLoaderMagnumRubber - name: "speed loader (.45 magnum rubber)" - parent: BaseSpeedLoaderMagnum - components: - - type: BallisticAmmoProvider - proto: CartridgeMagnumRubber - - type: Sprite - sprite: Objects/Weapons/Guns/Ammunition/SpeedLoaders/Magnum/magnum_speed_loader.rsi - layers: - - state: base - map: [ "enum.GunVisualLayers.Base" ] - - state: rubber-6 - map: [ "enum.GunVisualLayers.Mag" ] - - type: MagazineVisuals - magState: rubber - steps: 7 - zeroVisible: false - - type: Appearance - - type: entity id: SpeedLoaderMagnumAP name: "speed loader (.45 magnum armor-piercing)" diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml index 1fef25f16f..3ce419b2c3 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Ammunition/SpeedLoaders/pistol.yml @@ -57,22 +57,3 @@ steps: 7 zeroVisible: false - type: Appearance - -- type: entity - id: SpeedLoaderPistolRubber - name: "speed loader (.35 auto rubber)" - parent: BaseSpeedLoaderPistol - components: - - type: BallisticAmmoProvider - proto: CartridgePistolRubber - - type: Sprite - layers: - - state: base - map: ["enum.GunVisualLayers.Base"] - - state: rubber-6 - map: ["enum.GunVisualLayers.Mag"] - - type: MagazineVisuals - magState: rubber - steps: 7 - zeroVisible: false - - type: Appearance diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml index e925bdab87..c96a1522d2 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Basic/watergun.yml @@ -34,8 +34,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: DrawableSolution solution: chamber - type: RefillableSolution diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml index 49b2eeaada..79f2e7b45f 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/LMGs/lmgs.yml @@ -14,6 +14,7 @@ slots: - Back - type: Wieldable + unwieldOnUse: false - type: GunWieldBonus minAngle: -20 maxAngle: -20 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml index 9507eada3b..f3a8215e3d 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Pistols/pistols.yml @@ -171,35 +171,11 @@ soundGunshot: path: /Audio/Weapons/Guns/Gunshots/mk58.ogg -- type: entity - id: WeaponPistolMk58Nonlethal - parent: WeaponPistolMk58 - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazinePistolRubber - insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg - priority: 2 - whitelist: - tags: - - MagazinePistol - gun_chamber: - name: Chamber - startingItem: CartridgePistolRubber - priority: 1 - whitelist: - tags: - - CartridgePistol - - type: entity name: N1984 parent: BaseWeaponPistol id: WeaponPistolN1984 # the spaces in description are for formatting. - description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. + description: The sidearm of any self respecting officer. Comes in .45 magnum, the lord's caliber. components: - type: Sprite sprite: Objects/Weapons/Guns/Pistols/N1984.rsi @@ -238,28 +214,3 @@ whitelist: tags: - CartridgeMagnum - -- type: entity - name: N1984 - parent: WeaponPistolN1984 - id: WeaponPistolN1984Nonlethal - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineMagnumRubber - insertSound: /Audio/Weapons/Guns/MagIn/pistol_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/pistol_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineMagnum - gun_chamber: - name: Chamber - startingItem: CartridgeMagnumRubber - priority: 1 - whitelist: - tags: - - CartridgeMagnum diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index 91fdaa6481..825d3cc4a7 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -104,25 +104,6 @@ types: Blunt: 1 -- type: entity - id: BaseBulletRubber - name: base bullet rubber - parent: BaseBullet - noSpawn: true - components: - - type: Sprite - sprite: Objects/Weapons/Guns/Projectiles/projectiles2.rsi - layers: - - state: rubber - - type: Projectile - damage: - types: - Blunt: 3 - soundHit: - path: /Audio/Weapons/Guns/Hits/snap.ogg - - type: StaminaDamageOnCollide - damage: 22 # 5 hits to stun sounds reasonable - - type: entity id: BaseBulletIncendiary name: base bullet incendiary diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml index 5bc8125eba..bc3b65ff3a 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Rifles/rifles.yml @@ -186,28 +186,3 @@ steps: 1 zeroVisible: true - type: Appearance - -- type: entity - name: Lecter - parent: WeaponRifleLecter - id: WeaponRifleLecterRubber - suffix: Non-lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineRifleRubber - insertSound: /Audio/Weapons/Guns/MagIn/ltrifle_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/ltrifle_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineRifle - gun_chamber: - name: Chamber - startingItem: CartridgeRifleRubber - priority: 1 - whitelist: - tags: - - CartridgeRifle diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml index 7398374e86..2d6e768c41 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/SMGs/smgs.yml @@ -20,7 +20,7 @@ maxAngle: 16 fireRate: 8 angleIncrease: 3 - angleDecay: 16 + angleDecay: 16 selectedMode: FullAuto availableModes: - SemiAuto @@ -230,7 +230,7 @@ minAngle: 1 maxAngle: 6 angleIncrease: 1.5 - angleDecay: 6 + angleDecay: 6 selectedMode: FullAuto shotsPerBurst: 5 availableModes: @@ -260,55 +260,3 @@ steps: 6 zeroVisible: true - type: Appearance - -# Rubber -- type: entity - name: Drozd - parent: WeaponSubMachineGunDrozd - id: WeaponSubMachineGunDrozdRubber - suffix: Non-Lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazinePistolSubMachineGunRubber - insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg - priority: 2 - whitelist: - tags: - - MagazinePistolSubMachineGun - gun_chamber: - name: Chamber - startingItem: CartridgePistolRubber - priority: 1 - whitelist: - tags: - - CartridgePistol - -- type: entity - name: Vector - parent: WeaponSubMachineGunVector - id: WeaponSubMachineGunVectorRubber - description: An excellent fully automatic Heavy SMG. Uses .45 magnum ammo. - suffix: Non-Lethal - components: - - type: ItemSlots - slots: - gun_magazine: - name: Magazine - startingItem: MagazineMagnumSubMachineGunRubber - insertSound: /Audio/Weapons/Guns/MagIn/smg_magin.ogg - ejectSound: /Audio/Weapons/Guns/MagOut/smg_magout.ogg - priority: 2 - whitelist: - tags: - - MagazineMagnumSubMachineGun - gun_chamber: - name: Chamber - startingItem: CartridgeMagnumRubber - priority: 1 - whitelist: - tags: - - CartridgeMagnum diff --git a/Resources/Prototypes/Entities/Objects/base_item.yml b/Resources/Prototypes/Entities/Objects/base_item.yml index 55c4bbd6b7..39bb8c3a2a 100644 --- a/Resources/Prototypes/Entities/Objects/base_item.yml +++ b/Resources/Prototypes/Entities/Objects/base_item.yml @@ -52,8 +52,8 @@ - type: Storage - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml index d661009b6d..082f5e0799 100644 --- a/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml +++ b/Resources/Prototypes/Entities/Structures/Dispensers/base_structuredispensers.yml @@ -30,8 +30,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ReagentDispenserUiKey.Key - type: ReagentDispenserBoundUserInterface + enum.ReagentDispenserUiKey.Key: + type: ReagentDispenserBoundUserInterface - type: Anchorable - type: Pullable - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml index 5a337cb136..d798d0c3be 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/access.yml @@ -235,6 +235,16 @@ containers: board: [ DoorElectronicsChemistry ] +- type: entity + parent: AirlockMedical + id: AirlockMedicalMorgueLocked + suffix: Morgue, Locked + components: + - type: ContainerFill + containers: + board: [ DoorElectronicsMorgue ] + + - type: entity parent: AirlockScience id: AirlockScienceLocked diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml index 8b2ce8ab56..86657eb46e 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/base_structureairlocks.yml @@ -104,8 +104,8 @@ - type: SpawnOnOverload - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight noAirWhenFullyAirBlocked: false - type: RadiationBlocker diff --git a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml index 2a8cc0c526..559dca704c 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Airlocks/highsec.yml @@ -79,8 +79,8 @@ alwaysRandomize: true - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight - type: Occluder - type: Damageable diff --git a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml index a5b8a8dc74..fcdb432dce 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Firelocks/firelock.yml @@ -90,7 +90,7 @@ - type: WiresPanel - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Physics canCollide: false diff --git a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml index 1819c9d0ef..dc2acb7927 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Shutter/shutters.yml @@ -56,8 +56,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Airtight - type: RadiationBlocker resistance: 2 diff --git a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml index a6515b52c6..1ec6c04ffe 100644 --- a/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml +++ b/Resources/Prototypes/Entities/Structures/Doors/Windoors/base_structurewindoors.yml @@ -66,7 +66,7 @@ damageContainer: Inorganic damageModifierSet: Glass - type: ExaminableDamage - messages: WindowMessages + messages: WindowMessages - type: RCDDeconstructable cost: 8 delay: 8 @@ -130,8 +130,8 @@ layoutId: Airlock - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: Appearance - type: WiresVisuals - type: Airtight diff --git a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml index 792f076679..30aa793767 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/bookshelf.yml @@ -59,8 +59,8 @@ - Spellbook - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: InteractionOutline - type: ContainerContainer containers: diff --git a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml index 2caa4010ca..b79c0e6213 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/dresser.yml @@ -33,8 +33,8 @@ storagebase: !type:Container - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: InteractionOutline - type: Clickable - type: Tag diff --git a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml index f02b126248..0824d21ae0 100644 --- a/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml +++ b/Resources/Prototypes/Entities/Structures/Furniture/toilet.yml @@ -66,8 +66,8 @@ price: 25 - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: RatKingRummageable - type: SolutionContainerManager solutions: diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml index 40fa8cf472..6a351d47f0 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/arcades.yml @@ -138,9 +138,9 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SpaceVillainArcadeUiKey.Key + enum.SpaceVillainArcadeUiKey.Key: type: SpaceVillainArcadeBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Computer board: SpaceVillainArcadeComputerCircuitboard @@ -182,9 +182,9 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.BlockGameUiKey.Key + enum.BlockGameUiKey.Key: type: BlockGameBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Computer board: BlockGameArcadeComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml index ef15f73b32..56570697df 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/computers.yml @@ -31,8 +31,8 @@ key: enum.EmergencyConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.EmergencyConsoleUiKey.Key - type: EmergencyConsoleBoundUserInterface + enum.EmergencyConsoleUiKey.Key: + type: EmergencyConsoleBoundUserInterface - type: PointLight radius: 1.5 energy: 1.6 @@ -52,8 +52,8 @@ key: enum.ShuttleConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.ShuttleConsoleUiKey.Key - type: ShuttleConsoleBoundUserInterface + enum.ShuttleConsoleUiKey.Key: + type: ShuttleConsoleBoundUserInterface - type: RadarConsole - type: WorldLoader radius: 256 @@ -211,8 +211,8 @@ key: enum.IFFConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IFFConsoleUiKey.Key - type: IFFConsoleBoundUserInterface + enum.IFFConsoleUiKey.Key: + type: IFFConsoleBoundUserInterface - type: Computer board: ComputerIFFCircuitboard @@ -231,8 +231,8 @@ key: enum.IFFConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IFFConsoleUiKey.Key - type: IFFConsoleBoundUserInterface + enum.IFFConsoleUiKey.Key: + type: IFFConsoleBoundUserInterface - type: Computer board: ComputerIFFSyndicateCircuitboard @@ -271,8 +271,8 @@ key: enum.PowerMonitoringConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.PowerMonitoringConsoleUiKey.Key - type: PowerMonitoringConsoleBoundUserInterface + enum.PowerMonitoringConsoleUiKey.Key: + type: PowerMonitoringConsoleBoundUserInterface - type: entity parent: BaseComputer @@ -306,8 +306,8 @@ - type: CriminalRecordsConsole - type: UserInterface interfaces: - - key: enum.CriminalRecordsConsoleKey.Key - type: CriminalRecordsConsoleBoundUserInterface + enum.CriminalRecordsConsoleKey.Key: + type: CriminalRecordsConsoleBoundUserInterface - type: ActivatableUI key: enum.CriminalRecordsConsoleKey.Key - type: Sprite @@ -341,8 +341,8 @@ - type: GeneralStationRecordConsole - type: UserInterface interfaces: - - key: enum.GeneralStationRecordConsoleKey.Key - type: GeneralStationRecordConsoleBoundUserInterface + enum.GeneralStationRecordConsoleKey.Key: + type: GeneralStationRecordConsoleBoundUserInterface - type: ActivatableUI key: enum.GeneralStationRecordConsoleKey.Key - type: PointLight @@ -381,7 +381,7 @@ key: enum.CrewMonitoringUIKey.Key - type: UserInterface interfaces: - - key: enum.CrewMonitoringUIKey.Key + enum.CrewMonitoringUIKey.Key: type: CrewMonitoringBoundUserInterface - type: CrewMonitoringConsole - type: DeviceNetwork @@ -416,10 +416,10 @@ key: enum.ResearchConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.ResearchConsoleUiKey.Key - type: ResearchConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchConsoleUiKey.Key: + type: ResearchConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - type: Computer @@ -464,10 +464,10 @@ key: enum.ArtifactAnalzyerUiKey.Key - type: UserInterface interfaces: - - key: enum.ArtifactAnalzyerUiKey.Key - type: AnalysisConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ArtifactAnalzyerUiKey.Key: + type: AnalysisConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ApcPowerReceiver powerLoad: 1000 - type: Computer @@ -509,8 +509,8 @@ key: enum.IdCardConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.IdCardConsoleUiKey.Key - type: IdCardConsoleBoundUserInterface + enum.IdCardConsoleUiKey.Key: + type: IdCardConsoleBoundUserInterface - type: CrewManifestViewer ownerKey: enum.IdCardConsoleUiKey.Key - type: Sprite @@ -580,8 +580,8 @@ key: enum.CommunicationsConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.CommunicationsConsoleUiKey.Key - type: CommunicationsConsoleBoundUserInterface + enum.CommunicationsConsoleUiKey.Key: + type: CommunicationsConsoleBoundUserInterface - type: Computer board: CommsComputerCircuitboard - type: PointLight @@ -644,8 +644,8 @@ key: enum.SolarControlConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.SolarControlConsoleUiKey.Key - type: SolarControlConsoleBoundUserInterface + enum.SolarControlConsoleUiKey.Key: + type: SolarControlConsoleBoundUserInterface - type: Computer board: SolarControlComputerCircuitboard - type: PointLight @@ -674,8 +674,8 @@ key: enum.RadarConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.RadarConsoleUiKey.Key - type: RadarConsoleBoundUserInterface + enum.RadarConsoleUiKey.Key: + type: RadarConsoleBoundUserInterface - type: Computer board: RadarConsoleCircuitboard - type: PointLight @@ -704,8 +704,8 @@ key: enum.CargoConsoleUiKey.Shuttle - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Shuttle - type: CargoShuttleConsoleBoundUserInterface + enum.CargoConsoleUiKey.Shuttle: + type: CargoShuttleConsoleBoundUserInterface - type: Computer board: CargoShuttleComputerCircuitboard - type: PointLight @@ -742,8 +742,8 @@ key: enum.CargoConsoleUiKey.Orders - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Orders - type: CargoOrderConsoleBoundUserInterface + enum.CargoConsoleUiKey.Orders: + type: CargoOrderConsoleBoundUserInterface - type: Computer board: CargoRequestComputerCircuitboard - type: PointLight @@ -786,8 +786,8 @@ key: enum.CargoConsoleUiKey.Bounty - type: UserInterface interfaces: - - key: enum.CargoConsoleUiKey.Bounty - type: CargoBountyConsoleBoundUserInterface + enum.CargoConsoleUiKey.Bounty: + type: CargoBountyConsoleBoundUserInterface - type: Computer board: CargoBountyComputerCircuitboard - type: PointLight @@ -837,8 +837,8 @@ key: enum.CloningConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.CloningConsoleUiKey.Key - type: CloningConsoleBoundUserInterface + enum.CloningConsoleUiKey.Key: + type: CloningConsoleBoundUserInterface - type: Speech speechVerb: Robotic speechSounds: Pai @@ -881,7 +881,7 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SalvageConsoleUiKey.Expedition + enum.SalvageConsoleUiKey.Expedition: type: SalvageExpeditionConsoleBoundUserInterface - type: Computer board: SalvageExpeditionsComputerCircuitboard @@ -926,8 +926,8 @@ anchored: true - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: entity parent: BaseComputer @@ -963,8 +963,8 @@ - type: ActivatableUIRequiresVision - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: entity id: ComputerPalletConsole @@ -990,8 +990,8 @@ key: enum.CargoPalletConsoleUiKey.Sale - type: UserInterface interfaces: - - key: enum.CargoPalletConsoleUiKey.Sale - type: CargoPalletConsoleBoundUserInterface + enum.CargoPalletConsoleUiKey.Sale: + type: CargoPalletConsoleBoundUserInterface - type: Computer board: CargoRequestComputerCircuitboard - type: PointLight @@ -1031,8 +1031,8 @@ anchored: true - type: UserInterface interfaces: - - key: enum.NewsWriterUiKey.Key - type: NewsWriterBoundUserInterface + enum.NewsWriterUiKey.Key: + type: NewsWriterBoundUserInterface - type: entity parent: BaseComputer @@ -1064,7 +1064,7 @@ key: enum.SensorMonitoringConsoleUiKey.Key - type: UserInterface interfaces: - - key: enum.SensorMonitoringConsoleUiKey.Key + enum.SensorMonitoringConsoleUiKey.Key: type: SensorMonitoringConsoleBoundUserInterface - type: DeviceNetwork deviceNetId: AtmosDevices diff --git a/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml b/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml index df989a7795..dd58b9709d 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Computers/techdiskterminal.yml @@ -19,10 +19,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.DiskConsoleUiKey.Key - type: DiskConsoleBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.DiskConsoleUiKey.Key: + type: DiskConsoleBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: ExtensionCableReceiver - type: Computer board: TechDiskComputerCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml index 6ac969171e..4cb76ea4b9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/Medical/cryo_pod.yml @@ -89,9 +89,9 @@ scanDelay: 0 - type: UserInterface interfaces: - - key: enum.HealthAnalyzerUiKey.Key + enum.HealthAnalyzerUiKey.Key: type: HealthAnalyzerBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: ActivatableUI key: enum.HealthAnalyzerUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml index ab09a03fef..8686d88233 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/anomaly_equipment.yml @@ -27,8 +27,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Machine board: AnomalyVesselCircuitboard - type: PointLight @@ -298,8 +298,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.AnomalyGeneratorUiKey.Key - type: AnomalyGeneratorBoundUserInterface + enum.AnomalyGeneratorUiKey.Key: + type: AnomalyGeneratorBoundUserInterface - type: Appearance - type: ActiveRadio channels: diff --git a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml index 89cadab6b1..88e650068e 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/bombs.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/bombs.yml @@ -10,7 +10,7 @@ - type: InteractionOutline - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Wires layoutId: Defusable diff --git a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml index aee1246021..4e565054b4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/chem_master.yml @@ -50,8 +50,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ChemMasterUiKey.Key - type: ChemMasterBoundUserInterface + enum.ChemMasterUiKey.Key: + type: ChemMasterBoundUserInterface - type: ApcPowerReceiver powerLoad: 250 - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml index 7e78f66efa..583b5e3548 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/fax_machine.yml @@ -32,8 +32,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.FaxUiKey.Key - type: FaxBoundUi + enum.FaxUiKey.Key: + type: FaxBoundUi - type: ApcPowerReceiver powerLoad: 250 - type: FaxMachine diff --git a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml index 3244789a02..b4f05cf68a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/flatpacker.yml @@ -58,8 +58,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.FlatpackCreatorUIKey.Key - type: FlatpackCreatorBoundUserInterface + enum.FlatpackCreatorUIKey.Key: + type: FlatpackCreatorBoundUserInterface - type: ItemSlots slots: board_slot: diff --git a/Resources/Prototypes/Entities/Structures/Machines/gateway.yml b/Resources/Prototypes/Entities/Structures/Machines/gateway.yml index b6ad9db356..dd01adf6d5 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gateway.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gateway.yml @@ -52,6 +52,6 @@ key: enum.GatewayUiKey.Key - type: UserInterface interfaces: - - key: enum.GatewayUiKey.Key - type: GatewayBoundUserInterface + enum.GatewayUiKey.Key: + type: GatewayBoundUserInterface - type: Gateway diff --git a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml index 618538dccb..6ee454c6a9 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/gravity_generator.yml @@ -62,8 +62,8 @@ on: "on" - type: UserInterface interfaces: - - key: enum.GravityGeneratorUiKey.Key - type: GravityGeneratorBoundUserInterface + enum.GravityGeneratorUiKey.Key: + type: GravityGeneratorBoundUserInterface - type: Appearance - type: PointLight radius: 2.5 diff --git a/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml index 76b8ddd36b..acd8527dbb 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/jukebox.yml @@ -26,8 +26,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.JukeboxUiKey.Key - type: JukeboxBoundUserInterface + enum.JukeboxUiKey.Key: + type: JukeboxBoundUserInterface - type: Damageable damageContainer: Inorganic damageModifierSet: Metallic diff --git a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml index 25c6545286..1bfb67f66a 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/lathe.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/lathe.yml @@ -38,10 +38,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.LatheUiKey.Key - type: LatheBoundUserInterface - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.LatheUiKey.Key: + type: LatheBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Transform anchored: true - type: Pullable @@ -287,6 +287,7 @@ - PowerCellMicroreactor - PowerCellHigh - WeaponPistolCHIMP + - ClothingMaskWeldingGas - WeaponGauntletGorilla - SynthesizerInstrument - ClothingShoesBootsMagSci diff --git a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml index 37b5e50d31..fe4eb14518 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/microwave.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/microwave.yml @@ -44,8 +44,8 @@ range: 200 - type: UserInterface interfaces: - - key: enum.MicrowaveUiKey.Key - type: MicrowaveBoundUserInterface + enum.MicrowaveUiKey.Key: + type: MicrowaveBoundUserInterface - type: Physics - type: Fixtures fixtures: diff --git a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml index f37c42e474..bc4581d7b6 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/nuke.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/nuke.yml @@ -88,8 +88,8 @@ key: enum.NukeUiKey.Key - type: UserInterface interfaces: - - key: enum.NukeUiKey.Key - type: NukeBoundUserInterface + enum.NukeUiKey.Key: + type: NukeBoundUserInterface - type: StaticPrice price: 50000 # YOU STOLE A NUCLEAR FISSION EXPLOSIVE?! - type: CargoSellBlacklist diff --git a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml index 773112f6f3..d6e7333313 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/reagent_grinder.yml @@ -12,8 +12,8 @@ key: enum.ReagentGrinderUiKey.Key - type: UserInterface interfaces: - - key: enum.ReagentGrinderUiKey.Key - type: ReagentGrinderBoundUserInterface + enum.ReagentGrinderUiKey.Key: + type: ReagentGrinderBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: @@ -101,4 +101,4 @@ - type: DrainableSolution solution: output - type: ExaminableSolution - solution: output \ No newline at end of file + solution: output diff --git a/Resources/Prototypes/Entities/Structures/Machines/research.yml b/Resources/Prototypes/Entities/Structures/Machines/research.yml index 948b3f84b2..498759df3c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/research.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/research.yml @@ -83,8 +83,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ResearchClientUiKey.Key - type: ResearchClientBoundUserInterface + enum.ResearchClientUiKey.Key: + type: ResearchClientBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml index a17eed5712..cafdc7cef2 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/salvage.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/salvage.yml @@ -28,8 +28,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SalvageMagnetUiKey.Key - type: SalvageMagnetBoundUserInterface + enum.SalvageMagnetUiKey.Key: + type: SalvageMagnetBoundUserInterface - type: Transform noRot: false - type: Appearance diff --git a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml index 1eeaec9b7c..904bf46a0b 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/surveillance_camera_routers.yml @@ -13,7 +13,7 @@ - type: DeviceNetworkRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Router + enum.SurveillanceCameraSetupUiKey.Router: type: SurveillanceCameraSetupBoundUi - type: Machine board: SurveillanceCameraRouterCircuitboard @@ -118,7 +118,7 @@ - type: DeviceNetworkRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Router + enum.SurveillanceCameraSetupUiKey.Router: type: SurveillanceCameraSetupBoundUi - type: Machine board: SurveillanceCameraWirelessRouterCircuitboard diff --git a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml index 6f28b53350..16a5aa55d4 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/vending_machines.yml @@ -60,10 +60,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.VendingMachineUiKey.Key - type: VendingMachineBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.VendingMachineUiKey.Key: + type: VendingMachineBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-vendingmachine diff --git a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml index d69eb96f62..fc8f31535c 100644 --- a/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Machines/wireless_surveillance_camera.yml @@ -33,7 +33,7 @@ range: 10 - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Camera + enum.SurveillanceCameraSetupUiKey.Camera: type: SurveillanceCameraSetupBoundUi placement: mode: SnapgridCenter diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml index 4bea87f817..fa5804c645 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/binary.yml @@ -51,8 +51,8 @@ enabled: false - type: UserInterface interfaces: - - key: enum.GasPressurePumpUiKey.Key - type: GasPressurePumpBoundUserInterface + enum.GasPressurePumpUiKey.Key: + type: GasPressurePumpBoundUserInterface - type: Construction graph: GasBinary node: pressurepump @@ -92,7 +92,7 @@ enabled: false - type: UserInterface interfaces: - - key: enum.GasVolumePumpUiKey.Key + enum.GasVolumePumpUiKey.Key: type: GasVolumePumpBoundUserInterface - type: Construction graph: GasBinary diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml index 316c403d7a..200df727b3 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/portable.yml @@ -120,7 +120,7 @@ layer: - MachineLayer - type: ApcPowerReceiver - powerDisabled: true #starts off + powerDisabled: true #starts off - type: Sprite sprite: Structures/Piping/Atmospherics/Portable/portable_sheater.rsi noRot: true @@ -144,8 +144,8 @@ - type: WiresVisuals - type: UserInterface interfaces: - - key: enum.SpaceHeaterUiKey.Key - type: SpaceHeaterBoundUserInterface + enum.SpaceHeaterUiKey.Key: + type: SpaceHeaterBoundUserInterface - type: ActivatableUI inHandsOnly: false key: enum.SpaceHeaterUiKey.Key @@ -195,4 +195,4 @@ suffix: Anchored, Enabled components: - type: ApcPowerReceiver - powerDisabled: false \ No newline at end of file + powerDisabled: false diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml index d0f239b338..46eb57c388 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/trinary.yml @@ -53,7 +53,7 @@ - type: PipeColorVisuals - type: UserInterface interfaces: - - key: enum.GasFilterUiKey.Key + enum.GasFilterUiKey.Key: type: GasFilterBoundUserInterface - type: GasFilter enabled: false @@ -138,7 +138,7 @@ - type: PipeColorVisuals - type: UserInterface interfaces: - - key: enum.GasMixerUiKey.Key + enum.GasMixerUiKey.Key: type: GasMixerBoundUserInterface - type: GasMixer enabled: false diff --git a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml index e046fb831a..c0664602b4 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Atmospherics/unary.yml @@ -239,8 +239,8 @@ - type: AtmosDevice - type: UserInterface interfaces: - - key: enum.ThermomachineUiKey.Key - type: GasThermomachineBoundUserInterface + enum.ThermomachineUiKey.Key: + type: GasThermomachineBoundUserInterface - type: ActivatableUI inHandsOnly: false key: enum.ThermomachineUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml index 218b532efc..0224105117 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/pipes.yml @@ -143,8 +143,8 @@ key: enum.DisposalTaggerUiKey.Key - type: UserInterface interfaces: - - key: enum.DisposalTaggerUiKey.Key - type: DisposalTaggerBoundUserInterface + enum.DisposalTaggerUiKey.Key: + type: DisposalTaggerBoundUserInterface - type: Construction graph: DisposalPipe node: tagger @@ -219,8 +219,8 @@ key: enum.DisposalRouterUiKey.Key - type: UserInterface interfaces: - - key: enum.DisposalRouterUiKey.Key - type: DisposalRouterBoundUserInterface + enum.DisposalRouterUiKey.Key: + type: DisposalRouterBoundUserInterface - type: Fixtures fixtures: fix1: diff --git a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml index 43dc63445c..b4a5f61ffa 100644 --- a/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml +++ b/Resources/Prototypes/Entities/Structures/Piping/Disposal/units.yml @@ -56,8 +56,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: ContainerContainer containers: disposals: !type:Container @@ -79,8 +79,8 @@ - type: DisposalUnit - type: UserInterface interfaces: - - key: enum.DisposalUnitUiKey.Key - type: DisposalUnitBoundUserInterface + enum.DisposalUnitUiKey.Key: + type: DisposalUnitBoundUserInterface - type: RatKingRummageable - type: entity @@ -129,7 +129,7 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.MailingUnitUiKey.Key - type: DisposalUnitBoundUserInterface - - key: enum.ConfigurationUiKey.Key - type: ConfigurationBoundUserInterface + enum.MailingUnitUiKey.Key: + type: DisposalUnitBoundUserInterface + enum.ConfigurationUiKey.Key: + type: ConfigurationBoundUserInterface diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml index ca0cebffec..96392ecd00 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/PA/control_box.yml @@ -17,10 +17,10 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.ParticleAcceleratorControlBoxUiKey.Key - type: ParticleAcceleratorBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.ParticleAcceleratorControlBoxUiKey.Key: + type: ParticleAcceleratorBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-pa diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml index c88adca76d..4e4ef8bdbc 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/ame.yml @@ -65,8 +65,8 @@ key: enum.AmeControllerUiKey.Key - type: UserInterface interfaces: - - key: enum.AmeControllerUiKey.Key - type: AmeControllerBoundUserInterface + enum.AmeControllerUiKey.Key: + type: AmeControllerBoundUserInterface - type: Appearance - type: GenericVisualizer visuals: diff --git a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml index dbaacd6abc..d735d9607c 100644 --- a/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml +++ b/Resources/Prototypes/Entities/Structures/Power/Generation/portable_generator.yml @@ -44,7 +44,7 @@ - type: WiresPanel - type: UserInterface interfaces: - - key: enum.GeneratorComponentUiKey.Key + enum.GeneratorComponentUiKey.Key: type: PortableGeneratorBoundUserInterface - type: ActivatableUI key: enum.GeneratorComponentUiKey.Key diff --git a/Resources/Prototypes/Entities/Structures/Power/apc.yml b/Resources/Prototypes/Entities/Structures/Power/apc.yml index 4df502791f..71e4506495 100644 --- a/Resources/Prototypes/Entities/Structures/Power/apc.yml +++ b/Resources/Prototypes/Entities/Structures/Power/apc.yml @@ -81,8 +81,8 @@ - type: ExtensionCableProvider - type: UserInterface interfaces: - - key: enum.ApcUiKey.Key - type: ApcBoundUserInterface + enum.ApcUiKey.Key: + type: ApcBoundUserInterface - type: ActivatableUI inHandsOnly: false singleUser: true diff --git a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml index 2591b3f340..9fd05beaee 100644 --- a/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml +++ b/Resources/Prototypes/Entities/Structures/Specific/Janitor/janicart.yml @@ -313,8 +313,8 @@ fillBaseName: cart_water- - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Drink solution: bucket - type: ContainerContainer diff --git a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml index cd44f5f585..b38ef61791 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/Canisters/gas_canisters.yml @@ -36,7 +36,7 @@ 3: { state: can-o3, shader: "unshaded" } - type: UserInterface interfaces: - - key: enum.GasCanisterUiKey.Key + enum.GasCanisterUiKey.Key: type: GasCanisterBoundUserInterface - type: Destructible thresholds: diff --git a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml index d341c017a7..08db462be0 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/filing_cabinets.yml @@ -24,8 +24,8 @@ map: ["openLayer"] - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Transform noRot: true - type: Fixtures @@ -113,8 +113,8 @@ - type: Appearance - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: Transform noRot: true - type: Fixtures diff --git a/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml b/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml index 961d7854c0..b26bb2c954 100644 --- a/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml +++ b/Resources/Prototypes/Entities/Structures/Storage/ore_box.yml @@ -60,8 +60,8 @@ - Ore - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml index 62f2000593..7f306bbf94 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/air_alarm.yml @@ -57,10 +57,10 @@ - type: InteractionOutline - type: UserInterface interfaces: - - key: enum.SharedAirAlarmInterfaceKey.Key - type: AirAlarmBoundUserInterface - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.SharedAirAlarmInterfaceKey.Key: + type: AirAlarmBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-airalarm diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml index 05988fbc21..3088e0a001 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/fire_alarm.yml @@ -60,8 +60,8 @@ delta: fire_3 - type: UserInterface interfaces: - - key: enum.WiresUiKey.Key - type: WiresBoundUserInterface + enum.WiresUiKey.Key: + type: WiresBoundUserInterface - type: WiresPanel - type: Wires boardName: wires-board-name-firealarm diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml index 037a89a988..2cf77d843c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/intercom.yml @@ -63,9 +63,9 @@ key: enum.IntercomUiKey.Key - type: UserInterface interfaces: - - key: enum.IntercomUiKey.Key + enum.IntercomUiKey.Key: type: IntercomBoundUserInterface - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: Construction graph: Intercom diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml index b524f099bf..d02bce020d 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/mirror.yml @@ -16,5 +16,5 @@ key: enum.MagicMirrorUiKey.Key - type: UserInterface interfaces: - - key: enum.MagicMirrorUiKey.Key - type: MagicMirrorBoundUserInterface + enum.MagicMirrorUiKey.Key: + type: MagicMirrorBoundUserInterface diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml index 451495f58d..408ab6b67c 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/monitors_televisions.yml @@ -110,8 +110,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface # Wall Televisions @@ -169,8 +169,8 @@ - type: ActivatableUIRequiresPower - type: UserInterface interfaces: - - key: enum.SurveillanceCameraMonitorUiKey.Key - type: SurveillanceCameraMonitorBoundUserInterface + enum.SurveillanceCameraMonitorUiKey.Key: + type: SurveillanceCameraMonitorBoundUserInterface - type: PointLight radius: 1.5 energy: 1.6 diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml index 421ab93be9..f2315583e3 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/noticeboard.yml @@ -50,8 +50,8 @@ - Write - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml index d1df619b7a..2ae5040910 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/station_map.yml @@ -86,7 +86,7 @@ acts: [ "Destruction" ] - type: UserInterface interfaces: - - key: enum.StationMapUiKey.Key + enum.StationMapUiKey.Key: type: StationMapBoundUserInterface - type: entity diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml index dfbe99b2d2..2ac81b463a 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/surveillance_camera.yml @@ -42,9 +42,9 @@ InUse: camera_in_use - type: UserInterface interfaces: - - key: enum.SurveillanceCameraSetupUiKey.Camera + enum.SurveillanceCameraSetupUiKey.Camera: type: SurveillanceCameraSetupBoundUi - - key: enum.WiresUiKey.Key + enum.WiresUiKey.Key: type: WiresBoundUserInterface - type: StaticPrice price: 200 diff --git a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml index 0c284eec7a..dd7eb5bea8 100644 --- a/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml +++ b/Resources/Prototypes/Entities/Structures/Wallmounts/timer.yml @@ -32,8 +32,8 @@ key: enum.SignalTimerUiKey.Key - type: UserInterface interfaces: - - key: enum.SignalTimerUiKey.Key - type: SignalTimerBoundUserInterface + enum.SignalTimerUiKey.Key: + type: SignalTimerBoundUserInterface - type: ApcPowerReceiver powerLoad: 100 - type: Electrified diff --git a/Resources/Prototypes/Entities/Structures/cryopod.yml b/Resources/Prototypes/Entities/Structures/cryopod.yml index 9063e8b138..bdb8862a82 100644 --- a/Resources/Prototypes/Entities/Structures/cryopod.yml +++ b/Resources/Prototypes/Entities/Structures/cryopod.yml @@ -12,8 +12,8 @@ map: ["base"] - type: UserInterface interfaces: - - key: enum.CryostorageUIKey.Key - type: CryostorageBoundUserInterface + enum.CryostorageUIKey.Key: + type: CryostorageBoundUserInterface - type: ActivatableUI key: enum.CryostorageUIKey.Key - type: AccessReader diff --git a/Resources/Prototypes/GameRules/events.yml b/Resources/Prototypes/GameRules/events.yml index 45519e840d..a5777a7b4d 100644 --- a/Resources/Prototypes/GameRules/events.yml +++ b/Resources/Prototypes/GameRules/events.yml @@ -199,6 +199,8 @@ prob: 0.02 - id: MobMouse2 prob: 0.02 + - id: MobMouseCancer + prob: 0.001 specialEntries: - id: SpawnPointGhostRatKing prob: 0.005 @@ -332,6 +334,8 @@ prob: 0.02 - id: MobMouse2 prob: 0.02 + - id: MobMouseCancer + prob: 0.001 - type: entity id: SlimesSpawn diff --git a/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml b/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml new file mode 100644 index 0000000000..605e0e66d2 --- /dev/null +++ b/Resources/Prototypes/Loadouts/Miscellaneous/glasses.yml @@ -0,0 +1,56 @@ +# Timers +- type: loadoutEffectGroup + id: JamjarTimer + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:RoleTimeRequirement + role: JobLibrarian + time: 3600 # 1 hour of being the biggest nerd on the station + +- type: loadoutEffectGroup + id: JensenTimer + effects: + - !type:JobRequirementLoadoutEffect + requirement: + !type:DepartmentTimeRequirement + department: Cargo + time: 36000 #10 hours of being a space trucker + +# Basic options +# Glasses +- type: loadout + id: Glasses + equipment: Glasses + +- type: startingGear + id: Glasses + equipment: + eyes: ClothingEyesGlasses + +# Special options +# Jamjar +- type: loadout + id: GlassesJamjar + equipment: GlassesJamjar + effects: + - !type:GroupLoadoutEffect + proto: JamjarTimer + +- type: startingGear + id: GlassesJamjar + equipment: + eyes: ClothingEyesGlassesJamjar + +# Jensen +- type: loadout + id: GlassesJensen + equipment: GlassesJensen + effects: + - !type:GroupLoadoutEffect + proto: JensenTimer + +- type: startingGear + id: GlassesJensen + equipment: + eyes: ClothingEyesGlassesJensen diff --git a/Resources/Prototypes/Loadouts/loadout_groups.yml b/Resources/Prototypes/Loadouts/loadout_groups.yml index a50e9ceb71..acec697da2 100644 --- a/Resources/Prototypes/Loadouts/loadout_groups.yml +++ b/Resources/Prototypes/Loadouts/loadout_groups.yml @@ -17,7 +17,16 @@ - ClothingNeckTransPin - ClothingNeckAutismPin - ClothingNeckGoldAutismPin - + +- type: loadoutGroup + id: Glasses + name: loadout-group-glasses + minLimit: 0 + loadouts: + - Glasses + - GlassesJamjar + - GlassesJensen + # Command - type: loadoutGroup id: CaptainHead diff --git a/Resources/Prototypes/Loadouts/role_loadouts.yml b/Resources/Prototypes/Loadouts/role_loadouts.yml index c5fb042d0c..a5aeda58b5 100644 --- a/Resources/Prototypes/Loadouts/role_loadouts.yml +++ b/Resources/Prototypes/Loadouts/role_loadouts.yml @@ -17,6 +17,7 @@ - HoPJumpsuit - HoPBackpack - HoPOuterClothing + - Glasses - Trinkets # Civilian @@ -29,6 +30,7 @@ - PassengerGloves - PassengerOuterClothing - PassengerShoes + - Glasses - Trinkets - type: roleLoadout @@ -38,6 +40,7 @@ - BartenderJumpsuit - CommonBackpack - BartenderOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -45,6 +48,7 @@ groups: - BartenderJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -55,6 +59,7 @@ - ChefJumpsuit - CommonBackpack - ChefOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -62,6 +67,7 @@ groups: - LibrarianJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -70,6 +76,7 @@ - LawyerNeck - LawyerJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -81,6 +88,7 @@ - ChaplainJumpsuit - ChaplainBackpack - ChaplainOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -91,6 +99,7 @@ - JanitorGloves - CommonBackpack - JanitorOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -100,6 +109,7 @@ - BotanistJumpsuit - BotanistBackpack - BotanistOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -110,6 +120,7 @@ - ClownBackpack - ClownOuterClothing - ClownShoes + - Glasses - Trinkets - type: roleLoadout @@ -120,6 +131,7 @@ - MimeJumpsuit - MimeBackpack - MimeOuterClothing + - Glasses - Trinkets - type: roleLoadout @@ -127,6 +139,7 @@ groups: - MusicianBackpack - MusicianOuterClothing + - Glasses - Trinkets # Cargo @@ -139,6 +152,7 @@ - QuartermasterBackpack - QuartermasterOuterClothing - QuartermasterShoes + - Glasses - Trinkets - type: roleLoadout @@ -149,6 +163,7 @@ - CargoTechnicianBackpack - CargoTechnicianOuterClothing - CargoTechnicianShoes + - Glasses - Trinkets - type: roleLoadout @@ -157,6 +172,7 @@ - SalvageSpecialistBackpack - SalvageSpecialistOuterClothing - SalvageSpecialistShoes + - Glasses - Trinkets # Engineering @@ -209,6 +225,7 @@ - ResearchDirectorOuterClothing - ScientistGloves - ResearchDirectorShoes + - Glasses - Trinkets - type: roleLoadout @@ -222,6 +239,7 @@ - ScientistGloves - ScientistShoes - ScientistPDA + - Glasses - Trinkets - type: roleLoadout @@ -229,6 +247,7 @@ groups: - ResearchAssistantJumpsuit - ScientistBackpack + - Glasses - Trinkets # Security @@ -297,6 +316,7 @@ - ChiefMedicalOfficerOuterClothing - ChiefMedicalOfficerNeck - ChiefMedicalOfficerShoes + - Glasses - Trinkets - type: roleLoadout @@ -310,6 +330,7 @@ - MedicalDoctorOuterClothing - MedicalShoes - MedicalDoctorPDA + - Glasses - Trinkets - type: roleLoadout @@ -317,6 +338,7 @@ groups: - MedicalInternJumpsuit - MedicalBackpack + - Glasses - Trinkets - type: roleLoadout @@ -340,6 +362,7 @@ - ParamedicBackpack - ParamedicOuterClothing - ParamedicShoes + - Glasses - Trinkets # Wildcards @@ -347,6 +370,7 @@ id: JobZookeeper groups: - CommonBackpack + - Glasses - Trinkets - type: roleLoadout @@ -354,12 +378,14 @@ groups: - ReporterJumpsuit - CommonBackpack + - Glasses - Trinkets - type: roleLoadout id: JobPsychologist groups: - MedicalBackpack + - Glasses - Trinkets - type: roleLoadout @@ -368,4 +394,5 @@ - BoxerJumpsuit - BoxerGloves - CommonBackpack + - Glasses - Trinkets diff --git a/Resources/Prototypes/NPCs/Combat/melee.yml b/Resources/Prototypes/NPCs/Combat/melee.yml index 122875ed97..b0746e5679 100644 --- a/Resources/Prototypes/NPCs/Combat/melee.yml +++ b/Resources/Prototypes/NPCs/Combat/melee.yml @@ -17,6 +17,29 @@ - !type:HTNCompoundTask task: PickupMeleeCompound + - preconditions: + - !type:BuckledPrecondition + isBuckled: true + tasks: + - !type:HTNPrimitiveTask + operator: !type:UnbuckleOperator + shutdownState: TaskFinished + + - preconditions: + - !type:InContainerPrecondition + isInContainer: true + tasks: + - !type:HTNCompoundTask + task: EscapeCompound + + - preconditions: + - !type:PulledPrecondition + isPulled: true + tasks: + - !type:HTNPrimitiveTask + operator: !type:UnPullOperator + shutdownState: TaskFinished + # Melee combat (unarmed or otherwise) - tasks: - !type:HTNPrimitiveTask @@ -101,6 +124,21 @@ proto: NearbyMeleeTargets key: Target +- type: htnCompound + id: EscapeCompound + branches: + - tasks: + - !type:HTNPrimitiveTask + operator: !type:ContainerOperator + targetKey: Target + shutdownState: TaskFinished + - !type:HTNPrimitiveTask + operator: !type:EscapeOperator + targetKey: Target + preconditions: + - !type:InContainerPrecondition + isInContainer: true + - type: htnCompound id: MeleeAttackOrderedTargetCompound branches: diff --git a/Resources/Prototypes/Reagents/botany.yml b/Resources/Prototypes/Reagents/botany.yml index a03c3826a4..4cb7d0c184 100644 --- a/Resources/Prototypes/Reagents/botany.yml +++ b/Resources/Prototypes/Reagents/botany.yml @@ -247,6 +247,8 @@ groups: Brute: -5 Burn: -5 + types: + Bloodloss: -5 - type: reagent diff --git a/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml new file mode 100644 index 0000000000..10736a5876 --- /dev/null +++ b/Resources/Prototypes/Recipes/Construction/Graphs/clothing/quiver.yml @@ -0,0 +1,19 @@ +- type: constructionGraph + id: Quiver + start: start + graph: + - node: start + edges: + - to: Quiver + steps: + - material: Cable + amount: 2 + doAfter: 1 + - material: Cloth + amount: 5 + doAfter: 2 + - material: WoodPlank + amount: 1 + doAfter: 2 + - node: Quiver + entity: ClothingBeltQuiver diff --git a/Resources/Prototypes/Recipes/Construction/clothing.yml b/Resources/Prototypes/Recipes/Construction/clothing.yml index 8907a47c6b..420f38aab8 100644 --- a/Resources/Prototypes/Recipes/Construction/clothing.yml +++ b/Resources/Prototypes/Recipes/Construction/clothing.yml @@ -106,4 +106,15 @@ category: construction-category-clothing description: A pair of sunglasses, modified to have a built-in security HUD. icon: { sprite: Clothing/Eyes/Glasses/secglasses.rsi, state: icon } - objectType: Item \ No newline at end of file + objectType: Item + +- type: construction + name: quiver + id: ClothingBeltQuiver + graph: Quiver + startNode: start + targetNode: Quiver + category: construction-category-clothing + description: Can hold up to 15 arrows, and fits snug around your waist. + icon: { sprite: Clothing/Belt/quiver.rsi, state: icon } + objectType: Item diff --git a/Resources/Prototypes/Recipes/Lathes/devices.yml b/Resources/Prototypes/Recipes/Lathes/devices.yml index 8b748f3fe5..6a786f2b24 100644 --- a/Resources/Prototypes/Recipes/Lathes/devices.yml +++ b/Resources/Prototypes/Recipes/Lathes/devices.yml @@ -76,7 +76,7 @@ Steel: 100 Plastic: 200 Glass: 100 - + - type: latheRecipe id: SignallerAdvanced result: RemoteSignallerAdvanced @@ -175,6 +175,14 @@ Plasma: 1500 Uranium: 150 +- type: latheRecipe + id: ClothingMaskWeldingGas + result: ClothingMaskWeldingGas + completetime: 3 + materials: + Steel: 600 + Glass: 200 + - type: latheRecipe id: WeaponForceGun result: WeaponForceGun diff --git a/Resources/Prototypes/Research/industrial.yml b/Resources/Prototypes/Research/industrial.yml index 30345a5dfc..ccc6e9c0f4 100644 --- a/Resources/Prototypes/Research/industrial.yml +++ b/Resources/Prototypes/Research/industrial.yml @@ -14,6 +14,7 @@ - BorgModuleMining - OreProcessorIndustrialMachineCircuitboard - OreBagOfHolding + - ClothingMaskWeldingGas - type: technology id: AdvancedPowercells diff --git a/Resources/Prototypes/Roles/Ghostroles/syndicate.yml b/Resources/Prototypes/Roles/Ghostroles/syndicate.yml new file mode 100644 index 0000000000..24c0d8b3e3 --- /dev/null +++ b/Resources/Prototypes/Roles/Ghostroles/syndicate.yml @@ -0,0 +1,27 @@ +- type: ghostRole + id: SyndicateKobold + name: ghost-role-information-syndicate-kobold-reinforcement-name + description: ghost-role-information-syndicate-kobold-reinforcement-description + rules: ghost-role-information-syndicate-kobold-reinforcement-rules + entityPrototype: MobKoboldSyndicateAgent + +- type: ghostRole + id: SyndicateKoboldNukeops + name: ghost-role-information-syndicate-kobold-reinforcement-name + description: ghost-role-information-syndicate-kobold-reinforcement-description + rules: ghost-role-information-syndicate-kobold-reinforcement-rules + entityPrototype: MobKoboldSyndicateAgentNukeops + +- type: ghostRole + id: SyndicateMonkey + name: ghost-role-information-syndicate-monkey-reinforcement-name + description: ghost-role-information-syndicate-monkey-reinforcement-description + rules: ghost-role-information-syndicate-monkey-reinforcement-name + entityPrototype: MobMonkeySyndicateAgent + +- type: ghostRole + id: SyndicateMonkeyNukeops + name: ghost-role-information-syndicate-monkey-reinforcement-name + description: ghost-role-information-syndicate-monkey-reinforcement-description + rules: ghost-role-information-syndicate-monkey-reinforcement-name + entityPrototype: MobMonkeySyndicateAgentNukeops \ No newline at end of file diff --git a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml index 22d0a4d77f..f37085e005 100644 --- a/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml +++ b/Resources/Prototypes/Roles/Jobs/Fun/emergencyresponseteam.yml @@ -27,7 +27,7 @@ id: ERTLeaderPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolN1984Nonlethal + pocket1: WeaponPistolN1984 pocket2: FlashlightSeclite - type: startingGear @@ -44,7 +44,7 @@ id: ERTLeaderPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolN1984Nonlethal + pocket1: WeaponPistolN1984 pocket2: FlashlightSeclite - type: startingGear @@ -199,7 +199,7 @@ id: ERTSecurityPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolMk58Nonlethal + pocket1: WeaponPistolMk58 pocket2: FlashlightSeclite - type: startingGear @@ -216,7 +216,7 @@ id: ERTSecurityPDA ears: ClothingHeadsetAltCentCom belt: ClothingBeltSecurityFilled - pocket1: WeaponPistolMk58Nonlethal + pocket1: WeaponPistolMk58 pocket2: FlashlightSeclite - type: startingGear diff --git a/Resources/Prototypes/Shaders/displacement.yml b/Resources/Prototypes/Shaders/displacement.yml new file mode 100644 index 0000000000..5c90738008 --- /dev/null +++ b/Resources/Prototypes/Shaders/displacement.yml @@ -0,0 +1,10 @@ +- type: shader + id: DisplacedStencilDraw + kind: source + path: "/Textures/Shaders/displacement.swsl" + stencil: + ref: 1 + op: Keep + func: NotEqual + params: + displacementSize: 127 diff --git a/Resources/Prototypes/Species/vox.yml b/Resources/Prototypes/Species/vox.yml index 605087a687..53ac4258bc 100644 --- a/Resources/Prototypes/Species/vox.yml +++ b/Resources/Prototypes/Species/vox.yml @@ -6,18 +6,19 @@ sprites: MobVoxSprites markingLimits: MobVoxMarkingLimits dollPrototype: MobVoxDummy - skinColoration: Hues + skinColoration: VoxFeathers + defaultSkinTone: "#6c741d" maleFirstNames: names_vox femaleFirstNames: names_vox naming: First sexes: - - Unsexed - + - Unsexed - type: speciesBaseSprites id: MobVoxSprites sprites: Head: MobVoxHead + Snout: MobHumanoidAnyMarking Hair: MobHumanoidAnyMarking FacialHair: MobHumanoidAnyMarking Chest: MobVoxTorso @@ -30,6 +31,7 @@ RLeg: MobVoxRLeg LFoot: MobVoxLFoot RFoot: MobVoxRFoot + Tail: MobHumanoidAnyMarking - type: markingPoints id: MobVoxMarkingLimits @@ -41,57 +43,70 @@ FacialHair: points: 1 required: false + Head: + points: 1 + required: true + Snout: + points: 1 + required: true + defaultMarkings: [ VoxBeak ] + Arms: + points: 4 + required: true + defaultMarkings: [ VoxLArmScales, VoxRArmScales, VoxRHandScales, VoxLHandScales ] + Legs: + points: 4 + required: true + defaultMarkings: [ VoxLLegScales, VoxRLegScales, VoxRFootScales, VoxLFootScales ] Chest: points: 1 required: false - Legs: - points: 2 - required: false - Arms: - points: 2 - required: false + Tail: + points: 1 + required: true + defaultMarkings: [ VoxTail ] - type: humanoidBaseSprite id: MobVoxEyes baseSprite: - sprite: Mobs/Customization/eyes.rsi - state: vox_eyes_s + sprite: Mobs/Species/Vox/parts.rsi + state: eyes - type: humanoidBaseSprite id: MobVoxHead baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_m + state: head - type: humanoidBaseSprite id: MobVoxHeadMale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_m + state: head - type: humanoidBaseSprite id: MobVoxHeadFemale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: head_f + state: head - type: humanoidBaseSprite id: MobVoxTorso baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_m + state: torso - type: humanoidBaseSprite id: MobVoxTorsoMale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_m + state: torso - type: humanoidBaseSprite id: MobVoxTorsoFemale baseSprite: sprite: Mobs/Species/Vox/parts.rsi - state: torso_f + state: torso - type: humanoidBaseSprite id: MobVoxLLeg @@ -140,5 +155,3 @@ baseSprite: sprite: Mobs/Species/Vox/parts.rsi state: r_foot - -# diff --git a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml index 911c1c2e88..84df09af33 100644 --- a/Resources/Prototypes/XenoArch/Effects/utility_effects.yml +++ b/Resources/Prototypes/XenoArch/Effects/utility_effects.yml @@ -214,8 +214,8 @@ permanentComponents: - type: UserInterface interfaces: - - key: enum.SignalLinkerUiKey.Key - type: SignalPortSelectorBoundUserInterface + enum.SignalLinkerUiKey.Key: + type: SignalPortSelectorBoundUserInterface - type: ToolTileCompatible - type: Tool qualities: diff --git a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml index d00ce10362..98aebf0cc3 100644 --- a/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/_CP14/Entities/Mobs/Species/base.yml @@ -1,8 +1,5 @@ - type: entity - parent: - - BaseMob - - MobDamageable - - MobCombat + parent: BaseMobSpecies id: CP14BaseMobSpecies save: false abstract: true @@ -62,323 +59,86 @@ sprite: "Effects/creampie.rsi" state: "creampie_human" visible: false - - type: DamageVisuals - thresholds: [ 10, 20, 30, 50, 70, 100 ] - targetLayers: - - "enum.HumanoidVisualLayers.Chest" - - "enum.HumanoidVisualLayers.Head" - - "enum.HumanoidVisualLayers.LArm" - - "enum.HumanoidVisualLayers.LLeg" - - "enum.HumanoidVisualLayers.RArm" - - "enum.HumanoidVisualLayers.RLeg" - damageOverlayGroups: - Brute: - sprite: Mobs/Effects/brute_damage.rsi - color: "#FF0000" - Burn: - sprite: Mobs/Effects/burn_damage.rsi - - type: GenericVisualizer - visuals: - enum.CreamPiedVisuals.Creamed: - clownedon: # Not 'creampied' bc I can already see Skyrat complaining about conflicts. - True: { visible: true } - False: { visible: false } - - type: StatusIcon - bounds: -0.5,-0.5,0.5,0.5 - - type: RotationVisuals - defaultRotation: 90 - horizontalRotation: 90 - type: HumanoidAppearance species: CP14Human - - type: SlowOnDamage - speedModifierThresholds: - 60: 0.7 - 80: 0.5 - - type: Fixtures - fixtures: # TODO: This needs a second fixture just for mob collisions. - fix1: - shape: - !type:PhysShapeCircle - radius: 0.35 - density: 185 - restitution: 0.0 - mask: - - MobMask - layer: - - MobLayer - - type: FloorOcclusion - - type: RangedDamageSound - soundGroups: - Brute: - collection: - MeatBulletImpact - soundTypes: - Heat: - collection: - MeatLaserImpact - - type: Reactive - groups: - Flammable: [ Touch ] - Extinguish: [ Touch ] - Acidic: [ Touch, Ingestion ] - reactions: - - reagents: [ Water, SpaceCleaner ] - methods: [ Touch ] - effects: - - !type:WashCreamPieReaction - - type: StatusEffects - allowed: - - Stun - - KnockedDown - - SlowedDown - - Stutter - - SeeingRainbows - - Electrocution - - Drunk - - SlurredSpeech - - RatvarianLanguage - - PressureImmunity - - Muted - - ForcedSleep - - TemporaryBlindness - - Pacified - - StaminaModifier - - type: Reflect - enabled: false - reflectProb: 0 - type: Body prototype: CP14Human requiredLegs: 2 - - type: Identity - - type: IdExaminable - - type: Hands - - type: Internals - - type: Inventory - - type: InventorySlots - - type: FloatingVisuals - - type: Climbing - - type: Cuffable - - type: Ensnareable - sprite: Objects/Misc/ensnare.rsi - state: icon - - type: AnimationPlayer - - type: Buckle - - type: CombatMode - canDisarm: true - - type: MeleeWeapon - soundHit: - collection: Punch - angle: 30 - animation: WeaponArcFist - attackRate: 1 - damage: - types: - Blunt: 5 - - type: SleepEmitSound - - type: SSDIndicator - - type: StandingState - - type: Fingerprint - - type: Dna - - type: MindContainer - showExamineInfo: true - - type: InteractionPopup - successChance: 1 - interactSuccessString: hugging-success-generic - interactSuccessSound: /Audio/Effects/thudswoosh.ogg - messagePerceivedByOthers: hugging-success-generic-others - - type: CanHostGuardian - - type: NpcFactionMember - factions: - - NanoTrasen - - type: CreamPied - - type: Stripping - - type: Strippable - - type: UserInterface - interfaces: - - key: enum.VoiceMaskUIKey.Key - type: VoiceMaskBoundUserInterface - - key: enum.HumanoidMarkingModifierKey.Key - type: HumanoidMarkingModifierBoundUserInterface - - key: enum.StrippingUiKey.Key - type: StrippableBoundUserInterface - - type: Puller - - type: Speech - speechSounds: Alto - - type: DamageForceSay - - type: Vocal - sounds: - Male: MaleHuman - Female: FemaleHuman - Unsexed: MaleHuman - - type: Emoting - - type: BodyEmotes - soundsId: GeneralBodyEmotes - - type: Grammar - attributes: - proper: true - - type: MobPrice - price: 1500 # Kidnapping a living person and selling them for cred is a good move. - deathPenalty: 0.01 # However they really ought to be living and intact, otherwise they're worth 100x less. - - type: Tag - tags: - - CanPilot - - FootstepSound - - DoorBumpOpener - type: entity - parent: - - MobBloodstream - - MobRespirator - - MobAtmosStandard - - MobFlammable - - CP14BaseMobSpecies + parent: BaseMobSpeciesOrganic id: CP14BaseMobSpeciesOrganic save: false abstract: true - components: - - type: Flashable - - type: Barotrauma - damage: - types: - Blunt: 0.50 #per second, scales with pressure and other constants. - Heat: 0.1 - - type: PassiveDamage # Slight passive regen. Assuming one damage type, comes out to about 4 damage a minute. - allowedStates: - - Alive - damageCap: 20 - damage: - types: - Heat: -0.07 - groups: - Brute: -0.07 - # Organs - - type: StatusEffects - allowed: - - Stun - - KnockedDown - - SlowedDown - - Stutter - - SeeingRainbows - - Electrocution - - ForcedSleep - - TemporaryBlindness - - Drunk - - SlurredSpeech - - RatvarianLanguage - - PressureImmunity - - Muted - - Pacified - - StaminaModifier - - type: Blindable - # Other - - type: Temperature - heatDamageThreshold: 325 - coldDamageThreshold: 260 - currentTemperature: 310.15 - specificHeat: 42 - coldDamage: - types: - Cold: 0.1 #per second, scales with temperature & other constants - heatDamage: - types: - Heat: 1.5 #per second, scales with temperature & other constants - - type: ThermalRegulator - metabolismHeat: 800 - radiatedHeat: 100 - implicitHeatRegulation: 500 - sweatHeatRegulation: 2000 - shiveringHeatRegulation: 2000 - normalBodyTemperature: 310.15 - thermalRegulationTemperatureThreshold: 25 - - type: Perishable - - type: Butcherable - butcheringType: Spike # TODO human. - spawned: - - id: FoodMeat - amount: 5 - - type: Respirator - damage: - types: - Asphyxiation: 1.0 - damageRecovery: - types: - Asphyxiation: -1.0 - - type: FireVisuals - alternateState: Standing + #components: + # - type: FireVisuals + # alternateState: Standing #TO DO - custom visual - type: entity save: false + parent: BaseSpeciesDummy id: CP14BaseSpeciesDummy abstract: true components: - - type: Hands - type: Inventory templateId: CP14Human - - type: InventorySlots - - type: ContainerContainer - type: Icon sprite: _CP14/Mobs/Species/Human/parts.rsi state: full - type: Sprite + drawdepth: Mobs + noRot: true layers: - - map: [ "enum.HumanoidVisualLayers.Chest" ] - - map: [ "enum.HumanoidVisualLayers.Head" ] - - map: [ "enum.HumanoidVisualLayers.Snout" ] - - map: [ "enum.HumanoidVisualLayers.Eyes" ] - - map: [ "enum.HumanoidVisualLayers.RArm" ] - - map: [ "enum.HumanoidVisualLayers.LArm" ] - - map: [ "enum.HumanoidVisualLayers.RLeg" ] - - map: [ "enum.HumanoidVisualLayers.LLeg" ] - - shader: StencilClear - sprite: Mobs/Species/Human/parts.rsi - state: l_leg - - shader: StencilMask - map: [ "enum.HumanoidVisualLayers.StencilMask" ] - sprite: Mobs/Customization/masking_helpers.rsi - state: unisex_full - visible: false - - map: [ "jumpsuit" ] - - map: [ "pants" ] - - map: [ "shirt" ] - - map: [ "enum.HumanoidVisualLayers.LFoot" ] - - map: [ "enum.HumanoidVisualLayers.RFoot" ] - - map: [ "enum.HumanoidVisualLayers.LHand" ] - - map: [ "enum.HumanoidVisualLayers.RHand" ] - - map: [ "gloves" ] - - map: [ "shoes" ] - - map: [ "ears" ] - - map: [ "outerClothing" ] - - map: [ "eyes" ] - - map: [ "belt" ] - - map: [ "id" ] - - map: [ "neck" ] - - map: [ "cloak" ] - - map: [ "back" ] - - map: [ "enum.HumanoidVisualLayers.FacialHair" ] - - map: [ "enum.HumanoidVisualLayers.Hair" ] - - map: [ "enum.HumanoidVisualLayers.HeadSide" ] - - map: [ "enum.HumanoidVisualLayers.HeadTop" ] - - map: [ "enum.HumanoidVisualLayers.Tail" ] - - map: [ "mask" ] - - map: [ "head" ] - - map: [ "pocket1" ] - - map: [ "pocket2" ] - - map: ["enum.HumanoidVisualLayers.Handcuffs"] - color: "#ffffff" - sprite: Objects/Misc/handcuffs.rsi - state: body-overlay-2 - visible: false - - map: [ "clownedon" ] # Dynamically generated - sprite: "Effects/creampie.rsi" - state: "creampie_human" - visible: false - - type: Appearance + - map: [ "enum.HumanoidVisualLayers.Chest" ] + - map: [ "enum.HumanoidVisualLayers.Head" ] + - map: [ "enum.HumanoidVisualLayers.Snout" ] + - map: [ "enum.HumanoidVisualLayers.Eyes" ] + - map: [ "enum.HumanoidVisualLayers.RArm" ] + - map: [ "enum.HumanoidVisualLayers.LArm" ] + - map: [ "enum.HumanoidVisualLayers.RLeg" ] + - map: [ "enum.HumanoidVisualLayers.LLeg" ] + - shader: StencilClear + sprite: Mobs/Species/Human/parts.rsi + state: l_leg + - shader: StencilMask + map: ["enum.HumanoidVisualLayers.StencilMask"] + sprite: Mobs/Customization/masking_helpers.rsi + state: unisex_full + visible: false + - map: ["jumpsuit"] + - map: ["enum.HumanoidVisualLayers.LFoot"] + - map: ["enum.HumanoidVisualLayers.RFoot"] + - map: ["enum.HumanoidVisualLayers.LHand"] + - map: ["enum.HumanoidVisualLayers.RHand"] + - map: ["enum.HumanoidVisualLayers.Handcuffs"] + color: "#ffffff" + sprite: Objects/Misc/handcuffs.rsi + state: body-overlay-2 + visible: false + - map: [ "gloves" ] + - map: [ "ring1" ] + - map: [ "ring2" ] + - map: [ "shoes" ] + - map: [ "ears" ] + - map: [ "outerClothing" ] + - map: [ "eyes" ] + - map: [ "belt1" ] + - map: [ "belt2" ] + - map: [ "id" ] + - map: [ "keys" ] + - map: [ "neck" ] + - map: [ "back" ] + - map: [ "enum.HumanoidVisualLayers.FacialHair" ] + - map: [ "enum.HumanoidVisualLayers.Hair" ] + - map: [ "enum.HumanoidVisualLayers.HeadSide" ] + - map: [ "enum.HumanoidVisualLayers.HeadTop" ] + - map: [ "enum.HumanoidVisualLayers.Tail" ] + - map: [ "mask" ] + - map: [ "head" ] + - map: [ "pocket1" ] + - map: [ "pocket2" ] - type: HumanoidAppearance species: CP14Human - type: Body prototype: CP14Human - requiredLegs: 2 - - type: UserInterface - interfaces: - - key: enum.HumanoidMarkingModifierKey.Key # sure, this can go here too - type: HumanoidMarkingModifierBoundUserInterface \ No newline at end of file + requiredLegs: 2 \ No newline at end of file diff --git a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml index 64370a0f18..8e1c0798d9 100644 --- a/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml +++ b/Resources/Prototypes/_CP14/Entities/Structures/Furniture/barrel.yml @@ -89,8 +89,8 @@ canChangeTransferAmount: true - type: UserInterface interfaces: - - key: enum.TransferAmountUiKey.Key - type: TransferAmountBoundUserInterface + enum.TransferAmountUiKey.Key: + type: TransferAmountBoundUserInterface - type: entity id: CP14BarrelWater diff --git a/Resources/Prototypes/_CP14/Entities/keyrings.yml b/Resources/Prototypes/_CP14/Entities/keyrings.yml index 6afee4c2ff..5dbd2a3546 100644 --- a/Resources/Prototypes/_CP14/Entities/keyrings.yml +++ b/Resources/Prototypes/_CP14/Entities/keyrings.yml @@ -25,8 +25,8 @@ - CP14Key - type: UserInterface interfaces: - - key: enum.StorageUiKey.Key - type: StorageBoundUserInterface + enum.StorageUiKey.Key: + type: StorageBoundUserInterface - type: ContainerContainer containers: storagebase: !type:Container diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png new file mode 100644 index 0000000000..e6028f3a4c Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK-vox.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png new file mode 100644 index 0000000000..5d0a7ea70d Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/equipped-MASK.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png new file mode 100644 index 0000000000..352e536ca9 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon-up.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png new file mode 100644 index 0000000000..cdb8d4b7c7 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-left.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-left.png new file mode 100644 index 0000000000..c5111a66a9 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-right.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-right.png new file mode 100644 index 0000000000..5841f0b846 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json b/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json new file mode 100644 index 0000000000..8e9b857325 --- /dev/null +++ b/Resources/Textures/Clothing/Mask/welding-gas.rsi/meta.json @@ -0,0 +1,49 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from tgstation at commit https://github.com/tgstation/tgstation/commit/6f5ca45e3ac06b30fb1957042214a888d8c01722. Inhands, worn sprites, and vox sprites created by EmoGarbage404 (github)", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "icon-up" + }, + { + "name": "equipped-MASK", + "directions": 4 + }, + { + "name": "up-equipped-MASK", + "directions": 4 + }, + { + "name": "equipped-MASK-vox", + "directions": 4 + }, + { + "name": "up-equipped-MASK-vox", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "up-inhand-left", + "directions": 4 + }, + { + "name": "up-inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png new file mode 100644 index 0000000000..90871d7d00 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK-vox.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK.png new file mode 100644 index 0000000000..449c8624c9 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-equipped-MASK.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-left.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-left.png new file mode 100644 index 0000000000..2868ab8317 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-left.png differ diff --git a/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png new file mode 100644 index 0000000000..1362d99011 Binary files /dev/null and b/Resources/Textures/Clothing/Mask/welding-gas.rsi/up-inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png new file mode 100644 index 0000000000..a300332899 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/equipped-INNERCLOTHING.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png new file mode 100644 index 0000000000..28b2de1692 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/icon.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png new file mode 100644 index 0000000000..a85d0a11e9 Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-left.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png new file mode 100644 index 0000000000..4d6da567de Binary files /dev/null and b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/inhand-right.png differ diff --git a/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json new file mode 100644 index 0000000000..d4ea50d555 --- /dev/null +++ b/Resources/Textures/Clothing/Uniforms/Jumpskirt/olddress.rsi/meta.json @@ -0,0 +1,26 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "fujiwaranao", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "equipped-INNERCLOTHING", + "directions": 4 + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Effects/creampie.rsi/creampie_vox.png b/Resources/Textures/Effects/creampie.rsi/creampie_vox.png new file mode 100644 index 0000000000..dfe199b0c8 Binary files /dev/null and b/Resources/Textures/Effects/creampie.rsi/creampie_vox.png differ diff --git a/Resources/Textures/Effects/creampie.rsi/meta.json b/Resources/Textures/Effects/creampie.rsi/meta.json index 54e0cc73c2..8db8a77945 100644 --- a/Resources/Textures/Effects/creampie.rsi/meta.json +++ b/Resources/Textures/Effects/creampie.rsi/meta.json @@ -1,7 +1,7 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0. creampie_moth by MilenVolf, creampie_arachnid by PixelTheKermit (Github)", + "copyright": "Taken from https://github.com/tgstation/tgstation at 0d9c9a8233dfc3fc55edc538955a761a6328bee0. creampie_moth by MilenVolf, creampie_arachnid by PixelTheKermit (Github), creampie_vox by Errant", "size": { "x": 32, "y": 32 @@ -66,6 +66,10 @@ "name": "creampie_standborg", "directions": 4 }, + { + "name": "creampie_vox", + "directions": 4 + }, { "name": "creampie_xeno_crit" }, diff --git a/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json b/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json index cb94dfab3e..78339d7b76 100644 --- a/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/eyes.rsi/meta.json @@ -1 +1 @@ -{"version": 1, "license": "CC-BY-SA-3.0","copyright": "Vox_eyes Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb and human_eyes taken from https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf", "size": {"x": 32, "y": 32}, "states": [{"name": "diona", "directions": 4}, {"name": "eyes", "directions": 4}, {"name":"no_eyes"},{"name": "vox_eyes_s", "directions": 4}]} +{"version": 1, "license": "CC-BY-SA-3.0","copyright": "human_eyes taken from https://github.com/tgstation/tgstation/blob/8024397cc81c5f47f74cf4279e35728487d0a1a7/icons/mob/human_parts_greyscale.dmi and modified by DrSmugleaf", "size": {"x": 32, "y": 32}, "states": [{"name": "diona", "directions": 4}, {"name": "eyes", "directions": 4}, {"name":"no_eyes"}]} diff --git a/Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png b/Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png deleted file mode 100644 index 807e9374c4..0000000000 Binary files a/Resources/Textures/Mobs/Customization/eyes.rsi/vox_eyes_s.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json b/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json index 5cb41c258b..a6dc03eda8 100644 --- a/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json +++ b/Resources/Textures/Mobs/Customization/human_hair.rsi/meta.json @@ -231,6 +231,10 @@ "name": "country", "directions": 4 }, + { + "name": "spookylong", + "directions": 4 + }, { "name": "crewcut", "directions": 4 diff --git a/Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png b/Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png new file mode 100644 index 0000000000..4e79da275b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/human_hair.rsi/spookylong.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png new file mode 100644 index 0000000000..23744679b6 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/beak.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_arm.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_arm.png new file mode 100644 index 0000000000..e35fb3c6bf Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_arm.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_foot.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_foot.png new file mode 100644 index 0000000000..5ab81e3616 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_foot.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_hand.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_hand.png new file mode 100644 index 0000000000..660da8a5d1 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_hand.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png new file mode 100644 index 0000000000..1a81369838 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/l_leg.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json b/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json new file mode 100644 index 0000000000..fd5c14b6a3 --- /dev/null +++ b/Resources/Textures/Mobs/Customization/vox_parts.rsi/meta.json @@ -0,0 +1,55 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb, modified by Bhijn, Errant and Flareguy", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "beak", + "directions": 4 + }, + { + "name": "l_arm", + "directions": 4 + }, + { + "name": "l_foot", + "directions": 4 + }, + { + "name": "l_hand", + "directions": 4 + }, + { + "name": "l_leg", + "directions": 4 + }, + { + "name": "r_arm", + "directions": 4 + }, + { + "name": "r_foot", + "directions": 4 + }, + { + "name": "r_hand", + "directions": 4 + }, + { + "name": "r_leg", + "directions": 4 + }, + { + "name": "tail", + "directions": 4 + }, + { + "name": "tail_stenciled", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png new file mode 100644 index 0000000000..c8c70752f4 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_arm.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png new file mode 100644 index 0000000000..58dbe90b09 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_foot.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png new file mode 100644 index 0000000000..e433456bf2 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_hand.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_leg.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_leg.png new file mode 100644 index 0000000000..d616753129 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/r_leg.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail.png new file mode 100644 index 0000000000..0e63d3327b Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail.png differ diff --git a/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png b/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png new file mode 100644 index 0000000000..50627ac522 Binary files /dev/null and b/Resources/Textures/Mobs/Customization/vox_parts.rsi/tail_stenciled.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png new file mode 100644 index 0000000000..2c938634eb Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/jumpsuit.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json new file mode 100644 index 0000000000..6ea6c552b9 --- /dev/null +++ b/Resources/Textures/Mobs/Species/Vox/displacement.rsi/meta.json @@ -0,0 +1,18 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Made by PJB3005", + "size": { + "x": 32, + "y": 32 + }, + "load": { + "srgb": false + }, + "states": [ + { + "name": "jumpsuit", + "directions": 4 + } + ] +} diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png new file mode 100644 index 0000000000..5069e90b53 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/eyes.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png new file mode 100644 index 0000000000..864a6f0037 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/full.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png new file mode 100644 index 0000000000..ec0dd8402e Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png deleted file mode 100644 index 15c0ed8d66..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_f.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_m.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_m.png deleted file mode 100644 index 15c0ed8d66..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/groin_m.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/head.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/head.png new file mode 100644 index 0000000000..8e140ea787 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/head.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_f.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_f.png deleted file mode 100644 index 6d92de1b90..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_f.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_m.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_m.png deleted file mode 100644 index 6d92de1b90..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/head_m.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_arm.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_arm.png index bdd61871c5..258127dbae 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_arm.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_arm.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png index d12c19cf0c..3b81ae7059 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_foot.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png index 0d1048e090..d321880c7b 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_hand.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png index 20eebad860..918b343f98 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/l_leg.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json b/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json index 1070da1203..4ab06e2172 100644 --- a/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json +++ b/Resources/Textures/Mobs/Species/Vox/parts.rsi/meta.json @@ -1,26 +1,25 @@ { "version": 1, "license": "CC-BY-SA-3.0", - "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb", + "copyright": "Taken from https://github.com/vgstation-coders/vgstation13 at 02ff588d59b3c560c685d9ca75e882d32a72d8cb, by Bhijn, Errant and Flareguy", "size": { "x": 32, "y": 32 }, "states": [ { - "name": "groin_f", + "name": "eyes", "directions": 4 }, { - "name": "groin_m", + "name": "full" + }, + { + "name": "groin", "directions": 4 }, { - "name": "head_f", - "directions": 4 - }, - { - "name": "head_m", + "name": "head", "directions": 4 }, { @@ -60,11 +59,7 @@ "directions": 4 }, { - "name": "torso_f", - "directions": 4 - }, - { - "name": "torso_m", + "name": "torso", "directions": 4 }, { diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png index 0c1f703efd..766cd378ea 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_arm.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_foot.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_foot.png index 80d3a78759..2511bc5252 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_foot.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_foot.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png index d794c608bd..98f8b376a8 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_hand.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_leg.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_leg.png index 37417e2815..45b1ae82e7 100644 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_leg.png and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/r_leg.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso.png new file mode 100644 index 0000000000..841d409735 Binary files /dev/null and b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso.png differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png deleted file mode 100644 index 75bb51ed37..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_f.png and /dev/null differ diff --git a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png b/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png deleted file mode 100644 index 75bb51ed37..0000000000 Binary files a/Resources/Textures/Mobs/Species/Vox/parts.rsi/torso_m.png and /dev/null differ diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/icon.png b/Resources/Textures/Objects/Misc/chopstick.rsi/icon.png new file mode 100644 index 0000000000..95acfb53cd Binary files /dev/null and b/Resources/Textures/Objects/Misc/chopstick.rsi/icon.png differ diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png b/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png new file mode 100644 index 0000000000..48fa05ce34 Binary files /dev/null and b/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-left.png differ diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png b/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png new file mode 100644 index 0000000000..51dc3961d5 Binary files /dev/null and b/Resources/Textures/Objects/Misc/chopstick.rsi/inhand-right.png differ diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json b/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json new file mode 100644 index 0000000000..78e9149225 --- /dev/null +++ b/Resources/Textures/Objects/Misc/chopstick.rsi/meta.json @@ -0,0 +1,25 @@ +{ + "version": 1, + "license": "CC-BY-SA-3.0", + "copyright": "Taken from goonstation at https://github.com/goonstation/goonstation/pull/1179", + "size": { + "x": 32, + "y": 32 + }, + "states": [ + { + "name": "icon" + }, + { + "name": "inhand-left", + "directions": 4 + }, + { + "name": "inhand-right", + "directions": 4 + }, + { + "name": "paired" + } + ] + } \ No newline at end of file diff --git a/Resources/Textures/Objects/Misc/chopstick.rsi/paired.png b/Resources/Textures/Objects/Misc/chopstick.rsi/paired.png new file mode 100644 index 0000000000..220dc31ecb Binary files /dev/null and b/Resources/Textures/Objects/Misc/chopstick.rsi/paired.png differ diff --git a/Resources/Textures/Shaders/displacement.swsl b/Resources/Textures/Shaders/displacement.swsl new file mode 100644 index 0000000000..ba5ca57852 --- /dev/null +++ b/Resources/Textures/Shaders/displacement.swsl @@ -0,0 +1,18 @@ +uniform sampler2D displacementMap; +uniform highp float displacementSize; +uniform highp vec4 displacementUV; + +varying highp vec2 displacementUVOut; + +void vertex() { + displacementUVOut = mix(displacementUV.xy, displacementUV.zw, tCoord2); +} + +void fragment() { + highp vec4 displacementSample = texture2D(displacementMap, displacementUVOut); + highp vec2 displacementValue = (displacementSample.xy - vec2(128.0 / 255.0)) / (1.0 - 128.0 / 255.0); + COLOR = zTexture(UV + displacementValue * TEXTURE_PIXEL_SIZE * displacementSize * vec2(1.0, -1.0)); + COLOR.a *= displacementSample.a; +} + + diff --git a/Resources/keybinds.yml b/Resources/keybinds.yml index 886fec35de..b08f4cb4ed 100644 --- a/Resources/keybinds.yml +++ b/Resources/keybinds.yml @@ -452,6 +452,9 @@ binds: - function: OpenDecalSpawnWindow type: State key: F8 +- function: OpenScoreboardWindow + type: State + key: F9 - function: OpenSandboxWindow type: State key: B diff --git a/Resources/migration.yml b/Resources/migration.yml index 934c3a10f0..bf18cfe555 100644 --- a/Resources/migration.yml +++ b/Resources/migration.yml @@ -283,3 +283,49 @@ BriefcaseSyndieBase: null # 2024-04-08 BodyBag_Container: BodyBag BodyBag_Folded: BodyBagFolded + +# 2024-04-26 +BaseBulletRubber: null +BulletPistolRubber: BulletPistol +BulletMagnumRubber: BulletMagnum +BulletLightRifleRubber: BulletLightRifle +BulletRifleRubber: BulletRifle +BulletCaselessRifleRubber: BulletCaselessRifle +CartridgePistolRubber: CartridgePistol +CartridgeMagnumRubber: CartridgeMagnum +CartridgeLightRifleRubber: CartridgeLightRifle +CartridgeRifleRubber: CartridgeRifle +CartridgeCaselessRifleRubber: CartridgeCaselessRifle +MagazinePistolRubber: MagazinePistol +MagazinePistolSubMachineGunRubber: MagazinePistolSubMachineGun +MagazinePistolCaselessRifleRubber: MagazinePistolCaselessRifle +MagazineMagnumRubber: MagazineMagnum +MagazineMagnumSubMachineGunRubber: MagazineMagnumSubMachineGun +MagazineLightRifleRubber: MagazineLightRifle +MagazineRifleRubber: MagazineRifle +MagazineCaselessRifleRubber: MagazineCaselessRifle +MagazineCaselessRifleShortRubber: MagazineCaselessRifleShort +SpeedLoaderPistolRubber: SpeedLoaderPistol +SpeedLoaderMagnumRubber: SpeedLoaderMagnum +MagazineBoxPistolRubber: MagazineBoxPistol +# RIP box of magnum rubbers 202X to 2024 +MagazineBoxMagnumRubber: MagazineBoxMagnum +MagazineBoxLightRifleRubber: MagazineBoxLightRifle +MagazineBoxRifleRubber: MagazineBoxRifle +MagazineBoxRifleBigRubber: MagazineBoxRifleBig +MagazineBoxCaselessRifleRubber: MagazineBoxCaselessRifle +MagazineBoxCaselessRifleBigRubber: MagazineBoxCaselessRifle10x24 +BoxMagazinePistolRubber: BoxMagazinePistol +BoxMagazinePistolHighCapacityRubber: BoxMagazinePistolHighCapacity +BoxMagazinePistolSubMachineGunRubber: BoxMagazinePistolSubMachineGun +BoxMagazineLightRifleRubber: BoxMagazineLightRifle +BoxMagazineRifleRubber: BoxMagazineRifle +BoxMagazineCaselessRifleRubber: BoxMagazinePistolCaselessRifle +BoxMagazineMagnumSubMachineGunRubber: BoxMagazineMagnumSubMachineGun +WeaponPistolMk58Nonlethal: WeaponPistolMk58 +WeaponPistolN1984Nonlethal: WeaponPistolN1984 +WeaponSubMachineGunVectorRubber: WeaponSubMachineGunVector +WeaponSubMachineGunDrozdRubber: WeaponSubMachineGunDrozd +WeaponRifleLecterRubber: WeaponRifleLecter +ReinforcementRadioSyndicateMonkey: ReinforcementRadioSyndicateAncestor +ReinforcementRadioSyndicateMonkeyNukeops: ReinforcementRadioSyndicateAncestorNukeops diff --git a/RobustToolbox b/RobustToolbox index eb63809999..3330d96177 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit eb638099999dce3a43d90772ca976ae010d649c0 +Subproject commit 3330d9617728534bfef313201de0327c4e7f0627 diff --git a/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua b/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua new file mode 100644 index 0000000000..3291685071 --- /dev/null +++ b/Tools/SS14 Aseprite Plugins/Displacement Map Flip.lua @@ -0,0 +1,78 @@ +local sprite = app.editor.sprite +local cel = app.cel + +if sprite.selection.isEmpty then + print("You need to select something sorry") + return +end + +local diag = Dialog{ + title = "Flip Displacement Map" +} + +diag:check{ + id = "horizontal", + label = "flip horizontal?" +} + +diag:check{ + id = "vertical", + label = "flip vertical?" +} + +diag:button{ + text = "ok", + focus = true, + onclick = function(ev) + local horizontal = diag.data["horizontal"] + local vertical = diag.data["vertical"] + + local selection = sprite.selection + local image = cel.image:clone() + + for x = 0, selection.bounds.width do + for y = 0, selection.bounds.height do + local xSel = x + selection.origin.x + local ySel = y + selection.origin.y + + local xImg = xSel - cel.position.x + local yImg = ySel - cel.position.y + + if xImg < 0 or xImg >= image.width or yImg < 0 or yImg >= image.height then + goto continue + end + + local imgValue = image:getPixel(xImg, yImg) + local color = Color(imgValue) + + if horizontal then + color.red = 128 + -(color.red - 128) + end + + if vertical then + color.green = 128 + -(color.green - 128) + end + + image:drawPixel( + xImg, + yImg, + app.pixelColor.rgba(color.red, color.green, color.blue, color.alpha)) + + ::continue:: + end + end + + cel.image = image + + diag:close() + end +} + +diag:button{ + text = "cancel", + onclick = function(ev) + diag:close() + end +} + +diag:show() diff --git a/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua b/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua new file mode 100644 index 0000000000..b16ab797e7 --- /dev/null +++ b/Tools/SS14 Aseprite Plugins/Displacement Map Visualizer.lua @@ -0,0 +1,135 @@ +-- Displacement Map Visualizer +-- +-- This script will create a little preview window that will test a displacement map. +-- +-- TODO: Handling of sizes != 127 doesn't work properly and rounds differently from the real shader. Ah well. + +local scale = 4 + +-- This script requires UI +if not app.isUIAvailable then + return +end + +local getOffsetPixel = function(x, y, image, rect) + local posX = x - rect.x + local posY = y - rect.y + + if posX < 0 or posX >= image.width or posY < 0 or posY >= image.height then + return image.spec.transparentColor + end + + return image:getPixel(posX, posY) +end + +local pixelValueToColor = function(sprite, value) + return Color(value) +end + +local applyDisplacementMap = function(width, height, size, displacement, displacementRect, target, targetRect) + -- print(Color(displacement:getPixel(17, 15)).red) + local image = target:clone() + image:resize(width, height) + image:clear() + + for x = 0, width - 1 do + for y = 0, height - 1 do + local value = getOffsetPixel(x, y, displacement, displacementRect) + local color = pixelValueToColor(sprite, value) + + if color.alpha ~= 0 then + local offset_x = (color.red - 128) / 127 * size + local offset_y = (color.green - 128) / 127 * size + + local colorValue = getOffsetPixel(x + offset_x, y + offset_y, target, targetRect) + image:drawPixel(x, y, colorValue) + end + end + end + + return image +end + +local dialog = nil + +local sprite = app.editor.sprite +local spriteChanged = sprite.events:on("change", + function(ev) + dialog:repaint() + end) + +local layers = {} +for i,layer in ipairs(sprite.layers) do + table.insert(layers, 1, layer.name) +end + +local findLayer = function(sprite, name) + for i, layer in ipairs(sprite.layers) do + if layer.name == name then + return layer + end + end + + return nil +end + +dialog = Dialog{ + title = "Displacement map preview", + onclose = function(ev) + sprite.events:off(spriteChanged) + end} + +dialog:canvas{ + id = "canvas", + width = sprite.width * scale, + height = sprite.height * scale, + onpaint = function(ev) + local context = ev.context + + local layerDisplacement = findLayer(sprite, dialog.data["displacement-select"]) + local layerTarget = findLayer(sprite, dialog.data["reference-select"]) + -- print(layerDisplacement.name) + -- print(layerTarget.name) + local celDisplacement = layerDisplacement:cel(1) + local celTarget = layerTarget:cel(1) + local image = applyDisplacementMap( + sprite.width, sprite.height, + dialog.data["size"], + celDisplacement.image, celDisplacement.bounds, + celTarget.image, celTarget.bounds) + + context:drawImage(image, 0, 0, image.width, image.height, 0, 0, image.width * scale, context.width, context.height) + end +} + +dialog:combobox{ + id = "displacement-select", + label = "displacement layer", + options = layers, + onchange = function(ev) + dialog:repaint() + end +} + +dialog:combobox{ + id = "reference-select", + label = "reference layer", + options = layers, + onchange = function(ev) + dialog:repaint() + end +} + + +dialog:slider{ + id = "size", + label = "displacement size", + min = 1, + max = 127, + value = 127, + onchange = function(ev) + dialog:repaint() + end +} + +dialog:show{wait = false}