]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Refactor actions to be entities with components (#19900)
authorDrSmugleaf <DrSmugleaf@users.noreply.github.com>
Sat, 9 Sep 2023 01:16:05 +0000 (18:16 -0700)
committerGitHub <noreply@github.com>
Sat, 9 Sep 2023 01:16:05 +0000 (18:16 -0700)
210 files changed:
Content.Client/Actions/ActionEvents.cs
Content.Client/Actions/ActionsSystem.cs
Content.Client/Actions/UI/ActionAlertTooltip.cs
Content.Client/Decals/DecalPlacementSystem.cs
Content.Client/Ghost/GhostSystem.cs
Content.Client/Mapping/MappingSystem.cs
Content.Client/NetworkConfigurator/Systems/NetworkConfiguratorSystem.cs
Content.Client/Store/Ui/StoreMenu.xaml.cs
Content.Client/UserInterface/Systems/Actions/ActionUIController.cs
Content.Client/UserInterface/Systems/Actions/Controls/ActionButton.cs
Content.Client/UserInterface/Systems/Actions/Controls/ActionButtonContainer.cs
Content.IntegrationTests/Tests/Actions/ActionsAddedTest.cs
Content.Server/Abilities/Mime/MimePowersComponent.cs
Content.Server/Abilities/Mime/MimePowersSystem.cs
Content.Server/Actions/ActionOnInteractComponent.cs
Content.Server/Actions/ActionOnInteractSystem.cs
Content.Server/Actions/ActionsSystem.cs
Content.Server/Animals/Components/EggLayerComponent.cs
Content.Server/Animals/Systems/EggLayerSystem.cs
Content.Server/Atmos/Components/GasTankComponent.cs
Content.Server/Atmos/EntitySystems/GasTankSystem.cs
Content.Server/Bed/BedSystem.cs
Content.Server/Bed/Components/HealOnBuckleComponent.cs
Content.Server/Bed/Sleep/SleepingSystem.cs
Content.Server/Bible/BibleSystem.cs
Content.Server/Bible/Components/SummonableComponent.cs
Content.Server/Clothing/Components/MaskComponent.cs
Content.Server/Clothing/MaskSystem.cs
Content.Server/Devour/DevourSystem.cs
Content.Server/Dragon/Components/DragonComponent.cs
Content.Server/Dragon/DragonSystem.cs
Content.Server/GameTicking/Rules/Components/ZombieRuleComponent.cs
Content.Server/GameTicking/Rules/ZombieRuleSystem.cs
Content.Server/Ghost/GhostSystem.cs
Content.Server/Guardian/GuardianHostComponent.cs
Content.Server/Guardian/GuardianSystem.cs
Content.Server/Light/EntitySystems/HandheldLightSystem.cs
Content.Server/Light/EntitySystems/UnpoweredFlashlightSystem.cs
Content.Server/Magic/Components/SpellbookComponent.cs
Content.Server/Magic/MagicSystem.cs
Content.Server/Medical/Stethoscope/Components/StethoscopeComponent.cs
Content.Server/Medical/Stethoscope/StethoscopeSystem.cs
Content.Server/Mobs/CritMobActionsSystem.cs
Content.Server/Polymorph/Components/PolymorphableComponent.cs
Content.Server/Polymorph/Systems/PolymorphSystem.cs
Content.Server/RatKing/RatKingComponent.cs
Content.Server/RatKing/RatKingSystem.cs
Content.Server/Revenant/EntitySystems/RevenantSystem.cs
Content.Server/Sericulture/SericultureComponent.cs
Content.Server/Sericulture/SericultureSystem.cs
Content.Server/Silicons/Borgs/BorgSystem.Modules.cs
Content.Server/Silicons/Laws/SiliconLawSystem.cs
Content.Server/Speech/Components/VocalComponent.cs
Content.Server/Speech/EntitySystems/MeleeSpeechSystem.cs
Content.Server/Speech/EntitySystems/VocalSystem.cs
Content.Server/Store/Systems/StoreSystem.Ui.cs
Content.Server/UserInterface/ActivatableUISystem.cs
Content.Server/UserInterface/IntrinsicUIComponent.cs
Content.Server/UserInterface/IntrinsicUISystem.cs
Content.Server/VendingMachines/VendingMachineSystem.cs
Content.Server/VoiceMask/VoiceMaskSystem.Equip.cs
Content.Server/VoiceMask/VoiceMaskSystem.cs
Content.Server/VoiceMask/VoiceMaskerComponent.cs
Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.Actions.cs
Content.Server/Xenoarchaeology/XenoArtifacts/ArtifactSystem.cs
Content.Server/Xenoarchaeology/XenoArtifacts/Effects/Systems/KnockArtifactSystem.cs
Content.Shared/Actions/ActionEvents.cs
Content.Shared/Actions/ActionTypes/ActionPrototypes.cs [deleted file]
Content.Shared/Actions/ActionTypes/ActionType.cs [deleted file]
Content.Shared/Actions/ActionTypes/InstantAction.cs [deleted file]
Content.Shared/Actions/ActionTypes/TargetedAction.cs [deleted file]
Content.Shared/Actions/ActionsComponent.cs
Content.Shared/Actions/BaseActionComponent.cs [new file with mode: 0644]
Content.Shared/Actions/BaseTargetActionComponent.cs [new file with mode: 0644]
Content.Shared/Actions/EntityTargetActionComponent.cs [new file with mode: 0644]
Content.Shared/Actions/Events/EggLayInstantActionEvent.cs [new file with mode: 0644]
Content.Shared/Actions/Events/GetActionDataEvent.cs [new file with mode: 0644]
Content.Shared/Actions/Events/InvisibleWallActionEvent.cs [new file with mode: 0644]
Content.Shared/Actions/InstantActionComponent.cs [new file with mode: 0644]
Content.Shared/Actions/SharedActionsSystem.cs
Content.Shared/Actions/WorldTargetActionComponent.cs [new file with mode: 0644]
Content.Shared/Bed/Sleep/SharedSleepingSystem.cs
Content.Shared/Bed/Sleep/SleepingComponent.cs
Content.Shared/Bible/SummonActionEvent.cs [new file with mode: 0644]
Content.Shared/Blocking/BlockingSystem.cs
Content.Shared/Blocking/Components/BlockingComponent.cs
Content.Shared/CartridgeLoader/CartridgeLoaderComponent.cs
Content.Shared/Clothing/ClothingEvents.cs
Content.Shared/Clothing/Components/StealthClothingComponent.cs
Content.Shared/Clothing/Components/ToggleableClothingComponent.cs
Content.Shared/Clothing/EntitySystems/StealthClothingSystem.cs
Content.Shared/Clothing/EntitySystems/ToggleableClothingSystem.cs
Content.Shared/Clothing/MagbootsComponent.cs
Content.Shared/Clothing/SharedMagbootsSystem.cs
Content.Shared/CombatMode/CombatModeComponent.cs
Content.Shared/CombatMode/Pacification/PacificationSystem.cs
Content.Shared/CombatMode/SharedCombatModeSystem.cs
Content.Shared/Cuffs/SharedCuffableSystem.cs
Content.Shared/Decals/PlaceDecalActionEvent.cs [new file with mode: 0644]
Content.Shared/Devour/Components/DevourerComponent.cs
Content.Shared/Devour/SharedDevourSystem.cs
Content.Shared/Dragon/DragonEvents.cs [new file with mode: 0644]
Content.Shared/Ghost/GhostComponent.cs
Content.Shared/Guardian/GuardianToggleActionEvent.cs [new file with mode: 0644]
Content.Shared/Implants/SharedSubdermalImplantSystem.cs
Content.Shared/Light/Components/HandheldLightComponent.cs
Content.Shared/Light/Components/UnpoweredFlashlightComponent.cs
Content.Shared/Light/SharedHandheldLightSystem.cs
Content.Shared/Magic/Events/ChangeComponentSpellEvent.cs [moved from Content.Server/Magic/Events/ChangeComponentsSpellEvent.cs with 90% similarity]
Content.Shared/Magic/Events/InstantSpawnSpellEvent.cs [moved from Content.Server/Magic/Events/InstantSpawnSpellEvent.cs with 64% similarity]
Content.Shared/Magic/Events/KnockSpellEvent.cs [moved from Content.Server/Magic/Events/KnockSpellEvent.cs with 94% similarity]
Content.Shared/Magic/Events/ProjectileSpellEvent.cs [moved from Content.Server/Magic/Events/ProjectileSpellEvent.cs with 88% similarity]
Content.Shared/Magic/Events/SmiteSpellEvent.cs [moved from Content.Server/Magic/Events/SmiteSpellEvent.cs with 91% similarity]
Content.Shared/Magic/Events/TeleportSpellEvent.cs [moved from Content.Server/Magic/Events/TeleportSpellEvent.cs with 92% similarity]
Content.Shared/Magic/Events/WorldSpawnSpellEvent.cs [moved from Content.Server/Magic/Events/WorldSpawnSpellEvent.cs with 95% similarity]
Content.Shared/Magic/ISpeakSpell.cs [moved from Content.Server/Magic/Events/ISpeakSpell.cs with 82% similarity]
Content.Shared/Magic/MagicSpawnData.cs [new file with mode: 0644]
Content.Shared/Mapping/StartPlacementActionEvent.cs [new file with mode: 0644]
Content.Shared/Mech/Components/MechComponent.cs
Content.Shared/Mech/EntitySystems/SharedMechSystem.cs
Content.Shared/Medical/Stethoscope/StethoscopeActionEvent.cs [new file with mode: 0644]
Content.Shared/Mobs/Components/MobStateActionsComponent.cs
Content.Shared/Mobs/CritMobActions.cs [new file with mode: 0644]
Content.Shared/Mobs/Systems/MobStateActionsSystem.cs
Content.Shared/Movement/Components/JetpackComponent.cs
Content.Shared/Movement/Systems/SharedJetpackSystem.cs
Content.Shared/PAI/PAIComponent.cs
Content.Shared/PAI/SharedPAISystem.cs
Content.Shared/Polymorph/PolymorphActions.cs [new file with mode: 0644]
Content.Shared/RatKing/RatKingActions.cs [new file with mode: 0644]
Content.Shared/Sericulture/SericultureEvents.cs
Content.Shared/Silicons/Borgs/Components/SelectableBorgModuleComponent.cs
Content.Shared/Silicons/Laws/Components/SiliconLawBoundComponent.cs
Content.Shared/Speech/Components/MeleeSpeechComponent.cs
Content.Shared/Speech/ScreamActionEvent.cs [new file with mode: 0644]
Content.Shared/Spider/SharedSpiderSystem.cs
Content.Shared/Spider/SpiderComponent.cs
Content.Shared/Store/ListingPrototype.cs
Content.Shared/UserInterface/OpenUiActionEvent.cs [moved from Content.Server/UserInterface/OpenUiActionEvent.cs with 89% similarity]
Content.Shared/UserInterface/ToggleIntrinsicUIEvent.cs [new file with mode: 0644]
Content.Shared/Vehicle/Components/VehicleComponent.cs
Content.Shared/Vehicle/SharedVehicleSystem.cs
Content.Shared/VendingMachines/VendingMachineComponent.cs
Content.Shared/VoiceMask/VoiceMaskSetNameEvent.cs [new file with mode: 0644]
Content.Shared/Weapons/Ranged/Components/GunComponent.cs
Content.Shared/Weapons/Ranged/Systems/SharedGunSystem.Interactions.cs
Resources/Locale/en-US/magboot/actions.ftl
Resources/Maps/Salvage/medium-pet-hospital.yml
Resources/Maps/Shuttles/emergency_lox.yml
Resources/Maps/Test/dev_map.yml
Resources/Maps/bagel.yml
Resources/Maps/barratry.yml
Resources/Maps/box.yml
Resources/Maps/fland.yml
Resources/Maps/infiltrator.yml
Resources/Maps/kettle.yml
Resources/Maps/marathon.yml
Resources/Maps/meta.yml
Resources/Maps/omega.yml
Resources/Maps/origin.yml
Resources/Maps/packed.yml
Resources/Prototypes/Actions/borgs.yml
Resources/Prototypes/Actions/crit.yml
Resources/Prototypes/Actions/internals.yml [new file with mode: 0644]
Resources/Prototypes/Actions/mech.yml
Resources/Prototypes/Actions/polymorph.yml [new file with mode: 0644]
Resources/Prototypes/Actions/revenant.yml
Resources/Prototypes/Actions/speech.yml [new file with mode: 0644]
Resources/Prototypes/Actions/spider.yml
Resources/Prototypes/Actions/types.yml
Resources/Prototypes/Catalog/catalog.yml
Resources/Prototypes/Catalog/revenant_catalog.yml
Resources/Prototypes/Entities/Clothing/Masks/base_clothingmask.yml
Resources/Prototypes/Entities/Clothing/Neck/misc.yml
Resources/Prototypes/Entities/Clothing/OuterClothing/suits.yml
Resources/Prototypes/Entities/Clothing/Shoes/magboots.yml
Resources/Prototypes/Entities/Mobs/NPCs/animals.yml
Resources/Prototypes/Entities/Mobs/NPCs/regalrat.yml
Resources/Prototypes/Entities/Mobs/NPCs/silicon.yml
Resources/Prototypes/Entities/Mobs/NPCs/simplemob.yml
Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml
Resources/Prototypes/Entities/Mobs/Player/dragon.yml
Resources/Prototypes/Entities/Mobs/Player/guardian.yml
Resources/Prototypes/Entities/Mobs/Player/observer.yml
Resources/Prototypes/Entities/Mobs/Player/silicon.yml
Resources/Prototypes/Entities/Mobs/Species/arachnid.yml
Resources/Prototypes/Entities/Mobs/Species/base.yml
Resources/Prototypes/Entities/Objects/Devices/pda.yml
Resources/Prototypes/Entities/Objects/Fun/pai.yml
Resources/Prototypes/Entities/Objects/Magic/books.yml
Resources/Prototypes/Entities/Objects/Misc/subdermal_implants.yml
Resources/Prototypes/Entities/Objects/Shields/shields.yml
Resources/Prototypes/Entities/Objects/Specific/Chapel/bibles.yml
Resources/Prototypes/Entities/Objects/Specific/Robotics/borg_modules.yml
Resources/Prototypes/Entities/Objects/Tools/gas_tanks.yml
Resources/Prototypes/Entities/Objects/Tools/jetpacks.yml
Resources/Prototypes/Entities/Objects/Vehicles/actions.yml [new file with mode: 0644]
Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml
Resources/Prototypes/Entities/Objects/Weapons/Guns/turrets.yml
Resources/Prototypes/Entities/Objects/Weapons/Melee/mining.yml
Resources/Prototypes/Magic/forcewall_spells.yml
Resources/Prototypes/Magic/knock_spell.yml
Resources/Prototypes/Magic/projectile_spells.yml
Resources/Prototypes/Magic/rune_spells.yml
Resources/Prototypes/Magic/smite_spells.yml
Resources/Prototypes/Magic/spawn_spells.yml
Resources/Prototypes/Magic/staves.yml
Resources/Prototypes/Magic/teleport_spells.yml
Resources/Prototypes/Roles/Jobs/Civilian/mime.yml
Resources/mapping_actions.yml

index 36739b0dbea3f74879155fa69b8108e221ec393a..2fdf25c97672b1d7b930948a348b6835408809e3 100644 (file)
@@ -1,11 +1,9 @@
-using Content.Shared.Actions.ActionTypes;
-
 namespace Content.Client.Actions;
 
 /// <summary>
-///     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.
 /// </summary>
 public sealed class FillActionSlotEvent : EntityEventArgs
 {
-    public ActionType? Action;
+    public EntityUid? Action;
 }
index ba007f35aad05094b381a0700c385ca1b79c33f8..55ced8632ca71bbd316d5e60ac39a1487e899ecb 100644 (file)
@@ -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<ActionType>? ActionAdded;
-        public event Action<ActionType>? ActionRemoved;
+        public event Action<EntityUid>? ActionAdded;
+        public event Action<EntityUid>? ActionRemoved;
         public event OnActionReplaced? ActionReplaced;
         public event Action? ActionsUpdated;
         public event Action<ActionsComponent>? LinkActions;
@@ -35,7 +37,11 @@ namespace Content.Client.Actions
         public event Action? ClearAssignments;
         public event Action<List<SlotAssignment>>? AssignSlot;
 
-        public ActionsComponent? PlayerActions { get; private set; }
+        /// <summary>
+        ///     Queue of entities with <see cref="ActionsComponent"/> that needs to be updated after
+        ///     handling a state.
+        /// </summary>
+        private readonly Queue<EntityUid> _actionHoldersQueue = new();
 
         public override void Initialize()
         {
@@ -45,110 +51,90 @@ namespace Content.Client.Actions
             SubscribeLocalEvent<ActionsComponent, ComponentHandleState>(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<ActionType>(state.Actions);
-            var serverActions = state.SortedActions;
-            var removed = new List<ActionType>();
+            _actionHoldersQueue.Enqueue(uid);
+        }
 
-            foreach (var act in component.Actions.ToList())
+        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 (container.Contains(actionId))
             {
-                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);
+                ActionReplaced?.Invoke(actionId);
             }
-
-            var added = new List<ActionType>();
-
-            // Anything that remains is a new action
-            foreach (var newAct in serverActions)
+            else
             {
-                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);
+                container.Insert(actionId);
             }
+        }
 
-            if (_playerManager.LocalPlayer?.ControlledEntity != uid)
+        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;
 
-            foreach (var action in removed)
+            action ??= GetActionData(actionId);
+            if (action == null)
             {
-                ActionRemoved?.Invoke(action);
+                Log.Warning($"No {nameof(BaseActionComponent)} found on entity {actionId}");
+                return;
             }
 
-            foreach (var action in added)
-            {
-                ActionAdded?.Invoke(action);
-            }
+            dirty &= !action.ClientExclusive;
+            base.AddAction(holderId, actionId, provider, holder, action, dirty, actionContainer);
 
-            ActionsUpdated?.Invoke();
+            if (holderId == _playerManager.LocalPlayer?.ControlledEntity)
+                ActionAdded?.Invoke(actionId);
         }
 
-        protected override void AddActionInternal(ActionsComponent comp, ActionType action)
+        public override void RemoveAction(EntityUid holderId, EntityUid? actionId, ActionsComponent? comp = null, BaseActionComponent? action = null, bool dirty = true, ContainerManagerComponent? actionContainer = null)
         {
-            // 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))
-            {
-                comp.Actions.Remove(existing);
-                ActionReplaced?.Invoke(existing, action);
-            }
-
-            comp.Actions.Add(action);
-        }
+            if (GameTiming.ApplyingState)
+                return;
 
-        public override void AddAction(EntityUid uid, ActionType action, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true)
-        {
-            if (!Resolve(uid, ref comp, false))
+            if (!Resolve(holderId, ref comp, false))
                 return;
 
-            dirty &= !action.ClientExclusive;
-            base.AddAction(uid, action, provider, comp, dirty);
+            if (actionId == null)
+                return;
 
-            if (uid == _playerManager.LocalPlayer?.ControlledEntity)
-                ActionAdded?.Invoke(action);
-        }
+            action ??= GetActionData(actionId);
 
-        public override void RemoveAction(EntityUid uid, ActionType action, ActionsComponent? comp = null, bool dirty = true)
-        {
-            if (GameTiming.ApplyingState && !action.ClientExclusive)
+            if (action is { ClientExclusive: false })
                 return;
 
-            if (!Resolve(uid, ref comp, false))
+            dirty &= !action?.ClientExclusive ?? true;
+            base.RemoveAction(holderId, actionId, comp, action, dirty, actionContainer);
+
+            if (_playerManager.LocalPlayer?.ControlledEntity != holderId)
                 return;
 
-            dirty &= !action.ClientExclusive;
-            base.RemoveAction(uid, action, comp, dirty);
+            if (action == null || action.AutoRemove)
+                ActionRemoved?.Invoke(actionId.Value);
+        }
+
+        public IEnumerable<(EntityUid Id, BaseActionComponent Comp)> GetClientActions()
+        {
+            if (_playerManager.LocalPlayer?.ControlledEntity is not { } user)
+                return Enumerable.Empty<(EntityUid, BaseActionComponent)>();
 
-            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<ActionsSystem>();
         }
 
-        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
         /// </summary>
         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<ActionType>(actionNode, notNullableOverride: true);
+                var action = _serialization.Read<BaseActionComponent>(actionNode, notNullableOverride: true);
+                var actionId = Spawn(null);
+                AddComp<Component>(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<ValueDataNode>("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<EntityUid>();
+            var added = new List<EntityUid>();
+            var query = GetEntityQuery<ActionsComponent>();
+            var queue = new Queue<EntityUid>(_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);
     }
 }
index 319c682299b533947bc706601568738982e6ae22..f48350d77220af8cdf0238a5df15cc5234460cba 100644 (file)
@@ -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;
index cf5f89ffd87fc3b6259176f1d959b0ed82002c5d..03248f4355ea7e89b57ccb9f191667bd89b52e7e 100644 (file)
@@ -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<DecalPrototype>), 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;
-}
index 8207e0eac9d5a666c21ea0e329b8af9e21187029..944d4e0de0ddefd6348b6bba283dd20547cb1957 100644 (file)
@@ -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;
index 2d6db2bb460765330d86d5777630f360011f655c..4456be36a65252d362ad97ead95c881115850011 100644 (file)
@@ -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!;
 
     /// <summary>
     ///     The icon to use for space tiles.
     /// </summary>
-    private readonly SpriteSpecifier _spaceIcon = new SpriteSpecifier.Texture(new ("Tiles/cropped_parallax.png"));
+    private readonly SpriteSpecifier _spaceIcon = new Texture(new ("Tiles/cropped_parallax.png"));
 
     /// <summary>
     ///     The icon to use for entity-eraser.
     /// </summary>
-    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;
 
-        if (string.IsNullOrWhiteSpace(actionEvent.EntityType))
-            return;
+            action = new InstantActionComponent
+            {
+                ClientExclusive = true,
+                CheckCanInteract = false,
+                Event = actionEvent,
+                Icon = new EntityPrototype(actionEvent.EntityType),
+            };
 
-        ev.Action = new InstantAction()
-        {
-            ClientExclusive = true,
-            CheckCanInteract = false,
-            Event = actionEvent,
-            DisplayName = actionEvent.EntityType,
-            Icon = new SpriteSpecifier.EntityPrototype(actionEvent.EntityType),
-        };
+            name = actionEvent.EntityType;
+        }
+
+        var actionId = Spawn(null);
+        AddComp<Component>(actionId, action);
+        _metaData.SetEntityName(actionId, name);
+
+        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;
-}
index d56296cae9e7297a9f208ba836af6804a5d4c150..48b378af040d3f78338879c1e1de376928f7c2a0 100644 (file)
@@ -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<EntityPrototype>]
+    private const string Action = "ActionClearNetworkLinkOverlays";
 
     public override void Initialize()
     {
@@ -71,7 +70,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
             if (!EntityQuery<NetworkConfiguratorActiveLinkOverlayComponent>().Any())
             {
                 _overlay.RemoveOverlay<NetworkConfiguratorLinkOverlay>();
-                _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, _prototypeManager.Index<InstantActionPrototype>(Action));
+                _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, Action);
             }
 
 
@@ -81,7 +80,7 @@ public sealed class NetworkConfiguratorSystem : SharedNetworkConfiguratorSystem
         if (!_overlay.HasOverlay<NetworkConfiguratorLinkOverlay>())
         {
             _overlay.AddOverlay(new NetworkConfiguratorLinkOverlay());
-            _actions.AddAction(_playerManager.LocalPlayer.ControlledEntity.Value, new InstantAction(_prototypeManager.Index<InstantActionPrototype>(Action)), null);
+            _actions.AddAction(_playerManager.LocalPlayer.ControlledEntity.Value, Spawn(Action), null);
         }
 
         EnsureComp<NetworkConfiguratorActiveLinkOverlayComponent>(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<InstantActionPrototype>(Action));
+            _actions.RemoveAction(_playerManager.LocalPlayer.ControlledEntity.Value, Action);
         }
     }
 
index a3f246badba5c0b95249d7428710233a9cf1db71..c59c3a1062a13da9e61823806bf43bac86da40c5 100644 (file)
@@ -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<InstantActionPrototype>(listing.ProductAction);
-            if (action.Icon != null)
+            var actionId = _entityManager.Spawn(listing.ProductAction);
+            if (_entityManager.System<ActionsSystem>().TryGetActionData(actionId, out var action) &&
+                action.Icon != null)
+            {
                 texture = spriteSys.Frame0(action.Icon);
+            }
         }
 
         var newListing = new StoreListingControl(listingName, listingDesc, GetListingPriceString(listing), canBuy, texture);
index ea91e959518825584e29104ea80e48daa06e9cdb..7e288070b0c589d52f9f601b457169bfbcf26aa6 100644 (file)
@@ -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<GameplayS
     /// <summary>
     /// Action slot we are currently selecting a target for.
     /// </summary>
-    public TargetedAction? SelectingTargetFor { get; private set; }
+    public EntityUid? SelectingTargetFor { get; private set; }
 
     public ActionUIController()
     {
@@ -175,7 +174,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     /// </summary>
     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<GameplayS
         if (!EntityManager.TryGetComponent(user, out ActionsComponent? comp))
             return false;
 
+        if (!_actionsSystem.TryGetActionData(actionId, out var baseAction) ||
+            baseAction is not BaseTargetActionComponent action)
+        {
+            return false;
+        }
+
         // Is the action currently valid?
         if (!action.Enabled
             || action.Charges is 0
@@ -196,19 +201,19 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
         switch (action)
         {
-            case WorldTargetAction mapTarget:
-                    return TryTargetWorld(args, mapTarget, user, comp) || !action.InteractOnMiss;
+            case WorldTargetActionComponent mapTarget:
+                    return TryTargetWorld(args, actionId, mapTarget, user, comp) || !mapTarget.InteractOnMiss;
 
-            case EntityTargetAction entTarget:
-                    return TryTargetEntity(args, entTarget, user, comp) || !action.InteractOnMiss;
+            case EntityTargetActionComponent entTarget:
+                    return TryTargetEntity(args, actionId, entTarget, user, comp) || !entTarget.InteractOnMiss;
 
             default:
-                Logger.Error($"Unknown targeting action: {action.GetType()}");
+                Logger.Error($"Unknown targeting action: {actionId.GetType()}");
                 return false;
         }
     }
 
-    private bool TryTargetWorld(in PointerInputCmdArgs args, WorldTargetAction action, EntityUid user, ActionsComponent actionComp)
+    private bool TryTargetWorld(in PointerInputCmdArgs args, EntityUid actionId, WorldTargetActionComponent action, EntityUid user, ActionsComponent actionComp)
     {
         if (_actionsSystem == null)
             return false;
@@ -232,10 +237,10 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
                 action.Event.Performer = user;
             }
 
-            _actionsSystem.PerformAction(user, actionComp, action, action.Event, _timing.CurTime);
+            _actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
         }
         else
-            EntityManager.RaisePredictiveEvent(new RequestPerformActionEvent(action, coords));
+            EntityManager.RaisePredictiveEvent(new RequestPerformActionEvent(actionId, coords));
 
         if (!action.Repeat)
             StopTargeting();
@@ -243,7 +248,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         return true;
     }
 
-    private bool TryTargetEntity(in PointerInputCmdArgs args, EntityTargetAction action, EntityUid user, ActionsComponent actionComp)
+    private bool TryTargetEntity(in PointerInputCmdArgs args, EntityUid actionId, EntityTargetActionComponent action, EntityUid user, ActionsComponent actionComp)
     {
         if (_actionsSystem == null)
             return false;
@@ -264,10 +269,10 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
                 action.Event.Performer = user;
             }
 
-            _actionsSystem.PerformAction(user, actionComp, action, action.Event, _timing.CurTime);
+            _actionsSystem.PerformAction(user, actionComp, actionId, action, action.Event, _timing.CurTime);
         }
         else
-            EntityManager.RaisePredictiveEvent(new RequestPerformActionEvent(action, args.EntityUid));
+            EntityManager.RaisePredictiveEvent(new RequestPerformActionEvent(actionId, args.EntityUid));
 
         if (!action.Repeat)
             StopTargeting();
@@ -322,13 +327,17 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
     private void TriggerAction(int index)
     {
-        if (CurrentPage[index] is not { } type)
+        if (_actionsSystem == null ||
+            CurrentPage[index] is not { } actionId ||
+            !_actionsSystem.TryGetActionData(actionId, out var baseAction))
+        {
             return;
+        }
 
-        if (type is TargetedAction action)
-            ToggleTargeting(action);
+        if (baseAction is BaseTargetActionComponent action)
+            ToggleTargeting(actionId, action);
         else
-            _actionsSystem?.TriggerAction(type);
+            _actionsSystem?.TriggerAction(actionId, baseAction);
     }
 
     private void ChangePage(int index)
@@ -360,14 +369,14 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         ChangePage(_currentPageIndex + 1);
     }
 
-    private void AppendAction(ActionType action)
+    private void AppendAction(EntityUid action)
     {
         if (_container == null)
             return;
 
         foreach (var button in _container.GetButtons())
         {
-            if (button.Action != null)
+            if (button.ActionId != null)
                 continue;
 
             SetAction(button, action);
@@ -388,39 +397,45 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         }
     }
 
-    private void OnActionAdded(ActionType action)
+    private void OnActionAdded(EntityUid actionId)
     {
+        if (_actionsSystem == null ||
+            !_actionsSystem.TryGetActionData(actionId, out var action))
+        {
+            return;
+        }
+
         // if the action is toggled when we add it, start targeting
-        if (action is TargetedAction targetAction && action.Toggled)
-            StartTargeting(targetAction);
+        if (action is BaseTargetActionComponent targetAction && action.Toggled)
+            StartTargeting(actionId, targetAction);
 
         foreach (var page in _pages)
         {
             for (var i = 0; i < page.Size; i++)
             {
-                if (page[i] == action)
+                if (page[i] == actionId)
                 {
                     return;
                 }
             }
         }
 
-        AppendAction(action);
+        AppendAction(actionId);
         SearchAndDisplay();
     }
 
