diff --git a/Content.Client/Actions/ActionEvents.cs b/Content.Client/Actions/ActionEvents.cs index 36739b0dbe..2fdf25c976 100644 --- a/Content.Client/Actions/ActionEvents.cs +++ b/Content.Client/Actions/ActionEvents.cs @@ -1,11 +1,9 @@ -using Content.Shared.Actions.ActionTypes; - namespace Content.Client.Actions; /// -/// This event is raised when a user clicks on an empty action slot. Enables other systems to fill this slow. +/// This event is raised when a user clicks on an empty action slot. Enables other systems to fill this slot. /// public sealed class FillActionSlotEvent : EntityEventArgs { - public ActionType? Action; + public EntityUid? Action; } diff --git a/Content.Client/Actions/ActionsSystem.cs b/Content.Client/Actions/ActionsSystem.cs index ba007f35aa..55ced8632c 100644 --- a/Content.Client/Actions/ActionsSystem.cs +++ b/Content.Client/Actions/ActionsSystem.cs @@ -1,10 +1,10 @@ using System.IO; using System.Linq; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using JetBrains.Annotations; using Robust.Client.GameObjects; using Robust.Client.Player; +using Robust.Shared.Containers; using Robust.Shared.ContentPack; using Robust.Shared.GameStates; using Robust.Shared.Input.Binding; @@ -12,6 +12,7 @@ using Robust.Shared.Serialization.Manager; using Robust.Shared.Serialization.Markdown; using Robust.Shared.Serialization.Markdown.Mapping; using Robust.Shared.Serialization.Markdown.Sequence; +using Robust.Shared.Serialization.Markdown.Value; using Robust.Shared.Utility; using YamlDotNet.RepresentationModel; @@ -20,14 +21,15 @@ namespace Content.Client.Actions [UsedImplicitly] public sealed class ActionsSystem : SharedActionsSystem { - public delegate void OnActionReplaced(ActionType existing, ActionType action); + public delegate void OnActionReplaced(EntityUid actionId); [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IResourceManager _resources = default!; [Dependency] private readonly ISerializationManager _serialization = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; - public event Action? ActionAdded; - public event Action? ActionRemoved; + public event Action? ActionAdded; + public event Action? ActionRemoved; public event OnActionReplaced? ActionReplaced; public event Action? ActionsUpdated; public event Action? LinkActions; @@ -35,7 +37,11 @@ namespace Content.Client.Actions public event Action? ClearAssignments; public event Action>? AssignSlot; - public ActionsComponent? PlayerActions { get; private set; } + /// + /// Queue of entities with that needs to be updated after + /// handling a state. + /// + private readonly Queue _actionHoldersQueue = new(); public override void Initialize() { @@ -45,110 +51,90 @@ namespace Content.Client.Actions SubscribeLocalEvent(HandleComponentState); } - public override void Dirty(ActionType action) + public override void Dirty(EntityUid? actionId) { - if (_playerManager.LocalPlayer?.ControlledEntity != action.AttachedEntity) + var action = GetActionData(actionId); + if (_playerManager.LocalPlayer?.ControlledEntity != action?.AttachedEntity) return; - base.Dirty(action); + base.Dirty(actionId); ActionsUpdated?.Invoke(); } private void HandleComponentState(EntityUid uid, ActionsComponent component, ref ComponentHandleState args) { - if (args.Current is not ActionsComponentState state) + if (args.Current is not ActionsComponentState) return; - state.SortedActions ??= new SortedSet(state.Actions); - var serverActions = state.SortedActions; - var removed = new List(); - - foreach (var act in component.Actions.ToList()) - { - if (act.ClientExclusive) - continue; - - if (!serverActions.TryGetValue(act, out var serverAct)) - { - component.Actions.Remove(act); - if (act.AutoRemove) - removed.Add(act); - - continue; - } - - act.CopyFrom(serverAct); - } - - var added = new List(); - - // Anything that remains is a new action - foreach (var newAct in serverActions) - { - if (component.Actions.Contains(newAct)) - continue; - - // We create a new action, not just sorting a reference to the state's action. - var action = (ActionType) newAct.Clone(); - component.Actions.Add(action); - added.Add(action); - } - - if (_playerManager.LocalPlayer?.ControlledEntity != uid) - return; - - foreach (var action in removed) - { - ActionRemoved?.Invoke(action); - } - - foreach (var action in added) - { - ActionAdded?.Invoke(action); - } - - ActionsUpdated?.Invoke(); + _actionHoldersQueue.Enqueue(uid); } - protected override void AddActionInternal(ActionsComponent comp, ActionType action) + protected override void AddActionInternal(EntityUid actionId, IContainer container) { // Sometimes the client receives actions from the server, before predicting that newly added components will add // their own shared actions. Just in case those systems ever decided to directly access action properties (e.g., // action.Toggled), we will remove duplicates: - if (comp.Actions.TryGetValue(action, out var existing)) + if (container.Contains(actionId)) { - comp.Actions.Remove(existing); - ActionReplaced?.Invoke(existing, action); + ActionReplaced?.Invoke(actionId); + } + else + { + container.Insert(actionId); + } + } + + public override void AddAction(EntityUid holderId, EntityUid actionId, EntityUid? provider, ActionsComponent? holder = null, BaseActionComponent? action = null, bool dirty = true, IContainer? actionContainer = null) + { + if (!Resolve(holderId, ref holder, false)) + return; + + action ??= GetActionData(actionId); + if (action == null) + { + Log.Warning($"No {nameof(BaseActionComponent)} found on entity {actionId}"); + return; } - comp.Actions.Add(action); + dirty &= !action.ClientExclusive; + base.AddAction(holderId, actionId, provider, holder, action, dirty, actionContainer); + + if (holderId == _playerManager.LocalPlayer?.ControlledEntity) + ActionAdded?.Invoke(actionId); } - public override void AddAction(EntityUid uid, ActionType action, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true) + public override void RemoveAction(EntityUid holderId, EntityUid? actionId, ActionsComponent? comp = null, BaseActionComponent? action = null, bool dirty = true, ContainerManagerComponent? actionContainer = null) { - if (!Resolve(uid, ref comp, false)) + if (GameTiming.ApplyingState) return; - dirty &= !action.ClientExclusive; - base.AddAction(uid, action, provider, comp, dirty); + if (!Resolve(holderId, ref comp, false)) + return; - if (uid == _playerManager.LocalPlayer?.ControlledEntity) - ActionAdded?.Invoke(action); + if (actionId == null) + return; + + action ??= GetActionData(actionId); + + if (action is { ClientExclusive: false }) + return; + + dirty &= !action?.ClientExclusive ?? true; + base.RemoveAction(holderId, actionId, comp, action, dirty, actionContainer); + + if (_playerManager.LocalPlayer?.ControlledEntity != holderId) + return; + + if (action == null || action.AutoRemove) + ActionRemoved?.Invoke(actionId.Value); } - public override void RemoveAction(EntityUid uid, ActionType action, ActionsComponent? comp = null, bool dirty = true) + public IEnumerable<(EntityUid Id, BaseActionComponent Comp)> GetClientActions() { - if (GameTiming.ApplyingState && !action.ClientExclusive) - return; + if (_playerManager.LocalPlayer?.ControlledEntity is not { } user) + return Enumerable.Empty<(EntityUid, BaseActionComponent)>(); - if (!Resolve(uid, ref comp, false)) - return; - - dirty &= !action.ClientExclusive; - base.RemoveAction(uid, action, comp, dirty); - - if (action.AutoRemove && uid == _playerManager.LocalPlayer?.ControlledEntity) - ActionRemoved?.Invoke(action); + return GetActions(user); } private void OnPlayerAttached(EntityUid uid, ActionsComponent component, PlayerAttachedEvent args) @@ -163,20 +149,18 @@ namespace Content.Client.Actions public void UnlinkAllActions() { - PlayerActions = null; UnlinkActions?.Invoke(); } public void LinkAllActions(ActionsComponent? actions = null) { - var player = _playerManager.LocalPlayer?.ControlledEntity; - if (player == null || !Resolve(player.Value, ref actions, false)) + if (_playerManager.LocalPlayer?.ControlledEntity is not { } user || + !Resolve(user, ref actions, false)) { return; } LinkActions?.Invoke(actions); - PlayerActions = actions; } public override void Shutdown() @@ -185,29 +169,30 @@ namespace Content.Client.Actions CommandBinds.Unregister(); } - public void TriggerAction(ActionType? action) + public void TriggerAction(EntityUid actionId, BaseActionComponent action) { - if (PlayerActions == null || action == null || _playerManager.LocalPlayer?.ControlledEntity is not { Valid: true } user) + if (_playerManager.LocalPlayer?.ControlledEntity is not { } user || + !TryComp(user, out ActionsComponent? actions)) + { return; + } if (action.Provider != null && Deleted(action.Provider)) return; - if (action is not InstantAction instantAction) - { + if (action is not InstantActionComponent instantAction) return; - } if (action.ClientExclusive) { if (instantAction.Event != null) instantAction.Event.Performer = user; - PerformAction(user, PlayerActions, instantAction, instantAction.Event, GameTiming.CurTime); + PerformAction(user, actions, actionId, instantAction, instantAction.Event, GameTiming.CurTime); } else { - var request = new RequestPerformActionEvent(instantAction); + var request = new RequestPerformActionEvent(actionId); EntityManager.RaisePredictiveEvent(request); } } @@ -239,7 +224,7 @@ namespace Content.Client.Actions /// public void LoadActionAssignments(string path, bool userData) { - if (PlayerActions == null) + if (_playerManager.LocalPlayer?.ControlledEntity is not { } user) return; var file = new ResPath(path).ToRootedPath(); @@ -265,17 +250,13 @@ namespace Content.Client.Actions if (!map.TryGet("action", out var actionNode)) continue; - var action = _serialization.Read(actionNode, notNullableOverride: true); + var action = _serialization.Read(actionNode, notNullableOverride: true); + var actionId = Spawn(null); + AddComp(actionId, action); + AddAction(user, actionId, null); - if (PlayerActions.Actions.TryGetValue(action, out var existingAction)) - { - existingAction.CopyFrom(action); - action = existingAction; - } - else - { - PlayerActions.Actions.Add(action); - } + if (map.TryGet("name", out var nameNode)) + _metaData.SetEntityName(actionId, nameNode.Value); if (!map.TryGet("assignments", out var assignmentNode)) continue; @@ -284,7 +265,7 @@ namespace Content.Client.Actions foreach (var index in nodeAssignments) { - var assignment = new SlotAssignment(index.Hotbar, index.Slot, action); + var assignment = new SlotAssignment(index.Hotbar, index.Slot, actionId); assignments.Add(assignment); } } @@ -292,6 +273,73 @@ namespace Content.Client.Actions AssignSlot?.Invoke(assignments); } - public record struct SlotAssignment(byte Hotbar, byte Slot, ActionType Action); + public override void Update(float frameTime) + { + base.Update(frameTime); + + if (_actionHoldersQueue.Count == 0) + return; + + var removed = new List(); + var added = new List(); + var query = GetEntityQuery(); + var queue = new Queue(_actionHoldersQueue); + _actionHoldersQueue.Clear(); + + while (queue.TryDequeue(out var holderId)) + { + if (!TryGetContainer(holderId, out var container) || container.ExpectedEntities.Count > 0) + { + _actionHoldersQueue.Enqueue(holderId); + continue; + } + + if (!query.TryGetComponent(holderId, out var holder)) + continue; + + removed.Clear(); + added.Clear(); + + foreach (var (act, data) in holder.OldClientActions.ToList()) + { + if (data.ClientExclusive) + continue; + + if (!container.Contains(act)) + { + holder.OldClientActions.Remove(act); + if (data.AutoRemove) + removed.Add(act); + } + } + + // Anything that remains is a new action + foreach (var newAct in container.ContainedEntities) + { + if (!holder.OldClientActions.ContainsKey(newAct)) + added.Add(newAct); + + if (TryGetActionData(newAct, out var serverData)) + holder.OldClientActions[newAct] = new ActionMetaData(serverData.ClientExclusive, serverData.AutoRemove); + } + + if (_playerManager.LocalPlayer?.ControlledEntity != holderId) + return; + + foreach (var action in removed) + { + ActionRemoved?.Invoke(action); + } + + foreach (var action in added) + { + ActionAdded?.Invoke(action); + } + + ActionsUpdated?.Invoke(); + } + } + + public record struct SlotAssignment(byte Hotbar, byte Slot, EntityUid ActionId); } } diff --git a/Content.Client/Actions/UI/ActionAlertTooltip.cs b/Content.Client/Actions/UI/ActionAlertTooltip.cs index 319c682299..f48350d772 100644 --- a/Content.Client/Actions/UI/ActionAlertTooltip.cs +++ b/Content.Client/Actions/UI/ActionAlertTooltip.cs @@ -1,9 +1,5 @@ -using System; -using Content.Client.Stylesheets; -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Content.Client.Stylesheets; using Robust.Client.UserInterface.Controls; -using Robust.Shared.IoC; using Robust.Shared.Timing; using Robust.Shared.Utility; using static Robust.Client.UserInterface.Controls.BoxContainer; diff --git a/Content.Client/Decals/DecalPlacementSystem.cs b/Content.Client/Decals/DecalPlacementSystem.cs index cf5f89ffd8..03248f4355 100644 --- a/Content.Client/Decals/DecalPlacementSystem.cs +++ b/Content.Client/Decals/DecalPlacementSystem.cs @@ -2,7 +2,6 @@ using System.Numerics; using Content.Client.Actions; using Content.Client.Decals.Overlays; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Decals; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -10,7 +9,6 @@ using Robust.Client.Input; using Robust.Shared.Input; using Robust.Shared.Input.Binding; using Robust.Shared.Prototypes; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Client.Decals; @@ -22,6 +20,7 @@ public sealed class DecalPlacementSystem : EntitySystem [Dependency] private readonly IOverlayManager _overlay = default!; [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly InputSystem _inputSystem = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly SpriteSystem _sprite = default!; @@ -153,9 +152,10 @@ public sealed class DecalPlacementSystem : EntitySystem Cleanable = _cleanable, }; - ev.Action = new WorldTargetAction() + var actionId = Spawn(null); + AddComp(actionId, new WorldTargetActionComponent { - DisplayName = $"{_decalId} ({_decalColor.ToHex()}, {(int) _decalAngle.Degrees})", // non-unique actions may be considered duplicates when saving/loading. + // non-unique actions may be considered duplicates when saving/loading. Icon = decalProto.Sprite, Repeat = true, ClientExclusive = true, @@ -164,7 +164,11 @@ public sealed class DecalPlacementSystem : EntitySystem Range = -1, Event = actionEvent, IconColor = _decalColor, - }; + }); + + _metaData.SetEntityName(actionId, $"{_decalId} ({_decalColor.ToHex()}, {(int) _decalAngle.Degrees})"); + + ev.Action = actionId; } public override void Shutdown() @@ -194,24 +198,3 @@ public sealed class DecalPlacementSystem : EntitySystem _inputSystem.SetEntityContextActive(); } } - -public sealed partial class PlaceDecalActionEvent : WorldTargetActionEvent -{ - [DataField("decalId", customTypeSerializer:typeof(PrototypeIdSerializer), required:true)] - public string DecalId = string.Empty; - - [DataField("color")] - public Color Color; - - [DataField("rotation")] - public double Rotation; - - [DataField("snap")] - public bool Snap; - - [DataField("zIndex")] - public int ZIndex; - - [DataField("cleanable")] - public bool Cleanable; -} diff --git a/Content.Client/Ghost/GhostSystem.cs b/Content.Client/Ghost/GhostSystem.cs index 8207e0eac9..944d4e0de0 100644 --- a/Content.Client/Ghost/GhostSystem.cs +++ b/Content.Client/Ghost/GhostSystem.cs @@ -2,12 +2,10 @@ using Content.Client.Movement.Systems; using Content.Shared.Actions; using Content.Shared.Ghost; using Content.Shared.Popups; -using JetBrains.Annotations; using Robust.Client.Console; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.Player; -using Robust.Shared.GameStates; namespace Content.Client.Ghost { @@ -81,9 +79,9 @@ namespace Content.Client.Ghost sprite.Visible = GhostVisibility; } - _actions.AddAction(uid, component.ToggleLightingAction, null); - _actions.AddAction(uid, component.ToggleFoVAction, null); - _actions.AddAction(uid, component.ToggleGhostsAction, null); + _actions.AddAction(uid, ref component.ToggleLightingActionEntity, component.ToggleGhostsAction); + _actions.AddAction(uid, ref component.ToggleFoVActionEntity, component.ToggleFoVAction); + _actions.AddAction(uid, ref component.ToggleGhostsActionEntity, component.ToggleGhostsAction); } private void OnToggleLighting(EntityUid uid, GhostComponent component, ToggleLightingActionEvent args) @@ -118,9 +116,9 @@ namespace Content.Client.Ghost private void OnGhostRemove(EntityUid uid, GhostComponent component, ComponentRemove args) { - _actions.RemoveAction(uid, component.ToggleLightingAction); - _actions.RemoveAction(uid, component.ToggleFoVAction); - _actions.RemoveAction(uid, component.ToggleGhostsAction); + _actions.RemoveAction(uid, component.ToggleLightingActionEntity); + _actions.RemoveAction(uid, component.ToggleFoVActionEntity); + _actions.RemoveAction(uid, component.ToggleGhostsActionEntity); if (uid != _playerManager.LocalPlayer?.ControlledEntity) return; diff --git a/Content.Client/Mapping/MappingSystem.cs b/Content.Client/Mapping/MappingSystem.cs index 2d6db2bb46..4456be36a6 100644 --- a/Content.Client/Mapping/MappingSystem.cs +++ b/Content.Client/Mapping/MappingSystem.cs @@ -1,10 +1,11 @@ using Content.Client.Actions; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Content.Shared.Mapping; using Content.Shared.Maps; using Robust.Client.Placement; using Robust.Shared.Map; using Robust.Shared.Utility; +using static Robust.Shared.Utility.SpriteSpecifier; namespace Content.Client.Mapping; @@ -13,16 +14,17 @@ public sealed partial class MappingSystem : EntitySystem [Dependency] private readonly IPlacementManager _placementMan = default!; [Dependency] private readonly ITileDefinitionManager _tileMan = default!; [Dependency] private readonly ActionsSystem _actionsSystem = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; /// /// The icon to use for space tiles. /// - private readonly SpriteSpecifier _spaceIcon = new SpriteSpecifier.Texture(new ("Tiles/cropped_parallax.png")); + private readonly SpriteSpecifier _spaceIcon = new Texture(new ("Tiles/cropped_parallax.png")); /// /// The icon to use for entity-eraser. /// - private readonly SpriteSpecifier _deleteIcon = new SpriteSpecifier.Texture(new ("Interface/VerbIcons/delete.svg.192dpi.png")); + private readonly SpriteSpecifier _deleteIcon = new Texture(new ("Interface/VerbIcons/delete.svg.192dpi.png")); public string DefaultMappingActions = "/mapping_actions.yml"; @@ -73,6 +75,9 @@ public sealed partial class MappingSystem : EntitySystem else return; + InstantActionComponent action; + string name; + if (tileDef != null) { if (tileDef is not ContentTileDefinition contentTileDef) @@ -80,45 +85,51 @@ public sealed partial class MappingSystem : EntitySystem var tileIcon = contentTileDef.IsSpace ? _spaceIcon - : new SpriteSpecifier.Texture(contentTileDef.Sprite!.Value); + : new Texture(contentTileDef.Sprite!.Value); - ev.Action = new InstantAction() + action = new InstantActionComponent { ClientExclusive = true, CheckCanInteract = false, Event = actionEvent, - DisplayName = Loc.GetString(tileDef.Name), Icon = tileIcon }; - return; + name = Loc.GetString(tileDef.Name); } - - if (actionEvent.Eraser) + else if (actionEvent.Eraser) { - ev.Action = new InstantAction() + action = new InstantActionComponent { ClientExclusive = true, CheckCanInteract = false, Event = actionEvent, - DisplayName = "action-name-mapping-erase", Icon = _deleteIcon, }; - return; + name = Loc.GetString("action-name-mapping-erase"); + } + else + { + if (string.IsNullOrWhiteSpace(actionEvent.EntityType)) + return; + + action = new InstantActionComponent + { + ClientExclusive = true, + CheckCanInteract = false, + Event = actionEvent, + Icon = new EntityPrototype(actionEvent.EntityType), + }; + + name = actionEvent.EntityType; } - if (string.IsNullOrWhiteSpace(actionEvent.EntityType)) - return; + var actionId = Spawn(null); + AddComp(actionId, action); + _metaData.SetEntityName(actionId, name); - ev.Action = new InstantAction() - { - ClientExclusive = true, - CheckCanInteract = false, - Event = actionEvent, - DisplayName = actionEvent.EntityType, - Icon = new SpriteSpecifier.EntityPrototype(actionEvent.EntityType), - }; + ev.Action = actionId; } private void OnStartPlacementAction(StartPlacementActionEvent args) @@ -140,18 +151,3 @@ public sealed partial class MappingSystem : EntitySystem _placementMan.ToggleEraser(); } } - -public sealed partial class StartPlacementActionEvent : InstantActionEvent -{ - [DataField("entityType")] - public string? EntityType; - - [DataField("tileId")] - public string? TileId; - - [DataField("placementOption")] - public string? PlacementOption; - - [DataField("eraser")] - public bool Eraser; -} diff --git a/Content.Client/NetworkConfigurator/Systems/NetworkConfiguratorSystem.cs b/Content.Client/NetworkConfigurator/Systems/NetworkConfiguratorSystem.cs index d56296cae9..48b378af04 100644 --- a/Content.Client/NetworkConfigurator/Systems/NetworkConfiguratorSystem.cs +++ b/Content.Client/NetworkConfigurator/Systems/NetworkConfiguratorSystem.cs @@ -3,7 +3,6 @@ using Content.Client.Actions; using Content.Client.Items; using Content.Client.Message; using Content.Client.Stylesheets; -using Content.Shared.Actions.ActionTypes; using Content.Shared.DeviceNetwork.Components; using Content.Shared.DeviceNetwork.Systems; using Content.Shared.Input; @@ -22,11 +21,11 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem { [Dependency] private readonly IPlayerManager _playerManager = default!; [Dependency] private readonly IOverlayManager _overlay = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly IInputManager _inputManager = default!; - private const string Action = "ClearNetworkLinkOverlays"; + [ValidatePrototypeId] + private const string Action = "ActionClearNetworkLinkOverlays"; public override void Initialize() { @@ -71,7 +70,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (!EntityQuery().Any()) { _overlay.RemoveOverlay(); - _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, _prototypeManager.Index(Action)); + _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, Action); } @@ -81,7 +80,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (!_overlay.HasOverlay()) { _overlay.AddOverlay(new NetworkConfiguratorLinkOverlay()); - _actions.AddAction(_playerManager.LocalPlayer.ControlledEntity.Value, new InstantAction(_prototypeManager.Index(Action)), null); + _actions.AddAction(_playerManager.LocalPlayer.ControlledEntity.Value, Spawn(Action), null); } EnsureComp(component.ActiveDeviceList.Value); @@ -103,7 +102,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem if (_playerManager.LocalPlayer?.ControlledEntity != null) { - _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, _prototypeManager.Index(Action)); + _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, Action); } } diff --git a/Content.Client/Store/Ui/StoreMenu.xaml.cs b/Content.Client/Store/Ui/StoreMenu.xaml.cs index a3f246badb..c59c3a1062 100644 --- a/Content.Client/Store/Ui/StoreMenu.xaml.cs +++ b/Content.Client/Store/Ui/StoreMenu.xaml.cs @@ -1,15 +1,15 @@ +using System.Linq; +using Content.Client.Actions; using Content.Client.Message; +using Content.Shared.FixedPoint; using Content.Shared.Store; using Robust.Client.AutoGenerated; using Robust.Client.GameObjects; +using Robust.Client.Graphics; using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.CustomControls; using Robust.Client.UserInterface.XAML; using Robust.Shared.Prototypes; -using Robust.Client.Graphics; -using Content.Shared.Actions.ActionTypes; -using System.Linq; -using Content.Shared.FixedPoint; namespace Content.Client.Store.Ui; @@ -128,9 +128,12 @@ public sealed partial class StoreMenu : DefaultWindow } else if (listing.ProductAction != null) { - var action = _prototypeManager.Index(listing.ProductAction); - if (action.Icon != null) + var actionId = _entityManager.Spawn(listing.ProductAction); + if (_entityManager.System().TryGetActionData(actionId, out var action) && + action.Icon != null) + { texture = spriteSys.Frame0(action.Icon); + } } var newListing = new StoreListingControl(listingName, listingDesc, GetListingPriceString(listing), canBuy, texture); diff --git a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs index ea91e95951..7e288070b0 100644 --- a/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs +++ b/Content.Client/UserInterface/Systems/Actions/ActionUIController.cs @@ -13,7 +13,6 @@ using Content.Client.UserInterface.Systems.Actions.Widgets; using Content.Client.UserInterface.Systems.Actions.Windows; using Content.Client.UserInterface.Systems.Gameplay; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Input; using Robust.Client.GameObjects; using Robust.Client.Graphics; @@ -65,7 +64,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged /// Action slot we are currently selecting a target for. /// - public TargetedAction? SelectingTargetFor { get; private set; } + public EntityUid? SelectingTargetFor { get; private set; } public ActionUIController() { @@ -175,7 +174,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged private bool TargetingOnUse(in PointerInputCmdArgs args) { - if (!_timing.IsFirstTimePredicted || _actionsSystem == null || SelectingTargetFor is not { } action) + if (!_timing.IsFirstTimePredicted || _actionsSystem == null || SelectingTargetFor is not { } actionId) return false; if (_playerManager.LocalPlayer?.ControlledEntity is not { } user) @@ -184,6 +183,12 @@ public sealed class ActionUIController : UIController, IOnStateChanged action.Enabled, Filters.Item => action.Provider != null && action.Provider != _playerManager.LocalPlayer?.ControlledEntity, Filters.Innate => action.Provider == null || action.Provider == _playerManager.LocalPlayer?.ControlledEntity, - Filters.Instant => action is InstantAction, - Filters.Targeted => action is TargetedAction, + Filters.Instant => action is InstantActionComponent, + Filters.Targeted => action is BaseTargetActionComponent, _ => throw new ArgumentOutOfRangeException(nameof(filter), filter, null) }; } @@ -518,7 +533,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged actions) + private void PopulateActions(IEnumerable<(EntityUid Id, BaseActionComponent Comp)> actions) { if (_window == null) return; @@ -529,7 +544,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged? actions = (component ?? _actionsSystem?.PlayerActions)?.Actions; - actions ??= Array.Empty(); + var actions = _actionsSystem.GetClientActions(); if (filters.Count == 0 && string.IsNullOrWhiteSpace(search)) { @@ -557,45 +570,46 @@ public sealed class ActionUIController : UIController, IOnStateChanged { - if (filters.Count > 0 && filters.Any(filter => !MatchesFilter(action, filter))) + if (filters.Count > 0 && filters.Any(filter => !MatchesFilter(action.Comp, filter))) return false; - if (action.Keywords.Any(keyword => search.Contains(keyword, StringComparison.OrdinalIgnoreCase))) + if (action.Comp.Keywords.Any(keyword => search.Contains(keyword, StringComparison.OrdinalIgnoreCase))) return true; - if (action.DisplayName.Contains(search, StringComparison.OrdinalIgnoreCase)) + var name = EntityManager.GetComponent(action.Id).EntityName; + if (name.Contains(search, StringComparison.OrdinalIgnoreCase)) return true; - if (action.Provider == null || action.Provider == _playerManager.LocalPlayer?.ControlledEntity) + if (action.Comp.Provider == null || action.Comp.Provider == _playerManager.LocalPlayer?.ControlledEntity) return false; - var name = EntityManager.GetComponent(action.Provider.Value).EntityName; - return name.Contains(search, StringComparison.OrdinalIgnoreCase); + var providerName = EntityManager.GetComponent(action.Comp.Provider.Value).EntityName; + return providerName.Contains(search, StringComparison.OrdinalIgnoreCase); }); PopulateActions(actions); } - private void SetAction(ActionButton button, ActionType? type) + private void SetAction(ActionButton button, EntityUid? actionId) { int position; - if (type == null) + if (actionId == null) { button.ClearData(); if (_container?.TryGetButtonIndex(button, out position) ?? false) { - CurrentPage[position] = type; + CurrentPage[position] = actionId; } return; } - if (button.TryReplaceWith(type) && + if (button.TryReplaceWith(actionId.Value) && _container != null && _container.TryGetButtonIndex(button, out position)) { - CurrentPage[position] = type; + CurrentPage[position] = actionId; } } @@ -603,7 +617,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged actionType.AutoPopulate).ToList(); + if (_actionsSystem == null) + return; + + var actions = _actionsSystem.GetClientActions().Where(action => action.Comp.AutoPopulate).ToList(); var offset = 0; var totalPages = _pages.Count; @@ -892,7 +912,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged - private void ToggleTargeting(TargetedAction action) + private void ToggleTargeting(EntityUid actionId, BaseTargetActionComponent action) { - if (SelectingTargetFor == action) + if (SelectingTargetFor == actionId) { StopTargeting(); return; } - StartTargeting(action); + StartTargeting(actionId, action); } /// /// Puts us in targeting mode, where we need to pick either a target point or entity /// - private void StartTargeting(TargetedAction action) + private void StartTargeting(EntityUid actionId, BaseTargetActionComponent action) { // If we were targeting something else we should stop StopTargeting(); - SelectingTargetFor = action; + SelectingTargetFor = actionId; // override "held-item" overlay if (action.TargetingIndicator && _overlays.TryGetOverlay(out var handOverlay)) @@ -955,7 +975,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged? predicate = null; @@ -992,20 +1012,20 @@ public sealed class ActionUIController : UIController, IOnStateChanged _data[index]; set => _data[index] = value; } - public static implicit operator ActionType?[](ActionPage p) + public static implicit operator EntityUid?[](ActionPage p) { return p._data.ToArray(); } diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs index 1b2dcdb89c..5a95194b1c 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs @@ -1,9 +1,9 @@ using System.Numerics; +using Content.Client.Actions; using Content.Client.Actions.UI; using Content.Client.Cooldown; using Content.Client.Stylesheets; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Client.UserInterface; @@ -19,11 +19,14 @@ namespace Content.Client.UserInterface.Systems.Actions.Controls; public sealed class ActionButton : Control { + private IEntityManager? _entities; + private ActionUIController Controller => UserInterfaceManager.GetUIController(); + private IEntityManager Entities => _entities ??= IoCManager.Resolve(); + private ActionsSystem Actions => Entities.System(); private bool _beingHovered; private bool _depressed; private bool _toggled; - private bool _spriteViewDirty; public BoundKeyFunction? KeyBind { @@ -48,7 +51,7 @@ public sealed class ActionButton : Control private readonly SpriteView _smallItemSpriteView; private readonly SpriteView _bigItemSpriteView; - public ActionType? Action { get; private set; } + public EntityUid? ActionId { get; private set; } public bool Locked { get; set; } public event Action? ActionPressed; @@ -176,11 +179,11 @@ public sealed class ActionButton : Control private Control? SupplyTooltip(Control sender) { - if (Action == null) + if (!Entities.TryGetComponent(ActionId, out MetaDataComponent? metadata)) return null; - var name = FormattedMessage.FromMarkupPermissive(Loc.GetString(Action.DisplayName)); - var decr = FormattedMessage.FromMarkupPermissive(Loc.GetString(Action.Description)); + var name = FormattedMessage.FromMarkupPermissive(Loc.GetString(metadata.EntityName)); + var decr = FormattedMessage.FromMarkupPermissive(Loc.GetString(metadata.EntityDescription)); return new ActionAlertTooltip(name, decr); } @@ -192,18 +195,9 @@ public sealed class ActionButton : Control private void UpdateItemIcon() { - var entityManager = IoCManager.Resolve(); - if (Action?.EntityIcon != null && !entityManager.EntityExists(Action.EntityIcon)) - { - // This is almost certainly because a player received/processed their own actions component state before - // being send the entity in their inventory that enabled this action. - - // Defer updating icons to the next FrameUpdate(). - _spriteViewDirty = true; - return; - } - - if (Action?.EntityIcon is not { } entity || !entityManager.HasComponent(entity)) + if (!Actions.TryGetActionData(ActionId, out var action) || + action is not { EntityIcon: { } entity } || + !Entities.HasComponent(entity)) { _bigItemSpriteView.Visible = false; _bigItemSpriteView.SetEntity(null); @@ -212,7 +206,7 @@ public sealed class ActionButton : Control } else { - switch (Action.ItemIconStyle) + switch (action.ItemIconStyle) { case ItemActionIconStyle.BigItem: _bigItemSpriteView.Visible = true; @@ -238,17 +232,17 @@ public sealed class ActionButton : Control private void SetActionIcon(Texture? texture) { - if (texture == null || Action == null) + if (!Actions.TryGetActionData(ActionId, out var action) || texture == null) { _bigActionIcon.Texture = null; _bigActionIcon.Visible = false; _smallActionIcon.Texture = null; _smallActionIcon.Visible = false; } - else if (Action.EntityIcon != null && Action.ItemIconStyle == ItemActionIconStyle.BigItem) + else if (action.EntityIcon != null && action.ItemIconStyle == ItemActionIconStyle.BigItem) { _smallActionIcon.Texture = texture; - _smallActionIcon.Modulate = Action.IconColor; + _smallActionIcon.Modulate = action.IconColor; _smallActionIcon.Visible = true; _bigActionIcon.Texture = null; _bigActionIcon.Visible = false; @@ -256,7 +250,7 @@ public sealed class ActionButton : Control else { _bigActionIcon.Texture = texture; - _bigActionIcon.Modulate = Action.IconColor; + _bigActionIcon.Modulate = action.IconColor; _bigActionIcon.Visible = true; _smallActionIcon.Texture = null; _smallActionIcon.Visible = false; @@ -267,39 +261,39 @@ public sealed class ActionButton : Control { UpdateItemIcon(); - if (Action == null) + if (!Actions.TryGetActionData(ActionId, out var action)) { SetActionIcon(null); return; } - if ((Controller.SelectingTargetFor == Action || Action.Toggled) && Action.IconOn != null) - SetActionIcon(Action.IconOn.Frame0()); + if ((Controller.SelectingTargetFor == ActionId || action.Toggled) && action.IconOn != null) + SetActionIcon(action.IconOn.Frame0()); else - SetActionIcon(Action.Icon?.Frame0()); + SetActionIcon(action.Icon?.Frame0()); } - public bool TryReplaceWith(ActionType action) + public bool TryReplaceWith(EntityUid actionId) { if (Locked) { return false; } - UpdateData(action); + UpdateData(actionId); return true; } - public void UpdateData(ActionType action) + public void UpdateData(EntityUid actionId) { - Action = action; + ActionId = actionId; Label.Visible = true; UpdateIcons(); } public void ClearData() { - Action = null; + ActionId = null; Cooldown.Visible = false; Cooldown.Progress = 1; Label.Visible = false; @@ -310,20 +304,19 @@ public sealed class ActionButton : Control { base.FrameUpdate(args); - if (_spriteViewDirty) + if (!Actions.TryGetActionData(ActionId, out var action)) { - _spriteViewDirty = false; - UpdateIcons(); + return; } - if (Action?.Cooldown != null) + if (action.Cooldown != null) { - Cooldown.FromTime(Action.Cooldown.Value.Start, Action.Cooldown.Value.End); + Cooldown.FromTime(action.Cooldown.Value.Start, action.Cooldown.Value.End); } - if (Action != null && _toggled != Action.Toggled) + if (ActionId != null && _toggled != action.Toggled) { - _toggled = Action.Toggled; + _toggled = action.Toggled; } } @@ -350,7 +343,7 @@ public sealed class ActionButton : Control public void Depress(GUIBoundKeyEventArgs args, bool depress) { // action can still be toggled if it's allowed to stay selected - if (Action is not {Enabled: true}) + if (!Actions.TryGetActionData(ActionId, out var action) || action is not { Enabled: true }) return; if (_depressed && !depress) @@ -368,14 +361,14 @@ public sealed class ActionButton : Control HighlightRect.Visible = _beingHovered; // always show the normal empty button style if no action in this slot - if (Action == null) + if (!Actions.TryGetActionData(ActionId, out var action)) { SetOnlyStylePseudoClass(ContainerButton.StylePseudoClassNormal); return; } // show a hover only if the action is usable or another action is being dragged on top of this - if (_beingHovered && (Controller.IsDragging || Action.Enabled)) + if (_beingHovered && (Controller.IsDragging || action.Enabled)) { SetOnlyStylePseudoClass(ContainerButton.StylePseudoClassHover); } @@ -390,16 +383,16 @@ public sealed class ActionButton : Control } // if it's toggled on, always show the toggled on style (currently same as depressed style) - if (Action.Toggled || Controller.SelectingTargetFor == Action) + if (action.Toggled || Controller.SelectingTargetFor == ActionId) { // when there's a toggle sprite, we're showing that sprite instead of highlighting this slot - SetOnlyStylePseudoClass(Action.IconOn != null + SetOnlyStylePseudoClass(action.IconOn != null ? ContainerButton.StylePseudoClassNormal : ContainerButton.StylePseudoClassPressed); return; } - if (!Action.Enabled) + if (!action.Enabled) { SetOnlyStylePseudoClass(ContainerButton.StylePseudoClassDisabled); return; diff --git a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs index 5dfa53f5ab..bbda27f0a0 100644 --- a/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs +++ b/Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Client.UserInterface; using Robust.Client.UserInterface.Controls; @@ -30,7 +29,7 @@ public class ActionButtonContainer : GridContainer } } - public void SetActionData(params ActionType?[] actionTypes) + public void SetActionData(params EntityUid?[] actionTypes) { ClearActionData(); @@ -40,7 +39,7 @@ public class ActionButtonContainer : GridContainer if (action == null) continue; - ((ActionButton) GetChild(i)).UpdateData(action); + ((ActionButton) GetChild(i)).UpdateData(action.Value); } } diff --git a/Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs b/Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs index 0f4250c508..c61fa8974f 100644 --- a/Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs +++ b/Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs @@ -1,6 +1,5 @@ using System.Linq; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.CombatMode; using Robust.Server.Player; using Robust.Shared.GameObjects; @@ -25,6 +24,8 @@ public sealed class ActionsAddedTest var sEntMan = server.ResolveDependency(); var cEntMan = client.ResolveDependency(); var session = server.ResolveDependency().ServerSessions.Single(); + var sActionSystem = server.System(); + var cActionSystem = client.System(); // Dummy ticker is disabled - client should be in control of a normal mob. Assert.NotNull(session.AttachedEntity); @@ -43,21 +44,24 @@ public sealed class ActionsAddedTest // This action should have a non-null event both on the server & client. var evType = typeof(ToggleCombatActionEvent); - var sActions = sComp!.Actions.Where( - x => x is InstantAction act && act.Event?.GetType() == evType).ToArray(); - var cActions = cComp!.Actions.Where( - x => x is InstantAction act && act.Event?.GetType() == evType).ToArray(); + var sActions = sActionSystem.GetActions(ent).Where( + x => x.Comp is InstantActionComponent act && act.Event?.GetType() == evType).ToArray(); + var cActions = cActionSystem.GetActions(ent).Where( + x => x.Comp is InstantActionComponent act && act.Event?.GetType() == evType).ToArray(); Assert.That(sActions.Length, Is.EqualTo(1)); Assert.That(cActions.Length, Is.EqualTo(1)); - var sAct = (InstantAction) sActions[0]; - var cAct = (InstantAction) cActions[0]; + var sAct = sActions[0].Comp; + var cAct = cActions[0].Comp; + + Assert.NotNull(sAct); + Assert.NotNull(cAct); // Finally, these two actions are not the same object // required, because integration tests do not respect the [NonSerialized] attribute and will simply events by reference. Assert.That(ReferenceEquals(sAct, cAct), Is.False); - Assert.That(ReferenceEquals(sAct.Event, cAct.Event), Is.False); + Assert.That(ReferenceEquals(sAct.BaseEvent, cAct.BaseEvent), Is.False); await pair.CleanReturnAsync(); } diff --git a/Content.Server/Abilities/Mime/MimePowersComponent.cs b/Content.Server/Abilities/Mime/MimePowersComponent.cs index 8d2205cdb6..35393093b7 100644 --- a/Content.Server/Abilities/Mime/MimePowersComponent.cs +++ b/Content.Server/Abilities/Mime/MimePowersComponent.cs @@ -1,8 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Utility; namespace Content.Server.Abilities.Mime { @@ -22,18 +20,12 @@ namespace Content.Server.Abilities.Mime /// The wall prototype to use. /// [DataField("wallPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string WallPrototype = "WallInvisible"; + public string WallPrototype = "ActionMimeInvisibleWall"; - [DataField("invisibleWallAction")] - public InstantAction InvisibleWallAction = new() - { - UseDelay = TimeSpan.FromSeconds(30), - Icon = new SpriteSpecifier.Texture(new("Structures/Walls/solid.rsi/full.png")), - DisplayName = "mime-invisible-wall", - Description = "mime-invisible-wall-desc", - Priority = -1, - Event = new InvisibleWallActionEvent(), - }; + [DataField("invisibleWallAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? InvisibleWallAction; + + [DataField("invisibleWallActionEntity")] public EntityUid? InvisibleWallActionEntity; // The vow zone lies below public bool VowBroken = false; diff --git a/Content.Server/Abilities/Mime/MimePowersSystem.cs b/Content.Server/Abilities/Mime/MimePowersSystem.cs index 1e32bc09c5..5a47fb1d8d 100644 --- a/Content.Server/Abilities/Mime/MimePowersSystem.cs +++ b/Content.Server/Abilities/Mime/MimePowersSystem.cs @@ -1,16 +1,15 @@ using Content.Server.Popups; +using Content.Server.Speech.Muting; using Content.Shared.Actions; +using Content.Shared.Actions.Events; using Content.Shared.Alert; using Content.Shared.Coordinates.Helpers; -using Content.Shared.Physics; -using Content.Shared.Doors.Components; using Content.Shared.Maps; using Content.Shared.Mobs.Components; -using Robust.Shared.Physics.Components; -using Robust.Shared.Timing; -using Content.Server.Speech.Muting; +using Content.Shared.Physics; using Robust.Shared.Containers; using Robust.Shared.Map; +using Robust.Shared.Timing; namespace Content.Server.Abilities.Mime { @@ -29,8 +28,10 @@ namespace Content.Server.Abilities.Mime { base.Initialize(); SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentMapInit); SubscribeLocalEvent(OnInvisibleWall); } + public override void Update(float frameTime) { base.Update(frameTime); @@ -53,10 +54,14 @@ namespace Content.Server.Abilities.Mime private void OnComponentInit(EntityUid uid, MimePowersComponent component, ComponentInit args) { EnsureComp(uid); - _actionsSystem.AddAction(uid, component.InvisibleWallAction, uid); _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); } + private void OnComponentMapInit(EntityUid uid, MimePowersComponent component, MapInitEvent args) + { + _actionsSystem.AddAction(uid, ref component.InvisibleWallActionEntity, component.InvisibleWallAction, uid); + } + /// /// Creates an invisible wall in a free space after some checks. /// @@ -116,7 +121,7 @@ namespace Content.Server.Abilities.Mime RemComp(uid); _alertsSystem.ClearAlert(uid, AlertType.VowOfSilence); _alertsSystem.ShowAlert(uid, AlertType.VowBroken); - _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallAction); + _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallActionEntity); } /// @@ -139,11 +144,7 @@ namespace Content.Server.Abilities.Mime AddComp(uid); _alertsSystem.ClearAlert(uid, AlertType.VowBroken); _alertsSystem.ShowAlert(uid, AlertType.VowOfSilence); - _actionsSystem.AddAction(uid, mimePowers.InvisibleWallAction, uid); + _actionsSystem.AddAction(uid, ref mimePowers.InvisibleWallActionEntity, mimePowers.InvisibleWallAction, uid); } } - - public sealed partial class InvisibleWallActionEvent : InstantActionEvent - { - } } diff --git a/Content.Server/Actions/ActionOnInteractComponent.cs b/Content.Server/Actions/ActionOnInteractComponent.cs index a668ee43f3..9efe3d6ba0 100644 --- a/Content.Server/Actions/ActionOnInteractComponent.cs +++ b/Content.Server/Actions/ActionOnInteractComponent.cs @@ -1,5 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Interaction; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; namespace Content.Server.Actions; @@ -19,12 +20,8 @@ namespace Content.Server.Actions; [RegisterComponent] public sealed partial class ActionOnInteractComponent : Component { - [DataField("activateActions")] - public List? ActivateActions; + [DataField("actions", customTypeSerializer: typeof(PrototypeIdListSerializer))] + public List? Actions; - [DataField("entityActions")] - public List? EntityActions; - - [DataField("worldActions")] - public List? WorldActions; + [DataField("actionEntities")] public List? ActionEntities; } diff --git a/Content.Server/Actions/ActionOnInteractSystem.cs b/Content.Server/Actions/ActionOnInteractSystem.cs index baa01e9123..31f579f7ec 100644 --- a/Content.Server/Actions/ActionOnInteractSystem.cs +++ b/Content.Server/Actions/ActionOnInteractSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Interaction; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -25,51 +24,41 @@ public sealed class ActionOnInteractSystem : EntitySystem private void OnActivate(EntityUid uid, ActionOnInteractComponent component, ActivateInWorldEvent args) { - if (args.Handled || component.ActivateActions == null) + if (args.Handled || component.ActionEntities == null) return; - var options = new List(); - foreach (var action in component.ActivateActions) - { - if (ValidAction(action)) - options.Add(action); - } - + var options = GetValidActions(component.ActionEntities); if (options.Count == 0) return; - var act = _random.Pick(options); + var (actId, act) = _random.Pick(options); if (act.Event != null) act.Event.Performer = args.User; act.Provider = uid; - _actions.PerformAction(args.User, null, act, act.Event, _timing.CurTime, false); + _actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false); args.Handled = true; } private void OnAfterInteract(EntityUid uid, ActionOnInteractComponent component, AfterInteractEvent args) { - if (args.Handled) + if (args.Handled || component.ActionEntities == null) return; // First, try entity target actions - if (args.Target != null && component.EntityActions != null) + if (args.Target != null) { - var entOptions = new List(); - foreach (var action in component.EntityActions) + var entOptions = GetValidActions(component.ActionEntities, args.CanReach); + for (var i = entOptions.Count - 1; i >= 0; i--) { - if (!ValidAction(action, args.CanReach)) - continue; - + var action = entOptions[i].Comp; if (!_actions.ValidateEntityTarget(args.User, args.Target.Value, action)) - continue; - - entOptions.Add(action); + entOptions.RemoveAt(i); } if (entOptions.Count > 0) { - var entAct = _random.Pick(entOptions); + var (entActId, entAct) = _random.Pick(entOptions); if (entAct.Event != null) { entAct.Event.Performer = args.User; @@ -77,32 +66,25 @@ public sealed class ActionOnInteractSystem : EntitySystem } entAct.Provider = uid; - _actions.PerformAction(args.User, null, entAct, entAct.Event, _timing.CurTime, false); + _actions.PerformAction(args.User, null, entActId, entAct, entAct.Event, _timing.CurTime, false); args.Handled = true; return; } } // else: try world target actions - if (component.WorldActions == null) - return; - - var options = new List(); - foreach (var action in component.WorldActions) + var options = GetValidActions(component.ActionEntities, args.CanReach); + for (var i = options.Count - 1; i >= 0; i--) { - if (!ValidAction(action, args.CanReach)) - continue; - + var action = options[i].Comp; if (!_actions.ValidateWorldTarget(args.User, args.ClickLocation, action)) - continue; - - options.Add(action); + options.RemoveAt(i); } if (options.Count == 0) return; - var act = _random.Pick(options); + var (actId, act) = _random.Pick(options); if (act.Event != null) { act.Event.Performer = args.User; @@ -110,22 +92,44 @@ public sealed class ActionOnInteractSystem : EntitySystem } act.Provider = uid; - _actions.PerformAction(args.User, null, act, act.Event, _timing.CurTime, false); + _actions.PerformAction(args.User, null, actId, act, act.Event, _timing.CurTime, false); args.Handled = true; } - private bool ValidAction(ActionType act, bool canReach = true) + private bool ValidAction(BaseActionComponent action, bool canReach = true) { - if (!act.Enabled) + if (!action.Enabled) return false; - if (act.Charges.HasValue && act.Charges <= 0) + if (action.Charges.HasValue && action.Charges <= 0) return false; var curTime = _timing.CurTime; - if (act.Cooldown.HasValue && act.Cooldown.Value.End > curTime) + if (action.Cooldown.HasValue && action.Cooldown.Value.End > curTime) return false; - return canReach || act is TargetedAction { CheckCanAccess: false }; + return canReach || action is BaseTargetActionComponent { CheckCanAccess: false }; + } + + private List<(EntityUid Id, T Comp)> GetValidActions(List? actions, bool canReach = true) where T : BaseActionComponent + { + var valid = new List<(EntityUid Id, T Comp)>(); + + if (actions == null) + return valid; + + foreach (var id in actions) + { + if (!_actions.TryGetActionData(id, out var baseAction) || + baseAction as T is not { } action || + !ValidAction(action, canReach)) + { + continue; + } + + valid.Add((id, action)); + } + + return valid; } } diff --git a/Content.Server/Actions/ActionsSystem.cs b/Content.Server/Actions/ActionsSystem.cs index 495640d98b..21054bbd7a 100644 --- a/Content.Server/Actions/ActionsSystem.cs +++ b/Content.Server/Actions/ActionsSystem.cs @@ -1,9 +1,5 @@ -using Content.Server.Chat; -using Content.Server.Chat.Systems; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using JetBrains.Annotations; -using Robust.Server.GameObjects; namespace Content.Server.Actions { diff --git a/Content.Server/Animals/Components/EggLayerComponent.cs b/Content.Server/Animals/Components/EggLayerComponent.cs index 980bcbf72b..551e665f72 100644 --- a/Content.Server/Animals/Components/EggLayerComponent.cs +++ b/Content.Server/Animals/Components/EggLayerComponent.cs @@ -1,8 +1,6 @@ -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Storage; using Robust.Shared.Audio; -using Robust.Shared.Serialization; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Animals.Components; @@ -14,8 +12,8 @@ namespace Content.Server.Animals.Components; [RegisterComponent] public sealed partial class EggLayerComponent : Component { - [DataField("eggLayAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string EggLayAction = "AnimalLayEgg"; + [DataField("eggLayAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string EggLayAction = "ActionAnimalLayEgg"; [ViewVariables(VVAccess.ReadWrite)] [DataField("hungerUsage")] @@ -51,5 +49,3 @@ public sealed partial class EggLayerComponent : Component [DataField("accumulatedFrametime")] public float AccumulatedFrametime; } - -public sealed partial class EggLayInstantActionEvent : InstantActionEvent {} diff --git a/Content.Server/Animals/Systems/EggLayerSystem.cs b/Content.Server/Animals/Systems/EggLayerSystem.cs index a9ab3c5f29..abfd74ad01 100644 --- a/Content.Server/Animals/Systems/EggLayerSystem.cs +++ b/Content.Server/Animals/Systems/EggLayerSystem.cs @@ -1,20 +1,18 @@ using Content.Server.Actions; using Content.Server.Animals.Components; using Content.Server.Popups; -using Content.Shared.Actions.ActionTypes; +using Content.Shared.Actions.Events; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; using Content.Shared.Storage; using Robust.Server.GameObjects; using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Server.Animals.Systems; public sealed class EggLayerSystem : EntitySystem { - [Dependency] private readonly IPrototypeManager _prototype = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly AudioSystem _audio = default!; @@ -54,10 +52,10 @@ public sealed class EggLayerSystem : EntitySystem private void OnComponentInit(EntityUid uid, EggLayerComponent component, ComponentInit args) { - if (!_prototype.TryIndex(component.EggLayAction, out var action)) + if (string.IsNullOrWhiteSpace(component.EggLayAction)) return; - _actions.AddAction(uid, new InstantAction(action), uid); + _actions.AddAction(uid, Spawn(component.EggLayAction), uid); component.CurrentEggLayCooldown = _random.NextFloat(component.EggLayCooldownMin, component.EggLayCooldownMax); } diff --git a/Content.Server/Atmos/Components/GasTankComponent.cs b/Content.Server/Atmos/Components/GasTankComponent.cs index 5815fba489..8b411e38db 100644 --- a/Content.Server/Atmos/Components/GasTankComponent.cs +++ b/Content.Server/Atmos/Components/GasTankComponent.cs @@ -1,6 +1,7 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Atmos; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Atmos.Components { @@ -93,8 +94,10 @@ namespace Content.Server.Atmos.Components [DataField("tankFragmentScale"), ViewVariables(VVAccess.ReadWrite)] public float TankFragmentScale = 2 * Atmospherics.OneAtmosphere; - [DataField("toggleAction", required: true)] - public InstantAction ToggleAction = new(); + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleAction = "ActionToggleInternals"; + + [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity; /// /// Valve to release gas from tank diff --git a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs index cdd174ce18..dcfcdf3331 100644 --- a/Content.Server/Atmos/EntitySystems/GasTankSystem.cs +++ b/Content.Server/Atmos/EntitySystems/GasTankSystem.cs @@ -1,4 +1,3 @@ -using System.Numerics; using Content.Server.Atmos.Components; using Content.Server.Body.Components; using Content.Server.Body.Systems; @@ -8,17 +7,17 @@ using Content.Server.UserInterface; using Content.Shared.Actions; using Content.Shared.Atmos; using Content.Shared.Atmos.Components; -using Content.Shared.Toggleable; using Content.Shared.Examine; +using Content.Shared.Toggleable; +using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Server.Player; using Robust.Shared.Audio; using Robust.Shared.Containers; +using Robust.Shared.Physics.Systems; using Robust.Shared.Player; using Robust.Shared.Random; -using Content.Shared.Verbs; -using Robust.Shared.Physics.Systems; namespace Content.Server.Atmos.EntitySystems { @@ -105,7 +104,7 @@ namespace Content.Server.Atmos.EntitySystems private void OnGetActions(EntityUid uid, GasTankComponent component, GetItemActionsEvent args) { - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } private void OnExamined(EntityUid uid, GasTankComponent component, ExaminedEvent args) @@ -233,7 +232,7 @@ namespace Content.Server.Atmos.EntitySystems if (_internals.TryConnectTank(internals, component.Owner)) component.User = internals.Owner; - _actions.SetToggled(component.ToggleAction, component.IsConnected); + _actions.SetToggled(component.ToggleActionEntity, component.IsConnected); // Couldn't toggle! if (!component.IsConnected) @@ -255,7 +254,7 @@ namespace Content.Server.Atmos.EntitySystems var internals = GetInternalsComponent(component); component.User = null; - _actions.SetToggled(component.ToggleAction, false); + _actions.SetToggled(component.ToggleActionEntity, false); _internals.DisconnectTank(internals); component.DisconnectStream?.Stop(); diff --git a/Content.Server/Bed/BedSystem.cs b/Content.Server/Bed/BedSystem.cs index 9791eb2621..c9795928e5 100644 --- a/Content.Server/Bed/BedSystem.cs +++ b/Content.Server/Bed/BedSystem.cs @@ -2,9 +2,9 @@ using Content.Server.Actions; using Content.Server.Bed.Components; using Content.Server.Bed.Sleep; using Content.Server.Body.Systems; +using Content.Server.Construction; using Content.Server.Power.Components; using Content.Server.Power.EntitySystems; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Bed; using Content.Shared.Bed.Sleep; using Content.Shared.Body.Components; @@ -12,9 +12,7 @@ using Content.Shared.Buckle.Components; using Content.Shared.Damage; using Content.Shared.Emag.Components; using Content.Shared.Emag.Systems; -using Content.Server.Construction; using Content.Shared.Mobs.Systems; -using Robust.Shared.Prototypes; using Robust.Shared.Timing; namespace Content.Server.Bed @@ -23,7 +21,6 @@ namespace Content.Server.Bed { [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly ActionsSystem _actionsSystem = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly SleepingSystem _sleepingSystem = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly MobStateSystem _mobStateSystem = default!; @@ -42,18 +39,17 @@ namespace Content.Server.Bed private void ManageUpdateList(EntityUid uid, HealOnBuckleComponent component, ref BuckleChangeEvent args) { - _prototypeManager.TryIndex("Sleep", out var sleepAction); if (args.Buckling) { AddComp(uid); component.NextHealTime = _timing.CurTime + TimeSpan.FromSeconds(component.HealTime); - if (sleepAction != null) - _actionsSystem.AddAction(args.BuckledEntity, new InstantAction(sleepAction), null); + component.SleepAction = Spawn(SleepingSystem.SleepActionId); + _actionsSystem.AddAction(args.BuckledEntity, component.SleepAction.Value, null); return; } - if (sleepAction != null) - _actionsSystem.RemoveAction(args.BuckledEntity, sleepAction); + if (component.SleepAction != null) + _actionsSystem.RemoveAction(args.BuckledEntity, component.SleepAction.Value); _sleepingSystem.TryWaking(args.BuckledEntity); RemComp(uid); diff --git a/Content.Server/Bed/Components/HealOnBuckleComponent.cs b/Content.Server/Bed/Components/HealOnBuckleComponent.cs index f02a30535d..f29fe30429 100644 --- a/Content.Server/Bed/Components/HealOnBuckleComponent.cs +++ b/Content.Server/Bed/Components/HealOnBuckleComponent.cs @@ -17,5 +17,7 @@ namespace Content.Server.Bed.Components public float SleepMultiplier = 3f; public TimeSpan NextHealTime = TimeSpan.Zero; //Next heal + + [DataField("sleepAction")] public EntityUid? SleepAction; } } diff --git a/Content.Server/Bed/Sleep/SleepingSystem.cs b/Content.Server/Bed/Sleep/SleepingSystem.cs index 93286fa3bc..4f7b66d9e5 100644 --- a/Content.Server/Bed/Sleep/SleepingSystem.cs +++ b/Content.Server/Bed/Sleep/SleepingSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Actions; using Content.Server.Popups; using Content.Server.Sound.Components; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Audio; using Content.Shared.Bed.Sleep; using Content.Shared.Damage; @@ -10,16 +9,14 @@ using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; -using Content.Shared.StatusEffect; using Content.Shared.Slippery; +using Content.Shared.StatusEffect; using Content.Shared.Stunnable; using Content.Shared.Verbs; -using Robust.Shared.Audio; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Timing; -using Content.Shared.Interaction.Components; namespace Content.Server.Bed.Sleep { @@ -33,6 +30,8 @@ namespace Content.Server.Bed.Sleep [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly StatusEffectsSystem _statusEffectsSystem = default!; + [ValidatePrototypeId] public const string SleepActionId = "ActionSleep"; + public override void Initialize() { base.Initialize(); @@ -53,7 +52,6 @@ namespace Content.Server.Bed.Sleep /// private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, SleepStateChangedEvent args) { - _prototypeManager.TryIndex("Wake", out var wakeAction); if (args.FellAsleep) { // Expiring status effects would remove the components needed for sleeping @@ -72,16 +70,8 @@ namespace Content.Server.Bed.Sleep emitSound.PopUp = sleepSound.PopUp; } - if (wakeAction != null) - { - var wakeInstance = new InstantAction(wakeAction); - wakeInstance.Cooldown = (_gameTiming.CurTime, _gameTiming.CurTime + TimeSpan.FromSeconds(15)); - _actionsSystem.AddAction(uid, wakeInstance, null); - } return; } - if (wakeAction != null) - _actionsSystem.RemoveAction(uid, wakeAction); RemComp(uid); RemComp(uid); @@ -194,8 +184,7 @@ namespace Content.Server.Bed.Sleep RaiseLocalEvent(uid, ref tryingToSleepEvent); if (tryingToSleepEvent.Cancelled) return false; - if (_prototypeManager.TryIndex("Sleep", out var sleepAction)) - _actionsSystem.RemoveAction(uid, sleepAction); + _actionsSystem.RemoveAction(uid, SleepActionId); EnsureComp(uid); return true; diff --git a/Content.Server/Bible/BibleSystem.cs b/Content.Server/Bible/BibleSystem.cs index 8186db5a49..18f34ba1cc 100644 --- a/Content.Server/Bible/BibleSystem.cs +++ b/Content.Server/Bible/BibleSystem.cs @@ -4,6 +4,7 @@ using Content.Server.Ghost.Roles.Events; using Content.Server.Popups; using Content.Shared.ActionBlocker; using Content.Shared.Actions; +using Content.Shared.Bible; using Content.Shared.Damage; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; @@ -179,8 +180,9 @@ namespace Content.Server.Bible if (component.AlreadySummoned) return; - args.Actions.Add(component.SummonAction); + args.AddAction(ref component.SummonActionEntity, component.SummonAction); } + private void OnSummon(EntityUid uid, SummonableComponent component, SummonActionEvent args) { AttemptSummon(component, args.Performer, Transform(args.Performer)); @@ -238,12 +240,7 @@ namespace Content.Server.Bible Transform(familiar).AttachParent(component.Owner); } component.AlreadySummoned = true; - _actionsSystem.RemoveAction(user, component.SummonAction); + _actionsSystem.RemoveAction(user, component.SummonActionEntity); } } - - public sealed partial class SummonActionEvent : InstantActionEvent - { - - } } diff --git a/Content.Server/Bible/Components/SummonableComponent.cs b/Content.Server/Bible/Components/SummonableComponent.cs index 821f25bb80..62f536d5d6 100644 --- a/Content.Server/Bible/Components/SummonableComponent.cs +++ b/Content.Server/Bible/Components/SummonableComponent.cs @@ -1,7 +1,5 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -using Robust.Shared.Utility; namespace Content.Server.Bible.Components { @@ -18,7 +16,7 @@ namespace Content.Server.Bible.Components public string? SpecialItemPrototype = null; public bool AlreadySummoned = false; - [DataField("requriesBibleUser")] + [DataField("requiresBibleUser")] public bool RequiresBibleUser = true; /// @@ -27,14 +25,11 @@ namespace Content.Server.Bible.Components [ViewVariables] public EntityUid? Summon = null; - [DataField("summonAction")] - public InstantAction SummonAction = new() - { - Icon = new SpriteSpecifier.Texture(new ("Clothing/Head/Hats/witch.rsi/icon.png")), - DisplayName = "bible-summon-verb", - Description = "bible-summon-verb-desc", - Event = new SummonActionEvent(), - }; + [DataField("summonAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SummonAction = "ActionBibleSummon"; + + [DataField("summonActionEntity")] + public EntityUid? SummonActionEntity; /// Used for respawning [DataField("accumulator")] diff --git a/Content.Server/Clothing/Components/MaskComponent.cs b/Content.Server/Clothing/Components/MaskComponent.cs index 3071c3edf9..704ea11ece 100644 --- a/Content.Server/Clothing/Components/MaskComponent.cs +++ b/Content.Server/Clothing/Components/MaskComponent.cs @@ -1,5 +1,5 @@ -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Clothing.Components { @@ -7,14 +7,15 @@ namespace Content.Server.Clothing.Components [RegisterComponent] public sealed partial class MaskComponent : Component { + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleAction = "ActionToggleMask"; + /// /// This mask can be toggled (pulled up/down) /// - [DataField("toggleAction")] - public InstantAction? ToggleAction = null; + [DataField("toggleActionEntity")] + public EntityUid? ToggleActionEntity; public bool IsToggled = false; } - - public sealed partial class ToggleMaskEvent : InstantActionEvent { } } diff --git a/Content.Server/Clothing/MaskSystem.cs b/Content.Server/Clothing/MaskSystem.cs index acf63ad98d..fbf6ac6077 100644 --- a/Content.Server/Clothing/MaskSystem.cs +++ b/Content.Server/Clothing/MaskSystem.cs @@ -9,6 +9,7 @@ using Content.Server.Nutrition.EntitySystems; using Content.Server.Popups; using Content.Server.VoiceMask; using Content.Shared.Actions; +using Content.Shared.Clothing; using Content.Shared.Clothing.Components; using Content.Shared.Clothing.EntitySystems; using Content.Shared.IdentityManagement.Components; @@ -38,20 +39,20 @@ namespace Content.Server.Clothing private void OnGetActions(EntityUid uid, MaskComponent component, GetItemActionsEvent args) { - if (component.ToggleAction != null && !args.InHands) - args.Actions.Add(component.ToggleAction); + if (!args.InHands) + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } private void OnToggleMask(EntityUid uid, MaskComponent mask, ToggleMaskEvent args) { - if (mask.ToggleAction == null) + if (mask.ToggleActionEntity == null) return; if (!_inventorySystem.TryGetSlotEntity(args.Performer, "mask", out var existing) || !mask.Owner.Equals(existing)) return; mask.IsToggled ^= true; - _actionSystem.SetToggled(mask.ToggleAction, mask.IsToggled); + _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled); // Pulling mask down can change identity, so we want to update that _identity.QueueIdentityUpdate(args.Performer); @@ -67,11 +68,11 @@ namespace Content.Server.Clothing // set to untoggled when unequipped, so it isn't left in a 'pulled down' state private void OnGotUnequipped(EntityUid uid, MaskComponent mask, GotUnequippedEvent args) { - if (mask.ToggleAction == null) + if (mask.ToggleActionEntity == null) return; mask.IsToggled = false; - _actionSystem.SetToggled(mask.ToggleAction, mask.IsToggled); + _actionSystem.SetToggled(mask.ToggleActionEntity, mask.IsToggled); ToggleMaskComponents(uid, mask, args.Equipee, true); } diff --git a/Content.Server/Devour/DevourSystem.cs b/Content.Server/Devour/DevourSystem.cs index 5421751100..3b15e725fe 100644 --- a/Content.Server/Devour/DevourSystem.cs +++ b/Content.Server/Devour/DevourSystem.cs @@ -1,10 +1,8 @@ -using Content.Shared.Devour; using Content.Server.Body.Systems; -using Content.Shared.Humanoid; using Content.Shared.Chemistry.Components; -using Content.Server.Devour.Components; -using Content.Shared.DoAfter; -using Robust.Shared.Serialization; +using Content.Shared.Devour; +using Content.Shared.Devour.Components; +using Content.Shared.Humanoid; namespace Content.Server.Devour; diff --git a/Content.Server/Dragon/Components/DragonComponent.cs b/Content.Server/Dragon/Components/DragonComponent.cs index 8138f2a66b..f403979a00 100644 --- a/Content.Server/Dragon/Components/DragonComponent.cs +++ b/Content.Server/Dragon/Components/DragonComponent.cs @@ -1,10 +1,4 @@ -using System.Threading; -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; -using Content.Shared.Chemistry.Reagent; -using Content.Shared.Whitelist; using Robust.Shared.Audio; -using Robust.Shared.Containers; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -42,11 +36,14 @@ namespace Content.Server.Dragon /// [ViewVariables(VVAccess.ReadWrite), DataField("maxAccumulator")] public float RiftMaxAccumulator = 300f; + [DataField("spawnRiftAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string SpawnRiftAction = "ActionSpawnRift"; + /// /// Spawns a rift which can summon more mobs. /// - [DataField("spawnRiftAction")] - public InstantAction? SpawnRiftAction; + [DataField("spawnRiftActionEntity")] + public EntityUid? SpawnRiftActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("riftPrototype", customTypeSerializer: typeof(PrototypeIdSerializer))] public string RiftPrototype = "CarpRift"; @@ -61,8 +58,4 @@ namespace Content.Server.Dragon Params = AudioParams.Default.WithVolume(3f), }; } - - public sealed partial class DragonDevourActionEvent : EntityTargetActionEvent {} - - public sealed partial class DragonSpawnRiftActionEvent : InstantActionEvent {} } diff --git a/Content.Server/Dragon/DragonSystem.cs b/Content.Server/Dragon/DragonSystem.cs index 82aa10b037..0169e16c44 100644 --- a/Content.Server/Dragon/DragonSystem.cs +++ b/Content.Server/Dragon/DragonSystem.cs @@ -1,28 +1,20 @@ -using Content.Server.Body.Systems; +using System.Numerics; using Content.Server.Chat.Systems; using Content.Server.GameTicking; using Content.Server.NPC; using Content.Server.NPC.Systems; using Content.Server.Popups; -using Content.Server.Station.Systems; using Content.Shared.Actions; -using Content.Shared.Chemistry.Components; using Content.Shared.Damage; -using Content.Shared.DoAfter; using Content.Shared.Dragon; using Content.Shared.Examine; -using Content.Shared.Humanoid; using Content.Shared.Maps; using Content.Shared.Mobs; -using Content.Shared.Mobs.Components; using Content.Shared.Movement.Systems; -using Robust.Shared.Containers; -using Robust.Shared.Player; +using Content.Shared.Sprite; using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Random; -using System.Numerics; -using Content.Shared.Sprite; +using Robust.Shared.Player; using Robust.Shared.Serialization.Manager; namespace Content.Server.Dragon; @@ -56,6 +48,7 @@ public sealed partial class DragonSystem : EntitySystem base.Initialize(); SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnDragonRift); SubscribeLocalEvent(OnDragonMove); @@ -302,10 +295,12 @@ public sealed partial class DragonSystem : EntitySystem private void OnStartup(EntityUid uid, DragonComponent component, ComponentStartup args) { - if (component.SpawnRiftAction != null) - _actionsSystem.AddAction(uid, component.SpawnRiftAction, null); - Roar(component); } + + private void OnMapInit(EntityUid uid, DragonComponent component, MapInitEvent args) + { + _actionsSystem.AddAction(uid, ref component.SpawnRiftActionEntity, component.SpawnRiftAction); + } } diff --git a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs index bb708ece3e..5f31f52fc4 100644 --- a/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs +++ b/Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs @@ -1,6 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Roles; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -94,6 +94,6 @@ public sealed partial class ZombieRuleComponent : Component [DataField("shuttleCalled")] public bool ShuttleCalled; - [ValidatePrototypeId] - public const string ZombifySelfActionPrototype = "TurnUndead"; + [ValidatePrototypeId] + public const string ZombifySelfActionPrototype = "ActionTurnUndead"; } diff --git a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs index 96d11fed94..bdc40f102e 100644 --- a/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs +++ b/Content.Server/GameTicking/Rules/ZombieRuleSystem.cs @@ -11,7 +11,6 @@ using Content.Server.RoundEnd; using Content.Server.Station.Components; using Content.Server.Station.Systems; using Content.Server.Zombies; -using Content.Shared.Actions.ActionTypes; using Content.Shared.CCVar; using Content.Shared.Humanoid; using Content.Shared.Mind; @@ -195,9 +194,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem private void OnZombifySelf(EntityUid uid, ZombifyOnDeathComponent component, ZombifySelfActionEvent args) { _zombie.ZombifyEntity(uid); - - var action = new InstantAction(_prototypeManager.Index(ZombieRuleComponent.ZombifySelfActionPrototype)); - _action.RemoveAction(uid, action); + _action.RemoveAction(uid, ZombieRuleComponent.ZombifySelfActionPrototype); } private float GetInfectedFraction(bool includeOffStation = true, bool includeDead = false) @@ -325,7 +322,7 @@ public sealed class ZombieRuleSystem : GameRuleSystem EnsureComp(ownedEntity); EnsureComp(ownedEntity); var inCharacterName = MetaData(ownedEntity).EntityName; - var action = new InstantAction(_prototypeManager.Index(ZombieRuleComponent.ZombifySelfActionPrototype)); + var action = Spawn(ZombieRuleComponent.ZombifySelfActionPrototype); _action.AddAction(mind.OwnedEntity.Value, action, null); var message = Loc.GetString("zombie-patientzero-role-greeting"); diff --git a/Content.Server/Ghost/GhostSystem.cs b/Content.Server/Ghost/GhostSystem.cs index 9e01cfa758..3b63bdfdc4 100644 --- a/Content.Server/Ghost/GhostSystem.cs +++ b/Content.Server/Ghost/GhostSystem.cs @@ -16,7 +16,6 @@ using Content.Shared.Mind.Components; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Content.Shared.Movement.Events; -using Content.Shared.Roles.Jobs; using Content.Shared.Storage.Components; using Robust.Server.GameObjects; using Robust.Server.Player; @@ -48,6 +47,7 @@ namespace Content.Server.Ghost SubscribeLocalEvent(OnGhostStartup); SubscribeLocalEvent(OnGhostShutdown); + SubscribeLocalEvent(OnGhostMapInit); SubscribeLocalEvent(OnGhostExamine); @@ -121,13 +121,7 @@ namespace Content.Server.Ghost eye.VisibilityMask |= (uint) VisibilityFlags.Ghost; } - var time = _gameTiming.CurTime; - component.TimeOfDeath = time; - - // TODO ghost: remove once ghosts are persistent and aren't deleted when returning to body - if (component.Action.UseDelay != null) - component.Action.Cooldown = (time, time + component.Action.UseDelay.Value); - _actions.AddAction(uid, component.Action, null); + component.TimeOfDeath = _gameTiming.CurTime; } private void OnGhostShutdown(EntityUid uid, GhostComponent component, ComponentShutdown args) @@ -149,10 +143,26 @@ namespace Content.Server.Ghost eye.VisibilityMask &= ~(uint) VisibilityFlags.Ghost; } - _actions.RemoveAction(uid, component.Action); + _actions.RemoveAction(uid, component.ActionEntity); } } + private void OnGhostMapInit(EntityUid uid, GhostComponent component, MapInitEvent args) + { + // TODO ghost: remove once ghosts are persistent and aren't deleted when returning to body + var time = _gameTiming.CurTime; + var action = _actions.AddAction(uid, ref component.ActionEntity, component.Action); + if (action?.UseDelay != null) + { + action.Cooldown = (time, time + action.UseDelay.Value); + Dirty(component.ActionEntity!.Value, action); + } + + _actions.AddAction(uid, ref component.ToggleLightingActionEntity, component.ToggleLightingAction); + _actions.AddAction(uid, ref component.ToggleFoVActionEntity, component.ToggleFoVAction); + _actions.AddAction(uid, ref component.ToggleGhostsActionEntity, component.ToggleGhostsAction); + } + private void OnGhostExamine(EntityUid uid, GhostComponent component, ExaminedEvent args) { var timeSinceDeath = _gameTiming.RealTime.Subtract(component.TimeOfDeath); diff --git a/Content.Server/Guardian/GuardianHostComponent.cs b/Content.Server/Guardian/GuardianHostComponent.cs index e924bed776..6a747ae86a 100644 --- a/Content.Server/Guardian/GuardianHostComponent.cs +++ b/Content.Server/Guardian/GuardianHostComponent.cs @@ -1,7 +1,6 @@ -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Containers; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.Guardian { @@ -24,17 +23,9 @@ namespace Content.Server.Guardian /// [ViewVariables] public ContainerSlot GuardianContainer = default!; - [DataField("action")] - public InstantAction Action = new() - { - DisplayName = "action-name-guardian", - Description = "action-description-guardian", - Icon = new SpriteSpecifier.Texture(new ("Interface/Actions/manifest.png")), - UseDelay = TimeSpan.FromSeconds(2), - CheckCanInteract = false, // allow use while stunned, etc. Gets removed on death anyways. - Event = new GuardianToggleActionEvent(), - }; - } + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionToggleGuardian"; - public sealed partial class GuardianToggleActionEvent : InstantActionEvent { }; + [DataField("actionEntity")] public EntityUid? ActionEntity; + } } diff --git a/Content.Server/Guardian/GuardianSystem.cs b/Content.Server/Guardian/GuardianSystem.cs index 24d7a7e838..323a0fc515 100644 --- a/Content.Server/Guardian/GuardianSystem.cs +++ b/Content.Server/Guardian/GuardianSystem.cs @@ -1,12 +1,12 @@ -using Content.Server.Inventory; -using Content.Server.Popups; using Content.Server.Body.Systems; +using Content.Server.Popups; using Content.Shared.Actions; using Content.Shared.Audio; using Content.Shared.Damage; using Content.Shared.DoAfter; using Content.Shared.Examine; using Content.Shared.Guardian; +using Content.Shared.Hands.Components; using Content.Shared.Hands.EntitySystems; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; @@ -16,7 +16,6 @@ using Robust.Server.GameObjects; using Robust.Shared.Containers; using Robust.Shared.Player; using Robust.Shared.Utility; -using Content.Shared.Hands.Components; namespace Content.Server.Guardian { @@ -47,6 +46,7 @@ namespace Content.Server.Guardian SubscribeLocalEvent(OnGuardianUnplayer); SubscribeLocalEvent(OnHostInit); + SubscribeLocalEvent(OnHostMapInit); SubscribeLocalEvent(OnHostMove); SubscribeLocalEvent(OnHostStateChange); SubscribeLocalEvent(OnHostShutdown); @@ -90,7 +90,11 @@ namespace Content.Server.Guardian private void OnHostInit(EntityUid uid, GuardianHostComponent component, ComponentInit args) { component.GuardianContainer = uid.EnsureContainer("GuardianContainer"); - _actionSystem.AddAction(uid, component.Action, null); + } + + private void OnHostMapInit(EntityUid uid, GuardianHostComponent component, MapInitEvent args) + { + _actionSystem.AddAction(uid, ref component.ActionEntity, component.Action); } private void OnHostShutdown(EntityUid uid, GuardianHostComponent component, ComponentShutdown args) @@ -102,7 +106,7 @@ namespace Content.Server.Guardian _bodySystem.GibBody(component.HostedGuardian.Value); EntityManager.QueueDeleteEntity(component.HostedGuardian.Value); - _actionSystem.RemoveAction(uid, component.Action); + _actionSystem.RemoveAction(uid, component.ActionEntity); } private void OnGuardianAttackAttempt(EntityUid uid, GuardianComponent component, AttackAttemptEvent args) diff --git a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs index 6417bad4b5..e74585f0b2 100644 --- a/Content.Server/Light/EntitySystems/HandheldLightSystem.cs +++ b/Content.Server/Light/EntitySystems/HandheldLightSystem.cs @@ -2,7 +2,6 @@ using Content.Server.Actions; using Content.Server.Popups; using Content.Server.PowerCell; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.Light; @@ -12,11 +11,8 @@ using Content.Shared.Toggleable; using Content.Shared.Verbs; using JetBrains.Annotations; using Robust.Server.GameObjects; -using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.GameStates; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Robust.Shared.Utility; namespace Content.Server.Light.EntitySystems @@ -27,7 +23,6 @@ namespace Content.Server.Light.EntitySystems [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly PopupSystem _popup = default!; [Dependency] private readonly PowerCellSystem _powerCell = default!; - [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -77,14 +72,7 @@ namespace Content.Server.Light.EntitySystems private void OnGetActions(EntityUid uid, HandheldLightComponent component, GetItemActionsEvent args) { - if (component.ToggleAction == null - && _proto.TryIndex(component.ToggleActionId, out InstantActionPrototype? act)) - { - component.ToggleAction = new(act); - } - - if (component.ToggleAction != null) - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } private void OnToggleAction(EntityUid uid, HandheldLightComponent component, ToggleActionEvent args) @@ -107,20 +95,12 @@ namespace Content.Server.Light.EntitySystems private void OnMapInit(EntityUid uid, HandheldLightComponent component, MapInitEvent args) { - if (component.ToggleAction == null - && _proto.TryIndex(component.ToggleActionId, out InstantActionPrototype? act)) - { - component.ToggleAction = new(act); - } - - if (component.ToggleAction != null) - _actions.AddAction(uid, component.ToggleAction, null); + _actions.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); } private void OnShutdown(EntityUid uid, HandheldLightComponent component, ComponentShutdown args) { - if (component.ToggleAction != null) - _actions.RemoveAction(uid, component.ToggleAction); + _actions.RemoveAction(uid, component.ToggleActionEntity); } private byte? GetLevel(EntityUid uid, HandheldLightComponent component) diff --git a/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs b/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs index b136645264..6a7e7ba8a0 100644 --- a/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs +++ b/Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs @@ -45,7 +45,7 @@ namespace Content.Server.Light.EntitySystems private void OnGetActions(EntityUid uid, UnpoweredFlashlightComponent component, GetItemActionsEvent args) { - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } private void AddToggleLightVerbs(EntityUid uid, UnpoweredFlashlightComponent component, GetVerbsEvent args) @@ -66,7 +66,7 @@ namespace Content.Server.Light.EntitySystems private void OnMindAdded(EntityUid uid, UnpoweredFlashlightComponent component, MindAddedMessage args) { - _actionsSystem.AddAction(uid, component.ToggleAction, null); + _actionsSystem.AddAction(uid, ref component.ToggleActionEntity, component.ToggleAction); } private void OnGotEmagged(EntityUid uid, UnpoweredFlashlightComponent component, ref GotEmaggedEvent args) @@ -97,7 +97,7 @@ namespace Content.Server.Light.EntitySystems _audioSystem.PlayPvs(flashlight.ToggleSound, uid); RaiseLocalEvent(uid, new LightToggleEvent(flashlight.LightOn), true); - _actionsSystem.SetToggled(flashlight.ToggleAction, flashlight.LightOn); + _actionsSystem.SetToggled(flashlight.ToggleActionEntity, flashlight.LightOn); } } } diff --git a/Content.Server/Magic/Components/SpellbookComponent.cs b/Content.Server/Magic/Components/SpellbookComponent.cs index 1f2d12183c..ebc3c88043 100644 --- a/Content.Server/Magic/Components/SpellbookComponent.cs +++ b/Content.Server/Magic/Components/SpellbookComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; namespace Content.Server.Magic.Components; @@ -13,22 +13,14 @@ public sealed partial class SpellbookComponent : Component /// List of spells that this book has. This is a combination of the WorldSpells, EntitySpells, and InstantSpells. /// [ViewVariables] - public readonly List Spells = new(); + public readonly List Spells = new(); /// /// The three fields below is just used for initialization. /// - [DataField("worldSpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] + [DataField("spells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] [ViewVariables(VVAccess.ReadWrite)] - public Dictionary WorldSpells = new(); - - [DataField("entitySpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] - [ViewVariables(VVAccess.ReadWrite)] - public Dictionary EntitySpells = new(); - - [DataField("instantSpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer))] - [ViewVariables(VVAccess.ReadWrite)] - public Dictionary InstantSpells = new(); + public Dictionary SpellActions = new(); [DataField("learnTime")] [ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Server/Magic/MagicSystem.cs b/Content.Server/Magic/MagicSystem.cs index e75bae0249..1632b654b9 100644 --- a/Content.Server/Magic/MagicSystem.cs +++ b/Content.Server/Magic/MagicSystem.cs @@ -4,10 +4,8 @@ using Content.Server.Body.Systems; using Content.Server.Chat.Systems; using Content.Server.Doors.Systems; using Content.Server.Magic.Components; -using Content.Server.Magic.Events; using Content.Server.Weapons.Ranged.Systems; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Body.Components; using Content.Shared.Coordinates.Helpers; using Content.Shared.DoAfter; @@ -15,6 +13,7 @@ using Content.Shared.Doors.Components; using Content.Shared.Doors.Systems; using Content.Shared.Interaction.Events; using Content.Shared.Magic; +using Content.Shared.Magic.Events; using Content.Shared.Maps; using Content.Shared.Physics; using Content.Shared.Spawners.Components; @@ -22,11 +21,8 @@ using Content.Shared.Storage; using Robust.Server.GameObjects; using Robust.Shared.Audio; using Robust.Shared.Map; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; using Robust.Shared.Random; using Robust.Shared.Serialization.Manager; -using Robust.Shared.Serialization.Manager.Exceptions; namespace Content.Server.Magic; @@ -38,7 +34,6 @@ public sealed class MagicSystem : EntitySystem [Dependency] private readonly ISerializationManager _seriMan = default!; [Dependency] private readonly IComponentFactory _compFact = default!; [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly DoorBoltSystem _boltsSystem = default!; [Dependency] private readonly BodySystem _bodySystem = default!; @@ -81,23 +76,9 @@ public sealed class MagicSystem : EntitySystem private void OnInit(EntityUid uid, SpellbookComponent component, ComponentInit args) { //Negative charges means the spell can be used without it running out. - foreach (var (id, charges) in component.WorldSpells) + foreach (var (id, charges) in component.SpellActions) { - var spell = new WorldTargetAction(_prototypeManager.Index(id)); - _actionsSystem.SetCharges(spell, charges < 0 ? null : charges); - component.Spells.Add(spell); - } - - foreach (var (id, charges) in component.InstantSpells) - { - var spell = new InstantAction(_prototypeManager.Index(id)); - _actionsSystem.SetCharges(spell, charges < 0 ? null : charges); - component.Spells.Add(spell); - } - - foreach (var (id, charges) in component.EntitySpells) - { - var spell = new EntityTargetAction(_prototypeManager.Index(id)); + var spell = Spawn(id); _actionsSystem.SetCharges(spell, charges < 0 ? null : charges); component.Spells.Add(spell); } diff --git a/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs b/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs index 8daf47809d..d7e971e953 100644 --- a/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs +++ b/Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs @@ -1,8 +1,7 @@ -using System.Threading; -using Content.Shared.Actions.ActionTypes; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Medical.Components +namespace Content.Server.Medical.Stethoscope.Components { /// /// Adds an innate verb when equipped to use a stethoscope. @@ -15,12 +14,9 @@ namespace Content.Server.Medical.Components [DataField("delay")] public float Delay = 2.5f; - public EntityTargetAction Action = new() - { - Icon = new SpriteSpecifier.Texture(new ("Clothing/Neck/Misc/stethoscope.rsi/icon.png")), - DisplayName = "stethoscope-verb", - Priority = -1, - Event = new StethoscopeActionEvent(), - }; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionStethoscope"; + + [DataField("actionEntity")] public EntityUid? ActionEntity; } } diff --git a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs index 9aee322667..9f28d44d59 100644 --- a/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs +++ b/Content.Server/Medical/Stethoscope/StethoscopeSystem.cs @@ -1,19 +1,21 @@ using Content.Server.Body.Components; using Content.Server.Medical.Components; +using Content.Server.Medical.Stethoscope.Components; using Content.Server.Popups; using Content.Shared.Actions; using Content.Shared.Clothing.Components; using Content.Shared.Damage; +using Content.Shared.DoAfter; using Content.Shared.FixedPoint; using Content.Shared.Inventory.Events; -using Content.Shared.Verbs; +using Content.Shared.Medical; +using Content.Shared.Medical.Stethoscope; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; -using Content.Shared.DoAfter; -using Content.Shared.Medical; +using Content.Shared.Verbs; using Robust.Shared.Utility; -namespace Content.Server.Medical +namespace Content.Server.Medical.Stethoscope { public sealed class StethoscopeSystem : EntitySystem { @@ -97,7 +99,7 @@ namespace Content.Server.Medical private void OnGetActions(EntityUid uid, StethoscopeComponent component, GetItemActionsEvent args) { - args.Actions.Add(component.Action); + args.AddAction(ref component.ActionEntity, component.Action); } // construct the doafter and start it @@ -156,6 +158,4 @@ namespace Content.Server.Medical return msg; } } - - public sealed partial class StethoscopeActionEvent : EntityTargetActionEvent {} } diff --git a/Content.Server/Mobs/CritMobActionsSystem.cs b/Content.Server/Mobs/CritMobActionsSystem.cs index 7babea79ab..9d0a6b4a85 100644 --- a/Content.Server/Mobs/CritMobActionsSystem.cs +++ b/Content.Server/Mobs/CritMobActionsSystem.cs @@ -2,7 +2,7 @@ using Content.Server.Chat.Systems; using Content.Server.Popups; using Content.Server.Speech.Muting; -using Content.Shared.Actions; +using Content.Shared.Mobs; using Content.Shared.Mobs.Components; using Content.Shared.Mobs.Systems; using Robust.Server.Console; @@ -82,24 +82,3 @@ public sealed class CritMobActionsSystem : EntitySystem args.Handled = true; } } - -/// -/// Only applies to mobs in crit capable of ghosting/succumbing -/// -public sealed partial class CritSuccumbEvent : InstantActionEvent -{ -} - -/// -/// Only applies/has functionality to mobs in crit that have -/// -public sealed partial class CritFakeDeathEvent : InstantActionEvent -{ -} - -/// -/// Only applies to mobs capable of speaking, as a last resort in crit -/// -public sealed partial class CritLastWordsEvent : InstantActionEvent -{ -} diff --git a/Content.Server/Polymorph/Components/PolymorphableComponent.cs b/Content.Server/Polymorph/Components/PolymorphableComponent.cs index cd928637e7..c05d36a842 100644 --- a/Content.Server/Polymorph/Components/PolymorphableComponent.cs +++ b/Content.Server/Polymorph/Components/PolymorphableComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Polymorph; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; @@ -11,7 +10,7 @@ namespace Content.Server.Polymorph.Components /// A list of all the polymorphs that the entity has. /// Used to manage them and remove them if needed. /// - public Dictionary? PolymorphActions = null; + public Dictionary? PolymorphActions = null; /// /// The polymorphs that the entity starts out being able to do. diff --git a/Content.Server/Polymorph/Systems/PolymorphSystem.cs b/Content.Server/Polymorph/Systems/PolymorphSystem.cs index fda90f2cb0..d630cbcad7 100644 --- a/Content.Server/Polymorph/Systems/PolymorphSystem.cs +++ b/Content.Server/Polymorph/Systems/PolymorphSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Mind.Commands; using Content.Server.Nutrition; using Content.Server.Polymorph.Components; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Buckle; using Content.Shared.Damage; using Content.Shared.Hands.EntitySystems; @@ -46,6 +45,8 @@ namespace Content.Server.Polymorph.Systems private ISawmill _sawmill = default!; + private const string RevertPolymorphId = "ActionRevertPolymorph"; + public override void Initialize() { base.Initialize(); @@ -97,23 +98,21 @@ namespace Content.Server.Polymorph.Systems if (proto.Forced) return; - var act = new InstantAction + var actionId = Spawn(RevertPolymorphId); + if (_actions.TryGetActionData(actionId, out var action)) { - Event = new RevertPolymorphActionEvent(), - EntityIcon = component.Parent, - DisplayName = Loc.GetString("polymorph-revert-action-name"), - Description = Loc.GetString("polymorph-revert-action-description"), - UseDelay = TimeSpan.FromSeconds(proto.Delay), - }; + action.EntityIcon = component.Parent; + action.UseDelay = TimeSpan.FromSeconds(proto.Delay); + } - _actions.AddAction(uid, act, null); + _actions.AddAction(uid, actionId, null, null, action); } private void OnBeforeFullyEaten(EntityUid uid, PolymorphedEntityComponent comp, BeforeFullyEatenEvent args) { if (!_proto.TryIndex(comp.Prototype, out var proto)) { - _sawmill.Error("Invalid polymorph prototype {comp.Prototype}"); + _sawmill.Error($"Invalid polymorph prototype {comp.Prototype}"); return; } @@ -334,23 +333,19 @@ namespace Content.Server.Polymorph.Systems return; var entproto = _proto.Index(polyproto.Entity); - - var act = new InstantAction + var actionId = Spawn(RevertPolymorphId); + if (_actions.TryGetActionData(actionId, out var baseAction) && + baseAction is InstantActionComponent action) { - Event = new PolymorphActionEvent - { - Prototype = polyproto, - }, - DisplayName = Loc.GetString("polymorph-self-action-name", ("target", entproto.Name)), - Description = Loc.GetString("polymorph-self-action-description", ("target", entproto.Name)), - Icon = new SpriteSpecifier.EntityPrototype(polyproto.Entity), - ItemIconStyle = ItemActionIconStyle.NoItem, - }; + action.Event = new PolymorphActionEvent { Prototype = polyproto }; + action.Icon = new SpriteSpecifier.EntityPrototype(polyproto.Entity); + _metaData.SetEntityName(actionId, Loc.GetString("polymorph-self-action-name", ("target", entproto.Name))); + _metaData.SetEntityDescription(actionId, Loc.GetString("polymorph-self-action-description", ("target", entproto.Name))); - polycomp.PolymorphActions ??= new(); - - polycomp.PolymorphActions.Add(id, act); - _actions.AddAction(target, act, target); + polycomp.PolymorphActions ??= new Dictionary(); + polycomp.PolymorphActions.Add(id, actionId); + _actions.AddAction(target, actionId, target); + } } [PublicAPI] @@ -399,18 +394,4 @@ namespace Content.Server.Polymorph.Systems UpdateCollide(); } } - - public sealed partial class PolymorphActionEvent : InstantActionEvent - { - /// - /// The polymorph prototype containing all the information about - /// the specific polymorph. - /// - public PolymorphPrototype Prototype = default!; - } - - public sealed partial class RevertPolymorphActionEvent : InstantActionEvent - { - - } } diff --git a/Content.Server/RatKing/RatKingComponent.cs b/Content.Server/RatKing/RatKingComponent.cs index c38c922243..22e9de4135 100644 --- a/Content.Server/RatKing/RatKingComponent.cs +++ b/Content.Server/RatKing/RatKingComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -7,11 +6,13 @@ namespace Content.Server.RatKing [RegisterComponent] public sealed partial class RatKingComponent : Component { + [DataField("actionRaiseArmy", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ActionRaiseArmy = "ActionRatKingRaiseArmy"; + /// /// The action for the Raise Army ability /// - [DataField("actionRaiseArmy", required: true)] - public InstantAction ActionRaiseArmy = new(); + [DataField("actionRaiseArmyEntity")] public EntityUid? ActionRaiseArmyEntity; /// /// The amount of hunger one use of Raise Army consumes @@ -25,11 +26,14 @@ namespace Content.Server.RatKing [ViewVariables(VVAccess.ReadWrite), DataField("armyMobSpawnId", customTypeSerializer: typeof(PrototypeIdSerializer))] public string ArmyMobSpawnId = "MobRatServant"; + [DataField("actionDomain", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ActionDomain = "ActionRatKingDomain"; + /// /// The action for the Domain ability /// - [DataField("actionDomain", required: true)] - public InstantAction ActionDomain = new(); + [DataField("actionDomainEntity")] + public EntityUid? ActionDomainEntity; /// /// The amount of hunger one use of Domain consumes @@ -43,4 +47,4 @@ namespace Content.Server.RatKing [DataField("molesMiasmaPerDomain")] public float MolesMiasmaPerDomain = 100f; } -}; +} diff --git a/Content.Server/RatKing/RatKingSystem.cs b/Content.Server/RatKing/RatKingSystem.cs index 5f9d7376a0..cd3cbbb691 100644 --- a/Content.Server/RatKing/RatKingSystem.cs +++ b/Content.Server/RatKing/RatKingSystem.cs @@ -1,13 +1,11 @@ using Content.Server.Actions; using Content.Server.Atmos.EntitySystems; -using Content.Server.Nutrition.Components; using Content.Server.Popups; -using Content.Shared.Actions; using Content.Shared.Atmos; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; +using Content.Shared.RatKing; using Robust.Server.GameObjects; -using Robust.Shared.Player; namespace Content.Server.RatKing { @@ -23,16 +21,16 @@ namespace Content.Server.RatKing { base.Initialize(); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnRaiseArmy); SubscribeLocalEvent(OnDomain); } - private void OnStartup(EntityUid uid, RatKingComponent component, ComponentStartup args) + private void OnMapInit(EntityUid uid, RatKingComponent component, MapInitEvent args) { - _action.AddAction(uid, component.ActionRaiseArmy, null); - _action.AddAction(uid, component.ActionDomain, null); + _action.AddAction(uid, ref component.ActionRaiseArmyEntity, component.ActionRaiseArmy); + _action.AddAction(uid, ref component.ActionDomainEntity, component.ActionDomain); } /// @@ -86,14 +84,4 @@ namespace Content.Server.RatKing tileMix?.AdjustMoles(Gas.Miasma, component.MolesMiasmaPerDomain); } } - - public sealed partial class RatKingRaiseArmyActionEvent : InstantActionEvent - { - - } - - public sealed partial class RatKingDomainActionEvent : InstantActionEvent - { - - } -}; +} diff --git a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs index 73a04ca8a4..4028f2dce2 100644 --- a/Content.Server/Revenant/EntitySystems/RevenantSystem.cs +++ b/Content.Server/Revenant/EntitySystems/RevenantSystem.cs @@ -1,35 +1,33 @@ using System.Numerics; using Content.Server.Actions; -using Content.Shared.Popups; -using Content.Shared.Alert; -using Content.Shared.Damage; -using Content.Shared.Interaction; using Content.Server.GameTicking; -using Content.Shared.Stunnable; -using Content.Shared.Revenant; -using Robust.Server.GameObjects; -using Robust.Shared.Random; -using Content.Shared.StatusEffect; -using Content.Server.Visible; -using Content.Shared.Examine; -using Robust.Shared.Prototypes; -using Content.Shared.Actions.ActionTypes; -using Content.Shared.Tag; using Content.Server.Store.Components; using Content.Server.Store.Systems; +using Content.Server.Visible; +using Content.Shared.Alert; +using Content.Shared.Damage; using Content.Shared.DoAfter; +using Content.Shared.Examine; using Content.Shared.FixedPoint; +using Content.Shared.Interaction; using Content.Shared.Maps; using Content.Shared.Mobs.Systems; using Content.Shared.Physics; +using Content.Shared.Popups; +using Content.Shared.Revenant; using Content.Shared.Revenant.Components; +using Content.Shared.StatusEffect; +using Content.Shared.Stunnable; +using Content.Shared.Tag; +using Robust.Server.GameObjects; +using Robust.Shared.Prototypes; +using Robust.Shared.Random; namespace Content.Server.Revenant.EntitySystems; public sealed partial class RevenantSystem : EntitySystem { [Dependency] private readonly IRobustRandom _random = default!; - [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly ActionsSystem _action = default!; [Dependency] private readonly AlertsSystem _alerts = default!; [Dependency] private readonly DamageableSystem _damage = default!; @@ -46,11 +44,15 @@ public sealed partial class RevenantSystem : EntitySystem [Dependency] private readonly VisibilitySystem _visibility = default!; [Dependency] private readonly GameTicker _ticker = default!; + [ValidatePrototypeId] + private const string RevenantShopId = "ActionRevenantShop"; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShop); SubscribeLocalEvent(OnDamage); @@ -82,9 +84,11 @@ public sealed partial class RevenantSystem : EntitySystem //ghost vision if (TryComp(uid, out EyeComponent? eye)) eye.VisibilityMask |= (uint) (VisibilityFlags.Ghost); + } - var shopaction = new InstantAction(_proto.Index("RevenantShop")); - _action.AddAction(uid, shopaction, null); + private void OnMapInit(EntityUid uid, RevenantComponent component, MapInitEvent args) + { + _action.AddAction(uid, Spawn(RevenantShopId), null); } private void OnStatusAdded(EntityUid uid, RevenantComponent component, StatusEffectAddedEvent args) diff --git a/Content.Server/Sericulture/SericultureComponent.cs b/Content.Server/Sericulture/SericultureComponent.cs index 38528e5309..2d258accc8 100644 --- a/Content.Server/Sericulture/SericultureComponent.cs +++ b/Content.Server/Sericulture/SericultureComponent.cs @@ -1,9 +1,11 @@ +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + namespace Content.Server.Sericulture; [RegisterComponent] public sealed partial class SericultureComponent : Component { - [DataField("popupText")] public string PopupText = "sericulture-failure-hunger"; @@ -13,8 +15,10 @@ public sealed partial class SericultureComponent : Component [DataField("entityProduced", required: true)] public string EntityProduced = ""; - [DataField("actionProto", required: true)] - public string ActionProto = ""; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionSericulture"; + + [DataField("actionEntity")] public EntityUid? ActionEntity; /// /// How long will it take to make. diff --git a/Content.Server/Sericulture/SericultureSystem.cs b/Content.Server/Sericulture/SericultureSystem.cs index 3570695a5f..011e225c28 100644 --- a/Content.Server/Sericulture/SericultureSystem.cs +++ b/Content.Server/Sericulture/SericultureSystem.cs @@ -1,14 +1,11 @@ using Content.Server.Actions; using Content.Server.DoAfter; using Content.Server.Popups; -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Content.Server.Stack; using Content.Shared.DoAfter; using Content.Shared.Nutrition.Components; using Content.Shared.Nutrition.EntitySystems; -using Robust.Shared.Prototypes; using Content.Shared.Sericulture; -using Content.Server.Stack; namespace Content.Server.Sericulture; @@ -16,7 +13,6 @@ public sealed partial class SericultureSystem : EntitySystem { [Dependency] private readonly ActionsSystem _actionsSystem = default!; [Dependency] private readonly DoAfterSystem _doAfterSystem = default!; - [Dependency] private readonly IPrototypeManager _protoManager = default!; [Dependency] private readonly HungerSystem _hungerSystem = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly StackSystem _stackSystem = default!; @@ -25,26 +21,20 @@ public sealed partial class SericultureSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(OnCompInit); + SubscribeLocalEvent(OnCompMapInit); SubscribeLocalEvent(OnCompRemove); SubscribeLocalEvent(OnSericultureStart); SubscribeLocalEvent(OnSericultureDoAfter); } - private void OnCompInit(EntityUid uid, SericultureComponent comp, ComponentInit args) + private void OnCompMapInit(EntityUid uid, SericultureComponent comp, MapInitEvent args) { - if (!_protoManager.TryIndex(comp.ActionProto, out var actionProto)) - return; - - _actionsSystem.AddAction(uid, new InstantAction(actionProto), uid); + _actionsSystem.AddAction(uid, ref comp.ActionEntity, comp.Action, uid); } private void OnCompRemove(EntityUid uid, SericultureComponent comp, ComponentShutdown args) { - if (!_protoManager.TryIndex(comp.ActionProto, out var actionProto)) - return; - - _actionsSystem.RemoveAction(uid, new InstantAction(actionProto)); + _actionsSystem.RemoveAction(uid, comp.ActionEntity); } private void OnSericultureStart(EntityUid uid, SericultureComponent comp, SericultureActionEvent args) @@ -96,6 +86,4 @@ public sealed partial class SericultureSystem : EntitySystem return false; } - - public sealed partial class SericultureActionEvent : InstantActionEvent { } } diff --git a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs index 3e93933605..51987fb721 100644 --- a/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs +++ b/Content.Server/Silicons/Borgs/BorgSystem.Modules.cs @@ -57,8 +57,14 @@ public sealed partial class BorgSystem private void OnSelectableInstalled(EntityUid uid, SelectableBorgModuleComponent component, ref BorgModuleInstalledEvent args) { var chassis = args.ChassisEnt; - component.ModuleSwapAction.EntityIcon = uid; - _actions.AddAction(chassis, component.ModuleSwapAction, uid); + + var action = _actions.AddAction(chassis, ref component.ModuleSwapActionEntity, component.ModuleSwapActionId, uid); + if (action != null) + { + action.EntityIcon = uid; + Dirty(component.ModuleSwapActionEntity!.Value, action); + } + SelectModule(chassis, uid, moduleComp: component); } diff --git a/Content.Server/Silicons/Laws/SiliconLawSystem.cs b/Content.Server/Silicons/Laws/SiliconLawSystem.cs index e83fc9b6aa..1d5c2e35e8 100644 --- a/Content.Server/Silicons/Laws/SiliconLawSystem.cs +++ b/Content.Server/Silicons/Laws/SiliconLawSystem.cs @@ -5,7 +5,6 @@ using Content.Server.Radio.Components; using Content.Server.Roles; using Content.Server.Station.Systems; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Administration; using Content.Shared.Chat; using Content.Shared.Emag.Components; @@ -43,7 +42,6 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem { base.Initialize(); - SubscribeLocalEvent(OnComponentStartup); SubscribeLocalEvent(OnComponentShutdown); SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnMindAdded); @@ -58,20 +56,15 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem SubscribeLocalEvent(OnExamined); } - private void OnComponentStartup(EntityUid uid, SiliconLawBoundComponent component, ComponentStartup args) - { - component.ProvidedAction = new(_prototype.Index(component.ViewLawsAction)); - _actions.AddAction(uid, component.ProvidedAction, null); - } - private void OnComponentShutdown(EntityUid uid, SiliconLawBoundComponent component, ComponentShutdown args) { - if (component.ProvidedAction != null) - _actions.RemoveAction(uid, component.ProvidedAction); + if (component.ViewLawsActionEntity != null) + _actions.RemoveAction(uid, component.ViewLawsActionEntity); } private void OnMapInit(EntityUid uid, SiliconLawBoundComponent component, MapInitEvent args) { + _actions.AddAction(uid, ref component.ViewLawsActionEntity, component.ViewLawsAction); GetLaws(uid, component); } diff --git a/Content.Server/Speech/Components/VocalComponent.cs b/Content.Server/Speech/Components/VocalComponent.cs index 292498474c..029d638a66 100644 --- a/Content.Server/Speech/Components/VocalComponent.cs +++ b/Content.Server/Speech/Components/VocalComponent.cs @@ -1,10 +1,8 @@ -using Content.Server.Humanoid; using Content.Server.Speech.EntitySystems; -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Chat.Prototypes; using Content.Shared.Humanoid; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; @@ -33,11 +31,11 @@ public sealed partial class VocalComponent : Component [DataField("wilhelmProbability")] public float WilhelmProbability = 0.0002f; - [DataField("screamActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ScreamActionId = "Scream"; + [DataField("screamAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ScreamAction = "ActionScream"; - [DataField("screamAction")] - public InstantAction? ScreamAction; + [DataField("screamActionEntity")] + public EntityUid? ScreamActionEntity; /// /// Currently loaded emote sounds prototype, based on entity sex. @@ -46,8 +44,3 @@ public sealed partial class VocalComponent : Component [ViewVariables] public EmoteSoundsPrototype? EmoteSounds = null; } - -public sealed partial class ScreamActionEvent : InstantActionEvent -{ - -} diff --git a/Content.Server/Speech/EntitySystems/MeleeSpeechSystem.cs b/Content.Server/Speech/EntitySystems/MeleeSpeechSystem.cs index 4e884f5f3b..815b0224c8 100644 --- a/Content.Server/Speech/EntitySystems/MeleeSpeechSystem.cs +++ b/Content.Server/Speech/EntitySystems/MeleeSpeechSystem.cs @@ -1,8 +1,8 @@ using Content.Server.Administration.Logs; using Content.Shared.Actions; +using Content.Shared.Database; using Content.Shared.Speech.Components; using Content.Shared.Speech.EntitySystems; -using Content.Shared.Database; using Robust.Server.GameObjects; namespace Content.Server.Speech.EntitySystems; @@ -18,17 +18,15 @@ public sealed class MeleeSpeechSystem : SharedMeleeSpeechSystem SubscribeLocalEvent(OnBattlecryChanged); SubscribeLocalEvent(OnConfigureAction); SubscribeLocalEvent(OnGetActions); - SubscribeLocalEvent(OnComponentInit); + SubscribeLocalEvent(OnComponentMapInit); } - private void OnComponentInit(EntityUid uid, MeleeSpeechComponent component, ComponentInit args) + private void OnComponentMapInit(EntityUid uid, MeleeSpeechComponent component, MapInitEvent args) { - if (component.ConfigureAction != null) - _actionSystem.AddAction(uid, component.ConfigureAction, uid); + _actionSystem.AddAction(uid, ref component.ConfigureActionEntity, component.ConfigureAction, uid); } private void OnGetActions(EntityUid uid, MeleeSpeechComponent component, GetItemActionsEvent args) { - if (component.ConfigureAction != null) - args.Actions.Add(component.ConfigureAction); + args.AddAction(ref component.ConfigureActionEntity, component.ConfigureAction); } private void OnBattlecryChanged(EntityUid uid, MeleeSpeechComponent comp, MeleeSpeechBattlecryChangedMessage args) { diff --git a/Content.Server/Speech/EntitySystems/VocalSystem.cs b/Content.Server/Speech/EntitySystems/VocalSystem.cs index 244b5124c2..5dccb8bf9c 100644 --- a/Content.Server/Speech/EntitySystems/VocalSystem.cs +++ b/Content.Server/Speech/EntitySystems/VocalSystem.cs @@ -1,10 +1,9 @@ using Content.Server.Actions; using Content.Server.Chat.Systems; -using Content.Server.Humanoid; using Content.Server.Speech.Components; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Chat.Prototypes; using Content.Shared.Humanoid; +using Content.Shared.Speech; using Robust.Shared.Prototypes; using Robust.Shared.Random; @@ -32,21 +31,16 @@ public sealed class VocalSystem : EntitySystem private void OnMapInit(EntityUid uid, VocalComponent component, MapInitEvent args) { // try to add scream action when vocal comp added - if (_proto.TryIndex(component.ScreamActionId, out InstantActionPrototype? proto)) - { - component.ScreamAction = new InstantAction(proto); - _actions.AddAction(uid, component.ScreamAction, null); - } - + _actions.AddAction(uid, ref component.ScreamActionEntity, component.ScreamAction); LoadSounds(uid, component); } private void OnShutdown(EntityUid uid, VocalComponent component, ComponentShutdown args) { // remove scream action when component removed - if (component.ScreamAction != null) + if (component.ScreamActionEntity != null) { - _actions.RemoveAction(uid, component.ScreamAction); + _actions.RemoveAction(uid, component.ScreamActionEntity); } } @@ -76,7 +70,7 @@ public sealed class VocalSystem : EntitySystem if (args.Handled) return; - _chat.TryEmoteWithChat(uid, component.ScreamActionId); + _chat.TryEmoteWithChat(uid, component.ScreamId); args.Handled = true; } diff --git a/Content.Server/Store/Systems/StoreSystem.Ui.cs b/Content.Server/Store/Systems/StoreSystem.Ui.cs index 19f5a2105e..5de4542509 100644 --- a/Content.Server/Store/Systems/StoreSystem.Ui.cs +++ b/Content.Server/Store/Systems/StoreSystem.Ui.cs @@ -1,16 +1,15 @@ +using System.Linq; using Content.Server.Actions; using Content.Server.Administration.Logs; using Content.Server.PDA.Ringer; using Content.Server.Stack; using Content.Server.Store.Components; using Content.Server.UserInterface; -using Content.Shared.Actions.ActionTypes; +using Content.Shared.Database; using Content.Shared.FixedPoint; using Content.Shared.Hands.EntitySystems; using Content.Shared.Store; -using Content.Shared.Database; using Robust.Server.GameObjects; -using System.Linq; namespace Content.Server.Store.Systems; @@ -162,10 +161,9 @@ public sealed partial class StoreSystem } //give action - if (listing.ProductAction != null) + if (!string.IsNullOrWhiteSpace(listing.ProductAction)) { - var action = new InstantAction(_proto.Index(listing.ProductAction)); - _actions.AddAction(buyer, action, null); + _actions.AddAction(buyer, Spawn(listing.ProductAction), null); } //broadcast event diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Server/UserInterface/ActivatableUISystem.cs index bde518cc96..c7f07c2f70 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Server/UserInterface/ActivatableUISystem.cs @@ -5,6 +5,7 @@ using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; +using Content.Shared.UserInterface; using Content.Shared.Verbs; using Robust.Server.GameObjects; using Robust.Server.Player; diff --git a/Content.Server/UserInterface/IntrinsicUIComponent.cs b/Content.Server/UserInterface/IntrinsicUIComponent.cs index 2e4814e054..4d3c7ffba9 100644 --- a/Content.Server/UserInterface/IntrinsicUIComponent.cs +++ b/Content.Server/UserInterface/IntrinsicUIComponent.cs @@ -1,57 +1,32 @@ -using Content.Shared.Actions.ActionTypes; -using Robust.Shared.Reflection; -using Robust.Shared.Serialization; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.UserInterface; [RegisterComponent] -public sealed partial class IntrinsicUIComponent : Component, ISerializationHooks +public sealed partial class IntrinsicUIComponent : Component { /// /// List of UIs and their actions that this entity has. /// - [DataField("uis", required: true)] - public List UIs = new(); - - void ISerializationHooks.AfterDeserialization() - { - for (var i = 0; i < UIs.Count; i++) - { - var ui = UIs[i]; - ui.AfterDeserialization(); - UIs[i] = ui; - } - } + [DataField("uis", required: true)] public List UIs = new(); } [DataDefinition] -public partial struct IntrinsicUIEntry +public partial class IntrinsicUIEntry { - [ViewVariables] public Enum? Key { get; private set; } = null; - /// /// The BUI key that this intrinsic UI should open. /// [DataField("key", required: true)] - private string _keyRaw = default!; + public Enum? Key { get; private set; } + + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] + public string? ToggleAction; /// /// The action used for this BUI. /// - [DataField("toggleAction", required: true)] - public InstantAction ToggleAction = new(); - - public void AfterDeserialization() - { - var reflectionManager = IoCManager.Resolve(); - if (reflectionManager.TryParseEnumReference(_keyRaw, out var key)) - Key = key; - - if (ToggleAction.Event is ToggleIntrinsicUIEvent ev) - { - ev.Key = Key; - } - } - - public IntrinsicUIEntry() {} + [DataField("toggleActionEntity")] + public EntityUid? ToggleActionEntity = new(); } diff --git a/Content.Server/UserInterface/IntrinsicUISystem.cs b/Content.Server/UserInterface/IntrinsicUISystem.cs index c1268b0974..c7360c15bf 100644 --- a/Content.Server/UserInterface/IntrinsicUISystem.cs +++ b/Content.Server/UserInterface/IntrinsicUISystem.cs @@ -1,6 +1,6 @@ using Content.Server.Actions; using Content.Shared.Actions; -using JetBrains.Annotations; +using Content.Shared.UserInterface; using Robust.Server.GameObjects; namespace Content.Server.UserInterface; @@ -28,7 +28,7 @@ public sealed class IntrinsicUISystem : EntitySystem foreach (var entry in component.UIs) { - _actionsSystem.AddAction(uid, entry.ToggleAction, null, actions); + _actionsSystem.AddAction(uid, ref entry.ToggleActionEntity, entry.ToggleAction, null, actions); } } @@ -68,13 +68,6 @@ public sealed class IntrinsicUISystem : EntitySystem } } -[UsedImplicitly] -public sealed partial class ToggleIntrinsicUIEvent : InstantActionEvent -{ - [ViewVariables] - public Enum? Key { get; set; } -} - // Competing with ActivatableUI for horrible event names. public sealed class IntrinsicUIOpenAttemptEvent : CancellableEntityEventArgs { diff --git a/Content.Server/VendingMachines/VendingMachineSystem.cs b/Content.Server/VendingMachines/VendingMachineSystem.cs index f80d4d600a..38576b8951 100644 --- a/Content.Server/VendingMachines/VendingMachineSystem.cs +++ b/Content.Server/VendingMachines/VendingMachineSystem.cs @@ -8,7 +8,6 @@ using Content.Server.UserInterface; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Damage; using Content.Shared.Destructible; using Content.Shared.DoAfter; @@ -44,6 +43,7 @@ namespace Content.Server.VendingMachines base.Initialize(); _sawmill = Logger.GetSawmill("vending"); + SubscribeLocalEvent(OnComponentMapInit); SubscribeLocalEvent(OnPowerChanged); SubscribeLocalEvent(OnBreak); SubscribeLocalEvent(OnEmagged); @@ -62,6 +62,12 @@ namespace Content.Server.VendingMachines SubscribeLocalEvent(OnPriceCalculation); } + private void OnComponentMapInit(EntityUid uid, VendingMachineComponent component, MapInitEvent args) + { + _action.AddAction(uid, ref component.ActionEntity, component.Action, uid); + Dirty(uid, component); + } + private void OnVendingPrice(EntityUid uid, VendingMachineComponent component, ref PriceCalculationEvent args) { var price = 0.0; @@ -88,12 +94,6 @@ namespace Content.Server.VendingMachines { TryUpdateVisualState(uid, component); } - - if (component.Action != null) - { - var action = new InstantAction(PrototypeManager.Index(component.Action)); - _action.AddAction(uid, action, uid); - } } private void OnActivatableUIOpenAttempt(EntityUid uid, VendingMachineComponent component, ActivatableUIOpenAttemptEvent args) diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs b/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs index 74c7b3b77e..87b3b9ef32 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs @@ -1,9 +1,6 @@ using Content.Server.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; -using Content.Shared.Speech; -using Robust.Shared.Prototypes; namespace Content.Server.VoiceMask; @@ -12,7 +9,6 @@ public sealed partial class VoiceMaskSystem { [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly ActionsSystem _actions = default!; - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; private const string MaskSlot = "mask"; @@ -26,12 +22,7 @@ public sealed partial class VoiceMaskSystem var comp = EnsureComp(user); comp.VoiceName = component.LastSetName; - if (!_prototypeManager.TryIndex(component.Action, out var action)) - { - throw new ArgumentException("Could not get voice masking prototype."); - } - - _actions.AddAction(user, (InstantAction) action.Clone(), uid); + _actions.AddAction(user, ref component.ActionEntity, component.Action, uid); } private void OnUnequip(EntityUid uid, VoiceMaskerComponent compnent, GotUnequippedEvent args) diff --git a/Content.Server/VoiceMask/VoiceMaskSystem.cs b/Content.Server/VoiceMask/VoiceMaskSystem.cs index fe15df3829..5143237fa0 100644 --- a/Content.Server/VoiceMask/VoiceMaskSystem.cs +++ b/Content.Server/VoiceMask/VoiceMaskSystem.cs @@ -1,7 +1,6 @@ using Content.Server.Administration.Logs; using Content.Server.Chat.Systems; using Content.Server.Popups; -using Content.Shared.Actions; using Content.Shared.Database; using Content.Shared.Inventory.Events; using Content.Shared.Preferences; @@ -88,7 +87,3 @@ public sealed partial class VoiceMaskSystem : EntitySystem UserInterfaceSystem.SetUiState(bui, new VoiceMaskBuiState(component.VoiceName)); } } - -public sealed partial class VoiceMaskSetNameEvent : InstantActionEvent -{ -} diff --git a/Content.Server/VoiceMask/VoiceMaskerComponent.cs b/Content.Server/VoiceMask/VoiceMaskerComponent.cs index 4ca22cbf94..c3cc29c527 100644 --- a/Content.Server/VoiceMask/VoiceMaskerComponent.cs +++ b/Content.Server/VoiceMask/VoiceMaskerComponent.cs @@ -1,4 +1,4 @@ -using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Server.VoiceMask; @@ -8,6 +8,8 @@ public sealed partial class VoiceMaskerComponent : Component { [ViewVariables(VVAccess.ReadWrite)] public string LastSetName = "Unknown"; - [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string Action = "ChangeVoiceMask"; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionChangeVoiceMask"; + + [DataField("actionEntity")] public EntityUid? ActionEntity; } diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs index 69f9450a4f..91aaaa417a 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs @@ -1,7 +1,5 @@ using Content.Server.Actions; using Content.Server.Popups; -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Xenoarchaeology.XenoArtifacts; using Robust.Shared.Prototypes; @@ -12,32 +10,29 @@ public partial class ArtifactSystem [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly PopupSystem _popup = default!; + [ValidatePrototypeId] private const string ArtifactActivateActionId = "ActionArtifactActivate"; + /// /// Used to add the artifact activation action (hehe), which lets sentient artifacts activate themselves, /// either through admemery or the sentience effect. /// public void InitializeActions() { - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnRemove); SubscribeLocalEvent(OnSelfActivate); } - private void OnStartup(EntityUid uid, ArtifactComponent component, ComponentStartup args) + private void OnStartup(EntityUid uid, ArtifactComponent component, MapInitEvent args) { - if (_prototype.TryIndex("ArtifactActivate", out var proto)) - { - _actions.AddAction(uid, new InstantAction(proto), null); - } + RandomizeArtifact(uid, component); + _actions.AddAction(uid, Spawn(ArtifactActivateActionId), null); } private void OnRemove(EntityUid uid, ArtifactComponent component, ComponentRemove args) { - if (_prototype.TryIndex("ArtifactActivate", out var proto)) - { - _actions.RemoveAction(uid, new InstantAction(proto)); - } + _actions.RemoveAction(uid, ArtifactActivateActionId); } private void OnSelfActivate(EntityUid uid, ArtifactComponent component, ArtifactSelfActivateEvent args) @@ -52,4 +47,3 @@ public partial class ArtifactSystem args.Handled = true; } } - diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs index 573fa36a26..0791924caa 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs @@ -6,12 +6,12 @@ using Content.Server.Power.EntitySystems; using Content.Server.Xenoarchaeology.Equipment.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; using Content.Server.Xenoarchaeology.XenoArtifacts.Triggers.Components; +using Content.Shared.CCVar; using Content.Shared.Xenoarchaeology.XenoArtifacts; using JetBrains.Annotations; +using Robust.Shared.Configuration; using Robust.Shared.Random; using Robust.Shared.Timing; -using Robust.Shared.Configuration; -using Content.Shared.CCVar; namespace Content.Server.Xenoarchaeology.XenoArtifacts; @@ -30,7 +30,6 @@ public sealed partial class ArtifactSystem : EntitySystem _sawmill = Logger.GetSawmill("artifact"); - SubscribeLocalEvent(OnInit); SubscribeLocalEvent(GetPrice); SubscribeLocalEvent(OnRoundEnd); @@ -38,11 +37,6 @@ public sealed partial class ArtifactSystem : EntitySystem InitializeActions(); } - private void OnInit(EntityUid uid, ArtifactComponent component, MapInitEvent args) - { - RandomizeArtifact(uid, component); - } - /// /// Calculates the price of an artifact based on /// how many nodes have been unlocked/triggered diff --git a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs index 4554ff94b2..0245b220a3 100644 --- a/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs +++ b/Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs @@ -1,6 +1,6 @@ -using Content.Server.Magic.Events; -using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; +using Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Components; using Content.Server.Xenoarchaeology.XenoArtifacts.Events; +using Content.Shared.Magic.Events; namespace Content.Server.Xenoarchaeology.XenoArtifacts.Effects.Systems; diff --git a/Content.Shared/Actions/ActionEvents.cs b/Content.Shared/Actions/ActionEvents.cs index c99151ecef..3d45d3ef1a 100644 --- a/Content.Shared/Actions/ActionEvents.cs +++ b/Content.Shared/Actions/ActionEvents.cs @@ -1,8 +1,8 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Hands; using Content.Shared.Inventory; using Content.Shared.Inventory.Events; using Robust.Shared.Map; +using Robust.Shared.Network; using Robust.Shared.Serialization; namespace Content.Shared.Actions; @@ -18,7 +18,9 @@ namespace Content.Shared.Actions; /// public sealed class GetItemActionsEvent : EntityEventArgs { - public SortedSet Actions = new(); + private readonly IEntityManager _entities; + private readonly INetManager _net; + public readonly SortedSet Actions = new(); /// /// User equipping the item. @@ -35,11 +37,26 @@ public sealed class GetItemActionsEvent : EntityEventArgs /// public bool InHands => SlotFlags == null; - public GetItemActionsEvent(EntityUid user, SlotFlags? slotFlags = null) + public GetItemActionsEvent(IEntityManager entities, INetManager net, EntityUid user, SlotFlags? slotFlags = null) { + _entities = entities; + _net = net; User = user; SlotFlags = slotFlags; } + + public void AddAction(ref EntityUid? actionId, string? prototypeId) + { + if (_entities.Deleted(actionId)) + { + if (string.IsNullOrWhiteSpace(prototypeId) || _net.IsClient) + return; + + actionId = _entities.Spawn(prototypeId); + } + + Actions.Add(actionId.Value); + } } /// @@ -48,22 +65,22 @@ public sealed class GetItemActionsEvent : EntityEventArgs [Serializable, NetSerializable] public sealed class RequestPerformActionEvent : EntityEventArgs { - public readonly ActionType Action; + public readonly EntityUid Action; public readonly EntityUid? EntityTarget; public readonly EntityCoordinates? EntityCoordinatesTarget; - public RequestPerformActionEvent(InstantAction action) + public RequestPerformActionEvent(EntityUid action) { Action = action; } - public RequestPerformActionEvent(EntityTargetAction action, EntityUid entityTarget) + public RequestPerformActionEvent(EntityUid action, EntityUid entityTarget) { Action = action; EntityTarget = entityTarget; } - public RequestPerformActionEvent(WorldTargetAction action, EntityCoordinates entityCoordinatesTarget) + public RequestPerformActionEvent(EntityUid action, EntityCoordinates entityCoordinatesTarget) { Action = action; EntityCoordinatesTarget = entityCoordinatesTarget; diff --git a/Content.Shared/Actions/ActionTypes/ActionPrototypes.cs b/Content.Shared/Actions/ActionTypes/ActionPrototypes.cs deleted file mode 100644 index 2e61ef32de..0000000000 --- a/Content.Shared/Actions/ActionTypes/ActionPrototypes.cs +++ /dev/null @@ -1,56 +0,0 @@ -using Robust.Shared.Prototypes; - -namespace Content.Shared.Actions.ActionTypes; - -// These are just prototype definitions for actions. Allows actions to be defined once in yaml and re-used elsewhere. -// Note that you still need to create a new instance of each action to properly track the state (cooldown, toggled, -// enabled, etc). The prototypes should not be modified directly. -// -// If ever action states data is separated from the rest of the data, this might not be required -// anymore. - -[Prototype("worldTargetAction")] -public sealed partial class WorldTargetActionPrototype : WorldTargetAction, IPrototype -{ - [IdDataField] - public string ID { get; private set; } = default!; - - // This is a shitty hack to get around the fact that action-prototypes should not in general be sever-exclusive - // prototypes, but some actions may need to use server-exclusive events, and there is no way to specify on a - // per-prototype basis whether the client should ignore it when validating yaml. - [DataField("serverEvent", serverOnly: true)] - public WorldTargetActionEvent? ServerEvent - { - get => Event; - set => Event = value; - } -} - -[Prototype("entityTargetAction")] -public sealed partial class EntityTargetActionPrototype : EntityTargetAction, IPrototype -{ - [IdDataField] - public string ID { get; private set; } = default!; - - [DataField("serverEvent", serverOnly: true)] - public EntityTargetActionEvent? ServerEvent - { - get => Event; - set => Event = value; - } -} - -[Prototype("instantAction")] -public sealed partial class InstantActionPrototype : InstantAction, IPrototype -{ - [IdDataField] - public string ID { get; private set; } = default!; - - [DataField("serverEvent", serverOnly: true)] - public InstantActionEvent? ServerEvent - { - get => Event; - set => Event = value; - } -} - diff --git a/Content.Shared/Actions/ActionTypes/ActionType.cs b/Content.Shared/Actions/ActionTypes/ActionType.cs deleted file mode 100644 index 93a24e2b75..0000000000 --- a/Content.Shared/Actions/ActionTypes/ActionType.cs +++ /dev/null @@ -1,275 +0,0 @@ -using Robust.Shared.Audio; -using Robust.Shared.Serialization; -using Robust.Shared.Utility; - -namespace Content.Shared.Actions.ActionTypes; - -[ImplicitDataDefinitionForInheritors] -[Serializable, NetSerializable] -public abstract partial class ActionType : IEquatable, IComparable, ICloneable -{ - /// - /// Icon representing this action in the UI. - /// - [DataField("icon")] - public SpriteSpecifier? Icon; - - /// - /// For toggle actions only, icon to show when toggled on. If omitted, the action will simply be highlighted - /// when turned on. - /// - [DataField("iconOn")] - public SpriteSpecifier? IconOn; - - /// - /// If not null, this color will modulate the action icon color. - /// - /// - /// This currently only exists for decal-placement actions, so that the action icons correspond to the color of - /// the decal. But this is probably useful for other actions, including maybe changing color on toggle. - /// - [DataField("iconColor")] - public Color IconColor = Color.White; - - /// - /// Name to show in UI. - /// - [DataField("name")] - public string DisplayName = string.Empty; - - /// - /// This is just with localized strings resolved and markup removed. If null, will be - /// inferred from . This is cached to speed up game state handling. - /// - [NonSerialized] - public string? RawName; - - /// - /// Description to show in UI. Accepts formatting. - /// - [DataField("description")] - public string Description = string.Empty; - - /// - /// Keywords that can be used to search for this action in the action menu. - /// - [DataField("keywords")] - public HashSet Keywords = new(); - - /// - /// Whether this action is currently enabled. If not enabled, this action cannot be performed. - /// - [DataField("enabled")] - public bool Enabled = true; - - /// - /// The toggle state of this action. Toggling switches the currently displayed icon, see and . - /// - /// - /// The toggle can set directly via , but it will also be - /// automatically toggled for targeted-actions while selecting a target. - /// - public bool Toggled; - - /// - /// The current cooldown on the action. - /// - public (TimeSpan Start, TimeSpan End)? Cooldown; - - /// - /// Time interval between action uses. - /// - [DataField("useDelay")] - public TimeSpan? UseDelay; - - /// - /// Convenience tool for actions with limited number of charges. Automatically decremented on use, and the - /// action is disabled when it reaches zero. Does NOT automatically remove the action from the action bar. - /// - [DataField("charges")] - public int? Charges; - - /// - /// The entity that enables / provides this action. If the action is innate, this may be the user themselves. If - /// this action has no provider (e.g., mapping tools), the this will result in broadcast events. - /// - public EntityUid? Provider; - - /// - /// Entity to use for the action icon. Defaults to using . - /// - public EntityUid? EntityIcon - { - get => _entityIcon ?? Provider; - set => _entityIcon = value; - } - - private EntityUid? _entityIcon; - - /// - /// Whether the action system should block this action if the user cannot currently interact. Some spells or - /// abilities may want to disable this and implement their own checks. - /// - [DataField("checkCanInteract")] - public bool CheckCanInteract = true; - - /// - /// If true, will simply execute the action locally without sending to the server. - /// - [DataField("clientExclusive")] - public bool ClientExclusive = false; - - /// - /// Determines the order in which actions are automatically added the action bar. - /// - [DataField("priority")] - public int Priority = 0; - - /// - /// What entity, if any, currently has this action in the actions component? - /// - [ViewVariables] - public EntityUid? AttachedEntity; - - /// - /// Whether or not to automatically add this action to the action bar when it becomes available. - /// - [DataField("autoPopulate")] - public bool AutoPopulate = true; - - - /// - /// Whether or not to automatically remove this action to the action bar when it becomes unavailable. - /// - [DataField("autoRemove")] - public bool AutoRemove = true; - - /// - /// Temporary actions are removed from the action component when removed from the action-bar/GUI. Currently, - /// should only be used for client-exclusive actions (server is not notified). - /// - /// - /// Currently there is no way for a player to just voluntarily remove actions. They can hide them from the - /// toolbar, but not actually remove them. This is undesirable for things like dynamically added mapping - /// entity-selection actions, as the # of actions would just keep increasing. - /// - [DataField("temporary")] - public bool Temporary; - // TODO re-add support for this - // UI refactor seems to have just broken it. - - /// - /// Determines the appearance of the entity-icon for actions that are enabled via some entity. - /// - [DataField("itemIconStyle")] - public ItemActionIconStyle ItemIconStyle; - - /// - /// If not null, this sound will be played when performing this action. - /// - [DataField("sound")] - public SoundSpecifier? Sound; - - /// - /// Compares two actions based on their properties. This is used to determine equality when the client requests the - /// server to perform some action. Also determines the order in which actions are automatically added to the action bar. - /// - /// - /// Basically: if an action has the same priority, name, and is enabled by the same entity, then the actions are considered equal. - /// The entity-check is required to avoid toggling all flashlights simultaneously whenever a flashlight-hoarder uses an action. - /// - public virtual int CompareTo(object? obj) - { - if (obj is not ActionType otherAction) - return -1; - - if (Priority != otherAction.Priority) - return otherAction.Priority - Priority; - - RawName ??= FormattedMessage.RemoveMarkup(Loc.GetString(DisplayName)); - otherAction.RawName ??= FormattedMessage.RemoveMarkup(Loc.GetString(otherAction.DisplayName)); - var cmp = string.Compare(RawName, otherAction.RawName, StringComparison.CurrentCulture); - if (cmp != 0) - return cmp; - - if (Provider != otherAction.Provider) - { - if (Provider == null) - return -1; - - if (otherAction.Provider == null) - return 1; - - // uid to int casting... it says "Do NOT use this in content". You can't tell me what to do. - return (int) Provider - (int) otherAction.Provider; - } - - return 0; - } - - /// - /// Proper client-side state handling requires the ability to clone an action from the component state. - /// Otherwise modifying the action can lead to modifying the stored server state. - /// - public abstract object Clone(); - - public virtual void CopyFrom(object objectToClone) - { - if (objectToClone is not ActionType toClone) - return; - - // This is pretty Ugly to look at. But actions are sent to the client in a component state, so they have to be - // cloneable. Would be easy if this were a struct of only value-types, but I don't want to restrict actions like - // that. - Priority = toClone.Priority; - Icon = toClone.Icon; - IconOn = toClone.IconOn; - DisplayName = toClone.DisplayName; - RawName = null; - Description = toClone.Description; - Provider = toClone.Provider; - AttachedEntity = toClone.AttachedEntity; - Enabled = toClone.Enabled; - Toggled = toClone.Toggled; - Cooldown = toClone.Cooldown; - Charges = toClone.Charges; - Keywords = new(toClone.Keywords); - AutoPopulate = toClone.AutoPopulate; - AutoRemove = toClone.AutoRemove; - ItemIconStyle = toClone.ItemIconStyle; - CheckCanInteract = toClone.CheckCanInteract; - UseDelay = toClone.UseDelay; - Sound = toClone.Sound; - ItemIconStyle = toClone.ItemIconStyle; - _entityIcon = toClone._entityIcon; - } - - public bool Equals(ActionType? other) - { - return CompareTo(other) == 0; - } - - public static bool operator ==(ActionType? left, ActionType? right) - { - if (left is null) - return right is null; - - return left.Equals(right); - } - - public static bool operator !=(ActionType? left, ActionType? right) - { - return !(left == right); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = Priority.GetHashCode(); - hashCode = (hashCode * 397) ^ DisplayName.GetHashCode(); - hashCode = (hashCode * 397) ^ Provider.GetHashCode(); - return hashCode; - } - } -} diff --git a/Content.Shared/Actions/ActionTypes/InstantAction.cs b/Content.Shared/Actions/ActionTypes/InstantAction.cs deleted file mode 100644 index 34ee352406..0000000000 --- a/Content.Shared/Actions/ActionTypes/InstantAction.cs +++ /dev/null @@ -1,43 +0,0 @@ -using Robust.Shared.Serialization; - -namespace Content.Shared.Actions.ActionTypes; - -/// -/// Instantaneous action with no extra targeting information. Will result in being raised. -/// -[Serializable, NetSerializable] -[Virtual] -public partial class InstantAction : ActionType -{ - /// - /// The local-event to raise when this action is performed. - /// - [DataField("event")] - [NonSerialized] - public InstantActionEvent? Event; - - public InstantAction() { } - public InstantAction(InstantAction toClone) - { - CopyFrom(toClone); - } - - public override void CopyFrom(object objectToClone) - { - base.CopyFrom(objectToClone); - - // Server doesn't serialize events to us. - // As such we don't want them to bulldoze any events we may have gotten locally. - if (objectToClone is not InstantAction toClone) - return; - - // Events should be re-usable, and shouldn't be modified during prediction. - if (toClone.Event != null) - Event = toClone.Event; - } - - public override object Clone() - { - return new InstantAction(this); - } -} diff --git a/Content.Shared/Actions/ActionTypes/TargetedAction.cs b/Content.Shared/Actions/ActionTypes/TargetedAction.cs deleted file mode 100644 index 780972092a..0000000000 --- a/Content.Shared/Actions/ActionTypes/TargetedAction.cs +++ /dev/null @@ -1,153 +0,0 @@ -using Content.Shared.Interaction; -using Content.Shared.Whitelist; -using Robust.Shared.Serialization; - -namespace Content.Shared.Actions.ActionTypes; - -[Serializable, NetSerializable] -public abstract partial class TargetedAction : ActionType -{ - /// - /// For entity- or map-targeting actions, if this is true the action will remain selected after it is used, so - /// it can be continuously re-used. If this is false, the action will be deselected after one use. - /// - [DataField("repeat")] - public bool Repeat; - - /// - /// For entity- or map-targeting action, determines whether the action is deselected if the user doesn't click a valid target. - /// - [DataField("deselectOnMiss")] - public bool DeselectOnMiss; - - /// - /// Whether the action system should block this action if the user cannot actually access the target - /// (unobstructed, in inventory, in backpack, etc). Some spells or abilities may want to disable this and - /// implement their own checks. - /// - /// - /// Even if this is false, the will still be checked. - /// - [DataField("checkCanAccess")] - public bool CheckCanAccess = true; - - [DataField("range")] - public float Range = SharedInteractionSystem.InteractionRange; - - /// - /// If the target is invalid, this bool determines whether the left-click will default to performing a standard-interaction - /// - /// - /// Interactions will still be blocked if the target-validation generates a pop-up - /// - [DataField("interactOnMiss")] - public bool InteractOnMiss = false; - - /// - /// If true, and if is enabled, then this action's icon will be drawn by that - /// over lay in place of the currently held item "held item". - /// - [DataField("targetingIndicator")] - public bool TargetingIndicator = true; - - public override void CopyFrom(object objectToClone) - { - base.CopyFrom(objectToClone); - - if (objectToClone is not TargetedAction toClone) - return; - - Range = toClone.Range; - CheckCanAccess = toClone.CheckCanAccess; - DeselectOnMiss = toClone.DeselectOnMiss; - Repeat = toClone.Repeat; - InteractOnMiss = toClone.InteractOnMiss; - TargetingIndicator = toClone.TargetingIndicator; - } -} - -/// -/// Action that targets some entity. Will result in being raised. -/// -[Serializable, NetSerializable] -[Virtual] -public partial class EntityTargetAction : TargetedAction -{ - /// - /// The local-event to raise when this action is performed. - /// - [NonSerialized] - [DataField("event")] - public EntityTargetActionEvent? Event; - - [DataField("whitelist")] - public EntityWhitelist? Whitelist; - - [DataField("canTargetSelf")] - public bool CanTargetSelf = true; - - public EntityTargetAction() { } - public EntityTargetAction(EntityTargetAction toClone) - { - CopyFrom(toClone); - } - public override void CopyFrom(object objectToClone) - { - base.CopyFrom(objectToClone); - - if (objectToClone is not EntityTargetAction toClone) - return; - - CanTargetSelf = toClone.CanTargetSelf; - - // This isn't a deep copy, but I don't expect white-lists to ever be edited during prediction. So good enough? - Whitelist = toClone.Whitelist; - - // Events should be re-usable, and shouldn't be modified during prediction. - if (toClone.Event != null) - Event = toClone.Event; - } - - public override object Clone() - { - return new EntityTargetAction(this); - } -} - -/// -/// Action that targets some map coordinates. Will result in being raised. -/// -[Serializable, NetSerializable] -[Virtual] -public partial class WorldTargetAction : TargetedAction -{ - /// - /// The local-event to raise when this action is performed. - /// - [DataField("event")] - [NonSerialized] - public WorldTargetActionEvent? Event; - - public WorldTargetAction() { } - public WorldTargetAction(WorldTargetAction toClone) - { - CopyFrom(toClone); - } - - public override void CopyFrom(object objectToClone) - { - base.CopyFrom(objectToClone); - - if (objectToClone is not WorldTargetAction toClone) - return; - - // Events should be re-usable, and shouldn't be modified during prediction. - if (toClone.Event != null) - Event = toClone.Event; - } - - public override object Clone() - { - return new WorldTargetAction(this); - } -} diff --git a/Content.Shared/Actions/ActionsComponent.cs b/Content.Shared/Actions/ActionsComponent.cs index 4472f8a095..c84484dfc0 100644 --- a/Content.Shared/Actions/ActionsComponent.cs +++ b/Content.Shared/Actions/ActionsComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; using Robust.Shared.Serialization; @@ -9,10 +8,10 @@ namespace Content.Shared.Actions; [Access(typeof(SharedActionsSystem))] public sealed partial class ActionsComponent : Component { - [ViewVariables] - [Access(typeof(SharedActionsSystem), Other = AccessPermissions.ReadExecute)] - // FIXME Friends - public SortedSet Actions = new(); + /// + /// Handled on the client to track added and removed actions. + /// + [ViewVariables] public readonly Dictionary OldClientActions = new(); public override bool SendOnlyToOwner => true; } @@ -20,17 +19,16 @@ public sealed partial class ActionsComponent : Component [Serializable, NetSerializable] public sealed class ActionsComponentState : ComponentState { - public readonly List Actions; + public readonly List Actions; - [NonSerialized] - public SortedSet? SortedActions; - - public ActionsComponentState(List actions) + public ActionsComponentState(List actions) { Actions = actions; } } +public readonly record struct ActionMetaData(bool ClientExclusive, bool AutoRemove); + /// /// Determines how the action icon appears in the hotbar for item actions. /// diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs new file mode 100644 index 0000000000..7ece8e2b1f --- /dev/null +++ b/Content.Shared/Actions/BaseActionComponent.cs @@ -0,0 +1,187 @@ +using Robust.Shared.Audio; +using Robust.Shared.Serialization; +using Robust.Shared.Utility; + +namespace Content.Shared.Actions; + +// TODO this should be an IncludeDataFields of each action component type, not use inheritance +public abstract partial class BaseActionComponent : Component +{ + public abstract BaseActionEvent? BaseEvent { get; } + + /// + /// Icon representing this action in the UI. + /// + [DataField("icon")] public SpriteSpecifier? Icon; + + /// + /// For toggle actions only, icon to show when toggled on. If omitted, the action will simply be highlighted + /// when turned on. + /// + [DataField("iconOn")] public SpriteSpecifier? IconOn; + + /// + /// If not null, this color will modulate the action icon color. + /// + /// + /// This currently only exists for decal-placement actions, so that the action icons correspond to the color of + /// the decal. But this is probably useful for other actions, including maybe changing color on toggle. + /// + [DataField("iconColor")] public Color IconColor = Color.White; + + /// + /// Keywords that can be used to search for this action in the action menu. + /// + [DataField("keywords")] public HashSet Keywords = new(); + + /// + /// Whether this action is currently enabled. If not enabled, this action cannot be performed. + /// + [DataField("enabled")] public bool Enabled = true; + + /// + /// The toggle state of this action. Toggling switches the currently displayed icon, see and . + /// + /// + /// The toggle can set directly via , but it will also be + /// automatically toggled for targeted-actions while selecting a target. + /// + public bool Toggled; + + /// + /// The current cooldown on the action. + /// + public (TimeSpan Start, TimeSpan End)? Cooldown; + + /// + /// Time interval between action uses. + /// + [DataField("useDelay")] public TimeSpan? UseDelay; + + /// + /// Convenience tool for actions with limited number of charges. Automatically decremented on use, and the + /// action is disabled when it reaches zero. Does NOT automatically remove the action from the action bar. + /// + [DataField("charges")] public int? Charges; + + /// + /// The entity that enables / provides this action. If the action is innate, this may be the user themselves. If + /// this action has no provider (e.g., mapping tools), the this will result in broadcast events. + /// + public EntityUid? Provider; + + /// + /// Entity to use for the action icon. Defaults to using . + /// + public EntityUid? EntityIcon + { + get => _entityIcon ?? Provider; + set => _entityIcon = value; + } + + private EntityUid? _entityIcon; + + /// + /// Whether the action system should block this action if the user cannot currently interact. Some spells or + /// abilities may want to disable this and implement their own checks. + /// + [DataField("checkCanInteract")] public bool CheckCanInteract = true; + + /// + /// If true, will simply execute the action locally without sending to the server. + /// + [DataField("clientExclusive")] public bool ClientExclusive = false; + + /// + /// Determines the order in which actions are automatically added the action bar. + /// + [DataField("priority")] public int Priority = 0; + + /// + /// What entity, if any, currently has this action in the actions component? + /// + [ViewVariables] public EntityUid? AttachedEntity; + + /// + /// Whether or not to automatically add this action to the action bar when it becomes available. + /// + [DataField("autoPopulate")] public bool AutoPopulate = true; + + + /// + /// Whether or not to automatically remove this action to the action bar when it becomes unavailable. + /// + [DataField("autoRemove")] public bool AutoRemove = true; + + /// + /// Temporary actions are removed from the action component when removed from the action-bar/GUI. Currently, + /// should only be used for client-exclusive actions (server is not notified). + /// + /// + /// Currently there is no way for a player to just voluntarily remove actions. They can hide them from the + /// toolbar, but not actually remove them. This is undesirable for things like dynamically added mapping + /// entity-selection actions, as the # of actions would just keep increasing. + /// + [DataField("temporary")] public bool Temporary; + // TODO re-add support for this + // UI refactor seems to have just broken it. + + /// + /// Determines the appearance of the entity-icon for actions that are enabled via some entity. + /// + [DataField("itemIconStyle")] public ItemActionIconStyle ItemIconStyle; + + /// + /// If not null, this sound will be played when performing this action. + /// + [DataField("sound")] public SoundSpecifier? Sound; +} + +[Serializable, NetSerializable] +public abstract class BaseActionComponentState : ComponentState +{ + public SpriteSpecifier? Icon; + public SpriteSpecifier? IconOn; + public Color IconColor; + public HashSet Keywords; + public bool Enabled; + public bool Toggled; + public (TimeSpan Start, TimeSpan End)? Cooldown; + public TimeSpan? UseDelay; + public int? Charges; + public EntityUid? Provider; + public EntityUid? EntityIcon; + public bool CheckCanInteract; + public bool ClientExclusive; + public int Priority; + public EntityUid? AttachedEntity; + public bool AutoPopulate; + public bool AutoRemove; + public bool Temporary; + public ItemActionIconStyle ItemIconStyle; + public SoundSpecifier? Sound; + + protected BaseActionComponentState(BaseActionComponent component) + { + Icon = component.Icon; + IconOn = component.IconOn; + IconColor = component.IconColor; + Keywords = component.Keywords; + Enabled = component.Enabled; + Toggled = component.Toggled; + Cooldown = component.Cooldown; + UseDelay = component.UseDelay; + Charges = component.Charges; + Provider = component.Provider; + EntityIcon = component.EntityIcon; + CheckCanInteract = component.CheckCanInteract; + ClientExclusive = component.ClientExclusive; + Priority = component.Priority; + AttachedEntity = component.AttachedEntity; + AutoPopulate = component.AutoPopulate; + AutoRemove = component.AutoRemove; + Temporary = component.Temporary; + ItemIconStyle = component.ItemIconStyle; + Sound = component.Sound; + } +} diff --git a/Content.Shared/Actions/BaseTargetActionComponent.cs b/Content.Shared/Actions/BaseTargetActionComponent.cs new file mode 100644 index 0000000000..7e40b10c32 --- /dev/null +++ b/Content.Shared/Actions/BaseTargetActionComponent.cs @@ -0,0 +1,43 @@ +using Content.Shared.Interaction; + +namespace Content.Shared.Actions; + +public abstract partial class BaseTargetActionComponent : BaseActionComponent +{ + /// + /// For entity- or map-targeting actions, if this is true the action will remain selected after it is used, so + /// it can be continuously re-used. If this is false, the action will be deselected after one use. + /// + [DataField("repeat")] public bool Repeat; + + /// + /// For entity- or map-targeting action, determines whether the action is deselected if the user doesn't click a valid target. + /// + [DataField("deselectOnMiss")] public bool DeselectOnMiss; + + /// + /// Whether the action system should block this action if the user cannot actually access the target + /// (unobstructed, in inventory, in backpack, etc). Some spells or abilities may want to disable this and + /// implement their own checks. + /// + /// + /// Even if this is false, the will still be checked. + /// + [DataField("checkCanAccess")] public bool CheckCanAccess = true; + + [DataField("range")] public float Range = SharedInteractionSystem.InteractionRange; + + /// + /// If the target is invalid, this bool determines whether the left-click will default to performing a standard-interaction + /// + /// + /// Interactions will still be blocked if the target-validation generates a pop-up + /// + [DataField("interactOnMiss")] public bool InteractOnMiss = false; + + /// + /// If true, and if is enabled, then this action's icon will be drawn by that + /// over lay in place of the currently held item "held item". + /// + [DataField("targetingIndicator")] public bool TargetingIndicator = true; +} diff --git a/Content.Shared/Actions/EntityTargetActionComponent.cs b/Content.Shared/Actions/EntityTargetActionComponent.cs new file mode 100644 index 0000000000..33c4bf8cef --- /dev/null +++ b/Content.Shared/Actions/EntityTargetActionComponent.cs @@ -0,0 +1,35 @@ +using Content.Shared.Whitelist; +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Actions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class EntityTargetActionComponent : BaseTargetActionComponent +{ + public override BaseActionEvent? BaseEvent => Event; + + /// + /// The local-event to raise when this action is performed. + /// + [DataField("event")] + [NonSerialized] + public EntityTargetActionEvent? Event; + + [DataField("whitelist")] public EntityWhitelist? Whitelist; + + [DataField("canTargetSelf")] public bool CanTargetSelf = true; +} + +[Serializable, NetSerializable] +public sealed class EntityTargetActionComponentState : BaseActionComponentState +{ + public EntityWhitelist? Whitelist; + public bool CanTargetSelf; + + public EntityTargetActionComponentState(EntityTargetActionComponent component) : base(component) + { + Whitelist = component.Whitelist; + CanTargetSelf = component.CanTargetSelf; + } +} diff --git a/Content.Shared/Actions/Events/EggLayInstantActionEvent.cs b/Content.Shared/Actions/Events/EggLayInstantActionEvent.cs new file mode 100644 index 0000000000..5cdcfce985 --- /dev/null +++ b/Content.Shared/Actions/Events/EggLayInstantActionEvent.cs @@ -0,0 +1,3 @@ +namespace Content.Shared.Actions.Events; + +public sealed partial class EggLayInstantActionEvent : InstantActionEvent {} diff --git a/Content.Shared/Actions/Events/GetActionDataEvent.cs b/Content.Shared/Actions/Events/GetActionDataEvent.cs new file mode 100644 index 0000000000..be77cfd426 --- /dev/null +++ b/Content.Shared/Actions/Events/GetActionDataEvent.cs @@ -0,0 +1,4 @@ +namespace Content.Shared.Actions.Events; + +[ByRefEvent] +public record struct GetActionDataEvent(BaseActionComponent? Action); diff --git a/Content.Shared/Actions/Events/InvisibleWallActionEvent.cs b/Content.Shared/Actions/Events/InvisibleWallActionEvent.cs new file mode 100644 index 0000000000..d84b9910e0 --- /dev/null +++ b/Content.Shared/Actions/Events/InvisibleWallActionEvent.cs @@ -0,0 +1,5 @@ +namespace Content.Shared.Actions.Events; + +public sealed partial class InvisibleWallActionEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Actions/InstantActionComponent.cs b/Content.Shared/Actions/InstantActionComponent.cs new file mode 100644 index 0000000000..f97ca04a46 --- /dev/null +++ b/Content.Shared/Actions/InstantActionComponent.cs @@ -0,0 +1,25 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Actions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class InstantActionComponent : BaseActionComponent +{ + public override BaseActionEvent? BaseEvent => Event; + + /// + /// The local-event to raise when this action is performed. + /// + [DataField("event")] + [NonSerialized] + public InstantActionEvent? Event; +} + +[Serializable, NetSerializable] +public sealed class InstantActionComponentState : BaseActionComponentState +{ + public InstantActionComponentState(InstantActionComponent component) : base(component) + { + } +} diff --git a/Content.Shared/Actions/SharedActionsSystem.cs b/Content.Shared/Actions/SharedActionsSystem.cs index 9fc1b83748..00514fcea3 100644 --- a/Content.Shared/Actions/SharedActionsSystem.cs +++ b/Content.Shared/Actions/SharedActionsSystem.cs @@ -1,5 +1,7 @@ +using System.Diagnostics.CodeAnalysis; +using System.Linq; using Content.Shared.ActionBlocker; -using Content.Shared.Actions.ActionTypes; +using Content.Shared.Actions.Events; using Content.Shared.Administration.Logs; using Content.Shared.Database; using Content.Shared.Hands; @@ -8,16 +10,18 @@ using Content.Shared.Inventory.Events; using Robust.Shared.Containers; using Robust.Shared.GameStates; using Robust.Shared.Map; -using Robust.Shared.Prototypes; +using Robust.Shared.Network; using Robust.Shared.Timing; -using System.Linq; namespace Content.Shared.Actions; public abstract class SharedActionsSystem : EntitySystem { + private const string ActionContainerId = "ActionContainer"; + [Dependency] protected readonly IGameTiming GameTiming = default!; [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!; + [Dependency] private readonly INetManager _net = default!; [Dependency] private readonly SharedInteractionSystem _interactionSystem = default!; [Dependency] private readonly ActionBlockerSystem _actionBlockerSystem = default!; [Dependency] private readonly SharedContainerSystem _containerSystem = default!; @@ -34,14 +38,149 @@ public abstract class SharedActionsSystem : EntitySystem SubscribeLocalEvent(OnDidUnequip); SubscribeLocalEvent(OnHandUnequipped); - SubscribeLocalEvent(GetState); + SubscribeLocalEvent(OnActionsMapInit); + SubscribeLocalEvent(OnActionsGetState); + SubscribeLocalEvent(OnActionsShutdown); + + SubscribeLocalEvent(OnInstantGetState); + SubscribeLocalEvent(OnEntityTargetGetState); + SubscribeLocalEvent(OnWorldTargetGetState); + + SubscribeLocalEvent(OnInstantHandleState); + SubscribeLocalEvent(OnEntityTargetHandleState); + SubscribeLocalEvent(OnWorldTargetHandleState); + + SubscribeLocalEvent(OnGetActionData); + SubscribeLocalEvent(OnGetActionData); + SubscribeLocalEvent(OnGetActionData); SubscribeAllEvent(OnActionRequest); } - #region ComponentStateManagement - public virtual void Dirty(ActionType action) + private void OnInstantGetState(EntityUid uid, InstantActionComponent component, ref ComponentGetState args) { + args.State = new InstantActionComponentState(component); + } + + private void OnEntityTargetGetState(EntityUid uid, EntityTargetActionComponent component, ref ComponentGetState args) + { + args.State = new EntityTargetActionComponentState(component); + } + + private void OnWorldTargetGetState(EntityUid uid, WorldTargetActionComponent component, ref ComponentGetState args) + { + args.State = new WorldTargetActionComponentState(component); + } + + private void BaseHandleState(BaseActionComponent component, BaseActionComponentState state) + { + component.Icon = state.Icon; + component.IconOn = state.IconOn; + component.IconColor = state.IconColor; + component.Keywords = new HashSet(state.Keywords); + component.Enabled = state.Enabled; + component.Toggled = state.Toggled; + component.Cooldown = state.Cooldown; + component.UseDelay = state.UseDelay; + component.Charges = state.Charges; + component.Provider = state.Provider; + component.EntityIcon = state.EntityIcon; + component.CheckCanInteract = state.CheckCanInteract; + component.ClientExclusive = state.ClientExclusive; + component.Priority = state.Priority; + component.AttachedEntity = state.AttachedEntity; + component.AutoPopulate = state.AutoPopulate; + component.AutoRemove = state.AutoRemove; + component.Temporary = state.Temporary; + component.ItemIconStyle = state.ItemIconStyle; + component.Sound = state.Sound; + } + + private void OnInstantHandleState(EntityUid uid, InstantActionComponent component, ref ComponentHandleState args) + { + if (args.Current is not InstantActionComponentState state) + return; + + BaseHandleState(component, state); + } + + private void OnEntityTargetHandleState(EntityUid uid, EntityTargetActionComponent component, ref ComponentHandleState args) + { + if (args.Current is not EntityTargetActionComponentState state) + return; + + BaseHandleState(component, state); + component.Whitelist = state.Whitelist; + component.CanTargetSelf = state.CanTargetSelf; + } + + private void OnWorldTargetHandleState(EntityUid uid, WorldTargetActionComponent component, ref ComponentHandleState args) + { + if (args.Current is not WorldTargetActionComponentState state) + return; + + BaseHandleState(component, state); + } + + private void OnGetActionData(EntityUid uid, T component, ref GetActionDataEvent args) where T : BaseActionComponent + { + args.Action = component; + } + + public BaseActionComponent? GetActionData(EntityUid? actionId) + { + if (actionId == null) + return null; + + // TODO split up logic between each action component with different subscriptions + // good luck future coder + var ev = new GetActionDataEvent(); + RaiseLocalEvent(actionId.Value, ref ev); + return ev.Action; + } + + public bool TryGetActionData( + [NotNullWhen(true)] EntityUid? actionId, + [NotNullWhen(true)] out BaseActionComponent? action) + { + action = null; + return actionId != null && (action = GetActionData(actionId)) != null; + } + + protected Container EnsureContainer(EntityUid holderId) + { + return _containerSystem.EnsureContainer(holderId, ActionContainerId); + } + + protected bool TryGetContainer( + EntityUid holderId, + [NotNullWhen(true)] out IContainer? container, + ContainerManagerComponent? containerManager = null) + { + return _containerSystem.TryGetContainer(holderId, ActionContainerId, out container, containerManager); + } + + public void SetCooldown(EntityUid? actionId, TimeSpan start, TimeSpan end) + { + if (actionId == null) + return; + + var action = GetActionData(actionId); + if (action == null) + return; + + action.Cooldown = (start, end); + Dirty(actionId.Value, action); + } + + #region ComponentStateManagement + public virtual void Dirty(EntityUid? actionId) + { + if (!TryGetActionData(actionId, out var action)) + return; + + Dirty(actionId.Value, action); + if (action.AttachedEntity == null) return; @@ -51,39 +190,63 @@ public abstract class SharedActionsSystem : EntitySystem return; } - Dirty(comp); + Dirty(action.AttachedEntity.Value, comp); } - public void SetToggled(ActionType action, bool toggled) + public void SetToggled(EntityUid? actionId, bool toggled) { - if (action.Toggled == toggled) + if (!TryGetActionData(actionId, out var action) || + action.Toggled == toggled) + { return; + } action.Toggled = toggled; - Dirty(action); + Dirty(actionId.Value, action); } - public void SetEnabled(ActionType action, bool enabled) + public void SetEnabled(EntityUid? actionId, bool enabled) { - if (action.Enabled == enabled) + if (!TryGetActionData(actionId, out var action) || + action.Enabled == enabled) + { return; + } action.Enabled = enabled; - Dirty(action); + Dirty(actionId.Value, action); } - public void SetCharges(ActionType action, int? charges) + public void SetCharges(EntityUid? actionId, int? charges) { - if (action.Charges == charges) + if (!TryGetActionData(actionId, out var action) || + action.Charges == charges) + { return; + } action.Charges = charges; - Dirty(action); + Dirty(actionId.Value, action); } - private void GetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args) + private void OnActionsMapInit(EntityUid uid, ActionsComponent component, MapInitEvent args) { - args.State = new ActionsComponentState(component.Actions.ToList()); + EnsureContainer(uid); + } + + private void OnActionsGetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args) + { + var actions = new List(); + if (TryGetContainer(uid, out var container)) + actions.AddRange(container.ContainedEntities); + + args.State = new ActionsComponentState(actions); + } + + private void OnActionsShutdown(EntityUid uid, ActionsComponent component, ComponentShutdown args) + { + if (TryGetContainer(uid, out var container)) + container.Shutdown(EntityManager); } #endregion @@ -101,33 +264,36 @@ public abstract class SharedActionsSystem : EntitySystem if (!TryComp(user, out ActionsComponent? component)) return; + if (!TryComp(ev.Action, out MetaDataComponent? metaData)) + return; + + var name = Name(ev.Action, metaData); + // Does the user actually have the requested action? - if (!component.Actions.TryGetValue(ev.Action, out var act)) + if (!TryGetContainer(user, out var container) || !container.Contains(ev.Action)) { _adminLogger.Add(LogType.Action, - $"{ToPrettyString(user):user} attempted to perform an action that they do not have: {ev.Action.DisplayName}."); + $"{ToPrettyString(user):user} attempted to perform an action that they do not have: {name}."); return; } - if (!act.Enabled) + var action = GetActionData(ev.Action); + if (action == null || !action.Enabled) return; var curTime = GameTiming.CurTime; - if (act.Cooldown.HasValue && act.Cooldown.Value.End > curTime) + if (action.Cooldown.HasValue && action.Cooldown.Value.End > curTime) return; BaseActionEvent? performEvent = null; // Validate request by checking action blockers and the like: - var name = Loc.GetString(act.DisplayName); - - switch (act) + switch (action) { - case EntityTargetAction entityAction: - + case EntityTargetActionComponent entityAction: if (ev.EntityTarget is not { Valid: true } entityTarget) { - Log.Error($"Attempted to perform an entity-targeted action without a target! Action: {entityAction.DisplayName}"); + Log.Error($"Attempted to perform an entity-targeted action without a target! Action: {name}"); return; } @@ -137,7 +303,7 @@ public abstract class SharedActionsSystem : EntitySystem if (!ValidateEntityTarget(user, entityTarget, entityAction)) return; - if (act.Provider == null) + if (action.Provider == null) { _adminLogger.Add(LogType.Action, $"{ToPrettyString(user):user} is performing the {name:action} action targeted at {ToPrettyString(entityTarget):target}."); @@ -145,22 +311,21 @@ public abstract class SharedActionsSystem : EntitySystem else { _adminLogger.Add(LogType.Action, - $"{ToPrettyString(user):user} is performing the {name:action} action (provided by {ToPrettyString(act.Provider.Value):provider}) targeted at {ToPrettyString(entityTarget):target}."); + $"{ToPrettyString(user):user} is performing the {name:action} action (provided by {ToPrettyString(action.Provider.Value):provider}) targeted at {ToPrettyString(entityTarget):target}."); } if (entityAction.Event != null) { entityAction.Event.Target = entityTarget; + Dirty(ev.Action, entityAction); performEvent = entityAction.Event; } break; - - case WorldTargetAction worldAction: - + case WorldTargetActionComponent worldAction: if (ev.EntityCoordinatesTarget is not { } entityCoordinatesTarget) { - Log.Error($"Attempted to perform a world-targeted action without a target! Action: {worldAction.DisplayName}"); + Log.Error($"Attempted to perform a world-targeted action without a target! Action: {name}"); return; } @@ -169,7 +334,7 @@ public abstract class SharedActionsSystem : EntitySystem if (!ValidateWorldTarget(user, entityCoordinatesTarget, worldAction)) return; - if (act.Provider == null) + if (action.Provider == null) { _adminLogger.Add(LogType.Action, $"{ToPrettyString(user):user} is performing the {name:action} action targeted at {entityCoordinatesTarget:target}."); @@ -177,23 +342,22 @@ public abstract class SharedActionsSystem : EntitySystem else { _adminLogger.Add(LogType.Action, - $"{ToPrettyString(user):user} is performing the {name:action} action (provided by {ToPrettyString(act.Provider.Value):provider}) targeted at {entityCoordinatesTarget:target}."); + $"{ToPrettyString(user):user} is performing the {name:action} action (provided by {ToPrettyString(action.Provider.Value):provider}) targeted at {entityCoordinatesTarget:target}."); } if (worldAction.Event != null) { worldAction.Event.Target = entityCoordinatesTarget; + Dirty(ev.Action, worldAction); performEvent = worldAction.Event; } break; - - case InstantAction instantAction: - - if (act.CheckCanInteract && !_actionBlockerSystem.CanInteract(user, null)) + case InstantActionComponent instantAction: + if (action.CheckCanInteract && !_actionBlockerSystem.CanInteract(user, null)) return; - if (act.Provider == null) + if (action.Provider == null) { _adminLogger.Add(LogType.Action, $"{ToPrettyString(user):user} is performing the {name:action} action."); @@ -201,7 +365,7 @@ public abstract class SharedActionsSystem : EntitySystem else { _adminLogger.Add(LogType.Action, - $"{ToPrettyString(user):user} is performing the {name:action} action provided by {ToPrettyString(act.Provider.Value):provider}."); + $"{ToPrettyString(user):user} is performing the {name:action} action provided by {ToPrettyString(action.Provider.Value):provider}."); } performEvent = instantAction.Event; @@ -212,10 +376,10 @@ public abstract class SharedActionsSystem : EntitySystem performEvent.Performer = user; // All checks passed. Perform the action! - PerformAction(user, component, act, performEvent, curTime); + PerformAction(user, component, ev.Action, action, performEvent, curTime); } - public bool ValidateEntityTarget(EntityUid user, EntityUid target, EntityTargetAction action) + public bool ValidateEntityTarget(EntityUid user, EntityUid target, EntityTargetActionComponent action) { if (!target.IsValid() || Deleted(target)) return false; @@ -254,7 +418,7 @@ public abstract class SharedActionsSystem : EntitySystem return _interactionSystem.CanAccessViaStorage(user, target); } - public bool ValidateWorldTarget(EntityUid user, EntityCoordinates coords, WorldTargetAction action) + public bool ValidateWorldTarget(EntityUid user, EntityCoordinates coords, WorldTargetActionComponent action) { if (action.CheckCanInteract && !_actionBlockerSystem.CanInteract(user, null)) return false; @@ -276,7 +440,7 @@ public abstract class SharedActionsSystem : EntitySystem return _interactionSystem.InRangeUnobstructed(user, coords, range: action.Range); } - public void PerformAction(EntityUid performer, ActionsComponent? component, ActionType action, BaseActionEvent? actionEvent, TimeSpan curTime, bool predicted = true) + public void PerformAction(EntityUid performer, ActionsComponent? component, EntityUid actionId, BaseActionComponent action, BaseActionEvent? actionEvent, TimeSpan curTime, bool predicted = true) { var handled = false; @@ -320,89 +484,180 @@ public abstract class SharedActionsSystem : EntitySystem action.Cooldown = (curTime, curTime + action.UseDelay.Value); } + Dirty(actionId, action); + if (dirty && component != null) - Dirty(component); + Dirty(performer, component); } #endregion #region AddRemoveActions /// - /// Add an action to an action component. If the entity has no action component, this will give them one. + /// Add an action to an action holder. + /// If the holder has no actions component, this will give them one. /// - /// Entity to receive the actions - /// The action to add - /// The entity that enables these actions (e.g., flashlight). May be null (innate actions). - public virtual void AddAction(EntityUid uid, ActionType action, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true) + public BaseActionComponent? AddAction(EntityUid holderId, ref EntityUid? actionId, string? actionPrototypeId, EntityUid? provider = null, ActionsComponent? holderComp = null) { - // Because action classes have state data, e.g. cooldowns and uses-remaining, people should not be adding prototypes directly - if (action is IPrototype) + if (Deleted(actionId)) { - Log.Error("Attempted to directly add a prototype action. You need to clone a prototype in order to use it."); + if (_net.IsClient) + return null; + + if (string.IsNullOrWhiteSpace(actionPrototypeId)) + return null; + + actionId = Spawn(actionPrototypeId); + } + + AddAction(holderId, actionId.Value, provider, holderComp); + return GetActionData(actionId); + } + + /// + /// Add an action to an action holder. + /// If the holder has no actions component, this will give them one. + /// + /// Entity to receive the actions + /// Action entity to add + /// The entity that enables these actions (e.g., flashlight). May be null (innate actions). + /// Component of + /// Component of + /// Action container of + public virtual void AddAction(EntityUid holderId, EntityUid actionId, EntityUid? provider, ActionsComponent? holder = null, BaseActionComponent? action = null, bool dirty = true, IContainer? actionContainer = null) + { + action ??= GetActionData(actionId); + // TODO remove when action subscriptions are split up + if (action == null) + { + Log.Warning($"No {nameof(BaseActionComponent)} found on entity {actionId}"); return; } - comp ??= EnsureComp(uid); + holder ??= EnsureComp(holderId); action.Provider = provider; - action.AttachedEntity = uid; - AddActionInternal(comp, action); + action.AttachedEntity = holderId; + Dirty(actionId, action); + + actionContainer ??= EnsureContainer(holderId); + AddActionInternal(actionId, actionContainer); if (dirty) - Dirty(comp); + Dirty(holderId, holder); } - protected virtual void AddActionInternal(ActionsComponent comp, ActionType action) + protected virtual void AddActionInternal(EntityUid actionId, IContainer container) { - comp.Actions.Add(action); + container.Insert(actionId); } /// /// Add actions to an action component. If the entity has no action component, this will give them one. /// - /// Entity to receive the actions + /// Entity to receive the actions /// The actions to add /// The entity that enables these actions (e.g., flashlight). May be null (innate actions). - public void AddActions(EntityUid uid, IEnumerable actions, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true) + public void AddActions(EntityUid holderId, IEnumerable actions, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true) { - comp ??= EnsureComp(uid); + comp ??= EnsureComp(holderId); var allClientExclusive = true; + var container = EnsureContainer(holderId); - foreach (var action in actions) + foreach (var actionId in actions) { - AddAction(uid, action, provider, comp, false); + var action = GetActionData(actionId); + if (action == null) + continue; + + AddAction(holderId, actionId, provider, comp, action, false, container); allClientExclusive = allClientExclusive && action.ClientExclusive; } if (dirty && !allClientExclusive) - Dirty(comp); + Dirty(holderId, comp); + } + + public IEnumerable<(EntityUid Id, BaseActionComponent Comp)> GetActions(EntityUid holderId, IContainer? container = null) + { + if (container == null && + !TryGetContainer(holderId, out container)) + { + yield break; + } + + foreach (var actionId in container.ContainedEntities) + { + if (!TryGetActionData(actionId, out var action)) + continue; + + yield return (actionId, action); + } } /// /// Remove any actions that were enabled by some other entity. Useful when unequiping items that grant actions. /// - public void RemoveProvidedActions(EntityUid uid, EntityUid provider, ActionsComponent? comp = null) + public void RemoveProvidedActions(EntityUid holderId, EntityUid provider, ActionsComponent? comp = null, ContainerManagerComponent? actionContainer = null) { - if (!Resolve(uid, ref comp, false)) + if (!Resolve(holderId, ref comp, ref actionContainer, false)) return; - foreach (var act in comp.Actions.ToArray()) + if (!TryGetContainer(holderId, out var container, actionContainer)) + return; + + foreach (var actionId in container.ContainedEntities.ToArray()) { - if (act.Provider == provider) - RemoveAction(uid, act, comp, dirty: false); + var action = GetActionData(actionId); + if (action?.Provider == provider) + RemoveAction(holderId, actionId, comp, dirty: false, actionContainer: actionContainer); } - Dirty(comp); + + Dirty(holderId, comp); } - public virtual void RemoveAction(EntityUid uid, ActionType action, ActionsComponent? comp = null, bool dirty = true) + public virtual void RemoveAction(EntityUid holderId, EntityUid? actionId, ActionsComponent? comp = null, BaseActionComponent? action = null, bool dirty = true, ContainerManagerComponent? actionContainer = null) { - if (!Resolve(uid, ref comp, false)) + if (actionId == null || + !Resolve(holderId, ref comp, ref actionContainer, false) || + !TryGetContainer(holderId, out var container, actionContainer) || + !container.Contains(actionId.Value) || + TerminatingOrDeleted(actionId.Value)) + { return; + } - comp.Actions.Remove(action); - action.AttachedEntity = null; + action ??= GetActionData(actionId); + container.Remove(actionId.Value); + + if (action != null) + { + action.AttachedEntity = null; + Dirty(actionId.Value, action); + } if (dirty) - Dirty(comp); + Dirty(holderId, comp); + } + + /// + /// Removes all actions with the given prototype id. + /// + public void RemoveAction(EntityUid holderId, string actionPrototypeId, ActionsComponent? holderComp = null, ContainerManagerComponent? actionContainer = null) + { + if (!Resolve(holderId, ref holderComp, ref actionContainer, false)) + return; + + var actions = new List<(EntityUid Id, BaseActionComponent Comp)>(); + foreach (var (id, comp) in GetActions(holderId)) + { + if (Prototype(id)?.ID == actionPrototypeId) + actions.Add((id, comp)); + } + + foreach (var action in actions) + { + RemoveAction(holderId, action.Id, holderComp, action.Comp, actionContainer: actionContainer); + } } #endregion @@ -410,7 +665,7 @@ public abstract class SharedActionsSystem : EntitySystem #region EquipHandlers private void OnDidEquip(EntityUid uid, ActionsComponent component, DidEquipEvent args) { - var ev = new GetItemActionsEvent(args.Equipee, args.SlotFlags); + var ev = new GetItemActionsEvent(EntityManager, _net, args.Equipee, args.SlotFlags); RaiseLocalEvent(args.Equipment, ev); if (ev.Actions.Count == 0) @@ -421,7 +676,7 @@ public abstract class SharedActionsSystem : EntitySystem private void OnHandEquipped(EntityUid uid, ActionsComponent component, DidEquipHandEvent args) { - var ev = new GetItemActionsEvent(args.User); + var ev = new GetItemActionsEvent(EntityManager, _net, args.User); RaiseLocalEvent(args.Equipped, ev); if (ev.Actions.Count == 0) diff --git a/Content.Shared/Actions/WorldTargetActionComponent.cs b/Content.Shared/Actions/WorldTargetActionComponent.cs new file mode 100644 index 0000000000..f2ee34f530 --- /dev/null +++ b/Content.Shared/Actions/WorldTargetActionComponent.cs @@ -0,0 +1,25 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Serialization; + +namespace Content.Shared.Actions; + +[RegisterComponent, NetworkedComponent] +public sealed partial class WorldTargetActionComponent : BaseTargetActionComponent +{ + public override BaseActionEvent? BaseEvent => Event; + + /// + /// The local-event to raise when this action is performed. + /// + [DataField("event")] + [NonSerialized] + public WorldTargetActionEvent? Event; +} + +[Serializable, NetSerializable] +public sealed class WorldTargetActionComponentState : BaseActionComponentState +{ + public WorldTargetActionComponentState(WorldTargetActionComponent component) : base(component) + { + } +} diff --git a/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs b/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs index 2ecd6c601c..d049699d9d 100644 --- a/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs +++ b/Content.Shared/Bed/Sleep/SharedSleepingSystem.cs @@ -1,18 +1,25 @@ -using Content.Shared.Speech; using Content.Shared.Actions; using Content.Shared.Bed.Sleep; using Content.Shared.Eye.Blinding.Systems; +using Content.Shared.Speech; +using Robust.Shared.Prototypes; +using Robust.Shared.Timing; namespace Content.Server.Bed.Sleep { public abstract class SharedSleepingSystem : EntitySystem { + [Dependency] private readonly IGameTiming _gameTiming = default!; + [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly BlindableSystem _blindableSystem = default!; + [ValidatePrototypeId] private const string WakeActionId = "ActionWake"; + public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnSpeakAttempt); SubscribeLocalEvent(OnSeeAttempt); @@ -22,7 +29,7 @@ namespace Content.Server.Bed.Sleep private void OnSleepUnpaused(EntityUid uid, SleepingComponent component, ref EntityUnpausedEvent args) { component.CoolDownEnd += args.PausedTime; - Dirty(component); + Dirty(uid, component); } private void OnStartup(EntityUid uid, SleepingComponent component, ComponentStartup args) @@ -32,8 +39,17 @@ namespace Content.Server.Bed.Sleep _blindableSystem.UpdateIsBlind(uid); } + private void OnMapInit(EntityUid uid, SleepingComponent component, MapInitEvent args) + { + component.WakeAction = Spawn(WakeActionId); + _actionsSystem.SetCooldown(component.WakeAction, _gameTiming.CurTime, _gameTiming.CurTime + TimeSpan.FromSeconds(15)); + _actionsSystem.AddAction(uid, component.WakeAction.Value, null); + } + private void OnShutdown(EntityUid uid, SleepingComponent component, ComponentShutdown args) { + _actionsSystem.RemoveAction(uid, component.WakeAction); + var ev = new SleepStateChangedEvent(false); RaiseLocalEvent(uid, ev); _blindableSystem.UpdateIsBlind(uid); diff --git a/Content.Shared/Bed/Sleep/SleepingComponent.cs b/Content.Shared/Bed/Sleep/SleepingComponent.cs index e4100ff6da..94838b658f 100644 --- a/Content.Shared/Bed/Sleep/SleepingComponent.cs +++ b/Content.Shared/Bed/Sleep/SleepingComponent.cs @@ -25,4 +25,6 @@ public sealed partial class SleepingComponent : Component [DataField("cooldownEnd", customTypeSerializer:typeof(TimeOffsetSerializer))] public TimeSpan CoolDownEnd; + + [DataField("wakeAction")] public EntityUid? WakeAction; } diff --git a/Content.Shared/Bible/SummonActionEvent.cs b/Content.Shared/Bible/SummonActionEvent.cs new file mode 100644 index 0000000000..3d57f4095e --- /dev/null +++ b/Content.Shared/Bible/SummonActionEvent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Bible; + +public sealed partial class SummonActionEvent : InstantActionEvent +{ + +} \ No newline at end of file diff --git a/Content.Shared/Blocking/BlockingSystem.cs b/Content.Shared/Blocking/BlockingSystem.cs index 7a7cf02e1d..3735058154 100644 --- a/Content.Shared/Blocking/BlockingSystem.cs +++ b/Content.Shared/Blocking/BlockingSystem.cs @@ -1,8 +1,6 @@ using System.Linq; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Damage; -using Content.Shared.Damage.Prototypes; using Content.Shared.Examine; using Content.Shared.Hands; using Content.Shared.Hands.Components; @@ -80,11 +78,7 @@ public sealed partial class BlockingSystem : EntitySystem private void OnGetActions(EntityUid uid, BlockingComponent component, GetItemActionsEvent args) { - if (component.BlockingToggleAction == null && _proto.TryIndex(component.BlockingToggleActionId, out InstantActionPrototype? act)) - component.BlockingToggleAction = new(act); - - if (component.BlockingToggleAction != null) - args.Actions.Add(component.BlockingToggleAction); + args.AddAction(ref component.BlockingToggleActionEntity, component.BlockingToggleAction); } private void OnToggleAction(EntityUid uid, BlockingComponent component, ToggleActionEvent args) @@ -191,7 +185,7 @@ public sealed partial class BlockingSystem : EntitySystem CantBlockError(user); return false; } - _actionsSystem.SetToggled(component.BlockingToggleAction, true); + _actionsSystem.SetToggled(component.BlockingToggleActionEntity, true); _popupSystem.PopupEntity(msgUser, user, user); _popupSystem.PopupEntity(msgOther, user, Filter.PvsExcept(user), true); } @@ -252,7 +246,7 @@ public sealed partial class BlockingSystem : EntitySystem if (xform.Anchored) _transformSystem.Unanchor(user, xform); - _actionsSystem.SetToggled(component.BlockingToggleAction, false); + _actionsSystem.SetToggled(component.BlockingToggleActionEntity, false); _fixtureSystem.DestroyFixture(user, BlockingComponent.BlockFixtureID, body: physicsComponent); _physics.SetBodyType(user, blockingUserComponent.OriginalBodyType, body: physicsComponent); _popupSystem.PopupEntity(msgUser, user, user); diff --git a/Content.Shared/Blocking/Components/BlockingComponent.cs b/Content.Shared/Blocking/Components/BlockingComponent.cs index 89f3a85de7..b33a7d7a73 100644 --- a/Content.Shared/Blocking/Components/BlockingComponent.cs +++ b/Content.Shared/Blocking/Components/BlockingComponent.cs @@ -1,7 +1,7 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Damage; using Robust.Shared.Audio; using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Blocking; @@ -47,11 +47,11 @@ public sealed partial class BlockingComponent : Component [DataField("activeBlockModifier", required: true)] public DamageModifierSet ActiveBlockDamageModifier = default!; - [DataField("blockingToggleActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string BlockingToggleActionId = "ToggleBlock"; + [DataField("blockingToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string BlockingToggleAction = "ActionToggleBlock"; - [DataField("blockingToggleAction")] - public InstantAction? BlockingToggleAction; + [DataField("blockingToggleActionEntity")] + public EntityUid? BlockingToggleActionEntity; /// /// The sound to be played when you get hit while actively blocking diff --git a/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs b/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs index 9acbc0cfc5..5a7c40f3d1 100644 --- a/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs +++ b/Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs @@ -1,6 +1,5 @@ using Content.Shared.Containers.ItemSlots; using Robust.Shared.GameStates; -using Robust.Shared.Serialization.TypeSerializers.Implementations; namespace Content.Shared.CartridgeLoader; @@ -42,6 +41,6 @@ public sealed partial class CartridgeLoaderComponent : Component [DataField("diskSpace")] public int DiskSpace = 5; - [DataField("uiKey", required: true, customTypeSerializer: typeof(EnumSerializer))] + [DataField("uiKey", required: true)] public Enum UiKey = default!; } diff --git a/Content.Shared/Clothing/ClothingEvents.cs b/Content.Shared/Clothing/ClothingEvents.cs index 639212dd4d..028537f8b2 100644 --- a/Content.Shared/Clothing/ClothingEvents.cs +++ b/Content.Shared/Clothing/ClothingEvents.cs @@ -1,4 +1,6 @@ +using Content.Shared.Actions; + namespace Content.Shared.Clothing; /// @@ -55,3 +57,5 @@ public sealed class EquipmentVisualsUpdatedEvent : EntityEventArgs RevealedLayers = revealedLayers; } } + +public sealed partial class ToggleMaskEvent : InstantActionEvent { } diff --git a/Content.Shared/Clothing/Components/StealthClothingComponent.cs b/Content.Shared/Clothing/Components/StealthClothingComponent.cs index 2571d89b1f..fe84fbe76c 100644 --- a/Content.Shared/Clothing/Components/StealthClothingComponent.cs +++ b/Content.Shared/Clothing/Components/StealthClothingComponent.cs @@ -1,7 +1,8 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Clothing.EntitySystems; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Clothing.Components; @@ -23,14 +24,13 @@ public sealed partial class StealthClothingComponent : Component [DataField("visibility"), ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public float Visibility; + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleAction = "ActionTogglePhaseCloak"; + /// /// The action for enabling and disabling stealth. /// - [DataField("toggleAction")] - public InstantAction ToggleAction = new() - { - Event = new ToggleStealthEvent() - }; + [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity; } /// diff --git a/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs b/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs index 74c5d7a6ba..b87cd3fee5 100644 --- a/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs +++ b/Content.Shared/Clothing/Components/ToggleableClothingComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Clothing.EntitySystems; using Content.Shared.Inventory; using Robust.Shared.Containers; @@ -20,9 +19,11 @@ public sealed partial class ToggleableClothingComponent : Component /// /// Action used to toggle the clothing on or off. /// - [DataField("actionId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ActionId = "ToggleSuitPiece"; - public InstantAction? ToggleAction = null; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionToggleSuitPiece"; + + [DataField("actionEntity")] + public EntityUid? ActionEntity; /// /// Default clothing entity prototype to spawn into the clothing container. @@ -66,7 +67,7 @@ public sealed partial class ToggleableClothingComponent : Component public TimeSpan? StripDelay = TimeSpan.FromSeconds(3); /// - /// Text shown in the toggle-clothing verb. Defaults to using the name of the action. + /// Text shown in the toggle-clothing verb. Defaults to using the name of the action. /// [DataField("verbText")] public string? VerbText; diff --git a/Content.Shared/Clothing/EntitySystems/StealthClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/StealthClothingSystem.cs index dc8de4385b..2fbaa6ea20 100644 --- a/Content.Shared/Clothing/EntitySystems/StealthClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/StealthClothingSystem.cs @@ -3,7 +3,6 @@ using Content.Shared.Clothing.Components; using Content.Shared.Inventory.Events; using Content.Shared.Stealth; using Content.Shared.Stealth.Components; -using Robust.Shared.GameStates; namespace Content.Shared.Clothing.EntitySystems; @@ -59,7 +58,7 @@ public sealed class StealthClothingSystem : EntitySystem if (ev.Cancelled) return; - args.Actions.Add(comp.ToggleAction); + args.AddAction(ref comp.ToggleActionEntity, comp.ToggleAction); } /// diff --git a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs index 9201cf0797..06ef6728fa 100644 --- a/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs +++ b/Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Clothing.Components; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; @@ -10,7 +9,6 @@ using Content.Shared.Popups; using Content.Shared.Strip; using Content.Shared.Verbs; using Robust.Shared.Containers; -using Robust.Shared.Network; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Utility; @@ -60,7 +58,7 @@ public sealed class ToggleableClothingSystem : EntitySystem if (!args.CanAccess || !args.CanInteract || component.ClothingUid == null || component.Container == null) return; - var text = component.VerbText ?? component.ToggleAction?.DisplayName; + var text = component.VerbText ?? (component.ActionEntity == null ? null : Name(component.ActionEntity.Value)); if (text == null) return; @@ -179,8 +177,11 @@ public sealed class ToggleableClothingSystem : EntitySystem // automatically be deleted. // remove action. - if (component.ToggleAction?.AttachedEntity != null) - _actionsSystem.RemoveAction(component.ToggleAction.AttachedEntity.Value, component.ToggleAction); + if (_actionsSystem.TryGetActionData(component.ActionEntity, out var action) && + action.AttachedEntity != null) + { + _actionsSystem.RemoveAction(action.AttachedEntity.Value, component.ActionEntity); + } if (component.ClothingUid != null) QueueDel(component.ClothingUid.Value); @@ -200,8 +201,11 @@ public sealed class ToggleableClothingSystem : EntitySystem return; // remove action. - if (toggleComp.ToggleAction?.AttachedEntity != null) - _actionsSystem.RemoveAction(toggleComp.ToggleAction.AttachedEntity.Value, toggleComp.ToggleAction); + if (_actionsSystem.TryGetActionData(toggleComp.ActionEntity, out var action) && + action.AttachedEntity != null) + { + _actionsSystem.RemoveAction(action.AttachedEntity.Value, toggleComp.ActionEntity); + } RemComp(component.AttachedUid, toggleComp); } @@ -259,8 +263,7 @@ public sealed class ToggleableClothingSystem : EntitySystem if (component.ClothingUid == null || (args.SlotFlags & component.RequiredFlags) != component.RequiredFlags) return; - if (component.ToggleAction != null) - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ActionEntity, component.Action); } private void OnInit(EntityUid uid, ToggleableClothingComponent component, ComponentInit args) @@ -280,13 +283,9 @@ public sealed class ToggleableClothingSystem : EntitySystem return; } - if (component.ToggleAction == null - && _proto.TryIndex(component.ActionId, out InstantActionPrototype? act)) - { - component.ToggleAction = new(act); - } + component.ActionEntity ??= Spawn(component.Action); - if (component.ClothingUid != null && component.ToggleAction != null) + if (component.ClothingUid != null && component.ActionEntity != null) { DebugTools.Assert(Exists(component.ClothingUid), "Toggleable clothing is missing expected entity."); DebugTools.Assert(TryComp(component.ClothingUid, out AttachedClothingComponent? comp), "Toggleable clothing is missing an attached component"); @@ -300,10 +299,10 @@ public sealed class ToggleableClothingSystem : EntitySystem component.Container.Insert(component.ClothingUid.Value, EntityManager, ownerTransform: xform); } - if (component.ToggleAction != null) + if (_actionsSystem.TryGetActionData(component.ActionEntity, out var action)) { - component.ToggleAction.EntityIcon = component.ClothingUid; - _actionsSystem.Dirty(component.ToggleAction); + action.EntityIcon = component.ClothingUid; + _actionsSystem.Dirty(component.ActionEntity); } } } diff --git a/Content.Shared/Clothing/MagbootsComponent.cs b/Content.Shared/Clothing/MagbootsComponent.cs index f9980c8014..f90a5576c5 100644 --- a/Content.Shared/Clothing/MagbootsComponent.cs +++ b/Content.Shared/Clothing/MagbootsComponent.cs @@ -1,5 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Clothing; @@ -7,8 +8,11 @@ namespace Content.Shared.Clothing; [Access(typeof(SharedMagbootsSystem))] public sealed partial class MagbootsComponent : Component { - [DataField("toggleAction", required: true)] - public InstantAction ToggleAction = new(); + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer), required: true)] + public string? ToggleAction; + + [DataField("toggleActionEntity")] + public EntityUid? ToggleActionEntity; [DataField("on"), AutoNetworkedField] public bool On; diff --git a/Content.Shared/Clothing/SharedMagbootsSystem.cs b/Content.Shared/Clothing/SharedMagbootsSystem.cs index 9a470f45b3..69b7849992 100644 --- a/Content.Shared/Clothing/SharedMagbootsSystem.cs +++ b/Content.Shared/Clothing/SharedMagbootsSystem.cs @@ -62,7 +62,7 @@ public abstract class SharedMagbootsSystem : EntitySystem protected void OnChanged(EntityUid uid, MagbootsComponent component) { - _sharedActions.SetToggled(component.ToggleAction, component.On); + _sharedActions.SetToggled(component.ToggleActionEntity, component.On); _clothingSpeedModifier.SetClothingSpeedModifierEnabled(uid, component.On); } @@ -86,7 +86,7 @@ public abstract class SharedMagbootsSystem : EntitySystem private void OnGetActions(EntityUid uid, MagbootsComponent component, GetItemActionsEvent args) { - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } } diff --git a/Content.Shared/CombatMode/CombatModeComponent.cs b/Content.Shared/CombatMode/CombatModeComponent.cs index 511a37a980..12d1cf264a 100644 --- a/Content.Shared/CombatMode/CombatModeComponent.cs +++ b/Content.Shared/CombatMode/CombatModeComponent.cs @@ -1,7 +1,7 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Targeting; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.CombatMode @@ -32,11 +32,11 @@ namespace Content.Shared.CombatMode #endregion - [DataField("combatToggleActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string CombatToggleActionId = "CombatModeToggle"; + [DataField("combatToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string CombatToggleAction = "ActionCombatModeToggle"; - [DataField("combatToggleAction")] - public InstantAction? CombatToggleAction; + [DataField("combatToggleActionEntity")] + public EntityUid? CombatToggleActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("isInCombatMode"), AutoNetworkedField] public bool IsInCombatMode; diff --git a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs index e8807d4bbc..c52605e09f 100644 --- a/Content.Shared/CombatMode/Pacification/PacificationSystem.cs +++ b/Content.Shared/CombatMode/Pacification/PacificationSystem.cs @@ -1,7 +1,6 @@ using Content.Shared.Actions; using Content.Shared.Alert; using Content.Shared.Interaction.Events; -using Content.Shared.Popups; namespace Content.Shared.CombatMode.Pacification; @@ -33,10 +32,7 @@ public sealed class PacificationSystem : EntitySystem _combatSystem.SetCanDisarm(uid, false, combatMode); _combatSystem.SetInCombatMode(uid, false, combatMode); - - if (combatMode.CombatToggleAction != null) - _actionsSystem.SetEnabled(combatMode.CombatToggleAction, false); - + _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, false); _alertsSystem.ShowAlert(uid, AlertType.Pacified); } @@ -48,9 +44,7 @@ public sealed class PacificationSystem : EntitySystem if (combatMode.CanDisarm != null) _combatSystem.SetCanDisarm(uid, true, combatMode); - if (combatMode.CombatToggleAction != null) - _actionsSystem.SetEnabled(combatMode.CombatToggleAction, true); - + _actionsSystem.SetEnabled(combatMode.CombatToggleActionEntity, true); _alertsSystem.ClearAlert(uid, AlertType.Pacified); } } diff --git a/Content.Shared/CombatMode/SharedCombatModeSystem.cs b/Content.Shared/CombatMode/SharedCombatModeSystem.cs index 53e65d031b..5b208a08f9 100644 --- a/Content.Shared/CombatMode/SharedCombatModeSystem.cs +++ b/Content.Shared/CombatMode/SharedCombatModeSystem.cs @@ -1,10 +1,7 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Popups; using Content.Shared.Targeting; using Robust.Shared.Network; -using Robust.Shared.Prototypes; -using Robust.Shared.Serialization; using Robust.Shared.Timing; namespace Content.Shared.CombatMode; @@ -13,7 +10,6 @@ public abstract class SharedCombatModeSystem : EntitySystem { [Dependency] protected readonly IGameTiming Timing = default!; [Dependency] private readonly INetManager _netMan = default!; - [Dependency] private readonly IPrototypeManager _protoMan = default!; [Dependency] private readonly SharedActionsSystem _actionsSystem = default!; [Dependency] private readonly SharedPopupSystem _popup = default!; @@ -21,27 +17,19 @@ public abstract class SharedCombatModeSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnStartup); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnActionPerform); } - private void OnStartup(EntityUid uid, CombatModeComponent component, ComponentStartup args) + private void OnStartup(EntityUid uid, CombatModeComponent component, MapInitEvent args) { - if (component.CombatToggleAction == null - && _protoMan.TryIndex(component.CombatToggleActionId, out InstantActionPrototype? toggleProto)) - { - component.CombatToggleAction = new(toggleProto); - } - - if (component.CombatToggleAction != null) - _actionsSystem.AddAction(uid, component.CombatToggleAction, null); + _actionsSystem.AddAction(uid, ref component.CombatToggleActionEntity, component.CombatToggleAction); } private void OnShutdown(EntityUid uid, CombatModeComponent component, ComponentShutdown args) { - if (component.CombatToggleAction != null) - _actionsSystem.RemoveAction(uid, component.CombatToggleAction); + _actionsSystem.RemoveAction(uid, component.CombatToggleActionEntity); } private void OnActionPerform(EntityUid uid, CombatModeComponent component, ToggleCombatActionEvent args) @@ -86,8 +74,8 @@ public abstract class SharedCombatModeSystem : EntitySystem component.IsInCombatMode = value; Dirty(entity, component); - if (component.CombatToggleAction != null) - _actionsSystem.SetToggled(component.CombatToggleAction, component.IsInCombatMode); + if (component.CombatToggleActionEntity != null) + _actionsSystem.SetToggled(component.CombatToggleActionEntity, component.IsInCombatMode); } public virtual void SetActiveZone(EntityUid entity, TargetingZone zone, diff --git a/Content.Shared/Cuffs/SharedCuffableSystem.cs b/Content.Shared/Cuffs/SharedCuffableSystem.cs index 7dd1ec9065..e2f4eafad9 100644 --- a/Content.Shared/Cuffs/SharedCuffableSystem.cs +++ b/Content.Shared/Cuffs/SharedCuffableSystem.cs @@ -141,7 +141,8 @@ namespace Content.Shared.Cuffs private void OnCuffsRemovedFromContainer(EntityUid uid, CuffableComponent component, EntRemovedFromContainerMessage args) { - if (args.Container.ID != component.Container.ID) + // ReSharper disable once ConditionalAccessQualifierIsNonNullableAccordingToAPIContract + if (args.Container.ID != component.Container?.ID) return; _handVirtualItem.DeleteInHandsMatching(uid, args.Entity); diff --git a/Content.Shared/Decals/PlaceDecalActionEvent.cs b/Content.Shared/Decals/PlaceDecalActionEvent.cs new file mode 100644 index 0000000000..3991cd36c9 --- /dev/null +++ b/Content.Shared/Decals/PlaceDecalActionEvent.cs @@ -0,0 +1,25 @@ +using Content.Shared.Actions; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + +namespace Content.Shared.Decals; + +public sealed partial class PlaceDecalActionEvent : WorldTargetActionEvent +{ + [DataField("decalId", customTypeSerializer:typeof(PrototypeIdSerializer), required:true)] + public string DecalId = string.Empty; + + [DataField("color")] + public Color Color; + + [DataField("rotation")] + public double Rotation; + + [DataField("snap")] + public bool Snap; + + [DataField("zIndex")] + public int ZIndex; + + [DataField("cleanable")] + public bool Cleanable; +} diff --git a/Content.Shared/Devour/Components/DevourerComponent.cs b/Content.Shared/Devour/Components/DevourerComponent.cs index ccba438a17..fbeec28ca5 100644 --- a/Content.Shared/Devour/Components/DevourerComponent.cs +++ b/Content.Shared/Devour/Components/DevourerComponent.cs @@ -1,21 +1,22 @@ -using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Chemistry.Reagent; -using Content.Shared.Devour; using Content.Shared.Whitelist; using Robust.Shared.Audio; using Robust.Shared.Containers; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Devour.Components; +namespace Content.Shared.Devour.Components; [RegisterComponent, NetworkedComponent] [Access(typeof(SharedDevourSystem))] public sealed partial class DevourerComponent : Component { - [DataField("devourAction")] - public EntityTargetAction? DevourAction; + [DataField("devourAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? DevourAction = "ActionDevour"; + + [DataField("devourActionEntity")] + public EntityUid? DevourActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("soundDevour")] public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Effects/demon_consume.ogg") diff --git a/Content.Shared/Devour/SharedDevourSystem.cs b/Content.Shared/Devour/SharedDevourSystem.cs index 4ced634975..5ac052d3a4 100644 --- a/Content.Shared/Devour/SharedDevourSystem.cs +++ b/Content.Shared/Devour/SharedDevourSystem.cs @@ -1,5 +1,5 @@ -using Content.Server.Devour.Components; using Content.Shared.Actions; +using Content.Shared.Devour.Components; using Content.Shared.DoAfter; using Content.Shared.Mobs; using Content.Shared.Mobs.Components; @@ -21,18 +21,17 @@ public abstract class SharedDevourSystem : EntitySystem { base.Initialize(); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnDevourAction); } - protected void OnStartup(EntityUid uid, DevourerComponent component, ComponentStartup args) + protected void OnMapInit(EntityUid uid, DevourerComponent component, MapInitEvent args) { //Devourer doesn't actually chew, since he sends targets right into his stomach. //I did it mom, I added ERP content into upstream. Legally! component.Stomach = _containerSystem.EnsureContainer(uid, "stomach"); - if (component.DevourAction != null) - _actionsSystem.AddAction(uid, component.DevourAction, null); + _actionsSystem.AddAction(uid, ref component.DevourActionEntity, component.DevourAction); } /// diff --git a/Content.Shared/Dragon/DragonEvents.cs b/Content.Shared/Dragon/DragonEvents.cs new file mode 100644 index 0000000000..e3db9c32da --- /dev/null +++ b/Content.Shared/Dragon/DragonEvents.cs @@ -0,0 +1,11 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Dragon; + +public sealed partial class DragonDevourActionEvent : EntityTargetActionEvent +{ +} + +public sealed partial class DragonSpawnRiftActionEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Ghost/GhostComponent.cs b/Content.Shared/Ghost/GhostComponent.cs index b45bdb2cf3..8aea2c0833 100644 --- a/Content.Shared/Ghost/GhostComponent.cs +++ b/Content.Shared/Ghost/GhostComponent.cs @@ -1,9 +1,8 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; -using Robust.Shared.Serialization; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; -using Robust.Shared.Utility; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Ghost; @@ -15,35 +14,23 @@ public sealed partial class GhostComponent : Component [ViewVariables] public bool IsAttached; - public InstantAction ToggleLightingAction = new() - { - Icon = new SpriteSpecifier.Texture(new ("Interface/VerbIcons/light.svg.192dpi.png")), - DisplayName = "ghost-gui-toggle-lighting-manager-name", - Description = "ghost-gui-toggle-lighting-manager-desc", - ClientExclusive = true, - CheckCanInteract = false, - Event = new ToggleLightingActionEvent(), - }; + [DataField("toggleLightingAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleLightingAction = "ActionToggleLighting"; - public InstantAction ToggleFoVAction = new() - { - Icon = new SpriteSpecifier.Texture(new ("Interface/VerbIcons/vv.svg.192dpi.png")), - DisplayName = "ghost-gui-toggle-fov-name", - Description = "ghost-gui-toggle-fov-desc", - ClientExclusive = true, - CheckCanInteract = false, - Event = new ToggleFoVActionEvent(), - }; + [DataField("toggleLightingActionEntity")] + public EntityUid? ToggleLightingActionEntity; - public InstantAction ToggleGhostsAction = new() - { - Icon = new SpriteSpecifier.Rsi(new ("Mobs/Ghosts/ghost_human.rsi"), "icon"), - DisplayName = "ghost-gui-toggle-ghost-visibility-name", - Description = "ghost-gui-toggle-ghost-visibility-desc", - ClientExclusive = true, - CheckCanInteract = false, - Event = new ToggleGhostsActionEvent(), - }; + [DataField("toggleFovAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleFoVAction = "ActionToggleFov"; + + [DataField("toggleFovActionEntity")] + public EntityUid? ToggleFoVActionEntity; + + [DataField("toggleGhostsAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleGhostsAction = "ActionToggleGhosts"; + + [DataField("toggleGhostsActionEntity")] + public EntityUid? ToggleGhostsActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("timeOfDeath", customTypeSerializer:typeof(TimeOffsetSerializer))] public TimeSpan TimeOfDeath = TimeSpan.Zero; @@ -54,16 +41,10 @@ public sealed partial class GhostComponent : Component [DataField("booMaxTargets")] public int BooMaxTargets = 3; - [DataField("action")] - public InstantAction Action = new() - { - UseDelay = TimeSpan.FromSeconds(120), - Icon = new SpriteSpecifier.Texture(new ("Interface/Actions/scream.png")), - DisplayName = "action-name-boo", - Description = "action-description-boo", - CheckCanInteract = false, - Event = new BooActionEvent(), - }; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string Action = "ActionGhostBoo"; + + [DataField("actionEntity")] public EntityUid? ActionEntity; // TODO: instead of this funny stuff just give it access and update in system dirtying when needed [ViewVariables(VVAccess.ReadWrite)] diff --git a/Content.Shared/Guardian/GuardianToggleActionEvent.cs b/Content.Shared/Guardian/GuardianToggleActionEvent.cs new file mode 100644 index 0000000000..15328984fe --- /dev/null +++ b/Content.Shared/Guardian/GuardianToggleActionEvent.cs @@ -0,0 +1,7 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Guardian; + +public sealed partial class GuardianToggleActionEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Implants/SharedSubdermalImplantSystem.cs b/Content.Shared/Implants/SharedSubdermalImplantSystem.cs index 2a41273512..2f98093525 100644 --- a/Content.Shared/Implants/SharedSubdermalImplantSystem.cs +++ b/Content.Shared/Implants/SharedSubdermalImplantSystem.cs @@ -1,6 +1,5 @@ using System.Linq; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Implants.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Events; @@ -36,9 +35,9 @@ public abstract class SharedSubdermalImplantSystem : EntitySystem if (component.ImplantedEntity == null) return; - if (component.ImplantAction != null) + if (!string.IsNullOrWhiteSpace(component.ImplantAction)) { - var action = new InstantAction(_prototypeManager.Index(component.ImplantAction)); + var action = Spawn(component.ImplantAction); _actionsSystem.AddAction(component.ImplantedEntity.Value, action, uid); } diff --git a/Content.Shared/Light/Components/HandheldLightComponent.cs b/Content.Shared/Light/Components/HandheldLightComponent.cs index 8edf558566..9e3cad7552 100644 --- a/Content.Shared/Light/Components/HandheldLightComponent.cs +++ b/Content.Shared/Light/Components/HandheldLightComponent.cs @@ -1,6 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -35,8 +35,8 @@ public sealed partial class HandheldLightComponent : Component [DataField("addPrefix")] public bool AddPrefix = false; - [DataField("toggleActionId", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ToggleActionId = "ToggleLight"; + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ToggleAction = "ActionToggleLight"; /// /// Whether or not the light can be toggled via standard interactions @@ -45,8 +45,8 @@ public sealed partial class HandheldLightComponent : Component [DataField("toggleOnInteract")] public bool ToggleOnInteract = true; - [DataField("toggleAction")] - public InstantAction? ToggleAction; + [DataField("toggleActionEntity")] + public EntityUid? ToggleActionEntity; public const int StatusLevels = 6; diff --git a/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs b/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs index 4011f6937b..e2146abe2f 100644 --- a/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs +++ b/Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs @@ -1,6 +1,7 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.Decals; using Robust.Shared.Audio; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Light.Components; @@ -16,8 +17,10 @@ public sealed partial class UnpoweredFlashlightComponent : Component [ViewVariables] public bool LightOn = false; - [DataField("toggleAction", required: true)] - public InstantAction ToggleAction = new(); + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? ToggleAction = "ActionToggleLight"; + + [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity; /// /// ID that determines the list diff --git a/Content.Shared/Light/SharedHandheldLightSystem.cs b/Content.Shared/Light/SharedHandheldLightSystem.cs index 88fd07ba20..ad209c95f8 100644 --- a/Content.Shared/Light/SharedHandheldLightSystem.cs +++ b/Content.Shared/Light/SharedHandheldLightSystem.cs @@ -3,10 +3,7 @@ using Content.Shared.Clothing.EntitySystems; using Content.Shared.Item; using Content.Shared.Light.Components; using Content.Shared.Toggleable; -using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Player; -using Robust.Shared.Utility; namespace Content.Shared.Light; @@ -74,8 +71,8 @@ public abstract class SharedHandheldLightSystem : EntitySystem _clothingSys.SetEquippedPrefix(uid, prefix); } - if (component.ToggleAction != null) - _actionSystem.SetToggled(component.ToggleAction, component.Activated); + if (component.ToggleActionEntity != null) + _actionSystem.SetToggled(component.ToggleActionEntity, component.Activated); _appearance.SetData(uid, ToggleableLightVisuals.Enabled, component.Activated, appearance); } diff --git a/Content.Server/Magic/Events/ChangeComponentsSpellEvent.cs b/Content.Shared/Magic/Events/ChangeComponentSpellEvent.cs similarity index 90% rename from Content.Server/Magic/Events/ChangeComponentsSpellEvent.cs rename to Content.Shared/Magic/Events/ChangeComponentSpellEvent.cs index df8c25f801..61e75c8b1a 100644 --- a/Content.Server/Magic/Events/ChangeComponentsSpellEvent.cs +++ b/Content.Shared/Magic/Events/ChangeComponentSpellEvent.cs @@ -1,7 +1,7 @@ -using Content.Shared.Actions; +using Content.Shared.Actions; using Robust.Shared.Prototypes; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; /// /// Spell that uses the magic of ECS to add & remove components. Components are first removed, then added. diff --git a/Content.Server/Magic/Events/InstantSpawnSpellEvent.cs b/Content.Shared/Magic/Events/InstantSpawnSpellEvent.cs similarity index 64% rename from Content.Server/Magic/Events/InstantSpawnSpellEvent.cs rename to Content.Shared/Magic/Events/InstantSpawnSpellEvent.cs index f475c33648..ef8d689862 100644 --- a/Content.Server/Magic/Events/InstantSpawnSpellEvent.cs +++ b/Content.Shared/Magic/Events/InstantSpawnSpellEvent.cs @@ -2,7 +2,7 @@ using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class InstantSpawnSpellEvent : InstantActionEvent, ISpeakSpell { @@ -23,23 +23,3 @@ public sealed partial class InstantSpawnSpellEvent : InstantActionEvent, ISpeakS /// [DataField("posData")] public MagicSpawnData Pos = new TargetCasterPos(); } - -[ImplicitDataDefinitionForInheritors] -public abstract partial class MagicSpawnData -{ - -} - -/// -/// Spawns 1 at the caster's feet. -/// -public sealed partial class TargetCasterPos : MagicSpawnData {} - -/// -/// Targets the 3 tiles in front of the caster. -/// -public sealed partial class TargetInFront : MagicSpawnData -{ - [DataField("width")] - public int Width = 3; -} diff --git a/Content.Server/Magic/Events/KnockSpellEvent.cs b/Content.Shared/Magic/Events/KnockSpellEvent.cs similarity index 94% rename from Content.Server/Magic/Events/KnockSpellEvent.cs rename to Content.Shared/Magic/Events/KnockSpellEvent.cs index 3e8897f129..a3b0be5575 100644 --- a/Content.Server/Magic/Events/KnockSpellEvent.cs +++ b/Content.Shared/Magic/Events/KnockSpellEvent.cs @@ -1,7 +1,7 @@ using Content.Shared.Actions; using Robust.Shared.Audio; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class KnockSpellEvent : InstantActionEvent, ISpeakSpell { diff --git a/Content.Server/Magic/Events/ProjectileSpellEvent.cs b/Content.Shared/Magic/Events/ProjectileSpellEvent.cs similarity index 88% rename from Content.Server/Magic/Events/ProjectileSpellEvent.cs rename to Content.Shared/Magic/Events/ProjectileSpellEvent.cs index 95a27afe5d..4496625769 100644 --- a/Content.Server/Magic/Events/ProjectileSpellEvent.cs +++ b/Content.Shared/Magic/Events/ProjectileSpellEvent.cs @@ -1,9 +1,8 @@ -using Content.Shared.Actions; -using Robust.Shared.Audio; +using Content.Shared.Actions; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class ProjectileSpellEvent : WorldTargetActionEvent, ISpeakSpell { diff --git a/Content.Server/Magic/Events/SmiteSpellEvent.cs b/Content.Shared/Magic/Events/SmiteSpellEvent.cs similarity index 91% rename from Content.Server/Magic/Events/SmiteSpellEvent.cs rename to Content.Shared/Magic/Events/SmiteSpellEvent.cs index 0311546c4b..08ec63c05e 100644 --- a/Content.Server/Magic/Events/SmiteSpellEvent.cs +++ b/Content.Shared/Magic/Events/SmiteSpellEvent.cs @@ -1,6 +1,6 @@ using Content.Shared.Actions; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class SmiteSpellEvent : EntityTargetActionEvent, ISpeakSpell { diff --git a/Content.Server/Magic/Events/TeleportSpellEvent.cs b/Content.Shared/Magic/Events/TeleportSpellEvent.cs similarity index 92% rename from Content.Server/Magic/Events/TeleportSpellEvent.cs rename to Content.Shared/Magic/Events/TeleportSpellEvent.cs index 50273e742d..b24f6ec72f 100644 --- a/Content.Server/Magic/Events/TeleportSpellEvent.cs +++ b/Content.Shared/Magic/Events/TeleportSpellEvent.cs @@ -1,7 +1,7 @@ using Content.Shared.Actions; using Robust.Shared.Audio; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class TeleportSpellEvent : WorldTargetActionEvent, ISpeakSpell { diff --git a/Content.Server/Magic/Events/WorldSpawnSpellEvent.cs b/Content.Shared/Magic/Events/WorldSpawnSpellEvent.cs similarity index 95% rename from Content.Server/Magic/Events/WorldSpawnSpellEvent.cs rename to Content.Shared/Magic/Events/WorldSpawnSpellEvent.cs index 4130eeaa77..4355cab842 100644 --- a/Content.Server/Magic/Events/WorldSpawnSpellEvent.cs +++ b/Content.Shared/Magic/Events/WorldSpawnSpellEvent.cs @@ -2,7 +2,7 @@ using Content.Shared.Actions; using Content.Shared.Storage; -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic.Events; public sealed partial class WorldSpawnSpellEvent : WorldTargetActionEvent, ISpeakSpell { @@ -30,4 +30,3 @@ public sealed partial class WorldSpawnSpellEvent : WorldTargetActionEvent, ISpea [DataField("speech")] public string? Speech { get; private set; } } - diff --git a/Content.Server/Magic/Events/ISpeakSpell.cs b/Content.Shared/Magic/ISpeakSpell.cs similarity index 82% rename from Content.Server/Magic/Events/ISpeakSpell.cs rename to Content.Shared/Magic/ISpeakSpell.cs index d7c7dbe250..954b99417f 100644 --- a/Content.Server/Magic/Events/ISpeakSpell.cs +++ b/Content.Shared/Magic/ISpeakSpell.cs @@ -1,4 +1,4 @@ -namespace Content.Server.Magic.Events; +namespace Content.Shared.Magic; public interface ISpeakSpell // The speak n spell interface { @@ -7,4 +7,3 @@ public interface ISpeakSpell // The speak n spell interface /// public string? Speech { get; } } - diff --git a/Content.Shared/Magic/MagicSpawnData.cs b/Content.Shared/Magic/MagicSpawnData.cs new file mode 100644 index 0000000000..cd96d4ad76 --- /dev/null +++ b/Content.Shared/Magic/MagicSpawnData.cs @@ -0,0 +1,20 @@ +namespace Content.Shared.Magic; + +[ImplicitDataDefinitionForInheritors] +public abstract partial class MagicSpawnData +{ + +} + +/// +/// Spawns 1 at the caster's feet. +/// +public sealed partial class TargetCasterPos : MagicSpawnData {} + +/// +/// Targets the 3 tiles in front of the caster. +/// +public sealed partial class TargetInFront : MagicSpawnData +{ + [DataField("width")] public int Width = 3; +} diff --git a/Content.Shared/Mapping/StartPlacementActionEvent.cs b/Content.Shared/Mapping/StartPlacementActionEvent.cs new file mode 100644 index 0000000000..9e5e267898 --- /dev/null +++ b/Content.Shared/Mapping/StartPlacementActionEvent.cs @@ -0,0 +1,18 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Mapping; + +public sealed partial class StartPlacementActionEvent : InstantActionEvent +{ + [DataField("entityType")] + public string? EntityType; + + [DataField("tileId")] + public string? TileId; + + [DataField("placementOption")] + public string? PlacementOption; + + [DataField("eraser")] + public bool Eraser; +} diff --git a/Content.Shared/Mech/Components/MechComponent.cs b/Content.Shared/Mech/Components/MechComponent.cs index aa437786c0..54cb1ea06e 100644 --- a/Content.Shared/Mech/Components/MechComponent.cs +++ b/Content.Shared/Mech/Components/MechComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Content.Shared.FixedPoint; using Content.Shared.Whitelist; using Robust.Shared.Containers; @@ -142,12 +141,12 @@ public sealed partial class MechComponent : Component public List StartingEquipment = new(); #region Action Prototypes - [DataField("mechCycleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string MechCycleAction = "MechCycleEquipment"; - [DataField("mechUiAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string MechUiAction = "MechOpenUI"; - [DataField("mechEjectAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string MechEjectAction = "MechEject"; + [DataField("mechCycleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string MechCycleAction = "ActionMechCycleEquipment"; + [DataField("mechUiAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string MechUiAction = "ActionMechOpenUI"; + [DataField("mechEjectAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string MechEjectAction = "ActionMechEject"; #endregion #region Visualizer States diff --git a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs index 4c5326c523..76c3be24bb 100644 --- a/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs +++ b/Content.Shared/Mech/EntitySystems/SharedMechSystem.cs @@ -3,11 +3,9 @@ using Content.Shared.Access.Components; using Content.Shared.Access.Systems; using Content.Shared.ActionBlocker; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Destructible; using Content.Shared.DoAfter; using Content.Shared.FixedPoint; -using Content.Shared.Hands.Components; using Content.Shared.Interaction; using Content.Shared.Interaction.Components; using Content.Shared.Interaction.Events; @@ -176,14 +174,12 @@ public abstract class SharedMechSystem : EntitySystem _mover.SetRelay(pilot, mech); _interaction.SetRelay(pilot, mech, irelay); rider.Mech = mech; - Dirty(rider); + Dirty(pilot, rider); - _actions.AddAction(pilot, - new InstantAction(_prototype.Index(component.MechCycleAction)), mech); - _actions.AddAction(pilot, new InstantAction(_prototype.Index(component.MechUiAction)), + _actions.AddAction(pilot, Spawn(component.MechCycleAction), mech); + _actions.AddAction(pilot, Spawn(component.MechUiAction), mech); - _actions.AddAction(pilot, - new InstantAction(_prototype.Index(component.MechEjectAction)), mech); + _actions.AddAction(pilot, Spawn(component.MechEjectAction), mech); } private void RemoveUser(EntityUid mech, EntityUid pilot) diff --git a/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs b/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs new file mode 100644 index 0000000000..11ac8a2684 --- /dev/null +++ b/Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs @@ -0,0 +1,7 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Medical.Stethoscope; + +public sealed partial class StethoscopeActionEvent : EntityTargetActionEvent +{ +} diff --git a/Content.Shared/Mobs/Components/MobStateActionsComponent.cs b/Content.Shared/Mobs/Components/MobStateActionsComponent.cs index 8faea0e248..8c72ee618d 100644 --- a/Content.Shared/Mobs/Components/MobStateActionsComponent.cs +++ b/Content.Shared/Mobs/Components/MobStateActionsComponent.cs @@ -18,9 +18,9 @@ public sealed partial class MobStateActionsComponent : Component /// /// actions: /// Critical: - /// - CritSuccumb + /// - ActionCritSuccumb /// Alive: - /// - AnimalLayEgg + /// - ActionAnimalLayEgg /// [DataField("actions")] public Dictionary> Actions = new(); diff --git a/Content.Shared/Mobs/CritMobActions.cs b/Content.Shared/Mobs/CritMobActions.cs new file mode 100644 index 0000000000..763915e559 --- /dev/null +++ b/Content.Shared/Mobs/CritMobActions.cs @@ -0,0 +1,24 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Mobs; + +/// +/// Only applies to mobs in crit capable of ghosting/succumbing +/// +public sealed partial class CritSuccumbEvent : InstantActionEvent +{ +} + +/// +/// Only applies/has functionality to mobs in crit that have +/// +public sealed partial class CritFakeDeathEvent : InstantActionEvent +{ +} + +/// +/// Only applies to mobs capable of speaking, as a last resort in crit +/// +public sealed partial class CritLastWordsEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs b/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs index b25babfe06..acb1483b52 100644 --- a/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs +++ b/Content.Shared/Mobs/Systems/MobStateActionsSystem.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Content.Shared.Mobs.Components; using Robust.Shared.Prototypes; @@ -31,10 +30,10 @@ public sealed class MobStateActionsSystem : EntitySystem foreach (var item in acts) { - if (!_proto.TryIndex(item, out var proto)) + if (!_proto.TryIndex(item, out var proto)) continue; - var instance = new InstantAction(proto); + var instance = Spawn(item); if (state == args.OldMobState) { // Don't remove actions that would be getting readded anyway diff --git a/Content.Shared/Movement/Components/JetpackComponent.cs b/Content.Shared/Movement/Components/JetpackComponent.cs index 8a3fb8931a..73a8267500 100644 --- a/Content.Shared/Movement/Components/JetpackComponent.cs +++ b/Content.Shared/Movement/Components/JetpackComponent.cs @@ -1,5 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Movement.Components; @@ -9,8 +10,10 @@ public sealed partial class JetpackComponent : Component [ViewVariables(VVAccess.ReadWrite), DataField("moleUsage")] public float MoleUsage = 0.012f; - [DataField("toggleAction", required: true)] - public InstantAction ToggleAction = new(); + [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? ToggleAction = "ActionToggleJetpack"; + + [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity; [ViewVariables(VVAccess.ReadWrite), DataField("acceleration")] public float Acceleration = 1f; diff --git a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs index 77bf97b25a..0047de376c 100644 --- a/Content.Shared/Movement/Systems/SharedJetpackSystem.cs +++ b/Content.Shared/Movement/Systems/SharedJetpackSystem.cs @@ -132,7 +132,7 @@ public abstract class SharedJetpackSystem : EntitySystem private void OnJetpackGetAction(EntityUid uid, JetpackComponent component, GetItemActionsEvent args) { - args.Actions.Add(component.ToggleAction); + args.AddAction(ref component.ToggleActionEntity, component.ToggleAction); } private bool IsEnabled(EntityUid uid) @@ -182,7 +182,7 @@ public abstract class SharedJetpackSystem : EntitySystem } Appearance.SetData(uid, JetpackVisuals.Enabled, enabled); - Dirty(component); + Dirty(uid, component); } public bool IsUserFlying(EntityUid uid) diff --git a/Content.Shared/PAI/PAIComponent.cs b/Content.Shared/PAI/PAIComponent.cs index ec0569865e..9574007e7f 100644 --- a/Content.Shared/PAI/PAIComponent.cs +++ b/Content.Shared/PAI/PAIComponent.cs @@ -1,5 +1,6 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.PAI { @@ -23,8 +24,12 @@ namespace Content.Shared.PAI [DataField("lastUSer"), ViewVariables(VVAccess.ReadWrite)] public EntityUid? LastUser; - [DataField("midiAction", required: true, serverOnly: true)] // server only, as it uses a server-BUI event !type - public InstantAction? MidiAction; + [DataField("midiActionId", serverOnly: true, + customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? MidiActionId = "ActionPAIPlayMidi"; + + [DataField("midiAction", serverOnly: true)] // server only, as it uses a server-BUI event !type + public EntityUid? MidiAction; } } diff --git a/Content.Shared/PAI/SharedPAISystem.cs b/Content.Shared/PAI/SharedPAISystem.cs index a5196cee1b..59db9dd54d 100644 --- a/Content.Shared/PAI/SharedPAISystem.cs +++ b/Content.Shared/PAI/SharedPAISystem.cs @@ -1,9 +1,4 @@ -using Content.Shared.ActionBlocker; using Content.Shared.Actions; -using Content.Shared.Hands; -using Content.Shared.Interaction.Events; -using Content.Shared.Item; -using Content.Shared.Movement.Events; namespace Content.Shared.PAI { @@ -24,20 +19,18 @@ namespace Content.Shared.PAI { base.Initialize(); - SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnMapInit); SubscribeLocalEvent(OnShutdown); } - private void OnStartup(EntityUid uid, PAIComponent component, ComponentStartup args) + private void OnMapInit(EntityUid uid, PAIComponent component, MapInitEvent args) { - if (component.MidiAction != null) - _actionsSystem.AddAction(uid, component.MidiAction, null); + _actionsSystem.AddAction(uid, ref component.MidiAction, component.MidiActionId); } private void OnShutdown(EntityUid uid, PAIComponent component, ComponentShutdown args) { - if (component.MidiAction != null) - _actionsSystem.RemoveAction(uid, component.MidiAction); + _actionsSystem.RemoveAction(uid, component.MidiAction); } } } diff --git a/Content.Shared/Polymorph/PolymorphActions.cs b/Content.Shared/Polymorph/PolymorphActions.cs new file mode 100644 index 0000000000..bae2c3e4dd --- /dev/null +++ b/Content.Shared/Polymorph/PolymorphActions.cs @@ -0,0 +1,17 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Polymorph; + +public sealed partial class PolymorphActionEvent : InstantActionEvent +{ + /// + /// The polymorph prototype containing all the information about + /// the specific polymorph. + /// + public PolymorphPrototype Prototype = default!; +} + +public sealed partial class RevertPolymorphActionEvent : InstantActionEvent +{ + +} diff --git a/Content.Shared/RatKing/RatKingActions.cs b/Content.Shared/RatKing/RatKingActions.cs new file mode 100644 index 0000000000..551b27a7a4 --- /dev/null +++ b/Content.Shared/RatKing/RatKingActions.cs @@ -0,0 +1,13 @@ +using Content.Shared.Actions; + +namespace Content.Shared.RatKing; + +public sealed partial class RatKingRaiseArmyActionEvent : InstantActionEvent +{ + +} + +public sealed partial class RatKingDomainActionEvent : InstantActionEvent +{ + +} diff --git a/Content.Shared/Sericulture/SericultureEvents.cs b/Content.Shared/Sericulture/SericultureEvents.cs index 203114a4b4..9a497d16f4 100644 --- a/Content.Shared/Sericulture/SericultureEvents.cs +++ b/Content.Shared/Sericulture/SericultureEvents.cs @@ -1,3 +1,4 @@ +using Content.Shared.Actions; using Content.Shared.DoAfter; using Robust.Shared.Serialization; @@ -5,3 +6,5 @@ namespace Content.Shared.Sericulture; [Serializable, NetSerializable] public sealed partial class SericultureDoAfterEvent : SimpleDoAfterEvent { } + +public sealed partial class SericultureActionEvent : InstantActionEvent { } diff --git a/Content.Shared/Silicons/Borgs/Components/SelectableBorgModuleComponent.cs b/Content.Shared/Silicons/Borgs/Components/SelectableBorgModuleComponent.cs index 5b1f9491b7..ee6dee3689 100644 --- a/Content.Shared/Silicons/Borgs/Components/SelectableBorgModuleComponent.cs +++ b/Content.Shared/Silicons/Borgs/Components/SelectableBorgModuleComponent.cs @@ -1,6 +1,7 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Silicons.Borgs.Components; @@ -10,18 +11,13 @@ namespace Content.Shared.Silicons.Borgs.Components; [RegisterComponent, NetworkedComponent, Access(typeof(SharedBorgSystem))] public sealed partial class SelectableBorgModuleComponent : Component { + [DataField("moduleSwapAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? ModuleSwapActionId = "ActionBorgSwapModule"; + /// /// The sidebar action for swapping to this module. /// - [DataField("moduleSwapAction")] - public InstantAction ModuleSwapAction = new() - { - DisplayName = "action-name-swap-module", - Description = "action-desc-swap-module", - ItemIconStyle = ItemActionIconStyle.BigItem, - Event = new BorgModuleActionSelectedEvent(), - UseDelay = TimeSpan.FromSeconds(0.5f) - }; + [DataField("moduleSwapActionEntity")] public EntityUid? ModuleSwapActionEntity; } public sealed partial class BorgModuleActionSelectedEvent : InstantActionEvent diff --git a/Content.Shared/Silicons/Laws/Components/SiliconLawBoundComponent.cs b/Content.Shared/Silicons/Laws/Components/SiliconLawBoundComponent.cs index ab98a57feb..955705ae8b 100644 --- a/Content.Shared/Silicons/Laws/Components/SiliconLawBoundComponent.cs +++ b/Content.Shared/Silicons/Laws/Components/SiliconLawBoundComponent.cs @@ -1,5 +1,5 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -14,14 +14,14 @@ public sealed partial class SiliconLawBoundComponent : Component /// /// The sidebar action that toggles the laws screen. /// - [DataField("viewLawsAction", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string ViewLawsAction = "ViewLaws"; + [DataField("viewLawsAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string ViewLawsAction = "ActionViewLaws"; /// /// The action for toggling laws. Stored here so we can remove it later. /// - [DataField("providedAction")] - public InstantAction? ProvidedAction; + [DataField("viewLawsActionEntity")] + public EntityUid? ViewLawsActionEntity; /// /// The last entity that provided laws to this entity. diff --git a/Content.Shared/Speech/Components/MeleeSpeechComponent.cs b/Content.Shared/Speech/Components/MeleeSpeechComponent.cs index 8dfc2b971f..ca8c7a073b 100644 --- a/Content.Shared/Speech/Components/MeleeSpeechComponent.cs +++ b/Content.Shared/Speech/Components/MeleeSpeechComponent.cs @@ -1,7 +1,9 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; + namespace Content.Shared.Speech.Components; [RegisterComponent, NetworkedComponent] @@ -25,19 +27,13 @@ public sealed partial class MeleeSpeechComponent : Component [AutoNetworkedField] public int MaxBattlecryLength = 12; + [DataField("configureAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? ConfigureAction = "ActionConfigureMeleeSpeech"; + /// /// The action to open the battlecry UI /// - [DataField("configureAction")] - public InstantAction ConfigureAction = new() - { - UseDelay = TimeSpan.FromSeconds(1), - ItemIconStyle = ItemActionIconStyle.BigItem, - DisplayName = "melee-speech-config", - Description = "melee-speech-config-desc", - Priority = -20, - Event = new MeleeSpeechConfigureActionEvent(), - }; + [DataField("configureActionEntity")] public EntityUid? ConfigureActionEntity; } /// diff --git a/Content.Shared/Speech/ScreamActionEvent.cs b/Content.Shared/Speech/ScreamActionEvent.cs new file mode 100644 index 0000000000..756f65a35d --- /dev/null +++ b/Content.Shared/Speech/ScreamActionEvent.cs @@ -0,0 +1,7 @@ +using Content.Shared.Actions; + +namespace Content.Shared.Speech; + +public sealed partial class ScreamActionEvent : InstantActionEvent +{ +} diff --git a/Content.Shared/Spider/SharedSpiderSystem.cs b/Content.Shared/Spider/SharedSpiderSystem.cs index b64f980c34..7871e55e57 100644 --- a/Content.Shared/Spider/SharedSpiderSystem.cs +++ b/Content.Shared/Spider/SharedSpiderSystem.cs @@ -1,8 +1,4 @@ -using System.Linq; -using Content.Shared.Spider; using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; -using Robust.Shared.Prototypes; using Robust.Shared.Random; namespace Content.Shared.Spider; @@ -10,7 +6,6 @@ namespace Content.Shared.Spider; public abstract class SharedSpiderSystem : EntitySystem { [Dependency] private readonly SharedActionsSystem _action = default!; - [Dependency] private readonly IPrototypeManager _proto = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!; @@ -18,14 +13,13 @@ public abstract class SharedSpiderSystem : EntitySystem { base.Initialize(); + SubscribeLocalEvent(OnSpiderMapInit); SubscribeLocalEvent(OnWebStartup); - SubscribeLocalEvent(OnSpiderStartup); } - private void OnSpiderStartup(EntityUid uid, SpiderComponent component, ComponentStartup args) + private void OnSpiderMapInit(EntityUid uid, SpiderComponent component, MapInitEvent args) { - var netAction = new InstantAction(_proto.Index(component.WebActionName)); - _action.AddAction(uid, netAction, null); + _action.AddAction(uid, Spawn(component.WebAction), null); } private void OnWebStartup(EntityUid uid, SpiderWebObjectComponent component, ComponentStartup args) diff --git a/Content.Shared/Spider/SpiderComponent.cs b/Content.Shared/Spider/SpiderComponent.cs index 90f19f97a6..8d1a4772e2 100644 --- a/Content.Shared/Spider/SpiderComponent.cs +++ b/Content.Shared/Spider/SpiderComponent.cs @@ -1,5 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; @@ -15,8 +14,8 @@ public sealed partial class SpiderComponent : Component public string WebPrototype = "SpiderWeb"; [ViewVariables(VVAccess.ReadWrite)] - [DataField("webActionName", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string WebActionName = "SpiderWebAction"; + [DataField("webAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string WebAction = "ActionSpiderWeb"; } public sealed partial class SpiderWebActionEvent : InstantActionEvent { } diff --git a/Content.Shared/Store/ListingPrototype.cs b/Content.Shared/Store/ListingPrototype.cs index 7f678f6c49..e695c30e5c 100644 --- a/Content.Shared/Store/ListingPrototype.cs +++ b/Content.Shared/Store/ListingPrototype.cs @@ -1,12 +1,11 @@ +using System.Linq; +using Content.Shared.FixedPoint; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Dictionary; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List; using Robust.Shared.Utility; -using Content.Shared.Actions.ActionTypes; -using Content.Shared.FixedPoint; -using System.Linq; namespace Content.Shared.Store; @@ -71,7 +70,7 @@ public partial class ListingData : IEquatable, ICloneable /// /// The action that is given when the listing is purchased. /// - [DataField("productAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + [DataField("productAction", customTypeSerializer: typeof(PrototypeIdSerializer))] public string? ProductAction; /// diff --git a/Content.Server/UserInterface/OpenUiActionEvent.cs b/Content.Shared/UserInterface/OpenUiActionEvent.cs similarity index 89% rename from Content.Server/UserInterface/OpenUiActionEvent.cs rename to Content.Shared/UserInterface/OpenUiActionEvent.cs index 4f89cb35d9..3053861ea1 100644 --- a/Content.Server/UserInterface/OpenUiActionEvent.cs +++ b/Content.Shared/UserInterface/OpenUiActionEvent.cs @@ -1,8 +1,8 @@ -using Content.Shared.Actions; +using Content.Shared.Actions; using Robust.Shared.Reflection; using Robust.Shared.Serialization; -namespace Content.Server.UserInterface; +namespace Content.Shared.UserInterface; public sealed partial class OpenUiActionEvent : InstantActionEvent, ISerializationHooks { diff --git a/Content.Shared/UserInterface/ToggleIntrinsicUIEvent.cs b/Content.Shared/UserInterface/ToggleIntrinsicUIEvent.cs new file mode 100644 index 0000000000..5050aca9d4 --- /dev/null +++ b/Content.Shared/UserInterface/ToggleIntrinsicUIEvent.cs @@ -0,0 +1,12 @@ +using Content.Shared.Actions; +using JetBrains.Annotations; +using Robust.Shared.Serialization.TypeSerializers.Implementations; + +namespace Content.Shared.UserInterface; + +[UsedImplicitly] +public sealed partial class ToggleIntrinsicUIEvent : InstantActionEvent +{ + [DataField("key", customTypeSerializer: typeof(EnumSerializer), required: true)] + public Enum? Key { get; set; } +} diff --git a/Content.Shared/Vehicle/Components/VehicleComponent.cs b/Content.Shared/Vehicle/Components/VehicleComponent.cs index 3868b8977f..2874a0d2d1 100644 --- a/Content.Shared/Vehicle/Components/VehicleComponent.cs +++ b/Content.Shared/Vehicle/Components/VehicleComponent.cs @@ -1,8 +1,8 @@ using System.Numerics; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; -using Robust.Shared.Utility; +using Robust.Shared.Prototypes; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.Vehicle.Components; @@ -49,19 +49,15 @@ public sealed partial class VehicleComponent : Component /// Use ambient sound component for the idle sound. + [DataField("hornAction", customTypeSerializer: typeof(PrototypeIdSerializer))] + public string? HornAction; + /// /// The action for the horn (if any) /// - [DataField("hornAction")] + [DataField("hornActionEntity")] [ViewVariables(VVAccess.ReadWrite)] - public InstantAction HornAction = new() - { - UseDelay = TimeSpan.FromSeconds(3.4), - Icon = new SpriteSpecifier.Texture(new("Objects/Fun/bikehorn.rsi/icon.png")), - DisplayName = "action-name-honk", - Description = "action-desc-honk", - Event = new HonkActionEvent(), - }; + public EntityUid? HornActionEntity; /// /// Whether the vehicle has a key currently inside it or not. diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.cs b/Content.Shared/Vehicle/SharedVehicleSystem.cs index b18e66a1ee..9ba22d644a 100644 --- a/Content.Shared/Vehicle/SharedVehicleSystem.cs +++ b/Content.Shared/Vehicle/SharedVehicleSystem.cs @@ -1,22 +1,22 @@ using System.Numerics; using Content.Shared.Access.Components; using Content.Shared.Access.Systems; -using Content.Shared.Vehicle.Components; using Content.Shared.Actions; -using Content.Shared.Buckle.Components; -using Content.Shared.Item; -using Content.Shared.Movement.Components; -using Content.Shared.Movement.Systems; -using Robust.Shared.Serialization; -using Robust.Shared.Containers; -using Content.Shared.Tag; using Content.Shared.Audio; using Content.Shared.Buckle; +using Content.Shared.Buckle.Components; using Content.Shared.Hands; +using Content.Shared.Item; using Content.Shared.Light.Components; +using Content.Shared.Movement.Components; +using Content.Shared.Movement.Systems; using Content.Shared.Popups; +using Content.Shared.Tag; +using Content.Shared.Vehicle.Components; +using Robust.Shared.Containers; using Robust.Shared.Network; using Robust.Shared.Physics.Systems; +using Robust.Shared.Serialization; namespace Content.Shared.Vehicle; @@ -134,12 +134,12 @@ public abstract partial class SharedVehicleSystem : EntitySystem if (TryComp(args.BuckledEntity, out var actions) && TryComp(uid, out var flashlight)) { - _actionsSystem.AddAction(args.BuckledEntity, flashlight.ToggleAction, uid, actions); + _actionsSystem.AddAction(args.BuckledEntity, ref flashlight.ToggleActionEntity, flashlight.ToggleAction, uid, actions); } if (component.HornSound != null) { - _actionsSystem.AddAction(args.BuckledEntity, component.HornAction, uid, actions); + _actionsSystem.AddAction(args.BuckledEntity, ref component.HornActionEntity, component.HornAction, uid, actions); } _joints.ClearJoints(args.BuckledEntity); diff --git a/Content.Shared/VendingMachines/VendingMachineComponent.cs b/Content.Shared/VendingMachines/VendingMachineComponent.cs index 94ca115ccf..7d474feca9 100644 --- a/Content.Shared/VendingMachines/VendingMachineComponent.cs +++ b/Content.Shared/VendingMachines/VendingMachineComponent.cs @@ -1,14 +1,14 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; using Robust.Shared.Serialization; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype; namespace Content.Shared.VendingMachines { - [RegisterComponent, NetworkedComponent] + [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] public sealed partial class VendingMachineComponent : Component { /// @@ -105,8 +105,13 @@ namespace Content.Shared.VendingMachines /// /// The action available to the player controlling the vending machine /// - [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] - public string? Action = "VendingThrow"; + [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer))] + [AutoNetworkedField] + public string? Action = "ActionVendingThrow"; + + [DataField("actionEntity")] + [AutoNetworkedField] + public EntityUid? ActionEntity; public float NonLimitedEjectForce = 7.5f; diff --git a/Content.Shared/VoiceMask/VoiceMaskSetNameEvent.cs b/Content.Shared/VoiceMask/VoiceMaskSetNameEvent.cs new file mode 100644 index 0000000000..8e1adb194f --- /dev/null +++ b/Content.Shared/VoiceMask/VoiceMaskSetNameEvent.cs @@ -0,0 +1,8 @@ +using Content.Shared.Actions; + +namespace Content.Shared.VoiceMask; + +public sealed partial class VoiceMaskSetNameEvent : InstantActionEvent +{ +} + diff --git a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs index 6577137ce7..fd61fd70e6 100644 --- a/Content.Shared/Weapons/Ranged/Components/GunComponent.cs +++ b/Content.Shared/Weapons/Ranged/Components/GunComponent.cs @@ -1,4 +1,3 @@ -using Content.Shared.Actions.ActionTypes; using Robust.Shared.Audio; using Robust.Shared.GameStates; using Robust.Shared.Map; @@ -133,9 +132,6 @@ public partial class GunComponent : Component [AutoNetworkedField] public SelectiveFire SelectedMode = SelectiveFire.SemiAuto; - [DataField("selectModeAction")] - public InstantAction? SelectModeAction; - /// /// Whether or not information about /// the gun will be shown on examine. diff --git a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs index 1e4471562e..659bc054f6 100644 --- a/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs +++ b/Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs @@ -1,6 +1,4 @@ using Content.Shared.Actions; -using Content.Shared.Actions.ActionTypes; -using Content.Shared.CombatMode; using Content.Shared.Examine; using Content.Shared.Verbs; using Content.Shared.Weapons.Ranged.Components; diff --git a/Resources/Locale/en-US/magboot/actions.ftl b/Resources/Locale/en-US/magboot/actions.ftl index 7f8f55fefb..72ff07193a 100644 --- a/Resources/Locale/en-US/magboot/actions.ftl +++ b/Resources/Locale/en-US/magboot/actions.ftl @@ -1,2 +1,2 @@ action-name-magboot-toggle = Toggle Magboots -action-decription-magboot-toggle = Toggles the magboots on and off. \ No newline at end of file +action-description-magboot-toggle = Toggles the magboots on and off. diff --git a/Resources/Maps/Salvage/medium-pet-hospital.yml b/Resources/Maps/Salvage/medium-pet-hospital.yml index d7046ef434..1491985feb 100644 --- a/Resources/Maps/Salvage/medium-pet-hospital.yml +++ b/Resources/Maps/Salvage/medium-pet-hospital.yml @@ -1172,28 +1172,6 @@ entities: - pos: 3.5357494,-8.260544 parent: 289 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: MaterialDiamond entities: - uid: 128 diff --git a/Resources/Maps/Shuttles/emergency_lox.yml b/Resources/Maps/Shuttles/emergency_lox.yml index 00b3663c16..43abac3409 100644 --- a/Resources/Maps/Shuttles/emergency_lox.yml +++ b/Resources/Maps/Shuttles/emergency_lox.yml @@ -3434,28 +3434,6 @@ entities: - pos: -4.476436,15.938278 parent: 670 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: Lighter entities: - uid: 52 diff --git a/Resources/Maps/Test/dev_map.yml b/Resources/Maps/Test/dev_map.yml index 7ed089b716..52c1daefe1 100644 --- a/Resources/Maps/Test/dev_map.yml +++ b/Resources/Maps/Test/dev_map.yml @@ -1,7760 +1,7738 @@ -meta: - format: 6 - postmapinit: false -tilemap: - 0: Space - 85: FloorSteel - 97: FloorTechMaint - 101: FloorWhite - 113: Lattice - 114: Plating -entities: -- proto: "" - entities: - - uid: 179 - components: - - type: MetaData - - parent: 962 - type: Transform - - chunks: - -1,0: - ind: -1,0 - tiles: VQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - -1,-1: - ind: -1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAA - version: 6 - 0,1: - ind: 0,1 - tiles: cQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - 0,0: - ind: 0,0 - tiles: cgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA - version: 6 - 0,-1: - ind: 0,-1 - tiles: cgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAA - version: 6 - 1,-1: - ind: 1,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA - version: 6 - -2,0: - ind: -2,0 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - -2,-1: - ind: -2,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAA - version: 6 - 1,0: - ind: 1,0 - tiles: ZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - 2,-1: - ind: 2,-1 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - 1,1: - ind: 1,1 - tiles: VQAAAAAAVQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - -1,1: - ind: -1,1 - tiles: AAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - 0,-2: - ind: 0,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA - version: 6 - -1,-2: - ind: -1,-2 - tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA - version: 6 - type: MapGrid - - type: Broadphase - - bodyStatus: InAir - angularDamping: 0.05 - linearDamping: 0.05 - fixedRotation: False - bodyType: Dynamic - type: Physics - - fixtures: {} - type: Fixtures - - gravityShakeSound: !type:SoundPathSpecifier - path: /Audio/Effects/alert.ogg - type: Gravity - - chunkCollection: - version: 2 - nodes: [] - type: DecalGrid - - type: OccluderTree - - type: Shuttle - - type: RadiationGridResistance - - shakeTimes: 10 - type: GravityShake - - version: 2 - data: - tiles: - -4,0: - 0: 65535 - -4,1: - 0: 65535 - -3,0: - 0: 65535 - -3,1: - 0: 65535 - -2,0: - 0: 65535 - -2,1: - 0: 65535 - -2,2: - 0: 65535 - -1,0: - 0: 65535 - -1,1: - 0: 65535 - -1,2: - 0: 65535 - -4,-3: - 0: 61440 - -4,-2: - 0: 65535 - -4,-1: - 0: 65535 - -3,-3: - 0: 61440 - -3,-2: - 0: 65535 - -3,-1: - 0: 65535 - -2,-4: - 0: 65520 - -2,-3: - 0: 65535 - -2,-2: - 0: 65535 - -2,-1: - 0: 65535 - -1,-4: - 0: 65520 - 1: 15 - -1,-3: - 0: 65535 - -1,-2: - 0: 65535 - -1,-1: - 0: 65535 - 0,4: - 0: 61183 - 0,5: - 0: 61166 - 0,6: - 0: 14 - 1,4: - 0: 65535 - 1,5: - 0: 65535 - 1,6: - 0: 65535 - 1,7: - 0: 15 - 2,4: - 0: 65535 - 2,5: - 0: 65535 - 2,6: - 0: 4095 - 3,4: - 0: 65535 - 3,5: - 0: 65487 - 2: 48 - 3,6: - 0: 53247 - 3,7: - 0: 12 - 0,0: - 0: 65535 - 0,1: - 0: 65535 - 0,2: - 0: 65535 - 0,3: - 0: 65535 - 1,0: - 0: 65535 - 1,1: - 0: 65535 - 1,2: - 0: 65535 - 1,3: - 0: 65535 - 2,0: - 0: 4369 - 2,2: - 0: 65535 - 2,3: - 0: 65535 - 3,0: - 0: 65535 - 3,2: - 0: 65535 - 3,3: - 0: 65535 - 3,1: - 0: 61166 - 0,-4: - 0: 65520 - 1: 7 - 0,-3: - 0: 65535 - 0,-2: - 0: 65535 - 0,-1: - 0: 65535 - 1,-4: - 0: 30576 - 1,-3: - 0: 65399 - 1,-2: - 0: 63359 - 1,-1: - 0: 65535 - 2,-2: - 0: 4096 - 2,-1: - 0: 4369 - 3,-1: - 0: 65262 - 3,-2: - 0: 61152 - 4,-2: - 0: 65520 - 4,-1: - 0: 65535 - 5,-2: - 0: 65520 - 5,-1: - 0: 65535 - 6,-2: - 0: 65520 - 6,-1: - 0: 65535 - 7,-2: - 0: 65520 - 7,-1: - 0: 65535 - -5,0: - 0: 52428 - -5,-3: - 0: 32768 - -5,-2: - 0: 51336 - -5,-1: - 0: 52428 - 4,0: - 0: 65535 - 4,1: - 0: 65535 - 4,2: - 0: 65535 - 4,3: - 0: 65535 - 5,0: - 0: 65535 - 5,1: - 0: 65535 - 5,2: - 0: 65535 - 5,3: - 0: 65535 - 6,0: - 0: 65535 - 6,1: - 0: 65535 - 6,2: - 0: 65535 - 6,3: - 0: 63351 - 7,0: - 0: 30583 - 7,1: - 0: 4375 - 7,2: - 0: 4369 - 7,3: - 0: 4096 - 8,-2: - 0: 30576 - 8,-1: - 0: 30583 - 4,4: - 0: 30583 - 4,5: - 0: 30583 - 4,6: - 0: 30583 - 4,7: - 0: 7 - -4,2: - 0: 26367 - -1,3: - 0: 15 - 2,1: - 0: 4369 - -5,1: - 0: 52428 - -4,3: - 0: 26222 - -3,3: - 0: 15 - -2,3: - 0: 15 - -4,4: - 0: 238 - -3,4: - 0: 255 - -2,4: - 0: 255 - -1,4: - 0: 255 - -5,2: - 0: 204 - -3,2: - 0: 35071 - 0,-5: - 1: 28672 - -1,-5: - 1: 61440 - uniqueMixes: - - volume: 2500 - temperature: 293.15 - moles: - - 21.824879 - - 82.10312 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - volume: 2500 - temperature: 293.15 - moles: - - 24.8172 - - 93.35994 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - chunkSize: 4 - type: GridAtmosphere - - type: GasTileOverlay - - id: Dev - type: BecomesStation - - type: SpreaderGrid - - type: GridPathfinding - - uid: 962 - components: - - type: MetaData - - type: Transform - - type: Map - - type: PhysicsMap - - type: Broadphase - - type: OccluderTree - - type: LoadedMap - - type: GridTree - - type: MovedGrids -- proto: AdvancedCapacitorStockPart - entities: - - uid: 700 - components: - - pos: -3.8324947,8.786524 - parent: 179 - type: Transform -- proto: AirAlarm - entities: - - uid: 800 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-4.5 - parent: 179 - type: Transform - - devices: - - 801 - type: DeviceList -- proto: AirCanister - entities: - - uid: 458 - components: - - pos: 7.5,-0.5 - parent: 179 - type: Transform -- proto: Airlock - entities: - - uid: 48 - components: - - pos: 7.5,20.5 - parent: 179 - type: Transform - - uid: 119 - components: - - pos: 6.5,17.5 - parent: 179 - type: Transform - - uid: 170 - components: - - pos: 13.5,10.5 - parent: 179 - type: Transform - - uid: 378 - components: - - pos: -9.5,0.5 - parent: 179 - type: Transform -- proto: AirlockCargo - entities: - - uid: 87 - components: - - pos: 2.5,-4.5 - parent: 179 - type: Transform -- proto: AirlockEngineering - entities: - - uid: 257 - components: - - pos: -7.5,-6.5 - parent: 179 - type: Transform - - uid: 258 - components: - - pos: 3.5,-4.5 - parent: 179 - type: Transform - - uid: 530 - components: - - pos: -10.5,-6.5 - parent: 179 - type: Transform - - uid: 563 - components: - - pos: -13.5,0.5 - parent: 179 - type: Transform - - uid: 867 - components: - - pos: -12.5,0.5 - parent: 179 - type: Transform -- proto: AirlockExternal - entities: - - uid: 155 - components: - - pos: 26.5,13.5 - parent: 179 - type: Transform - - uid: 203 - components: - - pos: 0.5,-14.5 - parent: 179 - type: Transform - - uid: 255 - components: - - pos: 7.5,-8.5 - parent: 179 - type: Transform - - uid: 256 - components: - - pos: 5.5,-8.5 - parent: 179 - type: Transform - - uid: 318 - components: - - pos: 24.5,13.5 - parent: 179 - type: Transform -- proto: AirlockExternalGlass - entities: - - uid: 216 - components: - - pos: -1.5,-14.5 - parent: 179 - type: Transform -- proto: AirlockGlassShuttle - entities: - - uid: 146 - components: - - rot: -1.5707963267948966 rad - pos: -17.5,9.5 - parent: 179 - type: Transform - - uid: 204 - components: - - pos: -1.5,-16.5 - parent: 179 - type: Transform -- proto: AirlockMedicalGlass - entities: - - uid: 177 - components: - - pos: 26.5,4.5 - parent: 179 - type: Transform - - uid: 178 - components: - - pos: 20.5,3.5 - parent: 179 - type: Transform - - uid: 206 - components: - - pos: 16.5,3.5 - parent: 179 - type: Transform - - uid: 207 - components: - - pos: 15.5,3.5 - parent: 179 - type: Transform - - uid: 369 - components: - - pos: 26.5,-3.5 - parent: 179 - type: Transform - - uid: 370 - components: - - pos: 28.5,-0.5 - parent: 179 - type: Transform -- proto: AirlockScience - entities: - - uid: 24 - components: - - pos: 14.5,24.5 - parent: 179 - type: Transform - - uid: 47 - components: - - pos: 16.5,18.5 - parent: 179 - type: Transform - - uid: 102 - components: - - pos: 16.5,15.5 - parent: 179 - type: Transform - - uid: 306 - components: - - pos: 12.5,15.5 - parent: 179 - type: Transform -- proto: AirlockScienceGlass - entities: - - uid: 26 - components: - - pos: 14.5,20.5 - parent: 179 - type: Transform -- proto: AirlockShuttle - entities: - - uid: 116 - components: - - pos: 0.5,-16.5 - parent: 179 - type: Transform -- proto: AirSensor - entities: - - uid: 801 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-3.5 - parent: 179 - type: Transform -- proto: AlwaysPoweredLightLED - entities: - - uid: 59 - components: - - pos: -14.5,-0.5 - parent: 179 - type: Transform - - uid: 330 - components: - - rot: -1.5707963267948966 rad - pos: -8.5,8.5 - parent: 179 - type: Transform - - uid: 398 - components: - - pos: 4.5,-5.5 - parent: 179 - type: Transform - - uid: 451 - components: - - rot: -1.5707963267948966 rad - pos: -8.5,9.5 - parent: 179 - type: Transform - - uid: 512 - components: - - rot: 3.141592653589793 rad - pos: -14.5,6.5 - parent: 179 - type: Transform - - uid: 662 - components: - - pos: 11.5,14.5 - parent: 179 - type: Transform - - uid: 664 - components: - - rot: 3.141592653589793 rad - pos: 22.5,12.5 - parent: 179 - type: Transform - - uid: 667 - components: - - rot: -1.5707963267948966 rad - pos: 8.5,10.5 - parent: 179 - type: Transform - - uid: 669 - components: - - rot: -1.5707963267948966 rad - pos: -17.5,4.5 - parent: 179 - type: Transform - - uid: 852 - components: - - rot: 1.5707963267948966 rad - pos: -6.5,0.5 - parent: 179 - type: Transform - - uid: 907 - components: - - pos: -4.5,-5.5 - parent: 179 - type: Transform - - uid: 910 - components: - - rot: 3.141592653589793 rad - pos: -2.5,-3.5 - parent: 179 - type: Transform - - uid: 913 - components: - - rot: 3.141592653589793 rad - pos: 5.5,-3.5 - parent: 179 - type: Transform - - uid: 914 - components: - - pos: 4.5,3.5 - parent: 179 - type: Transform - - uid: 915 - components: - - pos: 6.5,7.5 - parent: 179 - type: Transform - - uid: 916 - components: - - rot: -1.5707963267948966 rad - pos: 3.5,7.5 - parent: 179 - type: Transform - - uid: 917 - components: - - pos: -2.5,10.5 - parent: 179 - type: Transform - - uid: 918 - components: - - pos: 3.5,18.5 - parent: 179 - type: Transform - - uid: 921 - components: - - rot: 3.141592653589793 rad - pos: -13.5,1.5 - parent: 179 - type: Transform - - uid: 922 - components: - - rot: -1.5707963267948966 rad - pos: 0.5,16.5 - parent: 179 - type: Transform - - uid: 923 - components: - - rot: 3.141592653589793 rad - pos: -7.5,12.5 - parent: 179 - type: Transform - - uid: 924 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,6.5 - parent: 179 - type: Transform - - uid: 926 - components: - - rot: 1.5707963267948966 rad - pos: -13.5,17.5 - parent: 179 - type: Transform - - uid: 953 - components: - - pos: -14.5,16.5 - parent: 179 - type: Transform - - uid: 957 - components: - - rot: 3.141592653589793 rad - pos: 11.5,16.5 - parent: 179 - type: Transform -- proto: AlwaysPoweredWallLight - entities: - - uid: 1047 - components: - - rot: 3.141592653589793 rad - pos: -0.5,-13.5 - parent: 179 - type: Transform -- proto: AnomalyLocator - entities: - - uid: 1086 - components: - - pos: 17.237877,19.653782 - parent: 179 - type: Transform -- proto: AnomalyScanner - entities: - - uid: 1085 - components: - - pos: 17.539398,19.352007 - parent: 179 - type: Transform -- proto: APCBasic - entities: - - uid: 753 - components: - - pos: -2.5,11.5 - parent: 179 - type: Transform - - startingCharge: 500000000 - maxCharge: 500000000 - type: Battery - - supplyRampRate: 50000 - supplyRampTolerance: 100000 - maxSupply: 1000000 - maxChargeRate: 500000 - type: PowerNetworkBattery - - uid: 1015 - components: - - rot: 3.141592653589793 rad - pos: -5.5,-14.5 - parent: 179 - type: Transform -- proto: AtmosDeviceFanTiny - entities: - - uid: 992 - components: - - pos: -1.5,-16.5 - parent: 179 - type: Transform - - uid: 993 - components: - - pos: 0.5,-16.5 - parent: 179 - type: Transform -- proto: Autolathe - entities: - - uid: 1 - components: - - pos: 12.5,21.5 - parent: 179 - type: Transform - - uid: 94 - components: - - pos: -4.5,-5.5 - parent: 179 - type: Transform - - uid: 446 - components: - - pos: -6.5,5.5 - parent: 179 - type: Transform - - uid: 528 - components: - - pos: -12.5,-7.5 - parent: 179 - type: Transform - - uid: 531 - components: - - pos: -13.5,-7.5 - parent: 179 - type: Transform - - uid: 532 - components: - - pos: -14.5,-7.5 - parent: 179 - type: Transform -- proto: BaseUplinkRadioDebug - entities: - - uid: 732 - components: - - pos: 0.6038008,7.5209107 - parent: 179 - type: Transform -- proto: Basketball - entities: - - uid: 951 - components: - - pos: -9.702013,9.68404 - parent: 179 - type: Transform - - uid: 952 - components: - - pos: -10.879096,9.579802 - parent: 179 - type: Transform -- proto: Beaker - entities: - - uid: 174 - components: - - pos: 25.291822,10.667244 - parent: 179 - type: Transform - - uid: 175 - components: - - pos: 24.541822,10.635994 - parent: 179 - type: Transform - - uid: 176 - components: - - pos: 26.416822,10.651619 - parent: 179 - type: Transform - - uid: 324 - components: - - pos: 4.718221,9.39097 - parent: 179 - type: Transform - - uid: 735 - components: - - pos: 4.739054,9.807927 - parent: 179 - type: Transform - - uid: 920 - components: - - pos: -4.293744,10.966518 - parent: 179 - type: Transform - - uid: 950 - components: - - pos: -4.293744,10.966518 - parent: 179 - type: Transform -- proto: BikeHorn - entities: - - uid: 672 - components: - - pos: 1.1246341,7.500063 - parent: 179 - type: Transform -- proto: BlastDoor - entities: - - uid: 202 - components: - - pos: -2.5,-14.5 - parent: 179 - type: Transform - - links: - - 1013 - type: DeviceLinkSink - - uid: 697 - components: - - pos: 1.5,-14.5 - parent: 179 - type: Transform - - links: - - 1014 - type: DeviceLinkSink - - uid: 698 - components: - - pos: 1.5,-16.5 - parent: 179 - type: Transform - - links: - - 1014 - type: DeviceLinkSink - - uid: 984 - components: - - pos: -2.5,-16.5 - parent: 179 - type: Transform - - links: - - 1013 - type: DeviceLinkSink -- proto: BoozeDispenser - entities: - - uid: 752 - components: - - pos: 7.5,12.5 - parent: 179 - type: Transform -- proto: BoxBeaker - entities: - - uid: 280 - components: - - pos: 5.163024,9.63072 - parent: 179 - type: Transform -- proto: Brutepack - entities: - - uid: 150 - components: - - pos: 18.601385,5.512907 - parent: 179 - type: Transform - - uid: 151 - components: - - pos: 18.476385,4.841032 - parent: 179 - type: Transform -- proto: Bucket - entities: - - uid: 691 - components: - - pos: 7.1447573,15.900927 - parent: 179 - type: Transform -- proto: CableApcExtension - entities: - - uid: 15 - components: - - pos: 5.5,15.5 - parent: 179 - type: Transform - - uid: 23 - components: - - pos: 3.5,15.5 - parent: 179 - type: Transform - - uid: 58 - components: - - pos: 8.5,15.5 - parent: 179 - type: Transform - - uid: 90 - components: - - pos: 4.5,15.5 - parent: 179 - type: Transform - - uid: 281 - components: - - pos: -13.5,4.5 - parent: 179 - type: Transform - - uid: 389 - components: - - pos: 7.5,15.5 - parent: 179 - type: Transform - - uid: 453 - components: - - pos: 6.5,15.5 - parent: 179 - type: Transform - - uid: 736 - components: - - pos: -2.5,9.5 - parent: 179 - type: Transform - - uid: 760 - components: - - pos: -2.5,10.5 - parent: 179 - type: Transform - - uid: 761 - components: - - pos: -15.5,5.5 - parent: 179 - type: Transform - - uid: 763 - components: - - pos: -2.5,11.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 764 - components: - - pos: -1.5,11.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 765 - components: - - pos: -7.5,0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 766 - components: - - pos: -0.5,11.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 767 - components: - - pos: -3.5,10.5 - parent: 179 - type: Transform - - uid: 768 - components: - - pos: -4.5,10.5 - parent: 179 - type: Transform - - uid: 769 - components: - - pos: -5.5,10.5 - parent: 179 - type: Transform - - uid: 770 - components: - - pos: -6.5,10.5 - parent: 179 - type: Transform - - uid: 771 - components: - - pos: -2.5,8.5 - parent: 179 - type: Transform - - uid: 772 - components: - - pos: -2.5,7.5 - parent: 179 - type: Transform - - uid: 773 - components: - - pos: -2.5,6.5 - parent: 179 - type: Transform - - uid: 774 - components: - - pos: -2.5,5.5 - parent: 179 - type: Transform - - uid: 775 - components: - - pos: -3.5,5.5 - parent: 179 - type: Transform - - uid: 776 - components: - - pos: -4.5,5.5 - parent: 179 - type: Transform - - uid: 777 - components: - - pos: -5.5,5.5 - parent: 179 - type: Transform - - uid: 778 - components: - - pos: -6.5,5.5 - parent: 179 - type: Transform - - uid: 779 - components: - - pos: -6.5,4.5 - parent: 179 - type: Transform - - uid: 780 - components: - - pos: -7.5,4.5 - parent: 179 - type: Transform - - uid: 781 - components: - - pos: -8.5,4.5 - parent: 179 - type: Transform - - uid: 782 - components: - - pos: -9.5,4.5 - parent: 179 - type: Transform - - uid: 783 - components: - - pos: -10.5,4.5 - parent: 179 - type: Transform - - uid: 784 - components: - - pos: -11.5,4.5 - parent: 179 - type: Transform - - uid: 785 - components: - - pos: -12.5,4.5 - parent: 179 - type: Transform - - uid: 786 - components: - - pos: -12.5,3.5 - parent: 179 - type: Transform - - uid: 787 - components: - - pos: -12.5,2.5 - parent: 179 - type: Transform - - uid: 788 - components: - - pos: -12.5,1.5 - parent: 179 - type: Transform - - uid: 789 - components: - - pos: -12.5,0.5 - parent: 179 - type: Transform - - uid: 790 - components: - - pos: -12.5,-0.5 - parent: 179 - type: Transform - - uid: 791 - components: - - pos: -2.5,4.5 - parent: 179 - type: Transform - - uid: 792 - components: - - pos: -2.5,2.5 - parent: 179 - type: Transform - - uid: 793 - components: - - pos: -2.5,1.5 - parent: 179 - type: Transform - - uid: 794 - components: - - pos: -2.5,0.5 - parent: 179 - type: Transform - - uid: 795 - components: - - pos: -2.5,3.5 - parent: 179 - type: Transform - - uid: 796 - components: - - pos: -2.5,-0.5 - parent: 179 - type: Transform - - uid: 797 - components: - - pos: -2.5,-1.5 - parent: 179 - type: Transform - - uid: 798 - components: - - pos: -2.5,-2.5 - parent: 179 - type: Transform - - uid: 799 - components: - - pos: -2.5,-3.5 - parent: 179 - type: Transform - - uid: 802 - components: - - pos: -8.5,0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 803 - components: - - pos: 2.5,-2.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 804 - components: - - pos: 2.5,-3.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 805 - components: - - pos: -9.5,0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 806 - components: - - pos: -10.5,0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 807 - components: - - pos: -14.5,0.5 - parent: 179 - type: Transform - - uid: 808 - components: - - pos: -11.5,0.5 - parent: 179 - type: Transform - - uid: 809 - components: - - pos: -15.5,0.5 - parent: 179 - type: Transform - - uid: 810 - components: - - pos: -15.5,0.5 - parent: 179 - type: Transform - - uid: 811 - components: - - pos: -16.5,0.5 - parent: 179 - type: Transform - - uid: 812 - components: - - pos: -16.5,5.5 - parent: 179 - type: Transform - - uid: 813 - components: - - pos: -16.5,4.5 - parent: 179 - type: Transform - - uid: 814 - components: - - pos: -16.5,3.5 - parent: 179 - type: Transform - - uid: 815 - components: - - pos: -16.5,2.5 - parent: 179 - type: Transform - - uid: 816 - components: - - pos: -16.5,1.5 - parent: 179 - type: Transform - - uid: 817 - components: - - pos: 7.5,5.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 818 - components: - - pos: 7.5,7.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 819 - components: - - pos: 7.5,8.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 820 - components: - - pos: 7.5,9.5 - parent: 179 - type: Transform - - uid: 821 - components: - - pos: 8.5,9.5 - parent: 179 - type: Transform - - uid: 822 - components: - - pos: 6.5,9.5 - parent: 179 - type: Transform - - uid: 823 - components: - - pos: 5.5,9.5 - parent: 179 - type: Transform - - uid: 824 - components: - - pos: 4.5,9.5 - parent: 179 - type: Transform - - uid: 825 - components: - - pos: 8.5,10.5 - parent: 179 - type: Transform - - uid: 826 - components: - - pos: 8.5,11.5 - parent: 179 - type: Transform - - uid: 827 - components: - - pos: 8.5,12.5 - parent: 179 - type: Transform - - uid: 828 - components: - - pos: 7.5,12.5 - parent: 179 - type: Transform - - uid: 829 - components: - - pos: 7.5,11.5 - parent: 179 - type: Transform - - uid: 830 - components: - - pos: 2.5,-5.5 - parent: 179 - type: Transform - - uid: 831 - components: - - pos: 2.5,-4.5 - parent: 179 - type: Transform - - uid: 832 - components: - - pos: 1.5,-5.5 - parent: 179 - type: Transform - - uid: 833 - components: - - pos: 0.5,-5.5 - parent: 179 - type: Transform - - uid: 834 - components: - - pos: -0.5,-5.5 - parent: 179 - type: Transform - - uid: 835 - components: - - pos: -1.5,-5.5 - parent: 179 - type: Transform - - uid: 836 - components: - - pos: -2.5,-5.5 - parent: 179 - type: Transform - - uid: 837 - components: - - pos: -3.5,-5.5 - parent: 179 - type: Transform - - uid: 838 - components: - - pos: -4.5,-5.5 - parent: 179 - type: Transform - - uid: 839 - components: - - pos: 1.5,11.5 - parent: 179 - type: Transform - - uid: 840 - components: - - pos: 2.5,11.5 - parent: 179 - type: Transform - - uid: 841 - components: - - pos: 0.5,11.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 842 - components: - - pos: 2.5,12.5 - parent: 179 - type: Transform - - uid: 843 - components: - - pos: 2.5,13.5 - parent: 179 - type: Transform - - uid: 844 - components: - - pos: 2.5,14.5 - parent: 179 - type: Transform - - uid: 845 - components: - - pos: 2.5,15.5 - parent: 179 - type: Transform - - uid: 853 - components: - - pos: -3.5,-3.5 - parent: 179 - type: Transform - - uid: 854 - components: - - pos: -4.5,-3.5 - parent: 179 - type: Transform - - uid: 855 - components: - - pos: -5.5,-3.5 - parent: 179 - type: Transform - - uid: 856 - components: - - pos: -6.5,-3.5 - parent: 179 - type: Transform - - uid: 857 - components: - - pos: -6.5,-2.5 - parent: 179 - type: Transform - - uid: 858 - components: - - pos: -6.5,-1.5 - parent: 179 - type: Transform - - uid: 859 - components: - - pos: -6.5,-0.5 - parent: 179 - type: Transform - - uid: 860 - components: - - pos: -6.5,0.5 - parent: 179 - type: Transform - - uid: 861 - components: - - pos: -6.5,1.5 - parent: 179 - type: Transform - - uid: 862 - components: - - pos: -6.5,2.5 - parent: 179 - type: Transform - - uid: 872 - components: - - pos: 7.5,6.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 877 - components: - - pos: -6.5,3.5 - parent: 179 - type: Transform - - uid: 878 - components: - - pos: -2.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 879 - components: - - pos: -1.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 880 - components: - - pos: -0.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 881 - components: - - pos: 0.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 882 - components: - - pos: 1.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 883 - components: - - pos: 2.5,-4.5 - parent: 179 - type: Transform - - uid: 884 - components: - - pos: 3.5,-4.5 - parent: 179 - type: Transform - - uid: 885 - components: - - pos: 4.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 886 - components: - - pos: 5.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 887 - components: - - pos: 6.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 888 - components: - - pos: 7.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 889 - components: - - pos: 8.5,-4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 890 - components: - - pos: 8.5,-3.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 891 - components: - - pos: 8.5,-2.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 892 - components: - - pos: 8.5,-1.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 893 - components: - - pos: 8.5,-0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 894 - components: - - pos: 8.5,0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 895 - components: - - pos: 8.5,1.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 896 - components: - - pos: 8.5,2.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 897 - components: - - pos: 8.5,3.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 898 - components: - - pos: 8.5,4.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 899 - components: - - pos: 8.5,5.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 900 - components: - - pos: -14.5,5.5 - parent: 179 - type: Transform - - uid: 905 - components: - - pos: -12.5,5.5 - parent: 179 - type: Transform - - uid: 906 - components: - - pos: -14.5,4.5 - parent: 179 - type: Transform - - uid: 908 - components: - - pos: -15.5,4.5 - parent: 179 - type: Transform - - uid: 970 - components: - - pos: 9.5,12.5 - parent: 179 - type: Transform - - uid: 971 - components: - - pos: 10.5,12.5 - parent: 179 - type: Transform - - uid: 972 - components: - - pos: 11.5,12.5 - parent: 179 - type: Transform - - uid: 973 - components: - - pos: 12.5,12.5 - parent: 179 - type: Transform - - uid: 974 - components: - - pos: 13.5,12.5 - parent: 179 - type: Transform - - uid: 1026 - components: - - pos: -5.5,-14.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1027 - components: - - pos: -5.5,-13.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1028 - components: - - pos: -5.5,-12.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1029 - components: - - pos: -4.5,-12.5 - parent: 179 - type: Transform - - uid: 1030 - components: - - pos: -3.5,-12.5 - parent: 179 - type: Transform - - uid: 1031 - components: - - pos: -2.5,-12.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1032 - components: - - pos: -1.5,-12.5 - parent: 179 - type: Transform - - uid: 1033 - components: - - pos: -0.5,-12.5 - parent: 179 - type: Transform - - uid: 1034 - components: - - pos: 0.5,-12.5 - parent: 179 - type: Transform - - uid: 1035 - components: - - pos: 1.5,-12.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1036 - components: - - pos: 2.5,-12.5 - parent: 179 - type: Transform - - uid: 1037 - components: - - pos: 3.5,-12.5 - parent: 179 - type: Transform - - uid: 1038 - components: - - pos: 0.5,-13.5 - parent: 179 - type: Transform - - uid: 1039 - components: - - pos: 0.5,-14.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1040 - components: - - pos: 0.5,-15.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1041 - components: - - pos: -1.5,-13.5 - parent: 179 - type: Transform - - uid: 1042 - components: - - pos: -1.5,-14.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1043 - components: - - pos: -1.5,-15.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1044 - components: - - pos: 4.5,-12.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1045 - components: - - pos: 4.5,-13.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1051 - components: - - pos: 9.5,15.5 - parent: 179 - type: Transform - - uid: 1052 - components: - - pos: 9.5,16.5 - parent: 179 - type: Transform - - uid: 1053 - components: - - pos: 9.5,17.5 - parent: 179 - type: Transform - - uid: 1054 - components: - - pos: 9.5,18.5 - parent: 179 - type: Transform - - uid: 1055 - components: - - pos: 9.5,19.5 - parent: 179 - type: Transform - - uid: 1056 - components: - - pos: 9.5,20.5 - parent: 179 - type: Transform - - uid: 1057 - components: - - pos: 10.5,20.5 - parent: 179 - type: Transform - - uid: 1058 - components: - - pos: 11.5,20.5 - parent: 179 - type: Transform - - uid: 1059 - components: - - pos: 12.5,20.5 - parent: 179 - type: Transform - - uid: 1060 - components: - - pos: 13.5,20.5 - parent: 179 - type: Transform - - uid: 1061 - components: - - pos: 14.5,20.5 - parent: 179 - type: Transform - - uid: 1062 - components: - - pos: 15.5,20.5 - parent: 179 - type: Transform - - uid: 1063 - components: - - pos: 16.5,20.5 - parent: 179 - type: Transform - - uid: 1064 - components: - - pos: 16.5,21.5 - parent: 179 - type: Transform - - uid: 1065 - components: - - pos: 16.5,22.5 - parent: 179 - type: Transform - - uid: 1066 - components: - - pos: 16.5,23.5 - parent: 179 - type: Transform - - uid: 1067 - components: - - pos: 16.5,24.5 - parent: 179 - type: Transform - - uid: 1068 - components: - - pos: 16.5,25.5 - parent: 179 - type: Transform - - uid: 1069 - components: - - pos: 16.5,26.5 - parent: 179 - type: Transform - - uid: 1070 - components: - - pos: 16.5,27.5 - parent: 179 - type: Transform - - uid: 1079 - components: - - pos: 15.5,24.5 - parent: 179 - type: Transform - - uid: 1080 - components: - - pos: 14.5,24.5 - parent: 179 - type: Transform - - uid: 1081 - components: - - pos: 13.5,24.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1082 - components: - - pos: 12.5,24.5 - parent: 179 - type: Transform - - uid: 1097 - components: - - pos: 8.5,14.5 - parent: 179 - type: Transform - - uid: 1098 - components: - - pos: 8.5,13.5 - parent: 179 - type: Transform - - uid: 1099 - components: - - pos: 9.5,13.5 - parent: 179 - type: Transform - - uid: 1100 - components: - - pos: 10.5,13.5 - parent: 179 - type: Transform - - uid: 1101 - components: - - pos: 11.5,13.5 - parent: 179 - type: Transform - - uid: 1102 - components: - - pos: 12.5,13.5 - parent: 179 - type: Transform - - uid: 1103 - components: - - pos: 13.5,13.5 - parent: 179 - type: Transform - - uid: 1104 - components: - - pos: 14.5,13.5 - parent: 179 - type: Transform - - uid: 1105 - components: - - pos: 15.5,13.5 - parent: 179 - type: Transform - - uid: 1106 - components: - - pos: 16.5,13.5 - parent: 179 - type: Transform - - uid: 1107 - components: - - pos: 17.5,13.5 - parent: 179 - type: Transform - - uid: 1108 - components: - - pos: 18.5,13.5 - parent: 179 - type: Transform - - uid: 1109 - components: - - pos: 19.5,13.5 - parent: 179 - type: Transform - - uid: 1110 - components: - - pos: 20.5,13.5 - parent: 179 - type: Transform - - uid: 1111 - components: - - pos: 21.5,13.5 - parent: 179 - type: Transform - - uid: 1112 - components: - - pos: 22.5,13.5 - parent: 179 - type: Transform - - uid: 1113 - components: - - pos: 23.5,13.5 - parent: 179 - type: Transform - - uid: 1114 - components: - - pos: 24.5,13.5 - parent: 179 - type: Transform - - uid: 1115 - components: - - pos: 25.5,13.5 - parent: 179 - type: Transform - - uid: 1116 - components: - - pos: 16.5,12.5 - parent: 179 - type: Transform - - uid: 1117 - components: - - pos: 16.5,11.5 - parent: 179 - type: Transform - - uid: 1118 - components: - - pos: 16.5,10.5 - parent: 179 - type: Transform - - uid: 1119 - components: - - pos: 16.5,9.5 - parent: 179 - type: Transform - - uid: 1120 - components: - - pos: 16.5,8.5 - parent: 179 - type: Transform - - uid: 1121 - components: - - pos: 16.5,7.5 - parent: 179 - type: Transform - - uid: 1122 - components: - - pos: 16.5,6.5 - parent: 179 - type: Transform - - uid: 1123 - components: - - pos: 16.5,5.5 - parent: 179 - type: Transform - - uid: 1124 - components: - - pos: 16.5,4.5 - parent: 179 - type: Transform - - uid: 1125 - components: - - pos: 16.5,3.5 - parent: 179 - type: Transform - - uid: 1126 - components: - - pos: 16.5,2.5 - parent: 179 - type: Transform - - uid: 1127 - components: - - pos: 16.5,1.5 - parent: 179 - type: Transform - - uid: 1128 - components: - - pos: 16.5,0.5 - parent: 179 - type: Transform - - uid: 1129 - components: - - pos: 16.5,-0.5 - parent: 179 - type: Transform - - uid: 1130 - components: - - pos: 16.5,-1.5 - parent: 179 - type: Transform - - uid: 1131 - components: - - pos: 16.5,-2.5 - parent: 179 - type: Transform - - uid: 1132 - components: - - pos: 16.5,-3.5 - parent: 179 - type: Transform - - uid: 1133 - components: - - pos: 17.5,-3.5 - parent: 179 - type: Transform - - uid: 1134 - components: - - pos: 18.5,-3.5 - parent: 179 - type: Transform - - uid: 1135 - components: - - pos: 19.5,-3.5 - parent: 179 - type: Transform - - uid: 1136 - components: - - pos: 20.5,-3.5 - parent: 179 - type: Transform - - uid: 1137 - components: - - pos: 21.5,-3.5 - parent: 179 - type: Transform - - uid: 1138 - components: - - pos: 22.5,-3.5 - parent: 179 - type: Transform - - uid: 1139 - components: - - pos: 23.5,-3.5 - parent: 179 - type: Transform - - uid: 1140 - components: - - pos: 24.5,-3.5 - parent: 179 - type: Transform - - uid: 1141 - components: - - pos: 25.5,-3.5 - parent: 179 - type: Transform - - uid: 1142 - components: - - pos: 26.5,-3.5 - parent: 179 - type: Transform - - uid: 1143 - components: - - pos: 27.5,-3.5 - parent: 179 - type: Transform - - uid: 1144 - components: - - pos: 28.5,-3.5 - parent: 179 - type: Transform - - uid: 1145 - components: - - pos: 17.5,2.5 - parent: 179 - type: Transform - - uid: 1146 - components: - - pos: 18.5,2.5 - parent: 179 - type: Transform - - uid: 1147 - components: - - pos: 19.5,2.5 - parent: 179 - type: Transform - - uid: 1148 - components: - - pos: 20.5,2.5 - parent: 179 - type: Transform - - uid: 1149 - components: - - pos: 21.5,2.5 - parent: 179 - type: Transform - - uid: 1150 - components: - - pos: 22.5,2.5 - parent: 179 - type: Transform - - uid: 1151 - components: - - pos: 23.5,2.5 - parent: 179 - type: Transform - - uid: 1152 - components: - - pos: 24.5,2.5 - parent: 179 - type: Transform - - uid: 1153 - components: - - pos: 25.5,2.5 - parent: 179 - type: Transform - - uid: 1154 - components: - - pos: 26.5,2.5 - parent: 179 - type: Transform - - uid: 1155 - components: - - pos: 27.5,2.5 - parent: 179 - type: Transform - - uid: 1156 - components: - - pos: 28.5,2.5 - parent: 179 - type: Transform - - uid: 1157 - components: - - pos: 26.5,3.5 - parent: 179 - type: Transform - - uid: 1158 - components: - - pos: 26.5,4.5 - parent: 179 - type: Transform - - uid: 1159 - components: - - pos: 26.5,5.5 - parent: 179 - type: Transform - - uid: 1160 - components: - - pos: 26.5,6.5 - parent: 179 - type: Transform - - uid: 1161 - components: - - pos: 26.5,7.5 - parent: 179 - type: Transform - - uid: 1162 - components: - - pos: 26.5,8.5 - parent: 179 - type: Transform - - uid: 1163 - components: - - pos: 26.5,9.5 - parent: 179 - type: Transform - - uid: 1164 - components: - - pos: 25.5,9.5 - parent: 179 - type: Transform - - uid: 1165 - components: - - pos: 24.5,9.5 - parent: 179 - type: Transform - - uid: 1166 - components: - - pos: 16.5,19.5 - parent: 179 - type: Transform - - uid: 1167 - components: - - pos: 16.5,18.5 - parent: 179 - type: Transform - - uid: 1168 - components: - - pos: 16.5,17.5 - parent: 179 - type: Transform - - uid: 1169 - components: - - pos: 16.5,16.5 - parent: 179 - type: Transform - - uid: 1170 - components: - - pos: 16.5,15.5 - parent: 179 - type: Transform - - uid: 1171 - components: - - pos: 16.5,14.5 - parent: 179 - type: Transform -- proto: CableApcStack - entities: - - uid: 70 - components: - - pos: 10.577456,21.424059 - parent: 179 - type: Transform - - uid: 183 - components: - - pos: -6.6863613,7.351646 - parent: 179 - type: Transform - - uid: 351 - components: - - pos: 10.561831,21.767809 - parent: 179 - type: Transform - - uid: 537 - components: - - pos: -15.5,-0.5 - parent: 179 - type: Transform - - uid: 538 - components: - - pos: -15.5,-0.5 - parent: 179 - type: Transform -- proto: CableHV - entities: - - uid: 1019 - components: - - pos: -6.5,-13.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1020 - components: - - pos: -6.5,-12.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1021 - components: - - pos: -6.5,-11.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: CableHVStack - entities: - - uid: 184 - components: - - pos: -6.665528,7.840053 - parent: 179 - type: Transform -- proto: CableMV - entities: - - uid: 1023 - components: - - pos: -6.5,-13.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1024 - components: - - pos: -5.5,-13.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound - - uid: 1025 - components: - - pos: -5.5,-14.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: CableMVStack - entities: - - uid: 325 - components: - - pos: -6.665528,7.5601244 - parent: 179 - type: Transform -- proto: CableTerminal - entities: - - uid: 1022 - components: - - pos: -6.5,-11.5 - parent: 179 - type: Transform -- proto: CapacitorStockPart - entities: - - uid: 701 - components: - - pos: -3.2804112,8.786524 - parent: 179 - type: Transform -- proto: CaptainIDCard - entities: - - uid: 726 - components: - - pos: 1.0820513,8.752605 - parent: 179 - type: Transform -- proto: CaptainSabre - entities: - - uid: 381 - components: - - pos: -3.277628,-2.15838 - parent: 179 - type: Transform -- proto: Catwalk - entities: - - uid: 2 - components: - - pos: 13.5,24.5 - parent: 179 - type: Transform - - uid: 7 - components: - - pos: 6.5,24.5 - parent: 179 - type: Transform - - uid: 20 - components: - - pos: 6.5,20.5 - parent: 179 - type: Transform - - uid: 120 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,18.5 - parent: 179 - type: Transform - - uid: 246 - components: - - pos: -6.5,-6.5 - parent: 179 - type: Transform - - uid: 247 - components: - - pos: -8.5,-6.5 - parent: 179 - type: Transform - - uid: 252 - components: - - pos: 4.5,-8.5 - parent: 179 - type: Transform - - uid: 269 - components: - - pos: 12.5,10.5 - parent: 179 - type: Transform - - uid: 286 - components: - - pos: 2.5,-11.5 - parent: 179 - type: Transform - - uid: 287 - components: - - pos: -4.5,-11.5 - parent: 179 - type: Transform - - uid: 308 - components: - - pos: -2.5,-12.5 - parent: 179 - type: Transform - - uid: 309 - components: - - pos: 1.5,-12.5 - parent: 179 - type: Transform - - uid: 333 - components: - - pos: 4.5,-13.5 - parent: 179 - type: Transform - - uid: 334 - components: - - pos: -5.5,-13.5 - parent: 179 - type: Transform - - uid: 345 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,0.5 - parent: 179 - type: Transform - - uid: 346 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,1.5 - parent: 179 - type: Transform - - uid: 347 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,2.5 - parent: 179 - type: Transform - - uid: 348 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,3.5 - parent: 179 - type: Transform - - uid: 349 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,4.5 - parent: 179 - type: Transform - - uid: 403 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-0.5 - parent: 179 - type: Transform - - uid: 404 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-1.5 - parent: 179 - type: Transform - - uid: 405 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-2.5 - parent: 179 - type: Transform - - uid: 406 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-3.5 - parent: 179 - type: Transform - - uid: 407 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-4.5 - parent: 179 - type: Transform - - uid: 408 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-5.5 - parent: 179 - type: Transform - - uid: 409 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-6.5 - parent: 179 - type: Transform - - uid: 410 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-7.5 - parent: 179 - type: Transform - - uid: 411 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-8.5 - parent: 179 - type: Transform - - uid: 412 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-9.5 - parent: 179 - type: Transform - - uid: 413 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-10.5 - parent: 179 - type: Transform - - uid: 414 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 9.5,-11.5 - parent: 179 - type: Transform - - uid: 415 - components: - - anchored: False - rot: -1.5707963267949 rad - pos: 8.5,-8.5 - parent: 179 - type: Transform - - uid: 438 - components: - - rot: 3.141592653589793 rad - pos: -9.5,-0.5 - parent: 179 - type: Transform - - uid: 442 - components: - - pos: -9.5,8.5 - parent: 179 - type: Transform - - uid: 514 - components: - - pos: -10.5,8.5 - parent: 179 - type: Transform - - uid: 541 - components: - - pos: -11.5,-6.5 - parent: 179 - type: Transform - - uid: 542 - components: - - pos: -9.5,-6.5 - parent: 179 - type: Transform - - uid: 695 - components: - - rot: 3.141592653589793 rad - pos: -8.5,8.5 - parent: 179 - type: Transform -- proto: Chair - entities: - - uid: 580 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,6.5 - parent: 179 - type: Transform - - uid: 581 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,8.5 - parent: 179 - type: Transform - - uid: 582 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,7.5 - parent: 179 - type: Transform -- proto: ChairOfficeDark - entities: - - uid: 380 - components: - - rot: 3.1415926535897967 rad - pos: 0.5,-6.5 - parent: 179 - type: Transform -- proto: ChairOfficeLight - entities: - - uid: 576 - components: - - rot: 4.71238898038469 rad - pos: 19.5,4.5 - parent: 179 - type: Transform - - uid: 577 - components: - - rot: 3.141592653589793 rad - pos: 20.5,5.5 - parent: 179 - type: Transform - - uid: 578 - components: - - rot: 4.71238898038469 rad - pos: 23.5,8.5 - parent: 179 - type: Transform - - uid: 579 - components: - - pos: 24.5,5.5 - parent: 179 - type: Transform -- proto: chem_master - entities: - - uid: 311 - components: - - pos: 8.5,11.5 - parent: 179 - type: Transform -- proto: ChemDispenser - entities: - - uid: 583 - components: - - pos: 23.5,9.5 - parent: 179 - type: Transform - - containers: - ReagentDispenser-beaker: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - beakerSlot: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - type: ContainerContainer - - uid: 750 - components: - - pos: 7.5,11.5 - parent: 179 - type: Transform -- proto: ChemicalPayload - entities: - - uid: 432 - components: - - pos: 6.4651074,9.828774 - parent: 179 - type: Transform -- proto: ChemMasterMachineCircuitboard - entities: - - uid: 718 - components: - - pos: -4.5458,10.514079 - parent: 179 - type: Transform -- proto: CircuitImprinter - entities: - - uid: 332 - components: - - pos: -6.5,4.5 - parent: 179 - type: Transform -- proto: ClosetEmergencyFilledRandom - entities: - - uid: 319 - components: - - pos: 1.5,-10.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 322 - components: - - pos: 0.5,-10.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: ClosetToolFilled - entities: - - uid: 524 - components: - - pos: -11.5,-5.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 525 - components: - - pos: -11.5,-4.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 526 - components: - - pos: -11.5,-3.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 527 - components: - - pos: -11.5,-2.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: ClothingBeltUtilityFilled - entities: - - uid: 427 - components: - - pos: -1.895102,-10.33495 - parent: 179 - type: Transform - - uid: 428 - components: - - pos: -1.770102,-10.63182 - parent: 179 - type: Transform -- proto: ClothingHandsGlovesColorYellow - entities: - - uid: 454 - components: - - pos: -0.78741443,4.322194 - parent: 179 - type: Transform -- proto: ClothingHeadHatWelding - entities: - - uid: 344 - components: - - pos: 0.7198646,4.374314 - parent: 179 - type: Transform -- proto: ClothingMaskBreath - entities: - - uid: 955 - components: - - pos: -10.595239,6.1907988 - parent: 179 - type: Transform -- proto: ClothingMaskGas - entities: - - uid: 425 - components: - - pos: -0.2880585,-10.69432 - parent: 179 - type: Transform -- proto: ClothingOuterHardsuitAtmos - entities: - - uid: 270 - components: - - pos: -10.5426235,5.472399 - parent: 179 - type: Transform -- proto: ClothingOuterVest - entities: - - uid: 426 - components: - - pos: -0.9130585,-10.66307 - parent: 179 - type: Transform -- proto: ClothingShoesBootsMag - entities: - - uid: 725 - components: - - pos: 0.47880077,8.073378 - parent: 179 - type: Transform -- proto: ClothingUniformJumpsuitEngineering - entities: - - uid: 424 - components: - - pos: -0.6474335,-10.27245 - parent: 179 - type: Transform -- proto: ClownPDA - entities: - - uid: 91 - components: - - pos: -15.5,2.5 - parent: 179 - type: Transform - - uid: 762 - components: - - pos: -14.5,1.5 - parent: 179 - type: Transform - - uid: 864 - components: - - pos: -14.5,2.5 - parent: 179 - type: Transform - - uid: 912 - components: - - pos: -15.5,1.5 - parent: 179 - type: Transform -- proto: ComputerAnalysisConsole - entities: - - uid: 1083 - components: - - rot: 1.5707963267948966 rad - pos: 15.5,23.5 - parent: 179 - type: Transform - - linkedPorts: - 1078: - - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver - type: DeviceLinkSource -- proto: ComputerCargoOrders - entities: - - uid: 326 - components: - - pos: 0.5,-5.5 - parent: 179 - type: Transform - - uid: 996 - components: - - pos: -1.5,-11.5 - parent: 179 - type: Transform -- proto: ComputerCargoShuttle - entities: - - uid: 995 - components: - - pos: 0.5,-11.5 - parent: 179 - type: Transform -- proto: ComputerMedicalRecords - entities: - - uid: 152 - components: - - rot: 3.141592653589793 rad - pos: 22.5,-5.5 - parent: 179 - type: Transform - - uid: 591 - components: - - pos: 21.5,5.5 - parent: 179 - type: Transform -- proto: ComputerResearchAndDevelopment - entities: - - uid: 88 - components: - - rot: 1.5707963267948966 rad - pos: 8.5,19.5 - parent: 179 - type: Transform -- proto: ComputerShuttleCargo - entities: - - uid: 994 - components: - - pos: -0.5,-11.5 - parent: 179 - type: Transform -- proto: ComputerTechnologyDiskTerminal - entities: - - uid: 1088 - components: - - pos: 13.5,16.5 - parent: 179 - type: Transform -- proto: ConveyorBelt - entities: - - uid: 195 - components: - - pos: -2.5,-15.5 - parent: 179 - type: Transform - - links: - - 699 - type: DeviceLinkSink - - uid: 259 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-14.5 - parent: 179 - type: Transform - - links: - - 983 - type: DeviceLinkSink - - uid: 463 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-16.5 - parent: 179 - type: Transform - - links: - - 983 - type: DeviceLinkSink - - uid: 677 - components: - - pos: -2.5,-14.5 - parent: 179 - type: Transform - - uid: 716 - components: - - rot: -1.5707963267948966 rad - pos: -1.5,11.5 - parent: 179 - type: Transform - - links: - - 722 - type: DeviceLinkSink - - uid: 720 - components: - - rot: -1.5707963267948966 rad - pos: -0.5,11.5 - parent: 179 - type: Transform - - links: - - 722 - type: DeviceLinkSink - - uid: 721 - components: - - rot: -1.5707963267948966 rad - pos: 0.5,11.5 - parent: 179 - type: Transform - - links: - - 722 - type: DeviceLinkSink - - uid: 985 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-13.5 - parent: 179 - type: Transform - - links: - - 983 - type: DeviceLinkSink - - uid: 989 - components: - - rot: 3.141592653589793 rad - pos: 1.5,-15.5 - parent: 179 - type: Transform - - links: - - 983 - type: DeviceLinkSink - - uid: 990 - components: - - pos: -2.5,-13.5 - parent: 179 - type: Transform - - links: - - 699 - type: DeviceLinkSink - - uid: 991 - components: - - pos: -2.5,-16.5 - parent: 179 - type: Transform - - links: - - 699 - type: DeviceLinkSink -- proto: CrateEngineeringToolbox - entities: - - uid: 692 - components: - - pos: -0.5,3.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: CrateGeneric - entities: - - uid: 266 - components: - - pos: 5.5,-6.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: CrateHydroponicsSeeds - entities: - - uid: 754 - components: - - pos: 2.5,12.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: CrateHydroponicsTools - entities: - - uid: 755 - components: - - pos: 2.5,13.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: CrateMedical - entities: - - uid: 131 - components: - - pos: 31.5,-1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 132 - components: - - pos: 32.5,-1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: Crowbar - entities: - - uid: 147 - components: - - pos: -2.172831,4.5306726 - parent: 179 - type: Transform - - uid: 423 - components: - - pos: -2.861032,-5.524786 - parent: 179 - type: Transform -- proto: DebugBatteryDischarger - entities: - - uid: 711 - components: - - pos: 0.5,-3.5 - parent: 179 - type: Transform -- proto: DisposalPipe - entities: - - uid: 717 - components: - - rot: 1.5707963267948966 rad - pos: -0.5,10.5 - parent: 179 - type: Transform -- proto: DisposalTrunk - entities: - - uid: 285 - components: - - rot: -1.5707963267948966 rad - pos: 0.5,10.5 - parent: 179 - type: Transform - - uid: 715 - components: - - rot: 1.5707963267948966 rad - pos: -1.5,10.5 - parent: 179 - type: Transform -- proto: DisposalUnit - entities: - - uid: 719 - components: - - pos: -1.5,10.5 - parent: 179 - type: Transform -- proto: DrinkBeerglass - entities: - - uid: 688 - components: - - pos: 3.1981986,5.733985 - parent: 179 - type: Transform -- proto: DrinkColaCan - entities: - - uid: 690 - components: - - pos: 3.8231986,6.150942 - parent: 179 - type: Transform -- proto: Dropper - entities: - - uid: 730 - components: - - pos: 5.892191,9.4118185 - parent: 179 - type: Transform -- proto: EmergencyOxygenTankFilled - entities: - - uid: 956 - components: - - pos: -10.505015,6.711994 - parent: 179 - type: Transform -- proto: ExGrenade - entities: - - uid: 433 - components: - - pos: -3.7704864,-1.6163371 - parent: 179 - type: Transform -- proto: ExplosivePayload - entities: - - uid: 668 - components: - - pos: 6.829691,9.4118185 - parent: 179 - type: Transform -- proto: FaxMachineCaptain - entities: - - uid: 967 - components: - - pos: 9.5,12.5 - parent: 179 - type: Transform -- proto: FaxMachineCentcom - entities: - - uid: 968 - components: - - pos: 11.5,12.5 - parent: 179 - type: Transform -- proto: FaxMachineSyndie - entities: - - uid: 969 - components: - - pos: 13.5,12.5 - parent: 179 - type: Transform -- proto: FemtoManipulatorStockPart - entities: - - uid: 712 - components: - - pos: -6.7434506,8.817795 - parent: 179 - type: Transform -- proto: FireExtinguisher - entities: - - uid: 323 - components: - - pos: -1.297692,-5.396082 - parent: 179 - type: Transform - - uid: 868 - components: - - pos: -14.5,-1.5 - parent: 179 - type: Transform -- proto: FlashlightLantern - entities: - - uid: 421 - components: - - pos: -1.934832,-5.154238 - parent: 179 - type: Transform - - uid: 422 - components: - - pos: 1.1350493,8.198464 - parent: 179 - type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight -- proto: FloorLavaEntity - entities: - - uid: 134 - components: - - pos: -13.5,-3.5 - parent: 179 - type: Transform - - uid: 135 - components: - - pos: -14.5,-3.5 - parent: 179 - type: Transform - - uid: 141 - components: - - pos: -13.5,-2.5 - parent: 179 - type: Transform - - uid: 469 - components: - - pos: -14.5,-2.5 - parent: 179 - type: Transform -- proto: FloorWaterEntity - entities: - - uid: 136 - components: - - pos: -12.5,-2.5 - parent: 179 - type: Transform - - uid: 137 - components: - - pos: -12.5,-3.5 - parent: 179 - type: Transform -- proto: FoodApple - entities: - - uid: 16 - components: - - pos: 3.9853282,16.430082 - parent: 179 - type: Transform - - uid: 849 - components: - - pos: 3.7249117,16.242453 - parent: 179 - type: Transform - - uid: 866 - components: - - pos: 3.651995,16.55517 - parent: 179 - type: Transform -- proto: FoodBurgerBacon - entities: - - uid: 689 - components: - - pos: 3.3844857,6.0702233 - parent: 179 - type: Transform -- proto: FoodCarrot - entities: - - uid: 850 - components: - - pos: 3.6023045,15.67151 - parent: 179 - type: Transform - - uid: 851 - components: - - pos: 3.620745,15.015423 - parent: 179 - type: Transform - - uid: 863 - components: - - pos: 3.620745,14.389988 - parent: 179 - type: Transform -- proto: FoodPizzaPineapple - entities: - - uid: 687 - components: - - pos: 3.5215416,6.799056 - parent: 179 - type: Transform -- proto: GasAnalyzer - entities: - - uid: 876 - components: - - pos: 4.4732866,-0.48882532 - parent: 179 - type: Transform -- proto: GasFilter - entities: - - uid: 480 - components: - - rot: -1.5707963267948966 rad - pos: 3.5,-3.5 - parent: 179 - type: Transform -- proto: GasMixer - entities: - - uid: 747 - components: - - rot: -1.5707963267948966 rad - pos: 3.5,-2.5 - parent: 179 - type: Transform -- proto: GasOutletInjector - entities: - - uid: 429 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,-1.5 - parent: 179 - type: Transform -- proto: GasPipeBend - entities: - - uid: 727 - components: - - rot: -1.5707963267948966 rad - pos: 5.5,-0.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: GasPipeFourway - entities: - - uid: 728 - components: - - pos: 5.5,-1.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: GasPipeStraight - entities: - - uid: 749 - components: - - rot: -1.5707963267948966 rad - pos: 5.5,-3.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: GasPipeTJunction - entities: - - uid: 748 - components: - - pos: 5.5,-2.5 - parent: 179 - type: Transform - - enabled: True - type: AmbientSound -- proto: GasPort - entities: - - uid: 457 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,-0.5 - parent: 179 - type: Transform -- proto: GasPressurePump - entities: - - uid: 171 - components: - - rot: -1.5707963267948966 rad - pos: 4.5,-3.5 - parent: 179 - type: Transform -- proto: GasValve - entities: - - uid: 168 - components: - - rot: -1.5707963267948966 rad - pos: 4.5,-2.5 - parent: 179 - type: Transform -- proto: GasVentPump - entities: - - uid: 729 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,-3.5 - parent: 179 - type: Transform - - enabled: False - type: AmbientSound -- proto: GasVentScrubber - entities: - - uid: 452 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,-2.5 - parent: 179 - type: Transform - - enabled: False - type: AmbientSound -- proto: GasVolumePump - entities: - - uid: 160 - components: - - rot: -1.5707963267948966 rad - pos: 4.5,-1.5 - parent: 179 - type: Transform -- proto: GeigerCounter - entities: - - uid: 759 - components: - - pos: 1.760596,4.5697265 - parent: 179 - type: Transform -- proto: GravityGenerator - entities: - - uid: 744 - components: - - pos: 6.5,6.5 - parent: 179 - type: Transform -- proto: Grille - entities: - - uid: 108 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,23.5 - parent: 179 - type: Transform - - uid: 986 - components: - - pos: -0.5,-16.5 - parent: 179 - type: Transform - - uid: 987 - components: - - pos: -0.5,-15.5 - parent: 179 - type: Transform - - uid: 988 - components: - - pos: -0.5,-14.5 - parent: 179 - type: Transform - - uid: 1007 - components: - - pos: -3.5,-16.5 - parent: 179 - type: Transform - - uid: 1008 - components: - - pos: -3.5,-15.5 - parent: 179 - type: Transform - - uid: 1009 - components: - - pos: -3.5,-14.5 - parent: 179 - type: Transform - - uid: 1010 - components: - - pos: 2.5,-16.5 - parent: 179 - type: Transform - - uid: 1011 - components: - - pos: 2.5,-15.5 - parent: 179 - type: Transform - - uid: 1012 - components: - - pos: 2.5,-14.5 - parent: 179 - type: Transform - - uid: 1089 - components: - - pos: 8.5,17.5 - parent: 179 - type: Transform - - uid: 1090 - components: - - pos: 9.5,17.5 - parent: 179 - type: Transform - - uid: 1091 - components: - - pos: 10.5,17.5 - parent: 179 - type: Transform - - uid: 1092 - components: - - pos: 10.5,16.5 - parent: 179 - type: Transform -- proto: Handcuffs - entities: - - uid: 331 - components: - - pos: -3.5805476,0.74100244 - parent: 179 - type: Transform -- proto: HandheldHealthAnalyzer - entities: - - uid: 513 - components: - - pos: -5.9808183,-3.6614444 - parent: 179 - type: Transform -- proto: HoloFan - entities: - - uid: 142 - components: - - pos: -8.5,7.5 - parent: 179 - type: Transform - missingComponents: - - TimedDespawn - - uid: 901 - components: - - pos: -10.5,7.5 - parent: 179 - type: Transform - missingComponents: - - TimedDespawn - - uid: 902 - components: - - pos: -9.5,7.5 - parent: 179 - type: Transform - missingComponents: - - TimedDespawn -- proto: HolosignWetFloor - entities: - - uid: 848 - components: - - pos: -13.5,2.5 - parent: 179 - type: Transform - - fixtures: {} - type: Fixtures - missingComponents: - - TimedDespawn - - uid: 911 - components: - - pos: -13.5,1.5 - parent: 179 - type: Transform - - fixtures: {} - type: Fixtures - missingComponents: - - TimedDespawn -- proto: hydroponicsTray - entities: - - uid: 756 - components: - - pos: 2.5,14.5 - parent: 179 - type: Transform - - uid: 757 - components: - - pos: 2.5,15.5 - parent: 179 - type: Transform -- proto: KitchenReagentGrinder - entities: - - uid: 731 - components: - - pos: 8.5,9.5 - parent: 179 - type: Transform -- proto: LargeBeaker - entities: - - uid: 210 - components: - - pos: 4.3272614,9.338851 - parent: 179 - type: Transform - - uid: 253 - components: - - pos: 23.494947,7.0422435 - parent: 179 - type: Transform - - uid: 402 - components: - - pos: 23.510572,7.7141185 - parent: 179 - type: Transform - - uid: 737 - components: - - pos: 4.2969,9.828774 - parent: 179 - type: Transform -- proto: LedLightTube - entities: - - uid: 481 - components: - - pos: -3.511025,-10.35149 - parent: 179 - type: Transform -- proto: LockerBotanistFilled - entities: - - uid: 869 - components: - - pos: 2.5,16.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerChemistry - entities: - - uid: 127 - components: - - pos: 27.5,6.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerChemistryFilled - entities: - - uid: 297 - components: - - pos: 7.5,9.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerChiefEngineerFilled - entities: - - uid: 447 - components: - - pos: 7.5,2.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerElectricalSuppliesFilled - entities: - - uid: 444 - components: - - pos: 7.5,3.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerEngineerFilled - entities: - - uid: 490 - components: - - pos: 7.5,4.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerMedical - entities: - - uid: 128 - components: - - pos: 27.5,5.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 129 - components: - - pos: 29.5,-1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage - - uid: 130 - components: - - pos: 30.5,-1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerMedicalFilled - entities: - - uid: 865 - components: - - pos: -6.5,-3.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerMedicineFilled - entities: - - uid: 562 - components: - - pos: -5.5,-3.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerSalvageSpecialistFilled - entities: - - uid: 493 - components: - - pos: -10.5,4.5 - parent: 179 - type: Transform - - locked: False - type: Lock - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerSyndicatePersonalFilled - entities: - - uid: 909 - components: - - pos: -7.5,1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerWardenFilled - entities: - - uid: 873 - components: - - pos: -8.5,1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: LockerWeldingSuppliesFilled - entities: - - uid: 871 - components: - - pos: 7.5,1.5 - parent: 179 - type: Transform - - air: - volume: 200 - immutable: False - temperature: 293.14957 - moles: - - 2.9923203 - - 11.2568245 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - - 0 - type: EntityStorage -- proto: MachineAnomalyGenerator - entities: - - uid: 1071 - components: - - pos: 16.5,25.5 - parent: 179 - type: Transform - - enabled: False - type: AmbientSound -- proto: MachineAnomalyVessel - entities: - - uid: 1087 - components: - - pos: 15.5,19.5 - parent: 179 - type: Transform -- proto: MachineArtifactAnalyzer - entities: - - uid: 1078 - components: - - rot: 1.5707963267948966 rad - pos: 12.5,24.5 - parent: 179 - type: Transform - - links: - - 1083 - type: DeviceLinkSink -- proto: MachineFrame - entities: - - uid: 533 - components: - - pos: -5.5,10.5 - parent: 179 - type: Transform -- proto: MedicalScanner - entities: - - uid: 592 - components: - - pos: 18.5,-1.5 - parent: 179 - type: Transform - - containers: - MedicalScanner-bodyContainer: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - scanner-bodyContainer: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - type: ContainerContainer - - uid: 593 - components: - - pos: 18.5,-5.5 - parent: 179 - type: Transform - - containers: - MedicalScanner-bodyContainer: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - machine_board: !type:Container - showEnts: False - occludes: True - ents: [] - machine_parts: !type:Container - showEnts: False - occludes: True - ents: [] - scanner-bodyContainer: !type:ContainerSlot - showEnts: False - occludes: True - ent: null - type: ContainerContainer -- proto: MedkitFilled - entities: - - uid: 153 - components: - - pos: 13.632214,1.5673001 - parent: 179 - type: Transform - - uid: 154 - components: - - pos: 13.460339,0.6141751 - parent: 179 - type: Transform - - uid: 321 - components: - - pos: 3.8440318,4.425983 - parent: 179 - type: Transform -- proto: MicroManipulatorStockPart - entities: - - uid: 484 - components: - - pos: -5.5039105,8.838643 - parent: 179 - type: Transform - - uid: 959 - components: - - pos: -4.752078,10.904018 - parent: 179 - type: Transform -- proto: ModularGrenade - entities: - - uid: 435 - components: - - pos: 6.829691,9.860046 - parent: 179 - type: Transform -- proto: MopBucket - entities: - - uid: 696 - components: - - pos: 7.5,16.5 - parent: 179 - type: Transform -- proto: MopItem - entities: - - uid: 328 - components: - - pos: 7.6382103,16.08618 - parent: 179 - type: Transform - - solutions: - absorbed: - temperature: 293.15 - canMix: False - canReact: True - maxVol: 50 - reagents: - - data: null - ReagentId: Water - Quantity: 25 - type: SolutionContainerManager -- proto: Multitool - entities: - - uid: 307 - components: - - pos: -1.249865,-10.43489 - parent: 179 - type: Transform - - uid: 430 - components: - - pos: -0.6298993,4.7431083 - parent: 179 - type: Transform - - devices: - 'UID: 31739': 801 - type: NetworkConfigurator -- proto: NanoManipulatorStockPart - entities: - - uid: 456 - components: - - pos: -5.920577,8.817795 - parent: 179 - type: Transform -- proto: NitrogenCanister - entities: - - uid: 459 - components: - - pos: 7.5,-1.5 - parent: 179 - type: Transform -- proto: Ointment - entities: - - uid: 148 - components: - - pos: 18.77326,6.653532 - parent: 179 - type: Transform - - uid: 149 - components: - - pos: 18.49201,6.059782 - parent: 179 - type: Transform -- proto: OxygenCanister - entities: - - uid: 340 - components: - - pos: 7.5,-3.5 - parent: 179 - type: Transform -- proto: PaperBin10 - entities: - - uid: 977 - components: - - pos: 10.5,12.5 - parent: 179 - type: Transform -- proto: PartRodMetal - entities: - - uid: 133 - components: - - pos: -3.4717777,7.672426 - parent: 179 - type: Transform -- proto: Pen - entities: - - uid: 978 - components: - - pos: 10.893699,12.7794075 - parent: 179 - type: Transform - - uid: 979 - components: - - pos: 10.862433,12.602201 - parent: 179 - type: Transform -- proto: PicoManipulatorStockPart - entities: - - uid: 455 - components: - - pos: -6.337244,8.838643 - parent: 179 - type: Transform -- proto: PlasmaCanister - entities: - - uid: 461 - components: - - pos: 7.5,-2.5 - parent: 179 - type: Transform -- proto: PlasticFlapsAirtightClear - entities: - - uid: 997 - components: - - pos: -2.5,-16.5 - parent: 179 - type: Transform - - uid: 998 - components: - - pos: -2.5,-14.5 - parent: 179 - type: Transform - - uid: 999 - components: - - pos: 1.5,-16.5 - parent: 179 - type: Transform - - uid: 1000 - components: - - pos: 1.5,-14.5 - parent: 179 - type: Transform -- proto: PortableGeneratorSuperPacman - entities: - - uid: 1016 - components: - - pos: -6.5,-11.5 - parent: 179 - type: Transform -- proto: PowerCellHigh - entities: - - uid: 567 - components: - - pos: -4.76583,8.265328 - parent: 179 - type: Transform -- proto: PowerCellHyper - entities: - - uid: 703 - components: - - pos: -4.3179135,8.275752 - parent: 179 - type: Transform -- proto: PowerCellMedium - entities: - - uid: 186 - components: - - pos: -2.67511,-10.351 - parent: 179 - type: Transform - - uid: 187 - components: - - pos: -2.55011,-10.6635 - parent: 179 - type: Transform - - uid: 360 - components: - - pos: -3.7970803,8.275752 - parent: 179 - type: Transform -- proto: PowerCellRecharger - entities: - - uid: 709 - components: - - pos: -1.5,-3.5 - parent: 179 - type: Transform -- proto: PowerCellSmall - entities: - - uid: 705 - components: - - pos: -3.3182633,8.234056 - parent: 179 - type: Transform -- proto: Poweredlight - entities: - - uid: 93 - components: - - rot: 3.141592653589793 rad - pos: 31.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 536 - components: - - rot: -1.5707963267948966 rad - pos: -11.5,-0.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 660 - components: - - rot: -1.5707963267948966 rad - pos: 29.5,1.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 661 - components: - - rot: -1.5707963267948966 rad - pos: 27.5,7.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 663 - components: - - pos: 22.5,2.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 666 - components: - - rot: 1.5707963267948966 rad - pos: 2.5,23.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 670 - components: - - rot: -1.5707963267948966 rad - pos: 13.5,18.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 673 - components: - - rot: -1.5707963267948966 rad - pos: -11.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 674 - components: - - rot: 1.5707963267948966 rad - pos: -15.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 675 - components: - - rot: 1.5707963267948966 rad - pos: -15.5,-0.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 676 - components: - - rot: 1.5707963267948966 rad - pos: -6.5,-10.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 678 - components: - - rot: -1.5707963267948966 rad - pos: 7.5,-1.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 680 - components: - - rot: 3.141592653589793 rad - pos: 16.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 681 - components: - - rot: 3.141592653589793 rad - pos: 23.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 682 - components: - - pos: 13.5,2.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 683 - components: - - rot: 3.141592653589793 rad - pos: 17.5,4.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 1075 - components: - - pos: 16.5,27.5 - parent: 179 - type: Transform - - enabled: False - type: AmbientSound - - uid: 1076 - components: - - rot: 1.5707963267948966 rad - pos: 15.5,22.5 - parent: 179 - type: Transform - - enabled: False - type: AmbientSound -- proto: PoweredSmallLight - entities: - - uid: 163 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,26.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 166 - components: - - rot: 1.5707963267948966 rad - pos: 11.5,24.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 167 - components: - - rot: -1.5707963267948966 rad - pos: 17.5,17.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 388 - components: - - pos: 0.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 417 - components: - - pos: -4.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 483 - components: - - rot: -1.5707963267948966 rad - pos: 4.5,-9.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver - - uid: 534 - components: - - rot: 1.5707963267948966 rad - pos: -9.5,-5.5 - parent: 179 - type: Transform - - powerLoad: 0 - type: ApcPowerReceiver -- proto: Protolathe - entities: - - uid: 12 - components: - - pos: 13.5,21.5 - parent: 179 - type: Transform - - uid: 384 - components: - - pos: -6.5,6.5 - parent: 179 - type: Transform -- proto: QuadraticCapacitorStockPart - entities: - - uid: 704 - components: - - pos: -4.8741612,8.817795 - parent: 179 - type: Transform -- proto: Railing - entities: - - uid: 665 - components: - - rot: 3.141592653589793 rad - pos: -15.5,9.5 - parent: 179 - type: Transform - - uid: 927 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,10.5 - parent: 179 - type: Transform - - uid: 928 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,11.5 - parent: 179 - type: Transform - - uid: 929 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,12.5 - parent: 179 - type: Transform - - uid: 930 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,13.5 - parent: 179 - type: Transform - - uid: 931 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,14.5 - parent: 179 - type: Transform - - uid: 932 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,15.5 - parent: 179 - type: Transform - - uid: 933 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,16.5 - parent: 179 - type: Transform - - uid: 934 - components: - - rot: 3.141592653589793 rad - pos: -13.5,17.5 - parent: 179 - type: Transform - - uid: 935 - components: - - rot: 3.141592653589793 rad - pos: -12.5,17.5 - parent: 179 - type: Transform - - uid: 936 - components: - - rot: 3.141592653589793 rad - pos: -11.5,17.5 - parent: 179 - type: Transform - - uid: 937 - components: - - rot: 3.141592653589793 rad - pos: -10.5,17.5 - parent: 179 - type: Transform - - uid: 938 - components: - - rot: 3.141592653589793 rad - pos: -9.5,17.5 - parent: 179 - type: Transform - - uid: 939 - components: - - rot: 3.141592653589793 rad - pos: -8.5,17.5 - parent: 179 - type: Transform - - uid: 940 - components: - - rot: 3.141592653589793 rad - pos: -7.5,17.5 - parent: 179 - type: Transform - - uid: 941 - components: - - rot: 3.141592653589793 rad - pos: -6.5,17.5 - parent: 179 - type: Transform - - uid: 942 - components: - - rot: 3.141592653589793 rad - pos: -5.5,17.5 - parent: 179 - type: Transform - - uid: 943 - components: - - rot: 3.141592653589793 rad - pos: -4.5,17.5 - parent: 179 - type: Transform - - uid: 944 - components: - - rot: 3.141592653589793 rad - pos: -3.5,17.5 - parent: 179 - type: Transform - - uid: 945 - components: - - rot: 3.141592653589793 rad - pos: -2.5,17.5 - parent: 179 - type: Transform - - uid: 946 - components: - - rot: 3.141592653589793 rad - pos: -1.5,17.5 - parent: 179 - type: Transform - - uid: 947 - components: - - rot: 3.141592653589793 rad - pos: -0.5,17.5 - parent: 179 - type: Transform - - uid: 948 - components: - - rot: 3.141592653589793 rad - pos: 0.5,17.5 - parent: 179 - type: Transform -- proto: RailingCornerSmall - entities: - - uid: 919 - components: - - pos: -14.5,9.5 - parent: 179 - type: Transform -- proto: ReinforcedWindow - entities: - - uid: 1084 - components: - - rot: 1.5707963267948966 rad - pos: 14.5,23.5 - parent: 179 - type: Transform - - uid: 1093 - components: - - pos: 8.5,17.5 - parent: 179 - type: Transform - - uid: 1094 - components: - - pos: 9.5,17.5 - parent: 179 - type: Transform - - uid: 1095 - components: - - pos: 10.5,17.5 - parent: 179 - type: Transform - - uid: 1096 - components: - - pos: 10.5,16.5 - parent: 179 - type: Transform -- proto: ResearchAndDevelopmentServer - entities: - - uid: 17 - components: - - pos: 8.5,18.5 - parent: 179 - type: Transform -- proto: ResearchDiskDebug - entities: - - uid: 54 - components: - - pos: 9.532393,18.446417 - parent: 179 - type: Transform -- proto: RubberStampCaptain - entities: - - uid: 982 - components: - - pos: 12.800895,12.664745 - parent: 179 - type: Transform -- proto: RubberStampCentcom - entities: - - uid: 980 - components: - - pos: 12.186007,12.716865 - parent: 179 - type: Transform -- proto: RubberStampSyndicate - entities: - - uid: 981 - components: - - pos: 12.436131,12.550082 - parent: 179 - type: Transform -- proto: Screwdriver - entities: - - uid: 431 - components: - - pos: -1.235331,4.739151 - parent: 179 - type: Transform -- proto: SeedExtractor - entities: - - uid: 65 - components: - - pos: 2.5,17.5 - parent: 179 - type: Transform -- proto: SheetGlass - entities: - - uid: 354 - components: - - pos: 8.57603,21.566113 - parent: 179 - type: Transform - - uid: 479 - components: - - pos: -5.13758,7.5586076 - parent: 179 - type: Transform - - uid: 529 - components: - - pos: -15.5,-3.5 - parent: 179 - type: Transform - - uid: 564 - components: - - pos: -15.5,-1.5 - parent: 179 - type: Transform - - uid: 565 - components: - - pos: -15.5,-1.5 - parent: 179 - type: Transform - - uid: 566 - components: - - pos: -15.5,-3.5 - parent: 179 - type: Transform -- proto: SheetGlass1 - entities: - - uid: 960 - components: - - pos: -3.981244,10.799851 - parent: 179 - type: Transform -- proto: SheetPGlass - entities: - - uid: 416 - components: - - pos: -0.5,8.5 - parent: 179 - type: Transform -- proto: SheetPlasma - entities: - - uid: 1077 - components: - - pos: 17.485096,24.503635 - parent: 179 - type: Transform -- proto: SheetPlasteel - entities: - - uid: 478 - components: - - pos: -4.0129576,7.6107273 - parent: 179 - type: Transform -- proto: SheetPlastic - entities: - - uid: 79 - components: - - pos: 8.951309,21.511908 - parent: 179 - type: Transform - - uid: 181 - components: - - pos: -4.54383,7.579455 - parent: 179 - type: Transform -- proto: SheetRPGlass - entities: - - uid: 182 - components: - - pos: -0.5,7.5 - parent: 179 - type: Transform -- proto: SheetSteel - entities: - - uid: 205 - components: - - pos: -15.5,-5.5 - parent: 179 - type: Transform - - uid: 305 - components: - - pos: 9.435405,21.503613 - parent: 179 - type: Transform - - uid: 382 - components: - - pos: -15.5,-5.5 - parent: 179 - type: Transform - - uid: 473 - components: - - pos: -5.6834707,7.529523 - parent: 179 - type: Transform - - uid: 543 - components: - - pos: -15.5,-4.5 - parent: 179 - type: Transform - - uid: 544 - components: - - pos: -15.5,-4.5 - parent: 179 - type: Transform -- proto: SignalButton - entities: - - uid: 1013 - components: - - pos: -4.5,-14.5 - parent: 179 - type: Transform - - linkedPorts: - 202: - - Pressed: Toggle - 984: - - Pressed: Toggle - type: DeviceLinkSource - - uid: 1014 - components: - - pos: 3.5,-14.5 - parent: 179 - type: Transform - - linkedPorts: - 697: - - Pressed: Toggle - 698: - - Pressed: Toggle - type: DeviceLinkSource -- proto: SignCargoDock - entities: - - uid: 1046 - components: - - pos: 4.5,-4.5 - parent: 179 - type: Transform -- proto: SmallLight - entities: - - uid: 1048 - components: - - rot: 1.5707963267948966 rad - pos: -2.5,-15.5 - parent: 179 - type: Transform - - uid: 1049 - components: - - rot: -1.5707963267948966 rad - pos: 1.5,-15.5 - parent: 179 - type: Transform -- proto: SMESBasic - entities: - - uid: 1017 - components: - - pos: -6.5,-12.5 - parent: 179 - type: Transform -- proto: soda_dispenser - entities: - - uid: 751 - components: - - pos: 8.5,12.5 - parent: 179 - type: Transform -- proto: SpawnMobHuman - entities: - - uid: 138 - components: - - pos: -6.5,-0.5 - parent: 179 - type: Transform - - uid: 139 - components: - - pos: -6.5,0.5 - parent: 179 - type: Transform - - uid: 140 - components: - - pos: 3.5,7.5 - parent: 179 - type: Transform -- proto: SpawnMobMouse - entities: - - uid: 1050 - components: - - pos: 3.5,8.5 - parent: 179 - type: Transform -- proto: SpawnPointCaptain - entities: - - uid: 954 - components: - - pos: -4.5,4.5 - parent: 179 - type: Transform -- proto: SpawnPointLatejoin - entities: - - uid: 961 - components: - - pos: -3.5,3.5 - parent: 179 - type: Transform -- proto: SpawnPointObserver - entities: - - uid: 679 - components: - - pos: -3.5,4.5 - parent: 179 - type: Transform -- proto: SpawnVehicleJanicart - entities: - - uid: 904 - components: - - pos: 5.5,16.5 - parent: 179 - type: Transform -- proto: Spear - entities: - - uid: 185 - components: - - pos: -3.4579864,-1.9811735 - parent: 179 - type: Transform -- proto: SprayBottleWater - entities: - - uid: 903 - components: - - pos: 6.985283,16.424004 - parent: 179 - type: Transform -- proto: Stimpack - entities: - - uid: 462 - components: - - pos: 3.6877818,5.312015 - parent: 179 - type: Transform -- proto: Stool - entities: - - uid: 383 - components: - - pos: -1.5,-9.5 - parent: 179 - type: Transform - - uid: 387 - components: - - rot: 3.141592653589793 rad - pos: -2.5,-6.5 - parent: 179 - type: Transform -- proto: Stunbaton - entities: - - uid: 434 - components: - - pos: -3.1734612,-2.6066077 - parent: 179 - type: Transform -- proto: SubstationBasic - entities: - - uid: 1018 - components: - - pos: -6.5,-13.5 - parent: 179 - type: Transform -- proto: SuperCapacitorStockPart - entities: - - uid: 296 - components: - - pos: -4.3012447,8.817795 - parent: 179 - type: Transform -- proto: Syringe - entities: - - uid: 460 - components: - - pos: 3.2502818,4.5823417 - parent: 179 - type: Transform - - uid: 738 - components: - - pos: 5.767191,9.787079 - parent: 179 - type: Transform -- proto: Table - entities: - - uid: 63 - components: - - pos: 9.5,21.5 - parent: 179 - type: Transform - - uid: 64 - components: - - pos: 10.5,21.5 - parent: 179 - type: Transform - - uid: 67 - components: - - pos: 8.5,21.5 - parent: 179 - type: Transform - - uid: 92 - components: - - pos: 11.5,21.5 - parent: 179 - type: Transform - - uid: 143 - components: - - pos: 33.5,-3.5 - parent: 179 - type: Transform - - uid: 144 - components: - - pos: 33.5,-2.5 - parent: 179 - type: Transform - - uid: 145 - components: - - pos: 33.5,-1.5 - parent: 179 - type: Transform - - uid: 161 - components: - - pos: 24.5,-5.5 - parent: 179 - type: Transform - - uid: 162 - components: - - pos: 23.5,-5.5 - parent: 179 - type: Transform - - uid: 172 - components: - - rot: -1.5707963267948966 rad - pos: 4.5,9.5 - parent: 179 - type: Transform - - uid: 180 - components: - - pos: -4.5,10.5 - parent: 179 - type: Transform - - uid: 262 - components: - - pos: -3.5,-5.5 - parent: 179 - type: Transform - - uid: 263 - components: - - pos: -2.5,-5.5 - parent: 179 - type: Transform - - uid: 264 - components: - - pos: -1.5,-5.5 - parent: 179 - type: Transform - - uid: 265 - components: - - pos: -0.5,-5.5 - parent: 179 - type: Transform - - uid: 267 - components: - - pos: 23.5,5.5 - parent: 179 - type: Transform - - uid: 268 - components: - - pos: 23.5,6.5 - parent: 179 - type: Transform - - uid: 298 - components: - - rot: -1.5707963267948966 rad - pos: 6.5,9.5 - parent: 179 - type: Transform - - uid: 299 - components: - - rot: -1.5707963267948966 rad - pos: 5.5,9.5 - parent: 179 - type: Transform - - uid: 300 - components: - - rot: -1.5707963267948966 rad - pos: 8.5,9.5 - parent: 179 - type: Transform - - uid: 312 - components: - - pos: -3.5,-10.5 - parent: 179 - type: Transform - - uid: 313 - components: - - pos: -2.5,-10.5 - parent: 179 - type: Transform - - uid: 314 - components: - - pos: -1.5,-10.5 - parent: 179 - type: Transform - - uid: 315 - components: - - pos: -0.5,-10.5 - parent: 179 - type: Transform - - uid: 355 - components: - - pos: -6.5,7.5 - parent: 179 - type: Transform - - uid: 356 - components: - - pos: -5.5,7.5 - parent: 179 - type: Transform - - uid: 357 - components: - - pos: -4.5,7.5 - parent: 179 - type: Transform - - uid: 358 - components: - - pos: -3.5,7.5 - parent: 179 - type: Transform - - uid: 361 - components: - - pos: -0.5,7.5 - parent: 179 - type: Transform - - uid: 362 - components: - - pos: 0.5,7.5 - parent: 179 - type: Transform - - uid: 363 - components: - - pos: 1.5,7.5 - parent: 179 - type: Transform - - uid: 366 - components: - - pos: -2.5,4.5 - parent: 179 - type: Transform - - uid: 367 - components: - - pos: -1.5,4.5 - parent: 179 - type: Transform - - uid: 368 - components: - - pos: -0.5,4.5 - parent: 179 - type: Transform - - uid: 371 - components: - - pos: 1.5,4.5 - parent: 179 - type: Transform - - uid: 385 - components: - - pos: -3.5,-2.5 - parent: 179 - type: Transform - - uid: 386 - components: - - pos: -3.5,-1.5 - parent: 179 - type: Transform - - uid: 440 - components: - - pos: 0.5,4.5 - parent: 179 - type: Transform - - uid: 445 - components: - - pos: -3.5,-0.5 - parent: 179 - type: Transform - - uid: 448 - components: - - pos: 3.5,5.5 - parent: 179 - type: Transform - - uid: 465 - components: - - pos: 1.5,8.5 - parent: 179 - type: Transform - - uid: 466 - components: - - pos: 0.5,8.5 - parent: 179 - type: Transform - - uid: 467 - components: - - pos: -3.5,8.5 - parent: 179 - type: Transform - - uid: 468 - components: - - pos: -0.5,8.5 - parent: 179 - type: Transform - - uid: 470 - components: - - pos: -6.5,8.5 - parent: 179 - type: Transform - - uid: 471 - components: - - pos: -5.5,8.5 - parent: 179 - type: Transform - - uid: 472 - components: - - pos: -4.5,8.5 - parent: 179 - type: Transform - - uid: 515 - components: - - pos: -15.5,-5.5 - parent: 179 - type: Transform - - uid: 516 - components: - - pos: -15.5,-1.5 - parent: 179 - type: Transform - - uid: 520 - components: - - pos: -15.5,-0.5 - parent: 179 - type: Transform - - uid: 559 - components: - - pos: -15.5,-4.5 - parent: 179 - type: Transform - - uid: 560 - components: - - pos: -15.5,-3.5 - parent: 179 - type: Transform - - uid: 568 - components: - - pos: 18.5,4.5 - parent: 179 - type: Transform - - uid: 569 - components: - - pos: 21.5,6.5 - parent: 179 - type: Transform - - uid: 570 - components: - - pos: 20.5,6.5 - parent: 179 - type: Transform - - uid: 571 - components: - - pos: 18.5,6.5 - parent: 179 - type: Transform - - uid: 572 - components: - - pos: 19.5,6.5 - parent: 179 - type: Transform - - uid: 573 - components: - - pos: 18.5,5.5 - parent: 179 - type: Transform - - uid: 574 - components: - - pos: 22.5,8.5 - parent: 179 - type: Transform - - uid: 575 - components: - - pos: 24.5,4.5 - parent: 179 - type: Transform - - uid: 584 - components: - - pos: 23.5,7.5 - parent: 179 - type: Transform - - uid: 586 - components: - - pos: 25.5,10.5 - parent: 179 - type: Transform - - uid: 587 - components: - - pos: 23.5,10.5 - parent: 179 - type: Transform - - uid: 588 - components: - - pos: 24.5,10.5 - parent: 179 - type: Transform - - uid: 589 - components: - - pos: 26.5,10.5 - parent: 179 - type: Transform - - uid: 590 - components: - - pos: 27.5,10.5 - parent: 179 - type: Transform - - uid: 594 - components: - - pos: 13.5,2.5 - parent: 179 - type: Transform - - uid: 595 - components: - - pos: 13.5,0.5 - parent: 179 - type: Transform - - uid: 596 - components: - - pos: 13.5,1.5 - parent: 179 - type: Transform - - uid: 684 - components: - - pos: -3.5,0.5 - parent: 179 - type: Transform - - uid: 685 - components: - - pos: 3.5,4.5 - parent: 179 - type: Transform - - uid: 686 - components: - - pos: 3.5,6.5 - parent: 179 - type: Transform - - uid: 706 - components: - - pos: -1.5,-3.5 - parent: 179 - type: Transform - - uid: 707 - components: - - pos: -0.5,-3.5 - parent: 179 - type: Transform - - uid: 710 - components: - - pos: 0.5,-3.5 - parent: 179 - type: Transform -- proto: TableGlass - entities: - - uid: 964 - components: - - pos: 9.5,12.5 - parent: 179 - type: Transform - - uid: 965 - components: - - pos: 11.5,12.5 - parent: 179 - type: Transform - - uid: 966 - components: - - pos: 13.5,12.5 - parent: 179 - type: Transform - - uid: 975 - components: - - pos: 10.5,12.5 - parent: 179 - type: Transform - - uid: 976 - components: - - pos: 12.5,12.5 - parent: 179 - type: Transform -- proto: TargetHuman - entities: - - uid: 159 - components: - - pos: -6.5,-1.5 - parent: 179 - type: Transform -- proto: TelecomServerFilled - entities: - - uid: 963 - components: - - pos: -3.5,10.5 - parent: 179 - type: Transform -- proto: TimerTrigger - entities: - - uid: 482 - components: - - pos: 6.413024,9.39097 - parent: 179 - type: Transform -- proto: ToolboxElectricalFilled - entities: - - uid: 365 - components: - - pos: 0.4993378,3.429311 - parent: 179 - type: Transform - - uid: 419 - components: - - pos: -0.8099712,-5.21454 - parent: 179 - type: Transform - - uid: 420 - components: - - pos: -0.5597038,-5.679647 - parent: 179 - type: Transform -- proto: ToolboxMechanicalFilled - entities: - - uid: 364 - components: - - pos: 1.452203,3.4605832 - parent: 179 - type: Transform -- proto: ToyRubberDuck - entities: - - uid: 723 - components: - - pos: -1.6653601,11.616664 - parent: 179 - type: Transform -- proto: trayScanner - entities: - - uid: 758 - components: - - pos: 1.354346,4.548879 - parent: 179 - type: Transform -- proto: TwoWayLever - entities: - - uid: 699 - components: - - pos: -3.5,-13.5 - parent: 179 - type: Transform - - linkedPorts: - 990: - - Left: Forward - - Right: Reverse - - Middle: Off - 195: - - Left: Forward - - Right: Reverse - - Middle: Off - 991: - - Left: Forward - - Right: Reverse - - Middle: Off - type: DeviceLinkSource - - uid: 722 - components: - - pos: 1.5,11.5 - parent: 179 - type: Transform - - linkedPorts: - 721: - - Left: Forward - - Right: Reverse - - Middle: Off - 720: - - Left: Forward - - Right: Reverse - - Middle: Off - 716: - - Left: Forward - - Right: Reverse - - Middle: Off - type: DeviceLinkSource - - uid: 983 - components: - - pos: 2.5,-13.5 - parent: 179 - type: Transform - - linkedPorts: - 985: - - Left: Forward - - Right: Reverse - - Middle: Off - 259: - - Left: Forward - - Right: Reverse - - Middle: Off - 989: - - Left: Forward - - Right: Reverse - - Middle: Off - 463: - - Left: Forward - - Right: Reverse - - Middle: Off - type: DeviceLinkSource -- proto: UnfinishedMachineFrame - entities: - - uid: 522 - components: - - pos: -6.5,10.5 - parent: 179 - type: Transform -- proto: UniformPrinter - entities: - - uid: 443 - components: - - pos: -7.5,4.5 - parent: 179 - type: Transform -- proto: VehicleKeyJanicart - entities: - - uid: 14 - components: - - pos: 6.5,16.5 - parent: 179 - type: Transform -- proto: VendingMachineCigs - entities: - - uid: 870 - components: - - flags: SessionSpecific - type: MetaData - - pos: -14.5,4.5 - parent: 179 - type: Transform -- proto: VendingMachineEngivend - entities: - - uid: 441 - components: - - flags: SessionSpecific - type: MetaData - - pos: -11.5,4.5 - parent: 179 - type: Transform - - uid: 523 - components: - - flags: SessionSpecific - type: MetaData - - pos: -11.5,-1.5 - parent: 179 - type: Transform -- proto: VendingMachineMedical - entities: - - uid: 156 - components: - - flags: SessionSpecific - type: MetaData - - pos: 25.5,-5.5 - parent: 179 - type: Transform - - uid: 157 - components: - - flags: SessionSpecific - type: MetaData - - pos: 27.5,-5.5 - parent: 179 - type: Transform - - uid: 158 - components: - - flags: SessionSpecific - type: MetaData - - pos: 29.5,3.5 - parent: 179 - type: Transform - - uid: 521 - components: - - flags: SessionSpecific - type: MetaData - - pos: -12.5,4.5 - parent: 179 - type: Transform -- proto: VendingMachineSalvage - entities: - - uid: 485 - components: - - flags: SessionSpecific - type: MetaData - - pos: -15.5,4.5 - parent: 179 - type: Transform -- proto: VendingMachineSec - entities: - - uid: 874 - components: - - flags: SessionSpecific - type: MetaData - - pos: -13.5,4.5 - parent: 179 - type: Transform -- proto: VendingMachineTankDispenserEVA - entities: - - uid: 875 - components: - - flags: SessionSpecific - type: MetaData - - pos: 7.5,0.5 - parent: 179 - type: Transform -- proto: VendingMachineYouTool - entities: - - uid: 350 - components: - - flags: SessionSpecific - type: MetaData - - pos: -11.5,-0.5 - parent: 179 - type: Transform -- proto: WallSolid - entities: - - uid: 3 - components: - - pos: 1.5,18.5 - parent: 179 - type: Transform - - uid: 4 - components: - - pos: 11.5,26.5 - parent: 179 - type: Transform - - uid: 5 - components: - - pos: 18.5,24.5 - parent: 179 - type: Transform - - uid: 6 - components: - - pos: 20.5,15.5 - parent: 179 - type: Transform - - uid: 8 - components: - - pos: 14.5,19.5 - parent: 179 - type: Transform - - uid: 9 - components: - - pos: 1.5,19.5 - parent: 179 - type: Transform - - uid: 10 - components: - - pos: 18.5,26.5 - parent: 179 - type: Transform - - uid: 11 - components: - - pos: 13.5,26.5 - parent: 179 - type: Transform - - uid: 13 - components: - - pos: 25.5,15.5 - parent: 179 - type: Transform - - uid: 18 - components: - - pos: 4.5,26.5 - parent: 179 - type: Transform - - uid: 19 - components: - - pos: 18.5,25.5 - parent: 179 - type: Transform - - uid: 21 - components: - - pos: 10.5,26.5 - parent: 179 - type: Transform - - uid: 22 - components: - - pos: 26.5,15.5 - parent: 179 - type: Transform - - uid: 25 - components: - - pos: 1.5,21.5 - parent: 179 - type: Transform - - uid: 27 - components: - - pos: 8.5,-0.5 - parent: 179 - type: Transform - - uid: 28 - components: - - pos: 18.5,18.5 - parent: 179 - type: Transform - - uid: 29 - components: - - pos: 18.5,21.5 - parent: 179 - type: Transform - - uid: 30 - components: - - pos: 1.5,22.5 - parent: 179 - type: Transform - - uid: 31 - components: - - pos: 1.5,20.5 - parent: 179 - type: Transform - - uid: 32 - components: - - pos: 18.5,19.5 - parent: 179 - type: Transform - - uid: 33 - components: - - pos: 23.5,15.5 - parent: 179 - type: Transform - - uid: 34 - components: - - pos: 12.5,22.5 - parent: 179 - type: Transform - - uid: 35 - components: - - pos: 27.5,15.5 - parent: 179 - type: Transform - - uid: 36 - components: - - pos: 7.5,22.5 - parent: 179 - type: Transform - - uid: 37 - components: - - pos: 14.5,22.5 - parent: 179 - type: Transform - - uid: 38 - components: - - pos: 10.5,23.5 - parent: 179 - type: Transform - - uid: 39 - components: - - pos: 10.5,24.5 - parent: 179 - type: Transform - - uid: 40 - components: - - pos: 8.5,26.5 - parent: 179 - type: Transform - - uid: 41 - components: - - pos: 10.5,25.5 - parent: 179 - type: Transform - - uid: 42 - components: - - pos: 18.5,22.5 - parent: 179 - type: Transform - - uid: 43 - components: - - pos: 14.5,27.5 - parent: 179 - type: Transform - - uid: 44 - components: - - pos: 14.5,26.5 - parent: 179 - type: Transform - - uid: 45 - components: - - pos: 1.5,16.5 - parent: 179 - type: Transform - - uid: 46 - components: - - pos: 18.5,27.5 - parent: 179 - type: Transform - - uid: 49 - components: - - pos: 7.5,28.5 - parent: 179 - type: Transform - - uid: 50 - components: - - pos: 13.5,22.5 - parent: 179 - type: Transform - - uid: 51 - components: - - pos: 12.5,26.5 - parent: 179 - type: Transform - - uid: 52 - components: - - pos: 1.5,15.5 - parent: 179 - type: Transform - - uid: 53 - components: - - pos: 9.5,26.5 - parent: 179 - type: Transform - - uid: 55 - components: - - pos: 24.5,15.5 - parent: 179 - type: Transform - - uid: 56 - components: - - pos: 14.5,25.5 - parent: 179 - type: Transform - - uid: 57 - components: - - pos: 14.5,21.5 - parent: 179 - type: Transform - - uid: 60 - components: - - pos: 7.5,21.5 - parent: 179 - type: Transform - - uid: 61 - components: - - pos: 18.5,20.5 - parent: 179 - type: Transform - - uid: 62 - components: - - pos: 18.5,23.5 - parent: 179 - type: Transform - - uid: 66 - components: - - pos: 18.5,17.5 - parent: 179 - type: Transform - - uid: 68 - components: - - pos: 18.5,28.5 - parent: 179 - type: Transform - - uid: 69 - components: - - pos: 28.5,15.5 - parent: 179 - type: Transform - - uid: 71 - components: - - pos: 11.5,22.5 - parent: 179 - type: Transform - - uid: 72 - components: - - pos: 1.5,17.5 - parent: 179 - type: Transform - - uid: 73 - components: - - pos: 14.5,28.5 - parent: 179 - type: Transform - - uid: 74 - components: - - pos: 10.5,22.5 - parent: 179 - type: Transform - - uid: 75 - components: - - pos: 9.5,22.5 - parent: 179 - type: Transform - - uid: 76 - components: - - pos: 8.5,-1.5 - parent: 179 - type: Transform - - uid: 77 - components: - - pos: 8.5,-2.5 - parent: 179 - type: Transform - - uid: 78 - components: - - pos: 21.5,15.5 - parent: 179 - type: Transform - - uid: 80 - components: - - pos: 18.5,16.5 - parent: 179 - type: Transform - - uid: 81 - components: - - pos: 18.5,15.5 - parent: 179 - type: Transform - - uid: 82 - components: - - pos: 14.5,18.5 - parent: 179 - type: Transform - - uid: 83 - components: - - pos: 4.5,28.5 - parent: 179 - type: Transform - - uid: 84 - components: - - pos: 7.5,26.5 - parent: 179 - type: Transform - - uid: 85 - components: - - pos: 1.5,23.5 - parent: 179 - type: Transform - - uid: 86 - components: - - pos: 17.5,15.5 - parent: 179 - type: Transform - - uid: 89 - components: - - pos: 22.5,15.5 - parent: 179 - type: Transform - - uid: 95 - components: - - pos: 8.5,22.5 - parent: 179 - type: Transform - - uid: 96 - components: - - pos: 7.5,27.5 - parent: 179 - type: Transform - - uid: 97 - components: - - pos: 8.5,-3.5 - parent: 179 - type: Transform - - uid: 98 - components: - - pos: 4.5,25.5 - parent: 179 - type: Transform - - uid: 99 - components: - - pos: 17.5,18.5 - parent: 179 - type: Transform - - uid: 100 - components: - - pos: 19.5,15.5 - parent: 179 - type: Transform - - uid: 101 - components: - - pos: 4.5,27.5 - parent: 179 - type: Transform - - uid: 103 - components: - - pos: 14.5,17.5 - parent: 179 - type: Transform - - uid: 104 - components: - - pos: 14.5,16.5 - parent: 179 - type: Transform - - uid: 105 - components: - - pos: 15.5,15.5 - parent: 179 - type: Transform - - uid: 106 - components: - - pos: 14.5,15.5 - parent: 179 - type: Transform - - uid: 107 - components: - - pos: 13.5,15.5 - parent: 179 - type: Transform - - uid: 109 - components: - - pos: 11.5,15.5 - parent: 179 - type: Transform - - uid: 110 - components: - - pos: 10.5,15.5 - parent: 179 - type: Transform - - uid: 112 - components: - - pos: 7.5,19.5 - parent: 179 - type: Transform - - uid: 113 - components: - - pos: 7.5,18.5 - parent: 179 - type: Transform - - uid: 114 - components: - - pos: 7.5,17.5 - parent: 179 - type: Transform - - uid: 117 - components: - - pos: 5.5,18.5 - parent: 179 - type: Transform - - uid: 118 - components: - - pos: 5.5,19.5 - parent: 179 - type: Transform - - uid: 121 - components: - - pos: 4.5,19.5 - parent: 179 - type: Transform - - uid: 122 - components: - - pos: 4.5,20.5 - parent: 179 - type: Transform - - uid: 123 - components: - - pos: 4.5,21.5 - parent: 179 - type: Transform - - uid: 124 - components: - - pos: 4.5,22.5 - parent: 179 - type: Transform - - uid: 125 - components: - - pos: 4.5,23.5 - parent: 179 - type: Transform - - uid: 126 - components: - - pos: 4.5,24.5 - parent: 179 - type: Transform - - uid: 164 - components: - - rot: 1.5707963267948966 rad - pos: 22.5,9.5 - parent: 179 - type: Transform - - uid: 165 - components: - - pos: 8.5,2.5 - parent: 179 - type: Transform - - uid: 169 - components: - - pos: 8.5,0.5 - parent: 179 - type: Transform - - uid: 173 - components: - - pos: 8.5,1.5 - parent: 179 - type: Transform - - uid: 189 - components: - - pos: -7.5,0.5 - parent: 179 - type: Transform - - uid: 190 - components: - - pos: -7.5,-0.5 - parent: 179 - type: Transform - - uid: 191 - components: - - pos: -7.5,-1.5 - parent: 179 - type: Transform - - uid: 192 - components: - - pos: -7.5,-2.5 - parent: 179 - type: Transform - - uid: 193 - components: - - pos: -7.5,-3.5 - parent: 179 - type: Transform - - uid: 196 - components: - - pos: 3.5,-14.5 - parent: 179 - type: Transform - - uid: 197 - components: - - pos: 4.5,-14.5 - parent: 179 - type: Transform - - uid: 198 - components: - - pos: -7.5,-10.5 - parent: 179 - type: Transform - - uid: 199 - components: - - pos: -7.5,-11.5 - parent: 179 - type: Transform - - uid: 200 - components: - - pos: -7.5,-12.5 - parent: 179 - type: Transform - - uid: 201 - components: - - pos: -7.5,-13.5 - parent: 179 - type: Transform - - uid: 208 - components: - - pos: -7.5,-9.5 - parent: 179 - type: Transform - - uid: 209 - components: - - pos: -10.5,-7.5 - parent: 179 - type: Transform - - uid: 211 - components: - - pos: -10.5,-5.5 - parent: 179 - type: Transform - - uid: 212 - components: - - pos: -10.5,-4.5 - parent: 179 - type: Transform - - uid: 213 - components: - - pos: -10.5,-3.5 - parent: 179 - type: Transform - - uid: 214 - components: - - pos: -10.5,-2.5 - parent: 179 - type: Transform - - uid: 215 - components: - - pos: -10.5,-1.5 - parent: 179 - type: Transform - - uid: 217 - components: - - pos: 1.5,-4.5 - parent: 179 - type: Transform - - uid: 218 - components: - - pos: 0.5,-4.5 - parent: 179 - type: Transform - - uid: 219 - components: - - pos: -0.5,-4.5 - parent: 179 - type: Transform - - uid: 220 - components: - - pos: -1.5,-4.5 - parent: 179 - type: Transform - - uid: 221 - components: - - pos: -2.5,-4.5 - parent: 179 - type: Transform - - uid: 222 - components: - - pos: -3.5,-4.5 - parent: 179 - type: Transform - - uid: 223 - components: - - pos: -4.5,-4.5 - parent: 179 - type: Transform - - uid: 224 - components: - - pos: -5.5,-4.5 - parent: 179 - type: Transform - - uid: 225 - components: - - pos: -6.5,-4.5 - parent: 179 - type: Transform - - uid: 226 - components: - - pos: 4.5,-4.5 - parent: 179 - type: Transform - - uid: 227 - components: - - pos: 5.5,-4.5 - parent: 179 - type: Transform - - uid: 228 - components: - - pos: 6.5,-4.5 - parent: 179 - type: Transform - - uid: 229 - components: - - pos: -7.5,-14.5 - parent: 179 - type: Transform - - uid: 231 - components: - - pos: -6.5,-14.5 - parent: 179 - type: Transform - - uid: 232 - components: - - pos: -5.5,-14.5 - parent: 179 - type: Transform - - uid: 233 - components: - - pos: -4.5,-14.5 - parent: 179 - type: Transform - - uid: 234 - components: - - pos: 6.5,-10.5 - parent: 179 - type: Transform - - uid: 235 - components: - - pos: 6.5,-11.5 - parent: 179 - type: Transform - - uid: 236 - components: - - pos: 6.5,-12.5 - parent: 179 - type: Transform - - uid: 237 - components: - - pos: 6.5,-13.5 - parent: 179 - type: Transform - - uid: 238 - components: - - pos: 6.5,-14.5 - parent: 179 - type: Transform - - uid: 239 - components: - - pos: 5.5,-14.5 - parent: 179 - type: Transform - - uid: 240 - components: - - pos: -7.5,-8.5 - parent: 179 - type: Transform - - uid: 241 - components: - - pos: -7.5,-7.5 - parent: 179 - type: Transform - - uid: 242 - components: - - pos: -8.5,-8.5 - parent: 179 - type: Transform - - uid: 243 - components: - - pos: -9.5,-8.5 - parent: 179 - type: Transform - - uid: 244 - components: - - pos: -10.5,-8.5 - parent: 179 - type: Transform - - uid: 245 - components: - - pos: -7.5,-5.5 - parent: 179 - type: Transform - - uid: 248 - components: - - pos: 5.5,-7.5 - parent: 179 - type: Transform - - uid: 249 - components: - - pos: 5.5,-9.5 - parent: 179 - type: Transform - - uid: 250 - components: - - pos: 6.5,-9.5 - parent: 179 - type: Transform - - uid: 251 - components: - - pos: 6.5,-7.5 - parent: 179 - type: Transform - - uid: 254 - components: - - pos: 7.5,-9.5 - parent: 179 - type: Transform - - uid: 260 - components: - - pos: 6.5,-6.5 - parent: 179 - type: Transform - - uid: 261 - components: - - pos: 6.5,-5.5 - parent: 179 - type: Transform - - uid: 271 - components: - - pos: 1.5,14.5 - parent: 179 - type: Transform - - uid: 272 - components: - - pos: 1.5,13.5 - parent: 179 - type: Transform - - uid: 273 - components: - - pos: 1.5,12.5 - parent: 179 - type: Transform - - uid: 274 - components: - - pos: -7.5,11.5 - parent: 179 - type: Transform - - uid: 275 - components: - - pos: -6.5,11.5 - parent: 179 - type: Transform - - uid: 276 - components: - - pos: -5.5,11.5 - parent: 179 - type: Transform - - uid: 277 - components: - - pos: -4.5,11.5 - parent: 179 - type: Transform - - uid: 278 - components: - - pos: -3.5,11.5 - parent: 179 - type: Transform - - uid: 279 - components: - - pos: -2.5,11.5 - parent: 179 - type: Transform - - uid: 282 - components: - - pos: -1.5,12.5 - parent: 179 - type: Transform - - uid: 283 - components: - - pos: -0.5,12.5 - parent: 179 - type: Transform - - uid: 284 - components: - - pos: 0.5,12.5 - parent: 179 - type: Transform - - uid: 288 - components: - - pos: 12.5,8.5 - parent: 179 - type: Transform - - uid: 289 - components: - - pos: 11.5,8.5 - parent: 179 - type: Transform - - uid: 290 - components: - - pos: 10.5,8.5 - parent: 179 - type: Transform - - uid: 291 - components: - - pos: 9.5,8.5 - parent: 179 - type: Transform - - uid: 292 - components: - - pos: 8.5,8.5 - parent: 179 - type: Transform - - uid: 293 - components: - - pos: 7.5,8.5 - parent: 179 - type: Transform - - uid: 294 - components: - - pos: 6.5,8.5 - parent: 179 - type: Transform - - uid: 295 - components: - - pos: 5.5,8.5 - parent: 179 - type: Transform - - uid: 301 - components: - - pos: 9.5,11.5 - parent: 179 - type: Transform - - uid: 302 - components: - - pos: 10.5,11.5 - parent: 179 - type: Transform - - uid: 303 - components: - - pos: 11.5,11.5 - parent: 179 - type: Transform - - uid: 304 - components: - - pos: 12.5,11.5 - parent: 179 - type: Transform - - uid: 310 - components: - - pos: 9.5,9.5 - parent: 179 - type: Transform - - uid: 316 - components: - - pos: -7.5,-4.5 - parent: 179 - type: Transform - - uid: 317 - components: - - pos: 26.5,14.5 - parent: 179 - type: Transform - - uid: 320 - components: - - pos: 24.5,14.5 - parent: 179 - type: Transform - - uid: 329 - components: - - pos: -11.5,5.5 - parent: 179 - type: Transform - - uid: 335 - components: - - pos: 13.5,11.5 - parent: 179 - type: Transform - - uid: 336 - components: - - pos: 14.5,11.5 - parent: 179 - type: Transform - - uid: 337 - components: - - pos: 13.5,9.5 - parent: 179 - type: Transform - - uid: 338 - components: - - pos: 13.5,8.5 - parent: 179 - type: Transform - - uid: 339 - components: - - pos: 13.5,7.5 - parent: 179 - type: Transform - - uid: 341 - components: - - pos: 24.5,12.5 - parent: 179 - type: Transform - - uid: 342 - components: - - pos: 26.5,12.5 - parent: 179 - type: Transform - - uid: 352 - components: - - pos: 13.5,6.5 - parent: 179 - type: Transform - - uid: 353 - components: - - pos: 13.5,5.5 - parent: 179 - type: Transform - - uid: 372 - components: - - pos: 13.5,4.5 - parent: 179 - type: Transform - - uid: 373 - components: - - pos: 25.5,4.5 - parent: 179 - type: Transform - - uid: 374 - components: - - pos: 23.5,4.5 - parent: 179 - type: Transform - - uid: 375 - components: - - pos: 17.5,3.5 - parent: 179 - type: Transform - - uid: 376 - components: - - pos: -10.5,-0.5 - parent: 179 - type: Transform - - uid: 377 - components: - - pos: -10.5,0.5 - parent: 179 - type: Transform - - uid: 379 - components: - - pos: -8.5,0.5 - parent: 179 - type: Transform - - uid: 390 - components: - - pos: 18.5,3.5 - parent: 179 - type: Transform - - uid: 391 - components: - - pos: 19.5,3.5 - parent: 179 - type: Transform - - uid: 392 - components: - - pos: 21.5,3.5 - parent: 179 - type: Transform - - uid: 393 - components: - - pos: 22.5,3.5 - parent: 179 - type: Transform - - uid: 394 - components: - - pos: 22.5,4.5 - parent: 179 - type: Transform - - uid: 395 - components: - - pos: 22.5,5.5 - parent: 179 - type: Transform - - uid: 396 - components: - - pos: 22.5,6.5 - parent: 179 - type: Transform - - uid: 397 - components: - - pos: 22.5,7.5 - parent: 179 - type: Transform - - uid: 399 - components: - - pos: 22.5,10.5 - parent: 179 - type: Transform - - uid: 400 - components: - - pos: 21.5,11.5 - parent: 179 - type: Transform - - uid: 401 - components: - - pos: 22.5,11.5 - parent: 179 - type: Transform - - uid: 418 - components: - - pos: 7.5,-7.5 - parent: 179 - type: Transform - - uid: 439 - components: - - pos: -13.5,5.5 - parent: 179 - type: Transform - - uid: 449 - components: - - pos: -16.5,2.5 - parent: 179 - type: Transform - - uid: 450 - components: - - pos: -16.5,3.5 - parent: 179 - type: Transform - - uid: 464 - components: - - pos: 4.5,8.5 - parent: 179 - type: Transform - - uid: 474 - components: - - pos: -7.5,8.5 - parent: 179 - type: Transform - - uid: 475 - components: - - pos: -7.5,7.5 - parent: 179 - type: Transform - - uid: 476 - components: - - pos: -7.5,6.5 - parent: 179 - type: Transform - - uid: 477 - components: - - pos: -7.5,5.5 - parent: 179 - type: Transform - - uid: 486 - components: - - pos: -15.5,5.5 - parent: 179 - type: Transform - - uid: 487 - components: - - pos: -16.5,4.5 - parent: 179 - type: Transform - - uid: 488 - components: - - pos: 5.5,17.5 - parent: 179 - type: Transform - - uid: 489 - components: - - pos: -11.5,0.5 - parent: 179 - type: Transform - - uid: 491 - components: - - pos: -16.5,5.5 - parent: 179 - type: Transform - - uid: 492 - components: - - pos: -14.5,5.5 - parent: 179 - type: Transform - - uid: 494 - components: - - rot: -1.5707963267948966 rad - pos: -11.5,7.5 - parent: 179 - type: Transform - - uid: 495 - components: - - pos: -12.5,5.5 - parent: 179 - type: Transform - - uid: 496 - components: - - pos: -16.5,1.5 - parent: 179 - type: Transform - - uid: 497 - components: - - pos: -16.5,0.5 - parent: 179 - type: Transform - - uid: 498 - components: - - pos: -16.5,-0.5 - parent: 179 - type: Transform - - uid: 499 - components: - - pos: -16.5,-1.5 - parent: 179 - type: Transform - - uid: 500 - components: - - pos: -16.5,-2.5 - parent: 179 - type: Transform - - uid: 501 - components: - - pos: -16.5,-3.5 - parent: 179 - type: Transform - - uid: 502 - components: - - pos: -16.5,-4.5 - parent: 179 - type: Transform - - uid: 503 - components: - - pos: -16.5,-5.5 - parent: 179 - type: Transform - - uid: 504 - components: - - pos: -16.5,-6.5 - parent: 179 - type: Transform - - uid: 505 - components: - - pos: -16.5,-7.5 - parent: 179 - type: Transform - - uid: 506 - components: - - pos: -16.5,-8.5 - parent: 179 - type: Transform - - uid: 507 - components: - - pos: -15.5,-8.5 - parent: 179 - type: Transform - - uid: 508 - components: - - pos: -14.5,-8.5 - parent: 179 - type: Transform - - uid: 509 - components: - - pos: -13.5,-8.5 - parent: 179 - type: Transform - - uid: 510 - components: - - pos: -12.5,-8.5 - parent: 179 - type: Transform - - uid: 511 - components: - - pos: -11.5,-8.5 - parent: 179 - type: Transform - - uid: 517 - components: - - pos: 23.5,11.5 - parent: 179 - type: Transform - - uid: 518 - components: - - pos: 24.5,11.5 - parent: 179 - type: Transform - - uid: 519 - components: - - pos: 25.5,11.5 - parent: 179 - type: Transform - - uid: 535 - components: - - pos: -15.5,0.5 - parent: 179 - type: Transform - - uid: 539 - components: - - pos: 26.5,11.5 - parent: 179 - type: Transform - - uid: 540 - components: - - pos: 27.5,11.5 - parent: 179 - type: Transform - - uid: 545 - components: - - pos: 7.5,-4.5 - parent: 179 - type: Transform - - uid: 546 - components: - - pos: 8.5,-4.5 - parent: 179 - type: Transform - - uid: 547 - components: - - pos: 28.5,11.5 - parent: 179 - type: Transform - - uid: 548 - components: - - pos: 28.5,10.5 - parent: 179 - type: Transform - - uid: 549 - components: - - pos: 28.5,9.5 - parent: 179 - type: Transform - - uid: 550 - components: - - pos: 28.5,8.5 - parent: 179 - type: Transform - - uid: 551 - components: - - pos: 28.5,7.5 - parent: 179 - type: Transform - - uid: 552 - components: - - pos: 28.5,6.5 - parent: 179 - type: Transform - - uid: 553 - components: - - pos: 28.5,5.5 - parent: 179 - type: Transform - - uid: 554 - components: - - pos: 26.5,-2.5 - parent: 179 - type: Transform - - uid: 555 - components: - - pos: 26.5,-1.5 - parent: 179 - type: Transform - - uid: 556 - components: - - pos: 25.5,-0.5 - parent: 179 - type: Transform - - uid: 557 - components: - - pos: 26.5,-0.5 - parent: 179 - type: Transform - - uid: 558 - components: - - pos: 27.5,-0.5 - parent: 179 - type: Transform - - uid: 561 - components: - - pos: -14.5,0.5 - parent: 179 - type: Transform - - uid: 585 - components: - - pos: 9.5,10.5 - parent: 179 - type: Transform - - uid: 597 - components: - - pos: 22.5,-0.5 - parent: 179 - type: Transform - - uid: 598 - components: - - pos: 17.5,-0.5 - parent: 179 - type: Transform - - uid: 599 - components: - - pos: 18.5,-0.5 - parent: 179 - type: Transform - - uid: 600 - components: - - pos: 20.5,-0.5 - parent: 179 - type: Transform - - uid: 601 - components: - - pos: 21.5,-0.5 - parent: 179 - type: Transform - - uid: 602 - components: - - pos: 19.5,-0.5 - parent: 179 - type: Transform - - uid: 603 - components: - - pos: 14.5,3.5 - parent: 179 - type: Transform - - uid: 604 - components: - - pos: 13.5,3.5 - parent: 179 - type: Transform - - uid: 605 - components: - - pos: 12.5,3.5 - parent: 179 - type: Transform - - uid: 606 - components: - - pos: 12.5,2.5 - parent: 179 - type: Transform - - uid: 607 - components: - - pos: 12.5,1.5 - parent: 179 - type: Transform - - uid: 608 - components: - - pos: 12.5,0.5 - parent: 179 - type: Transform - - uid: 609 - components: - - pos: 12.5,-0.5 - parent: 179 - type: Transform - - uid: 610 - components: - - pos: 13.5,-0.5 - parent: 179 - type: Transform - - uid: 611 - components: - - pos: 14.5,-0.5 - parent: 179 - type: Transform - - uid: 612 - components: - - pos: 13.5,-1.5 - parent: 179 - type: Transform - - uid: 613 - components: - - pos: 13.5,-6.5 - parent: 179 - type: Transform - - uid: 614 - components: - - pos: 13.5,-5.5 - parent: 179 - type: Transform - - uid: 615 - components: - - pos: 13.5,-4.5 - parent: 179 - type: Transform - - uid: 616 - components: - - pos: 13.5,-3.5 - parent: 179 - type: Transform - - uid: 617 - components: - - pos: 13.5,-2.5 - parent: 179 - type: Transform - - uid: 618 - components: - - pos: 14.5,-6.5 - parent: 179 - type: Transform - - uid: 619 - components: - - pos: 15.5,-6.5 - parent: 179 - type: Transform - - uid: 620 - components: - - pos: 16.5,-6.5 - parent: 179 - type: Transform - - uid: 621 - components: - - pos: 17.5,-6.5 - parent: 179 - type: Transform - - uid: 622 - components: - - pos: 18.5,-6.5 - parent: 179 - type: Transform - - uid: 623 - components: - - pos: 19.5,-6.5 - parent: 179 - type: Transform - - uid: 624 - components: - - pos: 20.5,-6.5 - parent: 179 - type: Transform - - uid: 625 - components: - - pos: 21.5,-6.5 - parent: 179 - type: Transform - - uid: 626 - components: - - pos: 22.5,-6.5 - parent: 179 - type: Transform - - uid: 627 - components: - - pos: 23.5,-6.5 - parent: 179 - type: Transform - - uid: 628 - components: - - pos: 24.5,-6.5 - parent: 179 - type: Transform - - uid: 629 - components: - - pos: 25.5,-6.5 - parent: 179 - type: Transform - - uid: 630 - components: - - pos: 26.5,-6.5 - parent: 179 - type: Transform - - uid: 631 - components: - - pos: 26.5,-5.5 - parent: 179 - type: Transform - - uid: 632 - components: - - pos: 26.5,-4.5 - parent: 179 - type: Transform - - uid: 633 - components: - - pos: 27.5,-6.5 - parent: 179 - type: Transform - - uid: 634 - components: - - pos: 28.5,-6.5 - parent: 179 - type: Transform - - uid: 635 - components: - - pos: 29.5,-6.5 - parent: 179 - type: Transform - - uid: 636 - components: - - pos: 30.5,-6.5 - parent: 179 - type: Transform - - uid: 637 - components: - - pos: 31.5,-6.5 - parent: 179 - type: Transform - - uid: 638 - components: - - pos: 32.5,-6.5 - parent: 179 - type: Transform - - uid: 639 - components: - - pos: 33.5,-6.5 - parent: 179 - type: Transform - - uid: 640 - components: - - pos: 34.5,-6.5 - parent: 179 - type: Transform - - uid: 641 - components: - - pos: 34.5,-5.5 - parent: 179 - type: Transform - - uid: 642 - components: - - pos: 34.5,-4.5 - parent: 179 - type: Transform - - uid: 643 - components: - - pos: 34.5,-3.5 - parent: 179 - type: Transform - - uid: 644 - components: - - pos: 34.5,-2.5 - parent: 179 - type: Transform - - uid: 645 - components: - - pos: 34.5,-1.5 - parent: 179 - type: Transform - - uid: 646 - components: - - pos: 34.5,-0.5 - parent: 179 - type: Transform - - uid: 647 - components: - - pos: 33.5,-0.5 - parent: 179 - type: Transform - - uid: 648 - components: - - pos: 32.5,-0.5 - parent: 179 - type: Transform - - uid: 649 - components: - - pos: 31.5,-0.5 - parent: 179 - type: Transform - - uid: 650 - components: - - pos: 30.5,-0.5 - parent: 179 - type: Transform - - uid: 651 - components: - - pos: 29.5,-0.5 - parent: 179 - type: Transform - - uid: 652 - components: - - pos: 30.5,0.5 - parent: 179 - type: Transform - - uid: 653 - components: - - pos: 30.5,1.5 - parent: 179 - type: Transform - - uid: 654 - components: - - pos: 30.5,2.5 - parent: 179 - type: Transform - - uid: 655 - components: - - pos: 30.5,3.5 - parent: 179 - type: Transform - - uid: 656 - components: - - pos: 30.5,4.5 - parent: 179 - type: Transform - - uid: 657 - components: - - pos: 29.5,4.5 - parent: 179 - type: Transform - - uid: 658 - components: - - pos: 28.5,4.5 - parent: 179 - type: Transform - - uid: 659 - components: - - pos: 27.5,4.5 - parent: 179 - type: Transform - - uid: 702 - components: - - rot: -1.5707963267948966 rad - pos: -11.5,6.5 - parent: 179 - type: Transform - - uid: 713 - components: - - pos: -7.5,9.5 - parent: 179 - type: Transform - - uid: 714 - components: - - pos: -7.5,10.5 - parent: 179 - type: Transform - - uid: 724 - components: - - pos: -2.5,12.5 - parent: 179 - type: Transform - - uid: 733 - components: - - pos: 4.5,5.5 - parent: 179 - type: Transform - - uid: 734 - components: - - pos: 4.5,4.5 - parent: 179 - type: Transform - - uid: 739 - components: - - pos: 8.5,7.5 - parent: 179 - type: Transform - - uid: 740 - components: - - pos: 8.5,6.5 - parent: 179 - type: Transform - - uid: 741 - components: - - pos: 8.5,5.5 - parent: 179 - type: Transform - - uid: 742 - components: - - pos: 8.5,4.5 - parent: 179 - type: Transform - - uid: 743 - components: - - pos: 8.5,3.5 - parent: 179 - type: Transform - - uid: 745 - components: - - pos: 4.5,7.5 - parent: 179 - type: Transform - - uid: 746 - components: - - pos: 4.5,6.5 - parent: 179 - type: Transform - - uid: 846 - components: - - pos: 2.5,19.5 - parent: 179 - type: Transform - - uid: 847 - components: - - pos: 3.5,19.5 - parent: 179 - type: Transform - - uid: 925 - components: - - rot: -1.5707963267948966 rad - pos: -14.5,17.5 - parent: 179 - type: Transform - - uid: 958 - components: - - rot: 3.141592653589793 rad - pos: 15.5,18.5 - parent: 179 - type: Transform - - uid: 1072 - components: - - pos: 15.5,28.5 - parent: 179 - type: Transform - - uid: 1073 - components: - - pos: 16.5,28.5 - parent: 179 - type: Transform - - uid: 1074 - components: - - pos: 17.5,28.5 - parent: 179 - type: Transform -- proto: WaterTankFull - entities: - - uid: 115 - components: - - pos: 4.5,18.5 - parent: 179 - type: Transform - - uid: 694 - components: - - pos: -2.5,3.5 - parent: 179 - type: Transform -- proto: WeaponCapacitorRecharger - entities: - - uid: 708 - components: - - pos: -0.5,-3.5 - parent: 179 - type: Transform -- proto: WeaponLaserCarbine - entities: - - uid: 188 - components: - - pos: -3.5226438,-0.45543313 - parent: 179 - type: Transform -- proto: WeaponLauncherMultipleRocket - entities: - - uid: 671 - components: - - pos: -13.195735,9.730438 - parent: 179 - type: Transform -- proto: WeaponLauncherRocket - entities: - - uid: 436 - components: - - pos: -3.478273,-1.1611286 - parent: 179 - type: Transform -- proto: WeaponRifleAk - entities: - - uid: 437 - components: - - pos: -3.5018106,0.24183923 - parent: 179 - type: Transform - - uid: 949 - components: - - pos: -12.238617,9.081488 - parent: 179 - type: Transform -- proto: WelderExperimental - entities: - - uid: 343 - components: - - pos: 0.6895334,4.7183027 - parent: 179 - type: Transform -- proto: WeldingFuelTankFull - entities: - - uid: 693 - components: - - pos: -1.5,3.5 - parent: 179 - type: Transform -- proto: Window - entities: - - uid: 111 - components: - - pos: -0.5,-15.5 - parent: 179 - type: Transform - - uid: 194 - components: - - pos: -0.5,-16.5 - parent: 179 - type: Transform - - uid: 230 - components: - - pos: -0.5,-14.5 - parent: 179 - type: Transform - - uid: 1001 - components: - - pos: -3.5,-16.5 - parent: 179 - type: Transform - - uid: 1002 - components: - - pos: -3.5,-15.5 - parent: 179 - type: Transform - - uid: 1003 - components: - - pos: -3.5,-14.5 - parent: 179 - type: Transform - - uid: 1004 - components: - - pos: 2.5,-16.5 - parent: 179 - type: Transform - - uid: 1005 - components: - - pos: 2.5,-15.5 - parent: 179 - type: Transform - - uid: 1006 - components: - - pos: 2.5,-14.5 - parent: 179 - type: Transform -- proto: Wirecutter - entities: - - uid: 359 - components: - - pos: -1.6207478,4.3951616 - parent: 179 - type: Transform -- proto: Wrench - entities: - - uid: 327 - components: - - pos: -0.11783123,4.753312 - parent: 179 - type: Transform -... +meta: + format: 6 + postmapinit: false +tilemap: + 0: Space + 85: FloorSteel + 97: FloorTechMaint + 101: FloorWhite + 113: Lattice + 114: Plating +entities: +- proto: "" + entities: + - uid: 179 + components: + - type: MetaData + - parent: 962 + type: Transform + - chunks: + -1,0: + ind: -1,0 + tiles: VQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,-1: + ind: -1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAA + version: 6 + 0,1: + ind: 0,1 + tiles: cQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 0,0: + ind: 0,0 + tiles: cgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA + version: 6 + 0,-1: + ind: 0,-1 + tiles: cgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAA + version: 6 + 1,-1: + ind: 1,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA + version: 6 + -2,0: + ind: -2,0 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -2,-1: + ind: -2,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAA + version: 6 + 1,0: + ind: 1,0 + tiles: ZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 2,-1: + ind: 2,-1 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 1,1: + ind: 1,1 + tiles: VQAAAAAAVQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,1: + ind: -1,1 + tiles: AAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + 0,-2: + ind: 0,-2 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA + version: 6 + -1,-2: + ind: -1,-2 + tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA + version: 6 + type: MapGrid + - type: Broadphase + - bodyStatus: InAir + angularDamping: 0.05 + linearDamping: 0.05 + fixedRotation: False + bodyType: Dynamic + type: Physics + - fixtures: {} + type: Fixtures + - gravityShakeSound: !type:SoundPathSpecifier + path: /Audio/Effects/alert.ogg + type: Gravity + - chunkCollection: + version: 2 + nodes: [] + type: DecalGrid + - type: OccluderTree + - type: Shuttle + - type: RadiationGridResistance + - shakeTimes: 10 + type: GravityShake + - version: 2 + data: + tiles: + -4,0: + 0: 65535 + -4,1: + 0: 65535 + -3,0: + 0: 65535 + -3,1: + 0: 65535 + -2,0: + 0: 65535 + -2,1: + 0: 65535 + -2,2: + 0: 65535 + -1,0: + 0: 65535 + -1,1: + 0: 65535 + -1,2: + 0: 65535 + -4,-3: + 0: 61440 + -4,-2: + 0: 65535 + -4,-1: + 0: 65535 + -3,-3: + 0: 61440 + -3,-2: + 0: 65535 + -3,-1: + 0: 65535 + -2,-4: + 0: 65520 + -2,-3: + 0: 65535 + -2,-2: + 0: 65535 + -2,-1: + 0: 65535 + -1,-4: + 0: 65520 + 1: 15 + -1,-3: + 0: 65535 + -1,-2: + 0: 65535 + -1,-1: + 0: 65535 + 0,4: + 0: 61183 + 0,5: + 0: 61166 + 0,6: + 0: 14 + 1,4: + 0: 65535 + 1,5: + 0: 65535 + 1,6: + 0: 65535 + 1,7: + 0: 15 + 2,4: + 0: 65535 + 2,5: + 0: 65535 + 2,6: + 0: 4095 + 3,4: + 0: 65535 + 3,5: + 0: 65487 + 2: 48 + 3,6: + 0: 53247 + 3,7: + 0: 12 + 0,0: + 0: 65535 + 0,1: + 0: 65535 + 0,2: + 0: 65535 + 0,3: + 0: 65535 + 1,0: + 0: 65535 + 1,1: + 0: 65535 + 1,2: + 0: 65535 + 1,3: + 0: 65535 + 2,0: + 0: 4369 + 2,2: + 0: 65535 + 2,3: + 0: 65535 + 3,0: + 0: 65535 + 3,2: + 0: 65535 + 3,3: + 0: 65535 + 3,1: + 0: 61166 + 0,-4: + 0: 65520 + 1: 7 + 0,-3: + 0: 65535 + 0,-2: + 0: 65535 + 0,-1: + 0: 65535 + 1,-4: + 0: 30576 + 1,-3: + 0: 65399 + 1,-2: + 0: 63359 + 1,-1: + 0: 65535 + 2,-2: + 0: 4096 + 2,-1: + 0: 4369 + 3,-1: + 0: 65262 + 3,-2: + 0: 61152 + 4,-2: + 0: 65520 + 4,-1: + 0: 65535 + 5,-2: + 0: 65520 + 5,-1: + 0: 65535 + 6,-2: + 0: 65520 + 6,-1: + 0: 65535 + 7,-2: + 0: 65520 + 7,-1: + 0: 65535 + -5,0: + 0: 52428 + -5,-3: + 0: 32768 + -5,-2: + 0: 51336 + -5,-1: + 0: 52428 + 4,0: + 0: 65535 + 4,1: + 0: 65535 + 4,2: + 0: 65535 + 4,3: + 0: 65535 + 5,0: + 0: 65535 + 5,1: + 0: 65535 + 5,2: + 0: 65535 + 5,3: + 0: 65535 + 6,0: + 0: 65535 + 6,1: + 0: 65535 + 6,2: + 0: 65535 + 6,3: + 0: 63351 + 7,0: + 0: 30583 + 7,1: + 0: 4375 + 7,2: + 0: 4369 + 7,3: + 0: 4096 + 8,-2: + 0: 30576 + 8,-1: + 0: 30583 + 4,4: + 0: 30583 + 4,5: + 0: 30583 + 4,6: + 0: 30583 + 4,7: + 0: 7 + -4,2: + 0: 26367 + -1,3: + 0: 15 + 2,1: + 0: 4369 + -5,1: + 0: 52428 + -4,3: + 0: 26222 + -3,3: + 0: 15 + -2,3: + 0: 15 + -4,4: + 0: 238 + -3,4: + 0: 255 + -2,4: + 0: 255 + -1,4: + 0: 255 + -5,2: + 0: 204 + -3,2: + 0: 35071 + 0,-5: + 1: 28672 + -1,-5: + 1: 61440 + uniqueMixes: + - volume: 2500 + temperature: 293.15 + moles: + - 21.824879 + - 82.10312 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - volume: 2500 + temperature: 293.15 + moles: + - 24.8172 + - 93.35994 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + chunkSize: 4 + type: GridAtmosphere + - type: GasTileOverlay + - id: Dev + type: BecomesStation + - type: SpreaderGrid + - type: GridPathfinding + - uid: 962 + components: + - type: MetaData + - type: Transform + - type: Map + - type: PhysicsMap + - type: Broadphase + - type: OccluderTree + - type: LoadedMap + - type: GridTree + - type: MovedGrids +- proto: AdvancedCapacitorStockPart + entities: + - uid: 700 + components: + - pos: -3.8324947,8.786524 + parent: 179 + type: Transform +- proto: AirAlarm + entities: + - uid: 800 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-4.5 + parent: 179 + type: Transform + - devices: + - 801 + type: DeviceList +- proto: AirCanister + entities: + - uid: 458 + components: + - pos: 7.5,-0.5 + parent: 179 + type: Transform +- proto: Airlock + entities: + - uid: 48 + components: + - pos: 7.5,20.5 + parent: 179 + type: Transform + - uid: 119 + components: + - pos: 6.5,17.5 + parent: 179 + type: Transform + - uid: 170 + components: + - pos: 13.5,10.5 + parent: 179 + type: Transform + - uid: 378 + components: + - pos: -9.5,0.5 + parent: 179 + type: Transform +- proto: AirlockCargo + entities: + - uid: 87 + components: + - pos: 2.5,-4.5 + parent: 179 + type: Transform +- proto: AirlockEngineering + entities: + - uid: 257 + components: + - pos: -7.5,-6.5 + parent: 179 + type: Transform + - uid: 258 + components: + - pos: 3.5,-4.5 + parent: 179 + type: Transform + - uid: 530 + components: + - pos: -10.5,-6.5 + parent: 179 + type: Transform + - uid: 563 + components: + - pos: -13.5,0.5 + parent: 179 + type: Transform + - uid: 867 + components: + - pos: -12.5,0.5 + parent: 179 + type: Transform +- proto: AirlockExternal + entities: + - uid: 155 + components: + - pos: 26.5,13.5 + parent: 179 + type: Transform + - uid: 203 + components: + - pos: 0.5,-14.5 + parent: 179 + type: Transform + - uid: 255 + components: + - pos: 7.5,-8.5 + parent: 179 + type: Transform + - uid: 256 + components: + - pos: 5.5,-8.5 + parent: 179 + type: Transform + - uid: 318 + components: + - pos: 24.5,13.5 + parent: 179 + type: Transform +- proto: AirlockExternalGlass + entities: + - uid: 216 + components: + - pos: -1.5,-14.5 + parent: 179 + type: Transform +- proto: AirlockGlassShuttle + entities: + - uid: 146 + components: + - rot: -1.5707963267948966 rad + pos: -17.5,9.5 + parent: 179 + type: Transform + - uid: 204 + components: + - pos: -1.5,-16.5 + parent: 179 + type: Transform +- proto: AirlockMedicalGlass + entities: + - uid: 177 + components: + - pos: 26.5,4.5 + parent: 179 + type: Transform + - uid: 178 + components: + - pos: 20.5,3.5 + parent: 179 + type: Transform + - uid: 206 + components: + - pos: 16.5,3.5 + parent: 179 + type: Transform + - uid: 207 + components: + - pos: 15.5,3.5 + parent: 179 + type: Transform + - uid: 369 + components: + - pos: 26.5,-3.5 + parent: 179 + type: Transform + - uid: 370 + components: + - pos: 28.5,-0.5 + parent: 179 + type: Transform +- proto: AirlockScience + entities: + - uid: 24 + components: + - pos: 14.5,24.5 + parent: 179 + type: Transform + - uid: 47 + components: + - pos: 16.5,18.5 + parent: 179 + type: Transform + - uid: 102 + components: + - pos: 16.5,15.5 + parent: 179 + type: Transform + - uid: 306 + components: + - pos: 12.5,15.5 + parent: 179 + type: Transform +- proto: AirlockScienceGlass + entities: + - uid: 26 + components: + - pos: 14.5,20.5 + parent: 179 + type: Transform +- proto: AirlockShuttle + entities: + - uid: 116 + components: + - pos: 0.5,-16.5 + parent: 179 + type: Transform +- proto: AirSensor + entities: + - uid: 801 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-3.5 + parent: 179 + type: Transform +- proto: AlwaysPoweredLightLED + entities: + - uid: 59 + components: + - pos: -14.5,-0.5 + parent: 179 + type: Transform + - uid: 330 + components: + - rot: -1.5707963267948966 rad + pos: -8.5,8.5 + parent: 179 + type: Transform + - uid: 398 + components: + - pos: 4.5,-5.5 + parent: 179 + type: Transform + - uid: 451 + components: + - rot: -1.5707963267948966 rad + pos: -8.5,9.5 + parent: 179 + type: Transform + - uid: 512 + components: + - rot: 3.141592653589793 rad + pos: -14.5,6.5 + parent: 179 + type: Transform + - uid: 662 + components: + - pos: 11.5,14.5 + parent: 179 + type: Transform + - uid: 664 + components: + - rot: 3.141592653589793 rad + pos: 22.5,12.5 + parent: 179 + type: Transform + - uid: 667 + components: + - rot: -1.5707963267948966 rad + pos: 8.5,10.5 + parent: 179 + type: Transform + - uid: 669 + components: + - rot: -1.5707963267948966 rad + pos: -17.5,4.5 + parent: 179 + type: Transform + - uid: 852 + components: + - rot: 1.5707963267948966 rad + pos: -6.5,0.5 + parent: 179 + type: Transform + - uid: 907 + components: + - pos: -4.5,-5.5 + parent: 179 + type: Transform + - uid: 910 + components: + - rot: 3.141592653589793 rad + pos: -2.5,-3.5 + parent: 179 + type: Transform + - uid: 913 + components: + - rot: 3.141592653589793 rad + pos: 5.5,-3.5 + parent: 179 + type: Transform + - uid: 914 + components: + - pos: 4.5,3.5 + parent: 179 + type: Transform + - uid: 915 + components: + - pos: 6.5,7.5 + parent: 179 + type: Transform + - uid: 916 + components: + - rot: -1.5707963267948966 rad + pos: 3.5,7.5 + parent: 179 + type: Transform + - uid: 917 + components: + - pos: -2.5,10.5 + parent: 179 + type: Transform + - uid: 918 + components: + - pos: 3.5,18.5 + parent: 179 + type: Transform + - uid: 921 + components: + - rot: 3.141592653589793 rad + pos: -13.5,1.5 + parent: 179 + type: Transform + - uid: 922 + components: + - rot: -1.5707963267948966 rad + pos: 0.5,16.5 + parent: 179 + type: Transform + - uid: 923 + components: + - rot: 3.141592653589793 rad + pos: -7.5,12.5 + parent: 179 + type: Transform + - uid: 924 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,6.5 + parent: 179 + type: Transform + - uid: 926 + components: + - rot: 1.5707963267948966 rad + pos: -13.5,17.5 + parent: 179 + type: Transform + - uid: 953 + components: + - pos: -14.5,16.5 + parent: 179 + type: Transform + - uid: 957 + components: + - rot: 3.141592653589793 rad + pos: 11.5,16.5 + parent: 179 + type: Transform +- proto: AlwaysPoweredWallLight + entities: + - uid: 1047 + components: + - rot: 3.141592653589793 rad + pos: -0.5,-13.5 + parent: 179 + type: Transform +- proto: AnomalyLocator + entities: + - uid: 1086 + components: + - pos: 17.237877,19.653782 + parent: 179 + type: Transform +- proto: AnomalyScanner + entities: + - uid: 1085 + components: + - pos: 17.539398,19.352007 + parent: 179 + type: Transform +- proto: APCBasic + entities: + - uid: 753 + components: + - pos: -2.5,11.5 + parent: 179 + type: Transform + - startingCharge: 500000000 + maxCharge: 500000000 + type: Battery + - supplyRampRate: 50000 + supplyRampTolerance: 100000 + maxSupply: 1000000 + maxChargeRate: 500000 + type: PowerNetworkBattery + - uid: 1015 + components: + - rot: 3.141592653589793 rad + pos: -5.5,-14.5 + parent: 179 + type: Transform +- proto: AtmosDeviceFanTiny + entities: + - uid: 992 + components: + - pos: -1.5,-16.5 + parent: 179 + type: Transform + - uid: 993 + components: + - pos: 0.5,-16.5 + parent: 179 + type: Transform +- proto: Autolathe + entities: + - uid: 1 + components: + - pos: 12.5,21.5 + parent: 179 + type: Transform + - uid: 94 + components: + - pos: -4.5,-5.5 + parent: 179 + type: Transform + - uid: 446 + components: + - pos: -6.5,5.5 + parent: 179 + type: Transform + - uid: 528 + components: + - pos: -12.5,-7.5 + parent: 179 + type: Transform + - uid: 531 + components: + - pos: -13.5,-7.5 + parent: 179 + type: Transform + - uid: 532 + components: + - pos: -14.5,-7.5 + parent: 179 + type: Transform +- proto: BaseUplinkRadioDebug + entities: + - uid: 732 + components: + - pos: 0.6038008,7.5209107 + parent: 179 + type: Transform +- proto: Basketball + entities: + - uid: 951 + components: + - pos: -9.702013,9.68404 + parent: 179 + type: Transform + - uid: 952 + components: + - pos: -10.879096,9.579802 + parent: 179 + type: Transform +- proto: Beaker + entities: + - uid: 174 + components: + - pos: 25.291822,10.667244 + parent: 179 + type: Transform + - uid: 175 + components: + - pos: 24.541822,10.635994 + parent: 179 + type: Transform + - uid: 176 + components: + - pos: 26.416822,10.651619 + parent: 179 + type: Transform + - uid: 324 + components: + - pos: 4.718221,9.39097 + parent: 179 + type: Transform + - uid: 735 + components: + - pos: 4.739054,9.807927 + parent: 179 + type: Transform + - uid: 920 + components: + - pos: -4.293744,10.966518 + parent: 179 + type: Transform + - uid: 950 + components: + - pos: -4.293744,10.966518 + parent: 179 + type: Transform +- proto: BikeHorn + entities: + - uid: 672 + components: + - pos: 1.1246341,7.500063 + parent: 179 + type: Transform +- proto: BlastDoor + entities: + - uid: 202 + components: + - pos: -2.5,-14.5 + parent: 179 + type: Transform + - links: + - 1013 + type: DeviceLinkSink + - uid: 697 + components: + - pos: 1.5,-14.5 + parent: 179 + type: Transform + - links: + - 1014 + type: DeviceLinkSink + - uid: 698 + components: + - pos: 1.5,-16.5 + parent: 179 + type: Transform + - links: + - 1014 + type: DeviceLinkSink + - uid: 984 + components: + - pos: -2.5,-16.5 + parent: 179 + type: Transform + - links: + - 1013 + type: DeviceLinkSink +- proto: BoozeDispenser + entities: + - uid: 752 + components: + - pos: 7.5,12.5 + parent: 179 + type: Transform +- proto: BoxBeaker + entities: + - uid: 280 + components: + - pos: 5.163024,9.63072 + parent: 179 + type: Transform +- proto: Brutepack + entities: + - uid: 150 + components: + - pos: 18.601385,5.512907 + parent: 179 + type: Transform + - uid: 151 + components: + - pos: 18.476385,4.841032 + parent: 179 + type: Transform +- proto: Bucket + entities: + - uid: 691 + components: + - pos: 7.1447573,15.900927 + parent: 179 + type: Transform +- proto: CableApcExtension + entities: + - uid: 15 + components: + - pos: 5.5,15.5 + parent: 179 + type: Transform + - uid: 23 + components: + - pos: 3.5,15.5 + parent: 179 + type: Transform + - uid: 58 + components: + - pos: 8.5,15.5 + parent: 179 + type: Transform + - uid: 90 + components: + - pos: 4.5,15.5 + parent: 179 + type: Transform + - uid: 281 + components: + - pos: -13.5,4.5 + parent: 179 + type: Transform + - uid: 389 + components: + - pos: 7.5,15.5 + parent: 179 + type: Transform + - uid: 453 + components: + - pos: 6.5,15.5 + parent: 179 + type: Transform + - uid: 736 + components: + - pos: -2.5,9.5 + parent: 179 + type: Transform + - uid: 760 + components: + - pos: -2.5,10.5 + parent: 179 + type: Transform + - uid: 761 + components: + - pos: -15.5,5.5 + parent: 179 + type: Transform + - uid: 763 + components: + - pos: -2.5,11.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 764 + components: + - pos: -1.5,11.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 765 + components: + - pos: -7.5,0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 766 + components: + - pos: -0.5,11.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 767 + components: + - pos: -3.5,10.5 + parent: 179 + type: Transform + - uid: 768 + components: + - pos: -4.5,10.5 + parent: 179 + type: Transform + - uid: 769 + components: + - pos: -5.5,10.5 + parent: 179 + type: Transform + - uid: 770 + components: + - pos: -6.5,10.5 + parent: 179 + type: Transform + - uid: 771 + components: + - pos: -2.5,8.5 + parent: 179 + type: Transform + - uid: 772 + components: + - pos: -2.5,7.5 + parent: 179 + type: Transform + - uid: 773 + components: + - pos: -2.5,6.5 + parent: 179 + type: Transform + - uid: 774 + components: + - pos: -2.5,5.5 + parent: 179 + type: Transform + - uid: 775 + components: + - pos: -3.5,5.5 + parent: 179 + type: Transform + - uid: 776 + components: + - pos: -4.5,5.5 + parent: 179 + type: Transform + - uid: 777 + components: + - pos: -5.5,5.5 + parent: 179 + type: Transform + - uid: 778 + components: + - pos: -6.5,5.5 + parent: 179 + type: Transform + - uid: 779 + components: + - pos: -6.5,4.5 + parent: 179 + type: Transform + - uid: 780 + components: + - pos: -7.5,4.5 + parent: 179 + type: Transform + - uid: 781 + components: + - pos: -8.5,4.5 + parent: 179 + type: Transform + - uid: 782 + components: + - pos: -9.5,4.5 + parent: 179 + type: Transform + - uid: 783 + components: + - pos: -10.5,4.5 + parent: 179 + type: Transform + - uid: 784 + components: + - pos: -11.5,4.5 + parent: 179 + type: Transform + - uid: 785 + components: + - pos: -12.5,4.5 + parent: 179 + type: Transform + - uid: 786 + components: + - pos: -12.5,3.5 + parent: 179 + type: Transform + - uid: 787 + components: + - pos: -12.5,2.5 + parent: 179 + type: Transform + - uid: 788 + components: + - pos: -12.5,1.5 + parent: 179 + type: Transform + - uid: 789 + components: + - pos: -12.5,0.5 + parent: 179 + type: Transform + - uid: 790 + components: + - pos: -12.5,-0.5 + parent: 179 + type: Transform + - uid: 791 + components: + - pos: -2.5,4.5 + parent: 179 + type: Transform + - uid: 792 + components: + - pos: -2.5,2.5 + parent: 179 + type: Transform + - uid: 793 + components: + - pos: -2.5,1.5 + parent: 179 + type: Transform + - uid: 794 + components: + - pos: -2.5,0.5 + parent: 179 + type: Transform + - uid: 795 + components: + - pos: -2.5,3.5 + parent: 179 + type: Transform + - uid: 796 + components: + - pos: -2.5,-0.5 + parent: 179 + type: Transform + - uid: 797 + components: + - pos: -2.5,-1.5 + parent: 179 + type: Transform + - uid: 798 + components: + - pos: -2.5,-2.5 + parent: 179 + type: Transform + - uid: 799 + components: + - pos: -2.5,-3.5 + parent: 179 + type: Transform + - uid: 802 + components: + - pos: -8.5,0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 803 + components: + - pos: 2.5,-2.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 804 + components: + - pos: 2.5,-3.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 805 + components: + - pos: -9.5,0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 806 + components: + - pos: -10.5,0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 807 + components: + - pos: -14.5,0.5 + parent: 179 + type: Transform + - uid: 808 + components: + - pos: -11.5,0.5 + parent: 179 + type: Transform + - uid: 809 + components: + - pos: -15.5,0.5 + parent: 179 + type: Transform + - uid: 810 + components: + - pos: -15.5,0.5 + parent: 179 + type: Transform + - uid: 811 + components: + - pos: -16.5,0.5 + parent: 179 + type: Transform + - uid: 812 + components: + - pos: -16.5,5.5 + parent: 179 + type: Transform + - uid: 813 + components: + - pos: -16.5,4.5 + parent: 179 + type: Transform + - uid: 814 + components: + - pos: -16.5,3.5 + parent: 179 + type: Transform + - uid: 815 + components: + - pos: -16.5,2.5 + parent: 179 + type: Transform + - uid: 816 + components: + - pos: -16.5,1.5 + parent: 179 + type: Transform + - uid: 817 + components: + - pos: 7.5,5.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 818 + components: + - pos: 7.5,7.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 819 + components: + - pos: 7.5,8.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 820 + components: + - pos: 7.5,9.5 + parent: 179 + type: Transform + - uid: 821 + components: + - pos: 8.5,9.5 + parent: 179 + type: Transform + - uid: 822 + components: + - pos: 6.5,9.5 + parent: 179 + type: Transform + - uid: 823 + components: + - pos: 5.5,9.5 + parent: 179 + type: Transform + - uid: 824 + components: + - pos: 4.5,9.5 + parent: 179 + type: Transform + - uid: 825 + components: + - pos: 8.5,10.5 + parent: 179 + type: Transform + - uid: 826 + components: + - pos: 8.5,11.5 + parent: 179 + type: Transform + - uid: 827 + components: + - pos: 8.5,12.5 + parent: 179 + type: Transform + - uid: 828 + components: + - pos: 7.5,12.5 + parent: 179 + type: Transform + - uid: 829 + components: + - pos: 7.5,11.5 + parent: 179 + type: Transform + - uid: 830 + components: + - pos: 2.5,-5.5 + parent: 179 + type: Transform + - uid: 831 + components: + - pos: 2.5,-4.5 + parent: 179 + type: Transform + - uid: 832 + components: + - pos: 1.5,-5.5 + parent: 179 + type: Transform + - uid: 833 + components: + - pos: 0.5,-5.5 + parent: 179 + type: Transform + - uid: 834 + components: + - pos: -0.5,-5.5 + parent: 179 + type: Transform + - uid: 835 + components: + - pos: -1.5,-5.5 + parent: 179 + type: Transform + - uid: 836 + components: + - pos: -2.5,-5.5 + parent: 179 + type: Transform + - uid: 837 + components: + - pos: -3.5,-5.5 + parent: 179 + type: Transform + - uid: 838 + components: + - pos: -4.5,-5.5 + parent: 179 + type: Transform + - uid: 839 + components: + - pos: 1.5,11.5 + parent: 179 + type: Transform + - uid: 840 + components: + - pos: 2.5,11.5 + parent: 179 + type: Transform + - uid: 841 + components: + - pos: 0.5,11.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 842 + components: + - pos: 2.5,12.5 + parent: 179 + type: Transform + - uid: 843 + components: + - pos: 2.5,13.5 + parent: 179 + type: Transform + - uid: 844 + components: + - pos: 2.5,14.5 + parent: 179 + type: Transform + - uid: 845 + components: + - pos: 2.5,15.5 + parent: 179 + type: Transform + - uid: 853 + components: + - pos: -3.5,-3.5 + parent: 179 + type: Transform + - uid: 854 + components: + - pos: -4.5,-3.5 + parent: 179 + type: Transform + - uid: 855 + components: + - pos: -5.5,-3.5 + parent: 179 + type: Transform + - uid: 856 + components: + - pos: -6.5,-3.5 + parent: 179 + type: Transform + - uid: 857 + components: + - pos: -6.5,-2.5 + parent: 179 + type: Transform + - uid: 858 + components: + - pos: -6.5,-1.5 + parent: 179 + type: Transform + - uid: 859 + components: + - pos: -6.5,-0.5 + parent: 179 + type: Transform + - uid: 860 + components: + - pos: -6.5,0.5 + parent: 179 + type: Transform + - uid: 861 + components: + - pos: -6.5,1.5 + parent: 179 + type: Transform + - uid: 862 + components: + - pos: -6.5,2.5 + parent: 179 + type: Transform + - uid: 872 + components: + - pos: 7.5,6.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 877 + components: + - pos: -6.5,3.5 + parent: 179 + type: Transform + - uid: 878 + components: + - pos: -2.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 879 + components: + - pos: -1.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 880 + components: + - pos: -0.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 881 + components: + - pos: 0.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 882 + components: + - pos: 1.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 883 + components: + - pos: 2.5,-4.5 + parent: 179 + type: Transform + - uid: 884 + components: + - pos: 3.5,-4.5 + parent: 179 + type: Transform + - uid: 885 + components: + - pos: 4.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 886 + components: + - pos: 5.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 887 + components: + - pos: 6.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 888 + components: + - pos: 7.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 889 + components: + - pos: 8.5,-4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 890 + components: + - pos: 8.5,-3.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 891 + components: + - pos: 8.5,-2.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 892 + components: + - pos: 8.5,-1.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 893 + components: + - pos: 8.5,-0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 894 + components: + - pos: 8.5,0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 895 + components: + - pos: 8.5,1.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 896 + components: + - pos: 8.5,2.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 897 + components: + - pos: 8.5,3.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 898 + components: + - pos: 8.5,4.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 899 + components: + - pos: 8.5,5.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 900 + components: + - pos: -14.5,5.5 + parent: 179 + type: Transform + - uid: 905 + components: + - pos: -12.5,5.5 + parent: 179 + type: Transform + - uid: 906 + components: + - pos: -14.5,4.5 + parent: 179 + type: Transform + - uid: 908 + components: + - pos: -15.5,4.5 + parent: 179 + type: Transform + - uid: 970 + components: + - pos: 9.5,12.5 + parent: 179 + type: Transform + - uid: 971 + components: + - pos: 10.5,12.5 + parent: 179 + type: Transform + - uid: 972 + components: + - pos: 11.5,12.5 + parent: 179 + type: Transform + - uid: 973 + components: + - pos: 12.5,12.5 + parent: 179 + type: Transform + - uid: 974 + components: + - pos: 13.5,12.5 + parent: 179 + type: Transform + - uid: 1026 + components: + - pos: -5.5,-14.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1027 + components: + - pos: -5.5,-13.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1028 + components: + - pos: -5.5,-12.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1029 + components: + - pos: -4.5,-12.5 + parent: 179 + type: Transform + - uid: 1030 + components: + - pos: -3.5,-12.5 + parent: 179 + type: Transform + - uid: 1031 + components: + - pos: -2.5,-12.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1032 + components: + - pos: -1.5,-12.5 + parent: 179 + type: Transform + - uid: 1033 + components: + - pos: -0.5,-12.5 + parent: 179 + type: Transform + - uid: 1034 + components: + - pos: 0.5,-12.5 + parent: 179 + type: Transform + - uid: 1035 + components: + - pos: 1.5,-12.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1036 + components: + - pos: 2.5,-12.5 + parent: 179 + type: Transform + - uid: 1037 + components: + - pos: 3.5,-12.5 + parent: 179 + type: Transform + - uid: 1038 + components: + - pos: 0.5,-13.5 + parent: 179 + type: Transform + - uid: 1039 + components: + - pos: 0.5,-14.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1040 + components: + - pos: 0.5,-15.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1041 + components: + - pos: -1.5,-13.5 + parent: 179 + type: Transform + - uid: 1042 + components: + - pos: -1.5,-14.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1043 + components: + - pos: -1.5,-15.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1044 + components: + - pos: 4.5,-12.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1045 + components: + - pos: 4.5,-13.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1051 + components: + - pos: 9.5,15.5 + parent: 179 + type: Transform + - uid: 1052 + components: + - pos: 9.5,16.5 + parent: 179 + type: Transform + - uid: 1053 + components: + - pos: 9.5,17.5 + parent: 179 + type: Transform + - uid: 1054 + components: + - pos: 9.5,18.5 + parent: 179 + type: Transform + - uid: 1055 + components: + - pos: 9.5,19.5 + parent: 179 + type: Transform + - uid: 1056 + components: + - pos: 9.5,20.5 + parent: 179 + type: Transform + - uid: 1057 + components: + - pos: 10.5,20.5 + parent: 179 + type: Transform + - uid: 1058 + components: + - pos: 11.5,20.5 + parent: 179 + type: Transform + - uid: 1059 + components: + - pos: 12.5,20.5 + parent: 179 + type: Transform + - uid: 1060 + components: + - pos: 13.5,20.5 + parent: 179 + type: Transform + - uid: 1061 + components: + - pos: 14.5,20.5 + parent: 179 + type: Transform + - uid: 1062 + components: + - pos: 15.5,20.5 + parent: 179 + type: Transform + - uid: 1063 + components: + - pos: 16.5,20.5 + parent: 179 + type: Transform + - uid: 1064 + components: + - pos: 16.5,21.5 + parent: 179 + type: Transform + - uid: 1065 + components: + - pos: 16.5,22.5 + parent: 179 + type: Transform + - uid: 1066 + components: + - pos: 16.5,23.5 + parent: 179 + type: Transform + - uid: 1067 + components: + - pos: 16.5,24.5 + parent: 179 + type: Transform + - uid: 1068 + components: + - pos: 16.5,25.5 + parent: 179 + type: Transform + - uid: 1069 + components: + - pos: 16.5,26.5 + parent: 179 + type: Transform + - uid: 1070 + components: + - pos: 16.5,27.5 + parent: 179 + type: Transform + - uid: 1079 + components: + - pos: 15.5,24.5 + parent: 179 + type: Transform + - uid: 1080 + components: + - pos: 14.5,24.5 + parent: 179 + type: Transform + - uid: 1081 + components: + - pos: 13.5,24.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1082 + components: + - pos: 12.5,24.5 + parent: 179 + type: Transform + - uid: 1097 + components: + - pos: 8.5,14.5 + parent: 179 + type: Transform + - uid: 1098 + components: + - pos: 8.5,13.5 + parent: 179 + type: Transform + - uid: 1099 + components: + - pos: 9.5,13.5 + parent: 179 + type: Transform + - uid: 1100 + components: + - pos: 10.5,13.5 + parent: 179 + type: Transform + - uid: 1101 + components: + - pos: 11.5,13.5 + parent: 179 + type: Transform + - uid: 1102 + components: + - pos: 12.5,13.5 + parent: 179 + type: Transform + - uid: 1103 + components: + - pos: 13.5,13.5 + parent: 179 + type: Transform + - uid: 1104 + components: + - pos: 14.5,13.5 + parent: 179 + type: Transform + - uid: 1105 + components: + - pos: 15.5,13.5 + parent: 179 + type: Transform + - uid: 1106 + components: + - pos: 16.5,13.5 + parent: 179 + type: Transform + - uid: 1107 + components: + - pos: 17.5,13.5 + parent: 179 + type: Transform + - uid: 1108 + components: + - pos: 18.5,13.5 + parent: 179 + type: Transform + - uid: 1109 + components: + - pos: 19.5,13.5 + parent: 179 + type: Transform + - uid: 1110 + components: + - pos: 20.5,13.5 + parent: 179 + type: Transform + - uid: 1111 + components: + - pos: 21.5,13.5 + parent: 179 + type: Transform + - uid: 1112 + components: + - pos: 22.5,13.5 + parent: 179 + type: Transform + - uid: 1113 + components: + - pos: 23.5,13.5 + parent: 179 + type: Transform + - uid: 1114 + components: + - pos: 24.5,13.5 + parent: 179 + type: Transform + - uid: 1115 + components: + - pos: 25.5,13.5 + parent: 179 + type: Transform + - uid: 1116 + components: + - pos: 16.5,12.5 + parent: 179 + type: Transform + - uid: 1117 + components: + - pos: 16.5,11.5 + parent: 179 + type: Transform + - uid: 1118 + components: + - pos: 16.5,10.5 + parent: 179 + type: Transform + - uid: 1119 + components: + - pos: 16.5,9.5 + parent: 179 + type: Transform + - uid: 1120 + components: + - pos: 16.5,8.5 + parent: 179 + type: Transform + - uid: 1121 + components: + - pos: 16.5,7.5 + parent: 179 + type: Transform + - uid: 1122 + components: + - pos: 16.5,6.5 + parent: 179 + type: Transform + - uid: 1123 + components: + - pos: 16.5,5.5 + parent: 179 + type: Transform + - uid: 1124 + components: + - pos: 16.5,4.5 + parent: 179 + type: Transform + - uid: 1125 + components: + - pos: 16.5,3.5 + parent: 179 + type: Transform + - uid: 1126 + components: + - pos: 16.5,2.5 + parent: 179 + type: Transform + - uid: 1127 + components: + - pos: 16.5,1.5 + parent: 179 + type: Transform + - uid: 1128 + components: + - pos: 16.5,0.5 + parent: 179 + type: Transform + - uid: 1129 + components: + - pos: 16.5,-0.5 + parent: 179 + type: Transform + - uid: 1130 + components: + - pos: 16.5,-1.5 + parent: 179 + type: Transform + - uid: 1131 + components: + - pos: 16.5,-2.5 + parent: 179 + type: Transform + - uid: 1132 + components: + - pos: 16.5,-3.5 + parent: 179 + type: Transform + - uid: 1133 + components: + - pos: 17.5,-3.5 + parent: 179 + type: Transform + - uid: 1134 + components: + - pos: 18.5,-3.5 + parent: 179 + type: Transform + - uid: 1135 + components: + - pos: 19.5,-3.5 + parent: 179 + type: Transform + - uid: 1136 + components: + - pos: 20.5,-3.5 + parent: 179 + type: Transform + - uid: 1137 + components: + - pos: 21.5,-3.5 + parent: 179 + type: Transform + - uid: 1138 + components: + - pos: 22.5,-3.5 + parent: 179 + type: Transform + - uid: 1139 + components: + - pos: 23.5,-3.5 + parent: 179 + type: Transform + - uid: 1140 + components: + - pos: 24.5,-3.5 + parent: 179 + type: Transform + - uid: 1141 + components: + - pos: 25.5,-3.5 + parent: 179 + type: Transform + - uid: 1142 + components: + - pos: 26.5,-3.5 + parent: 179 + type: Transform + - uid: 1143 + components: + - pos: 27.5,-3.5 + parent: 179 + type: Transform + - uid: 1144 + components: + - pos: 28.5,-3.5 + parent: 179 + type: Transform + - uid: 1145 + components: + - pos: 17.5,2.5 + parent: 179 + type: Transform + - uid: 1146 + components: + - pos: 18.5,2.5 + parent: 179 + type: Transform + - uid: 1147 + components: + - pos: 19.5,2.5 + parent: 179 + type: Transform + - uid: 1148 + components: + - pos: 20.5,2.5 + parent: 179 + type: Transform + - uid: 1149 + components: + - pos: 21.5,2.5 + parent: 179 + type: Transform + - uid: 1150 + components: + - pos: 22.5,2.5 + parent: 179 + type: Transform + - uid: 1151 + components: + - pos: 23.5,2.5 + parent: 179 + type: Transform + - uid: 1152 + components: + - pos: 24.5,2.5 + parent: 179 + type: Transform + - uid: 1153 + components: + - pos: 25.5,2.5 + parent: 179 + type: Transform + - uid: 1154 + components: + - pos: 26.5,2.5 + parent: 179 + type: Transform + - uid: 1155 + components: + - pos: 27.5,2.5 + parent: 179 + type: Transform + - uid: 1156 + components: + - pos: 28.5,2.5 + parent: 179 + type: Transform + - uid: 1157 + components: + - pos: 26.5,3.5 + parent: 179 + type: Transform + - uid: 1158 + components: + - pos: 26.5,4.5 + parent: 179 + type: Transform + - uid: 1159 + components: + - pos: 26.5,5.5 + parent: 179 + type: Transform + - uid: 1160 + components: + - pos: 26.5,6.5 + parent: 179 + type: Transform + - uid: 1161 + components: + - pos: 26.5,7.5 + parent: 179 + type: Transform + - uid: 1162 + components: + - pos: 26.5,8.5 + parent: 179 + type: Transform + - uid: 1163 + components: + - pos: 26.5,9.5 + parent: 179 + type: Transform + - uid: 1164 + components: + - pos: 25.5,9.5 + parent: 179 + type: Transform + - uid: 1165 + components: + - pos: 24.5,9.5 + parent: 179 + type: Transform + - uid: 1166 + components: + - pos: 16.5,19.5 + parent: 179 + type: Transform + - uid: 1167 + components: + - pos: 16.5,18.5 + parent: 179 + type: Transform + - uid: 1168 + components: + - pos: 16.5,17.5 + parent: 179 + type: Transform + - uid: 1169 + components: + - pos: 16.5,16.5 + parent: 179 + type: Transform + - uid: 1170 + components: + - pos: 16.5,15.5 + parent: 179 + type: Transform + - uid: 1171 + components: + - pos: 16.5,14.5 + parent: 179 + type: Transform +- proto: CableApcStack + entities: + - uid: 70 + components: + - pos: 10.577456,21.424059 + parent: 179 + type: Transform + - uid: 183 + components: + - pos: -6.6863613,7.351646 + parent: 179 + type: Transform + - uid: 351 + components: + - pos: 10.561831,21.767809 + parent: 179 + type: Transform + - uid: 537 + components: + - pos: -15.5,-0.5 + parent: 179 + type: Transform + - uid: 538 + components: + - pos: -15.5,-0.5 + parent: 179 + type: Transform +- proto: CableHV + entities: + - uid: 1019 + components: + - pos: -6.5,-13.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1020 + components: + - pos: -6.5,-12.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1021 + components: + - pos: -6.5,-11.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: CableHVStack + entities: + - uid: 184 + components: + - pos: -6.665528,7.840053 + parent: 179 + type: Transform +- proto: CableMV + entities: + - uid: 1023 + components: + - pos: -6.5,-13.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1024 + components: + - pos: -5.5,-13.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound + - uid: 1025 + components: + - pos: -5.5,-14.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: CableMVStack + entities: + - uid: 325 + components: + - pos: -6.665528,7.5601244 + parent: 179 + type: Transform +- proto: CableTerminal + entities: + - uid: 1022 + components: + - pos: -6.5,-11.5 + parent: 179 + type: Transform +- proto: CapacitorStockPart + entities: + - uid: 701 + components: + - pos: -3.2804112,8.786524 + parent: 179 + type: Transform +- proto: CaptainIDCard + entities: + - uid: 726 + components: + - pos: 1.0820513,8.752605 + parent: 179 + type: Transform +- proto: CaptainSabre + entities: + - uid: 381 + components: + - pos: -3.277628,-2.15838 + parent: 179 + type: Transform +- proto: Catwalk + entities: + - uid: 2 + components: + - pos: 13.5,24.5 + parent: 179 + type: Transform + - uid: 7 + components: + - pos: 6.5,24.5 + parent: 179 + type: Transform + - uid: 20 + components: + - pos: 6.5,20.5 + parent: 179 + type: Transform + - uid: 120 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,18.5 + parent: 179 + type: Transform + - uid: 246 + components: + - pos: -6.5,-6.5 + parent: 179 + type: Transform + - uid: 247 + components: + - pos: -8.5,-6.5 + parent: 179 + type: Transform + - uid: 252 + components: + - pos: 4.5,-8.5 + parent: 179 + type: Transform + - uid: 269 + components: + - pos: 12.5,10.5 + parent: 179 + type: Transform + - uid: 286 + components: + - pos: 2.5,-11.5 + parent: 179 + type: Transform + - uid: 287 + components: + - pos: -4.5,-11.5 + parent: 179 + type: Transform + - uid: 308 + components: + - pos: -2.5,-12.5 + parent: 179 + type: Transform + - uid: 309 + components: + - pos: 1.5,-12.5 + parent: 179 + type: Transform + - uid: 333 + components: + - pos: 4.5,-13.5 + parent: 179 + type: Transform + - uid: 334 + components: + - pos: -5.5,-13.5 + parent: 179 + type: Transform + - uid: 345 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,0.5 + parent: 179 + type: Transform + - uid: 346 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,1.5 + parent: 179 + type: Transform + - uid: 347 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,2.5 + parent: 179 + type: Transform + - uid: 348 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,3.5 + parent: 179 + type: Transform + - uid: 349 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,4.5 + parent: 179 + type: Transform + - uid: 403 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-0.5 + parent: 179 + type: Transform + - uid: 404 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-1.5 + parent: 179 + type: Transform + - uid: 405 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-2.5 + parent: 179 + type: Transform + - uid: 406 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-3.5 + parent: 179 + type: Transform + - uid: 407 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-4.5 + parent: 179 + type: Transform + - uid: 408 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-5.5 + parent: 179 + type: Transform + - uid: 409 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-6.5 + parent: 179 + type: Transform + - uid: 410 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-7.5 + parent: 179 + type: Transform + - uid: 411 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-8.5 + parent: 179 + type: Transform + - uid: 412 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-9.5 + parent: 179 + type: Transform + - uid: 413 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-10.5 + parent: 179 + type: Transform + - uid: 414 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 9.5,-11.5 + parent: 179 + type: Transform + - uid: 415 + components: + - anchored: False + rot: -1.5707963267949 rad + pos: 8.5,-8.5 + parent: 179 + type: Transform + - uid: 438 + components: + - rot: 3.141592653589793 rad + pos: -9.5,-0.5 + parent: 179 + type: Transform + - uid: 442 + components: + - pos: -9.5,8.5 + parent: 179 + type: Transform + - uid: 514 + components: + - pos: -10.5,8.5 + parent: 179 + type: Transform + - uid: 541 + components: + - pos: -11.5,-6.5 + parent: 179 + type: Transform + - uid: 542 + components: + - pos: -9.5,-6.5 + parent: 179 + type: Transform + - uid: 695 + components: + - rot: 3.141592653589793 rad + pos: -8.5,8.5 + parent: 179 + type: Transform +- proto: Chair + entities: + - uid: 580 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,6.5 + parent: 179 + type: Transform + - uid: 581 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,8.5 + parent: 179 + type: Transform + - uid: 582 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,7.5 + parent: 179 + type: Transform +- proto: ChairOfficeDark + entities: + - uid: 380 + components: + - rot: 3.1415926535897967 rad + pos: 0.5,-6.5 + parent: 179 + type: Transform +- proto: ChairOfficeLight + entities: + - uid: 576 + components: + - rot: 4.71238898038469 rad + pos: 19.5,4.5 + parent: 179 + type: Transform + - uid: 577 + components: + - rot: 3.141592653589793 rad + pos: 20.5,5.5 + parent: 179 + type: Transform + - uid: 578 + components: + - rot: 4.71238898038469 rad + pos: 23.5,8.5 + parent: 179 + type: Transform + - uid: 579 + components: + - pos: 24.5,5.5 + parent: 179 + type: Transform +- proto: chem_master + entities: + - uid: 311 + components: + - pos: 8.5,11.5 + parent: 179 + type: Transform +- proto: ChemDispenser + entities: + - uid: 583 + components: + - pos: 23.5,9.5 + parent: 179 + type: Transform + - containers: + ReagentDispenser-beaker: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + machine_board: !type:Container + showEnts: False + occludes: True + ents: [] + machine_parts: !type:Container + showEnts: False + occludes: True + ents: [] + beakerSlot: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + type: ContainerContainer + - uid: 750 + components: + - pos: 7.5,11.5 + parent: 179 + type: Transform +- proto: ChemicalPayload + entities: + - uid: 432 + components: + - pos: 6.4651074,9.828774 + parent: 179 + type: Transform +- proto: ChemMasterMachineCircuitboard + entities: + - uid: 718 + components: + - pos: -4.5458,10.514079 + parent: 179 + type: Transform +- proto: CircuitImprinter + entities: + - uid: 332 + components: + - pos: -6.5,4.5 + parent: 179 + type: Transform +- proto: ClosetEmergencyFilledRandom + entities: + - uid: 319 + components: + - pos: 1.5,-10.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 322 + components: + - pos: 0.5,-10.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: ClosetToolFilled + entities: + - uid: 524 + components: + - pos: -11.5,-5.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 525 + components: + - pos: -11.5,-4.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 526 + components: + - pos: -11.5,-3.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 527 + components: + - pos: -11.5,-2.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: ClothingBeltUtilityFilled + entities: + - uid: 427 + components: + - pos: -1.895102,-10.33495 + parent: 179 + type: Transform + - uid: 428 + components: + - pos: -1.770102,-10.63182 + parent: 179 + type: Transform +- proto: ClothingHandsGlovesColorYellow + entities: + - uid: 454 + components: + - pos: -0.78741443,4.322194 + parent: 179 + type: Transform +- proto: ClothingHeadHatWelding + entities: + - uid: 344 + components: + - pos: 0.7198646,4.374314 + parent: 179 + type: Transform +- proto: ClothingMaskBreath + entities: + - uid: 955 + components: + - pos: -10.595239,6.1907988 + parent: 179 + type: Transform +- proto: ClothingMaskGas + entities: + - uid: 425 + components: + - pos: -0.2880585,-10.69432 + parent: 179 + type: Transform +- proto: ClothingOuterHardsuitAtmos + entities: + - uid: 270 + components: + - pos: -10.5426235,5.472399 + parent: 179 + type: Transform +- proto: ClothingOuterVest + entities: + - uid: 426 + components: + - pos: -0.9130585,-10.66307 + parent: 179 + type: Transform +- proto: ClothingShoesBootsMag + entities: + - uid: 725 + components: + - pos: 0.47880077,8.073378 + parent: 179 + type: Transform +- proto: ClothingUniformJumpsuitEngineering + entities: + - uid: 424 + components: + - pos: -0.6474335,-10.27245 + parent: 179 + type: Transform +- proto: ClownPDA + entities: + - uid: 91 + components: + - pos: -15.5,2.5 + parent: 179 + type: Transform + - uid: 762 + components: + - pos: -14.5,1.5 + parent: 179 + type: Transform + - uid: 864 + components: + - pos: -14.5,2.5 + parent: 179 + type: Transform + - uid: 912 + components: + - pos: -15.5,1.5 + parent: 179 + type: Transform +- proto: ComputerAnalysisConsole + entities: + - uid: 1083 + components: + - rot: 1.5707963267948966 rad + pos: 15.5,23.5 + parent: 179 + type: Transform + - linkedPorts: + 1078: + - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver + type: DeviceLinkSource +- proto: ComputerCargoOrders + entities: + - uid: 326 + components: + - pos: 0.5,-5.5 + parent: 179 + type: Transform + - uid: 996 + components: + - pos: -1.5,-11.5 + parent: 179 + type: Transform +- proto: ComputerCargoShuttle + entities: + - uid: 995 + components: + - pos: 0.5,-11.5 + parent: 179 + type: Transform +- proto: ComputerMedicalRecords + entities: + - uid: 152 + components: + - rot: 3.141592653589793 rad + pos: 22.5,-5.5 + parent: 179 + type: Transform + - uid: 591 + components: + - pos: 21.5,5.5 + parent: 179 + type: Transform +- proto: ComputerResearchAndDevelopment + entities: + - uid: 88 + components: + - rot: 1.5707963267948966 rad + pos: 8.5,19.5 + parent: 179 + type: Transform +- proto: ComputerShuttleCargo + entities: + - uid: 994 + components: + - pos: -0.5,-11.5 + parent: 179 + type: Transform +- proto: ComputerTechnologyDiskTerminal + entities: + - uid: 1088 + components: + - pos: 13.5,16.5 + parent: 179 + type: Transform +- proto: ConveyorBelt + entities: + - uid: 195 + components: + - pos: -2.5,-15.5 + parent: 179 + type: Transform + - links: + - 699 + type: DeviceLinkSink + - uid: 259 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-14.5 + parent: 179 + type: Transform + - links: + - 983 + type: DeviceLinkSink + - uid: 463 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-16.5 + parent: 179 + type: Transform + - links: + - 983 + type: DeviceLinkSink + - uid: 677 + components: + - pos: -2.5,-14.5 + parent: 179 + type: Transform + - uid: 716 + components: + - rot: -1.5707963267948966 rad + pos: -1.5,11.5 + parent: 179 + type: Transform + - links: + - 722 + type: DeviceLinkSink + - uid: 720 + components: + - rot: -1.5707963267948966 rad + pos: -0.5,11.5 + parent: 179 + type: Transform + - links: + - 722 + type: DeviceLinkSink + - uid: 721 + components: + - rot: -1.5707963267948966 rad + pos: 0.5,11.5 + parent: 179 + type: Transform + - links: + - 722 + type: DeviceLinkSink + - uid: 985 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-13.5 + parent: 179 + type: Transform + - links: + - 983 + type: DeviceLinkSink + - uid: 989 + components: + - rot: 3.141592653589793 rad + pos: 1.5,-15.5 + parent: 179 + type: Transform + - links: + - 983 + type: DeviceLinkSink + - uid: 990 + components: + - pos: -2.5,-13.5 + parent: 179 + type: Transform + - links: + - 699 + type: DeviceLinkSink + - uid: 991 + components: + - pos: -2.5,-16.5 + parent: 179 + type: Transform + - links: + - 699 + type: DeviceLinkSink +- proto: CrateEngineeringToolbox + entities: + - uid: 692 + components: + - pos: -0.5,3.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: CrateGeneric + entities: + - uid: 266 + components: + - pos: 5.5,-6.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: CrateHydroponicsSeeds + entities: + - uid: 754 + components: + - pos: 2.5,12.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: CrateHydroponicsTools + entities: + - uid: 755 + components: + - pos: 2.5,13.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: CrateMedical + entities: + - uid: 131 + components: + - pos: 31.5,-1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 132 + components: + - pos: 32.5,-1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: Crowbar + entities: + - uid: 147 + components: + - pos: -2.172831,4.5306726 + parent: 179 + type: Transform + - uid: 423 + components: + - pos: -2.861032,-5.524786 + parent: 179 + type: Transform +- proto: DebugBatteryDischarger + entities: + - uid: 711 + components: + - pos: 0.5,-3.5 + parent: 179 + type: Transform +- proto: DisposalPipe + entities: + - uid: 717 + components: + - rot: 1.5707963267948966 rad + pos: -0.5,10.5 + parent: 179 + type: Transform +- proto: DisposalTrunk + entities: + - uid: 285 + components: + - rot: -1.5707963267948966 rad + pos: 0.5,10.5 + parent: 179 + type: Transform + - uid: 715 + components: + - rot: 1.5707963267948966 rad + pos: -1.5,10.5 + parent: 179 + type: Transform +- proto: DisposalUnit + entities: + - uid: 719 + components: + - pos: -1.5,10.5 + parent: 179 + type: Transform +- proto: DrinkBeerglass + entities: + - uid: 688 + components: + - pos: 3.1981986,5.733985 + parent: 179 + type: Transform +- proto: DrinkColaCan + entities: + - uid: 690 + components: + - pos: 3.8231986,6.150942 + parent: 179 + type: Transform +- proto: Dropper + entities: + - uid: 730 + components: + - pos: 5.892191,9.4118185 + parent: 179 + type: Transform +- proto: EmergencyOxygenTankFilled + entities: + - uid: 956 + components: + - pos: -10.505015,6.711994 + parent: 179 + type: Transform +- proto: ExGrenade + entities: + - uid: 433 + components: + - pos: -3.7704864,-1.6163371 + parent: 179 + type: Transform +- proto: ExplosivePayload + entities: + - uid: 668 + components: + - pos: 6.829691,9.4118185 + parent: 179 + type: Transform +- proto: FaxMachineCaptain + entities: + - uid: 967 + components: + - pos: 9.5,12.5 + parent: 179 + type: Transform +- proto: FaxMachineCentcom + entities: + - uid: 968 + components: + - pos: 11.5,12.5 + parent: 179 + type: Transform +- proto: FaxMachineSyndie + entities: + - uid: 969 + components: + - pos: 13.5,12.5 + parent: 179 + type: Transform +- proto: FemtoManipulatorStockPart + entities: + - uid: 712 + components: + - pos: -6.7434506,8.817795 + parent: 179 + type: Transform +- proto: FireExtinguisher + entities: + - uid: 323 + components: + - pos: -1.297692,-5.396082 + parent: 179 + type: Transform + - uid: 868 + components: + - pos: -14.5,-1.5 + parent: 179 + type: Transform +- proto: FlashlightLantern + entities: + - uid: 421 + components: + - pos: -1.934832,-5.154238 + parent: 179 + type: Transform + - uid: 422 + components: + - pos: 1.1350493,8.198464 + parent: 179 + type: Transform +- proto: FloorLavaEntity + entities: + - uid: 134 + components: + - pos: -13.5,-3.5 + parent: 179 + type: Transform + - uid: 135 + components: + - pos: -14.5,-3.5 + parent: 179 + type: Transform + - uid: 141 + components: + - pos: -13.5,-2.5 + parent: 179 + type: Transform + - uid: 469 + components: + - pos: -14.5,-2.5 + parent: 179 + type: Transform +- proto: FloorWaterEntity + entities: + - uid: 136 + components: + - pos: -12.5,-2.5 + parent: 179 + type: Transform + - uid: 137 + components: + - pos: -12.5,-3.5 + parent: 179 + type: Transform +- proto: FoodApple + entities: + - uid: 16 + components: + - pos: 3.9853282,16.430082 + parent: 179 + type: Transform + - uid: 849 + components: + - pos: 3.7249117,16.242453 + parent: 179 + type: Transform + - uid: 866 + components: + - pos: 3.651995,16.55517 + parent: 179 + type: Transform +- proto: FoodBurgerBacon + entities: + - uid: 689 + components: + - pos: 3.3844857,6.0702233 + parent: 179 + type: Transform +- proto: FoodCarrot + entities: + - uid: 850 + components: + - pos: 3.6023045,15.67151 + parent: 179 + type: Transform + - uid: 851 + components: + - pos: 3.620745,15.015423 + parent: 179 + type: Transform + - uid: 863 + components: + - pos: 3.620745,14.389988 + parent: 179 + type: Transform +- proto: FoodPizzaPineapple + entities: + - uid: 687 + components: + - pos: 3.5215416,6.799056 + parent: 179 + type: Transform +- proto: GasAnalyzer + entities: + - uid: 876 + components: + - pos: 4.4732866,-0.48882532 + parent: 179 + type: Transform +- proto: GasFilter + entities: + - uid: 480 + components: + - rot: -1.5707963267948966 rad + pos: 3.5,-3.5 + parent: 179 + type: Transform +- proto: GasMixer + entities: + - uid: 747 + components: + - rot: -1.5707963267948966 rad + pos: 3.5,-2.5 + parent: 179 + type: Transform +- proto: GasOutletInjector + entities: + - uid: 429 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,-1.5 + parent: 179 + type: Transform +- proto: GasPipeBend + entities: + - uid: 727 + components: + - rot: -1.5707963267948966 rad + pos: 5.5,-0.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: GasPipeFourway + entities: + - uid: 728 + components: + - pos: 5.5,-1.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: GasPipeStraight + entities: + - uid: 749 + components: + - rot: -1.5707963267948966 rad + pos: 5.5,-3.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: GasPipeTJunction + entities: + - uid: 748 + components: + - pos: 5.5,-2.5 + parent: 179 + type: Transform + - enabled: True + type: AmbientSound +- proto: GasPort + entities: + - uid: 457 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,-0.5 + parent: 179 + type: Transform +- proto: GasPressurePump + entities: + - uid: 171 + components: + - rot: -1.5707963267948966 rad + pos: 4.5,-3.5 + parent: 179 + type: Transform +- proto: GasValve + entities: + - uid: 168 + components: + - rot: -1.5707963267948966 rad + pos: 4.5,-2.5 + parent: 179 + type: Transform +- proto: GasVentPump + entities: + - uid: 729 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,-3.5 + parent: 179 + type: Transform + - enabled: False + type: AmbientSound +- proto: GasVentScrubber + entities: + - uid: 452 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,-2.5 + parent: 179 + type: Transform + - enabled: False + type: AmbientSound +- proto: GasVolumePump + entities: + - uid: 160 + components: + - rot: -1.5707963267948966 rad + pos: 4.5,-1.5 + parent: 179 + type: Transform +- proto: GeigerCounter + entities: + - uid: 759 + components: + - pos: 1.760596,4.5697265 + parent: 179 + type: Transform +- proto: GravityGenerator + entities: + - uid: 744 + components: + - pos: 6.5,6.5 + parent: 179 + type: Transform +- proto: Grille + entities: + - uid: 108 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,23.5 + parent: 179 + type: Transform + - uid: 986 + components: + - pos: -0.5,-16.5 + parent: 179 + type: Transform + - uid: 987 + components: + - pos: -0.5,-15.5 + parent: 179 + type: Transform + - uid: 988 + components: + - pos: -0.5,-14.5 + parent: 179 + type: Transform + - uid: 1007 + components: + - pos: -3.5,-16.5 + parent: 179 + type: Transform + - uid: 1008 + components: + - pos: -3.5,-15.5 + parent: 179 + type: Transform + - uid: 1009 + components: + - pos: -3.5,-14.5 + parent: 179 + type: Transform + - uid: 1010 + components: + - pos: 2.5,-16.5 + parent: 179 + type: Transform + - uid: 1011 + components: + - pos: 2.5,-15.5 + parent: 179 + type: Transform + - uid: 1012 + components: + - pos: 2.5,-14.5 + parent: 179 + type: Transform + - uid: 1089 + components: + - pos: 8.5,17.5 + parent: 179 + type: Transform + - uid: 1090 + components: + - pos: 9.5,17.5 + parent: 179 + type: Transform + - uid: 1091 + components: + - pos: 10.5,17.5 + parent: 179 + type: Transform + - uid: 1092 + components: + - pos: 10.5,16.5 + parent: 179 + type: Transform +- proto: Handcuffs + entities: + - uid: 331 + components: + - pos: -3.5805476,0.74100244 + parent: 179 + type: Transform +- proto: HandheldHealthAnalyzer + entities: + - uid: 513 + components: + - pos: -5.9808183,-3.6614444 + parent: 179 + type: Transform +- proto: HoloFan + entities: + - uid: 142 + components: + - pos: -8.5,7.5 + parent: 179 + type: Transform + missingComponents: + - TimedDespawn + - uid: 901 + components: + - pos: -10.5,7.5 + parent: 179 + type: Transform + missingComponents: + - TimedDespawn + - uid: 902 + components: + - pos: -9.5,7.5 + parent: 179 + type: Transform + missingComponents: + - TimedDespawn +- proto: HolosignWetFloor + entities: + - uid: 848 + components: + - pos: -13.5,2.5 + parent: 179 + type: Transform + - fixtures: {} + type: Fixtures + missingComponents: + - TimedDespawn + - uid: 911 + components: + - pos: -13.5,1.5 + parent: 179 + type: Transform + - fixtures: {} + type: Fixtures + missingComponents: + - TimedDespawn +- proto: hydroponicsTray + entities: + - uid: 756 + components: + - pos: 2.5,14.5 + parent: 179 + type: Transform + - uid: 757 + components: + - pos: 2.5,15.5 + parent: 179 + type: Transform +- proto: KitchenReagentGrinder + entities: + - uid: 731 + components: + - pos: 8.5,9.5 + parent: 179 + type: Transform +- proto: LargeBeaker + entities: + - uid: 210 + components: + - pos: 4.3272614,9.338851 + parent: 179 + type: Transform + - uid: 253 + components: + - pos: 23.494947,7.0422435 + parent: 179 + type: Transform + - uid: 402 + components: + - pos: 23.510572,7.7141185 + parent: 179 + type: Transform + - uid: 737 + components: + - pos: 4.2969,9.828774 + parent: 179 + type: Transform +- proto: LedLightTube + entities: + - uid: 481 + components: + - pos: -3.511025,-10.35149 + parent: 179 + type: Transform +- proto: LockerBotanistFilled + entities: + - uid: 869 + components: + - pos: 2.5,16.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerChemistry + entities: + - uid: 127 + components: + - pos: 27.5,6.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerChemistryFilled + entities: + - uid: 297 + components: + - pos: 7.5,9.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerChiefEngineerFilled + entities: + - uid: 447 + components: + - pos: 7.5,2.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerElectricalSuppliesFilled + entities: + - uid: 444 + components: + - pos: 7.5,3.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerEngineerFilled + entities: + - uid: 490 + components: + - pos: 7.5,4.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerMedical + entities: + - uid: 128 + components: + - pos: 27.5,5.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 129 + components: + - pos: 29.5,-1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage + - uid: 130 + components: + - pos: 30.5,-1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerMedicalFilled + entities: + - uid: 865 + components: + - pos: -6.5,-3.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerMedicineFilled + entities: + - uid: 562 + components: + - pos: -5.5,-3.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerSalvageSpecialistFilled + entities: + - uid: 493 + components: + - pos: -10.5,4.5 + parent: 179 + type: Transform + - locked: False + type: Lock + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerSyndicatePersonalFilled + entities: + - uid: 909 + components: + - pos: -7.5,1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerWardenFilled + entities: + - uid: 873 + components: + - pos: -8.5,1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: LockerWeldingSuppliesFilled + entities: + - uid: 871 + components: + - pos: 7.5,1.5 + parent: 179 + type: Transform + - air: + volume: 200 + immutable: False + temperature: 293.14957 + moles: + - 2.9923203 + - 11.2568245 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + - 0 + type: EntityStorage +- proto: MachineAnomalyGenerator + entities: + - uid: 1071 + components: + - pos: 16.5,25.5 + parent: 179 + type: Transform + - enabled: False + type: AmbientSound +- proto: MachineAnomalyVessel + entities: + - uid: 1087 + components: + - pos: 15.5,19.5 + parent: 179 + type: Transform +- proto: MachineArtifactAnalyzer + entities: + - uid: 1078 + components: + - rot: 1.5707963267948966 rad + pos: 12.5,24.5 + parent: 179 + type: Transform + - links: + - 1083 + type: DeviceLinkSink +- proto: MachineFrame + entities: + - uid: 533 + components: + - pos: -5.5,10.5 + parent: 179 + type: Transform +- proto: MedicalScanner + entities: + - uid: 592 + components: + - pos: 18.5,-1.5 + parent: 179 + type: Transform + - containers: + MedicalScanner-bodyContainer: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + machine_board: !type:Container + showEnts: False + occludes: True + ents: [] + machine_parts: !type:Container + showEnts: False + occludes: True + ents: [] + scanner-bodyContainer: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + type: ContainerContainer + - uid: 593 + components: + - pos: 18.5,-5.5 + parent: 179 + type: Transform + - containers: + MedicalScanner-bodyContainer: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + machine_board: !type:Container + showEnts: False + occludes: True + ents: [] + machine_parts: !type:Container + showEnts: False + occludes: True + ents: [] + scanner-bodyContainer: !type:ContainerSlot + showEnts: False + occludes: True + ent: null + type: ContainerContainer +- proto: MedkitFilled + entities: + - uid: 153 + components: + - pos: 13.632214,1.5673001 + parent: 179 + type: Transform + - uid: 154 + components: + - pos: 13.460339,0.6141751 + parent: 179 + type: Transform + - uid: 321 + components: + - pos: 3.8440318,4.425983 + parent: 179 + type: Transform +- proto: MicroManipulatorStockPart + entities: + - uid: 484 + components: + - pos: -5.5039105,8.838643 + parent: 179 + type: Transform + - uid: 959 + components: + - pos: -4.752078,10.904018 + parent: 179 + type: Transform +- proto: ModularGrenade + entities: + - uid: 435 + components: + - pos: 6.829691,9.860046 + parent: 179 + type: Transform +- proto: MopBucket + entities: + - uid: 696 + components: + - pos: 7.5,16.5 + parent: 179 + type: Transform +- proto: MopItem + entities: + - uid: 328 + components: + - pos: 7.6382103,16.08618 + parent: 179 + type: Transform + - solutions: + absorbed: + temperature: 293.15 + canMix: False + canReact: True + maxVol: 50 + reagents: + - data: null + ReagentId: Water + Quantity: 25 + type: SolutionContainerManager +- proto: Multitool + entities: + - uid: 307 + components: + - pos: -1.249865,-10.43489 + parent: 179 + type: Transform + - uid: 430 + components: + - pos: -0.6298993,4.7431083 + parent: 179 + type: Transform + - devices: + 'UID: 31739': 801 + type: NetworkConfigurator +- proto: NanoManipulatorStockPart + entities: + - uid: 456 + components: + - pos: -5.920577,8.817795 + parent: 179 + type: Transform +- proto: NitrogenCanister + entities: + - uid: 459 + components: + - pos: 7.5,-1.5 + parent: 179 + type: Transform +- proto: Ointment + entities: + - uid: 148 + components: + - pos: 18.77326,6.653532 + parent: 179 + type: Transform + - uid: 149 + components: + - pos: 18.49201,6.059782 + parent: 179 + type: Transform +- proto: OxygenCanister + entities: + - uid: 340 + components: + - pos: 7.5,-3.5 + parent: 179 + type: Transform +- proto: PaperBin10 + entities: + - uid: 977 + components: + - pos: 10.5,12.5 + parent: 179 + type: Transform +- proto: PartRodMetal + entities: + - uid: 133 + components: + - pos: -3.4717777,7.672426 + parent: 179 + type: Transform +- proto: Pen + entities: + - uid: 978 + components: + - pos: 10.893699,12.7794075 + parent: 179 + type: Transform + - uid: 979 + components: + - pos: 10.862433,12.602201 + parent: 179 + type: Transform +- proto: PicoManipulatorStockPart + entities: + - uid: 455 + components: + - pos: -6.337244,8.838643 + parent: 179 + type: Transform +- proto: PlasmaCanister + entities: + - uid: 461 + components: + - pos: 7.5,-2.5 + parent: 179 + type: Transform +- proto: PlasticFlapsAirtightClear + entities: + - uid: 997 + components: + - pos: -2.5,-16.5 + parent: 179 + type: Transform + - uid: 998 + components: + - pos: -2.5,-14.5 + parent: 179 + type: Transform + - uid: 999 + components: + - pos: 1.5,-16.5 + parent: 179 + type: Transform + - uid: 1000 + components: + - pos: 1.5,-14.5 + parent: 179 + type: Transform +- proto: PortableGeneratorSuperPacman + entities: + - uid: 1016 + components: + - pos: -6.5,-11.5 + parent: 179 + type: Transform +- proto: PowerCellHigh + entities: + - uid: 567 + components: + - pos: -4.76583,8.265328 + parent: 179 + type: Transform +- proto: PowerCellHyper + entities: + - uid: 703 + components: + - pos: -4.3179135,8.275752 + parent: 179 + type: Transform +- proto: PowerCellMedium + entities: + - uid: 186 + components: + - pos: -2.67511,-10.351 + parent: 179 + type: Transform + - uid: 187 + components: + - pos: -2.55011,-10.6635 + parent: 179 + type: Transform + - uid: 360 + components: + - pos: -3.7970803,8.275752 + parent: 179 + type: Transform +- proto: PowerCellRecharger + entities: + - uid: 709 + components: + - pos: -1.5,-3.5 + parent: 179 + type: Transform +- proto: PowerCellSmall + entities: + - uid: 705 + components: + - pos: -3.3182633,8.234056 + parent: 179 + type: Transform +- proto: Poweredlight + entities: + - uid: 93 + components: + - rot: 3.141592653589793 rad + pos: 31.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 536 + components: + - rot: -1.5707963267948966 rad + pos: -11.5,-0.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 660 + components: + - rot: -1.5707963267948966 rad + pos: 29.5,1.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 661 + components: + - rot: -1.5707963267948966 rad + pos: 27.5,7.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 663 + components: + - pos: 22.5,2.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 666 + components: + - rot: 1.5707963267948966 rad + pos: 2.5,23.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 670 + components: + - rot: -1.5707963267948966 rad + pos: 13.5,18.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 673 + components: + - rot: -1.5707963267948966 rad + pos: -11.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 674 + components: + - rot: 1.5707963267948966 rad + pos: -15.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 675 + components: + - rot: 1.5707963267948966 rad + pos: -15.5,-0.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 676 + components: + - rot: 1.5707963267948966 rad + pos: -6.5,-10.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 678 + components: + - rot: -1.5707963267948966 rad + pos: 7.5,-1.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 680 + components: + - rot: 3.141592653589793 rad + pos: 16.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 681 + components: + - rot: 3.141592653589793 rad + pos: 23.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 682 + components: + - pos: 13.5,2.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 683 + components: + - rot: 3.141592653589793 rad + pos: 17.5,4.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 1075 + components: + - pos: 16.5,27.5 + parent: 179 + type: Transform + - enabled: False + type: AmbientSound + - uid: 1076 + components: + - rot: 1.5707963267948966 rad + pos: 15.5,22.5 + parent: 179 + type: Transform + - enabled: False + type: AmbientSound +- proto: PoweredSmallLight + entities: + - uid: 163 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,26.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 166 + components: + - rot: 1.5707963267948966 rad + pos: 11.5,24.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 167 + components: + - rot: -1.5707963267948966 rad + pos: 17.5,17.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 388 + components: + - pos: 0.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 417 + components: + - pos: -4.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 483 + components: + - rot: -1.5707963267948966 rad + pos: 4.5,-9.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver + - uid: 534 + components: + - rot: 1.5707963267948966 rad + pos: -9.5,-5.5 + parent: 179 + type: Transform + - powerLoad: 0 + type: ApcPowerReceiver +- proto: Protolathe + entities: + - uid: 12 + components: + - pos: 13.5,21.5 + parent: 179 + type: Transform + - uid: 384 + components: + - pos: -6.5,6.5 + parent: 179 + type: Transform +- proto: QuadraticCapacitorStockPart + entities: + - uid: 704 + components: + - pos: -4.8741612,8.817795 + parent: 179 + type: Transform +- proto: Railing + entities: + - uid: 665 + components: + - rot: 3.141592653589793 rad + pos: -15.5,9.5 + parent: 179 + type: Transform + - uid: 927 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,10.5 + parent: 179 + type: Transform + - uid: 928 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,11.5 + parent: 179 + type: Transform + - uid: 929 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,12.5 + parent: 179 + type: Transform + - uid: 930 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,13.5 + parent: 179 + type: Transform + - uid: 931 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,14.5 + parent: 179 + type: Transform + - uid: 932 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,15.5 + parent: 179 + type: Transform + - uid: 933 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,16.5 + parent: 179 + type: Transform + - uid: 934 + components: + - rot: 3.141592653589793 rad + pos: -13.5,17.5 + parent: 179 + type: Transform + - uid: 935 + components: + - rot: 3.141592653589793 rad + pos: -12.5,17.5 + parent: 179 + type: Transform + - uid: 936 + components: + - rot: 3.141592653589793 rad + pos: -11.5,17.5 + parent: 179 + type: Transform + - uid: 937 + components: + - rot: 3.141592653589793 rad + pos: -10.5,17.5 + parent: 179 + type: Transform + - uid: 938 + components: + - rot: 3.141592653589793 rad + pos: -9.5,17.5 + parent: 179 + type: Transform + - uid: 939 + components: + - rot: 3.141592653589793 rad + pos: -8.5,17.5 + parent: 179 + type: Transform + - uid: 940 + components: + - rot: 3.141592653589793 rad + pos: -7.5,17.5 + parent: 179 + type: Transform + - uid: 941 + components: + - rot: 3.141592653589793 rad + pos: -6.5,17.5 + parent: 179 + type: Transform + - uid: 942 + components: + - rot: 3.141592653589793 rad + pos: -5.5,17.5 + parent: 179 + type: Transform + - uid: 943 + components: + - rot: 3.141592653589793 rad + pos: -4.5,17.5 + parent: 179 + type: Transform + - uid: 944 + components: + - rot: 3.141592653589793 rad + pos: -3.5,17.5 + parent: 179 + type: Transform + - uid: 945 + components: + - rot: 3.141592653589793 rad + pos: -2.5,17.5 + parent: 179 + type: Transform + - uid: 946 + components: + - rot: 3.141592653589793 rad + pos: -1.5,17.5 + parent: 179 + type: Transform + - uid: 947 + components: + - rot: 3.141592653589793 rad + pos: -0.5,17.5 + parent: 179 + type: Transform + - uid: 948 + components: + - rot: 3.141592653589793 rad + pos: 0.5,17.5 + parent: 179 + type: Transform +- proto: RailingCornerSmall + entities: + - uid: 919 + components: + - pos: -14.5,9.5 + parent: 179 + type: Transform +- proto: ReinforcedWindow + entities: + - uid: 1084 + components: + - rot: 1.5707963267948966 rad + pos: 14.5,23.5 + parent: 179 + type: Transform + - uid: 1093 + components: + - pos: 8.5,17.5 + parent: 179 + type: Transform + - uid: 1094 + components: + - pos: 9.5,17.5 + parent: 179 + type: Transform + - uid: 1095 + components: + - pos: 10.5,17.5 + parent: 179 + type: Transform + - uid: 1096 + components: + - pos: 10.5,16.5 + parent: 179 + type: Transform +- proto: ResearchAndDevelopmentServer + entities: + - uid: 17 + components: + - pos: 8.5,18.5 + parent: 179 + type: Transform +- proto: ResearchDiskDebug + entities: + - uid: 54 + components: + - pos: 9.532393,18.446417 + parent: 179 + type: Transform +- proto: RubberStampCaptain + entities: + - uid: 982 + components: + - pos: 12.800895,12.664745 + parent: 179 + type: Transform +- proto: RubberStampCentcom + entities: + - uid: 980 + components: + - pos: 12.186007,12.716865 + parent: 179 + type: Transform +- proto: RubberStampSyndicate + entities: + - uid: 981 + components: + - pos: 12.436131,12.550082 + parent: 179 + type: Transform +- proto: Screwdriver + entities: + - uid: 431 + components: + - pos: -1.235331,4.739151 + parent: 179 + type: Transform +- proto: SeedExtractor + entities: + - uid: 65 + components: + - pos: 2.5,17.5 + parent: 179 + type: Transform +- proto: SheetGlass + entities: + - uid: 354 + components: + - pos: 8.57603,21.566113 + parent: 179 + type: Transform + - uid: 479 + components: + - pos: -5.13758,7.5586076 + parent: 179 + type: Transform + - uid: 529 + components: + - pos: -15.5,-3.5 + parent: 179 + type: Transform + - uid: 564 + components: + - pos: -15.5,-1.5 + parent: 179 + type: Transform + - uid: 565 + components: + - pos: -15.5,-1.5 + parent: 179 + type: Transform + - uid: 566 + components: + - pos: -15.5,-3.5 + parent: 179 + type: Transform +- proto: SheetGlass1 + entities: + - uid: 960 + components: + - pos: -3.981244,10.799851 + parent: 179 + type: Transform +- proto: SheetPGlass + entities: + - uid: 416 + components: + - pos: -0.5,8.5 + parent: 179 + type: Transform +- proto: SheetPlasma + entities: + - uid: 1077 + components: + - pos: 17.485096,24.503635 + parent: 179 + type: Transform +- proto: SheetPlasteel + entities: + - uid: 478 + components: + - pos: -4.0129576,7.6107273 + parent: 179 + type: Transform +- proto: SheetPlastic + entities: + - uid: 79 + components: + - pos: 8.951309,21.511908 + parent: 179 + type: Transform + - uid: 181 + components: + - pos: -4.54383,7.579455 + parent: 179 + type: Transform +- proto: SheetRPGlass + entities: + - uid: 182 + components: + - pos: -0.5,7.5 + parent: 179 + type: Transform +- proto: SheetSteel + entities: + - uid: 205 + components: + - pos: -15.5,-5.5 + parent: 179 + type: Transform + - uid: 305 + components: + - pos: 9.435405,21.503613 + parent: 179 + type: Transform + - uid: 382 + components: + - pos: -15.5,-5.5 + parent: 179 + type: Transform + - uid: 473 + components: + - pos: -5.6834707,7.529523 + parent: 179 + type: Transform + - uid: 543 + components: + - pos: -15.5,-4.5 + parent: 179 + type: Transform + - uid: 544 + components: + - pos: -15.5,-4.5 + parent: 179 + type: Transform +- proto: SignalButton + entities: + - uid: 1013 + components: + - pos: -4.5,-14.5 + parent: 179 + type: Transform + - linkedPorts: + 202: + - Pressed: Toggle + 984: + - Pressed: Toggle + type: DeviceLinkSource + - uid: 1014 + components: + - pos: 3.5,-14.5 + parent: 179 + type: Transform + - linkedPorts: + 697: + - Pressed: Toggle + 698: + - Pressed: Toggle + type: DeviceLinkSource +- proto: SignCargoDock + entities: + - uid: 1046 + components: + - pos: 4.5,-4.5 + parent: 179 + type: Transform +- proto: SmallLight + entities: + - uid: 1048 + components: + - rot: 1.5707963267948966 rad + pos: -2.5,-15.5 + parent: 179 + type: Transform + - uid: 1049 + components: + - rot: -1.5707963267948966 rad + pos: 1.5,-15.5 + parent: 179 + type: Transform +- proto: SMESBasic + entities: + - uid: 1017 + components: + - pos: -6.5,-12.5 + parent: 179 + type: Transform +- proto: soda_dispenser + entities: + - uid: 751 + components: + - pos: 8.5,12.5 + parent: 179 + type: Transform +- proto: SpawnMobHuman + entities: + - uid: 138 + components: + - pos: -6.5,-0.5 + parent: 179 + type: Transform + - uid: 139 + components: + - pos: -6.5,0.5 + parent: 179 + type: Transform + - uid: 140 + components: + - pos: 3.5,7.5 + parent: 179 + type: Transform +- proto: SpawnMobMouse + entities: + - uid: 1050 + components: + - pos: 3.5,8.5 + parent: 179 + type: Transform +- proto: SpawnPointCaptain + entities: + - uid: 954 + components: + - pos: -4.5,4.5 + parent: 179 + type: Transform +- proto: SpawnPointLatejoin + entities: + - uid: 961 + components: + - pos: -3.5,3.5 + parent: 179 + type: Transform +- proto: SpawnPointObserver + entities: + - uid: 679 + components: + - pos: -3.5,4.5 + parent: 179 + type: Transform +- proto: SpawnVehicleJanicart + entities: + - uid: 904 + components: + - pos: 5.5,16.5 + parent: 179 + type: Transform +- proto: Spear + entities: + - uid: 185 + components: + - pos: -3.4579864,-1.9811735 + parent: 179 + type: Transform +- proto: SprayBottleWater + entities: + - uid: 903 + components: + - pos: 6.985283,16.424004 + parent: 179 + type: Transform +- proto: Stimpack + entities: + - uid: 462 + components: + - pos: 3.6877818,5.312015 + parent: 179 + type: Transform +- proto: Stool + entities: + - uid: 383 + components: + - pos: -1.5,-9.5 + parent: 179 + type: Transform + - uid: 387 + components: + - rot: 3.141592653589793 rad + pos: -2.5,-6.5 + parent: 179 + type: Transform +- proto: Stunbaton + entities: + - uid: 434 + components: + - pos: -3.1734612,-2.6066077 + parent: 179 + type: Transform +- proto: SubstationBasic + entities: + - uid: 1018 + components: + - pos: -6.5,-13.5 + parent: 179 + type: Transform +- proto: SuperCapacitorStockPart + entities: + - uid: 296 + components: + - pos: -4.3012447,8.817795 + parent: 179 + type: Transform +- proto: Syringe + entities: + - uid: 460 + components: + - pos: 3.2502818,4.5823417 + parent: 179 + type: Transform + - uid: 738 + components: + - pos: 5.767191,9.787079 + parent: 179 + type: Transform +- proto: Table + entities: + - uid: 63 + components: + - pos: 9.5,21.5 + parent: 179 + type: Transform + - uid: 64 + components: + - pos: 10.5,21.5 + parent: 179 + type: Transform + - uid: 67 + components: + - pos: 8.5,21.5 + parent: 179 + type: Transform + - uid: 92 + components: + - pos: 11.5,21.5 + parent: 179 + type: Transform + - uid: 143 + components: + - pos: 33.5,-3.5 + parent: 179 + type: Transform + - uid: 144 + components: + - pos: 33.5,-2.5 + parent: 179 + type: Transform + - uid: 145 + components: + - pos: 33.5,-1.5 + parent: 179 + type: Transform + - uid: 161 + components: + - pos: 24.5,-5.5 + parent: 179 + type: Transform + - uid: 162 + components: + - pos: 23.5,-5.5 + parent: 179 + type: Transform + - uid: 172 + components: + - rot: -1.5707963267948966 rad + pos: 4.5,9.5 + parent: 179 + type: Transform + - uid: 180 + components: + - pos: -4.5,10.5 + parent: 179 + type: Transform + - uid: 262 + components: + - pos: -3.5,-5.5 + parent: 179 + type: Transform + - uid: 263 + components: + - pos: -2.5,-5.5 + parent: 179 + type: Transform + - uid: 264 + components: + - pos: -1.5,-5.5 + parent: 179 + type: Transform + - uid: 265 + components: + - pos: -0.5,-5.5 + parent: 179 + type: Transform + - uid: 267 + components: + - pos: 23.5,5.5 + parent: 179 + type: Transform + - uid: 268 + components: + - pos: 23.5,6.5 + parent: 179 + type: Transform + - uid: 298 + components: + - rot: -1.5707963267948966 rad + pos: 6.5,9.5 + parent: 179 + type: Transform + - uid: 299 + components: + - rot: -1.5707963267948966 rad + pos: 5.5,9.5 + parent: 179 + type: Transform + - uid: 300 + components: + - rot: -1.5707963267948966 rad + pos: 8.5,9.5 + parent: 179 + type: Transform + - uid: 312 + components: + - pos: -3.5,-10.5 + parent: 179 + type: Transform + - uid: 313 + components: + - pos: -2.5,-10.5 + parent: 179 + type: Transform + - uid: 314 + components: + - pos: -1.5,-10.5 + parent: 179 + type: Transform + - uid: 315 + components: + - pos: -0.5,-10.5 + parent: 179 + type: Transform + - uid: 355 + components: + - pos: -6.5,7.5 + parent: 179 + type: Transform + - uid: 356 + components: + - pos: -5.5,7.5 + parent: 179 + type: Transform + - uid: 357 + components: + - pos: -4.5,7.5 + parent: 179 + type: Transform + - uid: 358 + components: + - pos: -3.5,7.5 + parent: 179 + type: Transform + - uid: 361 + components: + - pos: -0.5,7.5 + parent: 179 + type: Transform + - uid: 362 + components: + - pos: 0.5,7.5 + parent: 179 + type: Transform + - uid: 363 + components: + - pos: 1.5,7.5 + parent: 179 + type: Transform + - uid: 366 + components: + - pos: -2.5,4.5 + parent: 179 + type: Transform + - uid: 367 + components: + - pos: -1.5,4.5 + parent: 179 + type: Transform + - uid: 368 + components: + - pos: -0.5,4.5 + parent: 179 + type: Transform + - uid: 371 + components: + - pos: 1.5,4.5 + parent: 179 + type: Transform + - uid: 385 + components: + - pos: -3.5,-2.5 + parent: 179 + type: Transform + - uid: 386 + components: + - pos: -3.5,-1.5 + parent: 179 + type: Transform + - uid: 440 + components: + - pos: 0.5,4.5 + parent: 179 + type: Transform + - uid: 445 + components: + - pos: -3.5,-0.5 + parent: 179 + type: Transform + - uid: 448 + components: + - pos: 3.5,5.5 + parent: 179 + type: Transform + - uid: 465 + components: + - pos: 1.5,8.5 + parent: 179 + type: Transform + - uid: 466 + components: + - pos: 0.5,8.5 + parent: 179 + type: Transform + - uid: 467 + components: + - pos: -3.5,8.5 + parent: 179 + type: Transform + - uid: 468 + components: + - pos: -0.5,8.5 + parent: 179 + type: Transform + - uid: 470 + components: + - pos: -6.5,8.5 + parent: 179 + type: Transform + - uid: 471 + components: + - pos: -5.5,8.5 + parent: 179 + type: Transform + - uid: 472 + components: + - pos: -4.5,8.5 + parent: 179 + type: Transform + - uid: 515 + components: + - pos: -15.5,-5.5 + parent: 179 + type: Transform + - uid: 516 + components: + - pos: -15.5,-1.5 + parent: 179 + type: Transform + - uid: 520 + components: + - pos: -15.5,-0.5 + parent: 179 + type: Transform + - uid: 559 + components: + - pos: -15.5,-4.5 + parent: 179 + type: Transform + - uid: 560 + components: + - pos: -15.5,-3.5 + parent: 179 + type: Transform + - uid: 568 + components: + - pos: 18.5,4.5 + parent: 179 + type: Transform + - uid: 569 + components: + - pos: 21.5,6.5 + parent: 179 + type: Transform + - uid: 570 + components: + - pos: 20.5,6.5 + parent: 179 + type: Transform + - uid: 571 + components: + - pos: 18.5,6.5 + parent: 179 + type: Transform + - uid: 572 + components: + - pos: 19.5,6.5 + parent: 179 + type: Transform + - uid: 573 + components: + - pos: 18.5,5.5 + parent: 179 + type: Transform + - uid: 574 + components: + - pos: 22.5,8.5 + parent: 179 + type: Transform + - uid: 575 + components: + - pos: 24.5,4.5 + parent: 179 + type: Transform + - uid: 584 + components: + - pos: 23.5,7.5 + parent: 179 + type: Transform + - uid: 586 + components: + - pos: 25.5,10.5 + parent: 179 + type: Transform + - uid: 587 + components: + - pos: 23.5,10.5 + parent: 179 + type: Transform + - uid: 588 + components: + - pos: 24.5,10.5 + parent: 179 + type: Transform + - uid: 589 + components: + - pos: 26.5,10.5 + parent: 179 + type: Transform + - uid: 590 + components: + - pos: 27.5,10.5 + parent: 179 + type: Transform + - uid: 594 + components: + - pos: 13.5,2.5 + parent: 179 + type: Transform + - uid: 595 + components: + - pos: 13.5,0.5 + parent: 179 + type: Transform + - uid: 596 + components: + - pos: 13.5,1.5 + parent: 179 + type: Transform + - uid: 684 + components: + - pos: -3.5,0.5 + parent: 179 + type: Transform + - uid: 685 + components: + - pos: 3.5,4.5 + parent: 179 + type: Transform + - uid: 686 + components: + - pos: 3.5,6.5 + parent: 179 + type: Transform + - uid: 706 + components: + - pos: -1.5,-3.5 + parent: 179 + type: Transform + - uid: 707 + components: + - pos: -0.5,-3.5 + parent: 179 + type: Transform + - uid: 710 + components: + - pos: 0.5,-3.5 + parent: 179 + type: Transform +- proto: TableGlass + entities: + - uid: 964 + components: + - pos: 9.5,12.5 + parent: 179 + type: Transform + - uid: 965 + components: + - pos: 11.5,12.5 + parent: 179 + type: Transform + - uid: 966 + components: + - pos: 13.5,12.5 + parent: 179 + type: Transform + - uid: 975 + components: + - pos: 10.5,12.5 + parent: 179 + type: Transform + - uid: 976 + components: + - pos: 12.5,12.5 + parent: 179 + type: Transform +- proto: TargetHuman + entities: + - uid: 159 + components: + - pos: -6.5,-1.5 + parent: 179 + type: Transform +- proto: TelecomServerFilled + entities: + - uid: 963 + components: + - pos: -3.5,10.5 + parent: 179 + type: Transform +- proto: TimerTrigger + entities: + - uid: 482 + components: + - pos: 6.413024,9.39097 + parent: 179 + type: Transform +- proto: ToolboxElectricalFilled + entities: + - uid: 365 + components: + - pos: 0.4993378,3.429311 + parent: 179 + type: Transform + - uid: 419 + components: + - pos: -0.8099712,-5.21454 + parent: 179 + type: Transform + - uid: 420 + components: + - pos: -0.5597038,-5.679647 + parent: 179 + type: Transform +- proto: ToolboxMechanicalFilled + entities: + - uid: 364 + components: + - pos: 1.452203,3.4605832 + parent: 179 + type: Transform +- proto: ToyRubberDuck + entities: + - uid: 723 + components: + - pos: -1.6653601,11.616664 + parent: 179 + type: Transform +- proto: trayScanner + entities: + - uid: 758 + components: + - pos: 1.354346,4.548879 + parent: 179 + type: Transform +- proto: TwoWayLever + entities: + - uid: 699 + components: + - pos: -3.5,-13.5 + parent: 179 + type: Transform + - linkedPorts: + 990: + - Left: Forward + - Right: Reverse + - Middle: Off + 195: + - Left: Forward + - Right: Reverse + - Middle: Off + 991: + - Left: Forward + - Right: Reverse + - Middle: Off + type: DeviceLinkSource + - uid: 722 + components: + - pos: 1.5,11.5 + parent: 179 + type: Transform + - linkedPorts: + 721: + - Left: Forward + - Right: Reverse + - Middle: Off + 720: + - Left: Forward + - Right: Reverse + - Middle: Off + 716: + - Left: Forward + - Right: Reverse + - Middle: Off + type: DeviceLinkSource + - uid: 983 + components: + - pos: 2.5,-13.5 + parent: 179 + type: Transform + - linkedPorts: + 985: + - Left: Forward + - Right: Reverse + - Middle: Off + 259: + - Left: Forward + - Right: Reverse + - Middle: Off + 989: + - Left: Forward + - Right: Reverse + - Middle: Off + 463: + - Left: Forward + - Right: Reverse + - Middle: Off + type: DeviceLinkSource +- proto: UnfinishedMachineFrame + entities: + - uid: 522 + components: + - pos: -6.5,10.5 + parent: 179 + type: Transform +- proto: UniformPrinter + entities: + - uid: 443 + components: + - pos: -7.5,4.5 + parent: 179 + type: Transform +- proto: VehicleKeyJanicart + entities: + - uid: 14 + components: + - pos: 6.5,16.5 + parent: 179 + type: Transform +- proto: VendingMachineCigs + entities: + - uid: 870 + components: + - flags: SessionSpecific + type: MetaData + - pos: -14.5,4.5 + parent: 179 + type: Transform +- proto: VendingMachineEngivend + entities: + - uid: 441 + components: + - flags: SessionSpecific + type: MetaData + - pos: -11.5,4.5 + parent: 179 + type: Transform + - uid: 523 + components: + - flags: SessionSpecific + type: MetaData + - pos: -11.5,-1.5 + parent: 179 + type: Transform +- proto: VendingMachineMedical + entities: + - uid: 156 + components: + - flags: SessionSpecific + type: MetaData + - pos: 25.5,-5.5 + parent: 179 + type: Transform + - uid: 157 + components: + - flags: SessionSpecific + type: MetaData + - pos: 27.5,-5.5 + parent: 179 + type: Transform + - uid: 158 + components: + - flags: SessionSpecific + type: MetaData + - pos: 29.5,3.5 + parent: 179 + type: Transform + - uid: 521 + components: + - flags: SessionSpecific + type: MetaData + - pos: -12.5,4.5 + parent: 179 + type: Transform +- proto: VendingMachineSalvage + entities: + - uid: 485 + components: + - flags: SessionSpecific + type: MetaData + - pos: -15.5,4.5 + parent: 179 + type: Transform +- proto: VendingMachineSec + entities: + - uid: 874 + components: + - flags: SessionSpecific + type: MetaData + - pos: -13.5,4.5 + parent: 179 + type: Transform +- proto: VendingMachineTankDispenserEVA + entities: + - uid: 875 + components: + - flags: SessionSpecific + type: MetaData + - pos: 7.5,0.5 + parent: 179 + type: Transform +- proto: VendingMachineYouTool + entities: + - uid: 350 + components: + - flags: SessionSpecific + type: MetaData + - pos: -11.5,-0.5 + parent: 179 + type: Transform +- proto: WallSolid + entities: + - uid: 3 + components: + - pos: 1.5,18.5 + parent: 179 + type: Transform + - uid: 4 + components: + - pos: 11.5,26.5 + parent: 179 + type: Transform + - uid: 5 + components: + - pos: 18.5,24.5 + parent: 179 + type: Transform + - uid: 6 + components: + - pos: 20.5,15.5 + parent: 179 + type: Transform + - uid: 8 + components: + - pos: 14.5,19.5 + parent: 179 + type: Transform + - uid: 9 + components: + - pos: 1.5,19.5 + parent: 179 + type: Transform + - uid: 10 + components: + - pos: 18.5,26.5 + parent: 179 + type: Transform + - uid: 11 + components: + - pos: 13.5,26.5 + parent: 179 + type: Transform + - uid: 13 + components: + - pos: 25.5,15.5 + parent: 179 + type: Transform + - uid: 18 + components: + - pos: 4.5,26.5 + parent: 179 + type: Transform + - uid: 19 + components: + - pos: 18.5,25.5 + parent: 179 + type: Transform + - uid: 21 + components: + - pos: 10.5,26.5 + parent: 179 + type: Transform + - uid: 22 + components: + - pos: 26.5,15.5 + parent: 179 + type: Transform + - uid: 25 + components: + - pos: 1.5,21.5 + parent: 179 + type: Transform + - uid: 27 + components: + - pos: 8.5,-0.5 + parent: 179 + type: Transform + - uid: 28 + components: + - pos: 18.5,18.5 + parent: 179 + type: Transform + - uid: 29 + components: + - pos: 18.5,21.5 + parent: 179 + type: Transform + - uid: 30 + components: + - pos: 1.5,22.5 + parent: 179 + type: Transform + - uid: 31 + components: + - pos: 1.5,20.5 + parent: 179 + type: Transform + - uid: 32 + components: + - pos: 18.5,19.5 + parent: 179 + type: Transform + - uid: 33 + components: + - pos: 23.5,15.5 + parent: 179 + type: Transform + - uid: 34 + components: + - pos: 12.5,22.5 + parent: 179 + type: Transform + - uid: 35 + components: + - pos: 27.5,15.5 + parent: 179 + type: Transform + - uid: 36 + components: + - pos: 7.5,22.5 + parent: 179 + type: Transform + - uid: 37 + components: + - pos: 14.5,22.5 + parent: 179 + type: Transform + - uid: 38 + components: + - pos: 10.5,23.5 + parent: 179 + type: Transform + - uid: 39 + components: + - pos: 10.5,24.5 + parent: 179 + type: Transform + - uid: 40 + components: + - pos: 8.5,26.5 + parent: 179 + type: Transform + - uid: 41 + components: + - pos: 10.5,25.5 + parent: 179 + type: Transform + - uid: 42 + components: + - pos: 18.5,22.5 + parent: 179 + type: Transform + - uid: 43 + components: + - pos: 14.5,27.5 + parent: 179 + type: Transform + - uid: 44 + components: + - pos: 14.5,26.5 + parent: 179 + type: Transform + - uid: 45 + components: + - pos: 1.5,16.5 + parent: 179 + type: Transform + - uid: 46 + components: + - pos: 18.5,27.5 + parent: 179 + type: Transform + - uid: 49 + components: + - pos: 7.5,28.5 + parent: 179 + type: Transform + - uid: 50 + components: + - pos: 13.5,22.5 + parent: 179 + type: Transform + - uid: 51 + components: + - pos: 12.5,26.5 + parent: 179 + type: Transform + - uid: 52 + components: + - pos: 1.5,15.5 + parent: 179 + type: Transform + - uid: 53 + components: + - pos: 9.5,26.5 + parent: 179 + type: Transform + - uid: 55 + components: + - pos: 24.5,15.5 + parent: 179 + type: Transform + - uid: 56 + components: + - pos: 14.5,25.5 + parent: 179 + type: Transform + - uid: 57 + components: + - pos: 14.5,21.5 + parent: 179 + type: Transform + - uid: 60 + components: + - pos: 7.5,21.5 + parent: 179 + type: Transform + - uid: 61 + components: + - pos: 18.5,20.5 + parent: 179 + type: Transform + - uid: 62 + components: + - pos: 18.5,23.5 + parent: 179 + type: Transform + - uid: 66 + components: + - pos: 18.5,17.5 + parent: 179 + type: Transform + - uid: 68 + components: + - pos: 18.5,28.5 + parent: 179 + type: Transform + - uid: 69 + components: + - pos: 28.5,15.5 + parent: 179 + type: Transform + - uid: 71 + components: + - pos: 11.5,22.5 + parent: 179 + type: Transform + - uid: 72 + components: + - pos: 1.5,17.5 + parent: 179 + type: Transform + - uid: 73 + components: + - pos: 14.5,28.5 + parent: 179 + type: Transform + - uid: 74 + components: + - pos: 10.5,22.5 + parent: 179 + type: Transform + - uid: 75 + components: + - pos: 9.5,22.5 + parent: 179 + type: Transform + - uid: 76 + components: + - pos: 8.5,-1.5 + parent: 179 + type: Transform + - uid: 77 + components: + - pos: 8.5,-2.5 + parent: 179 + type: Transform + - uid: 78 + components: + - pos: 21.5,15.5 + parent: 179 + type: Transform + - uid: 80 + components: + - pos: 18.5,16.5 + parent: 179 + type: Transform + - uid: 81 + components: + - pos: 18.5,15.5 + parent: 179 + type: Transform + - uid: 82 + components: + - pos: 14.5,18.5 + parent: 179 + type: Transform + - uid: 83 + components: + - pos: 4.5,28.5 + parent: 179 + type: Transform + - uid: 84 + components: + - pos: 7.5,26.5 + parent: 179 + type: Transform + - uid: 85 + components: + - pos: 1.5,23.5 + parent: 179 + type: Transform + - uid: 86 + components: + - pos: 17.5,15.5 + parent: 179 + type: Transform + - uid: 89 + components: + - pos: 22.5,15.5 + parent: 179 + type: Transform + - uid: 95 + components: + - pos: 8.5,22.5 + parent: 179 + type: Transform + - uid: 96 + components: + - pos: 7.5,27.5 + parent: 179 + type: Transform + - uid: 97 + components: + - pos: 8.5,-3.5 + parent: 179 + type: Transform + - uid: 98 + components: + - pos: 4.5,25.5 + parent: 179 + type: Transform + - uid: 99 + components: + - pos: 17.5,18.5 + parent: 179 + type: Transform + - uid: 100 + components: + - pos: 19.5,15.5 + parent: 179 + type: Transform + - uid: 101 + components: + - pos: 4.5,27.5 + parent: 179 + type: Transform + - uid: 103 + components: + - pos: 14.5,17.5 + parent: 179 + type: Transform + - uid: 104 + components: + - pos: 14.5,16.5 + parent: 179 + type: Transform + - uid: 105 + components: + - pos: 15.5,15.5 + parent: 179 + type: Transform + - uid: 106 + components: + - pos: 14.5,15.5 + parent: 179 + type: Transform + - uid: 107 + components: + - pos: 13.5,15.5 + parent: 179 + type: Transform + - uid: 109 + components: + - pos: 11.5,15.5 + parent: 179 + type: Transform + - uid: 110 + components: + - pos: 10.5,15.5 + parent: 179 + type: Transform + - uid: 112 + components: + - pos: 7.5,19.5 + parent: 179 + type: Transform + - uid: 113 + components: + - pos: 7.5,18.5 + parent: 179 + type: Transform + - uid: 114 + components: + - pos: 7.5,17.5 + parent: 179 + type: Transform + - uid: 117 + components: + - pos: 5.5,18.5 + parent: 179 + type: Transform + - uid: 118 + components: + - pos: 5.5,19.5 + parent: 179 + type: Transform + - uid: 121 + components: + - pos: 4.5,19.5 + parent: 179 + type: Transform + - uid: 122 + components: + - pos: 4.5,20.5 + parent: 179 + type: Transform + - uid: 123 + components: + - pos: 4.5,21.5 + parent: 179 + type: Transform + - uid: 124 + components: + - pos: 4.5,22.5 + parent: 179 + type: Transform + - uid: 125 + components: + - pos: 4.5,23.5 + parent: 179 + type: Transform + - uid: 126 + components: + - pos: 4.5,24.5 + parent: 179 + type: Transform + - uid: 164 + components: + - rot: 1.5707963267948966 rad + pos: 22.5,9.5 + parent: 179 + type: Transform + - uid: 165 + components: + - pos: 8.5,2.5 + parent: 179 + type: Transform + - uid: 169 + components: + - pos: 8.5,0.5 + parent: 179 + type: Transform + - uid: 173 + components: + - pos: 8.5,1.5 + parent: 179 + type: Transform + - uid: 189 + components: + - pos: -7.5,0.5 + parent: 179 + type: Transform + - uid: 190 + components: + - pos: -7.5,-0.5 + parent: 179 + type: Transform + - uid: 191 + components: + - pos: -7.5,-1.5 + parent: 179 + type: Transform + - uid: 192 + components: + - pos: -7.5,-2.5 + parent: 179 + type: Transform + - uid: 193 + components: + - pos: -7.5,-3.5 + parent: 179 + type: Transform + - uid: 196 + components: + - pos: 3.5,-14.5 + parent: 179 + type: Transform + - uid: 197 + components: + - pos: 4.5,-14.5 + parent: 179 + type: Transform + - uid: 198 + components: + - pos: -7.5,-10.5 + parent: 179 + type: Transform + - uid: 199 + components: + - pos: -7.5,-11.5 + parent: 179 + type: Transform + - uid: 200 + components: + - pos: -7.5,-12.5 + parent: 179 + type: Transform + - uid: 201 + components: + - pos: -7.5,-13.5 + parent: 179 + type: Transform + - uid: 208 + components: + - pos: -7.5,-9.5 + parent: 179 + type: Transform + - uid: 209 + components: + - pos: -10.5,-7.5 + parent: 179 + type: Transform + - uid: 211 + components: + - pos: -10.5,-5.5 + parent: 179 + type: Transform + - uid: 212 + components: + - pos: -10.5,-4.5 + parent: 179 + type: Transform + - uid: 213 + components: + - pos: -10.5,-3.5 + parent: 179 + type: Transform + - uid: 214 + components: + - pos: -10.5,-2.5 + parent: 179 + type: Transform + - uid: 215 + components: + - pos: -10.5,-1.5 + parent: 179 + type: Transform + - uid: 217 + components: + - pos: 1.5,-4.5 + parent: 179 + type: Transform + - uid: 218 + components: + - pos: 0.5,-4.5 + parent: 179 + type: Transform + - uid: 219 + components: + - pos: -0.5,-4.5 + parent: 179 + type: Transform + - uid: 220 + components: + - pos: -1.5,-4.5 + parent: 179 + type: Transform + - uid: 221 + components: + - pos: -2.5,-4.5 + parent: 179 + type: Transform + - uid: 222 + components: + - pos: -3.5,-4.5 + parent: 179 + type: Transform + - uid: 223 + components: + - pos: -4.5,-4.5 + parent: 179 + type: Transform + - uid: 224 + components: + - pos: -5.5,-4.5 + parent: 179 + type: Transform + - uid: 225 + components: + - pos: -6.5,-4.5 + parent: 179 + type: Transform + - uid: 226 + components: + - pos: 4.5,-4.5 + parent: 179 + type: Transform + - uid: 227 + components: + - pos: 5.5,-4.5 + parent: 179 + type: Transform + - uid: 228 + components: + - pos: 6.5,-4.5 + parent: 179 + type: Transform + - uid: 229 + components: + - pos: -7.5,-14.5 + parent: 179 + type: Transform + - uid: 231 + components: + - pos: -6.5,-14.5 + parent: 179 + type: Transform + - uid: 232 + components: + - pos: -5.5,-14.5 + parent: 179 + type: Transform + - uid: 233 + components: + - pos: -4.5,-14.5 + parent: 179 + type: Transform + - uid: 234 + components: + - pos: 6.5,-10.5 + parent: 179 + type: Transform + - uid: 235 + components: + - pos: 6.5,-11.5 + parent: 179 + type: Transform + - uid: 236 + components: + - pos: 6.5,-12.5 + parent: 179 + type: Transform + - uid: 237 + components: + - pos: 6.5,-13.5 + parent: 179 + type: Transform + - uid: 238 + components: + - pos: 6.5,-14.5 + parent: 179 + type: Transform + - uid: 239 + components: + - pos: 5.5,-14.5 + parent: 179 + type: Transform + - uid: 240 + components: + - pos: -7.5,-8.5 + parent: 179 + type: Transform + - uid: 241 + components: + - pos: -7.5,-7.5 + parent: 179 + type: Transform + - uid: 242 + components: + - pos: -8.5,-8.5 + parent: 179 + type: Transform + - uid: 243 + components: + - pos: -9.5,-8.5 + parent: 179 + type: Transform + - uid: 244 + components: + - pos: -10.5,-8.5 + parent: 179 + type: Transform + - uid: 245 + components: + - pos: -7.5,-5.5 + parent: 179 + type: Transform + - uid: 248 + components: + - pos: 5.5,-7.5 + parent: 179 + type: Transform + - uid: 249 + components: + - pos: 5.5,-9.5 + parent: 179 + type: Transform + - uid: 250 + components: + - pos: 6.5,-9.5 + parent: 179 + type: Transform + - uid: 251 + components: + - pos: 6.5,-7.5 + parent: 179 + type: Transform + - uid: 254 + components: + - pos: 7.5,-9.5 + parent: 179 + type: Transform + - uid: 260 + components: + - pos: 6.5,-6.5 + parent: 179 + type: Transform + - uid: 261 + components: + - pos: 6.5,-5.5 + parent: 179 + type: Transform + - uid: 271 + components: + - pos: 1.5,14.5 + parent: 179 + type: Transform + - uid: 272 + components: + - pos: 1.5,13.5 + parent: 179 + type: Transform + - uid: 273 + components: + - pos: 1.5,12.5 + parent: 179 + type: Transform + - uid: 274 + components: + - pos: -7.5,11.5 + parent: 179 + type: Transform + - uid: 275 + components: + - pos: -6.5,11.5 + parent: 179 + type: Transform + - uid: 276 + components: + - pos: -5.5,11.5 + parent: 179 + type: Transform + - uid: 277 + components: + - pos: -4.5,11.5 + parent: 179 + type: Transform + - uid: 278 + components: + - pos: -3.5,11.5 + parent: 179 + type: Transform + - uid: 279 + components: + - pos: -2.5,11.5 + parent: 179 + type: Transform + - uid: 282 + components: + - pos: -1.5,12.5 + parent: 179 + type: Transform + - uid: 283 + components: + - pos: -0.5,12.5 + parent: 179 + type: Transform + - uid: 284 + components: + - pos: 0.5,12.5 + parent: 179 + type: Transform + - uid: 288 + components: + - pos: 12.5,8.5 + parent: 179 + type: Transform + - uid: 289 + components: + - pos: 11.5,8.5 + parent: 179 + type: Transform + - uid: 290 + components: + - pos: 10.5,8.5 + parent: 179 + type: Transform + - uid: 291 + components: + - pos: 9.5,8.5 + parent: 179 + type: Transform + - uid: 292 + components: + - pos: 8.5,8.5 + parent: 179 + type: Transform + - uid: 293 + components: + - pos: 7.5,8.5 + parent: 179 + type: Transform + - uid: 294 + components: + - pos: 6.5,8.5 + parent: 179 + type: Transform + - uid: 295 + components: + - pos: 5.5,8.5 + parent: 179 + type: Transform + - uid: 301 + components: + - pos: 9.5,11.5 + parent: 179 + type: Transform + - uid: 302 + components: + - pos: 10.5,11.5 + parent: 179 + type: Transform + - uid: 303 + components: + - pos: 11.5,11.5 + parent: 179 + type: Transform + - uid: 304 + components: + - pos: 12.5,11.5 + parent: 179 + type: Transform + - uid: 310 + components: + - pos: 9.5,9.5 + parent: 179 + type: Transform + - uid: 316 + components: + - pos: -7.5,-4.5 + parent: 179 + type: Transform + - uid: 317 + components: + - pos: 26.5,14.5 + parent: 179 + type: Transform + - uid: 320 + components: + - pos: 24.5,14.5 + parent: 179 + type: Transform + - uid: 329 + components: + - pos: -11.5,5.5 + parent: 179 + type: Transform + - uid: 335 + components: + - pos: 13.5,11.5 + parent: 179 + type: Transform + - uid: 336 + components: + - pos: 14.5,11.5 + parent: 179 + type: Transform + - uid: 337 + components: + - pos: 13.5,9.5 + parent: 179 + type: Transform + - uid: 338 + components: + - pos: 13.5,8.5 + parent: 179 + type: Transform + - uid: 339 + components: + - pos: 13.5,7.5 + parent: 179 + type: Transform + - uid: 341 + components: + - pos: 24.5,12.5 + parent: 179 + type: Transform + - uid: 342 + components: + - pos: 26.5,12.5 + parent: 179 + type: Transform + - uid: 352 + components: + - pos: 13.5,6.5 + parent: 179 + type: Transform + - uid: 353 + components: + - pos: 13.5,5.5 + parent: 179 + type: Transform + - uid: 372 + components: + - pos: 13.5,4.5 + parent: 179 + type: Transform + - uid: 373 + components: + - pos: 25.5,4.5 + parent: 179 + type: Transform + - uid: 374 + components: + - pos: 23.5,4.5 + parent: 179 + type: Transform + - uid: 375 + components: + - pos: 17.5,3.5 + parent: 179 + type: Transform + - uid: 376 + components: + - pos: -10.5,-0.5 + parent: 179 + type: Transform + - uid: 377 + components: + - pos: -10.5,0.5 + parent: 179 + type: Transform + - uid: 379 + components: + - pos: -8.5,0.5 + parent: 179 + type: Transform + - uid: 390 + components: + - pos: 18.5,3.5 + parent: 179 + type: Transform + - uid: 391 + components: + - pos: 19.5,3.5 + parent: 179 + type: Transform + - uid: 392 + components: + - pos: 21.5,3.5 + parent: 179 + type: Transform + - uid: 393 + components: + - pos: 22.5,3.5 + parent: 179 + type: Transform + - uid: 394 + components: + - pos: 22.5,4.5 + parent: 179 + type: Transform + - uid: 395 + components: + - pos: 22.5,5.5 + parent: 179 + type: Transform + - uid: 396 + components: + - pos: 22.5,6.5 + parent: 179 + type: Transform + - uid: 397 + components: + - pos: 22.5,7.5 + parent: 179 + type: Transform + - uid: 399 + components: + - pos: 22.5,10.5 + parent: 179 + type: Transform + - uid: 400 + components: + - pos: 21.5,11.5 + parent: 179 + type: Transform + - uid: 401 + components: + - pos: 22.5,11.5 + parent: 179 + type: Transform + - uid: 418 + components: + - pos: 7.5,-7.5 + parent: 179 + type: Transform + - uid: 439 + components: + - pos: -13.5,5.5 + parent: 179 + type: Transform + - uid: 449 + components: + - pos: -16.5,2.5 + parent: 179 + type: Transform + - uid: 450 + components: + - pos: -16.5,3.5 + parent: 179 + type: Transform + - uid: 464 + components: + - pos: 4.5,8.5 + parent: 179 + type: Transform + - uid: 474 + components: + - pos: -7.5,8.5 + parent: 179 + type: Transform + - uid: 475 + components: + - pos: -7.5,7.5 + parent: 179 + type: Transform + - uid: 476 + components: + - pos: -7.5,6.5 + parent: 179 + type: Transform + - uid: 477 + components: + - pos: -7.5,5.5 + parent: 179 + type: Transform + - uid: 486 + components: + - pos: -15.5,5.5 + parent: 179 + type: Transform + - uid: 487 + components: + - pos: -16.5,4.5 + parent: 179 + type: Transform + - uid: 488 + components: + - pos: 5.5,17.5 + parent: 179 + type: Transform + - uid: 489 + components: + - pos: -11.5,0.5 + parent: 179 + type: Transform + - uid: 491 + components: + - pos: -16.5,5.5 + parent: 179 + type: Transform + - uid: 492 + components: + - pos: -14.5,5.5 + parent: 179 + type: Transform + - uid: 494 + components: + - rot: -1.5707963267948966 rad + pos: -11.5,7.5 + parent: 179 + type: Transform + - uid: 495 + components: + - pos: -12.5,5.5 + parent: 179 + type: Transform + - uid: 496 + components: + - pos: -16.5,1.5 + parent: 179 + type: Transform + - uid: 497 + components: + - pos: -16.5,0.5 + parent: 179 + type: Transform + - uid: 498 + components: + - pos: -16.5,-0.5 + parent: 179 + type: Transform + - uid: 499 + components: + - pos: -16.5,-1.5 + parent: 179 + type: Transform + - uid: 500 + components: + - pos: -16.5,-2.5 + parent: 179 + type: Transform + - uid: 501 + components: + - pos: -16.5,-3.5 + parent: 179 + type: Transform + - uid: 502 + components: + - pos: -16.5,-4.5 + parent: 179 + type: Transform + - uid: 503 + components: + - pos: -16.5,-5.5 + parent: 179 + type: Transform + - uid: 504 + components: + - pos: -16.5,-6.5 + parent: 179 + type: Transform + - uid: 505 + components: + - pos: -16.5,-7.5 + parent: 179 + type: Transform + - uid: 506 + components: + - pos: -16.5,-8.5 + parent: 179 + type: Transform + - uid: 507 + components: + - pos: -15.5,-8.5 + parent: 179 + type: Transform + - uid: 508 + components: + - pos: -14.5,-8.5 + parent: 179 + type: Transform + - uid: 509 + components: + - pos: -13.5,-8.5 + parent: 179 + type: Transform + - uid: 510 + components: + - pos: -12.5,-8.5 + parent: 179 + type: Transform + - uid: 511 + components: + - pos: -11.5,-8.5 + parent: 179 + type: Transform + - uid: 517 + components: + - pos: 23.5,11.5 + parent: 179 + type: Transform + - uid: 518 + components: + - pos: 24.5,11.5 + parent: 179 + type: Transform + - uid: 519 + components: + - pos: 25.5,11.5 + parent: 179 + type: Transform + - uid: 535 + components: + - pos: -15.5,0.5 + parent: 179 + type: Transform + - uid: 539 + components: + - pos: 26.5,11.5 + parent: 179 + type: Transform + - uid: 540 + components: + - pos: 27.5,11.5 + parent: 179 + type: Transform + - uid: 545 + components: + - pos: 7.5,-4.5 + parent: 179 + type: Transform + - uid: 546 + components: + - pos: 8.5,-4.5 + parent: 179 + type: Transform + - uid: 547 + components: + - pos: 28.5,11.5 + parent: 179 + type: Transform + - uid: 548 + components: + - pos: 28.5,10.5 + parent: 179 + type: Transform + - uid: 549 + components: + - pos: 28.5,9.5 + parent: 179 + type: Transform + - uid: 550 + components: + - pos: 28.5,8.5 + parent: 179 + type: Transform + - uid: 551 + components: + - pos: 28.5,7.5 + parent: 179 + type: Transform + - uid: 552 + components: + - pos: 28.5,6.5 + parent: 179 + type: Transform + - uid: 553 + components: + - pos: 28.5,5.5 + parent: 179 + type: Transform + - uid: 554 + components: + - pos: 26.5,-2.5 + parent: 179 + type: Transform + - uid: 555 + components: + - pos: 26.5,-1.5 + parent: 179 + type: Transform + - uid: 556 + components: + - pos: 25.5,-0.5 + parent: 179 + type: Transform + - uid: 557 + components: + - pos: 26.5,-0.5 + parent: 179 + type: Transform + - uid: 558 + components: + - pos: 27.5,-0.5 + parent: 179 + type: Transform + - uid: 561 + components: + - pos: -14.5,0.5 + parent: 179 + type: Transform + - uid: 585 + components: + - pos: 9.5,10.5 + parent: 179 + type: Transform + - uid: 597 + components: + - pos: 22.5,-0.5 + parent: 179 + type: Transform + - uid: 598 + components: + - pos: 17.5,-0.5 + parent: 179 + type: Transform + - uid: 599 + components: + - pos: 18.5,-0.5 + parent: 179 + type: Transform + - uid: 600 + components: + - pos: 20.5,-0.5 + parent: 179 + type: Transform + - uid: 601 + components: + - pos: 21.5,-0.5 + parent: 179 + type: Transform + - uid: 602 + components: + - pos: 19.5,-0.5 + parent: 179 + type: Transform + - uid: 603 + components: + - pos: 14.5,3.5 + parent: 179 + type: Transform + - uid: 604 + components: + - pos: 13.5,3.5 + parent: 179 + type: Transform + - uid: 605 + components: + - pos: 12.5,3.5 + parent: 179 + type: Transform + - uid: 606 + components: + - pos: 12.5,2.5 + parent: 179 + type: Transform + - uid: 607 + components: + - pos: 12.5,1.5 + parent: 179 + type: Transform + - uid: 608 + components: + - pos: 12.5,0.5 + parent: 179 + type: Transform + - uid: 609 + components: + - pos: 12.5,-0.5 + parent: 179 + type: Transform + - uid: 610 + components: + - pos: 13.5,-0.5 + parent: 179 + type: Transform + - uid: 611 + components: + - pos: 14.5,-0.5 + parent: 179 + type: Transform + - uid: 612 + components: + - pos: 13.5,-1.5 + parent: 179 + type: Transform + - uid: 613 + components: + - pos: 13.5,-6.5 + parent: 179 + type: Transform + - uid: 614 + components: + - pos: 13.5,-5.5 + parent: 179 + type: Transform + - uid: 615 + components: + - pos: 13.5,-4.5 + parent: 179 + type: Transform + - uid: 616 + components: + - pos: 13.5,-3.5 + parent: 179 + type: Transform + - uid: 617 + components: + - pos: 13.5,-2.5 + parent: 179 + type: Transform + - uid: 618 + components: + - pos: 14.5,-6.5 + parent: 179 + type: Transform + - uid: 619 + components: + - pos: 15.5,-6.5 + parent: 179 + type: Transform + - uid: 620 + components: + - pos: 16.5,-6.5 + parent: 179 + type: Transform + - uid: 621 + components: + - pos: 17.5,-6.5 + parent: 179 + type: Transform + - uid: 622 + components: + - pos: 18.5,-6.5 + parent: 179 + type: Transform + - uid: 623 + components: + - pos: 19.5,-6.5 + parent: 179 + type: Transform + - uid: 624 + components: + - pos: 20.5,-6.5 + parent: 179 + type: Transform + - uid: 625 + components: + - pos: 21.5,-6.5 + parent: 179 + type: Transform + - uid: 626 + components: + - pos: 22.5,-6.5 + parent: 179 + type: Transform + - uid: 627 + components: + - pos: 23.5,-6.5 + parent: 179 + type: Transform + - uid: 628 + components: + - pos: 24.5,-6.5 + parent: 179 + type: Transform + - uid: 629 + components: + - pos: 25.5,-6.5 + parent: 179 + type: Transform + - uid: 630 + components: + - pos: 26.5,-6.5 + parent: 179 + type: Transform + - uid: 631 + components: + - pos: 26.5,-5.5 + parent: 179 + type: Transform + - uid: 632 + components: + - pos: 26.5,-4.5 + parent: 179 + type: Transform + - uid: 633 + components: + - pos: 27.5,-6.5 + parent: 179 + type: Transform + - uid: 634 + components: + - pos: 28.5,-6.5 + parent: 179 + type: Transform + - uid: 635 + components: + - pos: 29.5,-6.5 + parent: 179 + type: Transform + - uid: 636 + components: + - pos: 30.5,-6.5 + parent: 179 + type: Transform + - uid: 637 + components: + - pos: 31.5,-6.5 + parent: 179 + type: Transform + - uid: 638 + components: + - pos: 32.5,-6.5 + parent: 179 + type: Transform + - uid: 639 + components: + - pos: 33.5,-6.5 + parent: 179 + type: Transform + - uid: 640 + components: + - pos: 34.5,-6.5 + parent: 179 + type: Transform + - uid: 641 + components: + - pos: 34.5,-5.5 + parent: 179 + type: Transform + - uid: 642 + components: + - pos: 34.5,-4.5 + parent: 179 + type: Transform + - uid: 643 + components: + - pos: 34.5,-3.5 + parent: 179 + type: Transform + - uid: 644 + components: + - pos: 34.5,-2.5 + parent: 179 + type: Transform + - uid: 645 + components: + - pos: 34.5,-1.5 + parent: 179 + type: Transform + - uid: 646 + components: + - pos: 34.5,-0.5 + parent: 179 + type: Transform + - uid: 647 + components: + - pos: 33.5,-0.5 + parent: 179 + type: Transform + - uid: 648 + components: + - pos: 32.5,-0.5 + parent: 179 + type: Transform + - uid: 649 + components: + - pos: 31.5,-0.5 + parent: 179 + type: Transform + - uid: 650 + components: + - pos: 30.5,-0.5 + parent: 179 + type: Transform + - uid: 651 + components: + - pos: 29.5,-0.5 + parent: 179 + type: Transform + - uid: 652 + components: + - pos: 30.5,0.5 + parent: 179 + type: Transform + - uid: 653 + components: + - pos: 30.5,1.5 + parent: 179 + type: Transform + - uid: 654 + components: + - pos: 30.5,2.5 + parent: 179 + type: Transform + - uid: 655 + components: + - pos: 30.5,3.5 + parent: 179 + type: Transform + - uid: 656 + components: + - pos: 30.5,4.5 + parent: 179 + type: Transform + - uid: 657 + components: + - pos: 29.5,4.5 + parent: 179 + type: Transform + - uid: 658 + components: + - pos: 28.5,4.5 + parent: 179 + type: Transform + - uid: 659 + components: + - pos: 27.5,4.5 + parent: 179 + type: Transform + - uid: 702 + components: + - rot: -1.5707963267948966 rad + pos: -11.5,6.5 + parent: 179 + type: Transform + - uid: 713 + components: + - pos: -7.5,9.5 + parent: 179 + type: Transform + - uid: 714 + components: + - pos: -7.5,10.5 + parent: 179 + type: Transform + - uid: 724 + components: + - pos: -2.5,12.5 + parent: 179 + type: Transform + - uid: 733 + components: + - pos: 4.5,5.5 + parent: 179 + type: Transform + - uid: 734 + components: + - pos: 4.5,4.5 + parent: 179 + type: Transform + - uid: 739 + components: + - pos: 8.5,7.5 + parent: 179 + type: Transform + - uid: 740 + components: + - pos: 8.5,6.5 + parent: 179 + type: Transform + - uid: 741 + components: + - pos: 8.5,5.5 + parent: 179 + type: Transform + - uid: 742 + components: + - pos: 8.5,4.5 + parent: 179 + type: Transform + - uid: 743 + components: + - pos: 8.5,3.5 + parent: 179 + type: Transform + - uid: 745 + components: + - pos: 4.5,7.5 + parent: 179 + type: Transform + - uid: 746 + components: + - pos: 4.5,6.5 + parent: 179 + type: Transform + - uid: 846 + components: + - pos: 2.5,19.5 + parent: 179 + type: Transform + - uid: 847 + components: + - pos: 3.5,19.5 + parent: 179 + type: Transform + - uid: 925 + components: + - rot: -1.5707963267948966 rad + pos: -14.5,17.5 + parent: 179 + type: Transform + - uid: 958 + components: + - rot: 3.141592653589793 rad + pos: 15.5,18.5 + parent: 179 + type: Transform + - uid: 1072 + components: + - pos: 15.5,28.5 + parent: 179 + type: Transform + - uid: 1073 + components: + - pos: 16.5,28.5 + parent: 179 + type: Transform + - uid: 1074 + components: + - pos: 17.5,28.5 + parent: 179 + type: Transform +- proto: WaterTankFull + entities: + - uid: 115 + components: + - pos: 4.5,18.5 + parent: 179 + type: Transform + - uid: 694 + components: + - pos: -2.5,3.5 + parent: 179 + type: Transform +- proto: WeaponCapacitorRecharger + entities: + - uid: 708 + components: + - pos: -0.5,-3.5 + parent: 179 + type: Transform +- proto: WeaponLaserCarbine + entities: + - uid: 188 + components: + - pos: -3.5226438,-0.45543313 + parent: 179 + type: Transform +- proto: WeaponLauncherMultipleRocket + entities: + - uid: 671 + components: + - pos: -13.195735,9.730438 + parent: 179 + type: Transform +- proto: WeaponLauncherRocket + entities: + - uid: 436 + components: + - pos: -3.478273,-1.1611286 + parent: 179 + type: Transform +- proto: WeaponRifleAk + entities: + - uid: 437 + components: + - pos: -3.5018106,0.24183923 + parent: 179 + type: Transform + - uid: 949 + components: + - pos: -12.238617,9.081488 + parent: 179 + type: Transform +- proto: WelderExperimental + entities: + - uid: 343 + components: + - pos: 0.6895334,4.7183027 + parent: 179 + type: Transform +- proto: WeldingFuelTankFull + entities: + - uid: 693 + components: + - pos: -1.5,3.5 + parent: 179 + type: Transform +- proto: Window + entities: + - uid: 111 + components: + - pos: -0.5,-15.5 + parent: 179 + type: Transform + - uid: 194 + components: + - pos: -0.5,-16.5 + parent: 179 + type: Transform + - uid: 230 + components: + - pos: -0.5,-14.5 + parent: 179 + type: Transform + - uid: 1001 + components: + - pos: -3.5,-16.5 + parent: 179 + type: Transform + - uid: 1002 + components: + - pos: -3.5,-15.5 + parent: 179 + type: Transform + - uid: 1003 + components: + - pos: -3.5,-14.5 + parent: 179 + type: Transform + - uid: 1004 + components: + - pos: 2.5,-16.5 + parent: 179 + type: Transform + - uid: 1005 + components: + - pos: 2.5,-15.5 + parent: 179 + type: Transform + - uid: 1006 + components: + - pos: 2.5,-14.5 + parent: 179 + type: Transform +- proto: Wirecutter + entities: + - uid: 359 + components: + - pos: -1.6207478,4.3951616 + parent: 179 + type: Transform +- proto: Wrench + entities: + - uid: 327 + components: + - pos: -0.11783123,4.753312 + parent: 179 + type: Transform +... diff --git a/Resources/Maps/bagel.yml b/Resources/Maps/bagel.yml index d717c3a56b..1622bf4505 100644 --- a/Resources/Maps/bagel.yml +++ b/Resources/Maps/bagel.yml @@ -75209,28 +75209,6 @@ entities: - pos: 8.554562,-71.45013 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 12600 components: - pos: -59.580887,2.6484475 @@ -75286,28 +75264,6 @@ entities: - pos: -45.607418,-4.0834746 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 19193 components: - pos: 24.478937,19.47598 @@ -75323,28 +75279,6 @@ entities: - pos: 8.429562,-71.29388 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: FloorDrain entities: - uid: 2376 @@ -112959,28 +112893,6 @@ entities: - pos: -11.4531975,-27.495203 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 2042 components: - pos: -22.39201,0.9298079 @@ -112991,82 +112903,16 @@ entities: - pos: 34.77564,-13.074253 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 5326 components: - pos: -24.428305,-28.144638 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 5611 components: - pos: -43.443226,9.814736 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 6609 components: - pos: 13.404068,20.941233 @@ -113094,55 +112940,11 @@ entities: - pos: -53.539146,19.787207 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 18528 components: - pos: -4.422296,-6.0514507 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 18888 components: - rot: 1.5707963267948966 rad @@ -113189,82 +112991,16 @@ entities: - pos: -46.455166,-17.122845 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 4235 components: - pos: -41.508133,-17.091595 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 6446 components: - pos: 16.535465,-49.13737 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 7855 components: - pos: 47.535595,-44.54304 @@ -113275,163 +113011,31 @@ entities: - pos: 43.509346,13.968993 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 14128 components: - pos: -8.397732,20.931147 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 14437 components: - pos: -10.617271,13.996219 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 17683 components: - pos: -47.45724,23.765757 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 17821 components: - pos: -36.53212,19.792776 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 18475 components: - pos: -8.643374,-5.091722 parent: 60 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 23464 components: - pos: -64.53201,45.976482 diff --git a/Resources/Maps/barratry.yml b/Resources/Maps/barratry.yml index 5d3a9ccffd..6033eaad78 100644 --- a/Resources/Maps/barratry.yml +++ b/Resources/Maps/barratry.yml @@ -52363,28 +52363,6 @@ entities: - pos: 7.5332904,-17.502348 parent: 1 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: FloorDrain entities: - uid: 1981 diff --git a/Resources/Maps/box.yml b/Resources/Maps/box.yml index bf8430bee2..a2a9b75a13 100644 --- a/Resources/Maps/box.yml +++ b/Resources/Maps/box.yml @@ -131812,28 +131812,6 @@ entities: - pos: 63.59359,1.9265842 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -131866,28 +131844,6 @@ entities: - pos: 20.577366,3.8552704 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -131905,28 +131861,6 @@ entities: - pos: 27.55192,-19.472286 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -131942,28 +131876,6 @@ entities: - pos: 8.514107,-15.335099 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -131999,28 +131911,6 @@ entities: - pos: 12.51148,39.935867 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132036,28 +131926,6 @@ entities: - pos: -5.4745197,14.875931 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132073,28 +131941,6 @@ entities: - pos: -11.396871,17.955116 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132125,28 +131971,6 @@ entities: - pos: 61.465347,-10.029866 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132162,28 +131986,6 @@ entities: - pos: 57.47965,-10.061116 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132199,28 +132001,6 @@ entities: - pos: -57.50557,-0.1837722 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -132236,28 +132016,6 @@ entities: - pos: -57.52329,-8.160038 parent: 8364 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False diff --git a/Resources/Maps/fland.yml b/Resources/Maps/fland.yml index 46b6de785e..db2cfbcce4 100644 --- a/Resources/Maps/fland.yml +++ b/Resources/Maps/fland.yml @@ -119817,55 +119817,11 @@ entities: - pos: 56.48937,-16.046814 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 15528 components: - pos: 56.55187,-16.249939 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 19986 components: - pos: 41.480545,-35.30919 @@ -119911,28 +119867,6 @@ entities: - pos: -42.514347,2.6634603 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 32400 components: - pos: 35.394306,-5.3188667 @@ -119982,28 +119916,6 @@ entities: - pos: 132.84602,3.5240808 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: FloodlightBroken entities: - uid: 5413 @@ -169910,28 +169822,6 @@ entities: - pos: -11.291338,10.87907 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: LampGold entities: - uid: 1144 @@ -169969,28 +169859,6 @@ entities: - pos: -21.410488,56.800785 parent: 13329 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 10550 components: - pos: 37.57843,20.954947 diff --git a/Resources/Maps/infiltrator.yml b/Resources/Maps/infiltrator.yml index 03cd166550..0cba6c828b 100644 --- a/Resources/Maps/infiltrator.yml +++ b/Resources/Maps/infiltrator.yml @@ -3769,28 +3769,6 @@ entities: - pos: -1.483297,-2.2444057 parent: 73 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - proto: LockerSyndicatePersonal entities: - uid: 692 diff --git a/Resources/Maps/kettle.yml b/Resources/Maps/kettle.yml index 0c2bb80a03..65e64eedd4 100644 --- a/Resources/Maps/kettle.yml +++ b/Resources/Maps/kettle.yml @@ -86047,26 +86047,6 @@ entities: - pos: -36.478657,44.624092 parent: 82 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 6809 components: - pos: -35.57489,40.472855 diff --git a/Resources/Maps/marathon.yml b/Resources/Maps/marathon.yml index 7c8f8748fb..11c3025aa7 100644 --- a/Resources/Maps/marathon.yml +++ b/Resources/Maps/marathon.yml @@ -103486,28 +103486,6 @@ entities: - pos: -43.612717,31.902554 parent: 30 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 4953 components: - pos: -22.461006,36.440132 @@ -103602,55 +103580,11 @@ entities: - pos: 4.5292673,10.977108 parent: 30 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 4994 components: - pos: -21.514103,31.706543 parent: 30 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 5023 components: - pos: -19.477777,35.681534 @@ -103721,28 +103655,6 @@ entities: - pos: -57.92594,-62.49692 parent: 30 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 21670 components: - pos: -57.51036,-43.24328 diff --git a/Resources/Maps/meta.yml b/Resources/Maps/meta.yml index e265c33d90..5b2afd3d71 100644 --- a/Resources/Maps/meta.yml +++ b/Resources/Maps/meta.yml @@ -123032,26 +123032,6 @@ entities: - pos: 9.543957,-1.1447365 parent: 5350 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -123154,26 +123134,6 @@ entities: - pos: -6.544301,-3.1708417 parent: 5350 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -123219,28 +123179,6 @@ entities: - pos: -29.551394,17.78557 parent: 5350 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -123283,26 +123221,6 @@ entities: - pos: -57.509872,-28.24864 parent: 5350 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 17463 components: - pos: -42.417267,-30.139824 @@ -123354,28 +123272,6 @@ entities: - pos: 25.524637,-37.41671 parent: 5350 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - canCollide: True type: Physics - proto: LampInterrogator diff --git a/Resources/Maps/omega.yml b/Resources/Maps/omega.yml index 92992a187f..e7b1c41b81 100644 --- a/Resources/Maps/omega.yml +++ b/Resources/Maps/omega.yml @@ -59192,28 +59192,6 @@ entities: - pos: 5.335086,29.824064 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59231,28 +59209,6 @@ entities: - pos: 8.536261,24.755358 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59285,28 +59241,6 @@ entities: - pos: -3.451921,24.866032 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59339,28 +59273,6 @@ entities: - pos: 25.537617,-17.441427 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59421,28 +59333,6 @@ entities: - pos: -21.463991,24.553658 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59569,28 +59459,6 @@ entities: - pos: -18.349216,-33.27696 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False @@ -59606,28 +59474,6 @@ entities: - pos: -31.078482,-23.278105 parent: 4812 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: - sprite: Objects/Tools/flashlight.rsi - state: flashlight - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - containers: cellslot_cell_container: !type:ContainerSlot showEnts: False diff --git a/Resources/Maps/origin.yml b/Resources/Maps/origin.yml index 84bb14413a..b759308f6b 100644 --- a/Resources/Maps/origin.yml +++ b/Resources/Maps/origin.yml @@ -144514,26 +144514,6 @@ entities: - pos: 21.425192,-12.111239 parent: 2 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 21066 components: - rot: -1.5707963267948966 rad @@ -144604,26 +144584,6 @@ entities: - pos: -18.78946,-56.159798 parent: 2 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 21078 components: - pos: -10.485052,-3.11381 diff --git a/Resources/Maps/packed.yml b/Resources/Maps/packed.yml index 8bcf57f9fc..dcb50ff468 100644 --- a/Resources/Maps/packed.yml +++ b/Resources/Maps/packed.yml @@ -62847,26 +62847,6 @@ entities: - pos: 10.438802,4.97286 parent: 2 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 2722 components: - pos: 20.544691,33.624443 @@ -62887,26 +62867,6 @@ entities: - pos: 32.49905,41.93212 parent: 2 type: Transform - - toggleAction: - sound: null - itemIconStyle: BigItem - icon: Objects/Tools/flashlight.rsi/flashlight.png - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - iconColor: '#FFFFFFFF' - name: action-name-toggle-light - description: action-description-toggle-light - keywords: [] - enabled: True - useDelay: null - charges: null - checkCanInteract: True - clientExclusive: False - priority: 0 - autoPopulate: True - autoRemove: True - temporary: False - event: !type:ToggleActionEvent {} - type: HandheldLight - uid: 5474 components: - pos: 67.5,37.5 diff --git a/Resources/Prototypes/Actions/borgs.yml b/Resources/Prototypes/Actions/borgs.yml index 758d7aeb03..a8195dcc10 100644 --- a/Resources/Prototypes/Actions/borgs.yml +++ b/Resources/Prototypes/Actions/borgs.yml @@ -1,10 +1,13 @@ -- type: instantAction - id: ViewLaws +- type: entity + id: ActionViewLaws name: action-name-view-laws description: action-description-view-laws - itemIconStyle: NoItem - icon: - sprite: Interface/Actions/actions_borg.rsi - state: state-laws - event: !type:ToggleLawsScreenEvent - useDelay: 0.5 + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + icon: + sprite: Interface/Actions/actions_borg.rsi + state: state-laws + event: !type:ToggleLawsScreenEvent + useDelay: 0.5 diff --git a/Resources/Prototypes/Actions/crit.yml b/Resources/Prototypes/Actions/crit.yml index 23a058c017..d99ed8e560 100644 --- a/Resources/Prototypes/Actions/crit.yml +++ b/Resources/Prototypes/Actions/crit.yml @@ -1,34 +1,43 @@ # Actions added to mobs in crit. -- type: instantAction - id: CritSuccumb +- type: entity + id: ActionCritSuccumb name: action-name-crit-succumb description: action-description-crit-succumb - itemIconStyle: NoItem - checkCanInteract: false - icon: - sprite: Mobs/Ghosts/ghost_human.rsi - state: icon - serverEvent: !type:CritSuccumbEvent + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + checkCanInteract: false + icon: + sprite: Mobs/Ghosts/ghost_human.rsi + state: icon + event: !type:CritSuccumbEvent -- type: instantAction - id: CritFakeDeath +- type: entity + id: ActionCritFakeDeath name: action-name-crit-fake-death description: action-description-crit-fake-death - itemIconStyle: NoItem - checkCanInteract: false - icon: - sprite: Interface/Actions/actions_crit.rsi - state: fakedeath - serverEvent: !type:CritFakeDeathEvent - useDelay: 30 + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + checkCanInteract: false + icon: + sprite: Interface/Actions/actions_crit.rsi + state: fakedeath + event: !type:CritFakeDeathEvent + useDelay: 30 -- type: instantAction - id: CritLastWords +- type: entity + id: ActionCritLastWords name: action-name-crit-last-words description: action-description-crit-last-words - itemIconStyle: NoItem - checkCanInteract: false - icon: - sprite: Interface/Actions/actions_crit.rsi - state: lastwords - serverEvent: !type:CritLastWordsEvent + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + checkCanInteract: false + icon: + sprite: Interface/Actions/actions_crit.rsi + state: lastwords + event: !type:CritLastWordsEvent diff --git a/Resources/Prototypes/Actions/internals.yml b/Resources/Prototypes/Actions/internals.yml new file mode 100644 index 0000000000..e881782308 --- /dev/null +++ b/Resources/Prototypes/Actions/internals.yml @@ -0,0 +1,15 @@ +- type: entity + id: ActionToggleInternals + name: action-name-internals-toggle + description: action-description-internals-toggle + noSpawn: true + components: + - type: InstantAction + icon: + sprite: Interface/Alerts/internals.rsi + state: internal2 + iconOn: + sprite: Interface/Alerts/internals.rsi + state: internal1 + event: !type:ToggleActionEvent + useDelay: 1 diff --git a/Resources/Prototypes/Actions/mech.yml b/Resources/Prototypes/Actions/mech.yml index f070f006d6..10ffbb6164 100644 --- a/Resources/Prototypes/Actions/mech.yml +++ b/Resources/Prototypes/Actions/mech.yml @@ -1,31 +1,40 @@ -- type: instantAction - id: MechCycleEquipment +- type: entity + id: ActionMechCycleEquipment name: action-name-mech-cycle description: action-description-mech-cycle - itemIconStyle: NoItem - icon: - sprite: Interface/Actions/actions_mecha.rsi - state: mech_cycle_equip_on - event: !type:MechToggleEquipmentEvent - useDelay: 0.5 + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + icon: + sprite: Interface/Actions/actions_mecha.rsi + state: mech_cycle_equip_on + event: !type:MechToggleEquipmentEvent + useDelay: 0.5 -- type: instantAction - id: MechOpenUI +- type: entity + id: ActionMechOpenUI name: action-name-mech-control-panel description: action-description-mech-control-panel - itemIconStyle: NoItem - icon: - sprite: Interface/Actions/actions_mecha.rsi - state: mech_view_stats - event: !type:MechOpenUiEvent - useDelay: 1 + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + icon: + sprite: Interface/Actions/actions_mecha.rsi + state: mech_view_stats + event: !type:MechOpenUiEvent + useDelay: 1 -- type: instantAction - id: MechEject +- type: entity + id: ActionMechEject name: action-name-mech-eject description: action-description-mech-eject - itemIconStyle: NoItem - icon: - sprite: Interface/Actions/actions_mecha.rsi - state: mech_eject - event: !type:MechEjectPilotEvent \ No newline at end of file + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + icon: + sprite: Interface/Actions/actions_mecha.rsi + state: mech_eject + event: !type:MechEjectPilotEvent diff --git a/Resources/Prototypes/Actions/polymorph.yml b/Resources/Prototypes/Actions/polymorph.yml new file mode 100644 index 0000000000..829af54f72 --- /dev/null +++ b/Resources/Prototypes/Actions/polymorph.yml @@ -0,0 +1,16 @@ +- type: entity + id: ActionRevertPolymorph + name: polymorph-revert-action-name + description: polymorph-revert-action-description + noSpawn: true + components: + - type: InstantAction + event: !type:RevertPolymorphActionEvent + +- type: entity + id: ActionPolymorph + noSpawn: true + components: + - type: InstantAction + event: !type:PolymorphActionEvent + itemIconStyle: NoItem diff --git a/Resources/Prototypes/Actions/revenant.yml b/Resources/Prototypes/Actions/revenant.yml index 1fbf677d80..da7b4ba56f 100644 --- a/Resources/Prototypes/Actions/revenant.yml +++ b/Resources/Prototypes/Actions/revenant.yml @@ -1,38 +1,53 @@ -- type: instantAction - id: RevenantShop - icon: Interface/Actions/shop.png +- type: entity + id: ActionRevenantShop name: Shop description: Opens the ability shop. - serverEvent: !type:RevenantShopActionEvent + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/shop.png + event: !type:RevenantShopActionEvent -- type: instantAction - id: RevenantDefile - icon: Interface/Actions/defile.png +- type: entity + id: ActionRevenantDefile name: Defile description: Costs 30 Essence. - serverEvent: !type:RevenantDefileActionEvent - useDelay: 15 + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/defile.png + event: !type:RevenantDefileActionEvent + useDelay: 15 -- type: instantAction - id: RevenantOverloadLights - icon: Interface/Actions/overloadlight.png +- type: entity + id: ActionRevenantOverloadLights name: Overload Lights description: Costs 40 Essence. - serverEvent: !type:RevenantOverloadLightsActionEvent - useDelay: 20 + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/overloadlight.png + event: !type:RevenantOverloadLightsActionEvent + useDelay: 20 -#- type: instantAction -# id: RevenantBlight -# icon: Interface/Actions/blight.png +#- type: entity +# id: ActionRevenantBlight # name: Blight # description: Costs 50 Essence. -# serverEvent: !type:RevenantBlightActionEvent -# useDelay: 20 +# noSpawn: true +# components: +# - type: InstantAction +# icon: Interface/Actions/blight.png +# event: !type:RevenantBlightActionEvent +# useDelay: 20 -- type: instantAction - id: RevenantMalfunction - icon: Interface/Actions/malfunction.png +- type: entity + id: ActionRevenantMalfunction name: Malfunction description: Costs 60 Essence. - serverEvent: !type:RevenantMalfunctionActionEvent - useDelay: 20 + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/malfunction.png + event: !type:RevenantMalfunctionActionEvent + useDelay: 20 diff --git a/Resources/Prototypes/Actions/speech.yml b/Resources/Prototypes/Actions/speech.yml new file mode 100644 index 0000000000..7d8c78fa3a --- /dev/null +++ b/Resources/Prototypes/Actions/speech.yml @@ -0,0 +1,11 @@ +- type: entity + id: ActionConfigureMeleeSpeech + name: melee-speech-config + description: melee-speech-config-desc + noSpawn: true + components: + - type: InstantAction + itemIconStyle: BigItem + priority: -20 + useDelay: 1 + event: !type:MeleeSpeechConfigureActionEvent diff --git a/Resources/Prototypes/Actions/spider.yml b/Resources/Prototypes/Actions/spider.yml index 988b9a3f8d..52759cefaf 100644 --- a/Resources/Prototypes/Actions/spider.yml +++ b/Resources/Prototypes/Actions/spider.yml @@ -1,15 +1,21 @@ -- type: instantAction - id: SpiderWebAction - icon: Interface/Actions/web.png +- type: entity + id: ActionSpiderWeb name: spider-web-action-name description: spider-web-action-description - serverEvent: !type:SpiderWebActionEvent - useDelay: 25 + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/web.png + event: !type:SpiderWebActionEvent + useDelay: 25 -- type: instantAction - id: SericultureAction - icon: Interface/Actions/web.png +- type: entity + id: ActionSericulture name: sericulture-action-name description: sericulture-action-description - serverEvent: !type:SericultureActionEvent - useDelay: 1 + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/web.png + event: !type:SericultureActionEvent + useDelay: 1 diff --git a/Resources/Prototypes/Actions/types.yml b/Resources/Prototypes/Actions/types.yml index cbed84786b..518f19f1f9 100644 --- a/Resources/Prototypes/Actions/types.yml +++ b/Resources/Prototypes/Actions/types.yml @@ -1,184 +1,254 @@ -- type: instantAction - id: Scream - useDelay: 10 - icon: Interface/Actions/scream.png +- type: entity + id: ActionScream name: action-name-scream description: action-description-scream - serverEvent: !type:ScreamActionEvent - checkCanInteract: false + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + icon: Interface/Actions/scream.png + event: !type:ScreamActionEvent + checkCanInteract: false -- type: instantAction - id: TurnUndead +- type: entity + id: ActionTurnUndead name: turn-undead-action-name description: turn-undead-action-description - checkCanInteract: false - icon: Interface/Actions/zombie-turn.png - event: !type:ZombifySelfActionEvent + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + icon: Interface/Actions/zombie-turn.png + event: !type:ZombifySelfActionEvent -- type: instantAction - id: ToggleLight +- type: entity + id: ActionToggleLight name: action-name-toggle-light description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } + iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png + event: !type:ToggleActionEvent -- type: instantAction - id: OpenStorageImplant +- type: entity + id: ActionOpenStorageImplant name: open-storage-implant-action-name description: open-storage-implant-action-description - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Clothing/Back/Backpacks/backpack.rsi - state: icon - event: !type:OpenStorageImplantEvent + noSpawn: true + components: + - type: InstantAction + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Clothing/Back/Backpacks/backpack.rsi + state: icon + event: !type:OpenStorageImplantEvent -- type: instantAction - id: ActivateMicroBomb +- type: entity + id: ActionActivateMicroBomb name: activate-micro-bomb-action-name description: activate-micro-bomb-action-description - checkCanInteract: false - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Actions/Implants/implants.rsi - state: explosive - event: !type:ActivateImplantEvent + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Actions/Implants/implants.rsi + state: explosive + event: !type:ActivateImplantEvent -- type: instantAction - id: ActivateFreedomImplant +- type: entity + id: ActionActivateFreedomImplant name: use-freedom-implant-action-name description: use-freedom-implant-action-description - charges: 3 - checkCanInteract: false - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Actions/Implants/implants.rsi - state: freedom - event: !type:UseFreedomImplantEvent + noSpawn: true + components: + - type: InstantAction + charges: 3 + checkCanInteract: false + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Actions/Implants/implants.rsi + state: freedom + event: !type:UseFreedomImplantEvent -- type: instantAction - id: OpenUplinkImplant +- type: entity + id: ActionOpenUplinkImplant name: open-uplink-implant-action-name description: open-uplink-implant-action-description - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Objects/Devices/communication.rsi - state: old-radio - event: !type:OpenUplinkImplantEvent + noSpawn: true + components: + - type: InstantAction + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Objects/Devices/communication.rsi + state: old-radio + event: !type:OpenUplinkImplantEvent -- type: instantAction - id: ActivateEmpImplant +- type: entity + id: ActionActivateEmpImplant name: use-emp-implant-action-name description: use-emp-implant-action-description - charges: 3 - useDelay: 5 - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Objects/Weapons/Grenades/empgrenade.rsi - state: icon - event: !type:ActivateImplantEvent + noSpawn: true + components: + - type: InstantAction + charges: 3 + useDelay: 5 + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Objects/Weapons/Grenades/empgrenade.rsi + state: icon + event: !type:ActivateImplantEvent -- type: instantAction - id: ActivateDnaScramblerImplant +- type: entity + id: ActionActivateDnaScramblerImplant name: use-dna-scrambler-implant-action-name description: use-dna-scrambler-implant-action-description - charges: 1 - itemIconStyle: BigAction - priority: -20 - icon: - sprite: Clothing/OuterClothing/Hardsuits/lingspacesuit.rsi - state: icon - event: !type:UseDnaScramblerImplantEvent + noSpawn: true + components: + - type: InstantAction + charges: 1 + itemIconStyle: BigAction + priority: -20 + icon: + sprite: Clothing/OuterClothing/Hardsuits/lingspacesuit.rsi + state: icon + event: !type:UseDnaScramblerImplantEvent -- type: instantAction - id: ToggleSuitPiece +- type: entity + id: ActionToggleSuitPiece name: action-name-hardsuit description: action-description-hardsuit - itemIconStyle: BigItem - useDelay: 1 # equip noise spam. - event: !type:ToggleClothingEvent - -- type: instantAction - id: CombatModeToggle + noSpawn: true + components: + - type: InstantAction + itemIconStyle: BigItem + useDelay: 1 # equip noise spam. + event: !type:ToggleClothingEvent + +- type: entity + id: ActionCombatModeToggle name: action-name-combat description: action-description-combat - checkCanInteract: false - icon: Interface/Actions/harmOff.png - iconOn: Interface/Actions/harm.png - event: !type:ToggleCombatActionEvent + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + icon: Interface/Actions/harmOff.png + iconOn: Interface/Actions/harm.png + event: !type:ToggleCombatActionEvent -- type: instantAction - id: ChangeVoiceMask +- type: entity + id: ActionCombatModeToggleOff + parent: ActionCombatModeToggle + name: action-name-combat + description: action-description-combat + noSpawn: true + components: + - type: InstantAction + enabled: false + autoPopulate: false + +- type: entity + id: ActionChangeVoiceMask name: voice-mask-name-change-set - icon: Interface/Actions/scream.png # somebody else can figure out a better icon for this description: voice-mask-name-change-set-description - serverEvent: !type:VoiceMaskSetNameEvent + components: + - type: InstantAction + icon: Interface/Actions/scream.png # somebody else can figure out a better icon for this + event: !type:VoiceMaskSetNameEvent -- type: instantAction - id: VendingThrow +- type: entity + id: ActionVendingThrow name: vending-machine-action-name description: vending-machine-action-description - useDelay: 30 - event: !type:VendingMachineSelfDispenseEvent + noSpawn: true + components: + - type: InstantAction + useDelay: 30 + event: !type:VendingMachineSelfDispenseEvent -- type: instantAction - id: ArtifactActivate +- type: entity + id: ActionArtifactActivate name: activate-artifact-action-name description: activate-artifact-action-desc - icon: - sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi - state: ano01 - useDelay: 60 - event: !type:ArtifactSelfActivateEvent + noSpawn: true + components: + - type: InstantAction + icon: + sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi + state: ano01 + useDelay: 60 + event: !type:ArtifactSelfActivateEvent -- type: instantAction - id: ToggleBlock +- type: entity + id: ActionToggleBlock name: action-name-blocking description: action-description-blocking - icon: { sprite: Objects/Weapons/Melee/shields.rsi, state: teleriot-icon } - iconOn: Objects/Weapons/Melee/shields.rsi/teleriot-on.png - event: !type:ToggleActionEvent + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Objects/Weapons/Melee/shields.rsi, state: teleriot-icon } + iconOn: Objects/Weapons/Melee/shields.rsi/teleriot-on.png + event: !type:ToggleActionEvent -- type: instantAction - id: ClearNetworkLinkOverlays +- type: entity + id: ActionClearNetworkLinkOverlays name: network-configurator-clear-network-link-overlays description: network-configurator-clear-network-link-overlays-desc - icon: { sprite: Objects/Tools/multitool.rsi, state: icon } - event: !type:ClearAllOverlaysEvent + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Objects/Tools/multitool.rsi, state: icon } + event: !type:ClearAllOverlaysEvent -- type: instantAction - id: AnimalLayEgg +- type: entity + id: ActionAnimalLayEgg name: action-name-lay-egg description: action-description-lay-egg - icon: { sprite: Objects/Consumable/Food/egg.rsi, state: icon } - useDelay: 60 - serverEvent: !type:EggLayInstantActionEvent + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Objects/Consumable/Food/egg.rsi, state: icon } + useDelay: 60 + event: !type:EggLayInstantActionEvent -- type: instantAction - id: Sleep +- type: entity + id: ActionSleep name: action-name-sleep description: action-desc-sleep - checkCanInteract: false - icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } - event: !type:SleepActionEvent + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } + event: !type:SleepActionEvent -- type: instantAction - id: Wake +- type: entity + id: ActionWake name: action-name-wake description: action-desc-wake - icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } - checkCanInteract: false - event: !type:WakeActionEvent + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon } + checkCanInteract: false + event: !type:WakeActionEvent -- type: instantAction - id: ActivateHonkImplant +- type: entity + id: ActionActivateHonkImplant name: action-name-honk description: action-desc-honk - icon: { sprite: Objects/Fun/bikehorn.rsi, state: icon } - event: !type:ActivateImplantEvent - useDelay: 1 + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Objects/Fun/bikehorn.rsi, state: icon } + event: !type:ActivateImplantEvent + useDelay: 1 diff --git a/Resources/Prototypes/Catalog/catalog.yml b/Resources/Prototypes/Catalog/catalog.yml index 9b09de8a57..49cdef2a40 100644 --- a/Resources/Prototypes/Catalog/catalog.yml +++ b/Resources/Prototypes/Catalog/catalog.yml @@ -2,9 +2,9 @@ id: DebugListing name: debug name description: debug desc - categories: + categories: - Debug - cost: + cost: DebugDollar: 10 Telecrystal: 10 @@ -12,33 +12,33 @@ id: DebugListing3 name: debug name 3 description: debug desc 3 - categories: + categories: - Debug - cost: + cost: DebugDollar: 10 - type: listing id: DebugListing5 name: debug name 5 description: debug desc 5 - categories: + categories: - Debug - type: listing id: DebugListing4 name: debug name 4 description: debug desc 4 - productAction: Scream - categories: + productAction: ActionScream + categories: - Debug - cost: + cost: DebugDollar: 1 - type: listing id: DebugListing2 name: debug name 2 description: debug desc 2 - categories: + categories: - Debug2 - cost: - DebugDollar: 10 \ No newline at end of file + cost: + DebugDollar: 10 diff --git a/Resources/Prototypes/Catalog/revenant_catalog.yml b/Resources/Prototypes/Catalog/revenant_catalog.yml index 55fe239348..84f45d1607 100644 --- a/Resources/Prototypes/Catalog/revenant_catalog.yml +++ b/Resources/Prototypes/Catalog/revenant_catalog.yml @@ -2,7 +2,7 @@ id: RevenantDefile name: Defile description: Defiles the surrounding area, ripping up floors, damaging windows, opening containers, and throwing items. Using it leaves you vulnerable to attacks for a short period of time. - productAction: RevenantDefile + productAction: ActionRevenantDefile cost: StolenEssence: 10 categories: @@ -15,7 +15,7 @@ id: RevenantOverloadLights name: Overload Lights description: Overloads all nearby lights, causing lights to pulse and sending out dangerous lightning. Using it leaves you vulnerable to attacks for a long period of time. - productAction: RevenantOverloadLights + productAction: ActionRevenantOverloadLights cost: StolenEssence: 25 categories: @@ -28,7 +28,7 @@ # id: RevenantBlight # name: Blight # description: Infects all nearby organisms with an infectious disease that causes toxic buildup and tiredness. Using it leaves you vulnerable to attacks for a medium period of time. -# productAction: RevenantBlight +# productAction: ActionRevenantBlight # cost: # StolenEssence: 75 # categories: @@ -41,7 +41,7 @@ id: RevenantMalfunction name: Malfunction description: Makes nearby electronics stop working properly. Using it leaves you vulnerable to attacks for a long period of time. - productAction: RevenantMalfunction + productAction: ActionRevenantMalfunction cost: StolenEssence: 125 categories: diff --git a/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml b/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml index bf02642cb7..d9e264a475 100644 --- a/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml +++ b/Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml @@ -14,9 +14,14 @@ id: ClothingMaskPullableBase components: - type: Mask - toggleAction: - name: action-name-mask - description: action-description-mask-toggle - icon: { sprite: Clothing/Mask/gas.rsi, state: icon } - iconOn: Interface/Default/blocked.png - event: !type:ToggleMaskEvent + +- type: entity + id: ActionToggleMask + name: action-name-mask + description: action-description-mask-toggle + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Mask/gas.rsi, state: icon } + iconOn: Interface/Default/blocked.png + event: !type:ToggleMaskEvent diff --git a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml index daf167b3f7..1ae5377381 100644 --- a/Resources/Prototypes/Entities/Clothing/Neck/misc.yml +++ b/Resources/Prototypes/Entities/Clothing/Neck/misc.yml @@ -44,3 +44,14 @@ sprite: Clothing/Neck/Misc/lawyerbadge.rsi - type: TypingIndicatorClothing proto: lawyer + +- type: entity + id: ActionStethoscope + name: stethoscope-verb + noSpawn: true + components: + - type: EntityTargetAction + icon: Clothing/Neck/Misc/stethoscope.rsi/icon.png + event: !type:StethoscopeActionEvent + checkCanInteract: false + priority: -1 diff --git a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml index c4eb38ed80..670e9a00ed 100644 --- a/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml +++ b/Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml @@ -103,13 +103,6 @@ sprite: Clothing/OuterClothing/Suits/spaceninja.rsi - type: StealthClothing visibility: 0.3 - toggleAction: - # have to plan (un)cloaking ahead of time - useDelay: 5 - name: action-name-toggle-phase-cloak - description: action-desc-toggle-phase-cloak - priority: -9 - event: !type:ToggleStealthEvent - type: PressureProtection highPressureMultiplier: 0.6 lowPressureMultiplier: 1000 @@ -123,6 +116,18 @@ Piercing: 0.6 Heat: 0.6 +- type: entity + id: ActionTogglePhaseCloak + name: action-name-toggle-phase-cloak + description: action-desc-toggle-phase-cloak + noSpawn: true + components: + - type: InstantAction + # have to plan (un)cloaking ahead of time + useDelay: 5 + priority: -9 + event: !type:ToggleStealthEvent + - type: entity parent: ClothingOuterBase id: ClothingOuterSuitChicken diff --git a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml index 08bb0c1ad0..c2094eacd1 100644 --- a/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml +++ b/Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml @@ -12,13 +12,7 @@ - type: Clothing sprite: Clothing/Shoes/Boots/magboots.rsi - type: Magboots - toggleAction: - icon: { sprite: Clothing/Shoes/Boots/magboots.rsi, state: icon } - iconOn: { sprite : Clothing/Shoes/Boots/magboots.rsi, state: icon-on } - name: action-name-magboot-toggle - description: action-decription-magboot-toggle - itemIconStyle: NoItem - event: !type:ToggleMagbootsEvent + toggleAction: ActionToggleMagboots - type: ClothingSpeedModifier walkModifier: 0.85 sprintModifier: 0.8 @@ -48,13 +42,7 @@ - type: Clothing sprite: Clothing/Shoes/Boots/magboots-advanced.rsi - type: Magboots - toggleAction: - icon: { sprite: Clothing/Shoes/Boots/magboots-advanced.rsi, state: icon } - iconOn: Clothing/Shoes/Boots/magboots-advanced.rsi/icon-on.png - name: action-name-magboot-toggle - description: action-decription-magboot-toggle - itemIconStyle: NoItem - event: !type:ToggleMagbootsEvent + toggleAction: ActionToggleMagbootsAdvanced - type: ClothingSpeedModifier walkModifier: 1 sprintModifier: 1 @@ -92,29 +80,12 @@ - type: Clothing sprite: Clothing/Shoes/Boots/magboots-syndicate.rsi - type: Magboots - toggleAction: - icon: { sprite: Clothing/Shoes/Boots/magboots-syndicate.rsi, state: icon } - iconOn: Clothing/Shoes/Boots/magboots-syndicate.rsi/icon-on.png - name: action-name-magboot-toggle - description: action-decription-magboot-toggle - itemIconStyle: NoItem - event: !type:ToggleMagbootsEvent + toggleAction: ActionToggleMagbootsSyndie - type: ClothingSpeedModifier walkModifier: 0.95 sprintModifier: 0.9 enabled: false - type: GasTank - toggleAction: - name: action-name-internals-toggle - description: action-description-internals-toggle - icon: - sprite: Interface/Alerts/internals.rsi - state: internal2 - iconOn: - sprite: Interface/Alerts/internals.rsi - state: internal1 - event: !type:ToggleActionEvent - useDelay: 1 outputPressure: 42.6 air: # 2 minutes of thrust @@ -134,17 +105,6 @@ maxIntensity: 20 - type: Jetpack moleUsage: 0.00085 - toggleAction: - icon: - sprite: Objects/Tanks/Jetpacks/blue.rsi - state: icon - iconOn: - sprite: Objects/Tanks/Jetpacks/blue.rsi - state: icon-on - name: action-name-jetpack-toggle - description: action-description-jetpack-toggle - useDelay: 1.0 - event: !type:ToggleJetpackEvent - type: InputMover toParent: true - type: MovementSpeedModifier @@ -154,3 +114,40 @@ - type: Tag tags: - WhitelistChameleon + +- type: entity + id: ActionBaseToggleMagboots + name: action-name-magboot-toggle + description: action-description-magboot-toggle + noSpawn: true + components: + - type: InstantAction + itemIconStyle: NoItem + event: !type:ToggleMagbootsEvent + +- type: entity + id: ActionToggleMagboots + parent: ActionBaseToggleMagboots + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Shoes/Boots/magboots.rsi, state: icon } + iconOn: { sprite : Clothing/Shoes/Boots/magboots.rsi, state: icon-on } + +- type: entity + id: ActionToggleMagbootsAdvanced + parent: ActionBaseToggleMagboots + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Shoes/Boots/magboots-advanced.rsi, state: icon } + iconOn: Clothing/Shoes/Boots/magboots-advanced.rsi/icon-on.png + +- type: entity + id: ActionToggleMagbootsSyndie + parent: ActionBaseToggleMagboots + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Shoes/Boots/magboots-syndicate.rsi, state: icon } + iconOn: Clothing/Shoes/Boots/magboots-syndicate.rsi/icon-on.png diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml index 01a792e263..add7717298 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/animals.yml @@ -944,9 +944,9 @@ - type: MobStateActions actions: Critical: - - CritSuccumb - - CritFakeDeath - - CritLastWords + - ActionCritSuccumb + - ActionCritFakeDeath + - ActionCritLastWords - type: MobThresholds thresholds: 0: Alive @@ -1004,10 +1004,7 @@ wilhelmProbability: 0.001 # TODO: Remove CombatMode when Prototype Composition is added - type: CombatMode - combatToggleAction: - enabled: false - autoPopulate: false - name: action-name-combat + combatToggleAction: ActionCombatModeToggleOff - type: Bloodstream bloodMaxVolume: 50 - type: CanEscapeInventory @@ -2278,9 +2275,9 @@ - type: MobStateActions actions: Critical: - - CritSuccumb - - CritFakeDeath - - CritLastWords + - ActionCritSuccumb + - ActionCritFakeDeath + - ActionCritLastWords - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml index ab87316713..d41cb8a879 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml @@ -93,21 +93,7 @@ - FootstepSound - type: NoSlip - type: RatKing - actionRaiseArmy: - useDelay: 4 - icon: Interface/Actions/ratKingArmy.png - name: rat-king-raise-army-name - description: rat-king-raise-army-description - itemIconStyle: NoItem - event: !type:RatKingRaiseArmyActionEvent hungerPerArmyUse: 25 - actionDomain: - useDelay: 10 - icon: Interface/Actions/ratKingDomain.png - name: rat-king-domain-name - description: rat-king-domain-description - itemIconStyle: NoItem - event: !type:RatKingDomainActionEvent hungerPerDomainUse: 50 - type: MobsterAccent - type: Speech @@ -289,3 +275,27 @@ - type: GuideHelp guides: - MinorAntagonists + +- type: entity + id: ActionRatKingRaiseArmy + name: rat-king-raise-army-name + description: rat-king-raise-army-description + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/ratKingArmy.png + itemIconStyle: NoItem + event: !type:RatKingRaiseArmyActionEvent + useDelay: 4 + +- type: entity + id: ActionRatKingDomain + name: rat-king-domain-name + description: rat-king-domain-description + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + icon: Interface/Actions/ratKingDomain.png + itemIconStyle: NoItem + event: !type:RatKingDomainActionEvent diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml index 4c96e0506d..8bc72ad61b 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml @@ -114,7 +114,7 @@ speechVerb: Robotic - type: TypingIndicator proto: robot - + - type: entity parent: [ MobSiliconBase, BaseVehicle] id: MobSiliconBaseVehicle # for vehicles @@ -125,19 +125,13 @@ - type: GhostRole makeSentient: true - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 3.5 softness: 2 mask: /Textures/Effects/LightMasks/cone.png autoRot: true - + - type: entity parent: MobSiliconBaseVehicle id: MobTaxiBot diff --git a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml index 07b359e468..1cf56769c6 100644 --- a/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml +++ b/Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml @@ -73,9 +73,9 @@ - type: MobStateActions actions: Critical: - - CritSuccumb - - CritFakeDeath - - CritLastWords + - ActionCritSuccumb + - ActionCritFakeDeath + - ActionCritLastWords - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml index 5961ee7a6e..f6dcdcae3a 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml @@ -48,59 +48,17 @@ - type: IntrinsicUI uis: - key: enum.SolarControlConsoleUiKey.Key - toggleAction: - name: action-name-show-solar-console - description: action-description-show-solar-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowSolar - key: enum.CommunicationsConsoleUiKey.Key - toggleAction: - name: action-name-show-communications-console - description: action-description-show-communications-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowCommunications - key: enum.RadarConsoleUiKey.Key - toggleAction: - name: action-name-show-radar-console - description: action-description-show-radar-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowRadar - key: enum.CargoConsoleUiKey.Orders - toggleAction: - name: action-name-show-cargo-console - description: action-description-show-cargo-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowCargo - key: enum.CrewMonitoringUIKey.Key - toggleAction: - name: action-name-show-crew-monitoring-console - description: action-description-crew-monitoring-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowCrewMonitoring - key: enum.GeneralStationRecordConsoleKey.Key - toggleAction: - name: action-name-show-station-records-console - description: action-description-station-records-console - icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } - iconOn: Structures/Machines/parts.rsi/box_2.png - keywords: [ "AI", "console", "interface" ] - priority: -10 - event: !type:ToggleIntrinsicUIEvent + toggleAction: ActionAGhostShowStationRecords - type: SolarControlConsole # look ma i AM the computer! - type: CommunicationsConsole title: communicationsconsole-announcement-title-centcom @@ -123,3 +81,81 @@ - type: Stripping - type: SolutionScanner - type: IgnoreUIRange + +- type: entity + id: ActionAGhostShowSolar + name: action-name-show-solar-console + description: action-description-show-solar-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.SolarControlConsoleUiKey.Key } + +- type: entity + id: ActionAGhostShowCommunications + name: action-name-show-communications-console + description: action-description-show-communications-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.CommunicationsConsoleUiKey.Key } + +- type: entity + id: ActionAGhostShowRadar + name: action-name-show-radar-console + description: action-description-show-radar-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.RadarConsoleUiKey.Key } + +- type: entity + id: ActionAGhostShowCargo + name: action-name-show-cargo-console + description: action-description-show-cargo-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.CargoConsoleUiKey.Orders } + +- type: entity + id: ActionAGhostShowCrewMonitoring + name: action-name-show-crew-monitoring-console + description: action-description-crew-monitoring-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.CrewMonitoringUIKey.Key } + +- type: entity + id: ActionAGhostShowStationRecords + name: action-name-show-station-records-console + description: action-description-station-records-console + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Structures/Machines/parts.rsi, state: box_0 } + iconOn: Structures/Machines/parts.rsi/box_2.png + keywords: [ "AI", "console", "interface" ] + priority: -10 + event: !type:ToggleIntrinsicUIEvent { key: enum.GeneralStationRecordConsoleKey.Key } diff --git a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml index befa2cfa3b..9ef481583f 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/dragon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/dragon.yml @@ -76,8 +76,8 @@ - type: MobStateActions actions: Critical: - - CritSuccumb - - CritLastWords + - ActionCritSuccumb + - ActionCritLastWords - type: MobThresholds thresholds: 0: Alive @@ -123,11 +123,6 @@ - Door tags: - Wall - devourAction: - event: !type:DevourActionEvent - icon: Interface/Actions/devour.png - name: action-name-devour - description: action-description-devour - type: Tag tags: - CannotSuicide @@ -139,14 +134,7 @@ - type: Dragon spawnsLeft: 2 spawnsProto: MobCarpDragon - spawnRiftAction: - event: !type:DragonSpawnRiftActionEvent - icon: - sprite: Interface/Actions/carp_rift.rsi - state: icon - name: action-name-carp-rift - description: action-description-carp-rift - useDelay: 1 + spawnRiftAction: ActionSpawnRift - type: GuideHelp guides: - MinorAntagonists @@ -173,3 +161,26 @@ damage: groups: Brute: 15 + +- type: entity + id: ActionSpawnRift + name: action-name-carp-rift + description: action-description-carp-rift + noSpawn: true + components: + - type: InstantAction + icon: + sprite: Interface/Actions/carp_rift.rsi + state: icon + event: !type:DragonSpawnRiftActionEvent + useDelay: 1 + +- type: entity + id: ActionDevour + name: action-name-devour + description: action-description-devour + noSpawn: true + components: + - type: EntityTargetAction + icon: Interface/Actions/devour.png + event: !type:DevourActionEvent diff --git a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml index f87813c721..4d79f6bdae 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/guardian.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/guardian.yml @@ -232,3 +232,15 @@ - type: RandomMetadata nameSegments: - names_clown + +- type: entity + id: ActionToggleGuardian + name: action-name-guardian + description: action-description-guardian + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/manifest.png + event: !type:GuardianToggleActionEvent + useDelay: 2 + checkCanInteract: false diff --git a/Resources/Prototypes/Entities/Mobs/Player/observer.yml b/Resources/Prototypes/Entities/Mobs/Player/observer.yml index 30e71f22bd..9752d45c35 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/observer.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/observer.yml @@ -63,3 +63,51 @@ - type: Tag tags: - BypassInteractionRangeChecks + +- type: entity + id: ActionGhostBoo + name: action-name-boo + description: action-description-boo + noSpawn: true + components: + - type: InstantAction + icon: Interface/Actions/scream.png + checkCanInteract: false + event: !type:BooActionEvent + useDelay: 120 + +- type: entity + id: ActionToggleLighting + name: ghost-gui-toggle-lighting-manager-name + description: ghost-gui-toggle-lighting-manager-desc + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/light.svg.192dpi.png + clientExclusive: true + checkCanInteract: false + event: !type:ToggleLightingActionEvent + +- type: entity + id: ActionToggleFov + name: ghost-gui-toggle-fov-name + description: ghost-gui-toggle-fov-desc + noSpawn: true + components: + - type: InstantAction + icon: Interface/VerbIcons/vv.svg.192dpi.png + clientExclusive: true + checkCanInteract: false + event: !type:ToggleFoVActionEvent + +- type: entity + id: ActionToggleGhosts + name: ghost-gui-toggle-ghost-visibility-name + description: ghost-gui-toggle-ghost-visibility-desc + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Mobs/Ghosts/ghost_human.rsi, state: icon } + clientExclusive: true + checkCanInteract: false + event: !type:ToggleGhostsActionEvent diff --git a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml index 903a849ad8..e5c0a61677 100644 --- a/Resources/Prototypes/Entities/Mobs/Player/silicon.yml +++ b/Resources/Prototypes/Entities/Mobs/Player/silicon.yml @@ -171,12 +171,6 @@ doAfterDelay: 8 - type: Actions - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 3.5 diff --git a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml index 87e3b8f738..a835c289cc 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/arachnid.yml @@ -32,7 +32,7 @@ Slash: 4 # Fun - type: Sericulture - actionProto: SericultureAction + action: ActionSericulture productionLength: 3 entityProduced: MaterialWebSilk1 hungerCost: 9 # Should total to 12 total silk on full hunger diff --git a/Resources/Prototypes/Entities/Mobs/Species/base.yml b/Resources/Prototypes/Entities/Mobs/Species/base.yml index 0d2d332696..f2625090f6 100644 --- a/Resources/Prototypes/Entities/Mobs/Species/base.yml +++ b/Resources/Prototypes/Entities/Mobs/Species/base.yml @@ -203,9 +203,9 @@ - type: MobStateActions actions: Critical: - - CritSuccumb - - CritFakeDeath - - CritLastWords + - ActionCritSuccumb + - ActionCritFakeDeath + - ActionCritLastWords - type: MobThresholds thresholds: 0: Alive diff --git a/Resources/Prototypes/Entities/Objects/Devices/pda.yml b/Resources/Prototypes/Entities/Objects/Devices/pda.yml index 53bf43f742..f3886170d9 100644 --- a/Resources/Prototypes/Entities/Objects/Devices/pda.yml +++ b/Resources/Prototypes/Entities/Objects/Devices/pda.yml @@ -51,12 +51,6 @@ - idcard - Belt - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 1.5 diff --git a/Resources/Prototypes/Entities/Objects/Fun/pai.yml b/Resources/Prototypes/Entities/Objects/Fun/pai.yml index 5ac39cc352..a289e92eb6 100644 --- a/Resources/Prototypes/Entities/Objects/Fun/pai.yml +++ b/Resources/Prototypes/Entities/Objects/Fun/pai.yml @@ -25,13 +25,6 @@ - type: Input context: "human" - type: PAI - midiAction: - name: action-name-pai-play-midi - checkCanInteract: false - icon: Interface/Actions/pai-midi.png - description: action-description-pai-play-midi - event: !type:OpenUiActionEvent - key: enum.InstrumentUiKey.Key - type: BlockMovement - type: ToggleableGhostRole examineTextMindPresent: pai-system-pai-installed @@ -104,3 +97,15 @@ Off: { state: syndicate-pai-off-overlay } Searching: { state: syndicate-pai-searching-overlay } On: { state: syndicate-pai-on-overlay } + +- type: entity + id: ActionPAIPlayMidi + name: action-name-pai-play-midi + description: action-description-pai-play-midi + noSpawn: true + components: + - type: InstantAction + checkCanInteract: false + icon: Interface/Actions/pai-midi.png + event: !type:OpenUiActionEvent + key: enum.InstrumentUiKey.Key diff --git a/Resources/Prototypes/Entities/Objects/Magic/books.yml b/Resources/Prototypes/Entities/Objects/Magic/books.yml index 779c688035..79c0cd9a78 100644 --- a/Resources/Prototypes/Entities/Objects/Magic/books.yml +++ b/Resources/Prototypes/Entities/Objects/Magic/books.yml @@ -19,10 +19,9 @@ parent: BaseSpellbook components: - type: Spellbook - instantSpells: + spells: FlashRune: -1 - worldSpells: - SpawnMagicarpSpell: -1 + ActionSpawnMagicarpSpell: -1 - type: entity id: ForceWallSpellbook @@ -34,8 +33,8 @@ layers: - state: bookforcewall - type: Spellbook - instantSpells: - ForceWall: -1 + spells: + ActionForceWall: -1 - type: entity id: BlinkBook @@ -47,8 +46,8 @@ layers: - state: spellbook - type: Spellbook - worldSpells: - Blink: -1 + spells: + ActionBlink: -1 - type: entity id: SmiteBook @@ -60,8 +59,8 @@ layers: - state: spellbook - type: Spellbook - entitySpells: - Smite: -1 + spells: + ActionSmite: -1 - type: entity id: KnockSpellbook @@ -73,8 +72,8 @@ layers: - state: bookknock - type: Spellbook - instantSpells: - Knock: -1 + spells: + ActionKnock: -1 - type: entity id: FireballSpellbook @@ -86,8 +85,8 @@ layers: - state: bookfireball - type: Spellbook - worldSpells: - Fireball: -1 + spells: + ActionFireball: -1 - type: entity id: ScrollRunes @@ -99,7 +98,7 @@ layers: - state: spell_default - type: Spellbook - instantSpells: + spells: FlashRune: -1 ExplosionRune: -1 IgniteRune: -1 diff --git a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml index a8954fd241..772dd45029 100644 --- a/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml +++ b/Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml @@ -38,7 +38,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: ToggleLight + implantAction: ActionToggleLight - type: PointLight enabled: false radius: 2.5 @@ -51,12 +51,6 @@ - HideContextMenu - Flashlight - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: entity parent: BaseSubdermalImplant @@ -66,7 +60,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: ActivateHonkImplant + implantAction: ActionActivateHonkImplant - type: TriggerImplantAction - type: EmitSoundOnTrigger sound: @@ -114,7 +108,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: OpenStorageImplant + implantAction: ActionOpenStorageImplant - type: Item size: 9999 - type: Storage @@ -136,7 +130,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: ActivateFreedomImplant + implantAction: ActionActivateFreedomImplant - type: entity parent: BaseSubdermalImplant @@ -146,7 +140,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: OpenUplinkImplant + implantAction: ActionOpenUplinkImplant - type: Store preset: StorePresetUplink balance: @@ -164,7 +158,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: ActivateEmpImplant + implantAction: ActionActivateEmpImplant - type: TriggerImplantAction - type: EmpOnTrigger range: 1.75 @@ -179,7 +173,7 @@ noSpawn: true components: - type: SubdermalImplant - implantAction: ActivateDnaScramblerImplant + implantAction: ActionActivateDnaScramblerImplant #Nuclear Operative/Special Exclusive implants @@ -192,7 +186,7 @@ components: - type: SubdermalImplant permanent: true - implantAction: ActivateMicroBomb + implantAction: ActionActivateMicroBomb - type: TriggerOnMobstateChange mobState: - Dead diff --git a/Resources/Prototypes/Entities/Objects/Shields/shields.yml b/Resources/Prototypes/Entities/Objects/Shields/shields.yml index 1005558ea8..af1aa6612c 100644 --- a/Resources/Prototypes/Entities/Objects/Shields/shields.yml +++ b/Resources/Prototypes/Entities/Objects/Shields/shields.yml @@ -30,12 +30,6 @@ Slash: 1 Piercing: 1 Heat: 1 - blockingToggleAction: - name: action-name-blocking - description: action-description-blocking - icon: { sprite: Objects/Weapons/Melee/shields.rsi, state: teleriot-icon } - iconOn: Objects/Weapons/Melee/shields.rsi/teleriot-on.png - event: !type:ToggleActionEvent - type: Damageable damageContainer: Shield - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml index 0328a7b149..f8ad5c2a21 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml @@ -79,3 +79,14 @@ - type: Clothing slots: - Belt + +- type: entity + id: ActionBibleSummon + name: bible-summon-verb + description: bible-summon-verb-desc + noSpawn: true + components: + - type: InstantAction + icon: { sprite: Clothing/Head/Hats/witch.rsi, state: icon } + event: !type:SummonActionEvent + useDelay: 1 diff --git a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml index a4e2af4d45..764fd7ea34 100644 --- a/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml +++ b/Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml @@ -23,6 +23,17 @@ containers: provided_container: !type:Container { } +- type: entity + id: ActionBorgSwapModule + name: action-name-swap-module + description: action-desc-swap-module + noSpawn: true + components: + - type: InstantAction + itemIconStyle: BigItem + useDelay: 0.5 + event: !type:BorgModuleActionSelectedEvent + - type: entity id: BaseBorgModuleCargo parent: BaseBorgModule diff --git a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml index 7b544f77f3..7f4ee54f79 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml @@ -21,17 +21,6 @@ - key: enum.SharedGasTankUiKey.Key type: GasTankBoundUserInterface - type: GasTank - toggleAction: - name: action-name-internals-toggle - description: action-description-internals-toggle - icon: - sprite: Interface/Alerts/internals.rsi - state: internal2 - iconOn: - sprite: Interface/Alerts/internals.rsi - state: internal1 - event: !type:ToggleActionEvent - useDelay: 1 outputPressure: 21.3 air: # If gas tank volume is changed, adjust MinimumTritiumOxyburnEnergy in Atmospherics.cs by the same proportions diff --git a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml index dd2ca6f9c7..6870ca5f0d 100644 --- a/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml +++ b/Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml @@ -53,21 +53,26 @@ temperature: 293.15 - type: Jetpack moleUsage: 0.00085 - toggleAction: - icon: - sprite: Objects/Tanks/Jetpacks/blue.rsi - state: icon - iconOn: - sprite: Objects/Tanks/Jetpacks/blue.rsi - state: icon-on - name: action-name-jetpack-toggle - description: action-description-jetpack-toggle - useDelay: 1.0 - event: !type:ToggleJetpackEvent - type: Appearance - type: StaticPrice price: 100 +- type: entity + id: ActionToggleJetpack + name: action-name-jetpack-toggle + description: action-description-jetpack-toggle + noSpawn: true + components: + - type: InstantAction + icon: + sprite: Objects/Tanks/Jetpacks/blue.rsi + state: icon + iconOn: + sprite: Objects/Tanks/Jetpacks/blue.rsi + state: icon-on + useDelay: 1.0 + event: !type:ToggleJetpackEvent + #Empty blue - type: entity id: JetpackBlue diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml b/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml new file mode 100644 index 0000000000..f1872ee299 --- /dev/null +++ b/Resources/Prototypes/Entities/Objects/Vehicles/actions.yml @@ -0,0 +1,10 @@ +- type: entity + id: ActionVehicleHorn + name: action-name-honk + description: action-desc-honk + noSpawn: true + components: + - type: InstantAction + useDelay: 3.4 + icon: Objects/Fun/bikehorn.rsi/icon.png + event: !type:HonkActionEvent diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml index cf0dee3659..d807bcc5a9 100644 --- a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml +++ b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml @@ -103,12 +103,6 @@ map: ["enum.VehicleVisualLayers.AutoAnimate"] noRot: true - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 3.5 @@ -250,12 +244,6 @@ buckleOffset: "0.1, -0.05" maxBuckleDistance: 1 - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 3.5 @@ -345,12 +333,6 @@ baseWalkSpeed: 4.5 baseSprintSpeed: 7 - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight enabled: false radius: 3.5 diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml index b2ad3ff702..e0f5357b7e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml @@ -66,10 +66,7 @@ interactSuccessSound: path: /Audio/Effects/double_beep.ogg - type: CombatMode - combatToggleAction: - enabled: false - autoPopulate: false - name: action-name-combat + combatToggleAction: ActionCombatModeToggleOff - type: Damageable damageContainer: Inorganic - type: Destructible diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml index 6933e5908a..d182d9a00e 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml @@ -7,12 +7,6 @@ components: - type: Sharp - type: UnpoweredFlashlight - toggleAction: - name: action-name-toggle-light - description: action-description-toggle-light - icon: { sprite: Objects/Tools/flashlight.rsi, state: flashlight } - iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png - event: !type:ToggleActionEvent - type: PointLight color: "#ffeead" enabled: false diff --git a/Resources/Prototypes/Magic/forcewall_spells.yml b/Resources/Prototypes/Magic/forcewall_spells.yml index 815852ac63..9c4ff6cf8c 100644 --- a/Resources/Prototypes/Magic/forcewall_spells.yml +++ b/Resources/Prototypes/Magic/forcewall_spells.yml @@ -1,15 +1,18 @@ -- type: instantAction - id: ForceWall +- type: entity + id: ActionForceWall name: action-name-spell-forcewall description: action-description-spell-forcewall - useDelay: 10 - itemIconStyle: BigAction - sound: !type:SoundPathSpecifier - path: /Audio/Magic/forcewall.ogg - icon: - sprite: Objects/Magic/magicactions.rsi - state: shield - serverEvent: !type:InstantSpawnSpellEvent - prototype: WallForce - posData: !type:TargetInFront - speech: action-speech-spell-forcewall + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + itemIconStyle: BigAction + sound: !type:SoundPathSpecifier + path: /Audio/Magic/forcewall.ogg + icon: + sprite: Objects/Magic/magicactions.rsi + state: shield + event: !type:InstantSpawnSpellEvent + prototype: WallForce + posData: !type:TargetInFront + speech: action-speech-spell-forcewall diff --git a/Resources/Prototypes/Magic/knock_spell.yml b/Resources/Prototypes/Magic/knock_spell.yml index b9fd07e978..69c8fe1e1e 100644 --- a/Resources/Prototypes/Magic/knock_spell.yml +++ b/Resources/Prototypes/Magic/knock_spell.yml @@ -1,11 +1,14 @@ -- type: instantAction - id: Knock +- type: entity + id: ActionKnock name: action-name-spell-knock description: action-description-spell-knock - useDelay: 10 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: knock - serverEvent: !type:KnockSpellEvent - speech: action-speech-spell-knock + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: knock + event: !type:KnockSpellEvent + speech: action-speech-spell-knock diff --git a/Resources/Prototypes/Magic/projectile_spells.yml b/Resources/Prototypes/Magic/projectile_spells.yml index 15a6b261b0..93e9fbea33 100644 --- a/Resources/Prototypes/Magic/projectile_spells.yml +++ b/Resources/Prototypes/Magic/projectile_spells.yml @@ -1,17 +1,20 @@ -- type: worldTargetAction - id: Fireball +- type: entity + id: ActionFireball name: action-name-spell-fireball description: action-description-spell-fireball - useDelay: 30 - itemIconStyle: BigAction - checkCanAccess: false - range: 60 - sound: !type:SoundPathSpecifier - path: /Audio/Magic/fireball.ogg - icon: - sprite: Objects/Magic/magicactions.rsi - state: fireball - serverEvent: !type:ProjectileSpellEvent - prototype: ProjectileFireball - posData: !type:TargetCasterPos - speech: action-speech-spell-fireball + noSpawn: true + components: + - type: WorldTargetAction + useDelay: 30 + itemIconStyle: BigAction + checkCanAccess: false + range: 60 + sound: !type:SoundPathSpecifier + path: /Audio/Magic/fireball.ogg + icon: + sprite: Objects/Magic/magicactions.rsi + state: fireball + event: !type:ProjectileSpellEvent + prototype: ProjectileFireball + posData: !type:TargetCasterPos + speech: action-speech-spell-fireball diff --git a/Resources/Prototypes/Magic/rune_spells.yml b/Resources/Prototypes/Magic/rune_spells.yml index 4583390c9c..34213575ff 100644 --- a/Resources/Prototypes/Magic/rune_spells.yml +++ b/Resources/Prototypes/Magic/rune_spells.yml @@ -1,47 +1,59 @@ -- type: instantAction - id: FlashRune +- type: entity + id: ActionFlashRune name: action-name-spell-rune-flash description: action-description-spell-rune-flash - useDelay: 10 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: spell_default - serverEvent: !type:InstantSpawnSpellEvent - prototype: FlashRune + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: spell_default + event: !type:InstantSpawnSpellEvent + prototype: FlashRune -- type: instantAction - id: ExplosionRune +- type: entity + id: ActionExplosionRune name: action-name-spell-rune-explosion description: action-description-spell-rune-explosion - useDelay: 20 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: spell_default - serverEvent: !type:InstantSpawnSpellEvent - prototype: ExplosionRune + noSpawn: true + components: + - type: InstantAction + useDelay: 20 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: spell_default + event: !type:InstantSpawnSpellEvent + prototype: ExplosionRune -- type: instantAction - id: IgniteRune +- type: entity + id: ActionIgniteRune name: action-name-spell-rune-ignite description: action-description-spell-rune-ignite - useDelay: 15 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: spell_default - serverEvent: !type:InstantSpawnSpellEvent - prototype: IgniteRune + noSpawn: true + components: + - type: InstantAction + useDelay: 15 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: spell_default + event: !type:InstantSpawnSpellEvent + prototype: IgniteRune -- type: instantAction - id: StunRune +- type: entity + id: ActionStunRune name: action-name-spell-rune-stun description: action-description-spell-rune-stun - useDelay: 10 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: spell_default - serverEvent: !type:InstantSpawnSpellEvent - prototype: StunRune + noSpawn: true + components: + - type: InstantAction + useDelay: 10 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: spell_default + event: !type:InstantSpawnSpellEvent + prototype: StunRune diff --git a/Resources/Prototypes/Magic/smite_spells.yml b/Resources/Prototypes/Magic/smite_spells.yml index b85fff98f4..72f33f3f52 100644 --- a/Resources/Prototypes/Magic/smite_spells.yml +++ b/Resources/Prototypes/Magic/smite_spells.yml @@ -1,18 +1,21 @@ -- type: entityTargetAction - id: Smite +- type: entity + id: ActionSmite name: action-name-spell-smite description: action-description-spell-smite - useDelay: 60 - itemIconStyle: BigAction - whitelist: - components: - - Body - canTargetSelf: false - interactOnMiss: false - sound: !type:SoundPathSpecifier - path: /Audio/Magic/disintegrate.ogg - icon: - sprite: Objects/Magic/magicactions.rsi - state: gib - serverEvent: !type:SmiteSpellEvent - speech: action-speech-spell-smite + noSpawn: true + components: + - type: EntityTargetAction + useDelay: 60 + itemIconStyle: BigAction + whitelist: + components: + - Body + canTargetSelf: false + interactOnMiss: false + sound: !type:SoundPathSpecifier + path: /Audio/Magic/disintegrate.ogg + icon: + sprite: Objects/Magic/magicactions.rsi + state: gib + event: !type:SmiteSpellEvent + speech: action-speech-spell-smite diff --git a/Resources/Prototypes/Magic/spawn_spells.yml b/Resources/Prototypes/Magic/spawn_spells.yml index 40a1d38d38..9cd66ec3c1 100644 --- a/Resources/Prototypes/Magic/spawn_spells.yml +++ b/Resources/Prototypes/Magic/spawn_spells.yml @@ -1,16 +1,19 @@ -- type: worldTargetAction - id: SpawnMagicarpSpell +- type: entity + id: ActionSpawnMagicarpSpell name: action-name-spell-summon-magicarp description: action-description-spell-summon-magicarp - useDelay: 10 - range: 4 - itemIconStyle: BigAction - icon: - sprite: Objects/Magic/magicactions.rsi - state: spell_default - serverEvent: !type:WorldSpawnSpellEvent - prototypes: + noSpawn: true + components: + - type: WorldTargetAction + useDelay: 10 + range: 4 + itemIconStyle: BigAction + icon: + sprite: Objects/Magic/magicactions.rsi + state: spell_default + event: !type:WorldSpawnSpellEvent + prototypes: - id: MobCarpMagic amount: 3 - offsetVector2: 0, 1 - speech: action-speech-spell-summon-magicarp + offset: 0, 1 + speech: action-speech-spell-summon-magicarp diff --git a/Resources/Prototypes/Magic/staves.yml b/Resources/Prototypes/Magic/staves.yml index 833c1215f0..4713a838f8 100644 --- a/Resources/Prototypes/Magic/staves.yml +++ b/Resources/Prototypes/Magic/staves.yml @@ -14,13 +14,8 @@ - state: nothing-unshaded shader: unshaded - type: ActionOnInteract - entityActions: - - whitelist: { components: [ PointLight ] } - charges: 25 - sound: /Audio/Magic/blink.ogg - event: !type:ChangeComponentsSpellEvent - toAdd: - - type: RgbLightController + actions: + - ActionRgbLight - type: Item inhandVisuals: left: @@ -34,4 +29,16 @@ - type: RgbLightController - type: PointLight enabled: true - radius: 2 \ No newline at end of file + radius: 2 + +- type: entity + id: ActionRgbLight + noSpawn: true + components: + - type: EntityTargetAction + whitelist: { components: [ PointLight ] } + charges: 25 + sound: /Audio/Magic/blink.ogg + event: !type:ChangeComponentsSpellEvent + toAdd: + - type: RgbLightController diff --git a/Resources/Prototypes/Magic/teleport_spells.yml b/Resources/Prototypes/Magic/teleport_spells.yml index 230ae024b7..8dbf7929a7 100644 --- a/Resources/Prototypes/Magic/teleport_spells.yml +++ b/Resources/Prototypes/Magic/teleport_spells.yml @@ -1,14 +1,17 @@ -- type: worldTargetAction - id: Blink +- type: entity + id: ActionBlink name: action-name-spell-blink description: action-description-spell-blink - useDelay: 10 - range: 16 # default examine-range. - # ^ should probably add better validation that the clicked location is on the users screen somewhere, - itemIconStyle: BigAction - checkCanAccess: false - repeat: true - icon: - sprite: Objects/Magic/magicactions.rsi - state: blink - serverEvent: !type:TeleportSpellEvent + noSpawn: true + components: + - type: WorldTargetAction + useDelay: 10 + range: 16 # default examine-range. + # ^ should probably add better validation that the clicked location is on the users screen somewhere, + itemIconStyle: BigAction + checkCanAccess: false + repeat: true + icon: + sprite: Objects/Magic/magicactions.rsi + state: blink + event: !type:TeleportSpellEvent diff --git a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml index 43e0e7dc97..aafa07be79 100644 --- a/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml +++ b/Resources/Prototypes/Roles/Jobs/Civilian/mime.yml @@ -34,3 +34,15 @@ innerclothingskirt: ClothingUniformJumpskirtMime satchel: ClothingBackpackSatchelMimeFilled duffelbag: ClothingBackpackDuffelMimeFilled + +- type: entity + id: ActionMimeInvisibleWall + name: mime-invisible-wall + description: mime-invisible-wall-desc + noSpawn: true + components: + - type: InstantAction + priority: -1 + useDelay: 30 + icon: Structures/Walls/solid.rsi/full.png + event: !type:InvisibleWallActionEvent diff --git a/Resources/mapping_actions.yml b/Resources/mapping_actions.yml index 3062e45842..9bd170ee35 100644 --- a/Resources/mapping_actions.yml +++ b/Resources/mapping_actions.yml @@ -1,9 +1,8 @@ -- action: !type:InstantAction - checkCanInteract: False +- action: !type:InstantActionComponent icon: entity: ReinforcedWindow - name: ReinforcedWindow keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -12,12 +11,12 @@ entityType: ReinforcedWindow assignments: - 0: 3 -- action: !type:InstantAction - checkCanInteract: False + name: ReinforcedWindow +- action: !type:InstantActionComponent icon: entity: WallSolid - name: WallSolid keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -26,12 +25,12 @@ entityType: WallSolid assignments: - 0: 0 -- action: !type:InstantAction - checkCanInteract: False + name: WallSolid +- action: !type:InstantActionComponent icon: entity: WallReinforced - name: WallReinforced keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -40,12 +39,12 @@ entityType: WallReinforced assignments: - 0: 1 -- action: !type:InstantAction - checkCanInteract: False + name: WallReinforced +- action: !type:InstantActionComponent icon: entity: Window - name: Window keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -54,12 +53,12 @@ entityType: Window assignments: - 0: 2 -- action: !type:InstantAction - checkCanInteract: False + name: Window +- action: !type:InstantActionComponent icon: entity: Firelock - name: Firelock keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -68,12 +67,12 @@ entityType: Firelock assignments: - 0: 5 -- action: !type:InstantAction - checkCanInteract: False + name: Firelock +- action: !type:InstantActionComponent icon: entity: Grille - name: Grille keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -82,11 +81,11 @@ entityType: Grille assignments: - 0: 4 -- action: !type:InstantAction - checkCanInteract: False + name: Grille +- action: !type:InstantActionComponent icon: Interface/VerbIcons/delete.svg.192dpi.png - name: action-name-mapping-erase keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -99,12 +98,12 @@ - 4: 9 - 5: 9 - 6: 9 -- action: !type:InstantAction - checkCanInteract: False + name: action-name-mapping-erase +- action: !type:InstantActionComponent icon: entity: GasPipeStraight - name: GasPipeStraight keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -113,12 +112,12 @@ entityType: GasPipeStraight assignments: - 1: 0 -- action: !type:InstantAction - checkCanInteract: False + name: GasPipeStraight +- action: !type:InstantActionComponent icon: entity: GasPipeBend - name: GasPipeBend keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -127,12 +126,12 @@ entityType: GasPipeBend assignments: - 1: 1 -- action: !type:InstantAction - checkCanInteract: False + name: GasPipeBend +- action: !type:InstantActionComponent icon: entity: GasPipeTJunction - name: GasPipeTJunction keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -141,12 +140,12 @@ entityType: GasPipeTJunction assignments: - 1: 2 -- action: !type:InstantAction - checkCanInteract: False + name: GasPipeTJunction +- action: !type:InstantActionComponent icon: entity: GasPipeFourway - name: GasPipeFourway keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -155,12 +154,12 @@ entityType: GasPipeFourway assignments: - 1: 3 -- action: !type:InstantAction - checkCanInteract: False + name: GasPipeFourway +- action: !type:InstantActionComponent icon: entity: GasVentScrubber - name: GasVentScrubber keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -169,12 +168,12 @@ entityType: GasVentScrubber assignments: - 1: 4 -- action: !type:InstantAction - checkCanInteract: False + name: GasVentScrubber +- action: !type:InstantActionComponent icon: entity: GasVentPump - name: GasVentPump keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -183,12 +182,12 @@ entityType: GasVentPump assignments: - 1: 5 -- action: !type:InstantAction - checkCanInteract: False + name: GasVentPump +- action: !type:InstantActionComponent icon: entity: AirAlarm - name: AirAlarm keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -197,12 +196,12 @@ entityType: AirAlarm assignments: - 1: 6 -- action: !type:InstantAction - checkCanInteract: False + name: AirAlarm +- action: !type:InstantActionComponent icon: entity: FireAlarm - name: FireAlarm keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -211,12 +210,12 @@ entityType: FireAlarm assignments: - 1: 7 -- action: !type:InstantAction - checkCanInteract: False + name: FireAlarm +- action: !type:InstantActionComponent icon: entity: APCBasic - name: APCBasic keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -225,12 +224,12 @@ entityType: APCBasic assignments: - 2: 3 -- action: !type:InstantAction - checkCanInteract: False + name: APCBasic +- action: !type:InstantActionComponent icon: entity: CableApcExtension - name: CableApcExtension keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -239,12 +238,12 @@ entityType: CableApcExtension assignments: - 2: 0 -- action: !type:InstantAction - checkCanInteract: False + name: CableApcExtension +- action: !type:InstantActionComponent icon: entity: CableMV - name: CableMV keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -253,12 +252,12 @@ entityType: CableMV assignments: - 2: 1 -- action: !type:InstantAction - checkCanInteract: False + name: CableMV +- action: !type:InstantActionComponent icon: entity: CableHV - name: CableHV keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -267,12 +266,12 @@ entityType: CableHV assignments: - 2: 2 -- action: !type:InstantAction - checkCanInteract: False + name: CableHV +- action: !type:InstantActionComponent icon: entity: SubstationBasic - name: SubstationBasic keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -281,12 +280,12 @@ entityType: SubstationBasic assignments: - 2: 4 -- action: !type:InstantAction - checkCanInteract: False + name: SubstationBasic +- action: !type:InstantActionComponent icon: entity: Poweredlight - name: Poweredlight keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -295,12 +294,12 @@ entityType: Poweredlight assignments: - 2: 6 -- action: !type:InstantAction - checkCanInteract: False + name: Poweredlight +- action: !type:InstantActionComponent icon: entity: EmergencyLight - name: EmergencyLight keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -309,12 +308,12 @@ entityType: EmergencyLight assignments: - 2: 7 -- action: !type:InstantAction - checkCanInteract: False + name: EmergencyLight +- action: !type:InstantActionComponent icon: entity: SMESBasic - name: SMESBasic keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -323,12 +322,12 @@ entityType: SMESBasic assignments: - 2: 5 -- action: !type:InstantAction - checkCanInteract: False + name: SMESBasic +- action: !type:InstantActionComponent icon: entity: TableWood - name: TableWood keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -337,12 +336,12 @@ entityType: TableWood assignments: - 3: 0 -- action: !type:InstantAction - checkCanInteract: False + name: TableWood +- action: !type:InstantActionComponent icon: entity: Table - name: Table keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -351,12 +350,12 @@ entityType: Table assignments: - 3: 1 -- action: !type:InstantAction - checkCanInteract: False + name: Table +- action: !type:InstantActionComponent icon: entity: ChairWood - name: ChairWood keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -365,12 +364,12 @@ entityType: ChairWood assignments: - 3: 2 -- action: !type:InstantAction - checkCanInteract: False + name: ChairWood +- action: !type:InstantActionComponent icon: entity: Chair - name: Chair keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -379,12 +378,12 @@ entityType: Chair assignments: - 3: 3 -- action: !type:InstantAction - checkCanInteract: False + name: Chair +- action: !type:InstantActionComponent icon: entity: ChairOfficeLight - name: ChairOfficeLight keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -393,12 +392,12 @@ entityType: ChairOfficeLight assignments: - 3: 4 -- action: !type:InstantAction - checkCanInteract: False + name: ChairOfficeLight +- action: !type:InstantActionComponent icon: entity: StoolBar - name: StoolBar keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -407,12 +406,12 @@ entityType: StoolBar assignments: - 3: 6 -- action: !type:InstantAction - checkCanInteract: False + name: StoolBar +- action: !type:InstantActionComponent icon: entity: Stool - name: Stool keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -421,12 +420,12 @@ entityType: Stool assignments: - 3: 7 -- action: !type:InstantAction - checkCanInteract: False + name: Stool +- action: !type:InstantActionComponent icon: entity: Rack - name: Rack keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -435,12 +434,12 @@ entityType: Rack assignments: - 3: 8 -- action: !type:InstantAction - checkCanInteract: False + name: Rack +- action: !type:InstantActionComponent icon: entity: ChairOfficeDark - name: ChairOfficeDark keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -449,12 +448,12 @@ entityType: ChairOfficeDark assignments: - 3: 5 -- action: !type:InstantAction - checkCanInteract: False + name: ChairOfficeDark +- action: !type:InstantActionComponent icon: entity: LampGold - name: LampGold keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -463,12 +462,12 @@ entityType: LampGold assignments: - 3: 9 -- action: !type:InstantAction - checkCanInteract: False + name: LampGold +- action: !type:InstantActionComponent icon: entity: DisposalPipe - name: DisposalPipe keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -477,12 +476,12 @@ entityType: DisposalPipe assignments: - 4: 0 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalPipe +- action: !type:InstantActionComponent icon: entity: DisposalBend - name: DisposalBend keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -491,12 +490,12 @@ entityType: DisposalBend assignments: - 4: 1 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalBend +- action: !type:InstantActionComponent icon: entity: DisposalJunction - name: DisposalJunction keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -505,12 +504,12 @@ entityType: DisposalJunction assignments: - 4: 2 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalJunction +- action: !type:InstantActionComponent icon: entity: DisposalJunctionFlipped - name: DisposalJunctionFlipped keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -519,12 +518,12 @@ entityType: DisposalJunctionFlipped assignments: - 4: 3 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalJunctionFlipped +- action: !type:InstantActionComponent icon: entity: DisposalRouter - name: DisposalRouter keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -533,12 +532,12 @@ entityType: DisposalRouter assignments: - 4: 4 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalRouter +- action: !type:InstantActionComponent icon: entity: DisposalRouterFlipped - name: DisposalRouterFlipped keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -547,12 +546,12 @@ entityType: DisposalRouterFlipped assignments: - 4: 5 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalRouterFlipped +- action: !type:InstantActionComponent icon: entity: DisposalUnit - name: DisposalUnit keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -561,12 +560,12 @@ entityType: DisposalUnit assignments: - 4: 6 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalUnit +- action: !type:InstantActionComponent icon: entity: DisposalTrunk - name: DisposalTrunk keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -575,12 +574,12 @@ entityType: DisposalTrunk assignments: - 4: 7 -- action: !type:InstantAction - checkCanInteract: False + name: DisposalTrunk +- action: !type:InstantActionComponent icon: entity: SignDisposalSpace - name: SignDisposalSpace keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -589,12 +588,12 @@ entityType: SignDisposalSpace assignments: - 4: 8 -- action: !type:InstantAction - checkCanInteract: False + name: SignDisposalSpace +- action: !type:InstantActionComponent icon: entity: Windoor - name: Windoor keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -603,12 +602,12 @@ entityType: Windoor assignments: - 5: 0 -- action: !type:InstantAction - checkCanInteract: False + name: Windoor +- action: !type:InstantActionComponent icon: entity: WindowDirectional - name: WindowDirectional keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -617,12 +616,12 @@ entityType: WindowDirectional assignments: - 5: 1 -- action: !type:InstantAction - checkCanInteract: False + name: WindowDirectional +- action: !type:InstantActionComponent icon: entity: WindowReinforcedDirectional - name: WindowReinforcedDirectional keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -631,12 +630,12 @@ entityType: WindowReinforcedDirectional assignments: - 5: 2 -- action: !type:InstantAction - checkCanInteract: False + name: WindowReinforcedDirectional +- action: !type:InstantActionComponent icon: entity: PlasmaWindowDirectional - name: PlasmaWindowDirectional keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -645,12 +644,12 @@ entityType: PlasmaWindowDirectional assignments: - 5: 3 -- action: !type:InstantAction - checkCanInteract: False + name: PlasmaWindowDirectional +- action: !type:InstantActionComponent icon: entity: Railing - name: Railing keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -659,12 +658,12 @@ entityType: Railing assignments: - 5: 6 -- action: !type:InstantAction - checkCanInteract: False + name: Railing +- action: !type:InstantActionComponent icon: entity: RailingCorner - name: RailingCorner keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -673,12 +672,12 @@ entityType: RailingCorner assignments: - 5: 7 -- action: !type:InstantAction - checkCanInteract: False + name: RailingCorner +- action: !type:InstantActionComponent icon: entity: RailingCornerSmall - name: RailingCornerSmall keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -687,12 +686,12 @@ entityType: RailingCornerSmall assignments: - 5: 8 -- action: !type:InstantAction - checkCanInteract: False + name: RailingCornerSmall +- action: !type:InstantActionComponent icon: entity: AirlockMaintLocked - name: AirlockMaintLocked keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -701,12 +700,12 @@ entityType: AirlockMaintLocked assignments: - 6: 0 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockMaintLocked +- action: !type:InstantActionComponent icon: entity: AirlockGlass - name: AirlockGlass keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -715,12 +714,12 @@ entityType: AirlockGlass assignments: - 6: 1 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockGlass +- action: !type:InstantActionComponent icon: entity: AirlockServiceLocked - name: AirlockServiceLocked keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -729,12 +728,12 @@ entityType: AirlockServiceLocked assignments: - 6: 2 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockServiceLocked +- action: !type:InstantActionComponent icon: entity: AirlockSecurityLocked - name: AirlockSecurityLocked keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -743,12 +742,12 @@ entityType: AirlockSecurityLocked assignments: - 6: 3 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockSecurityLocked +- action: !type:InstantActionComponent icon: entity: AirlockCommand - name: AirlockCommand keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -757,12 +756,12 @@ entityType: AirlockCommand assignments: - 6: 4 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockCommand +- action: !type:InstantActionComponent icon: entity: AirlockScience - name: AirlockScience keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -771,12 +770,12 @@ entityType: AirlockScience assignments: - 6: 5 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockScience +- action: !type:InstantActionComponent icon: entity: AirlockMedical - name: AirlockMedical keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -785,12 +784,12 @@ entityType: AirlockMedical assignments: - 6: 6 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockMedical +- action: !type:InstantActionComponent icon: entity: AirlockEngineering - name: AirlockEngineering keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -799,12 +798,12 @@ entityType: AirlockEngineering assignments: - 6: 7 -- action: !type:InstantAction - checkCanInteract: False + name: AirlockEngineering +- action: !type:InstantActionComponent icon: entity: AirlockCargo - name: AirlockCargo keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -813,7 +812,9 @@ entityType: AirlockCargo assignments: - 6: 8 -- action: !type:WorldTargetAction + name: AirlockCargo +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -821,8 +822,6 @@ sprite: Decals/markings.rsi state: bot_left iconColor: '#EFB34196' - name: BotLeft - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -833,7 +832,9 @@ decalId: BotLeft assignments: - 7: 0 -- action: !type:WorldTargetAction + name: BotLeft +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -841,8 +842,6 @@ sprite: Decals/markings.rsi state: delivery iconColor: '#EFB34196' - name: Delivery - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -853,7 +852,9 @@ decalId: Delivery assignments: - 7: 1 -- action: !type:WorldTargetAction + name: Delivery +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -861,8 +862,6 @@ sprite: Decals/markings.rsi state: warn_full iconColor: '#EFB34196' - name: WarnFull - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -873,7 +872,9 @@ decalId: WarnFull assignments: - 7: 2 -- action: !type:WorldTargetAction + name: WarnFull +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -881,8 +882,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#EFB34196' - name: HalfTileOverlayGreyscale - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -893,7 +892,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 3 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -901,8 +902,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#334E6DC8' - name: HalfTileOverlayGreyscale (#334E6DC8, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -913,7 +912,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 4 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale (#334E6DC8, 0) +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -921,8 +922,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#52B4E996' - name: HalfTileOverlayGreyscale (#52B4E996, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -933,7 +932,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 5 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale (#52B4E996, 0) +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -941,8 +942,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#9FED5896' - name: HalfTileOverlayGreyscale (#9FED5896, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -953,7 +952,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 6 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale (#9FED5896, 0) +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -961,8 +962,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#DE3A3A96' - name: HalfTileOverlayGreyscale (#DE3A3A96, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -973,7 +972,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 7 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale (#DE3A3A96, 0) +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -981,8 +982,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#D381C996' - name: HalfTileOverlayGreyscale (#D381C996, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -993,7 +992,9 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 8 -- action: !type:WorldTargetAction + name: HalfTileOverlayGreyscale (#D381C996, 0) +- action: !type:WorldTargetActionComponent + keywords: [] repeat: True checkCanAccess: False range: -1 @@ -1001,8 +1002,6 @@ sprite: Decals/Overlays/greyscale.rsi state: halftile_overlay iconColor: '#A4610696' - name: HalfTileOverlayGreyscale (#A4610696, 0) - keywords: [] checkCanInteract: False clientExclusive: True autoPopulate: False @@ -1013,11 +1012,11 @@ decalId: HalfTileOverlayGreyscale assignments: - 7: 9 -- action: !type:InstantAction - checkCanInteract: False + name: HalfTileOverlayGreyscale (#A4610696, 0) +- action: !type:InstantActionComponent icon: /Textures/Tiles/steel.png - name: steel floor keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -1026,11 +1025,11 @@ tileId: FloorSteel assignments: - 0: 6 -- action: !type:InstantAction - checkCanInteract: False + name: steel floor +- action: !type:InstantActionComponent icon: /Textures/Tiles/plating.png - name: plating keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -1041,11 +1040,11 @@ - 0: 7 - 1: 8 - 2: 8 -- action: !type:InstantAction - checkCanInteract: False + name: plating +- action: !type:InstantActionComponent icon: /Textures/Tiles/cropped_parallax.png - name: space keywords: [] + checkCanInteract: False clientExclusive: True autoPopulate: False temporary: True @@ -1054,4 +1053,5 @@ tileId: Space assignments: - 0: 8 + name: space ...