-    private void OnActionRemoved(ActionType action)
+    private void OnActionRemoved(EntityUid actionId)
     {
         if (_container == null)
             return;
 
         // stop targeting if the action is removed
-        if (action == SelectingTargetFor)
+        if (actionId == SelectingTargetFor)
             StopTargeting();
 
         foreach (var button in _container.GetButtons())
         {
-            if (button.Action == action)
+            if (button.ActionId == actionId)
             {
                 SetAction(button, null);
             }
@@ -430,7 +445,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         {
             for (var i = 0; i < page.Size; i++)
             {
-                if (page[i] == action)
+                if (page[i] == actionId)
                 {
                     page[i] = null;
                 }
@@ -440,15 +455,15 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         SearchAndDisplay();
     }
 
-    private void OnActionReplaced(ActionType existing, ActionType action)
+    private void OnActionReplaced(EntityUid actionId)
     {
         if (_container == null)
             return;
 
         foreach (var button in _container.GetButtons())
         {
-            if (button.Action == existing)
-                button.UpdateData(action);
+            if (button.ActionId == actionId)
+                button.UpdateData(actionId);
         }
     }
 
@@ -499,15 +514,15 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         }
     }
 
-    private bool MatchesFilter(ActionType action, Filters filter)
+    private bool MatchesFilter(BaseActionComponent action, Filters filter)
     {
         return filter switch
         {
             Filters.Enabled => 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<GameplayS
             _window.ResultsGrid.RemoveAllChildren();
     }
 
-    private void PopulateActions(IEnumerable<ActionType> actions)
+    private void PopulateActions(IEnumerable<(EntityUid Id, BaseActionComponent Comp)> actions)
     {
         if (_window == null)
             return;
@@ -529,7 +544,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         {
             var button = new ActionButton {Locked = true};
 
-            button.UpdateData(action);
+            button.UpdateData(action.Id);
             button.ActionPressed += OnWindowActionPressed;
             button.ActionUnpressed += OnWindowActionUnPressed;
             button.ActionFocusExited += OnWindowActionFocusExisted;
@@ -538,16 +553,14 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         }
     }
 
-    private void SearchAndDisplay(ActionsComponent? component = null)
+    private void SearchAndDisplay()
     {
-        if (_window == null)
+        if (_window is not { Disposed: false } || _actionsSystem == null)
             return;
 
         var search = _window.SearchBar.Text;
         var filters = _window.FilterButton.SelectedKeys;
-
-        IEnumerable<ActionType>? actions = (component ?? _actionsSystem?.PlayerActions)?.Actions;
-        actions ??= Array.Empty<ActionType>();
+        var actions = _actionsSystem.GetClientActions();
 
         if (filters.Count == 0 && string.IsNullOrWhiteSpace(search))
         {
@@ -557,45 +570,46 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
         actions = actions.Where(action =>
         {
-            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<MetaDataComponent>(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<MetaDataComponent>(action.Provider.Value).EntityName;
-            return name.Contains(search, StringComparison.OrdinalIgnoreCase);
+            var providerName = EntityManager.GetComponent<MetaDataComponent>(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<GameplayS
     {
         if (UIManager.CurrentlyHovered is ActionButton button)
         {
-            if (!_menuDragHelper.IsDragging || _menuDragHelper.Dragged?.Action is not { } type)
+            if (!_menuDragHelper.IsDragging || _menuDragHelper.Dragged?.ActionId is not { } type)
             {
                 _menuDragHelper.EndDrag();
                 return;
@@ -669,7 +683,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     {
         if (args.Function == EngineKeyFunctions.UIClick)
         {
-            if (button.Action == null)
+            if (button.ActionId == null)
             {
                 var ev = new FillActionSlotEvent();
                 EntityManager.EventBus.RaiseEvent(EventSource.Local, ev);
@@ -692,25 +706,28 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
     private void OnActionUnpressed(GUIBoundKeyEventArgs args, ActionButton button)
     {
-        if (args.Function != EngineKeyFunctions.UIClick)
+        if (args.Function != EngineKeyFunctions.UIClick || _actionsSystem == null)
             return;
 
         if (UIManager.CurrentlyHovered == button)
         {
             _menuDragHelper.EndDrag();
 
-            if (button.Action is TargetedAction action)
+            if (_actionsSystem.TryGetActionData(button.ActionId, out var baseAction))
             {
-                // for target actions, we go into "select target" mode, we don't
-                // message the server until we actually pick our target.
+                if (baseAction is BaseTargetActionComponent action)
+                {
+                    // for target actions, we go into "select target" mode, we don't
+                    // message the server until we actually pick our target.
 
-                // if we're clicking the same thing we're already targeting for, then we simply cancel
-                // targeting
-                ToggleTargeting(action);
-                return;
-            }
+                    // if we're clicking the same thing we're already targeting for, then we simply cancel
+                    // targeting
+                    ToggleTargeting(button.ActionId.Value, action);
+                    return;
+                }
 
-            _actionsSystem?.TriggerAction(button.Action);
+                _actionsSystem?.TriggerAction(button.ActionId.Value, baseAction);
+            }
         }
         else
         {
@@ -722,7 +739,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
     private bool OnMenuBeginDrag()
     {
-        if (_menuDragHelper.Dragged?.Action is { } action)
+        if (_actionsSystem != null && _actionsSystem.TryGetActionData(_menuDragHelper.Dragged?.ActionId, out var action))
         {
             if (action.EntityIcon != null)
             {
@@ -828,7 +845,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     {
         foreach (ref var assignment in CollectionsMarshal.AsSpan(assignments))
         {
-            _pages[assignment.Hotbar][assignment.Slot] = assignment.Action;
+            _pages[assignment.Hotbar][assignment.Slot] = assignment.ActionId;
         }
 
         _container?.SetActionData(_pages[_currentPageIndex]);
@@ -864,7 +881,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     {
         LoadDefaultActions(component);
         _container?.SetActionData(_pages[DefaultPageIndex]);
-        SearchAndDisplay(component);
+        SearchAndDisplay();
     }
 
     private void OnComponentUnlinked()
@@ -876,7 +893,10 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
 
     private void LoadDefaultActions(ActionsComponent component)
     {
-        var actions = component.Actions.Where(actionType => 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<GameplayS
                 var actionIndex = slot + offset;
                 if (actionIndex < actions.Count)
                 {
-                    page[slot] = actions[slot + offset];
+                    page[slot] = actions[slot + offset].Id;
                 }
                 else
                 {
@@ -916,26 +936,26 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     /// If currently targeting with no slot or a different slot, switches to
     /// targeting with the specified slot.
     /// </summary>
-    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);
     }
 
     /// <summary>
     /// Puts us in targeting mode, where we need to pick either a target point or entity
     /// </summary>
-    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<ShowHandItemOverlay>(out var handOverlay))
@@ -955,7 +975,7 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
         // - Add a yes/no checkmark where the HandItemOverlay usually is
 
         // Highlight valid entity targets
-        if (action is not EntityTargetAction entityAction)
+        if (action is not EntityTargetActionComponent entityAction)
             return;
 
         Func<EntityUid, bool>? predicate = null;
@@ -992,20 +1012,20 @@ public sealed class ActionUIController : UIController, IOnStateChanged<GameplayS
     //TODO: Serialize this shit
     private sealed class ActionPage
     {
-        private readonly ActionType?[] _data;
+        private readonly EntityUid?[] _data;
 
         public ActionPage(int size)
         {
-            _data = new ActionType?[size];
+            _data = new EntityUid?[size];
         }
 
-        public ActionType? this[int index]
+        public EntityUid? this[int index]
         {
             get => _data[index];
             set => _data[index] = value;
         }
 
-        public static implicit operator ActionType?[](ActionPage p)
+        public static implicit operator EntityUid?[](ActionPage p)
         {
             return p._data.ToArray();
         }
index 1b2dcdb89cda1aad71059c73c1503c412111dda5..5a95194b1cee685d958a6e49a2b914f733266743 100644 (file)
@@ -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<ActionUIController>();
+    private IEntityManager Entities => _entities ??= IoCManager.Resolve<IEntityManager>();
+    private ActionsSystem Actions => Entities.System<ActionsSystem>();
     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<GUIBoundKeyEventArgs, ActionButton>? 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<IEntityManager>();
-        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<SpriteComponent>(entity))
+        if (!Actions.TryGetActionData(ActionId, out var action) ||
+            action is not { EntityIcon: { } entity } ||
+            !Entities.HasComponent<SpriteComponent>(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;
index 5dfa53f5abc8d3fabc3d56ab13122a43b99298d2..bbda27f0a0b6ffc76c9434b4ffcc801fe58edb87 100644 (file)
@@ -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);
         }
     }
 
index 0f4250c5084b710a083a54baa593a2e8d0ee7bce..c61fa8974fb868f74df1902097ad229af580f1d3 100644 (file)
@@ -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<IEntityManager>();
         var cEntMan = client.ResolveDependency<IEntityManager>();
         var session = server.ResolveDependency<IPlayerManager>().ServerSessions.Single();
+        var sActionSystem = server.System<SharedActionsSystem>();
+        var cActionSystem = client.System<SharedActionsSystem>();
 
         // 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();
     }
index 8d2205cdb61294d8329fcd2802e8e80ee5e0a093..35393093b7f36ac4efd7beb696506b0a2921634f 100644 (file)
@@ -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.
         /// </summary>
         [DataField("wallPrototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
-        public string WallPrototype = "WallInvisible";
-
-        [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(),
-        };
+        public string WallPrototype = "ActionMimeInvisibleWall";
+
+        [DataField("invisibleWallAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+        public string? InvisibleWallAction;
+
+        [DataField("invisibleWallActionEntity")] public EntityUid? InvisibleWallActionEntity;
 
         // The vow zone lies below
         public bool VowBroken = false;
index 1e32bc09c5dec5f4c46104a6b5d952582ca9fc32..5a47fb1d8dc359b98858cbf9ab15544acba511c1 100644 (file)
@@ -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<MimePowersComponent, ComponentInit>(OnComponentInit);
+            SubscribeLocalEvent<MimePowersComponent, MapInitEvent>(OnComponentMapInit);
             SubscribeLocalEvent<MimePowersComponent, InvisibleWallActionEvent>(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<MutedComponent>(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);
+        }
+
         /// <summary>
         /// Creates an invisible wall in a free space after some checks.
         /// </summary>
@@ -116,7 +121,7 @@ namespace Content.Server.Abilities.Mime
             RemComp<MutedComponent>(uid);
             _alertsSystem.ClearAlert(uid, AlertType.VowOfSilence);
             _alertsSystem.ShowAlert(uid, AlertType.VowBroken);
-            _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallAction);
+            _actionsSystem.RemoveAction(uid, mimePowers.InvisibleWallActionEntity);
         }
 
         /// <summary>
@@ -139,11 +144,7 @@ namespace Content.Server.Abilities.Mime
             AddComp<MutedComponent>(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
-    {
-    }
 }
index a668ee43f3c10d10c52c0548eba766ebc21a5119..9efe3d6ba038e988b944c35e5a6a793a65063c9c 100644 (file)
@@ -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<InstantAction>? ActivateActions;
+    [DataField("actions", customTypeSerializer: typeof(PrototypeIdListSerializer<EntityPrototype>))]
+    public List<string>? Actions;
 
-    [DataField("entityActions")]
-    public List<EntityTargetAction>? EntityActions;
-
-    [DataField("worldActions")]
-    public List<WorldTargetAction>? WorldActions;
+    [DataField("actionEntities")] public List<EntityUid>? ActionEntities;
 }
index baa01e9123f8890008eaf53b8bfc184b68e8a2f7..31f579f7ece173b2121eb99f3b23d0a1989def33 100644 (file)
@@ -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<InstantAction>();
-        foreach (var action in component.ActivateActions)
-        {
-            if (ValidAction(action))
-                options.Add(action);
-        }
-
+        var options = GetValidActions<InstantActionComponent>(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<EntityTargetAction>();
-            foreach (var action in component.EntityActions)
+            var entOptions = GetValidActions<EntityTargetActionComponent>(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<WorldTargetAction>();
-        foreach (var action in component.WorldActions)
+        var options = GetValidActions<WorldTargetActionComponent>(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<T>(List<EntityUid>? 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;
     }
 }
index 495640d98b3a965209ea445b13263aa7c0ff0350..21054bbd7a715a551af3830730ff591ad1f8dd0a 100644 (file)
@@ -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
 {
index 980bcbf72b6a624b03fdec670f1dd30ae807a0d1..551e665f72e188bb7758d0f245f5ef65ac53d726 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string EggLayAction = "AnimalLayEgg";
+    [DataField("eggLayAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    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 {}
index a9ab3c5f29a9e7fe0c37e2fbc31a6cc24692e283..abfd74ad01cd45878ee4963ec3f5e461607a6e9f 100644 (file)
@@ -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<InstantActionPrototype>(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);
     }
 
index 5815fba489536cdaa2cc80062106ccbd307f0ad4..8b411e38db55c45bb89b322d5ce55331f3cb82a0 100644 (file)
@@ -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<EntityPrototype>))]
+        public string ToggleAction = "ActionToggleInternals";
+
+        [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity;
 
         /// <summary>
         ///     Valve to release gas from tank
index cdd174ce18a0fb14355263d4ca41f9fa91f3bd7e..dcfcdf3331b7921cbe5cd491c0ce314c00d56a34 100644 (file)
@@ -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();
index 9791eb26212b22f44cd7d2766242a12f82b940f2..c9795928e502c5dc7de16508d83da1af4bcbe739 100644 (file)
@@ -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<InstantActionPrototype>("Sleep", out var sleepAction);
             if (args.Buckling)
             {
                 AddComp<HealOnBuckleHealingComponent>(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<HealOnBuckleHealingComponent>(uid);
index f02a30535dce2af453ba0babde471698e9ae2159..f29fe30429f9151566bbcc7e5acf8cd1b0db1d68 100644 (file)
@@ -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;
     }
 }
index 93286fa3bc6ce6b1f00cccf7e5c1884cea37876c..4f7b66d9e585a86c0882598af4a248262d8dc869 100644 (file)
@@ -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<EntityPrototype>] public const string SleepActionId = "ActionSleep";
+
         public override void Initialize()
         {
             base.Initialize();
@@ -53,7 +52,6 @@ namespace Content.Server.Bed.Sleep
         /// </summary>
         private void OnSleepStateChanged(EntityUid uid, MobStateComponent component, SleepStateChangedEvent args)
         {
-            _prototypeManager.TryIndex<InstantActionPrototype>("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<StunnedComponent>(uid);
             RemComp<KnockedDownComponent>(uid);
@@ -194,8 +184,7 @@ namespace Content.Server.Bed.Sleep
             RaiseLocalEvent(uid, ref tryingToSleepEvent);
             if (tryingToSleepEvent.Cancelled) return false;
 
-            if (_prototypeManager.TryIndex<InstantActionPrototype>("Sleep", out var sleepAction))
-                _actionsSystem.RemoveAction(uid, sleepAction);
+            _actionsSystem.RemoveAction(uid, SleepActionId);
 
             EnsureComp<SleepingComponent>(uid);
             return true;
index 8186db5a49d21f2c4d4c74fdc00af30f93ddfbb3..18f34ba1cc16be9dca51f3bb77a83edfb814f85c 100644 (file)
@@ -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
-    {
-
-    }
 }
index 821f25bb80b65c96b79520d90090927e99149032..62f536d5d6999d7a2dc7d9f3446a19118b46f7bd 100644 (file)
@@ -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;
 
         /// <summary>
@@ -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<EntityPrototype>))]
+        public string SummonAction = "ActionBibleSummon";
+
+        [DataField("summonActionEntity")]
+        public EntityUid? SummonActionEntity;
 
         /// Used for respawning
         [DataField("accumulator")]
index 3071c3edf906982a26f11114333ebfedc989d98c..704ea11eceaab7d662f8e1d051fb24108b949360 100644 (file)
@@ -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<EntityPrototype>))]
+        public string ToggleAction = "ActionToggleMask";
+
         /// <summary>
         /// This mask can be toggled (pulled up/down)
         /// </summary>
-        [DataField("toggleAction")]
-        public InstantAction? ToggleAction = null;
+        [DataField("toggleActionEntity")]
+        public EntityUid? ToggleActionEntity;
 
         public bool IsToggled = false;
     }
-
-    public sealed partial class ToggleMaskEvent : InstantActionEvent { }
 }
index acf63ad98d5fb2d394480f413a9609097e312386..fbf6ac607730c91f3c1842614ac4654a14c7baa3 100644 (file)
@@ -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);
         }
index 54217511000020cfd1ee73d0fac3ba3078977d35..3b15e725fe6e43786fd4d6e49acead6b81a2ffa2 100644 (file)
@@ -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;
 
index 8138f2a66b5dbbd352e4a54124b8ec87a02699e8..f403979a0070d6f3c7571aa0359a935eebab4fc1 100644 (file)
@@ -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
         /// </summary>
         [ViewVariables(VVAccess.ReadWrite), DataField("maxAccumulator")] public float RiftMaxAccumulator = 300f;
 
+        [DataField("spawnRiftAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+        public string SpawnRiftAction = "ActionSpawnRift";
+
         /// <summary>
         /// Spawns a rift which can summon more mobs.
         /// </summary>
-        [DataField("spawnRiftAction")]
-        public InstantAction? SpawnRiftAction;
+        [DataField("spawnRiftActionEntity")]
+        public EntityUid? SpawnRiftActionEntity;
 
         [ViewVariables(VVAccess.ReadWrite), DataField("riftPrototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
         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 {}
 }
index 82aa10b037e0dd33a5c2c76ee4e09ca73311f773..0169e16c44528f978d3c4c844a04b136a6229c6b 100644 (file)
@@ -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<DragonComponent, ComponentStartup>(OnStartup);
+        SubscribeLocalEvent<DragonComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<DragonComponent, ComponentShutdown>(OnShutdown);
         SubscribeLocalEvent<DragonComponent, DragonSpawnRiftActionEvent>(OnDragonRift);
         SubscribeLocalEvent<DragonComponent, RefreshMovementSpeedModifiersEvent>(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);
+    }
 }
 
index bb708ece3e91c63c1eb3e21989a0c0cb8ea361b1..5f31f52fc430f6c50d2a3547370afea4da17e4c9 100644 (file)
@@ -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<InstantActionPrototype>]
-    public const string ZombifySelfActionPrototype = "TurnUndead";
+    [ValidatePrototypeId<EntityPrototype>]
+    public const string ZombifySelfActionPrototype = "ActionTurnUndead";
 }
index 96d11fed940e94ea7a4eead92afec6ea1a31a1fa..bdc40f102ef45e3c1022bab84726035e8681b6fa 100644 (file)
@@ -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<ZombieRuleComponent>
     private void OnZombifySelf(EntityUid uid, ZombifyOnDeathComponent component, ZombifySelfActionEvent args)
     {
         _zombie.ZombifyEntity(uid);
-
-        var action = new InstantAction(_prototypeManager.Index<InstantActionPrototype>(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<ZombieRuleComponent>
             EnsureComp<ZombifyOnDeathComponent>(ownedEntity);
             EnsureComp<IncurableZombieComponent>(ownedEntity);
             var inCharacterName = MetaData(ownedEntity).EntityName;
-            var action = new InstantAction(_prototypeManager.Index<InstantActionPrototype>(ZombieRuleComponent.ZombifySelfActionPrototype));
+            var action = Spawn(ZombieRuleComponent.ZombifySelfActionPrototype);
             _action.AddAction(mind.OwnedEntity.Value, action, null);
 
             var message = Loc.GetString("zombie-patientzero-role-greeting");
index 9e01cfa758749403ee2f9b67bae5602cf104b6db..3b63bdfdc4f4e6b6f017f20e172f1504f727f5da 100644 (file)
@@ -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<GhostComponent, ComponentStartup>(OnGhostStartup);
             SubscribeLocalEvent<GhostComponent, ComponentShutdown>(OnGhostShutdown);
+            SubscribeLocalEvent<GhostComponent, MapInitEvent>(OnGhostMapInit);
 
             SubscribeLocalEvent<GhostComponent, ExaminedEvent>(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);
index e924bed776843136b7291aa1cd775eada85d8e47..6a747ae86a4cf28c5eec5e2ffc1bb7a2085355a5 100644 (file)
@@ -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
         /// </summary>
         [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<EntityPrototype>))]
+        public string Action = "ActionToggleGuardian";
 
-    public sealed partial class GuardianToggleActionEvent : InstantActionEvent { };
+        [DataField("actionEntity")] public EntityUid? ActionEntity;
+    }
 }
index 24d7a7e838645b374b10bbea402b80359edcd6d8..323a0fc515a5d3e4b957795f57d3f1ab2c4d51ce 100644 (file)
@@ -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<GuardianComponent, PlayerDetachedEvent>(OnGuardianUnplayer);
 
             SubscribeLocalEvent<GuardianHostComponent, ComponentInit>(OnHostInit);
+            SubscribeLocalEvent<GuardianHostComponent, MapInitEvent>(OnHostMapInit);
             SubscribeLocalEvent<GuardianHostComponent, MoveEvent>(OnHostMove);
             SubscribeLocalEvent<GuardianHostComponent, MobStateChangedEvent>(OnHostStateChange);
             SubscribeLocalEvent<GuardianHostComponent, ComponentShutdown>(OnHostShutdown);
@@ -90,7 +90,11 @@ namespace Content.Server.Guardian
         private void OnHostInit(EntityUid uid, GuardianHostComponent component, ComponentInit args)
         {
             component.GuardianContainer = uid.EnsureContainer<ContainerSlot>("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)
index 6417bad4b57e91ee35b0d33ff766a640561f1803..e74585f0b2fcd2a3bc31dee9f942ffb75e7d6024 100644 (file)
@@ -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)
index b136645264cb54460399ff4eae306eb836861b90..6a7e7ba8a0ade5461844d813a55048aaad1ddc8b 100644 (file)
@@ -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<ActivationVerb> 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);
         }
     }
 }
index 1f2d12183caac7363b44b193b0351e4a567d9502..ebc3c880436323fd02730e30dd2e880b0dbdebd4 100644 (file)
@@ -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.
     /// </summary>
     [ViewVariables]
-    public readonly List<ActionType> Spells = new();
+    public readonly List<EntityUid> Spells = new();
 
     /// <summary>
     /// The three fields below is just used for initialization.
     /// </summary>
-    [DataField("worldSpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, WorldTargetActionPrototype>))]
+    [DataField("spells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, EntityPrototype>))]
     [ViewVariables(VVAccess.ReadWrite)]
-    public Dictionary<string, int> WorldSpells = new();
-
-    [DataField("entitySpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, EntityTargetActionPrototype>))]
-    [ViewVariables(VVAccess.ReadWrite)]
-    public Dictionary<string, int> EntitySpells = new();
-
-    [DataField("instantSpells", customTypeSerializer: typeof(PrototypeIdDictionarySerializer<int, InstantActionPrototype>))]
-    [ViewVariables(VVAccess.ReadWrite)]
-    public Dictionary<string, int> InstantSpells = new();
+    public Dictionary<string, int> SpellActions = new();
 
     [DataField("learnTime")]
     [ViewVariables(VVAccess.ReadWrite)]
index e75bae0249affb1a10a9641e3ef0f4b60282e22a..1632b654b901636df057f9bf8683bbd8d68893cb 100644 (file)
@@ -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<WorldTargetActionPrototype>(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<InstantActionPrototype>(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<EntityTargetActionPrototype>(id));
+            var spell = Spawn(id);
             _actionsSystem.SetCharges(spell, charges < 0 ? null : charges);
             component.Spells.Add(spell);
         }
index 8daf47809d6fd744590ede572395839fb6ecea4c..d7e971e953f0de8d431e103bc6c7d81694b9be9e 100644 (file)
@@ -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
 {
     /// <summary>
     /// 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<EntityPrototype>))]
+        public string Action = "ActionStethoscope";
+
+        [DataField("actionEntity")] public EntityUid? ActionEntity;
     }
 }
index 9aee322667d6d67ae2ab4500217b3c94dad54862..9f28d44d59c167644d7a3d0335e0210df1a05d00 100644 (file)
@@ -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 {}
 }
index 7babea79abc2096f4752eb38940f9a58ed9c8183..9d0a6b4a857b5c048dfc24279e12b9e3598f64f5 100644 (file)
@@ -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;
     }
 }
-
-/// <summary>
-///     Only applies to mobs in crit capable of ghosting/succumbing
-/// </summary>
-public sealed partial class CritSuccumbEvent : InstantActionEvent
-{
-}
-
-/// <summary>
-///     Only applies/has functionality to mobs in crit that have <see cref="DeathgaspComponent"/>
-/// </summary>
-public sealed partial class CritFakeDeathEvent : InstantActionEvent
-{
-}
-
-/// <summary>
-///     Only applies to mobs capable of speaking, as a last resort in crit
-/// </summary>
-public sealed partial class CritLastWordsEvent : InstantActionEvent
-{
-}
index cd928637e7765abf7411d4378d839f1bd2bf8632..c05d36a8425ccfb7fa8ee9c632d1b98325f322b7 100644 (file)
@@ -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.
         /// </summary>
-        public Dictionary<string, InstantAction>? PolymorphActions = null;
+        public Dictionary<string, EntityUid>? PolymorphActions = null;
 
         /// <summary>
         /// The polymorphs that the entity starts out being able to do.
index fda90f2cb0dd8d6650cd846251d27ad48e33c3a5..d630cbcad7380de2b59c04294e35566ce78b1253 100644 (file)
@@ -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),
-            };
-
-            _actions.AddAction(uid, act, null);
+                action.EntityIcon = component.Parent;
+                action.UseDelay = TimeSpan.FromSeconds(proto.Delay);
+            }
+
+            _actions.AddAction(uid, actionId, null, null, action);
         }
 
         private void OnBeforeFullyEaten(EntityUid uid, PolymorphedEntityComponent comp, BeforeFullyEatenEvent args)
         {
             if (!_proto.TryIndex<PolymorphPrototype>(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<EntityPrototype>(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,
-            };
-
-            polycomp.PolymorphActions ??= new();
-
-            polycomp.PolymorphActions.Add(id, act);
-            _actions.AddAction(target, act, target);
+                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 Dictionary<string, EntityUid>();
+                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
-    {
-        /// <summary>
-        /// The polymorph prototype containing all the information about
-        /// the specific polymorph.
-        /// </summary>
-        public PolymorphPrototype Prototype = default!;
-    }
-
-    public sealed partial class RevertPolymorphActionEvent : InstantActionEvent
-    {
-
-    }
 }
index c38c9222438c51f65c6fa6bb6918545d77ef2f11..22e9de413579f169f271a49cee25d4201d7269c8 100644 (file)
@@ -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<EntityPrototype>))]
+        public string ActionRaiseArmy = "ActionRatKingRaiseArmy";
+
         /// <summary>
         ///     The action for the Raise Army ability
         /// </summary>
-        [DataField("actionRaiseArmy", required: true)]
-        public InstantAction ActionRaiseArmy = new();
+        [DataField("actionRaiseArmyEntity")] public EntityUid? ActionRaiseArmyEntity;
 
         /// <summary>
         ///     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<EntityPrototype>))]
         public string ArmyMobSpawnId = "MobRatServant";
 
+        [DataField("actionDomain", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+        public string ActionDomain = "ActionRatKingDomain";
+
         /// <summary>
         ///     The action for the Domain ability
         /// </summary>
-        [DataField("actionDomain", required: true)]
-        public InstantAction ActionDomain = new();
+        [DataField("actionDomainEntity")]
+        public EntityUid? ActionDomainEntity;
 
         /// <summary>
         ///     The amount of hunger one use of Domain consumes
@@ -43,4 +47,4 @@ namespace Content.Server.RatKing
         [DataField("molesMiasmaPerDomain")]
         public float MolesMiasmaPerDomain = 100f;
     }
-};
+}
index 5f9d7376a08c75b157ce2f5d74383d9020a5d700..cd3cbbb691ddd8c1b022ce61401d6d470e24a78e 100644 (file)
@@ -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<RatKingComponent, ComponentStartup>(OnStartup);
+            SubscribeLocalEvent<RatKingComponent, MapInitEvent>(OnMapInit);
 
             SubscribeLocalEvent<RatKingComponent, RatKingRaiseArmyActionEvent>(OnRaiseArmy);
             SubscribeLocalEvent<RatKingComponent, RatKingDomainActionEvent>(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);
         }
 
         /// <summary>
@@ -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
-    {
-
-    }
-};
+}
index 73a04ca8a40a5634a832212d07dfdb6dc2e7fdcc..4028f2dce2f13534ef9a6672715cea1e58201477 100644 (file)
@@ -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<EntityPrototype>]
+    private const string RevenantShopId = "ActionRevenantShop";
+
     public override void Initialize()
     {
         base.Initialize();
 
         SubscribeLocalEvent<RevenantComponent, ComponentStartup>(OnStartup);
+        SubscribeLocalEvent<RevenantComponent, MapInitEvent>(OnMapInit);
 
         SubscribeLocalEvent<RevenantComponent, RevenantShopActionEvent>(OnShop);
         SubscribeLocalEvent<RevenantComponent, DamageChangedEvent>(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<InstantActionPrototype>("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)
index 38528e530961d68735f502fa3764ef25d2cff67c..2d258accc89e28a28e02bc617671c9a44b78e34f 100644 (file)
@@ -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<EntityPrototype>))]
+    public string Action = "ActionSericulture";
+
+    [DataField("actionEntity")] public EntityUid? ActionEntity;
 
     /// <summary>
     /// How long will it take to make.
index 3570695a5fa3332b4943ddfb0de9e232fe004814..011e225c282b8c1dbb7146d6e912123bd6182515 100644 (file)
@@ -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<SericultureComponent, ComponentInit>(OnCompInit);
+        SubscribeLocalEvent<SericultureComponent, MapInitEvent>(OnCompMapInit);
         SubscribeLocalEvent<SericultureComponent, ComponentShutdown>(OnCompRemove);
         SubscribeLocalEvent<SericultureComponent, SericultureActionEvent>(OnSericultureStart);
         SubscribeLocalEvent<SericultureComponent, SericultureDoAfterEvent>(OnSericultureDoAfter);
     }
 
-    private void OnCompInit(EntityUid uid, SericultureComponent comp, ComponentInit args)
+    private void OnCompMapInit(EntityUid uid, SericultureComponent comp, MapInitEvent args)
     {
-        if (!_protoManager.TryIndex<InstantActionPrototype>(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<InstantActionPrototype>(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 { }
 }
index 3e93933605095ed81bc4230d4b35cf34cc8abbd7..51987fb721ceec23fe7064ba93c280760418a6d6 100644 (file)
@@ -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);
     }
 
index e83fc9b6aaafe12d04f5f3674a3e0d4e3b02e209..1d5c2e35e8b74425920ee49a7a79204d3d77261d 100644 (file)
@@ -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<SiliconLawBoundComponent, ComponentStartup>(OnComponentStartup);
         SubscribeLocalEvent<SiliconLawBoundComponent, ComponentShutdown>(OnComponentShutdown);
         SubscribeLocalEvent<SiliconLawBoundComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<SiliconLawBoundComponent, MindAddedMessage>(OnMindAdded);
@@ -58,20 +56,15 @@ public sealed class SiliconLawSystem : SharedSiliconLawSystem
         SubscribeLocalEvent<EmagSiliconLawComponent, ExaminedEvent>(OnExamined);
     }
 
-    private void OnComponentStartup(EntityUid uid, SiliconLawBoundComponent component, ComponentStartup args)
-    {
-        component.ProvidedAction = new(_prototype.Index<InstantActionPrototype>(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);
     }
 
index 292498474c6f6d70aee7bb19361b16741fed820b..029d638a66954c2b6ce48e7f60665efc14abea38 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string ScreamActionId = "Scream";
+    [DataField("screamAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string ScreamAction = "ActionScream";
 
-    [DataField("screamAction")]
-    public InstantAction? ScreamAction;
+    [DataField("screamActionEntity")]
+    public EntityUid? ScreamActionEntity;
 
     /// <summary>
     ///     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
-{
-
-}
index 4e884f5f3b71af37a9df982ac1755aff2e315d1e..815b0224c8a2a5e6466c02c13463af49ffb4b64f 100644 (file)
@@ -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<MeleeSpeechComponent, MeleeSpeechBattlecryChangedMessage>(OnBattlecryChanged);
         SubscribeLocalEvent<MeleeSpeechComponent, MeleeSpeechConfigureActionEvent>(OnConfigureAction);
         SubscribeLocalEvent<MeleeSpeechComponent, GetItemActionsEvent>(OnGetActions);
-        SubscribeLocalEvent<MeleeSpeechComponent, ComponentInit>(OnComponentInit);
+        SubscribeLocalEvent<MeleeSpeechComponent, MapInitEvent>(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)
     {
index 244b5124c298fd20c70df9456d8a8c1ca2f2442d..5dccb8bf9cc417840e9d85e67a281fb39b854043 100644 (file)
@@ -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;
     }
 
index 19f5a2105e5da3cecde054d0c2834abf46a628ae..5de45425093add78cf112568f4435f8055fc3ab5 100644 (file)
@@ -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<InstantActionPrototype>(listing.ProductAction));
-            _actions.AddAction(buyer, action, null);
+            _actions.AddAction(buyer, Spawn(listing.ProductAction), null);
         }
 
         //broadcast event
index bde518cc96ad6c031732ef0e143371561bf98056..c7f07c2f7002f41749e855f476096e7148858175 100644 (file)
@@ -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;
index 2e4814e0545c0af0f8ce5bb00e9ceaeaf5449ed0..4d3c7ffba97cc130390bf7b29f4a9c45777e423a 100644 (file)
@@ -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
 {
     /// <summary>
     /// List of UIs and their actions that this entity has.
     /// </summary>
-    [DataField("uis", required: true)]
-    public List<IntrinsicUIEntry> 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<IntrinsicUIEntry> UIs = new();
 }
 
 [DataDefinition]
-public partial struct IntrinsicUIEntry
+public partial class IntrinsicUIEntry
 {
-    [ViewVariables] public Enum? Key { get; private set; } = null;
-
     /// <summary>
     /// The BUI key that this intrinsic UI should open.
     /// </summary>
     [DataField("key", required: true)]
-    private string _keyRaw = default!;
+    public Enum? Key { get; private set; }
+
+    [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>), required: true)]
+    public string? ToggleAction;
 
     /// <summary>
     /// The action used for this BUI.
     /// </summary>
-    [DataField("toggleAction", required: true)]
-    public InstantAction ToggleAction = new();
-
-    public void AfterDeserialization()
-    {
-        var reflectionManager = IoCManager.Resolve<IReflectionManager>();
-        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();
 }
index c1268b0974f9149858f3bad512a0161d4048e7c2..c7360c15bfcf4c378cfc523d0bfdaa770bfbc002 100644 (file)
@@ -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
 {
index f80d4d600ad298ca455b5330f7c801c5aef7083c..38576b8951ae7901b9bb8310e4530babf2e61afb 100644 (file)
@@ -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<VendingMachineComponent, MapInitEvent>(OnComponentMapInit);
             SubscribeLocalEvent<VendingMachineComponent, PowerChangedEvent>(OnPowerChanged);
             SubscribeLocalEvent<VendingMachineComponent, BreakageEventArgs>(OnBreak);
             SubscribeLocalEvent<VendingMachineComponent, GotEmaggedEvent>(OnEmagged);
@@ -62,6 +62,12 @@ namespace Content.Server.VendingMachines
             SubscribeLocalEvent<VendingMachineRestockComponent, PriceCalculationEvent>(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<InstantActionPrototype>(component.Action));
-                _action.AddAction(uid, action, uid);
-            }
         }
 
         private void OnActivatableUIOpenAttempt(EntityUid uid, VendingMachineComponent component, ActivatableUIOpenAttemptEvent args)
index 74c7b3b77e70c3c1df2402bb5d868fee13c018cc..87b3b9ef323c77942ea44669bb478fc9e89fcd44 100644 (file)
@@ -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<VoiceMaskComponent>(user);
         comp.VoiceName = component.LastSetName;
 
-        if (!_prototypeManager.TryIndex<InstantActionPrototype>(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)
index fe15df382979b848d13454974186b0ea21427021..5143237fa0b34a656a525a1f8a7e85771566dd13 100644 (file)
@@ -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
-{
-}
index 4ca22cbf945e037b5444df4bd0b9cbf6f1e139b5..c3cc29c52717c81f6d09aa23bc6b6647b332ece1 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string Action = "ChangeVoiceMask";
+    [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string Action = "ActionChangeVoiceMask";
+
+    [DataField("actionEntity")] public EntityUid? ActionEntity;
 }
index 69f9450a4fc0f04ae08f0ddb228e4711f7fa633c..91aaaa417a5fa32fc7689e1f0a22f9fb027615a7 100644 (file)
@@ -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<EntityPrototype>] private const string ArtifactActivateActionId = "ActionArtifactActivate";
+
     /// <summary>
     ///     Used to add the artifact activation action (hehe), which lets sentient artifacts activate themselves,
     ///     either through admemery or the sentience effect.
     /// </summary>
     public void InitializeActions()
     {
-        SubscribeLocalEvent<ArtifactComponent, ComponentStartup>(OnStartup);
+        SubscribeLocalEvent<ArtifactComponent, MapInitEvent>(OnStartup);
         SubscribeLocalEvent<ArtifactComponent, ComponentRemove>(OnRemove);
 
         SubscribeLocalEvent<ArtifactComponent, ArtifactSelfActivateEvent>(OnSelfActivate);
     }
 
-    private void OnStartup(EntityUid uid, ArtifactComponent component, ComponentStartup args)
+    private void OnStartup(EntityUid uid, ArtifactComponent component, MapInitEvent args)
     {
-        if (_prototype.TryIndex<InstantActionPrototype>("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<InstantActionPrototype>("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;
     }
 }
-
index 573fa36a269d9fa0a499a08ba9745798be07b63f..0791924caaf351d156a1f2d6c4a7e66cd771a0ac 100644 (file)
@@ -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<ArtifactComponent, MapInitEvent>(OnInit);
         SubscribeLocalEvent<ArtifactComponent, PriceCalculationEvent>(GetPrice);
         SubscribeLocalEvent<RoundEndTextAppendEvent>(OnRoundEnd);
 
@@ -38,11 +37,6 @@ public sealed partial class ArtifactSystem : EntitySystem
         InitializeActions();
     }
 
-    private void OnInit(EntityUid uid, ArtifactComponent component, MapInitEvent args)
-    {
-        RandomizeArtifact(uid, component);
-    }
-
     /// <summary>
     /// Calculates the price of an artifact based on
     /// how many nodes have been unlocked/triggered
index 4554ff94b2bc94d117b62943b7af5847566eaff0..0245b220a335d106201319bfbe29b0692c6c5760 100644 (file)
@@ -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;
 
index c99151ecefcd640c262d79ca33be02acf61be2b3..3d45d3ef1a686115f7261c1d2531cf21b7917aef 100644 (file)
@@ -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;
 /// </remarks>
 public sealed class GetItemActionsEvent : EntityEventArgs
 {
-    public SortedSet<ActionType> Actions = new();
+    private readonly IEntityManager _entities;
+    private readonly INetManager _net;
+    public readonly SortedSet<EntityUid> Actions = new();
 
     /// <summary>
     /// User equipping the item.
@@ -35,11 +37,26 @@ public sealed class GetItemActionsEvent : EntityEventArgs
     /// </summary>
     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);
+    }
 }
 
 /// <summary>
@@ -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 (file)
index 2e61ef3..0000000
+++ /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 (file)
index 93a24e2..0000000
+++ /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<ActionType>, IComparable, ICloneable
-{
-    /// <summary>
-    ///     Icon representing this action in the UI.
-    /// </summary>
-    [DataField("icon")]
-    public SpriteSpecifier? Icon;
-
-    /// <summary>
-    ///     For toggle actions only, icon to show when toggled on. If omitted, the action will simply be highlighted
-    ///     when turned on.
-    /// </summary>
-    [DataField("iconOn")]
-    public SpriteSpecifier? IconOn;
-
-    /// <summary>
-    ///     If not null, this color will modulate the action icon color.
-    /// </summary>
-    /// <remarks>
-    ///     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.
-    /// </remarks>
-    [DataField("iconColor")]
-    public Color IconColor = Color.White;
-
-    /// <summary>
-    ///     Name to show in UI.
-    /// </summary>
-    [DataField("name")]
-    public string DisplayName = string.Empty;
-
-    /// <summary>
-    /// This is just <see cref="DisplayName"/> with localized strings resolved and markup removed. If null, will be
-    /// inferred from <see cref="DisplayName"/>. This is cached to speed up game state handling.
-    /// </summary>
-    [NonSerialized]
-    public string? RawName;
-
-    /// <summary>
-    ///     Description to show in UI. Accepts formatting.
-    /// </summary>
-    [DataField("description")]
-    public string Description = string.Empty;
-
-    /// <summary>
-    ///     Keywords that can be used to search for this action in the action menu.
-    /// </summary>
-    [DataField("keywords")]
-    public HashSet<string> Keywords = new();
-
-    /// <summary>
-    ///     Whether this action is currently enabled. If not enabled, this action cannot be performed.
-    /// </summary>
-    [DataField("enabled")]
-    public bool Enabled = true;
-
-    /// <summary>
-    ///     The toggle state of this action. Toggling switches the currently displayed icon, see <see cref="Icon"/> and <see cref="IconOn"/>.
-    /// </summary>
-    /// <remarks>
-    ///     The toggle can set directly via <see cref="SharedActionsSystem.SetToggled()"/>, but it will also be
-    ///     automatically toggled for targeted-actions while selecting a target.
-    /// </remarks>
-    public bool Toggled;
-
-    /// <summary>
-    ///     The current cooldown on the action.
-    /// </summary>
-    public (TimeSpan Start, TimeSpan End)? Cooldown;
-
-    /// <summary>
-    ///     Time interval between action uses.
-    /// </summary>
-    [DataField("useDelay")]
-    public TimeSpan? UseDelay;
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    [DataField("charges")]
-    public int? Charges;
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    public EntityUid? Provider;
-
-    /// <summary>
-    ///     Entity to use for the action icon. Defaults to using <see cref="Provider"/>.
-    /// </summary>
-    public EntityUid? EntityIcon
-    {
-        get => _entityIcon ?? Provider;
-        set => _entityIcon = value;
-    }
-
-    private EntityUid? _entityIcon;
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    [DataField("checkCanInteract")]
-    public bool CheckCanInteract = true;
-
-    /// <summary>
-    ///     If true, will simply execute the action locally without sending to the server.
-    /// </summary>
-    [DataField("clientExclusive")]
-    public bool ClientExclusive = false;
-
-    /// <summary>
-    ///     Determines the order in which actions are automatically added the action bar.
-    /// </summary>
-    [DataField("priority")]
-    public int Priority = 0;
-
-    /// <summary>
-    ///     What entity, if any, currently has this action in the actions component?
-    /// </summary>
-    [ViewVariables]
-    public EntityUid? AttachedEntity;
-
-    /// <summary>
-    ///     Whether or not to automatically add this action to the action bar when it becomes available.
-    /// </summary>
-    [DataField("autoPopulate")]
-    public bool AutoPopulate = true;
-
-
-    /// <summary>
-    ///     Whether or not to automatically remove this action to the action bar when it becomes unavailable.
-    /// </summary>
-    [DataField("autoRemove")]
-    public bool AutoRemove = true;
-
-    /// <summary>
-    ///     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).
-    /// </summary>
-    /// <remarks>
-    ///     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.
-    /// </remarks>
-    [DataField("temporary")]
-    public bool Temporary;
-    // TODO re-add support for this
-    // UI refactor seems to have just broken it.
-
-    /// <summary>
-    ///     Determines the appearance of the entity-icon for actions that are enabled via some entity.
-    /// </summary>
-    [DataField("itemIconStyle")]
-    public ItemActionIconStyle ItemIconStyle;
-
-    /// <summary>
-    ///     If not null, this sound will be played when performing this action.
-    /// </summary>
-    [DataField("sound")]
-    public SoundSpecifier? Sound;
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    /// <remarks>
-    ///     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.
-    /// </remarks>
-    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;
-    }
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    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 (file)
index 34ee352..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-using Robust.Shared.Serialization;
-
-namespace Content.Shared.Actions.ActionTypes;
-
-/// <summary>
-///     Instantaneous action with no extra targeting information. Will result in <see cref="InstantActionEvent"/> being raised.
-/// </summary>
-[Serializable, NetSerializable]
-[Virtual]
-public partial class InstantAction : ActionType
-{
-    /// <summary>
-    ///     The local-event to raise when this action is performed.
-    /// </summary>
-    [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 (file)
index 7809720..0000000
+++ /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
-{
-    /// <summary>
-    ///     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.
-    /// </summary>
-    [DataField("repeat")]
-    public bool Repeat;
-
-    /// <summary>
-    ///     For  entity- or map-targeting action, determines whether the action is deselected if the user doesn't click a valid target.
-    /// </summary>
-    [DataField("deselectOnMiss")]
-    public bool DeselectOnMiss;
-
-    /// <summary>
-    ///     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.
-    /// </summary>
-    /// <remarks>
-    ///     Even if this is false, the <see cref="Range"/> will still be checked.
-    /// </remarks>
-    [DataField("checkCanAccess")]
-    public bool CheckCanAccess = true;
-
-    [DataField("range")]
-    public float Range = SharedInteractionSystem.InteractionRange;
-
-    /// <summary>
-    ///     If the target is invalid, this bool determines whether the left-click will default to performing a standard-interaction
-    /// </summary>
-    /// <remarks>
-    ///     Interactions will still be blocked if the target-validation generates a pop-up
-    /// </remarks>
-    [DataField("interactOnMiss")]
-    public bool InteractOnMiss = false;
-
-    /// <summary>
-    ///     If true, and if <see cref="ShowHandItemOverlay"/> is enabled, then this action's icon will be drawn by that
-    ///     over lay in place of the currently held item "held item".
-    /// </summary>
-    [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;
-    }
-}
-
-/// <summary>
-///     Action that targets some entity. Will result in <see cref="EntityTargetActionEvent"/> being raised.
-/// </summary>
-[Serializable, NetSerializable]
-[Virtual]
-public partial class EntityTargetAction : TargetedAction
-{
-    /// <summary>
-    ///     The local-event to raise when this action is performed.
-    /// </summary>
-    [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);
-    }
-}
-
-/// <summary>
-///     Action that targets some map coordinates. Will result in <see cref="WorldTargetActionEvent"/> being raised.
-/// </summary>
-[Serializable, NetSerializable]
-[Virtual]
-public partial class WorldTargetAction : TargetedAction
-{
-    /// <summary>
-    ///     The local-event to raise when this action is performed.
-    /// </summary>
-    [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);
-    }
-}
index 4472f8a095cf698205072a4259955b2b5ff5704a..c84484dfc0364c58bc6b7d4b71ca87ca385eb3f0 100644 (file)
@@ -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<ActionType> Actions = new();
+    /// <summary>
+    ///     Handled on the client to track added and removed actions.
+    /// </summary>
+    [ViewVariables] public readonly Dictionary<EntityUid, ActionMetaData> 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<ActionType> Actions;
+    public readonly List<EntityUid> Actions;
 
-    [NonSerialized]
-    public SortedSet<ActionType>? SortedActions;
-
-    public ActionsComponentState(List<ActionType> actions)
+    public ActionsComponentState(List<EntityUid> actions)
     {
         Actions = actions;
     }
 }
 
+public readonly record struct ActionMetaData(bool ClientExclusive, bool AutoRemove);
+
 /// <summary>
 ///     Determines how the action icon appears in the hotbar for item actions.
 /// </summary>
diff --git a/Content.Shared/Actions/BaseActionComponent.cs b/Content.Shared/Actions/BaseActionComponent.cs
new file mode 100644 (file)
index 0000000..7ece8e2
--- /dev/null
@@ -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; }
+
+    /// <summary>
+    ///     Icon representing this action in the UI.
+    /// </summary>
+    [DataField("icon")] public SpriteSpecifier? Icon;
+
+    /// <summary>
+    ///     For toggle actions only, icon to show when toggled on. If omitted, the action will simply be highlighted
+    ///     when turned on.
+    /// </summary>
+    [DataField("iconOn")] public SpriteSpecifier? IconOn;
+
+    /// <summary>
+    ///     If not null, this color will modulate the action icon color.
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    [DataField("iconColor")] public Color IconColor = Color.White;
+
+    /// <summary>
+    ///     Keywords that can be used to search for this action in the action menu.
+    /// </summary>
+    [DataField("keywords")] public HashSet<string> Keywords = new();
+
+    /// <summary>
+    ///     Whether this action is currently enabled. If not enabled, this action cannot be performed.
+    /// </summary>
+    [DataField("enabled")] public bool Enabled = true;
+
+    /// <summary>
+    ///     The toggle state of this action. Toggling switches the currently displayed icon, see <see cref="Icon"/> and <see cref="IconOn"/>.
+    /// </summary>
+    /// <remarks>
+    ///     The toggle can set directly via <see cref="SharedActionsSystem.SetToggled"/>, but it will also be
+    ///     automatically toggled for targeted-actions while selecting a target.
+    /// </remarks>
+    public bool Toggled;
+
+    /// <summary>
+    ///     The current cooldown on the action.
+    /// </summary>
+    public (TimeSpan Start, TimeSpan End)? Cooldown;
+
+    /// <summary>
+    ///     Time interval between action uses.
+    /// </summary>
+    [DataField("useDelay")] public TimeSpan? UseDelay;
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    [DataField("charges")] public int? Charges;
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    public EntityUid? Provider;
+
+    /// <summary>
+    ///     Entity to use for the action icon. Defaults to using <see cref="Provider"/>.
+    /// </summary>
+    public EntityUid? EntityIcon
+    {
+        get => _entityIcon ?? Provider;
+        set => _entityIcon = value;
+    }
+
+    private EntityUid? _entityIcon;
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    [DataField("checkCanInteract")] public bool CheckCanInteract = true;
+
+    /// <summary>
+    ///     If true, will simply execute the action locally without sending to the server.
+    /// </summary>
+    [DataField("clientExclusive")] public bool ClientExclusive = false;
+
+    /// <summary>
+    ///     Determines the order in which actions are automatically added the action bar.
+    /// </summary>
+    [DataField("priority")] public int Priority = 0;
+
+    /// <summary>
+    ///     What entity, if any, currently has this action in the actions component?
+    /// </summary>
+    [ViewVariables] public EntityUid? AttachedEntity;
+
+    /// <summary>
+    ///     Whether or not to automatically add this action to the action bar when it becomes available.
+    /// </summary>
+    [DataField("autoPopulate")] public bool AutoPopulate = true;
+
+
+    /// <summary>
+    ///     Whether or not to automatically remove this action to the action bar when it becomes unavailable.
+    /// </summary>
+    [DataField("autoRemove")] public bool AutoRemove = true;
+
+    /// <summary>
+    ///     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).
+    /// </summary>
+    /// <remarks>
+    ///     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.
+    /// </remarks>
+    [DataField("temporary")] public bool Temporary;
+    // TODO re-add support for this
+    // UI refactor seems to have just broken it.
+
+    /// <summary>
+    ///     Determines the appearance of the entity-icon for actions that are enabled via some entity.
+    /// </summary>
+    [DataField("itemIconStyle")] public ItemActionIconStyle ItemIconStyle;
+
+    /// <summary>
+    ///     If not null, this sound will be played when performing this action.
+    /// </summary>
+    [DataField("sound")] public SoundSpecifier? Sound;
+}
+
+[Serializable, NetSerializable]
+public abstract class BaseActionComponentState : ComponentState
+{
+    public SpriteSpecifier? Icon;
+    public SpriteSpecifier? IconOn;
+    public Color IconColor;
+    public HashSet<string> 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 (file)
index 0000000..7e40b10
--- /dev/null
@@ -0,0 +1,43 @@
+using Content.Shared.Interaction;
+
+namespace Content.Shared.Actions;
+
+public abstract partial class BaseTargetActionComponent : BaseActionComponent
+{
+    /// <summary>
+    ///     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.
+    /// </summary>
+    [DataField("repeat")] public bool Repeat;
+
+    /// <summary>
+    ///     For  entity- or map-targeting action, determines whether the action is deselected if the user doesn't click a valid target.
+    /// </summary>
+    [DataField("deselectOnMiss")] public bool DeselectOnMiss;
+
+    /// <summary>
+    ///     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.
+    /// </summary>
+    /// <remarks>
+    ///     Even if this is false, the <see cref="Range"/> will still be checked.
+    /// </remarks>
+    [DataField("checkCanAccess")] public bool CheckCanAccess = true;
+
+    [DataField("range")] public float Range = SharedInteractionSystem.InteractionRange;
+
+    /// <summary>
+    ///     If the target is invalid, this bool determines whether the left-click will default to performing a standard-interaction
+    /// </summary>
+    /// <remarks>
+    ///     Interactions will still be blocked if the target-validation generates a pop-up
+    /// </remarks>
+    [DataField("interactOnMiss")] public bool InteractOnMiss = false;
+
+    /// <summary>
+    ///     If true, and if <see cref="ShowHandItemOverlay"/> is enabled, then this action's icon will be drawn by that
+    ///     over lay in place of the currently held item "held item".
+    /// </summary>
+    [DataField("targetingIndicator")] public bool TargetingIndicator = true;
+}
diff --git a/Content.Shared/Actions/EntityTargetActionComponent.cs b/Content.Shared/Actions/EntityTargetActionComponent.cs
new file mode 100644 (file)
index 0000000..33c4bf8
--- /dev/null
@@ -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;
+
+    /// <summary>
+    ///     The local-event to raise when this action is performed.
+    /// </summary>
+    [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 (file)
index 0000000..5cdcfce
--- /dev/null
@@ -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 (file)
index 0000000..be77cfd
--- /dev/null
@@ -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 (file)
index 0000000..d84b991
--- /dev/null
@@ -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 (file)
index 0000000..f97ca04
--- /dev/null
@@ -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;
+
+    /// <summary>
+    ///     The local-event to raise when this action is performed.
+    /// </summary>
+    [DataField("event")]
+    [NonSerialized]
+    public InstantActionEvent? Event;
+}
+
+[Serializable, NetSerializable]
+public sealed class InstantActionComponentState : BaseActionComponentState
+{
+    public InstantActionComponentState(InstantActionComponent component) : base(component)
+    {
+    }
+}
index 9fc1b837482e7d7c32ea8a6691864161d7e32a13..00514fcea3ab55c1124416cb08e04cba138b186f 100644 (file)
@@ -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<ActionsComponent, DidUnequipEvent>(OnDidUnequip);
         SubscribeLocalEvent<ActionsComponent, DidUnequipHandEvent>(OnHandUnequipped);
 
-        SubscribeLocalEvent<ActionsComponent, ComponentGetState>(GetState);
+        SubscribeLocalEvent<ActionsComponent, MapInitEvent>(OnActionsMapInit);
+        SubscribeLocalEvent<ActionsComponent, ComponentGetState>(OnActionsGetState);
+        SubscribeLocalEvent<ActionsComponent, ComponentShutdown>(OnActionsShutdown);
+
+        SubscribeLocalEvent<InstantActionComponent, ComponentGetState>(OnInstantGetState);
+        SubscribeLocalEvent<EntityTargetActionComponent, ComponentGetState>(OnEntityTargetGetState);
+        SubscribeLocalEvent<WorldTargetActionComponent, ComponentGetState>(OnWorldTargetGetState);
+
+        SubscribeLocalEvent<InstantActionComponent, ComponentHandleState>(OnInstantHandleState);
+        SubscribeLocalEvent<EntityTargetActionComponent, ComponentHandleState>(OnEntityTargetHandleState);
+        SubscribeLocalEvent<WorldTargetActionComponent, ComponentHandleState>(OnWorldTargetHandleState);
+
+        SubscribeLocalEvent<InstantActionComponent, GetActionDataEvent>(OnGetActionData);
+        SubscribeLocalEvent<EntityTargetActionComponent, GetActionDataEvent>(OnGetActionData);
+        SubscribeLocalEvent<WorldTargetActionComponent, GetActionDataEvent>(OnGetActionData);
 
         SubscribeAllEvent<RequestPerformActionEvent>(OnActionRequest);
     }
 
+    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<string>(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<T>(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<Container>(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(ActionType action)
+    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 OnActionsMapInit(EntityUid uid, ActionsComponent component, MapInitEvent args)
+    {
+        EnsureContainer(uid);
+    }
+
+    private void OnActionsGetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args)
+    {
+        var actions = new List<EntityUid>();
+        if (TryGetContainer(uid, out var container))
+            actions.AddRange(container.ContainedEntities);
+
+        args.State = new ActionsComponentState(actions);
     }
 
-    private void GetState(EntityUid uid, ActionsComponent component, ref ComponentGetState args)
+    private void OnActionsShutdown(EntityUid uid, ActionsComponent component, ComponentShutdown args)
     {
-        args.State = new ActionsComponentState(component.Actions.ToList());
+        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
     /// <summary>
-    ///     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.
     /// </summary>
-    /// <param name="uid">Entity to receive the actions</param>
-    /// <param name="action">The action to add</param>
+    public BaseActionComponent? AddAction(EntityUid holderId, ref EntityUid? actionId, string? actionPrototypeId, EntityUid? provider = null, ActionsComponent? holderComp = null)
+    {
+        if (Deleted(actionId))
+        {
+            if (_net.IsClient)
+                return null;
+
+            if (string.IsNullOrWhiteSpace(actionPrototypeId))
+                return null;
+
+            actionId = Spawn(actionPrototypeId);
+        }
+
+        AddAction(holderId, actionId.Value, provider, holderComp);
+        return GetActionData(actionId);
+    }
+
+    /// <summary>
+    ///     Add an action to an action holder.
+    ///     If the holder has no actions component, this will give them one.
+    /// </summary>
+    /// <param name="holderId">Entity to receive the actions</param>
+    /// <param name="actionId">Action entity to add</param>
     /// <param name="provider">The entity that enables these actions (e.g., flashlight). May be null (innate actions).</param>
-    public virtual void AddAction(EntityUid uid, ActionType action, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true)
+    /// <param name="holder">Component of <see cref="holderId"/></param>
+    /// <param name="action">Component of <see cref="actionId"/></param>
+    /// <param name="actionContainer">Action container of <see cref="holderId"/></param>
+    public virtual void AddAction(EntityUid holderId, EntityUid actionId, EntityUid? provider, ActionsComponent? holder = null, BaseActionComponent? action = null, bool dirty = true, IContainer? actionContainer = null)
     {
-        // Because action classes have state data, e.g. cooldowns and uses-remaining, people should not be adding prototypes directly
-        if (action is IPrototype)
+        action ??= GetActionData(actionId);
+        // TODO remove when action subscriptions are split up
+        if (action == null)
         {
-            Log.Error("Attempted to directly add a prototype action. You need to clone a prototype in order to use it.");
+            Log.Warning($"No {nameof(BaseActionComponent)} found on entity {actionId}");
             return;
         }
 
-        comp ??= EnsureComp<ActionsComponent>(uid);
+        holder ??= EnsureComp<ActionsComponent>(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);
     }
 
     /// <summary>
     ///     Add actions to an action component. If the entity has no action component, this will give them one.
     /// </summary>
-    /// <param name="uid">Entity to receive the actions</param>
+    /// <param name="holderId">Entity to receive the actions</param>
     /// <param name="actions">The actions to add</param>
     /// <param name="provider">The entity that enables these actions (e.g., flashlight). May be null (innate actions).</param>
-    public void AddActions(EntityUid uid, IEnumerable<ActionType> actions, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true)
+    public void AddActions(EntityUid holderId, IEnumerable<EntityUid> actions, EntityUid? provider, ActionsComponent? comp = null, bool dirty = true)
     {
-        comp ??= EnsureComp<ActionsComponent>(uid);
+        comp ??= EnsureComp<ActionsComponent>(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);
+        }
     }
 
     /// <summary>
     ///     Remove any actions that were enabled by some other entity. Useful when unequiping items that grant actions.
     /// </summary>
-    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;
+
+        if (!TryGetContainer(holderId, out var container, actionContainer))
             return;
 
-        foreach (var act in comp.Actions.ToArray())
+        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);
+    }
+
+    /// <summary>
+    ///     Removes all actions with the given prototype id.
+    /// </summary>
+    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 (file)
index 0000000..f2ee34f
--- /dev/null
@@ -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;
+
+    /// <summary>
+    ///     The local-event to raise when this action is performed.
+    /// </summary>
+    [DataField("event")]
+    [NonSerialized]
+    public WorldTargetActionEvent? Event;
+}
+
+[Serializable, NetSerializable]
+public sealed class WorldTargetActionComponentState : BaseActionComponentState
+{
+    public WorldTargetActionComponentState(WorldTargetActionComponent component) : base(component)
+    {
+    }
+}
index 2ecd6c601c244c942b0020db3ecf9b7440f8858a..d049699d9d562bcbaa2bed1a85f63c7aeed77e90 100644 (file)
@@ -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<EntityPrototype>] private const string WakeActionId = "ActionWake";
+
         public override void Initialize()
         {
             base.Initialize();
             SubscribeLocalEvent<SleepingComponent, ComponentStartup>(OnStartup);
+            SubscribeLocalEvent<SleepingComponent, MapInitEvent>(OnMapInit);
             SubscribeLocalEvent<SleepingComponent, ComponentShutdown>(OnShutdown);
             SubscribeLocalEvent<SleepingComponent, SpeakAttemptEvent>(OnSpeakAttempt);
             SubscribeLocalEvent<SleepingComponent, CanSeeAttemptEvent>(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);
index e4100ff6dab7008bc5712addf519751bb3b1c5da..94838b658ffcb0f4ff4c2e82d2232885d5c08e79 100644 (file)
@@ -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 (file)
index 0000000..3d57f40
--- /dev/null
@@ -0,0 +1,8 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Bible;
+
+public sealed partial class SummonActionEvent : InstantActionEvent
+{
+
+}
\ No newline at end of file
index 7a7cf02e1d9cd3cdafa1f6f0f1d7549dd1c7c229..3735058154075d49e09b65cc24cbea6788c10179 100644 (file)
@@ -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);
index 89f3a85de7be538cbf25e69a816cc26f863af413..b33a7d7a73463f20beee2b76de6798b0343f2a35 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string BlockingToggleActionId = "ToggleBlock";
+    [DataField("blockingToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string BlockingToggleAction = "ActionToggleBlock";
 
-    [DataField("blockingToggleAction")]
-    public InstantAction? BlockingToggleAction;
+    [DataField("blockingToggleActionEntity")]
+    public EntityUid? BlockingToggleActionEntity;
 
     /// <summary>
     /// The sound to be played when you get hit while actively blocking
index 9acbc0cfc568198eb5fb115cc27531fc728b081d..5a7c40f3d1084d235db3c55bd9e83a74f84962b4 100644 (file)
@@ -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!;
 }
index 639212dd4d94f7f111780bd8811e2bcc47576cbe..028537f8b2b36b73f9ff21e98015313ae20a3fa6 100644 (file)
@@ -1,4 +1,6 @@
 
+using Content.Shared.Actions;
+
 namespace Content.Shared.Clothing;
 
 /// <summary>
@@ -55,3 +57,5 @@ public sealed class EquipmentVisualsUpdatedEvent : EntityEventArgs
         RevealedLayers = revealedLayers;
     }
 }
+
+public sealed partial class ToggleMaskEvent : InstantActionEvent { }
index 2571d89b1fe030da114f8711fbe7e799ee9162fc..fe84fbe76c72c48da16c5314f575fd59e0582ad0 100644 (file)
@@ -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<EntityPrototype>))]
+    public string ToggleAction = "ActionTogglePhaseCloak";
+
     /// <summary>
     /// The action for enabling and disabling stealth.
     /// </summary>
-    [DataField("toggleAction")]
-    public InstantAction ToggleAction = new()
-    {
-        Event = new ToggleStealthEvent()
-    };
+    [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity;
 }
 
 /// <summary>
index 74c5d7a6baedae960e95fb29eb21d55442e7bddd..b87cd3fee5d8db493b58ced586a9ee6a1637476a 100644 (file)
@@ -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
     /// <summary>
     ///     Action used to toggle the clothing on or off.
     /// </summary>
-    [DataField("actionId", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-    public string ActionId = "ToggleSuitPiece";
-    public InstantAction? ToggleAction = null;
+    [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string Action = "ActionToggleSuitPiece";
+
+    [DataField("actionEntity")]
+    public EntityUid? ActionEntity;
 
     /// <summary>
     ///     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);
 
     /// <summary>
-    ///     Text shown in the toggle-clothing verb. Defaults to using the name of the <see cref="ToggleAction"/> action.
+    ///     Text shown in the toggle-clothing verb. Defaults to using the name of the <see cref="ActionEntity"/> action.
     /// </summary>
     [DataField("verbText")]
     public string? VerbText;
index dc8de4385b3513df9cca0cd329048e45fddfb96c..2fbaa6ea20b8ff12c4c72abab1ec065b8b764156 100644 (file)
@@ -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);
     }
 
     /// <summary>
index 9201cf07970c71fc6792c03d95f4259799c2fe25..06ef6728fae592d98fb60698771f377d4b242cc9 100644 (file)
@@ -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);
         }
     }
 }
index f9980c8014517ccd44f6173590817bb39a115b3b..f90a5576c5f517d9eb5fa7aa3a65ea4342f3e49a 100644 (file)
@@ -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<EntityPrototype>), required: true)]
+    public string? ToggleAction;
+
+    [DataField("toggleActionEntity")]
+    public EntityUid? ToggleActionEntity;
 
     [DataField("on"), AutoNetworkedField]
     public bool On;
index 9a470f45b33b2f33e0625cd2e2f57fe15dd23301..69b784999288a1161ab98128367d2cf8b7f01886 100644 (file)
@@ -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);
     }
 }
 
index 511a37a9801db70dc623a20b4ea3eea7c1240785..12d1cf264a1daf2b1a7d279a08c8d19ac4809795 100644 (file)
@@ -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<InstantActionPrototype>))]
-        public string CombatToggleActionId = "CombatModeToggle";
+        [DataField("combatToggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+        public string CombatToggleAction = "ActionCombatModeToggle";
 
-        [DataField("combatToggleAction")]
-        public InstantAction? CombatToggleAction;
+        [DataField("combatToggleActionEntity")]
+        public EntityUid? CombatToggleActionEntity;
 
         [ViewVariables(VVAccess.ReadWrite), DataField("isInCombatMode"), AutoNetworkedField]
         public bool IsInCombatMode;
index e8807d4bbccbe22faa92688f68cc788d598ba309..c52605e09f9ef8ed9f9cc955a65a2765b7de81f3 100644 (file)
@@ -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);
     }
 }
index 53e65d031be308801aa46f087aaa10a7875b90a4..5b208a08f9720d5e97263b53b56f2b3a2201b992 100644 (file)
@@ -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<CombatModeComponent, ComponentStartup>(OnStartup);
+        SubscribeLocalEvent<CombatModeComponent, MapInitEvent>(OnStartup);
         SubscribeLocalEvent<CombatModeComponent, ComponentShutdown>(OnShutdown);
         SubscribeLocalEvent<CombatModeComponent, ToggleCombatActionEvent>(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,
index 7dd1ec906597a7cc7bf4c3dce350001bd20a9997..e2f4eafad9e08772448548d62178d5800d0b8cb9 100644 (file)
@@ -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 (file)
index 0000000..3991cd3
--- /dev/null
@@ -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<DecalPrototype>), 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;
+}
index ccba438a173b03bb592ac52acde187730a9b4760..fbeec28ca579f393ad938bf51fb2344f7ed6a1da 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? DevourAction = "ActionDevour";
+
+    [DataField("devourActionEntity")]
+    public EntityUid? DevourActionEntity;
 
     [ViewVariables(VVAccess.ReadWrite), DataField("soundDevour")]
     public SoundSpecifier? SoundDevour = new SoundPathSpecifier("/Audio/Effects/demon_consume.ogg")
index 4ced63497528d29639ee6bf549a1ee7579bf211f..5ac052d3a4647eb40223b114b6c0dfb2bb8671ed 100644 (file)
@@ -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<DevourerComponent, ComponentStartup>(OnStartup);
+        SubscribeLocalEvent<DevourerComponent, MapInitEvent>(OnMapInit);
         SubscribeLocalEvent<DevourerComponent, DevourActionEvent>(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<Container>(uid, "stomach");
 
-        if (component.DevourAction != null)
-            _actionsSystem.AddAction(uid, component.DevourAction, null);
+        _actionsSystem.AddAction(uid, ref component.DevourActionEntity, component.DevourAction);
     }
 
     /// <summary>
diff --git a/Content.Shared/Dragon/DragonEvents.cs b/Content.Shared/Dragon/DragonEvents.cs
new file mode 100644 (file)
index 0000000..e3db9c3
--- /dev/null
@@ -0,0 +1,11 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Dragon;
+
+public sealed partial class DragonDevourActionEvent : EntityTargetActionEvent
+{
+}
+
+public sealed partial class DragonSpawnRiftActionEvent : InstantActionEvent
+{
+}
index b45bdb2cf3cdc49fba59a210c24c87bdba02ea70..8aea2c0833e5f1849f98da3401abbd1d400d3a91 100644 (file)
@@ -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(),
-    };
-
-    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(),
-    };
-
-    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("toggleLightingAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string ToggleLightingAction = "ActionToggleLighting";
+
+    [DataField("toggleLightingActionEntity")]
+    public EntityUid? ToggleLightingActionEntity;
+
+    [DataField("toggleFovAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string ToggleFoVAction = "ActionToggleFov";
+
+    [DataField("toggleFovActionEntity")]
+    public EntityUid? ToggleFoVActionEntity;
+
+    [DataField("toggleGhostsAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    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<EntityPrototype>))]
+    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 (file)
index 0000000..1532898
--- /dev/null
@@ -0,0 +1,7 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Guardian;
+
+public sealed partial class GuardianToggleActionEvent : InstantActionEvent
+{
+}
index 2a41273512254f6a3db16c447a86b11bf9c27015..2f98093525a24e965e406ff42b5f6c0194633c8e 100644 (file)
@@ -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<InstantActionPrototype>(component.ImplantAction));
+            var action = Spawn(component.ImplantAction);
             _actionsSystem.AddAction(component.ImplantedEntity.Value, action, uid);
         }
 
index 8edf55856643de18e506412716f18c39057b6f1d..9e3cad7552ca3ab023dd9e61daf9820d38b25585 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string ToggleActionId = "ToggleLight";
+    [DataField("toggleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string ToggleAction = "ActionToggleLight";
 
     /// <summary>
     /// 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;
 
index 4011f6937bc3182466f11854f0daff4cf7abfda7..e2146abe2f813ac9e05223f50eb299de51b04980 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? ToggleAction = "ActionToggleLight";
+
+    [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity;
 
     /// <summary>
     ///  <see cref="ColorPalettePrototype"/> ID that determines the list
index 88fd07ba2015bd1a2abaed1f94e815ecf7347a84..ad209c95f8e06f8306960cf7d177211734749577 100644 (file)
@@ -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);
     }
similarity index 90%
rename from Content.Server/Magic/Events/ChangeComponentsSpellEvent.cs
rename to Content.Shared/Magic/Events/ChangeComponentSpellEvent.cs
index df8c25f8016fb843ebc0e32512fede5e5f1a20c5..61e75c8b1aa454458b38443d6c8802dd2b4b79ab 100644 (file)
@@ -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;
 
 /// <summary>
 ///     Spell that uses the magic of ECS to add & remove components. Components are first removed, then added.
similarity index 64%
rename from Content.Server/Magic/Events/InstantSpawnSpellEvent.cs
rename to Content.Shared/Magic/Events/InstantSpawnSpellEvent.cs
index f475c33648e85e3d5708422fc9eae2ab6c17c553..ef8d6898623084208b4d762dcf5cdd433b640ece 100644 (file)
@@ -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
     /// </summary>
     [DataField("posData")] public MagicSpawnData Pos = new TargetCasterPos();
 }
-
-[ImplicitDataDefinitionForInheritors]
-public abstract partial class MagicSpawnData
-{
-
-}
-
-/// <summary>
-/// Spawns 1 at the caster's feet.
-/// </summary>
-public sealed partial class TargetCasterPos : MagicSpawnData {}
-
-/// <summary>
-/// Targets the 3 tiles in front of the caster.
-/// </summary>
-public sealed partial class TargetInFront : MagicSpawnData
-{
-    [DataField("width")]
-    public int Width = 3;
-}
similarity index 94%
rename from Content.Server/Magic/Events/KnockSpellEvent.cs
rename to Content.Shared/Magic/Events/KnockSpellEvent.cs
index 3e8897f129d622e84816ea92df2b2d61c7d3748a..a3b0be55759bea2ded654a1d96129a491deaa09d 100644 (file)
@@ -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
 {
similarity index 88%
rename from Content.Server/Magic/Events/ProjectileSpellEvent.cs
rename to Content.Shared/Magic/Events/ProjectileSpellEvent.cs
index 95a27afe5dcde02bdbc25bbca73d1fb5bfa7e5b9..44966257699dcb7e7cf770e985b9d787571b7726 100644 (file)
@@ -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
 {
similarity index 91%
rename from Content.Server/Magic/Events/SmiteSpellEvent.cs
rename to Content.Shared/Magic/Events/SmiteSpellEvent.cs
index 0311546c4b084105fad194ab21ee605bdc59e3a9..08ec63c05e778c46b93ad6257d35c204b3686e14 100644 (file)
@@ -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
 {
similarity index 92%
rename from Content.Server/Magic/Events/TeleportSpellEvent.cs
rename to Content.Shared/Magic/Events/TeleportSpellEvent.cs
index 50273e742deae9523c10b4f1f80c917deeb19ef4..b24f6ec72f75552b6c7fc6ac0ce41118caaa163b 100644 (file)
@@ -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
 {
similarity index 95%
rename from Content.Server/Magic/Events/WorldSpawnSpellEvent.cs
rename to Content.Shared/Magic/Events/WorldSpawnSpellEvent.cs
index 4130eeaa776972bb9651ba59ca74c75157f80720..4355cab8421944f98a1997f13d231979a5693204 100644 (file)
@@ -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; }
 }
-
similarity index 82%
rename from Content.Server/Magic/Events/ISpeakSpell.cs
rename to Content.Shared/Magic/ISpeakSpell.cs
index d7c7dbe250bb457aa1e7b756f0f9e5ad32c2c466..954b99417fc04bdb021568e03f741e6449c297b7 100644 (file)
@@ -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
     /// </summary>
     public string? Speech { get; }
 }
-
diff --git a/Content.Shared/Magic/MagicSpawnData.cs b/Content.Shared/Magic/MagicSpawnData.cs
new file mode 100644 (file)
index 0000000..cd96d4a
--- /dev/null
@@ -0,0 +1,20 @@
+namespace Content.Shared.Magic;
+
+[ImplicitDataDefinitionForInheritors]
+public abstract partial class MagicSpawnData
+{
+
+}
+
+/// <summary>
+/// Spawns 1 at the caster's feet.
+/// </summary>
+public sealed partial class TargetCasterPos : MagicSpawnData {}
+
+/// <summary>
+/// Targets the 3 tiles in front of the caster.
+/// </summary>
+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 (file)
index 0000000..9e5e267
--- /dev/null
@@ -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;
+}
index aa437786c0cc8986d94f52ab1260d12354f72d26..54cb1ea06e7725ab21b9e1ae29af3cb93877f30e 100644 (file)
@@ -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<string> StartingEquipment = new();
 
     #region Action Prototypes
-    [DataField("mechCycleAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-    public string MechCycleAction = "MechCycleEquipment";
-    [DataField("mechUiAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-    public string MechUiAction = "MechOpenUI";
-    [DataField("mechEjectAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-    public string MechEjectAction = "MechEject";
+    [DataField("mechCycleAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string MechCycleAction = "ActionMechCycleEquipment";
+    [DataField("mechUiAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string MechUiAction = "ActionMechOpenUI";
+    [DataField("mechEjectAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string MechEjectAction = "ActionMechEject";
     #endregion
 
     #region Visualizer States
index 4c5326c523727ee964dcfb4e6c8fa927420d1246..76c3be24bb10b7b532ef9ec4764405b9bf96a279 100644 (file)
@@ -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<InstantActionPrototype>(component.MechCycleAction)), mech);
-        _actions.AddAction(pilot, new InstantAction(_prototype.Index<InstantActionPrototype>(component.MechUiAction)),
+        _actions.AddAction(pilot, Spawn(component.MechCycleAction), mech);
+        _actions.AddAction(pilot, Spawn(component.MechUiAction),
             mech);
-        _actions.AddAction(pilot,
-            new InstantAction(_prototype.Index<InstantActionPrototype>(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 (file)
index 0000000..11ac8a2
--- /dev/null
@@ -0,0 +1,7 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Medical.Stethoscope;
+
+public sealed partial class StethoscopeActionEvent : EntityTargetActionEvent
+{
+}
index 8faea0e2480770226bf8fa7bc826349a5dd48a48..8c72ee618d87118772b20d31a561f51c5a70d20b 100644 (file)
@@ -18,9 +18,9 @@ public sealed partial class MobStateActionsComponent : Component
     /// <example>
     /// actions:
     ///   Critical:
-    ///   - CritSuccumb
+    ///   - ActionCritSuccumb
     ///   Alive:
-    ///   - AnimalLayEgg
+    ///   - ActionAnimalLayEgg
     /// </example>
     [DataField("actions")]
     public Dictionary<MobState, List<string>> Actions = new();
diff --git a/Content.Shared/Mobs/CritMobActions.cs b/Content.Shared/Mobs/CritMobActions.cs
new file mode 100644 (file)
index 0000000..763915e
--- /dev/null
@@ -0,0 +1,24 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Mobs;
+
+/// <summary>
+///     Only applies to mobs in crit capable of ghosting/succumbing
+/// </summary>
+public sealed partial class CritSuccumbEvent : InstantActionEvent
+{
+}
+
+/// <summary>
+///     Only applies/has functionality to mobs in crit that have <see cref="DeathgaspComponent"/>
+/// </summary>
+public sealed partial class CritFakeDeathEvent : InstantActionEvent
+{
+}
+
+/// <summary>
+///     Only applies to mobs capable of speaking, as a last resort in crit
+/// </summary>
+public sealed partial class CritLastWordsEvent : InstantActionEvent
+{
+}
index b25babfe068ed1a4e43b161dfb1ab3219cfa4c91..acb1483b52693aa9766328e06b2255d80847a74c 100644 (file)
@@ -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<InstantActionPrototype>(item, out var proto))
+                if (!_proto.TryIndex<EntityPrototype>(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
index 8a3fb8931a9531f5117ff2a828bb3b2eddda4d38..73a8267500d9e5fd7435b2ad10810272493b46ef 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? ToggleAction = "ActionToggleJetpack";
+
+    [DataField("toggleActionEntity")] public EntityUid? ToggleActionEntity;
 
     [ViewVariables(VVAccess.ReadWrite), DataField("acceleration")]
     public float Acceleration = 1f;
index 77bf97b25a100503a359fbe14850ea08a4438be6..0047de376c5e7927715e34c91bdcb539fd900f3f 100644 (file)
@@ -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)
index ec0569865ed415fdbdb92fb3df35ac45d495a3a0..9574007e7f7216a4b9a4beeb67e45d0dfd01ad3e 100644 (file)
@@ -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<EntityPrototype>))]
+        public string? MidiActionId = "ActionPAIPlayMidi";
+
+        [DataField("midiAction", serverOnly: true)] // server only, as it uses a server-BUI event !type
+        public EntityUid? MidiAction;
     }
 }
 
index a5196cee1bb7abdcd2ac14d5f197d3933879c19d..59db9dd54df8f39a76889515e416cbdef27f2ebb 100644 (file)
@@ -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<PAIComponent, ComponentStartup>(OnStartup);
+            SubscribeLocalEvent<PAIComponent, MapInitEvent>(OnMapInit);
             SubscribeLocalEvent<PAIComponent, ComponentShutdown>(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 (file)
index 0000000..bae2c3e
--- /dev/null
@@ -0,0 +1,17 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Polymorph;
+
+public sealed partial class PolymorphActionEvent : InstantActionEvent
+{
+    /// <summary>
+    /// The polymorph prototype containing all the information about
+    /// the specific polymorph.
+    /// </summary>
+    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 (file)
index 0000000..551b27a
--- /dev/null
@@ -0,0 +1,13 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.RatKing;
+
+public sealed partial class RatKingRaiseArmyActionEvent : InstantActionEvent
+{
+
+}
+
+public sealed partial class RatKingDomainActionEvent : InstantActionEvent
+{
+
+}
index 203114a4b422513a92739037c36361e19346a818..9a497d16f4d7e980e978b5e3eef9afbd22c6f32f 100644 (file)
@@ -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 { }
index 5b1f9491b744b164880cf3c9ae49d702cad150af..ee6dee3689f9b81c8cf826c8780728827812a099 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? ModuleSwapActionId = "ActionBorgSwapModule";
+
     /// <summary>
     /// The sidebar action for swapping to this module.
     /// </summary>
-    [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
index ab98a57feb5740e62486f03f609f442c069b7a33..955705ae8bc2ea9f8f7e1df4c974691e77c09539 100644 (file)
@@ -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
     /// <summary>
     /// The sidebar action that toggles the laws screen.
     /// </summary>
-    [DataField("viewLawsAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-    public string ViewLawsAction = "ViewLaws";
+    [DataField("viewLawsAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string ViewLawsAction = "ActionViewLaws";
 
     /// <summary>
     /// The action for toggling laws. Stored here so we can remove it later.
     /// </summary>
-    [DataField("providedAction")]
-    public InstantAction? ProvidedAction;
+    [DataField("viewLawsActionEntity")]
+    public EntityUid? ViewLawsActionEntity;
 
     /// <summary>
     /// The last entity that provided laws to this entity.
index 8dfc2b971f58f5266152f81053ebebbde93fc0e8..ca8c7a073b6fd1bdb0a36a5790be5ce082897d42 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? ConfigureAction = "ActionConfigureMeleeSpeech";
+
     /// <summary>
     /// The action to open the battlecry UI
     /// </summary>
-    [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;
 }
 
 /// <summary>
diff --git a/Content.Shared/Speech/ScreamActionEvent.cs b/Content.Shared/Speech/ScreamActionEvent.cs
new file mode 100644 (file)
index 0000000..756f65a
--- /dev/null
@@ -0,0 +1,7 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.Speech;
+
+public sealed partial class ScreamActionEvent : InstantActionEvent
+{
+}
index b64f980c34c5b03ceefc40ffb8a2eb9d66f092c8..7871e55e57492c7782a3d620aca35b4cb05ef149 100644 (file)
@@ -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<SpiderComponent, MapInitEvent>(OnSpiderMapInit);
         SubscribeLocalEvent<SpiderWebObjectComponent, ComponentStartup>(OnWebStartup);
-        SubscribeLocalEvent<SpiderComponent, ComponentStartup>(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<InstantActionPrototype>(component.WebActionName));
-        _action.AddAction(uid, netAction, null);
+        _action.AddAction(uid, Spawn(component.WebAction), null);
     }
 
     private void OnWebStartup(EntityUid uid, SpiderWebObjectComponent component, ComponentStartup args)
index 90f19f97a67be3c1fb2f837f821232fc760c56a9..8d1a4772e271e888fd78ce3de2721e7e94df9d94 100644 (file)
@@ -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<InstantActionPrototype>))]
-    public string WebActionName = "SpiderWebAction";
+    [DataField("webAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+    public string WebAction = "ActionSpiderWeb";
 }
 
 public sealed partial class SpiderWebActionEvent : InstantActionEvent { }
index 7f678f6c49c51350b5bf512ad2e9f120c10171cc..e695c30e5cd80cbc602fd096a74c0ac5a243145e 100644 (file)
@@ -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<ListingData>, ICloneable
     /// <summary>
     /// The action that is given when the listing is purchased.
     /// </summary>
-    [DataField("productAction", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
+    [DataField("productAction", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
     public string? ProductAction;
 
     /// <summary>
similarity index 89%
rename from Content.Server/UserInterface/OpenUiActionEvent.cs
rename to Content.Shared/UserInterface/OpenUiActionEvent.cs
index 4f89cb35d933e8e71315bca29e1605f67f1a1df3..3053861ea15be1d1d0fa2eaf982a0e47a320e8d0 100644 (file)
@@ -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 (file)
index 0000000..5050aca
--- /dev/null
@@ -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; }
+}
index 3868b8977f0288dd94d06fd9c51a1e64621dec5f..2874a0d2d1c29993df37ae9ed32f37d1a6e3f99c 100644 (file)
@@ -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<EntityPrototype>))]
+    public string? HornAction;
+
     /// <summary>
     /// The action for the horn (if any)
     /// </summary>
-    [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;
 
     /// <summary>
     /// Whether the vehicle has a key currently inside it or not.
index b18e66a1eeaa609149b8eb800c8338cbe24a3f81..9ba22d644a4b6ece2d1df3fd5ecb65a231253348 100644 (file)
@@ -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<ActionsComponent>(args.BuckledEntity, out var actions) && TryComp<UnpoweredFlashlightComponent>(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);
index 94ca115ccf51457d9b3e989b7b09c3bb15db0288..7d474feca9b7e4cf24117299c7284a8850f3209f 100644 (file)
@@ -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
     {
         /// <summary>
@@ -105,8 +105,13 @@ namespace Content.Shared.VendingMachines
         /// <summary>
         ///     The action available to the player controlling the vending machine
         /// </summary>
-        [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<InstantActionPrototype>))]
-        public string? Action = "VendingThrow";
+        [DataField("action", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
+        [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 (file)
index 0000000..8e1adb1
--- /dev/null
@@ -0,0 +1,8 @@
+using Content.Shared.Actions;
+
+namespace Content.Shared.VoiceMask;
+
+public sealed partial class VoiceMaskSetNameEvent : InstantActionEvent
+{
+}
+
index 6577137ce7cff7704b126149a9aad5dc2f900f9b..fd61fd70e64ef00d48b25aa3e7ec82f23e4a245e 100644 (file)
@@ -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;
-
     /// <summary>
     /// Whether or not information about
     /// the gun will be shown on examine.
index 1e4471562ea2ba4b151399f37108bf5bfec5f86c..659bc054f6bbf6cc25fbd908dbef692a77945f6b 100644 (file)
@@ -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;
index 7f8f55fefb70b390a2832a5e5860e39478538658..72ff07193ae7f89a72b0d3f7d00ba5234e18f915 100644 (file)
@@ -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.
index d7046ef434eb0f09ba1fd34e116d74164c49b5f5..1491985feb8ac0a3fb86ba5aab69e44bd113a025 100644 (file)
@@ -1172,28 +1172,6 @@ entities:
     - pos: 3.5357494,-8.260544\r
       parent: 289\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: MaterialDiamond\r
   entities:\r
   - uid: 128\r
index 00b3663c168c5f7bca919b144100d715a7618790..43abac3409a707bf45384469bdaa985ccfae606e 100644 (file)
@@ -3434,28 +3434,6 @@ entities:
     - pos: -4.476436,15.938278\r
       parent: 670\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: Lighter\r
   entities:\r
   - uid: 52\r
index 7ed089b7160d0c843d2562b66692570efd92bdcf..52c1daefe1434fd06190d0eec873d09056fe8482 100644 (file)
-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:\r
+  format: 6\r
+  postmapinit: false\r
+tilemap:\r
+  0: Space\r
+  85: FloorSteel\r
+  97: FloorTechMaint\r
+  101: FloorWhite\r
+  113: Lattice\r
+  114: Plating\r
+entities:\r
+- proto: ""\r
+  entities:\r
+  - uid: 179\r
+    components:\r
+    - type: MetaData\r
+    - parent: 962\r
+      type: Transform\r
+    - chunks:\r
+        -1,0:\r
+          ind: -1,0\r
+          tiles: VQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        -1,-1:\r
+          ind: -1,-1\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAA\r
+          version: 6\r
+        0,1:\r
+          ind: 0,1\r
+          tiles: cQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        0,0:\r
+          ind: 0,0\r
+          tiles: cgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcQAAAAAAcgAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA\r
+          version: 6\r
+        0,-1:\r
+          ind: 0,-1\r
+          tiles: cgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAYQAAAAAAYQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAA\r
+          version: 6\r
+        1,-1:\r
+          ind: 1,-1\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA\r
+          version: 6\r
+        -2,0:\r
+          ind: -2,0\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        -2,-1:\r
+          ind: -2,-1\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAVQAAAAAA\r
+          version: 6\r
+        1,0:\r
+          ind: 1,0\r
+          tiles: ZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAVQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVQAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        2,-1:\r
+          ind: 2,-1\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        1,1:\r
+          ind: 1,1\r
+          tiles: VQAAAAAAVQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAZQAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        -1,1:\r
+          ind: -1,1\r
+          tiles: AAAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAcQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        0,-2:\r
+          ind: 0,-2\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\r
+          version: 6\r
+        -1,-2:\r
+          ind: -1,-2\r
+          tiles: AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcgAAAAAAcgAAAAAAcgAAAAAAcgAAAAAA\r
+          version: 6\r
+      type: MapGrid\r
+    - type: Broadphase\r
+    - bodyStatus: InAir\r
+      angularDamping: 0.05\r
+      linearDamping: 0.05\r
+      fixedRotation: False\r
+      bodyType: Dynamic\r
+      type: Physics\r
+    - fixtures: {}\r
+      type: Fixtures\r
+    - gravityShakeSound: !type:SoundPathSpecifier\r
+        path: /Audio/Effects/alert.ogg\r
+      type: Gravity\r
+    - chunkCollection:\r
+        version: 2\r
+        nodes: []\r
+      type: DecalGrid\r
+    - type: OccluderTree\r
+    - type: Shuttle\r
+    - type: RadiationGridResistance\r
+    - shakeTimes: 10\r
+      type: GravityShake\r
+    - version: 2\r
+      data:\r
+        tiles:\r
+          -4,0:\r
+            0: 65535\r
+          -4,1:\r
+            0: 65535\r
+          -3,0:\r
+            0: 65535\r
+          -3,1:\r
+            0: 65535\r
+          -2,0:\r
+            0: 65535\r
+          -2,1:\r
+            0: 65535\r
+          -2,2:\r
+            0: 65535\r
+          -1,0:\r
+            0: 65535\r
+          -1,1:\r
+            0: 65535\r
+          -1,2:\r
+            0: 65535\r
+          -4,-3:\r
+            0: 61440\r
+          -4,-2:\r
+            0: 65535\r
+          -4,-1:\r
+            0: 65535\r
+          -3,-3:\r
+            0: 61440\r
+          -3,-2:\r
+            0: 65535\r
+          -3,-1:\r
+            0: 65535\r
+          -2,-4:\r
+            0: 65520\r
+          -2,-3:\r
+            0: 65535\r
+          -2,-2:\r
+            0: 65535\r
+          -2,-1:\r
+            0: 65535\r
+          -1,-4:\r
+            0: 65520\r
+            1: 15\r
+          -1,-3:\r
+            0: 65535\r
+          -1,-2:\r
+            0: 65535\r
+          -1,-1:\r
+            0: 65535\r
+          0,4:\r
+            0: 61183\r
+          0,5:\r
+            0: 61166\r
+          0,6:\r
+            0: 14\r
+          1,4:\r
+            0: 65535\r
+          1,5:\r
+            0: 65535\r
+          1,6:\r
+            0: 65535\r
+          1,7:\r
+            0: 15\r
+          2,4:\r
+            0: 65535\r
+          2,5:\r
+            0: 65535\r
+          2,6:\r
+            0: 4095\r
+          3,4:\r
+            0: 65535\r
+          3,5:\r
+            0: 65487\r
+            2: 48\r
+          3,6:\r
+            0: 53247\r
+          3,7:\r
+            0: 12\r
+          0,0:\r
+            0: 65535\r
+          0,1:\r
+            0: 65535\r
+          0,2:\r
+            0: 65535\r
+          0,3:\r
+            0: 65535\r
+          1,0:\r
+            0: 65535\r
+          1,1:\r
+            0: 65535\r
+          1,2:\r
+            0: 65535\r
+          1,3:\r
+            0: 65535\r
+          2,0:\r
+            0: 4369\r
+          2,2:\r
+            0: 65535\r
+          2,3:\r
+            0: 65535\r
+          3,0:\r
+            0: 65535\r
+          3,2:\r
+            0: 65535\r
+          3,3:\r
+            0: 65535\r
+          3,1:\r
+            0: 61166\r
+          0,-4:\r
+            0: 65520\r
+            1: 7\r
+          0,-3:\r
+            0: 65535\r
+          0,-2:\r
+            0: 65535\r
+          0,-1:\r
+            0: 65535\r
+          1,-4:\r
+            0: 30576\r
+          1,-3:\r
+            0: 65399\r
+          1,-2:\r
+            0: 63359\r
+          1,-1:\r
+            0: 65535\r
+          2,-2:\r
+            0: 4096\r
+          2,-1:\r
+            0: 4369\r
+          3,-1:\r
+            0: 65262\r
+          3,-2:\r
+            0: 61152\r
+          4,-2:\r
+            0: 65520\r
+          4,-1:\r
+            0: 65535\r
+          5,-2:\r
+            0: 65520\r
+          5,-1:\r
+            0: 65535\r
+          6,-2:\r
+            0: 65520\r
+          6,-1:\r
+            0: 65535\r
+          7,-2:\r
+            0: 65520\r
+          7,-1:\r
+            0: 65535\r
+          -5,0:\r
+            0: 52428\r
+          -5,-3:\r
+            0: 32768\r
+          -5,-2:\r
+            0: 51336\r
+          -5,-1:\r
+            0: 52428\r
+          4,0:\r
+            0: 65535\r
+          4,1:\r
+            0: 65535\r
+          4,2:\r
+            0: 65535\r
+          4,3:\r
+            0: 65535\r
+          5,0:\r
+            0: 65535\r
+          5,1:\r
+            0: 65535\r
+          5,2:\r
+            0: 65535\r
+          5,3:\r
+            0: 65535\r
+          6,0:\r
+            0: 65535\r
+          6,1:\r
+            0: 65535\r
+          6,2:\r
+            0: 65535\r
+          6,3:\r
+            0: 63351\r
+          7,0:\r
+            0: 30583\r
+          7,1:\r
+            0: 4375\r
+          7,2:\r
+            0: 4369\r
+          7,3:\r
+            0: 4096\r
+          8,-2:\r
+            0: 30576\r
+          8,-1:\r
+            0: 30583\r
+          4,4:\r
+            0: 30583\r
+          4,5:\r
+            0: 30583\r
+          4,6:\r
+            0: 30583\r
+          4,7:\r
+            0: 7\r
+          -4,2:\r
+            0: 26367\r
+          -1,3:\r
+            0: 15\r
+          2,1:\r
+            0: 4369\r
+          -5,1:\r
+            0: 52428\r
+          -4,3:\r
+            0: 26222\r
+          -3,3:\r
+            0: 15\r
+          -2,3:\r
+            0: 15\r
+          -4,4:\r
+            0: 238\r
+          -3,4:\r
+            0: 255\r
+          -2,4:\r
+            0: 255\r
+          -1,4:\r
+            0: 255\r
+          -5,2:\r
+            0: 204\r
+          -3,2:\r
+            0: 35071\r
+          0,-5:\r
+            1: 28672\r
+          -1,-5:\r
+            1: 61440\r
+        uniqueMixes:\r
+        - volume: 2500\r
+          temperature: 293.15\r
+          moles:\r
+          - 21.824879\r
+          - 82.10312\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+        - volume: 2500\r
+          temperature: 293.15\r
+          moles:\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+        - volume: 2500\r
+          temperature: 293.15\r
+          moles:\r
+          - 24.8172\r
+          - 93.35994\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+          - 0\r
+        chunkSize: 4\r
+      type: GridAtmosphere\r
+    - type: GasTileOverlay\r
+    - id: Dev\r
+      type: BecomesStation\r
+    - type: SpreaderGrid\r
+    - type: GridPathfinding\r
+  - uid: 962\r
+    components:\r
+    - type: MetaData\r
+    - type: Transform\r
+    - type: Map\r
+    - type: PhysicsMap\r
+    - type: Broadphase\r
+    - type: OccluderTree\r
+    - type: LoadedMap\r
+    - type: GridTree\r
+    - type: MovedGrids\r
+- proto: AdvancedCapacitorStockPart\r
+  entities:\r
+  - uid: 700\r
+    components:\r
+    - pos: -3.8324947,8.786524\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirAlarm\r
+  entities:\r
+  - uid: 800\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - devices:\r
+      - 801\r
+      type: DeviceList\r
+- proto: AirCanister\r
+  entities:\r
+  - uid: 458\r
+    components:\r
+    - pos: 7.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Airlock\r
+  entities:\r
+  - uid: 48\r
+    components:\r
+    - pos: 7.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 119\r
+    components:\r
+    - pos: 6.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 170\r
+    components:\r
+    - pos: 13.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 378\r
+    components:\r
+    - pos: -9.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockCargo\r
+  entities:\r
+  - uid: 87\r
+    components:\r
+    - pos: 2.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockEngineering\r
+  entities:\r
+  - uid: 257\r
+    components:\r
+    - pos: -7.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 258\r
+    components:\r
+    - pos: 3.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 530\r
+    components:\r
+    - pos: -10.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 563\r
+    components:\r
+    - pos: -13.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 867\r
+    components:\r
+    - pos: -12.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockExternal\r
+  entities:\r
+  - uid: 155\r
+    components:\r
+    - pos: 26.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 203\r
+    components:\r
+    - pos: 0.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 255\r
+    components:\r
+    - pos: 7.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 256\r
+    components:\r
+    - pos: 5.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 318\r
+    components:\r
+    - pos: 24.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockExternalGlass\r
+  entities:\r
+  - uid: 216\r
+    components:\r
+    - pos: -1.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockGlassShuttle\r
+  entities:\r
+  - uid: 146\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -17.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 204\r
+    components:\r
+    - pos: -1.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockMedicalGlass\r
+  entities:\r
+  - uid: 177\r
+    components:\r
+    - pos: 26.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 178\r
+    components:\r
+    - pos: 20.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 206\r
+    components:\r
+    - pos: 16.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 207\r
+    components:\r
+    - pos: 15.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 369\r
+    components:\r
+    - pos: 26.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 370\r
+    components:\r
+    - pos: 28.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockScience\r
+  entities:\r
+  - uid: 24\r
+    components:\r
+    - pos: 14.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 47\r
+    components:\r
+    - pos: 16.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 102\r
+    components:\r
+    - pos: 16.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 306\r
+    components:\r
+    - pos: 12.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockScienceGlass\r
+  entities:\r
+  - uid: 26\r
+    components:\r
+    - pos: 14.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirlockShuttle\r
+  entities:\r
+  - uid: 116\r
+    components:\r
+    - pos: 0.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AirSensor\r
+  entities:\r
+  - uid: 801\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AlwaysPoweredLightLED\r
+  entities:\r
+  - uid: 59\r
+    components:\r
+    - pos: -14.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 330\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -8.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 398\r
+    components:\r
+    - pos: 4.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 451\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -8.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 512\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -14.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 662\r
+    components:\r
+    - pos: 11.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 664\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 22.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 667\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 8.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 669\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -17.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 852\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -6.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 907\r
+    components:\r
+    - pos: -4.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 910\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -2.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 913\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 5.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 914\r
+    components:\r
+    - pos: 4.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 915\r
+    components:\r
+    - pos: 6.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 916\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 3.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 917\r
+    components:\r
+    - pos: -2.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 918\r
+    components:\r
+    - pos: 3.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 921\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -13.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 922\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 0.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 923\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -7.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 924\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 926\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -13.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 953\r
+    components:\r
+    - pos: -14.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 957\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 11.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AlwaysPoweredWallLight\r
+  entities:\r
+  - uid: 1047\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -0.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AnomalyLocator\r
+  entities:\r
+  - uid: 1086\r
+    components:\r
+    - pos: 17.237877,19.653782\r
+      parent: 179\r
+      type: Transform\r
+- proto: AnomalyScanner\r
+  entities:\r
+  - uid: 1085\r
+    components:\r
+    - pos: 17.539398,19.352007\r
+      parent: 179\r
+      type: Transform\r
+- proto: APCBasic\r
+  entities:\r
+  - uid: 753\r
+    components:\r
+    - pos: -2.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - startingCharge: 500000000\r
+      maxCharge: 500000000\r
+      type: Battery\r
+    - supplyRampRate: 50000\r
+      supplyRampTolerance: 100000\r
+      maxSupply: 1000000\r
+      maxChargeRate: 500000\r
+      type: PowerNetworkBattery\r
+  - uid: 1015\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -5.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: AtmosDeviceFanTiny\r
+  entities:\r
+  - uid: 992\r
+    components:\r
+    - pos: -1.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 993\r
+    components:\r
+    - pos: 0.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Autolathe\r
+  entities:\r
+  - uid: 1\r
+    components:\r
+    - pos: 12.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 94\r
+    components:\r
+    - pos: -4.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 446\r
+    components:\r
+    - pos: -6.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 528\r
+    components:\r
+    - pos: -12.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 531\r
+    components:\r
+    - pos: -13.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 532\r
+    components:\r
+    - pos: -14.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: BaseUplinkRadioDebug\r
+  entities:\r
+  - uid: 732\r
+    components:\r
+    - pos: 0.6038008,7.5209107\r
+      parent: 179\r
+      type: Transform\r
+- proto: Basketball\r
+  entities:\r
+  - uid: 951\r
+    components:\r
+    - pos: -9.702013,9.68404\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 952\r
+    components:\r
+    - pos: -10.879096,9.579802\r
+      parent: 179\r
+      type: Transform\r
+- proto: Beaker\r
+  entities:\r
+  - uid: 174\r
+    components:\r
+    - pos: 25.291822,10.667244\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 175\r
+    components:\r
+    - pos: 24.541822,10.635994\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 176\r
+    components:\r
+    - pos: 26.416822,10.651619\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 324\r
+    components:\r
+    - pos: 4.718221,9.39097\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 735\r
+    components:\r
+    - pos: 4.739054,9.807927\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 920\r
+    components:\r
+    - pos: -4.293744,10.966518\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 950\r
+    components:\r
+    - pos: -4.293744,10.966518\r
+      parent: 179\r
+      type: Transform\r
+- proto: BikeHorn\r
+  entities:\r
+  - uid: 672\r
+    components:\r
+    - pos: 1.1246341,7.500063\r
+      parent: 179\r
+      type: Transform\r
+- proto: BlastDoor\r
+  entities:\r
+  - uid: 202\r
+    components:\r
+    - pos: -2.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 1013\r
+      type: DeviceLinkSink\r
+  - uid: 697\r
+    components:\r
+    - pos: 1.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 1014\r
+      type: DeviceLinkSink\r
+  - uid: 698\r
+    components:\r
+    - pos: 1.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 1014\r
+      type: DeviceLinkSink\r
+  - uid: 984\r
+    components:\r
+    - pos: -2.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 1013\r
+      type: DeviceLinkSink\r
+- proto: BoozeDispenser\r
+  entities:\r
+  - uid: 752\r
+    components:\r
+    - pos: 7.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: BoxBeaker\r
+  entities:\r
+  - uid: 280\r
+    components:\r
+    - pos: 5.163024,9.63072\r
+      parent: 179\r
+      type: Transform\r
+- proto: Brutepack\r
+  entities:\r
+  - uid: 150\r
+    components:\r
+    - pos: 18.601385,5.512907\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 151\r
+    components:\r
+    - pos: 18.476385,4.841032\r
+      parent: 179\r
+      type: Transform\r
+- proto: Bucket\r
+  entities:\r
+  - uid: 691\r
+    components:\r
+    - pos: 7.1447573,15.900927\r
+      parent: 179\r
+      type: Transform\r
+- proto: CableApcExtension\r
+  entities:\r
+  - uid: 15\r
+    components:\r
+    - pos: 5.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 23\r
+    components:\r
+    - pos: 3.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 58\r
+    components:\r
+    - pos: 8.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 90\r
+    components:\r
+    - pos: 4.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 281\r
+    components:\r
+    - pos: -13.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 389\r
+    components:\r
+    - pos: 7.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 453\r
+    components:\r
+    - pos: 6.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 736\r
+    components:\r
+    - pos: -2.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 760\r
+    components:\r
+    - pos: -2.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 761\r
+    components:\r
+    - pos: -15.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 763\r
+    components:\r
+    - pos: -2.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 764\r
+    components:\r
+    - pos: -1.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 765\r
+    components:\r
+    - pos: -7.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 766\r
+    components:\r
+    - pos: -0.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 767\r
+    components:\r
+    - pos: -3.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 768\r
+    components:\r
+    - pos: -4.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 769\r
+    components:\r
+    - pos: -5.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 770\r
+    components:\r
+    - pos: -6.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 771\r
+    components:\r
+    - pos: -2.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 772\r
+    components:\r
+    - pos: -2.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 773\r
+    components:\r
+    - pos: -2.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 774\r
+    components:\r
+    - pos: -2.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 775\r
+    components:\r
+    - pos: -3.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 776\r
+    components:\r
+    - pos: -4.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 777\r
+    components:\r
+    - pos: -5.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 778\r
+    components:\r
+    - pos: -6.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 779\r
+    components:\r
+    - pos: -6.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 780\r
+    components:\r
+    - pos: -7.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 781\r
+    components:\r
+    - pos: -8.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 782\r
+    components:\r
+    - pos: -9.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 783\r
+    components:\r
+    - pos: -10.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 784\r
+    components:\r
+    - pos: -11.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 785\r
+    components:\r
+    - pos: -12.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 786\r
+    components:\r
+    - pos: -12.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 787\r
+    components:\r
+    - pos: -12.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 788\r
+    components:\r
+    - pos: -12.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 789\r
+    components:\r
+    - pos: -12.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 790\r
+    components:\r
+    - pos: -12.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 791\r
+    components:\r
+    - pos: -2.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 792\r
+    components:\r
+    - pos: -2.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 793\r
+    components:\r
+    - pos: -2.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 794\r
+    components:\r
+    - pos: -2.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 795\r
+    components:\r
+    - pos: -2.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 796\r
+    components:\r
+    - pos: -2.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 797\r
+    components:\r
+    - pos: -2.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 798\r
+    components:\r
+    - pos: -2.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 799\r
+    components:\r
+    - pos: -2.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 802\r
+    components:\r
+    - pos: -8.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 803\r
+    components:\r
+    - pos: 2.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 804\r
+    components:\r
+    - pos: 2.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 805\r
+    components:\r
+    - pos: -9.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 806\r
+    components:\r
+    - pos: -10.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 807\r
+    components:\r
+    - pos: -14.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 808\r
+    components:\r
+    - pos: -11.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 809\r
+    components:\r
+    - pos: -15.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 810\r
+    components:\r
+    - pos: -15.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 811\r
+    components:\r
+    - pos: -16.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 812\r
+    components:\r
+    - pos: -16.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 813\r
+    components:\r
+    - pos: -16.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 814\r
+    components:\r
+    - pos: -16.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 815\r
+    components:\r
+    - pos: -16.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 816\r
+    components:\r
+    - pos: -16.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 817\r
+    components:\r
+    - pos: 7.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 818\r
+    components:\r
+    - pos: 7.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 819\r
+    components:\r
+    - pos: 7.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 820\r
+    components:\r
+    - pos: 7.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 821\r
+    components:\r
+    - pos: 8.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 822\r
+    components:\r
+    - pos: 6.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 823\r
+    components:\r
+    - pos: 5.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 824\r
+    components:\r
+    - pos: 4.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 825\r
+    components:\r
+    - pos: 8.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 826\r
+    components:\r
+    - pos: 8.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 827\r
+    components:\r
+    - pos: 8.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 828\r
+    components:\r
+    - pos: 7.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 829\r
+    components:\r
+    - pos: 7.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 830\r
+    components:\r
+    - pos: 2.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 831\r
+    components:\r
+    - pos: 2.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 832\r
+    components:\r
+    - pos: 1.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 833\r
+    components:\r
+    - pos: 0.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 834\r
+    components:\r
+    - pos: -0.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 835\r
+    components:\r
+    - pos: -1.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 836\r
+    components:\r
+    - pos: -2.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 837\r
+    components:\r
+    - pos: -3.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 838\r
+    components:\r
+    - pos: -4.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 839\r
+    components:\r
+    - pos: 1.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 840\r
+    components:\r
+    - pos: 2.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 841\r
+    components:\r
+    - pos: 0.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 842\r
+    components:\r
+    - pos: 2.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 843\r
+    components:\r
+    - pos: 2.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 844\r
+    components:\r
+    - pos: 2.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 845\r
+    components:\r
+    - pos: 2.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 853\r
+    components:\r
+    - pos: -3.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 854\r
+    components:\r
+    - pos: -4.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 855\r
+    components:\r
+    - pos: -5.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 856\r
+    components:\r
+    - pos: -6.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 857\r
+    components:\r
+    - pos: -6.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 858\r
+    components:\r
+    - pos: -6.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 859\r
+    components:\r
+    - pos: -6.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 860\r
+    components:\r
+    - pos: -6.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 861\r
+    components:\r
+    - pos: -6.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 862\r
+    components:\r
+    - pos: -6.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 872\r
+    components:\r
+    - pos: 7.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 877\r
+    components:\r
+    - pos: -6.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 878\r
+    components:\r
+    - pos: -2.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 879\r
+    components:\r
+    - pos: -1.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 880\r
+    components:\r
+    - pos: -0.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 881\r
+    components:\r
+    - pos: 0.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 882\r
+    components:\r
+    - pos: 1.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 883\r
+    components:\r
+    - pos: 2.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 884\r
+    components:\r
+    - pos: 3.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 885\r
+    components:\r
+    - pos: 4.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 886\r
+    components:\r
+    - pos: 5.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 887\r
+    components:\r
+    - pos: 6.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 888\r
+    components:\r
+    - pos: 7.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 889\r
+    components:\r
+    - pos: 8.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 890\r
+    components:\r
+    - pos: 8.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 891\r
+    components:\r
+    - pos: 8.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 892\r
+    components:\r
+    - pos: 8.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 893\r
+    components:\r
+    - pos: 8.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 894\r
+    components:\r
+    - pos: 8.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 895\r
+    components:\r
+    - pos: 8.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 896\r
+    components:\r
+    - pos: 8.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 897\r
+    components:\r
+    - pos: 8.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 898\r
+    components:\r
+    - pos: 8.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 899\r
+    components:\r
+    - pos: 8.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 900\r
+    components:\r
+    - pos: -14.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 905\r
+    components:\r
+    - pos: -12.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 906\r
+    components:\r
+    - pos: -14.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 908\r
+    components:\r
+    - pos: -15.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 970\r
+    components:\r
+    - pos: 9.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 971\r
+    components:\r
+    - pos: 10.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 972\r
+    components:\r
+    - pos: 11.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 973\r
+    components:\r
+    - pos: 12.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 974\r
+    components:\r
+    - pos: 13.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1026\r
+    components:\r
+    - pos: -5.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1027\r
+    components:\r
+    - pos: -5.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1028\r
+    components:\r
+    - pos: -5.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1029\r
+    components:\r
+    - pos: -4.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1030\r
+    components:\r
+    - pos: -3.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1031\r
+    components:\r
+    - pos: -2.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1032\r
+    components:\r
+    - pos: -1.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1033\r
+    components:\r
+    - pos: -0.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1034\r
+    components:\r
+    - pos: 0.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1035\r
+    components:\r
+    - pos: 1.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1036\r
+    components:\r
+    - pos: 2.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1037\r
+    components:\r
+    - pos: 3.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1038\r
+    components:\r
+    - pos: 0.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1039\r
+    components:\r
+    - pos: 0.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1040\r
+    components:\r
+    - pos: 0.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1041\r
+    components:\r
+    - pos: -1.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1042\r
+    components:\r
+    - pos: -1.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1043\r
+    components:\r
+    - pos: -1.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1044\r
+    components:\r
+    - pos: 4.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1045\r
+    components:\r
+    - pos: 4.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1051\r
+    components:\r
+    - pos: 9.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1052\r
+    components:\r
+    - pos: 9.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1053\r
+    components:\r
+    - pos: 9.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1054\r
+    components:\r
+    - pos: 9.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1055\r
+    components:\r
+    - pos: 9.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1056\r
+    components:\r
+    - pos: 9.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1057\r
+    components:\r
+    - pos: 10.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1058\r
+    components:\r
+    - pos: 11.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1059\r
+    components:\r
+    - pos: 12.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1060\r
+    components:\r
+    - pos: 13.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1061\r
+    components:\r
+    - pos: 14.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1062\r
+    components:\r
+    - pos: 15.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1063\r
+    components:\r
+    - pos: 16.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1064\r
+    components:\r
+    - pos: 16.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1065\r
+    components:\r
+    - pos: 16.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1066\r
+    components:\r
+    - pos: 16.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1067\r
+    components:\r
+    - pos: 16.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1068\r
+    components:\r
+    - pos: 16.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1069\r
+    components:\r
+    - pos: 16.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1070\r
+    components:\r
+    - pos: 16.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1079\r
+    components:\r
+    - pos: 15.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1080\r
+    components:\r
+    - pos: 14.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1081\r
+    components:\r
+    - pos: 13.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1082\r
+    components:\r
+    - pos: 12.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1097\r
+    components:\r
+    - pos: 8.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1098\r
+    components:\r
+    - pos: 8.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1099\r
+    components:\r
+    - pos: 9.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1100\r
+    components:\r
+    - pos: 10.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1101\r
+    components:\r
+    - pos: 11.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1102\r
+    components:\r
+    - pos: 12.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1103\r
+    components:\r
+    - pos: 13.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1104\r
+    components:\r
+    - pos: 14.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1105\r
+    components:\r
+    - pos: 15.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1106\r
+    components:\r
+    - pos: 16.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1107\r
+    components:\r
+    - pos: 17.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1108\r
+    components:\r
+    - pos: 18.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1109\r
+    components:\r
+    - pos: 19.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1110\r
+    components:\r
+    - pos: 20.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1111\r
+    components:\r
+    - pos: 21.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1112\r
+    components:\r
+    - pos: 22.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1113\r
+    components:\r
+    - pos: 23.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1114\r
+    components:\r
+    - pos: 24.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1115\r
+    components:\r
+    - pos: 25.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1116\r
+    components:\r
+    - pos: 16.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1117\r
+    components:\r
+    - pos: 16.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1118\r
+    components:\r
+    - pos: 16.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1119\r
+    components:\r
+    - pos: 16.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1120\r
+    components:\r
+    - pos: 16.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1121\r
+    components:\r
+    - pos: 16.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1122\r
+    components:\r
+    - pos: 16.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1123\r
+    components:\r
+    - pos: 16.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1124\r
+    components:\r
+    - pos: 16.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1125\r
+    components:\r
+    - pos: 16.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1126\r
+    components:\r
+    - pos: 16.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1127\r
+    components:\r
+    - pos: 16.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1128\r
+    components:\r
+    - pos: 16.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1129\r
+    components:\r
+    - pos: 16.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1130\r
+    components:\r
+    - pos: 16.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1131\r
+    components:\r
+    - pos: 16.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1132\r
+    components:\r
+    - pos: 16.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1133\r
+    components:\r
+    - pos: 17.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1134\r
+    components:\r
+    - pos: 18.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1135\r
+    components:\r
+    - pos: 19.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1136\r
+    components:\r
+    - pos: 20.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1137\r
+    components:\r
+    - pos: 21.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1138\r
+    components:\r
+    - pos: 22.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1139\r
+    components:\r
+    - pos: 23.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1140\r
+    components:\r
+    - pos: 24.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1141\r
+    components:\r
+    - pos: 25.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1142\r
+    components:\r
+    - pos: 26.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1143\r
+    components:\r
+    - pos: 27.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1144\r
+    components:\r
+    - pos: 28.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1145\r
+    components:\r
+    - pos: 17.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1146\r
+    components:\r
+    - pos: 18.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1147\r
+    components:\r
+    - pos: 19.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1148\r
+    components:\r
+    - pos: 20.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1149\r
+    components:\r
+    - pos: 21.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1150\r
+    components:\r
+    - pos: 22.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1151\r
+    components:\r
+    - pos: 23.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1152\r
+    components:\r
+    - pos: 24.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1153\r
+    components:\r
+    - pos: 25.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1154\r
+    components:\r
+    - pos: 26.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1155\r
+    components:\r
+    - pos: 27.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1156\r
+    components:\r
+    - pos: 28.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1157\r
+    components:\r
+    - pos: 26.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1158\r
+    components:\r
+    - pos: 26.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1159\r
+    components:\r
+    - pos: 26.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1160\r
+    components:\r
+    - pos: 26.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1161\r
+    components:\r
+    - pos: 26.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1162\r
+    components:\r
+    - pos: 26.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1163\r
+    components:\r
+    - pos: 26.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1164\r
+    components:\r
+    - pos: 25.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1165\r
+    components:\r
+    - pos: 24.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1166\r
+    components:\r
+    - pos: 16.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1167\r
+    components:\r
+    - pos: 16.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1168\r
+    components:\r
+    - pos: 16.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1169\r
+    components:\r
+    - pos: 16.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1170\r
+    components:\r
+    - pos: 16.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1171\r
+    components:\r
+    - pos: 16.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: CableApcStack\r
+  entities:\r
+  - uid: 70\r
+    components:\r
+    - pos: 10.577456,21.424059\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 183\r
+    components:\r
+    - pos: -6.6863613,7.351646\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 351\r
+    components:\r
+    - pos: 10.561831,21.767809\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 537\r
+    components:\r
+    - pos: -15.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 538\r
+    components:\r
+    - pos: -15.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: CableHV\r
+  entities:\r
+  - uid: 1019\r
+    components:\r
+    - pos: -6.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1020\r
+    components:\r
+    - pos: -6.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1021\r
+    components:\r
+    - pos: -6.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: CableHVStack\r
+  entities:\r
+  - uid: 184\r
+    components:\r
+    - pos: -6.665528,7.840053\r
+      parent: 179\r
+      type: Transform\r
+- proto: CableMV\r
+  entities:\r
+  - uid: 1023\r
+    components:\r
+    - pos: -6.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1024\r
+    components:\r
+    - pos: -5.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+  - uid: 1025\r
+    components:\r
+    - pos: -5.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: CableMVStack\r
+  entities:\r
+  - uid: 325\r
+    components:\r
+    - pos: -6.665528,7.5601244\r
+      parent: 179\r
+      type: Transform\r
+- proto: CableTerminal\r
+  entities:\r
+  - uid: 1022\r
+    components:\r
+    - pos: -6.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: CapacitorStockPart\r
+  entities:\r
+  - uid: 701\r
+    components:\r
+    - pos: -3.2804112,8.786524\r
+      parent: 179\r
+      type: Transform\r
+- proto: CaptainIDCard\r
+  entities:\r
+  - uid: 726\r
+    components:\r
+    - pos: 1.0820513,8.752605\r
+      parent: 179\r
+      type: Transform\r
+- proto: CaptainSabre\r
+  entities:\r
+  - uid: 381\r
+    components:\r
+    - pos: -3.277628,-2.15838\r
+      parent: 179\r
+      type: Transform\r
+- proto: Catwalk\r
+  entities:\r
+  - uid: 2\r
+    components:\r
+    - pos: 13.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 7\r
+    components:\r
+    - pos: 6.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 20\r
+    components:\r
+    - pos: 6.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 120\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 246\r
+    components:\r
+    - pos: -6.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 247\r
+    components:\r
+    - pos: -8.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 252\r
+    components:\r
+    - pos: 4.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 269\r
+    components:\r
+    - pos: 12.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 286\r
+    components:\r
+    - pos: 2.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 287\r
+    components:\r
+    - pos: -4.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 308\r
+    components:\r
+    - pos: -2.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 309\r
+    components:\r
+    - pos: 1.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 333\r
+    components:\r
+    - pos: 4.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 334\r
+    components:\r
+    - pos: -5.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 345\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 346\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 347\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 348\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 349\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 403\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 404\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 405\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 406\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 407\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 408\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 409\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 410\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 411\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 412\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 413\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 414\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 9.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 415\r
+    components:\r
+    - anchored: False\r
+      rot: -1.5707963267949 rad\r
+      pos: 8.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 438\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -9.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 442\r
+    components:\r
+    - pos: -9.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 514\r
+    components:\r
+    - pos: -10.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 541\r
+    components:\r
+    - pos: -11.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 542\r
+    components:\r
+    - pos: -9.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 695\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -8.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Chair\r
+  entities:\r
+  - uid: 580\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 581\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 582\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ChairOfficeDark\r
+  entities:\r
+  - uid: 380\r
+    components:\r
+    - rot: 3.1415926535897967 rad\r
+      pos: 0.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ChairOfficeLight\r
+  entities:\r
+  - uid: 576\r
+    components:\r
+    - rot: 4.71238898038469 rad\r
+      pos: 19.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 577\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 20.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 578\r
+    components:\r
+    - rot: 4.71238898038469 rad\r
+      pos: 23.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 579\r
+    components:\r
+    - pos: 24.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: chem_master\r
+  entities:\r
+  - uid: 311\r
+    components:\r
+    - pos: 8.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ChemDispenser\r
+  entities:\r
+  - uid: 583\r
+    components:\r
+    - pos: 23.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+    - containers:\r
+        ReagentDispenser-beaker: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+        machine_board: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        machine_parts: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        beakerSlot: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+      type: ContainerContainer\r
+  - uid: 750\r
+    components:\r
+    - pos: 7.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ChemicalPayload\r
+  entities:\r
+  - uid: 432\r
+    components:\r
+    - pos: 6.4651074,9.828774\r
+      parent: 179\r
+      type: Transform\r
+- proto: ChemMasterMachineCircuitboard\r
+  entities:\r
+  - uid: 718\r
+    components:\r
+    - pos: -4.5458,10.514079\r
+      parent: 179\r
+      type: Transform\r
+- proto: CircuitImprinter\r
+  entities:\r
+  - uid: 332\r
+    components:\r
+    - pos: -6.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClosetEmergencyFilledRandom\r
+  entities:\r
+  - uid: 319\r
+    components:\r
+    - pos: 1.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 322\r
+    components:\r
+    - pos: 0.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: ClosetToolFilled\r
+  entities:\r
+  - uid: 524\r
+    components:\r
+    - pos: -11.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 525\r
+    components:\r
+    - pos: -11.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 526\r
+    components:\r
+    - pos: -11.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 527\r
+    components:\r
+    - pos: -11.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: ClothingBeltUtilityFilled\r
+  entities:\r
+  - uid: 427\r
+    components:\r
+    - pos: -1.895102,-10.33495\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 428\r
+    components:\r
+    - pos: -1.770102,-10.63182\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingHandsGlovesColorYellow\r
+  entities:\r
+  - uid: 454\r
+    components:\r
+    - pos: -0.78741443,4.322194\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingHeadHatWelding\r
+  entities:\r
+  - uid: 344\r
+    components:\r
+    - pos: 0.7198646,4.374314\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingMaskBreath\r
+  entities:\r
+  - uid: 955\r
+    components:\r
+    - pos: -10.595239,6.1907988\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingMaskGas\r
+  entities:\r
+  - uid: 425\r
+    components:\r
+    - pos: -0.2880585,-10.69432\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingOuterHardsuitAtmos\r
+  entities:\r
+  - uid: 270\r
+    components:\r
+    - pos: -10.5426235,5.472399\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingOuterVest\r
+  entities:\r
+  - uid: 426\r
+    components:\r
+    - pos: -0.9130585,-10.66307\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingShoesBootsMag\r
+  entities:\r
+  - uid: 725\r
+    components:\r
+    - pos: 0.47880077,8.073378\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClothingUniformJumpsuitEngineering\r
+  entities:\r
+  - uid: 424\r
+    components:\r
+    - pos: -0.6474335,-10.27245\r
+      parent: 179\r
+      type: Transform\r
+- proto: ClownPDA\r
+  entities:\r
+  - uid: 91\r
+    components:\r
+    - pos: -15.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 762\r
+    components:\r
+    - pos: -14.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 864\r
+    components:\r
+    - pos: -14.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 912\r
+    components:\r
+    - pos: -15.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerAnalysisConsole\r
+  entities:\r
+  - uid: 1083\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 15.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        1078:\r
+        - ArtifactAnalyzerSender: ArtifactAnalyzerReceiver\r
+      type: DeviceLinkSource\r
+- proto: ComputerCargoOrders\r
+  entities:\r
+  - uid: 326\r
+    components:\r
+    - pos: 0.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 996\r
+    components:\r
+    - pos: -1.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerCargoShuttle\r
+  entities:\r
+  - uid: 995\r
+    components:\r
+    - pos: 0.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerMedicalRecords\r
+  entities:\r
+  - uid: 152\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 22.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 591\r
+    components:\r
+    - pos: 21.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerResearchAndDevelopment\r
+  entities:\r
+  - uid: 88\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 8.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerShuttleCargo\r
+  entities:\r
+  - uid: 994\r
+    components:\r
+    - pos: -0.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ComputerTechnologyDiskTerminal\r
+  entities:\r
+  - uid: 1088\r
+    components:\r
+    - pos: 13.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ConveyorBelt\r
+  entities:\r
+  - uid: 195\r
+    components:\r
+    - pos: -2.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 699\r
+      type: DeviceLinkSink\r
+  - uid: 259\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 983\r
+      type: DeviceLinkSink\r
+  - uid: 463\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 983\r
+      type: DeviceLinkSink\r
+  - uid: 677\r
+    components:\r
+    - pos: -2.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 716\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -1.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 722\r
+      type: DeviceLinkSink\r
+  - uid: 720\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -0.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 722\r
+      type: DeviceLinkSink\r
+  - uid: 721\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 0.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 722\r
+      type: DeviceLinkSink\r
+  - uid: 985\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 983\r
+      type: DeviceLinkSink\r
+  - uid: 989\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 1.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 983\r
+      type: DeviceLinkSink\r
+  - uid: 990\r
+    components:\r
+    - pos: -2.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 699\r
+      type: DeviceLinkSink\r
+  - uid: 991\r
+    components:\r
+    - pos: -2.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 699\r
+      type: DeviceLinkSink\r
+- proto: CrateEngineeringToolbox\r
+  entities:\r
+  - uid: 692\r
+    components:\r
+    - pos: -0.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: CrateGeneric\r
+  entities:\r
+  - uid: 266\r
+    components:\r
+    - pos: 5.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: CrateHydroponicsSeeds\r
+  entities:\r
+  - uid: 754\r
+    components:\r
+    - pos: 2.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: CrateHydroponicsTools\r
+  entities:\r
+  - uid: 755\r
+    components:\r
+    - pos: 2.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: CrateMedical\r
+  entities:\r
+  - uid: 131\r
+    components:\r
+    - pos: 31.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 132\r
+    components:\r
+    - pos: 32.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: Crowbar\r
+  entities:\r
+  - uid: 147\r
+    components:\r
+    - pos: -2.172831,4.5306726\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 423\r
+    components:\r
+    - pos: -2.861032,-5.524786\r
+      parent: 179\r
+      type: Transform\r
+- proto: DebugBatteryDischarger\r
+  entities:\r
+  - uid: 711\r
+    components:\r
+    - pos: 0.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: DisposalPipe\r
+  entities:\r
+  - uid: 717\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -0.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: DisposalTrunk\r
+  entities:\r
+  - uid: 285\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 0.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 715\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -1.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: DisposalUnit\r
+  entities:\r
+  - uid: 719\r
+    components:\r
+    - pos: -1.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: DrinkBeerglass\r
+  entities:\r
+  - uid: 688\r
+    components:\r
+    - pos: 3.1981986,5.733985\r
+      parent: 179\r
+      type: Transform\r
+- proto: DrinkColaCan\r
+  entities:\r
+  - uid: 690\r
+    components:\r
+    - pos: 3.8231986,6.150942\r
+      parent: 179\r
+      type: Transform\r
+- proto: Dropper\r
+  entities:\r
+  - uid: 730\r
+    components:\r
+    - pos: 5.892191,9.4118185\r
+      parent: 179\r
+      type: Transform\r
+- proto: EmergencyOxygenTankFilled\r
+  entities:\r
+  - uid: 956\r
+    components:\r
+    - pos: -10.505015,6.711994\r
+      parent: 179\r
+      type: Transform\r
+- proto: ExGrenade\r
+  entities:\r
+  - uid: 433\r
+    components:\r
+    - pos: -3.7704864,-1.6163371\r
+      parent: 179\r
+      type: Transform\r
+- proto: ExplosivePayload\r
+  entities:\r
+  - uid: 668\r
+    components:\r
+    - pos: 6.829691,9.4118185\r
+      parent: 179\r
+      type: Transform\r
+- proto: FaxMachineCaptain\r
+  entities:\r
+  - uid: 967\r
+    components:\r
+    - pos: 9.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FaxMachineCentcom\r
+  entities:\r
+  - uid: 968\r
+    components:\r
+    - pos: 11.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FaxMachineSyndie\r
+  entities:\r
+  - uid: 969\r
+    components:\r
+    - pos: 13.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FemtoManipulatorStockPart\r
+  entities:\r
+  - uid: 712\r
+    components:\r
+    - pos: -6.7434506,8.817795\r
+      parent: 179\r
+      type: Transform\r
+- proto: FireExtinguisher\r
+  entities:\r
+  - uid: 323\r
+    components:\r
+    - pos: -1.297692,-5.396082\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 868\r
+    components:\r
+    - pos: -14.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FlashlightLantern\r
+  entities:\r
+  - uid: 421\r
+    components:\r
+    - pos: -1.934832,-5.154238\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 422\r
+    components:\r
+    - pos: 1.1350493,8.198464\r
+      parent: 179\r
+      type: Transform\r
+- proto: FloorLavaEntity\r
+  entities:\r
+  - uid: 134\r
+    components:\r
+    - pos: -13.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 135\r
+    components:\r
+    - pos: -14.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 141\r
+    components:\r
+    - pos: -13.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 469\r
+    components:\r
+    - pos: -14.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FloorWaterEntity\r
+  entities:\r
+  - uid: 136\r
+    components:\r
+    - pos: -12.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 137\r
+    components:\r
+    - pos: -12.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: FoodApple\r
+  entities:\r
+  - uid: 16\r
+    components:\r
+    - pos: 3.9853282,16.430082\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 849\r
+    components:\r
+    - pos: 3.7249117,16.242453\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 866\r
+    components:\r
+    - pos: 3.651995,16.55517\r
+      parent: 179\r
+      type: Transform\r
+- proto: FoodBurgerBacon\r
+  entities:\r
+  - uid: 689\r
+    components:\r
+    - pos: 3.3844857,6.0702233\r
+      parent: 179\r
+      type: Transform\r
+- proto: FoodCarrot\r
+  entities:\r
+  - uid: 850\r
+    components:\r
+    - pos: 3.6023045,15.67151\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 851\r
+    components:\r
+    - pos: 3.620745,15.015423\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 863\r
+    components:\r
+    - pos: 3.620745,14.389988\r
+      parent: 179\r
+      type: Transform\r
+- proto: FoodPizzaPineapple\r
+  entities:\r
+  - uid: 687\r
+    components:\r
+    - pos: 3.5215416,6.799056\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasAnalyzer\r
+  entities:\r
+  - uid: 876\r
+    components:\r
+    - pos: 4.4732866,-0.48882532\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasFilter\r
+  entities:\r
+  - uid: 480\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 3.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasMixer\r
+  entities:\r
+  - uid: 747\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 3.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasOutletInjector\r
+  entities:\r
+  - uid: 429\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasPipeBend\r
+  entities:\r
+  - uid: 727\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 5.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: GasPipeFourway\r
+  entities:\r
+  - uid: 728\r
+    components:\r
+    - pos: 5.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: GasPipeStraight\r
+  entities:\r
+  - uid: 749\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 5.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: GasPipeTJunction\r
+  entities:\r
+  - uid: 748\r
+    components:\r
+    - pos: 5.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: True\r
+      type: AmbientSound\r
+- proto: GasPort\r
+  entities:\r
+  - uid: 457\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasPressurePump\r
+  entities:\r
+  - uid: 171\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 4.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasValve\r
+  entities:\r
+  - uid: 168\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 4.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GasVentPump\r
+  entities:\r
+  - uid: 729\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: False\r
+      type: AmbientSound\r
+- proto: GasVentScrubber\r
+  entities:\r
+  - uid: 452\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: False\r
+      type: AmbientSound\r
+- proto: GasVolumePump\r
+  entities:\r
+  - uid: 160\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 4.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: GeigerCounter\r
+  entities:\r
+  - uid: 759\r
+    components:\r
+    - pos: 1.760596,4.5697265\r
+      parent: 179\r
+      type: Transform\r
+- proto: GravityGenerator\r
+  entities:\r
+  - uid: 744\r
+    components:\r
+    - pos: 6.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Grille\r
+  entities:\r
+  - uid: 108\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 986\r
+    components:\r
+    - pos: -0.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 987\r
+    components:\r
+    - pos: -0.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 988\r
+    components:\r
+    - pos: -0.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1007\r
+    components:\r
+    - pos: -3.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1008\r
+    components:\r
+    - pos: -3.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1009\r
+    components:\r
+    - pos: -3.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1010\r
+    components:\r
+    - pos: 2.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1011\r
+    components:\r
+    - pos: 2.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1012\r
+    components:\r
+    - pos: 2.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1089\r
+    components:\r
+    - pos: 8.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1090\r
+    components:\r
+    - pos: 9.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1091\r
+    components:\r
+    - pos: 10.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1092\r
+    components:\r
+    - pos: 10.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Handcuffs\r
+  entities:\r
+  - uid: 331\r
+    components:\r
+    - pos: -3.5805476,0.74100244\r
+      parent: 179\r
+      type: Transform\r
+- proto: HandheldHealthAnalyzer\r
+  entities:\r
+  - uid: 513\r
+    components:\r
+    - pos: -5.9808183,-3.6614444\r
+      parent: 179\r
+      type: Transform\r
+- proto: HoloFan\r
+  entities:\r
+  - uid: 142\r
+    components:\r
+    - pos: -8.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+    missingComponents:\r
+    - TimedDespawn\r
+  - uid: 901\r
+    components:\r
+    - pos: -10.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+    missingComponents:\r
+    - TimedDespawn\r
+  - uid: 902\r
+    components:\r
+    - pos: -9.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+    missingComponents:\r
+    - TimedDespawn\r
+- proto: HolosignWetFloor\r
+  entities:\r
+  - uid: 848\r
+    components:\r
+    - pos: -13.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+    - fixtures: {}\r
+      type: Fixtures\r
+    missingComponents:\r
+    - TimedDespawn\r
+  - uid: 911\r
+    components:\r
+    - pos: -13.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - fixtures: {}\r
+      type: Fixtures\r
+    missingComponents:\r
+    - TimedDespawn\r
+- proto: hydroponicsTray\r
+  entities:\r
+  - uid: 756\r
+    components:\r
+    - pos: 2.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 757\r
+    components:\r
+    - pos: 2.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: KitchenReagentGrinder\r
+  entities:\r
+  - uid: 731\r
+    components:\r
+    - pos: 8.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: LargeBeaker\r
+  entities:\r
+  - uid: 210\r
+    components:\r
+    - pos: 4.3272614,9.338851\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 253\r
+    components:\r
+    - pos: 23.494947,7.0422435\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 402\r
+    components:\r
+    - pos: 23.510572,7.7141185\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 737\r
+    components:\r
+    - pos: 4.2969,9.828774\r
+      parent: 179\r
+      type: Transform\r
+- proto: LedLightTube\r
+  entities:\r
+  - uid: 481\r
+    components:\r
+    - pos: -3.511025,-10.35149\r
+      parent: 179\r
+      type: Transform\r
+- proto: LockerBotanistFilled\r
+  entities:\r
+  - uid: 869\r
+    components:\r
+    - pos: 2.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerChemistry\r
+  entities:\r
+  - uid: 127\r
+    components:\r
+    - pos: 27.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerChemistryFilled\r
+  entities:\r
+  - uid: 297\r
+    components:\r
+    - pos: 7.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerChiefEngineerFilled\r
+  entities:\r
+  - uid: 447\r
+    components:\r
+    - pos: 7.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerElectricalSuppliesFilled\r
+  entities:\r
+  - uid: 444\r
+    components:\r
+    - pos: 7.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerEngineerFilled\r
+  entities:\r
+  - uid: 490\r
+    components:\r
+    - pos: 7.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerMedical\r
+  entities:\r
+  - uid: 128\r
+    components:\r
+    - pos: 27.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 129\r
+    components:\r
+    - pos: 29.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+  - uid: 130\r
+    components:\r
+    - pos: 30.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerMedicalFilled\r
+  entities:\r
+  - uid: 865\r
+    components:\r
+    - pos: -6.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerMedicineFilled\r
+  entities:\r
+  - uid: 562\r
+    components:\r
+    - pos: -5.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerSalvageSpecialistFilled\r
+  entities:\r
+  - uid: 493\r
+    components:\r
+    - pos: -10.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+    - locked: False\r
+      type: Lock\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerSyndicatePersonalFilled\r
+  entities:\r
+  - uid: 909\r
+    components:\r
+    - pos: -7.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerWardenFilled\r
+  entities:\r
+  - uid: 873\r
+    components:\r
+    - pos: -8.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: LockerWeldingSuppliesFilled\r
+  entities:\r
+  - uid: 871\r
+    components:\r
+    - pos: 7.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - air:\r
+        volume: 200\r
+        immutable: False\r
+        temperature: 293.14957\r
+        moles:\r
+        - 2.9923203\r
+        - 11.2568245\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+        - 0\r
+      type: EntityStorage\r
+- proto: MachineAnomalyGenerator\r
+  entities:\r
+  - uid: 1071\r
+    components:\r
+    - pos: 16.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: False\r
+      type: AmbientSound\r
+- proto: MachineAnomalyVessel\r
+  entities:\r
+  - uid: 1087\r
+    components:\r
+    - pos: 15.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: MachineArtifactAnalyzer\r
+  entities:\r
+  - uid: 1078\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 12.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+    - links:\r
+      - 1083\r
+      type: DeviceLinkSink\r
+- proto: MachineFrame\r
+  entities:\r
+  - uid: 533\r
+    components:\r
+    - pos: -5.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: MedicalScanner\r
+  entities:\r
+  - uid: 592\r
+    components:\r
+    - pos: 18.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - containers:\r
+        MedicalScanner-bodyContainer: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+        machine_board: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        machine_parts: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        scanner-bodyContainer: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+      type: ContainerContainer\r
+  - uid: 593\r
+    components:\r
+    - pos: 18.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - containers:\r
+        MedicalScanner-bodyContainer: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+        machine_board: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        machine_parts: !type:Container\r
+          showEnts: False\r
+          occludes: True\r
+          ents: []\r
+        scanner-bodyContainer: !type:ContainerSlot\r
+          showEnts: False\r
+          occludes: True\r
+          ent: null\r
+      type: ContainerContainer\r
+- proto: MedkitFilled\r
+  entities:\r
+  - uid: 153\r
+    components:\r
+    - pos: 13.632214,1.5673001\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 154\r
+    components:\r
+    - pos: 13.460339,0.6141751\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 321\r
+    components:\r
+    - pos: 3.8440318,4.425983\r
+      parent: 179\r
+      type: Transform\r
+- proto: MicroManipulatorStockPart\r
+  entities:\r
+  - uid: 484\r
+    components:\r
+    - pos: -5.5039105,8.838643\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 959\r
+    components:\r
+    - pos: -4.752078,10.904018\r
+      parent: 179\r
+      type: Transform\r
+- proto: ModularGrenade\r
+  entities:\r
+  - uid: 435\r
+    components:\r
+    - pos: 6.829691,9.860046\r
+      parent: 179\r
+      type: Transform\r
+- proto: MopBucket\r
+  entities:\r
+  - uid: 696\r
+    components:\r
+    - pos: 7.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: MopItem\r
+  entities:\r
+  - uid: 328\r
+    components:\r
+    - pos: 7.6382103,16.08618\r
+      parent: 179\r
+      type: Transform\r
+    - solutions:\r
+        absorbed:\r
+          temperature: 293.15\r
+          canMix: False\r
+          canReact: True\r
+          maxVol: 50\r
+          reagents:\r
+          - data: null\r
+            ReagentId: Water\r
+            Quantity: 25\r
+      type: SolutionContainerManager\r
+- proto: Multitool\r
+  entities:\r
+  - uid: 307\r
+    components:\r
+    - pos: -1.249865,-10.43489\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 430\r
+    components:\r
+    - pos: -0.6298993,4.7431083\r
+      parent: 179\r
+      type: Transform\r
+    - devices:\r
+        'UID: 31739': 801\r
+      type: NetworkConfigurator\r
+- proto: NanoManipulatorStockPart\r
+  entities:\r
+  - uid: 456\r
+    components:\r
+    - pos: -5.920577,8.817795\r
+      parent: 179\r
+      type: Transform\r
+- proto: NitrogenCanister\r
+  entities:\r
+  - uid: 459\r
+    components:\r
+    - pos: 7.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Ointment\r
+  entities:\r
+  - uid: 148\r
+    components:\r
+    - pos: 18.77326,6.653532\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 149\r
+    components:\r
+    - pos: 18.49201,6.059782\r
+      parent: 179\r
+      type: Transform\r
+- proto: OxygenCanister\r
+  entities:\r
+  - uid: 340\r
+    components:\r
+    - pos: 7.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PaperBin10\r
+  entities:\r
+  - uid: 977\r
+    components:\r
+    - pos: 10.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PartRodMetal\r
+  entities:\r
+  - uid: 133\r
+    components:\r
+    - pos: -3.4717777,7.672426\r
+      parent: 179\r
+      type: Transform\r
+- proto: Pen\r
+  entities:\r
+  - uid: 978\r
+    components:\r
+    - pos: 10.893699,12.7794075\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 979\r
+    components:\r
+    - pos: 10.862433,12.602201\r
+      parent: 179\r
+      type: Transform\r
+- proto: PicoManipulatorStockPart\r
+  entities:\r
+  - uid: 455\r
+    components:\r
+    - pos: -6.337244,8.838643\r
+      parent: 179\r
+      type: Transform\r
+- proto: PlasmaCanister\r
+  entities:\r
+  - uid: 461\r
+    components:\r
+    - pos: 7.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PlasticFlapsAirtightClear\r
+  entities:\r
+  - uid: 997\r
+    components:\r
+    - pos: -2.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 998\r
+    components:\r
+    - pos: -2.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 999\r
+    components:\r
+    - pos: 1.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1000\r
+    components:\r
+    - pos: 1.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PortableGeneratorSuperPacman\r
+  entities:\r
+  - uid: 1016\r
+    components:\r
+    - pos: -6.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PowerCellHigh\r
+  entities:\r
+  - uid: 567\r
+    components:\r
+    - pos: -4.76583,8.265328\r
+      parent: 179\r
+      type: Transform\r
+- proto: PowerCellHyper\r
+  entities:\r
+  - uid: 703\r
+    components:\r
+    - pos: -4.3179135,8.275752\r
+      parent: 179\r
+      type: Transform\r
+- proto: PowerCellMedium\r
+  entities:\r
+  - uid: 186\r
+    components:\r
+    - pos: -2.67511,-10.351\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 187\r
+    components:\r
+    - pos: -2.55011,-10.6635\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 360\r
+    components:\r
+    - pos: -3.7970803,8.275752\r
+      parent: 179\r
+      type: Transform\r
+- proto: PowerCellRecharger\r
+  entities:\r
+  - uid: 709\r
+    components:\r
+    - pos: -1.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: PowerCellSmall\r
+  entities:\r
+  - uid: 705\r
+    components:\r
+    - pos: -3.3182633,8.234056\r
+      parent: 179\r
+      type: Transform\r
+- proto: Poweredlight\r
+  entities:\r
+  - uid: 93\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 31.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 536\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -11.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 660\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 29.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 661\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 27.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 663\r
+    components:\r
+    - pos: 22.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 666\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 2.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 670\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 13.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 673\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -11.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 674\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -15.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 675\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -15.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 676\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -6.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 678\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 7.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 680\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 16.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 681\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 23.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 682\r
+    components:\r
+    - pos: 13.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 683\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 17.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 1075\r
+    components:\r
+    - pos: 16.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: False\r
+      type: AmbientSound\r
+  - uid: 1076\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 15.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+    - enabled: False\r
+      type: AmbientSound\r
+- proto: PoweredSmallLight\r
+  entities:\r
+  - uid: 163\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 166\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 11.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 167\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 17.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 388\r
+    components:\r
+    - pos: 0.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 417\r
+    components:\r
+    - pos: -4.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 483\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 4.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+  - uid: 534\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -9.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+    - powerLoad: 0\r
+      type: ApcPowerReceiver\r
+- proto: Protolathe\r
+  entities:\r
+  - uid: 12\r
+    components:\r
+    - pos: 13.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 384\r
+    components:\r
+    - pos: -6.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: QuadraticCapacitorStockPart\r
+  entities:\r
+  - uid: 704\r
+    components:\r
+    - pos: -4.8741612,8.817795\r
+      parent: 179\r
+      type: Transform\r
+- proto: Railing\r
+  entities:\r
+  - uid: 665\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -15.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 927\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 928\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 929\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 930\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 931\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 932\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 933\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 934\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -13.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 935\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -12.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 936\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -11.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 937\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -10.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 938\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -9.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 939\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -8.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 940\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -7.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 941\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -6.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 942\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -5.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 943\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -4.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 944\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -3.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 945\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -2.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 946\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -1.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 947\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -0.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 948\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 0.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: RailingCornerSmall\r
+  entities:\r
+  - uid: 919\r
+    components:\r
+    - pos: -14.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ReinforcedWindow\r
+  entities:\r
+  - uid: 1084\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 14.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1093\r
+    components:\r
+    - pos: 8.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1094\r
+    components:\r
+    - pos: 9.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1095\r
+    components:\r
+    - pos: 10.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1096\r
+    components:\r
+    - pos: 10.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ResearchAndDevelopmentServer\r
+  entities:\r
+  - uid: 17\r
+    components:\r
+    - pos: 8.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: ResearchDiskDebug\r
+  entities:\r
+  - uid: 54\r
+    components:\r
+    - pos: 9.532393,18.446417\r
+      parent: 179\r
+      type: Transform\r
+- proto: RubberStampCaptain\r
+  entities:\r
+  - uid: 982\r
+    components:\r
+    - pos: 12.800895,12.664745\r
+      parent: 179\r
+      type: Transform\r
+- proto: RubberStampCentcom\r
+  entities:\r
+  - uid: 980\r
+    components:\r
+    - pos: 12.186007,12.716865\r
+      parent: 179\r
+      type: Transform\r
+- proto: RubberStampSyndicate\r
+  entities:\r
+  - uid: 981\r
+    components:\r
+    - pos: 12.436131,12.550082\r
+      parent: 179\r
+      type: Transform\r
+- proto: Screwdriver\r
+  entities:\r
+  - uid: 431\r
+    components:\r
+    - pos: -1.235331,4.739151\r
+      parent: 179\r
+      type: Transform\r
+- proto: SeedExtractor\r
+  entities:\r
+  - uid: 65\r
+    components:\r
+    - pos: 2.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetGlass\r
+  entities:\r
+  - uid: 354\r
+    components:\r
+    - pos: 8.57603,21.566113\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 479\r
+    components:\r
+    - pos: -5.13758,7.5586076\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 529\r
+    components:\r
+    - pos: -15.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 564\r
+    components:\r
+    - pos: -15.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 565\r
+    components:\r
+    - pos: -15.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 566\r
+    components:\r
+    - pos: -15.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetGlass1\r
+  entities:\r
+  - uid: 960\r
+    components:\r
+    - pos: -3.981244,10.799851\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetPGlass\r
+  entities:\r
+  - uid: 416\r
+    components:\r
+    - pos: -0.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetPlasma\r
+  entities:\r
+  - uid: 1077\r
+    components:\r
+    - pos: 17.485096,24.503635\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetPlasteel\r
+  entities:\r
+  - uid: 478\r
+    components:\r
+    - pos: -4.0129576,7.6107273\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetPlastic\r
+  entities:\r
+  - uid: 79\r
+    components:\r
+    - pos: 8.951309,21.511908\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 181\r
+    components:\r
+    - pos: -4.54383,7.579455\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetRPGlass\r
+  entities:\r
+  - uid: 182\r
+    components:\r
+    - pos: -0.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SheetSteel\r
+  entities:\r
+  - uid: 205\r
+    components:\r
+    - pos: -15.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 305\r
+    components:\r
+    - pos: 9.435405,21.503613\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 382\r
+    components:\r
+    - pos: -15.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 473\r
+    components:\r
+    - pos: -5.6834707,7.529523\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 543\r
+    components:\r
+    - pos: -15.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 544\r
+    components:\r
+    - pos: -15.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SignalButton\r
+  entities:\r
+  - uid: 1013\r
+    components:\r
+    - pos: -4.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        202:\r
+        - Pressed: Toggle\r
+        984:\r
+        - Pressed: Toggle\r
+      type: DeviceLinkSource\r
+  - uid: 1014\r
+    components:\r
+    - pos: 3.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        697:\r
+        - Pressed: Toggle\r
+        698:\r
+        - Pressed: Toggle\r
+      type: DeviceLinkSource\r
+- proto: SignCargoDock\r
+  entities:\r
+  - uid: 1046\r
+    components:\r
+    - pos: 4.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SmallLight\r
+  entities:\r
+  - uid: 1048\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: -2.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1049\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 1.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SMESBasic\r
+  entities:\r
+  - uid: 1017\r
+    components:\r
+    - pos: -6.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: soda_dispenser\r
+  entities:\r
+  - uid: 751\r
+    components:\r
+    - pos: 8.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnMobHuman\r
+  entities:\r
+  - uid: 138\r
+    components:\r
+    - pos: -6.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 139\r
+    components:\r
+    - pos: -6.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 140\r
+    components:\r
+    - pos: 3.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnMobMouse\r
+  entities:\r
+  - uid: 1050\r
+    components:\r
+    - pos: 3.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnPointCaptain\r
+  entities:\r
+  - uid: 954\r
+    components:\r
+    - pos: -4.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnPointLatejoin\r
+  entities:\r
+  - uid: 961\r
+    components:\r
+    - pos: -3.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnPointObserver\r
+  entities:\r
+  - uid: 679\r
+    components:\r
+    - pos: -3.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SpawnVehicleJanicart\r
+  entities:\r
+  - uid: 904\r
+    components:\r
+    - pos: 5.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Spear\r
+  entities:\r
+  - uid: 185\r
+    components:\r
+    - pos: -3.4579864,-1.9811735\r
+      parent: 179\r
+      type: Transform\r
+- proto: SprayBottleWater\r
+  entities:\r
+  - uid: 903\r
+    components:\r
+    - pos: 6.985283,16.424004\r
+      parent: 179\r
+      type: Transform\r
+- proto: Stimpack\r
+  entities:\r
+  - uid: 462\r
+    components:\r
+    - pos: 3.6877818,5.312015\r
+      parent: 179\r
+      type: Transform\r
+- proto: Stool\r
+  entities:\r
+  - uid: 383\r
+    components:\r
+    - pos: -1.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 387\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: -2.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Stunbaton\r
+  entities:\r
+  - uid: 434\r
+    components:\r
+    - pos: -3.1734612,-2.6066077\r
+      parent: 179\r
+      type: Transform\r
+- proto: SubstationBasic\r
+  entities:\r
+  - uid: 1018\r
+    components:\r
+    - pos: -6.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: SuperCapacitorStockPart\r
+  entities:\r
+  - uid: 296\r
+    components:\r
+    - pos: -4.3012447,8.817795\r
+      parent: 179\r
+      type: Transform\r
+- proto: Syringe\r
+  entities:\r
+  - uid: 460\r
+    components:\r
+    - pos: 3.2502818,4.5823417\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 738\r
+    components:\r
+    - pos: 5.767191,9.787079\r
+      parent: 179\r
+      type: Transform\r
+- proto: Table\r
+  entities:\r
+  - uid: 63\r
+    components:\r
+    - pos: 9.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 64\r
+    components:\r
+    - pos: 10.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 67\r
+    components:\r
+    - pos: 8.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 92\r
+    components:\r
+    - pos: 11.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 143\r
+    components:\r
+    - pos: 33.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 144\r
+    components:\r
+    - pos: 33.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 145\r
+    components:\r
+    - pos: 33.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 161\r
+    components:\r
+    - pos: 24.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 162\r
+    components:\r
+    - pos: 23.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 172\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 4.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 180\r
+    components:\r
+    - pos: -4.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 262\r
+    components:\r
+    - pos: -3.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 263\r
+    components:\r
+    - pos: -2.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 264\r
+    components:\r
+    - pos: -1.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 265\r
+    components:\r
+    - pos: -0.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 267\r
+    components:\r
+    - pos: 23.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 268\r
+    components:\r
+    - pos: 23.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 298\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 6.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 299\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 5.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 300\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: 8.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 312\r
+    components:\r
+    - pos: -3.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 313\r
+    components:\r
+    - pos: -2.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 314\r
+    components:\r
+    - pos: -1.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 315\r
+    components:\r
+    - pos: -0.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 355\r
+    components:\r
+    - pos: -6.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 356\r
+    components:\r
+    - pos: -5.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 357\r
+    components:\r
+    - pos: -4.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 358\r
+    components:\r
+    - pos: -3.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 361\r
+    components:\r
+    - pos: -0.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 362\r
+    components:\r
+    - pos: 0.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 363\r
+    components:\r
+    - pos: 1.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 366\r
+    components:\r
+    - pos: -2.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 367\r
+    components:\r
+    - pos: -1.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 368\r
+    components:\r
+    - pos: -0.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 371\r
+    components:\r
+    - pos: 1.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 385\r
+    components:\r
+    - pos: -3.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 386\r
+    components:\r
+    - pos: -3.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 440\r
+    components:\r
+    - pos: 0.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 445\r
+    components:\r
+    - pos: -3.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 448\r
+    components:\r
+    - pos: 3.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 465\r
+    components:\r
+    - pos: 1.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 466\r
+    components:\r
+    - pos: 0.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 467\r
+    components:\r
+    - pos: -3.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 468\r
+    components:\r
+    - pos: -0.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 470\r
+    components:\r
+    - pos: -6.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 471\r
+    components:\r
+    - pos: -5.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 472\r
+    components:\r
+    - pos: -4.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 515\r
+    components:\r
+    - pos: -15.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 516\r
+    components:\r
+    - pos: -15.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 520\r
+    components:\r
+    - pos: -15.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 559\r
+    components:\r
+    - pos: -15.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 560\r
+    components:\r
+    - pos: -15.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 568\r
+    components:\r
+    - pos: 18.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 569\r
+    components:\r
+    - pos: 21.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 570\r
+    components:\r
+    - pos: 20.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 571\r
+    components:\r
+    - pos: 18.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 572\r
+    components:\r
+    - pos: 19.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 573\r
+    components:\r
+    - pos: 18.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 574\r
+    components:\r
+    - pos: 22.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 575\r
+    components:\r
+    - pos: 24.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 584\r
+    components:\r
+    - pos: 23.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 586\r
+    components:\r
+    - pos: 25.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 587\r
+    components:\r
+    - pos: 23.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 588\r
+    components:\r
+    - pos: 24.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 589\r
+    components:\r
+    - pos: 26.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 590\r
+    components:\r
+    - pos: 27.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 594\r
+    components:\r
+    - pos: 13.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 595\r
+    components:\r
+    - pos: 13.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 596\r
+    components:\r
+    - pos: 13.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 684\r
+    components:\r
+    - pos: -3.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 685\r
+    components:\r
+    - pos: 3.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 686\r
+    components:\r
+    - pos: 3.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 706\r
+    components:\r
+    - pos: -1.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 707\r
+    components:\r
+    - pos: -0.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 710\r
+    components:\r
+    - pos: 0.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: TableGlass\r
+  entities:\r
+  - uid: 964\r
+    components:\r
+    - pos: 9.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 965\r
+    components:\r
+    - pos: 11.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 966\r
+    components:\r
+    - pos: 13.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 975\r
+    components:\r
+    - pos: 10.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 976\r
+    components:\r
+    - pos: 12.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: TargetHuman\r
+  entities:\r
+  - uid: 159\r
+    components:\r
+    - pos: -6.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: TelecomServerFilled\r
+  entities:\r
+  - uid: 963\r
+    components:\r
+    - pos: -3.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: TimerTrigger\r
+  entities:\r
+  - uid: 482\r
+    components:\r
+    - pos: 6.413024,9.39097\r
+      parent: 179\r
+      type: Transform\r
+- proto: ToolboxElectricalFilled\r
+  entities:\r
+  - uid: 365\r
+    components:\r
+    - pos: 0.4993378,3.429311\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 419\r
+    components:\r
+    - pos: -0.8099712,-5.21454\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 420\r
+    components:\r
+    - pos: -0.5597038,-5.679647\r
+      parent: 179\r
+      type: Transform\r
+- proto: ToolboxMechanicalFilled\r
+  entities:\r
+  - uid: 364\r
+    components:\r
+    - pos: 1.452203,3.4605832\r
+      parent: 179\r
+      type: Transform\r
+- proto: ToyRubberDuck\r
+  entities:\r
+  - uid: 723\r
+    components:\r
+    - pos: -1.6653601,11.616664\r
+      parent: 179\r
+      type: Transform\r
+- proto: trayScanner\r
+  entities:\r
+  - uid: 758\r
+    components:\r
+    - pos: 1.354346,4.548879\r
+      parent: 179\r
+      type: Transform\r
+- proto: TwoWayLever\r
+  entities:\r
+  - uid: 699\r
+    components:\r
+    - pos: -3.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        990:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        195:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        991:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+      type: DeviceLinkSource\r
+  - uid: 722\r
+    components:\r
+    - pos: 1.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        721:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        720:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        716:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+      type: DeviceLinkSource\r
+  - uid: 983\r
+    components:\r
+    - pos: 2.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+    - linkedPorts:\r
+        985:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        259:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        989:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+        463:\r
+        - Left: Forward\r
+        - Right: Reverse\r
+        - Middle: Off\r
+      type: DeviceLinkSource\r
+- proto: UnfinishedMachineFrame\r
+  entities:\r
+  - uid: 522\r
+    components:\r
+    - pos: -6.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: UniformPrinter\r
+  entities:\r
+  - uid: 443\r
+    components:\r
+    - pos: -7.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VehicleKeyJanicart\r
+  entities:\r
+  - uid: 14\r
+    components:\r
+    - pos: 6.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineCigs\r
+  entities:\r
+  - uid: 870\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -14.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineEngivend\r
+  entities:\r
+  - uid: 441\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -11.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 523\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -11.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineMedical\r
+  entities:\r
+  - uid: 156\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: 25.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 157\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: 27.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 158\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: 29.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 521\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -12.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineSalvage\r
+  entities:\r
+  - uid: 485\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -15.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineSec\r
+  entities:\r
+  - uid: 874\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -13.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineTankDispenserEVA\r
+  entities:\r
+  - uid: 875\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: 7.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: VendingMachineYouTool\r
+  entities:\r
+  - uid: 350\r
+    components:\r
+    - flags: SessionSpecific\r
+      type: MetaData\r
+    - pos: -11.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: WallSolid\r
+  entities:\r
+  - uid: 3\r
+    components:\r
+    - pos: 1.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 4\r
+    components:\r
+    - pos: 11.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 5\r
+    components:\r
+    - pos: 18.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 6\r
+    components:\r
+    - pos: 20.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 8\r
+    components:\r
+    - pos: 14.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 9\r
+    components:\r
+    - pos: 1.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 10\r
+    components:\r
+    - pos: 18.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 11\r
+    components:\r
+    - pos: 13.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 13\r
+    components:\r
+    - pos: 25.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 18\r
+    components:\r
+    - pos: 4.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 19\r
+    components:\r
+    - pos: 18.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 21\r
+    components:\r
+    - pos: 10.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 22\r
+    components:\r
+    - pos: 26.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 25\r
+    components:\r
+    - pos: 1.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 27\r
+    components:\r
+    - pos: 8.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 28\r
+    components:\r
+    - pos: 18.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 29\r
+    components:\r
+    - pos: 18.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 30\r
+    components:\r
+    - pos: 1.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 31\r
+    components:\r
+    - pos: 1.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 32\r
+    components:\r
+    - pos: 18.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 33\r
+    components:\r
+    - pos: 23.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 34\r
+    components:\r
+    - pos: 12.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 35\r
+    components:\r
+    - pos: 27.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 36\r
+    components:\r
+    - pos: 7.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 37\r
+    components:\r
+    - pos: 14.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 38\r
+    components:\r
+    - pos: 10.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 39\r
+    components:\r
+    - pos: 10.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 40\r
+    components:\r
+    - pos: 8.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 41\r
+    components:\r
+    - pos: 10.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 42\r
+    components:\r
+    - pos: 18.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 43\r
+    components:\r
+    - pos: 14.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 44\r
+    components:\r
+    - pos: 14.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 45\r
+    components:\r
+    - pos: 1.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 46\r
+    components:\r
+    - pos: 18.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 49\r
+    components:\r
+    - pos: 7.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 50\r
+    components:\r
+    - pos: 13.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 51\r
+    components:\r
+    - pos: 12.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 52\r
+    components:\r
+    - pos: 1.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 53\r
+    components:\r
+    - pos: 9.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 55\r
+    components:\r
+    - pos: 24.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 56\r
+    components:\r
+    - pos: 14.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 57\r
+    components:\r
+    - pos: 14.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 60\r
+    components:\r
+    - pos: 7.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 61\r
+    components:\r
+    - pos: 18.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 62\r
+    components:\r
+    - pos: 18.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 66\r
+    components:\r
+    - pos: 18.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 68\r
+    components:\r
+    - pos: 18.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 69\r
+    components:\r
+    - pos: 28.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 71\r
+    components:\r
+    - pos: 11.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 72\r
+    components:\r
+    - pos: 1.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 73\r
+    components:\r
+    - pos: 14.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 74\r
+    components:\r
+    - pos: 10.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 75\r
+    components:\r
+    - pos: 9.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 76\r
+    components:\r
+    - pos: 8.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 77\r
+    components:\r
+    - pos: 8.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 78\r
+    components:\r
+    - pos: 21.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 80\r
+    components:\r
+    - pos: 18.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 81\r
+    components:\r
+    - pos: 18.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 82\r
+    components:\r
+    - pos: 14.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 83\r
+    components:\r
+    - pos: 4.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 84\r
+    components:\r
+    - pos: 7.5,26.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 85\r
+    components:\r
+    - pos: 1.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 86\r
+    components:\r
+    - pos: 17.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 89\r
+    components:\r
+    - pos: 22.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 95\r
+    components:\r
+    - pos: 8.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 96\r
+    components:\r
+    - pos: 7.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 97\r
+    components:\r
+    - pos: 8.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 98\r
+    components:\r
+    - pos: 4.5,25.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 99\r
+    components:\r
+    - pos: 17.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 100\r
+    components:\r
+    - pos: 19.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 101\r
+    components:\r
+    - pos: 4.5,27.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 103\r
+    components:\r
+    - pos: 14.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 104\r
+    components:\r
+    - pos: 14.5,16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 105\r
+    components:\r
+    - pos: 15.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 106\r
+    components:\r
+    - pos: 14.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 107\r
+    components:\r
+    - pos: 13.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 109\r
+    components:\r
+    - pos: 11.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 110\r
+    components:\r
+    - pos: 10.5,15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 112\r
+    components:\r
+    - pos: 7.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 113\r
+    components:\r
+    - pos: 7.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 114\r
+    components:\r
+    - pos: 7.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 117\r
+    components:\r
+    - pos: 5.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 118\r
+    components:\r
+    - pos: 5.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 121\r
+    components:\r
+    - pos: 4.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 122\r
+    components:\r
+    - pos: 4.5,20.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 123\r
+    components:\r
+    - pos: 4.5,21.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 124\r
+    components:\r
+    - pos: 4.5,22.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 125\r
+    components:\r
+    - pos: 4.5,23.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 126\r
+    components:\r
+    - pos: 4.5,24.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 164\r
+    components:\r
+    - rot: 1.5707963267948966 rad\r
+      pos: 22.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 165\r
+    components:\r
+    - pos: 8.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 169\r
+    components:\r
+    - pos: 8.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 173\r
+    components:\r
+    - pos: 8.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 189\r
+    components:\r
+    - pos: -7.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 190\r
+    components:\r
+    - pos: -7.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 191\r
+    components:\r
+    - pos: -7.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 192\r
+    components:\r
+    - pos: -7.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 193\r
+    components:\r
+    - pos: -7.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 196\r
+    components:\r
+    - pos: 3.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 197\r
+    components:\r
+    - pos: 4.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 198\r
+    components:\r
+    - pos: -7.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 199\r
+    components:\r
+    - pos: -7.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 200\r
+    components:\r
+    - pos: -7.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 201\r
+    components:\r
+    - pos: -7.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 208\r
+    components:\r
+    - pos: -7.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 209\r
+    components:\r
+    - pos: -10.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 211\r
+    components:\r
+    - pos: -10.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 212\r
+    components:\r
+    - pos: -10.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 213\r
+    components:\r
+    - pos: -10.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 214\r
+    components:\r
+    - pos: -10.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 215\r
+    components:\r
+    - pos: -10.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 217\r
+    components:\r
+    - pos: 1.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 218\r
+    components:\r
+    - pos: 0.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 219\r
+    components:\r
+    - pos: -0.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 220\r
+    components:\r
+    - pos: -1.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 221\r
+    components:\r
+    - pos: -2.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 222\r
+    components:\r
+    - pos: -3.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 223\r
+    components:\r
+    - pos: -4.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 224\r
+    components:\r
+    - pos: -5.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 225\r
+    components:\r
+    - pos: -6.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 226\r
+    components:\r
+    - pos: 4.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 227\r
+    components:\r
+    - pos: 5.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 228\r
+    components:\r
+    - pos: 6.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 229\r
+    components:\r
+    - pos: -7.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 231\r
+    components:\r
+    - pos: -6.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 232\r
+    components:\r
+    - pos: -5.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 233\r
+    components:\r
+    - pos: -4.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 234\r
+    components:\r
+    - pos: 6.5,-10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 235\r
+    components:\r
+    - pos: 6.5,-11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 236\r
+    components:\r
+    - pos: 6.5,-12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 237\r
+    components:\r
+    - pos: 6.5,-13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 238\r
+    components:\r
+    - pos: 6.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 239\r
+    components:\r
+    - pos: 5.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 240\r
+    components:\r
+    - pos: -7.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 241\r
+    components:\r
+    - pos: -7.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 242\r
+    components:\r
+    - pos: -8.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 243\r
+    components:\r
+    - pos: -9.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 244\r
+    components:\r
+    - pos: -10.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 245\r
+    components:\r
+    - pos: -7.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 248\r
+    components:\r
+    - pos: 5.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 249\r
+    components:\r
+    - pos: 5.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 250\r
+    components:\r
+    - pos: 6.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 251\r
+    components:\r
+    - pos: 6.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 254\r
+    components:\r
+    - pos: 7.5,-9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 260\r
+    components:\r
+    - pos: 6.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 261\r
+    components:\r
+    - pos: 6.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 271\r
+    components:\r
+    - pos: 1.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 272\r
+    components:\r
+    - pos: 1.5,13.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 273\r
+    components:\r
+    - pos: 1.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 274\r
+    components:\r
+    - pos: -7.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 275\r
+    components:\r
+    - pos: -6.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 276\r
+    components:\r
+    - pos: -5.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 277\r
+    components:\r
+    - pos: -4.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 278\r
+    components:\r
+    - pos: -3.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 279\r
+    components:\r
+    - pos: -2.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 282\r
+    components:\r
+    - pos: -1.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 283\r
+    components:\r
+    - pos: -0.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 284\r
+    components:\r
+    - pos: 0.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 288\r
+    components:\r
+    - pos: 12.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 289\r
+    components:\r
+    - pos: 11.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 290\r
+    components:\r
+    - pos: 10.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 291\r
+    components:\r
+    - pos: 9.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 292\r
+    components:\r
+    - pos: 8.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 293\r
+    components:\r
+    - pos: 7.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 294\r
+    components:\r
+    - pos: 6.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 295\r
+    components:\r
+    - pos: 5.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 301\r
+    components:\r
+    - pos: 9.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 302\r
+    components:\r
+    - pos: 10.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 303\r
+    components:\r
+    - pos: 11.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 304\r
+    components:\r
+    - pos: 12.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 310\r
+    components:\r
+    - pos: 9.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 316\r
+    components:\r
+    - pos: -7.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 317\r
+    components:\r
+    - pos: 26.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 320\r
+    components:\r
+    - pos: 24.5,14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 329\r
+    components:\r
+    - pos: -11.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 335\r
+    components:\r
+    - pos: 13.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 336\r
+    components:\r
+    - pos: 14.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 337\r
+    components:\r
+    - pos: 13.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 338\r
+    components:\r
+    - pos: 13.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 339\r
+    components:\r
+    - pos: 13.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 341\r
+    components:\r
+    - pos: 24.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 342\r
+    components:\r
+    - pos: 26.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 352\r
+    components:\r
+    - pos: 13.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 353\r
+    components:\r
+    - pos: 13.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 372\r
+    components:\r
+    - pos: 13.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 373\r
+    components:\r
+    - pos: 25.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 374\r
+    components:\r
+    - pos: 23.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 375\r
+    components:\r
+    - pos: 17.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 376\r
+    components:\r
+    - pos: -10.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 377\r
+    components:\r
+    - pos: -10.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 379\r
+    components:\r
+    - pos: -8.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 390\r
+    components:\r
+    - pos: 18.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 391\r
+    components:\r
+    - pos: 19.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 392\r
+    components:\r
+    - pos: 21.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 393\r
+    components:\r
+    - pos: 22.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 394\r
+    components:\r
+    - pos: 22.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 395\r
+    components:\r
+    - pos: 22.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 396\r
+    components:\r
+    - pos: 22.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 397\r
+    components:\r
+    - pos: 22.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 399\r
+    components:\r
+    - pos: 22.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 400\r
+    components:\r
+    - pos: 21.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 401\r
+    components:\r
+    - pos: 22.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 418\r
+    components:\r
+    - pos: 7.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 439\r
+    components:\r
+    - pos: -13.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 449\r
+    components:\r
+    - pos: -16.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 450\r
+    components:\r
+    - pos: -16.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 464\r
+    components:\r
+    - pos: 4.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 474\r
+    components:\r
+    - pos: -7.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 475\r
+    components:\r
+    - pos: -7.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 476\r
+    components:\r
+    - pos: -7.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 477\r
+    components:\r
+    - pos: -7.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 486\r
+    components:\r
+    - pos: -15.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 487\r
+    components:\r
+    - pos: -16.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 488\r
+    components:\r
+    - pos: 5.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 489\r
+    components:\r
+    - pos: -11.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 491\r
+    components:\r
+    - pos: -16.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 492\r
+    components:\r
+    - pos: -14.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 494\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -11.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 495\r
+    components:\r
+    - pos: -12.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 496\r
+    components:\r
+    - pos: -16.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 497\r
+    components:\r
+    - pos: -16.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 498\r
+    components:\r
+    - pos: -16.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 499\r
+    components:\r
+    - pos: -16.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 500\r
+    components:\r
+    - pos: -16.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 501\r
+    components:\r
+    - pos: -16.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 502\r
+    components:\r
+    - pos: -16.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 503\r
+    components:\r
+    - pos: -16.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 504\r
+    components:\r
+    - pos: -16.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 505\r
+    components:\r
+    - pos: -16.5,-7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 506\r
+    components:\r
+    - pos: -16.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 507\r
+    components:\r
+    - pos: -15.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 508\r
+    components:\r
+    - pos: -14.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 509\r
+    components:\r
+    - pos: -13.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 510\r
+    components:\r
+    - pos: -12.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 511\r
+    components:\r
+    - pos: -11.5,-8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 517\r
+    components:\r
+    - pos: 23.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 518\r
+    components:\r
+    - pos: 24.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 519\r
+    components:\r
+    - pos: 25.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 535\r
+    components:\r
+    - pos: -15.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 539\r
+    components:\r
+    - pos: 26.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 540\r
+    components:\r
+    - pos: 27.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 545\r
+    components:\r
+    - pos: 7.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 546\r
+    components:\r
+    - pos: 8.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 547\r
+    components:\r
+    - pos: 28.5,11.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 548\r
+    components:\r
+    - pos: 28.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 549\r
+    components:\r
+    - pos: 28.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 550\r
+    components:\r
+    - pos: 28.5,8.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 551\r
+    components:\r
+    - pos: 28.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 552\r
+    components:\r
+    - pos: 28.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 553\r
+    components:\r
+    - pos: 28.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 554\r
+    components:\r
+    - pos: 26.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 555\r
+    components:\r
+    - pos: 26.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 556\r
+    components:\r
+    - pos: 25.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 557\r
+    components:\r
+    - pos: 26.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 558\r
+    components:\r
+    - pos: 27.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 561\r
+    components:\r
+    - pos: -14.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 585\r
+    components:\r
+    - pos: 9.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 597\r
+    components:\r
+    - pos: 22.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 598\r
+    components:\r
+    - pos: 17.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 599\r
+    components:\r
+    - pos: 18.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 600\r
+    components:\r
+    - pos: 20.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 601\r
+    components:\r
+    - pos: 21.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 602\r
+    components:\r
+    - pos: 19.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 603\r
+    components:\r
+    - pos: 14.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 604\r
+    components:\r
+    - pos: 13.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 605\r
+    components:\r
+    - pos: 12.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 606\r
+    components:\r
+    - pos: 12.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 607\r
+    components:\r
+    - pos: 12.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 608\r
+    components:\r
+    - pos: 12.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 609\r
+    components:\r
+    - pos: 12.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 610\r
+    components:\r
+    - pos: 13.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 611\r
+    components:\r
+    - pos: 14.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 612\r
+    components:\r
+    - pos: 13.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 613\r
+    components:\r
+    - pos: 13.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 614\r
+    components:\r
+    - pos: 13.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 615\r
+    components:\r
+    - pos: 13.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 616\r
+    components:\r
+    - pos: 13.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 617\r
+    components:\r
+    - pos: 13.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 618\r
+    components:\r
+    - pos: 14.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 619\r
+    components:\r
+    - pos: 15.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 620\r
+    components:\r
+    - pos: 16.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 621\r
+    components:\r
+    - pos: 17.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 622\r
+    components:\r
+    - pos: 18.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 623\r
+    components:\r
+    - pos: 19.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 624\r
+    components:\r
+    - pos: 20.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 625\r
+    components:\r
+    - pos: 21.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 626\r
+    components:\r
+    - pos: 22.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 627\r
+    components:\r
+    - pos: 23.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 628\r
+    components:\r
+    - pos: 24.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 629\r
+    components:\r
+    - pos: 25.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 630\r
+    components:\r
+    - pos: 26.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 631\r
+    components:\r
+    - pos: 26.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 632\r
+    components:\r
+    - pos: 26.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 633\r
+    components:\r
+    - pos: 27.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 634\r
+    components:\r
+    - pos: 28.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 635\r
+    components:\r
+    - pos: 29.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 636\r
+    components:\r
+    - pos: 30.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 637\r
+    components:\r
+    - pos: 31.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 638\r
+    components:\r
+    - pos: 32.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 639\r
+    components:\r
+    - pos: 33.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 640\r
+    components:\r
+    - pos: 34.5,-6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 641\r
+    components:\r
+    - pos: 34.5,-5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 642\r
+    components:\r
+    - pos: 34.5,-4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 643\r
+    components:\r
+    - pos: 34.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 644\r
+    components:\r
+    - pos: 34.5,-2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 645\r
+    components:\r
+    - pos: 34.5,-1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 646\r
+    components:\r
+    - pos: 34.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 647\r
+    components:\r
+    - pos: 33.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 648\r
+    components:\r
+    - pos: 32.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 649\r
+    components:\r
+    - pos: 31.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 650\r
+    components:\r
+    - pos: 30.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 651\r
+    components:\r
+    - pos: 29.5,-0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 652\r
+    components:\r
+    - pos: 30.5,0.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 653\r
+    components:\r
+    - pos: 30.5,1.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 654\r
+    components:\r
+    - pos: 30.5,2.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 655\r
+    components:\r
+    - pos: 30.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 656\r
+    components:\r
+    - pos: 30.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 657\r
+    components:\r
+    - pos: 29.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 658\r
+    components:\r
+    - pos: 28.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 659\r
+    components:\r
+    - pos: 27.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 702\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -11.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 713\r
+    components:\r
+    - pos: -7.5,9.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 714\r
+    components:\r
+    - pos: -7.5,10.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 724\r
+    components:\r
+    - pos: -2.5,12.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 733\r
+    components:\r
+    - pos: 4.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 734\r
+    components:\r
+    - pos: 4.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 739\r
+    components:\r
+    - pos: 8.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 740\r
+    components:\r
+    - pos: 8.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 741\r
+    components:\r
+    - pos: 8.5,5.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 742\r
+    components:\r
+    - pos: 8.5,4.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 743\r
+    components:\r
+    - pos: 8.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 745\r
+    components:\r
+    - pos: 4.5,7.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 746\r
+    components:\r
+    - pos: 4.5,6.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 846\r
+    components:\r
+    - pos: 2.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 847\r
+    components:\r
+    - pos: 3.5,19.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 925\r
+    components:\r
+    - rot: -1.5707963267948966 rad\r
+      pos: -14.5,17.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 958\r
+    components:\r
+    - rot: 3.141592653589793 rad\r
+      pos: 15.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1072\r
+    components:\r
+    - pos: 15.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1073\r
+    components:\r
+    - pos: 16.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1074\r
+    components:\r
+    - pos: 17.5,28.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: WaterTankFull\r
+  entities:\r
+  - uid: 115\r
+    components:\r
+    - pos: 4.5,18.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 694\r
+    components:\r
+    - pos: -2.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeaponCapacitorRecharger\r
+  entities:\r
+  - uid: 708\r
+    components:\r
+    - pos: -0.5,-3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeaponLaserCarbine\r
+  entities:\r
+  - uid: 188\r
+    components:\r
+    - pos: -3.5226438,-0.45543313\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeaponLauncherMultipleRocket\r
+  entities:\r
+  - uid: 671\r
+    components:\r
+    - pos: -13.195735,9.730438\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeaponLauncherRocket\r
+  entities:\r
+  - uid: 436\r
+    components:\r
+    - pos: -3.478273,-1.1611286\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeaponRifleAk\r
+  entities:\r
+  - uid: 437\r
+    components:\r
+    - pos: -3.5018106,0.24183923\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 949\r
+    components:\r
+    - pos: -12.238617,9.081488\r
+      parent: 179\r
+      type: Transform\r
+- proto: WelderExperimental\r
+  entities:\r
+  - uid: 343\r
+    components:\r
+    - pos: 0.6895334,4.7183027\r
+      parent: 179\r
+      type: Transform\r
+- proto: WeldingFuelTankFull\r
+  entities:\r
+  - uid: 693\r
+    components:\r
+    - pos: -1.5,3.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Window\r
+  entities:\r
+  - uid: 111\r
+    components:\r
+    - pos: -0.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 194\r
+    components:\r
+    - pos: -0.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 230\r
+    components:\r
+    - pos: -0.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1001\r
+    components:\r
+    - pos: -3.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1002\r
+    components:\r
+    - pos: -3.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1003\r
+    components:\r
+    - pos: -3.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1004\r
+    components:\r
+    - pos: 2.5,-16.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1005\r
+    components:\r
+    - pos: 2.5,-15.5\r
+      parent: 179\r
+      type: Transform\r
+  - uid: 1006\r
+    components:\r
+    - pos: 2.5,-14.5\r
+      parent: 179\r
+      type: Transform\r
+- proto: Wirecutter\r
+  entities:\r
+  - uid: 359\r
+    components:\r
+    - pos: -1.6207478,4.3951616\r
+      parent: 179\r
+      type: Transform\r
+- proto: Wrench\r
+  entities:\r
+  - uid: 327\r
+    components:\r
+    - pos: -0.11783123,4.753312\r
+      parent: 179\r
+      type: Transform\r
+...\r
index d717c3a56b924e8007e3e71a2540ffb321379875..1622bf4505787ed329f4bd9a868ead95a1ae47ee 100644 (file)
@@ -75209,28 +75209,6 @@ entities:
     - pos: 8.554562,-71.45013\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 12600\r
     components:\r
     - pos: -59.580887,2.6484475\r
@@ -75286,28 +75264,6 @@ entities:
     - pos: -45.607418,-4.0834746\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 19193\r
     components:\r
     - pos: 24.478937,19.47598\r
@@ -75323,28 +75279,6 @@ entities:
     - pos: 8.429562,-71.29388\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: FloorDrain\r
   entities:\r
   - uid: 2376\r
@@ -112959,28 +112893,6 @@ entities:
     - pos: -11.4531975,-27.495203\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 2042\r
     components:\r
     - pos: -22.39201,0.9298079\r
@@ -112991,82 +112903,16 @@ entities:
     - pos: 34.77564,-13.074253\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 5326\r
     components:\r
     - pos: -24.428305,-28.144638\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 5611\r
     components:\r
     - pos: -43.443226,9.814736\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 6609\r
     components:\r
     - pos: 13.404068,20.941233\r
@@ -113094,55 +112940,11 @@ entities:
     - pos: -53.539146,19.787207\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 18528\r
     components:\r
     - pos: -4.422296,-6.0514507\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 18888\r
     components:\r
     - rot: 1.5707963267948966 rad\r
@@ -113189,82 +112991,16 @@ entities:
     - pos: -46.455166,-17.122845\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 4235\r
     components:\r
     - pos: -41.508133,-17.091595\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 6446\r
     components:\r
     - pos: 16.535465,-49.13737\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 7855\r
     components:\r
     - pos: 47.535595,-44.54304\r
@@ -113275,163 +113011,31 @@ entities:
     - pos: 43.509346,13.968993\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 14128\r
     components:\r
     - pos: -8.397732,20.931147\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 14437\r
     components:\r
     - pos: -10.617271,13.996219\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 17683\r
     components:\r
     - pos: -47.45724,23.765757\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 17821\r
     components:\r
     - pos: -36.53212,19.792776\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 18475\r
     components:\r
     - pos: -8.643374,-5.091722\r
       parent: 60\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 23464\r
     components:\r
     - pos: -64.53201,45.976482\r
index 5d3a9ccffdbbc4ae66d9b147e7e89e3bee3dcb5f..6033eaad78afb2c2d1d23a159441db651f8baf34 100644 (file)
@@ -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
index bf8430bee2482439409bac36b2d94aef0bbe718c..a2a9b75a13801307f8ee983e0cb26a08adf30fce 100644 (file)
@@ -131812,28 +131812,6 @@ entities:
     - pos: 63.59359,1.9265842\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -131866,28 +131844,6 @@ entities:
     - pos: 20.577366,3.8552704\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -131905,28 +131861,6 @@ entities:
     - pos: 27.55192,-19.472286\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -131942,28 +131876,6 @@ entities:
     - pos: 8.514107,-15.335099\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -131999,28 +131911,6 @@ entities:
     - pos: 12.51148,39.935867\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132036,28 +131926,6 @@ entities:
     - pos: -5.4745197,14.875931\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132073,28 +131941,6 @@ entities:
     - pos: -11.396871,17.955116\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132125,28 +131971,6 @@ entities:
     - pos: 61.465347,-10.029866\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132162,28 +131986,6 @@ entities:
     - pos: 57.47965,-10.061116\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132199,28 +132001,6 @@ entities:
     - pos: -57.50557,-0.1837722\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -132236,28 +132016,6 @@ entities:
     - pos: -57.52329,-8.160038\r
       parent: 8364\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
index 46b6de785e7f010ed6d77b3d505d4db32a640e82..db2cfbcce4e6ed52c81611fe9b48b48d87808f20 100644 (file)
@@ -119817,55 +119817,11 @@ entities:
     - pos: 56.48937,-16.046814\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 15528\r
     components:\r
     - pos: 56.55187,-16.249939\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 19986\r
     components:\r
     - pos: 41.480545,-35.30919\r
@@ -119911,28 +119867,6 @@ entities:
     - pos: -42.514347,2.6634603\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 32400\r
     components:\r
     - pos: 35.394306,-5.3188667\r
@@ -119982,28 +119916,6 @@ entities:
     - pos: 132.84602,3.5240808\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: FloodlightBroken\r
   entities:\r
   - uid: 5413\r
@@ -169910,28 +169822,6 @@ entities:
     - pos: -11.291338,10.87907\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: LampGold\r
   entities:\r
   - uid: 1144\r
@@ -169969,28 +169859,6 @@ entities:
     - pos: -21.410488,56.800785\r
       parent: 13329\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 10550\r
     components:\r
     - pos: 37.57843,20.954947\r
index 03cd166550068641f37d5c597af12ad9daf709be..0cba6c828b22f5ed3962439f88c5d5ff03536f33 100644 (file)
@@ -3769,28 +3769,6 @@ entities:
     - pos: -1.483297,-2.2444057\r
       parent: 73\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
 - proto: LockerSyndicatePersonal\r
   entities:\r
   - uid: 692\r
index 0c2bb80a0384a50e998a83b11066d76a468f2eac..65e64eedd4d8c91a01483d580b4aeeba2b67eb9d 100644 (file)
@@ -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
index 7c8f8748fb0ef1a4af63356389ec48791ee12d85..11c3025aa704ed95eb99ecbba9a732b2ff8ee47b 100644 (file)
@@ -103486,28 +103486,6 @@ entities:
     - pos: -43.612717,31.902554\r
       parent: 30\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 4953\r
     components:\r
     - pos: -22.461006,36.440132\r
@@ -103602,55 +103580,11 @@ entities:
     - pos: 4.5292673,10.977108\r
       parent: 30\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 4994\r
     components:\r
     - pos: -21.514103,31.706543\r
       parent: 30\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 5023\r
     components:\r
     - pos: -19.477777,35.681534\r
@@ -103721,28 +103655,6 @@ entities:
     - pos: -57.92594,-62.49692\r
       parent: 30\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 21670\r
     components:\r
     - pos: -57.51036,-43.24328\r
index e265c33d90873f7183d9413a95ddc342b4b13af0..5b2afd3d71afca6d33c3363e4ad4103f4d471ab8 100644 (file)
@@ -123032,26 +123032,6 @@ entities:
     - pos: 9.543957,-1.1447365\r
       parent: 5350\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon: Objects/Tools/flashlight.rsi/flashlight.png\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -123154,26 +123134,6 @@ entities:
     - pos: -6.544301,-3.1708417\r
       parent: 5350\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon: Objects/Tools/flashlight.rsi/flashlight.png\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -123219,28 +123179,6 @@ entities:
     - pos: -29.551394,17.78557\r
       parent: 5350\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - containers:\r
         cellslot_cell_container: !type:ContainerSlot\r
           showEnts: False\r
@@ -123283,26 +123221,6 @@ entities:
     - pos: -57.509872,-28.24864\r
       parent: 5350\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon: Objects/Tools/flashlight.rsi/flashlight.png\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
   - uid: 17463\r
     components:\r
     - pos: -42.417267,-30.139824\r
@@ -123354,28 +123272,6 @@ entities:
     - pos: 25.524637,-37.41671\r
       parent: 5350\r
       type: Transform\r
-    - toggleAction:\r
-        sound: null\r
-        itemIconStyle: BigItem\r
-        icon:\r
-          sprite: Objects/Tools/flashlight.rsi\r
-          state: flashlight\r
-        iconOn: Objects/Tools/flashlight.rsi/flashlight-on.png\r
-        iconColor: '#FFFFFFFF'\r
-        name: action-name-toggle-light\r
-        description: action-description-toggle-light\r
-        keywords: []\r
-        enabled: True\r
-        useDelay: null\r
-        charges: null\r
-        checkCanInteract: True\r
-        clientExclusive: False\r
-        priority: 0\r
-        autoPopulate: True\r
-        autoRemove: True\r
-        temporary: False\r
-        event: !type:ToggleActionEvent {}\r
-      type: HandheldLight\r
     - canCollide: True\r
       type: Physics\r
 - proto: LampInterrogator\r
index 92992a187ff1cf30348d023fb89d5986fc816414..e7b1c41b81e633aa40f9b3cfb44ef45e7819f776 100644 (file)
@@ -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
index 84bb14413a500a5912dd4679c4248d66376977fd..b759308f6bbfa07bde1a56aa6349533e1598c9f6 100644 (file)
@@ -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
index 8bcf57f9fc25b7bfa13a0542180ab35485b427c5..dcb50ff468cd4aeffad62a40887dd3e8e1ebc3a3 100644 (file)
@@ -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
index 758d7aeb036199f7faccd0a4b0e287413490cd94..a8195dcc10a4d0b5438016c1f6bb8c532a556a4e 100644 (file)
@@ -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
index 23a058c0171f3c8ee715fdc68936ec981551ee2d..d99ed8e560c37b901e38ff593cbb2c1cef073417 100644 (file)
@@ -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 (file)
index 0000000..e881782
--- /dev/null
@@ -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
index f070f006d67aad1c8dc495b872990bb0a567c743..10ffbb6164d1722be3720a92476e9b9193a49064 100644 (file)
@@ -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 (file)
index 0000000..829af54
--- /dev/null
@@ -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
index 1fbf677d805f811de0f38523ef5093e10f637dab..da7b4ba56f21f3f0a18c2be9c5e891212b08ea67 100644 (file)
@@ -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 (file)
index 0000000..7d8c78f
--- /dev/null
@@ -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
index 988b9a3f8d377f2aed3f1a3b8c4a665b618db93e..52759cefaf77078ce0284311f43f1d8d58f1f345 100644 (file)
@@ -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
index cbed84786b9ff58e0775a2a9b0f9797bb2924656..518f19f1f990f83669a45940beca88b960203a19 100644 (file)
-- 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
-
-- type: instantAction
-  id: TurnUndead
+  noSpawn: true
+  components:
+  - type: InstantAction
+    useDelay: 10
+    icon: Interface/Actions/scream.png
+    event: !type:ScreamActionEvent
+    checkCanInteract: false
+
+- 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
-
-- type: instantAction
-  id: ToggleLight
+  noSpawn: true
+  components:
+  - type: InstantAction
+    checkCanInteract: false
+    icon: Interface/Actions/zombie-turn.png
+    event: !type:ZombifySelfActionEvent
+
+- 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
-
-- type: instantAction
-  id: OpenStorageImplant
+  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: 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
-
-- type: instantAction
-  id: ActivateMicroBomb
+  noSpawn: true
+  components:
+  - type: InstantAction
+    itemIconStyle: BigAction
+    priority: -20
+    icon:
+      sprite: Clothing/Back/Backpacks/backpack.rsi
+      state: icon
+    event: !type:OpenStorageImplantEvent
+
+- 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
-
-- type: instantAction
-  id: ActivateFreedomImplant
+  noSpawn: true
+  components:
+  - type: InstantAction
+    checkCanInteract: false
+    itemIconStyle: BigAction
+    priority: -20
+    icon:
+      sprite: Actions/Implants/implants.rsi
+      state: explosive
+    event: !type:ActivateImplantEvent
+
+- 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
-
-- type: instantAction
-  id: OpenUplinkImplant
+  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: 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
-
-- type: instantAction
-  id: ActivateEmpImplant
+  noSpawn: true
+  components:
+  - type: InstantAction
+    itemIconStyle: BigAction
+    priority: -20
+    icon:
+      sprite: Objects/Devices/communication.rsi
+      state: old-radio
+    event: !type:OpenUplinkImplantEvent
+
+- 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
-
-- type: instantAction
-  id: ActivateDnaScramblerImplant
+  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: 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
-
-- type: instantAction
-  id: ToggleSuitPiece
+  noSpawn: true
+  components:
+  - type: InstantAction
+    charges: 1
+    itemIconStyle: BigAction
+    priority: -20
+    icon:
+      sprite: Clothing/OuterClothing/Hardsuits/lingspacesuit.rsi
+      state: icon
+    event: !type:UseDnaScramblerImplantEvent
+
+- 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
-
-- type: instantAction
-  id: ChangeVoiceMask
+  noSpawn: true
+  components:
+  - type: InstantAction
+    checkCanInteract: false
+    icon: Interface/Actions/harmOff.png
+    iconOn: Interface/Actions/harm.png
+    event: !type:ToggleCombatActionEvent
+
+- 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
-
-- type: instantAction
-  id: ArtifactActivate
+  noSpawn: true
+  components:
+  - type: InstantAction
+    useDelay: 30
+    event: !type:VendingMachineSelfDispenseEvent
+
+- 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
-
-- type: instantAction
-  id: ToggleBlock
+  noSpawn: true
+  components:
+  - type: InstantAction
+    icon:
+      sprite: Objects/Specific/Xenoarchaeology/xeno_artifacts.rsi
+      state: ano01
+    useDelay: 60
+    event: !type:ArtifactSelfActivateEvent
+
+- 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
-
-- type: instantAction
-  id: ClearNetworkLinkOverlays
+  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: 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
-
-- type: instantAction
-  id: AnimalLayEgg
+  noSpawn: true
+  components:
+  - type: InstantAction
+    icon: { sprite: Objects/Tools/multitool.rsi, state: icon }
+    event: !type:ClearAllOverlaysEvent
+
+- 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
-
-- type: instantAction
-  id: Sleep
+  noSpawn: true
+  components:
+  - type: InstantAction
+    icon: { sprite: Objects/Consumable/Food/egg.rsi, state: icon }
+    useDelay: 60
+    event: !type:EggLayInstantActionEvent
+
+- 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
-
-- type: instantAction
-  id: Wake
+  noSpawn: true
+  components:
+  - type: InstantAction
+    checkCanInteract: false
+    icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon }
+    event: !type:SleepActionEvent
+
+- 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
-
-- type: instantAction
-  id: ActivateHonkImplant
+  noSpawn: true
+  components:
+  - type: InstantAction
+    icon: { sprite: Clothing/Head/Hats/pyjamasyndicatered.rsi, state: icon }
+    checkCanInteract: false
+    event: !type:WakeActionEvent
+
+- 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
index 9b09de8a57fcf07b1149ee20ebd6d2b97a095c56..49cdef2a40fdfc57423758fa4c97fe238a0f229b 100644 (file)
@@ -2,9 +2,9 @@
   id: DebugListing
   name: debug name
   description: debug desc
-  categories: 
+  categories:
     - Debug
-  cost: 
+  cost:
     DebugDollar: 10
     Telecrystal: 10
 
   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
index 55fe23934899d8b81ad0aebe954b7fe9c12becd6..84f45d16073ba4a08b3f36b1f69d4c26025a8d94 100644 (file)
@@ -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:
index bf02642cb7fc86f93f89266114ed6e28448b3941..d9e264a4759323a5625125dcb8c3d3b8ee919a31 100644 (file)
   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
index daf167b3f79fcfab4abf84fa0fdbc50fbdc79cd8..1ae53773813c20c42254d9918254f796adb682df 100644 (file)
     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
index c4eb38ed801313150384514b6ab1e69d33b288aa..670e9a00edba379f1dbdce48bc632ae6ef8c7a90 100644 (file)
     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
         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
index 08bb0c1ad0ef22c98512c39a2348e07ee5b58dfe..c2094eacd162f042ce743667367045a3f46bfed9 100644 (file)
     - 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
   - 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
   - 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
     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
   - 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
index 01a792e263bddfad67ce9c53bddd588be888b79f..add77172989e6a1f4d8806213917ec6993a128f3 100644 (file)
   - type: MobStateActions
     actions:
       Critical:
-      - CritSuccumb
-      - CritFakeDeath
-      - CritLastWords
+      - ActionCritSuccumb
+      - ActionCritFakeDeath
+      - ActionCritLastWords
   - type: MobThresholds
     thresholds:
       0: Alive
     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
   - type: MobStateActions
     actions:
       Critical:
-      - CritSuccumb
-      - CritFakeDeath
-      - CritLastWords
+      - ActionCritSuccumb
+      - ActionCritFakeDeath
+      - ActionCritLastWords
   - type: MobThresholds
     thresholds:
       0: Alive
index ab8731671367f48055468728bff74572f2f17af7..d41cb8a8793f76cd38b9ca4f8e74afd56ffeac93 100644 (file)
       - 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
   - 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
index 4c96e0506df96a6f6858c826cb9fa93c76a36dbf..8bc72ad61b3559f7672e706cd67e93df4b5c1371 100644 (file)
     speechVerb: Robotic
   - type: TypingIndicator
     proto: robot
-    
+
 - type: entity
   parent: [ MobSiliconBase, BaseVehicle]
   id: MobSiliconBaseVehicle # for vehicles
   - 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
index 07b359e468741aba846ed417d0e38512fa98cd6d..1cf56769c61177dd9d48ca90646d81d2950a37d1 100644 (file)
@@ -73,9 +73,9 @@
   - type: MobStateActions
     actions:
       Critical:
-      - CritSuccumb
-      - CritFakeDeath
-      - CritLastWords
+      - ActionCritSuccumb
+      - ActionCritFakeDeath
+      - ActionCritLastWords
   - type: MobThresholds
     thresholds:
       0: Alive
index 5961ee7a6e1829315296396c1a05755ffe3a27a5..f6dcdcae3a44981a661d9a82924743ef15165d0f 100644 (file)
   - 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
   - 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 }
index befa2cfa3b11a8f4e2a97ae4e5bb117a8dae30ca..9ef481583f54b461256ab7298b439061cf30cbd0 100644 (file)
@@ -76,8 +76,8 @@
   - type: MobStateActions
     actions:
       Critical:
-      - CritSuccumb
-      - CritLastWords
+      - ActionCritSuccumb
+      - ActionCritLastWords
   - type: MobThresholds
     thresholds:
       0: Alive
       - Door
       tags:
       - Wall
-    devourAction:
-      event: !type:DevourActionEvent
-      icon: Interface/Actions/devour.png
-      name: action-name-devour
-      description: action-description-devour
   - type: Tag
     tags:
     - CannotSuicide
   - 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
     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
index f87813c721aa14baafa63f4e66561f7d97b7877f..4d79f6bdaee7f42f86a938388b3619829dc1f9ce 100644 (file)
     - 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
index 30e71f22bd63007dc6890d3ed5a6d907d217a812..9752d45c35359f4918c5c09573d6fafb87a589a3 100644 (file)
   - 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
index 903a849ad8597ad8b24f5c44563724b3226a0d6d..e5c0a61677edcfdee4b9830c20a749b170bfa229 100644 (file)
     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
index 87e3b8f7381ef3c92f5562634b92285d1a49eed5..a835c289cc032d9503998cc502424393146a73a9 100644 (file)
@@ -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
index 0d2d332696ab0dde88c5d9b679cb5d44896deae9..f2625090f6a74fb6901e520977fdf16baa081ab0 100644 (file)
   - type: MobStateActions
     actions:
       Critical:
-      - CritSuccumb
-      - CritFakeDeath
-      - CritLastWords
+      - ActionCritSuccumb
+      - ActionCritFakeDeath
+      - ActionCritLastWords
   - type: MobThresholds
     thresholds:
       0: Alive
index 53bf43f742e6eb294eee62e9edb2e26c195e11d3..f3886170d94e39fe7de93dcd58e68728568eed4a 100644 (file)
     - 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
index 5ac39cc35271462b2f3ca89c90181a306763ec58..a289e92eb6770270ed58ec2f2c5e6dae1f67eefc 100644 (file)
   - 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
           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
index 779c688035a8dbbe8df37a8ca76dff6981e510e0..79c0cd9a7898992cf257fe008dec64800b568bdb 100644 (file)
   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
index a8954fd2410a3093b60548a6b83fe6e8781a4bef..772dd45029d3df958df5dbd9732a7e6d33d3909f 100644 (file)
@@ -38,7 +38,7 @@
   noSpawn: true
   components:
     - type: SubdermalImplant
-      implantAction: ToggleLight
+      implantAction: ActionToggleLight
     - type: PointLight
       enabled: false
       radius: 2.5
         - 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:
   noSpawn: true
   components:
     - type: SubdermalImplant
-      implantAction: OpenStorageImplant
+      implantAction: ActionOpenStorageImplant
     - type: Item
       size: 9999
     - type: Storage
   noSpawn: true
   components:
     - type: SubdermalImplant
-      implantAction: ActivateFreedomImplant
+      implantAction: ActionActivateFreedomImplant
 
 - type: entity
   parent: BaseSubdermalImplant
   noSpawn: true
   components:
   - type: SubdermalImplant
-    implantAction: OpenUplinkImplant
+    implantAction: ActionOpenUplinkImplant
   - type: Store
     preset: StorePresetUplink
     balance:
   noSpawn: true
   components:
     - type: SubdermalImplant
-      implantAction: ActivateEmpImplant
+      implantAction: ActionActivateEmpImplant
     - type: TriggerImplantAction
     - type: EmpOnTrigger
       range: 1.75
   noSpawn: true
   components:
     - type: SubdermalImplant
-      implantAction: ActivateDnaScramblerImplant
+      implantAction: ActionActivateDnaScramblerImplant
 
 #Nuclear Operative/Special Exclusive implants
 
   components:
     - type: SubdermalImplant
       permanent: true
-      implantAction: ActivateMicroBomb
+      implantAction: ActionActivateMicroBomb
     - type: TriggerOnMobstateChange
       mobState:
       - Dead
index 1005558ea85a487c887fdfb4b7db7d2d47bb49a1..af1aa6612cd1bde98949b450f69ac6d6fe20a02b 100644 (file)
           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
index 0328a7b1498bf3e46714530250fe908173095643..f8ad5c2a211c1f98ad5ecd4a1570ddad6bac9a2d 100644 (file)
   - 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
index a4e2af4d45eaac648f24eb51b10ac793f5fa78e7..764fd7ea34c7685e4edefab42e8c0a1136e6e424 100644 (file)
     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
index 7b544f77f3af46a0e7596d77e2acf943f5766522..7f4ee54f79a1ebe010e385d645afedcdb6f24438 100644 (file)
     - 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
index dd2ca6f9c7ce482baa02f19fa32f70231e2e5679..6870ca5f0dddf5eb866dd7ab112318a5759ed543 100644 (file)
         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 (file)
index 0000000..f1872ee
--- /dev/null
@@ -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
index cf0dee36595d536214fb2ea249f1b907c00bddf7..d807bcc5a9fad489b9ebfe83dd91466f7d633036 100644 (file)
       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
     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
       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
index b2ad3ff702218b96da955ee9f71e7681cd6d6147..e0f5357b7e3a7fe44c327d7ffcec320297e91eea 100644 (file)
       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
index 6933e5908a77c0e30dfb06fe8f39f9e68d7e66d4..d182d9a00e91b4430369210be395c9597ef5ccc2 100644 (file)
@@ -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
index 815852ac630c2e0d752293bd2cc717048560bdd1..9c4ff6cf8c3d32051013647a2e96728a28e695b2 100644 (file)
@@ -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
index b9fd07e97847d74aad2ad59e1434e9e21e1cd8f9..69c8fe1e1e34b6066f67f513a43a41814543308b 100644 (file)
@@ -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
index 15a6b261b02d88ed0a3bd4cfab5ce1174d87277c..93e9fbea335a10cabda9f8d5ae8e7ec5195b71c9 100644 (file)
@@ -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
index 4583390c9cb1c57c488463cb0a8d88d39dbc8ed2..34213575ff1f958cf3e6526a029ae5d17b9cdf49 100644 (file)
@@ -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
index b85fff98f4748d2e9befc8d7e6c2ac8518698321..72f33f3f52ae1e2799e26a3f851a0674dddf9792 100644 (file)
@@ -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
index 40a1d38d38b03f03d9646357248208244cfed79c..9cd66ec3c1344bf9afe9b88af1b71ef07309d24d 100644 (file)
@@ -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
index 833c1215f089ad4bf2ba81de5dc353b31087b9da..4713a838f844ebcd7fcbcf76df65e793c9bfe03a 100644 (file)
     - 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:
   - 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
index 230ae024b7d5c1e129e112f7c99baa5c5f512e76..8dbf7929a77941cbedeb78f11c70576908f478d6 100644 (file)
@@ -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
index 43e0e7dc974621c63b6accb27b2a2d5d75a4dd92..aafa07be7936e58aca1e2fa8d658ab01ca87e74d 100644 (file)
   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
index 3062e45842ec3d8a3d7f4e5ec4dec729c8ce39bd..9bd170ee35d44e7eb817ce5825ab49ae40a7b18a 100644 (file)
@@ -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
       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
       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
       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
       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
       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
       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
   - 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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       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
       entityType: AirlockCargo
   assignments:
   - 6: 8
-- action: !type:WorldTargetAction
+  name: AirlockCargo
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/markings.rsi
       state: bot_left
     iconColor: '#EFB34196'
-    name: BotLeft
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: BotLeft
   assignments:
   - 7: 0
-- action: !type:WorldTargetAction
+  name: BotLeft
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/markings.rsi
       state: delivery
     iconColor: '#EFB34196'
-    name: Delivery
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: Delivery
   assignments:
   - 7: 1
-- action: !type:WorldTargetAction
+  name: Delivery
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/markings.rsi
       state: warn_full
     iconColor: '#EFB34196'
-    name: WarnFull
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: WarnFull
   assignments:
   - 7: 2
-- action: !type:WorldTargetAction
+  name: WarnFull
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#EFB34196'
-    name: HalfTileOverlayGreyscale
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 3
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#334E6DC8'
-    name: HalfTileOverlayGreyscale (#334E6DC8, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 4
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale (#334E6DC8, 0)
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#52B4E996'
-    name: HalfTileOverlayGreyscale (#52B4E996, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 5
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale (#52B4E996, 0)
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#9FED5896'
-    name: HalfTileOverlayGreyscale (#9FED5896, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 6
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale (#9FED5896, 0)
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#DE3A3A96'
-    name: HalfTileOverlayGreyscale (#DE3A3A96, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 7
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale (#DE3A3A96, 0)
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#D381C996'
-    name: HalfTileOverlayGreyscale (#D381C996, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       decalId: HalfTileOverlayGreyscale
   assignments:
   - 7: 8
-- action: !type:WorldTargetAction
+  name: HalfTileOverlayGreyscale (#D381C996, 0)
+- action: !type:WorldTargetActionComponent
+    keywords: []
     repeat: True
     checkCanAccess: False
     range: -1
       sprite: Decals/Overlays/greyscale.rsi
       state: halftile_overlay
     iconColor: '#A4610696'
-    name: HalfTileOverlayGreyscale (#A4610696, 0)
-    keywords: []
     checkCanInteract: False
     clientExclusive: True
     autoPopulate: False
       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
       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
   - 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
       tileId: Space
   assignments:
   - 0: 8
+  name: space
 ...